• 基于System-Verilog的VGA彩条设计与仿真


    目录

    一、实验目标

    二、模块代码

    三、实验结果

    四、总结


    一、实验目标

    学习和掌握System Verilog基本语法,在DE2-115开发板上设计驱动VGA显示器,在640x480@60显示模式下完成十种颜色等宽彩条的显示。

    二、模块代码

    1、时钟分频模块:将50MHZ的系统时钟分频成25MHZ,fpga系统时钟为50MHZ,而640x480@60显示模式下时钟频率为25.175MHZ,由于25.175MHZ的频率不太方便生成。为了便于时钟的生成,这里使用25MHZ代替25.175MHZ,时钟分频模块采用pll锁相环。

    2、VGA_ctrl模块:生成rgb[15:0]、hsync、vsync三路信号,以及图像的横纵坐标

    1. `timescale 1ns/1ns
    2. module vga_ctrl ( //VGA控制模块
    3. input logic vga_clk ,
    4. input logic sys_rst_n ,
    5. input logic [15:0] pix_data ,//图像数据
    6. output logic [9:0] pix_x ,
    7. output logic [9:0] pix_y ,
    8. output logic hsync ,//行扫描信号
    9. output logic vsync ,//场扫描信号
    10. output logic [15:0] rgb
    11. );
    12. parameter H_SYNC = 10'd96 , //行同步
    13. H_BACK = 10'd40 , //行时序后沿
    14. H_LEFT = 10'd8 , //行时序左边框
    15. H_VALID = 10'd640 , //行有效数据
    16. H_RIGHT = 10'd8 , //行时序右边框
    17. H_FRONT = 10'd8 , //行时序前沿
    18. H_TOTAL = 10'd800 ; //行扫描周期
    19. parameter V_SYNC = 10'd2 , //场同步
    20. V_BACK = 10'd25 , //场时序后沿
    21. V_TOP = 10'd8 , //场时序上边框
    22. V_VALID = 10'd480 , //场有效数据
    23. V_BOTTOM = 10'd8 , //场时序下边框
    24. V_FRONT = 10'd2 , //场时序前沿
    25. V_TOTAL = 10'd525 ; //场扫描周期
    26. reg [9:0] cnt_h ;
    27. reg [9:0] cnt_v ;
    28. wire pix_data_req ;
    29. wire rgb_valid ; //图像有效信号,行扫描信号位于有效图像范围并且场扫描信号位于有效图像范围时图像有效信号为高电平
    30. //cnt_h:行同步信号计数器
    31. always_ff @(posedge vga_clk or negedge sys_rst_n ) begin
    32. if(sys_rst_n == 1'b0)
    33. cnt_h <= 10'd0;
    34. else if(cnt_h == H_TOTAL - 1'b1 )
    35. cnt_h <= 10'd0;
    36. else
    37. cnt_h <= cnt_h + 10'd1;
    38. end
    39. //hsync:行同步信号
    40. assign hsync = (cnt_h <= H_SYNC - 1'd1) ? 1'b1 : 1'b0 ;
    41. //cnt_v:场同步信号计数器
    42. always_ff @(posedge vga_clk or negedge sys_rst_n ) begin
    43. if(sys_rst_n == 1'b0)
    44. cnt_v <= 10'd0;
    45. else if((cnt_v == V_TOTAL - 1'd1) && (cnt_h == H_TOTAL-1'd1))
    46. cnt_v <= 10'd0;
    47. else if(cnt_h == H_TOTAL -10'd1 )
    48. cnt_v <= cnt_v + 1'd1;
    49. else
    50. cnt_v <= cnt_v;
    51. end
    52. //vsync:场同步信号
    53. assign vsync = (cnt_v <= V_SYNC - 1'd1) ? 1'b1 : 1'b0 ;
    54. //图像有效信号
    55. assign rgb_valid = (((cnt_h >= H_SYNC + H_BACK + H_LEFT)
    56. && (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID))
    57. &&((cnt_v >= V_SYNC + V_BACK + V_TOP)
    58. && (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))
    59. ? 1'b1 : 1'b0;
    60. assign pix_data_req = (((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1)
    61. && (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1))
    62. &&((cnt_v >= V_SYNC + V_BACK + V_TOP)
    63. && (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))
    64. ? 1'b1 : 1'b0;
    65. //pix_x,pix_y:VGA有效显示区域像素点坐标
    66. assign pix_x = (pix_data_req == 1'b1)
    67. ? (cnt_h - (H_SYNC + H_BACK + H_LEFT-1'b1)) : 10'h3ff;
    68. assign pix_y = (pix_data_req == 1'b1)
    69. ? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 10'h3ff;
    70. //rgb:输出像素点色彩信息
    71. assign rgb = (rgb_valid == 1'b1) ? pix_data : 16'b0 ;
    72. endmodule

    3、图像信息生成模块:产生等宽十色彩条数据。

    1. `timescale 1ns/1ns
    2. module vga_pic
    3. (
    4. input logic vga_clk , //输入工作时钟,频率25MHz
    5. input logic sys_rst_n , //输入复位信号,低电平有效
    6. input logic [9:0] pix_x , //输入VGA有效显示区域像素点X轴坐标
    7. input logic [9:0] pix_y , //输入VGA有效显示区域像素点Y轴坐标
    8. output logic [15:0] pix_data //输出像素点色彩信息
    9. );
    10. parameter H_VALID = 10'd640 , //行有效数据
    11. V_VALID = 10'd480 ; //场有效数据
    12. parameter RED = 16'hF800, //红色
    13. ORANGE = 16'hFC00, //橙色
    14. YELLOW = 16'hFFE0, //黄色
    15. GREEN = 16'h07E0, //绿色
    16. CYAN = 16'h07FF, //青色
    17. BLUE = 16'h001F, //蓝色
    18. PURPPLE = 16'hF81F, //紫色
    19. BLACK = 16'h0000, //黑色
    20. WHITE = 16'hFFFF, //白色
    21. GRAY = 16'hD69A; //灰色
    22. always_ff@(posedge vga_clk or negedge sys_rst_n)
    23. if(sys_rst_n == 1'b0)
    24. pix_data <= 16'd0;
    25. else if((pix_x >= 0) && (pix_x < (H_VALID/10)*1))
    26. pix_data <= RED;
    27. else if((pix_x >= (H_VALID/10)*1) && (pix_x < (H_VALID/10)*2))
    28. pix_data <= ORANGE;
    29. else if((pix_x >= (H_VALID/10)*2) && (pix_x < (H_VALID/10)*3))
    30. pix_data <= YELLOW;
    31. else if((pix_x >= (H_VALID/10)*3) && (pix_x < (H_VALID/10)*4))
    32. pix_data <= GREEN;
    33. else if((pix_x >= (H_VALID/10)*4) && (pix_x < (H_VALID/10)*5))
    34. pix_data <= CYAN;
    35. else if((pix_x >= (H_VALID/10)*5) && (pix_x < (H_VALID/10)*6))
    36. pix_data <= BLUE;
    37. else if((pix_x >= (H_VALID/10)*6) && (pix_x < (H_VALID/10)*7))
    38. pix_data <= PURPPLE;
    39. else if((pix_x >= (H_VALID/10)*7) && (pix_x < (H_VALID/10)*8))
    40. pix_data <= BLACK;
    41. else if((pix_x >= (H_VALID/10)*8) && (pix_x < (H_VALID/10)*9))
    42. pix_data <= WHITE;
    43. else if((pix_x >= (H_VALID/10)*9) && (pix_x < H_VALID))
    44. pix_data <= GRAY;
    45. else
    46. pix_data <= BLACK;
    47. endmodule

    4、顶层模块:完成各模块的实例化

    1. `timescale 1ns/1ns
    2. module vga_colorbar
    3. (
    4. input logic sys_clk ,
    5. input logic sys_rst_n ,
    6. output logic hsync ,
    7. output logic vsync ,
    8. output logic [15:0] rgb
    9. );
    10. logic vga_clk ;
    11. logic locked ;
    12. logic rst_n ;
    13. logic [9:0] pix_x ;
    14. logic [9:0] pix_y ;
    15. logic [15:0] pix_data;
    16. assign rst_n = (sys_rst_n & locked);
    17. clk_gen clk_gen_inst
    18. (
    19. .areset (~sys_rst_n ),
    20. .inclk0 (sys_clk ),
    21. .c0 (vga_clk ),
    22. .locked (locked )
    23. );
    24. vga_ctrl vga_ctrl_inst
    25. (
    26. .vga_clk (vga_clk ),
    27. .sys_rst_n (rst_n ),
    28. .pix_data (pix_data ),
    29. .pix_x (pix_x ),
    30. .pix_y (pix_y ),
    31. .hsync (hsync ),
    32. .vsync (vsync ),
    33. .rgb (rgb )
    34. );
    35. vga_pic vga_pic_inst
    36. (
    37. .vga_clk (vga_clk ),
    38. .sys_rst_n (rst_n ),
    39. .pix_x (pix_x ),
    40. .pix_y (pix_y ),
    41. .pix_data (pix_data )
    42. );
    43. endmodule

    5、tb文件

    1. `timescale 1ns/1ns
    2. module tb_vga_ctrl ();
    3. logic sys_clk ;
    4. logic sys_rst_n ;
    5. logic [15:0] pix_data ;
    6. logic vga_clk ;
    7. logic locked ;
    8. logic rst_n ;
    9. logic hsync ;//行扫描信号
    10. logic vsync ;//场扫描信号
    11. logic [9:0] pix_x ;
    12. logic [9:0] pix_y ;
    13. logic [15:0] vga_rgb ;
    14. initial begin
    15. sys_clk = 1'b1 ;
    16. sys_rst_n = 1'b0;
    17. #20
    18. sys_rst_n = 1'b1;
    19. end
    20. always #10 sys_clk = ~sys_clk;
    21. assign rst_n = (sys_rst_n & locked);
    22. always_ff@(posedge vga_clk or negedge sys_rst_n)
    23. begin
    24. if(sys_rst_n == 1'b0)
    25. pix_data <= 16'h0000;
    26. else if( (pix_x >=10'd0 &&pix_x <=10'd639)&&(pix_y >=10'd0 &&pix_y <=10'd479))
    27. pix_data <= 16'hffff;
    28. else
    29. pix_data <= 16'h0000;
    30. end
    31. clk_gen clk_gen_inst (
    32. .areset ( ~sys_rst_n ),
    33. .inclk0 ( sys_clk ),
    34. .c0 ( vga_clk ),
    35. .locked ( locked )
    36. );
    37. vga_ctrl vga_ctrl_inst (
    38. . vga_clk (vga_clk ) ,
    39. . sys_rst_n (rst_n ) ,
    40. . pix_data (pix_data) ,//图像数据
    41. . hsync (hsync ) ,//行扫描信号
    42. . vsync (vsync ) ,//场扫描信号
    43. . pix_x (pix_x ) ,
    44. . pix_y (pix_y ) ,
    45. . vga_rgb (vga_rgb )
    46. );
    47. endmodule

    三、实验结果

    仿真波形:

    彩条显示:

    四、总结

    通过本次实验,我学习了SystemVerilog并完成了VGA彩条设计与仿真,SystemVerilog 在语言特性和功能上相对于 Verilog 更加强大和灵活,尤其在测试和验证方面有明显优势。

  • 相关阅读:
    Java开发之Mysql【面试篇 完结版】
    QT快速下载
    【科学文献计量】文本主题挖掘与可视化
    2022CTF培训(一)脱壳技术&Hook入门
    碰撞检测算法——分离轴算法在Unity中实现(一)
    IDEA集成Git
    DFS之剪枝与优化
    【Linux】I/O多路复用-SELECT/POLL/EPOLL
    数据结构初阶--双向循环链表(讲解+类模板实现)
    Word处理控件Aspose.Words功能演示:使用 C# 将 Word 文档转换为 Markdown
  • 原文地址:https://blog.csdn.net/weixin_52345779/article/details/139707915