• FPGA project : rom_vga_jump


    只有vga_pix 模块代码与rom_vga不同,所以只上传了这个模块的代码与仿真代码。

     

    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 wire [15:0] pix_data
    24. );
    25. // parameter
    26. parameter PIC_SIZE= 14'd1_0000 ,
    27. H_PIC = 10'd100 ,
    28. V_PIC = 10'd100 ,
    29. H_VALID = 10'd640 ,
    30. V_VALID = 10'd480 ;
    31. parameter RED = 16'hF800 ,
    32. ORANGE = 16'hFC00 ,
    33. YELLOW = 16'hFFe0 ,
    34. GREEN = 16'h07e0 ,
    35. QING = 16'h07FF ,
    36. BLUE = 16'h001F ,
    37. PURPLE = 16'hF81F ,
    38. BLACK = 16'h0000 ,
    39. WHITE = 16'hFFFF ,
    40. GRAY = 16'hD69A ;
    41. // wire signal define
    42. wire rden_w ;
    43. wire [13:0] address_w;
    44. wire [15:0] data_pic ; // 图片的像素
    45. // reg signal define
    46. reg [15:0] data_pix; // 10 个彩条
    47. reg rden ; // 读使能信号超前图像数据一个时钟周期。
    48. reg [13:0] address ; // 在读使能信号拉高,每个时钟周期自加一,0 ~ PIC_SIZE - 1
    49. reg pic_vald; // 图片使能
    50. reg [9:0] x_move ; // x轴方向的,偏移量
    51. reg x_flag ; // 为0 表示向右移动;为1 表示向左移动。
    52. reg [9:0] y_move ;
    53. reg y_flag ; // 为0 表示向下移动;为1 表示向上移动。
    54. // reg [15:0] data_pix; // 10 个彩条
    55. always @(posedge vga_clk or negedge vga_rst_n) begin
    56. if(~vga_rst_n) begin
    57. data_pix <= 10'h3ff ;
    58. end else begin // 有简便写法 ( H_VALID / 10 ) * n
    59. if((pix_x >= 10'd0) && (pix_x <= H_VALID / 10 - 1'b1))
    60. data_pix <= RED ;
    61. else
    62. if((pix_x >= H_VALID / 10) && (pix_x <= (H_VALID / 10) * 2 - 1'b1))
    63. data_pix <= ORANGE ;
    64. else
    65. if((pix_x >= (H_VALID / 10) * 2) && (pix_x <= (H_VALID / 10) * 3 - 1'b1))
    66. data_pix <= YELLOW ;
    67. else
    68. if((pix_x >= (H_VALID / 10) * 3) && (pix_x <= (H_VALID / 10) * 4 - 1'b1))
    69. data_pix <= GREEN ;
    70. else
    71. if((pix_x >= (H_VALID / 10) * 4) && (pix_x <= (H_VALID / 10) * 5 - 1'b1))
    72. data_pix <= QING ;
    73. else
    74. if((pix_x >= (H_VALID / 10) * 5) && (pix_x <= (H_VALID / 10) * 6 - 1'b1))
    75. data_pix <= BLUE ;
    76. else
    77. if((pix_x >= (H_VALID / 10) * 6) && (pix_x <= (H_VALID / 10) * 7 - 1'b1))
    78. data_pix <= PURPLE ;
    79. else
    80. if((pix_x >= (H_VALID / 10) * 7) && (pix_x <= (H_VALID / 10) * 8 - 1'b1))
    81. data_pix <= BLACK ;
    82. else
    83. if((pix_x >= (H_VALID / 10) * 8) && (pix_x <= (H_VALID / 10) * 9 - 1'b1))
    84. data_pix <= WHITE ;
    85. else
    86. if((pix_x >= (H_VALID / 10) * 9) && (pix_x <= H_VALID - 1'b1) )
    87. data_pix <= GRAY ;
    88. else
    89. data_pix <= BLACK ;
    90. end
    91. end
    92. // reg rden ;
    93. // wire rden_w ;
    94. always @(posedge vga_clk or negedge vga_rst_n) begin
    95. if(~vga_rst_n) begin
    96. rden <= 1'b0 ;
    97. end else begin
    98. if(((pix_y >= y_move) && (pix_y <= (y_move + V_PIC - 1))) && ((pix_x >= x_move) && (pix_x <= (x_move + H_PIC - 1)))) begin
    99. rden <= 1'b1 ;
    100. end else begin
    101. rden <= 1'b0 ;
    102. end
    103. end
    104. end
    105. assign rden_w = rden ;
    106. // reg [13:0] address ;
    107. always @(posedge vga_clk or negedge vga_rst_n) begin
    108. if(~vga_rst_n) begin
    109. address <= 0 ;
    110. end else begin
    111. if(rden == 1'b1) begin
    112. if(address == PIC_SIZE - 1) begin
    113. address <= 0 ;
    114. end else begin
    115. address <= address + 1'b1 ;
    116. end
    117. end else begin
    118. address <= address ;
    119. end
    120. end
    121. end
    122. assign address_w = address ;
    123. // reg pic_vald;
    124. always @(posedge vga_clk or negedge vga_rst_n) begin
    125. if(~vga_rst_n) begin
    126. pic_vald <= 1'b0 ;
    127. end else begin
    128. pic_vald <= rden ;
    129. end
    130. end
    131. // reg [9:0] x_move ;
    132. always @(posedge vga_clk or negedge vga_rst_n) begin
    133. if(~vga_rst_n) begin
    134. x_move <= 10'd0 ;
    135. end else begin
    136. if(pix_x == H_VALID - 1 && x_flag == 1'b0 && pix_y == V_VALID - 1) begin
    137. x_move <= x_move + 1'b1 ;
    138. end else begin
    139. if(pix_x == H_VALID - 1 && x_flag == 1'b1 && pix_y == V_VALID - 1) begin
    140. x_move <= x_move - 1'b1 ;
    141. end else begin
    142. x_move <= x_move ;
    143. end
    144. end
    145. end
    146. end
    147. // reg x_flag ;
    148. always @(posedge vga_clk or negedge vga_rst_n) begin
    149. if(~vga_rst_n) begin
    150. x_flag <= 1'b0 ;
    151. end else begin
    152. if((pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == (H_VALID - H_PIC - 2) && x_flag == 1'b0)
    153. || (pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == 0 && x_flag == 1'b1)) begin
    154. x_flag <= ~x_flag ;
    155. end else begin
    156. x_flag <= x_flag ;
    157. end
    158. end
    159. end
    160. // reg [9:0] y_move ;
    161. always @(posedge vga_clk or negedge vga_rst_n) begin
    162. if(~vga_rst_n) begin
    163. y_move <= 10'd0 ;
    164. end else begin
    165. if(pix_x == H_VALID - 1 && y_flag == 1'b0 && pix_y == V_VALID - 1) begin
    166. y_move <= y_move + 1'b1 ;
    167. end else begin
    168. if(pix_x == H_VALID - 1 && y_flag == 1'b1 && pix_y == V_VALID - 1) begin
    169. y_move <= y_move - 1'b1 ;
    170. end else begin
    171. y_move <= y_move ;
    172. end
    173. end
    174. end
    175. end
    176. // reg y_flag ;
    177. always @(posedge vga_clk or negedge vga_rst_n) begin
    178. if(~vga_rst_n) begin
    179. y_flag <= 1'b0 ;
    180. end else begin
    181. if((pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && y_move == (V_VALID - V_PIC - 1) && y_flag == 1'b0)
    182. || (pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && y_move == 0 && y_flag == 1'b1)) begin
    183. y_flag <= ~y_flag ;
    184. end else begin
    185. y_flag <= y_flag ;
    186. end
    187. end
    188. end
    189. // wire [15:0] data_pic;
    190. /*****************output signal*******************************************/
    191. // reg [15:0] pix_data
    192. assign pix_data = (pic_vald == 1'b1) ? data_pic : data_pix ;
    193. /****************新增代码*******************/
    194. rom_pic rom_pic_insert(
    195. .address ( address_w ),
    196. .clock ( vga_clk ),
    197. .rden ( rden_w ),
    198. .q ( data_pic )
    199. );
    200. endmodule
    1. `timescale 1ns/1ns
    2. module test_top ();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. wire [15:00] rgb ;
    6. wire hsync ;
    7. wire vsync ;
    8. top top_insert(
    9. .sys_clk ( sys_clk ) ,
    10. .sys_rst_n ( sys_rst_n ) ,
    11. .rgb ( rgb ) ,
    12. .hsync ( hsync ) ,
    13. .vsync ( vsync )
    14. );
    15. defparam top_insert.vga_pix_insert_top.H_VALID = 60 ,
    16. top_insert.vga_pix_insert_top.V_VALID = 50 ,
    17. top_insert.vga_pix_insert_top.H_PIC = 10 ,
    18. top_insert.vga_pix_insert_top.V_PIC = 10 ,
    19. top_insert.vga_pix_insert_top.PIC_SIZE= 100 ;
    20. defparam top_insert.vga_ctrl_insert_top.H_SYNC = 10'd2 ,
    21. top_insert.vga_ctrl_insert_top.H_BACK = 10'd2 ,
    22. top_insert.vga_ctrl_insert_top.H_LEFT = 10'd2 ,
    23. top_insert.vga_ctrl_insert_top.H_VALID = 10'd60 ,
    24. top_insert.vga_ctrl_insert_top.H_RIGHT = 10'd2 ,
    25. top_insert.vga_ctrl_insert_top.H_FORNT = 10'd2 ,
    26. top_insert.vga_ctrl_insert_top.H_TOTAL = 10'd70 ;
    27. defparam top_insert.vga_ctrl_insert_top.V_SYNC = 10'd2 ,
    28. top_insert.vga_ctrl_insert_top.V_BACK = 10'd2 ,
    29. top_insert.vga_ctrl_insert_top.V_TOP = 10'd2 ,
    30. top_insert.vga_ctrl_insert_top.V_VALID = 10'd50 ,
    31. top_insert.vga_ctrl_insert_top.V_BOTTOM= 10'd2 ,
    32. top_insert.vga_ctrl_insert_top.V_FRONT = 10'd2 ,
    33. top_insert.vga_ctrl_insert_top.V_TOTAL = 10'd60 ;
    34. parameter CYCLE = 20 ;
    35. initial begin
    36. sys_clk = 1'b1 ;
    37. sys_rst_n <= 1'b0 ;
    38. #(CYCLE) ;
    39. sys_rst_n = 1'b1 ;
    40. end
    41. always #(CYCLE / 2) sys_clk = ~sys_clk ;
    42. endmodule

     

  • 相关阅读:
    hadoop大数据原理与应用------初识Hadoop数据集
    天翼云为这场酷炫的元宇宙会议做了这件事
    【等保小知识】等级保护单项测评包括哪些项目?
    可视化—“颠覆传统设计:用Three.js创造炫酷的3D交互界面!“
    ARM64-内嵌汇编
    详解 Scala 的泛型
    头歌平台 | 逻辑函数及其描述工具logisim使用
    机器学习笔记 十:基于神经网络算法的数据预测
    springcloud 整合 openfeign
    11.ElasticSearch系列之搜索相关性算分机制
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/133256133