• FPGA project : ROM_VGA


    在之前彩条显示工程中增添一个rom模块,在中心显示100 X 100 的一个图像。

    主要考察rom的使用。读数据拉高,并输入地址。下个周期输出该地址对应的数据。

    如果输出口不加reg寄存一下,数据只会滞后一个时钟周期输出(相对于读使能)。

    加了 滞后两个。相当于打了一拍嘛。比较好理解。

    在设计这个实验中,还重点考察了,坐标与数据,在时序上要对齐。

    尤其输出信号用reg,对某个“数据输出信号”采样。虽然“数据输出信号”和坐标对齐了。

    但是真正要输出的信号,还是滞后了一个时钟周期(相对于坐标)。

    所以还要把“数据输出信号”提前一个时钟周期的同时,把输出信号的采样点也提前一个时钟周期,这样输出信号才能完全和坐标对齐。

    仿真图上有直观的文字说明。

    1. // #define BLACK 0x0000 // 黑色
    2. // #define NAVY 0x000F // 深蓝色
    3. // #define DGREEN 0x03E0 // 深绿色
    4. // #define DCYAN 0x03EF // 深青色
    5. // #define MAROON 0x7800 // 深红色
    6. // #define PURPLE 0x780F // 紫色
    7. // #define OLIVE 0x7BE0 // 橄榄绿
    8. // #define LGRAY 0xC618 // 灰白色
    9. // #define DGRAY 0x7BEF // 深灰色
    10. // #define BLUE 0x001F // 蓝色
    11. // #define GREEN 0x07E0 // 绿色
    12. // #define CYAN 0x07FF // 青色
    13. // #define RED 0xF800 // 红色
    14. // #define MAGENTA 0xF81F // 品红
    15. // #define YELLOW 0xFFE0 // 黄色
    16. // #define WHITE 0xFFFF // 白色
    17. // rgb 565
    18. module vga_pix (
    19. input wire vga_clk ,
    20. input wire vga_rst_n ,
    21. input wire [9:0] pix_x ,
    22. input wire [9:0] pix_y ,
    23. output reg [15:0] pix_data
    24. );
    25. reg [13:0] address ; // 在读使能信号拉高,每个时钟周期自加一,0 ~ 9999
    26. reg rden ; // 读使能信号超前图像数据一个时钟周期。
    27. wire [15:0] q ; // 从rom里读出的数据。
    28. wire [13:0] address_w ;
    29. wire rden_w ;
    30. // parameter
    31. parameter H_VALID = 10'd640 ,
    32. V_VALID = 10'd480 ;
    33. parameter RED = 16'hF800 ,
    34. ORANGE = 16'hFC00 ,
    35. YELLOW = 16'hFFe0 ,
    36. GREEN = 16'h07e0 ,
    37. QING = 16'h07FF ,
    38. BLUE = 16'h001F ,
    39. PURPLE = 16'hF81F ,
    40. BLACK = 16'h0000 ,
    41. WHITE = 16'hFFFF ,
    42. GRAY = 16'hD69A ;
    43. // output signal
    44. always @(posedge vga_clk or negedge vga_rst_n) begin
    45. if(~vga_rst_n) begin
    46. pix_data <= 10'h3ff ;
    47. end else begin // 有简便写法 ( H_VALID / 10 ) * n
    48. if((pix_y >= 190) && (pix_y <= 289) && (pix_x >= 269) && (pix_x <= 368))
    49. pix_data <= q ;
    50. else
    51. if((pix_y >= 10'd0) && (pix_y <= V_VALID / 10 - 1'b1))
    52. pix_data <= RED ;
    53. else
    54. if((pix_y >= V_VALID / 10) && (pix_y <= (V_VALID / 10) * 2 - 1'b1))
    55. pix_data <= ORANGE ;
    56. else
    57. if((pix_y >= (V_VALID / 10) * 2) && (pix_y <= (V_VALID / 10) * 3 - 1'b1))
    58. pix_data <= YELLOW ;
    59. else
    60. if((pix_y >= (V_VALID / 10) * 3) && (pix_y <= (V_VALID / 10) * 4 - 1'b1))
    61. pix_data <= GREEN ;
    62. else
    63. if((pix_y >= (V_VALID / 10) * 4) && (pix_y <= (V_VALID / 10) * 5 - 1'b1))
    64. pix_data <= QING ;
    65. else
    66. if((pix_y >= (V_VALID / 10) * 5) && (pix_y <= (V_VALID / 10) * 6 - 1'b1))
    67. pix_data <= BLUE ;
    68. else
    69. if((pix_y >= (V_VALID / 10) * 6) && (pix_y <= (V_VALID / 10) * 7 - 1'b1))
    70. pix_data <= PURPLE ;
    71. else
    72. if((pix_y >= (V_VALID / 10) * 7) && (pix_y <= (V_VALID / 10) * 8 - 1'b1))
    73. pix_data <= BLACK ;
    74. else
    75. if((pix_y >= (V_VALID / 10) * 8) && (pix_y <= (V_VALID / 10) * 9 - 1'b1))
    76. pix_data <= WHITE ;
    77. else
    78. if((pix_y >= (V_VALID / 10) * 9) && (pix_y <= V_VALID - 1'b1) )
    79. pix_data <= GRAY ;
    80. else
    81. pix_data <= BLACK ;
    82. end
    83. end
    84. /****************新增代码*******************/
    85. rom_pic rom_pic_insert(
    86. .address ( address_w ),
    87. .clock ( vga_clk ),
    88. .rden ( rden_w ),
    89. .q ( q )
    90. );
    91. // reg [13:0] address; // 在读使能信号拉高,每个时钟周期自加一,0 ~ 9999
    92. always @(posedge vga_clk or negedge vga_rst_n) begin
    93. if(~vga_rst_n) begin
    94. address <= 0 ;
    95. end else begin
    96. if(rden == 1'b1) begin
    97. if(address == 9999) begin
    98. address <= 0 ;
    99. end else begin
    100. address <= address + 1'b1 ;
    101. end
    102. end else begin
    103. address <= address ;
    104. end
    105. end
    106. end
    107. assign address_w = address ;
    108. // reg rden; // 读使能信号超前图像数据一个时钟周期。..或者说rom读出的数据,滞后读使能信号一个时钟周期。这是输出端口没有加reg的情况。加了要滞后两个时钟周期。
    109. always @(posedge vga_clk or negedge vga_rst_n) begin // 这其实也说明了,时序逻辑会滞后条件一个时钟周期。说明输出是reg型。
    110. if(~vga_rst_n) begin
    111. rden <= 1'b0 ;
    112. end else begin
    113. if((pix_y >= 190) && (pix_y <= 289) && (pix_x >= 267) && (pix_x <= 366)) begin
    114. rden <= 1'b1 ;
    115. end else begin
    116. rden <= 1'b0 ;
    117. end
    118. end
    119. end
    120. assign rden_w = rden ;
    121. endmodule

     

     

     

     

  • 相关阅读:
    jmeter使用监视器结果监控tomcat性能
    第3章-指标体系与数据可视化-3.2-描述性统计分析与绘图
    C/C++小型文本查询引擎
    python数据分析-ZET财务数据分析
    mac os + python 新建环境 github仓库
    在线系统运行慢,对其进行性能分析以及处置的方法【总结】
    2021年03月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
    项目风险管理必备内容总结
    Mysql的事务以及存储引擎
    肽核酸如何保存|包含偶氮苯单元的肽核酸(N-PNA)|99Tcm标记c-myc mRNA
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/133244715