FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

这篇具有很好参考价值的文章主要介绍了FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

VGA显示

目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示

1. 模块框图与波形图

fpga仿真内部信号显示,fpga,fpga开发

vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。

(1) clk_gen——使用pll锁相环实现时钟分频
(2)vga_ctrl——图像控制与输出模块
(3)vga_pic——图像数据生成模块

将三个模块布局布线,最终组成vga_colorbar模块,如下图:

fpga仿真内部信号显示,fpga,fpga开发
首先讨论clk_gen模块。由图,sys_clk与sys_rst_n是系统时钟与复位按钮
clk_gen是我们自定义的输出频率为15MHZ时钟的pll锁相环;
areset为复位按键,由于其为高电平有效,故对sys_rst_n取反输入。
clk_out是15MHZ时钟;
locked为标志信号,正常输出高电平,当复位信号有效时,输出低电平;

在讨论接下来的两个模块之前,我们先明确显示屏是如何显示我们需要的图像,这对后面的模块设计至关重要



首先明确VGA显示屏是如何扫描得到有效图像:


fpga仿真内部信号显示,fpga,fpga开发
如上图所示,直观来看vga显示屏从左到右,从上到下逐个像素点进行扫描;
那么控制行扫描的信号成为行同步信号——hync;
控制列扫描信号成为场同步信号——vsync;


接着,我们进一步来看行同步信号hysnc与场同步信号vsync的详细数据:

fpga仿真内部信号显示,fpga,fpga开发


行/场同步信号从波形的角度看可分为六部分,分别为同步、后沿、左边框、有效图像、右边框、前沿部分;表中的时钟部分代表着clk_gen的输出时钟频率,也是vga_ctrl、vga_pic的输入时钟频率,本文中我们使用25MHZ时钟频率。


fpga仿真内部信号显示,fpga,fpga开发

图中红色与黄色相交的部分即为有效图像部分


至此,我们可以开始绘制各个模块的波形图进而编写代码。

2. 子模块波形图与代码实现

(1).vga_ctrl模块波形图

fpga仿真内部信号显示,fpga,fpga开发

fpga仿真内部信号显示,fpga,fpga开发
绿色为输入数据,红色为输出数据,黄色为中间变量;

cnt_h与cnt_v分别为行同步计数与场同步计数,即图像的坐标,由上表可知,当cnt_h技术到144-83范围且cnt_v在计数到35-514范围时,vga在有效图像的显示范围内。
pix_x与pix_y分别为有效图像显示的坐标变量;
rgb_valid为有效图像标志信号;


(2).vga_ctrl模块代码实现

RTL代码:

 module vga_ctrl

 (
     
    input   wire         vga_clk     ,
    input   wire         sys_rst_n   ,
    input   wire[15:0]   pix_data     ,
    
    output  wire         hsync       ,
    output  wire         vsync       ,
    output  wire  [9:0]  pix_y       ,
    output  wire  [9:0]  pix_x       ,
    output  wire [15:0]  vga_rgb      
     
 
     
     
 );
     parameter  H_SYNC   = 10'd96  ,
                H_BACK    = 10'd40 ,
                H_LEFT    = 10'd8  ,
                H_VALID   = 10'd640,
                H_RIGHT   = 10'd8  ,
                H_FRONT   = 10'd8  ,
                H_TOTAL   = 10'd800 ;
                
    parameter   V_TOTAL   = 10'd525 ,
                V_SYNC    = 10'd2   ,
                V_BACK    = 10'd25  ,
                V_TOP    = 10'd8   ,
                V_VALID   = 10'd480 ,
                V_RIGHT   = 10'd8   ,
                V_FRONT   = 10'd2   ;
       
       
 
 
reg    [9:0]   cnt_h   ;
reg    [9:0]   cnt_v   ;
wire           rgb_valid ;
wire           pix_data_req ;
 
 always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt_h <= 10'd0;
    else    if(cnt_h == H_TOTAL  - 10'd1)
        cnt_h <= 10'd0 ;
    else
        cnt_h <= 10'd1 + cnt_h ;
        
 always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt_v <= 10'd0;
    else    if(cnt_v == V_TOTAL - 10'd1 && cnt_h == H_TOTAL  - 10'd1)
        cnt_v <= 10'd0 ;
    else    if(cnt_h == H_TOTAL -1'b1)
        cnt_v <= 10'd1 + cnt_v ;  
    else
        cnt_v <= cnt_v ;
        
        
        
        
assign rgb_valid = ((cnt_h >= H_SYNC + H_BACK + H_LEFT)
                      && (cnt_h < H_SYNC + H_BACK+  H_LEFT + H_VALID)
                      && (cnt_v >= V_SYNC + V_BACK + V_TOP)
                      && (cnt_v < V_SYNC + V_BACK+  V_TOP + V_VALID))
                      ? 1'b1 : 1'b0 ;
                      
                     
assign pix_data_req = ((cnt_h >= H_SYNC + H_BACK + H_LEFT -1'b1)
                      && (cnt_h < H_SYNC + H_BACK+  H_LEFT + H_VALID - 1'b1)
                      && (cnt_v >= V_SYNC + V_BACK + V_TOP)
                      && (cnt_v < V_SYNC + V_BACK+  V_TOP + V_VALID))
                      ? 1'b1 : 1'b0 ;
                      

assign pix_x = (pix_data_req == 1'b1) ? (cnt_h - (H_SYNC + H_BACK +H_LEFT - 1'b1)) :10'h3ff ;
assign pix_y = (pix_data_req == 1'b1) ? (cnt_v - (V_SYNC + V_BACK +V_TOP)) :10'h3ff ;



assign hsync = (cnt_h <= H_SYNC - 10'd1) ? 1'b1 : 1'b0 ;
assign vsync = (cnt_v <= V_SYNC - 10'd1) ? 1'b1 : 1'b0 ;


assign vga_rgb = (rgb_valid == 1'b1) ? pix_data : 16'h0000 ;





 
 endmodule
 

仿真代码:

  `timescale 1ns/1ns
  module tb_vga_ctrl();
  
  reg           sys_clk     ;
  reg           sys_rst_n   ;
  wire  [15:0]  pix_data    ;

wire            vga_clk     ;
wire            locked      ;
wire            rst_n       ;

wire    [9:0]   pix_x       ;
wire    [9:0]   pix_y       ;
wire            hsync       ;
wire            vsync       ;
wire    [15:0]  vga_rgb     ;
 
  initial
     begin
         sys_clk = 1'b1;
         sys_rst_n <= 1'b0;
         #20
         sys_rst_n <= 1'b1;
     end
  
 always #10 sys_clk = ~sys_clk; //clk frequency
 
 assign rst_n = (sys_rst_n && locked) ;
    
 
clk_gen	    clk_gen_inst (
	.areset ( ~sys_rst_n ),
	.inclk0 ( sys_clk ),
	.c0     ( vga_clk ),
	.locked ( locked )
	);

 
vga_ctrl  vga_ctrl_inst
 (

         .sys_rst_n(rst_n)   ,
         .vga_clk   (vga_clk )  ,
         .pix_data  (pix_data)   ,
        
         .hsync     (hsync)  ,
         .vsync     (vsync  )  ,
         .pix_y     (pix_y )  ,
         .pix_x     (pix_x )  ,
         .vga_rgb   (vga_rgb)   
         
    
            
         
 );
 
vga_pic     vga_pic_inst
(
    .vga_clk    (vga_clk ) ,
    .sys_rst_n  (rst_n) ,
    .pix_x      (pix_x ) ,
    .pix_y      (pix_y  ) ,
         
    .pix_data   (pix_data) 
  
  
);
     
 endmodule
(3).vga_pic模块波形

fpga仿真内部信号显示,fpga,fpga开发
fpga仿真内部信号显示,fpga,fpga开发

(3).vga_pic代码实现

RTL代码:

module vga_pic(
    input   wire            vga_clk     ,
    input   wire            sys_rst_n   ,
    input   wire    [9:0]   pix_x       ,
    input   wire    [9:0]   pix_y       ,
    
    output  reg     [15:0]  pix_data    
  
  
);

 parameter   H_VALID = 10'd640,
             V_VALID = 10'd480;
    
parameter   RED         = 16'hF800  ,
            ORANGE      = 16'hfc00  ,
            YELLOW      = 16'hffe0  ,
            GREEN       = 16'h07e0  ,
            CYAN        = 16'h07ff  ,
            BLUE        = 16'h00ff  ,
            PURPLE      = 16'hf81f  ,
            BLACK       = 16'h0000  ,
            WHITE       = 16'hffff  ,
            GRAY        = 16'hd69a  ;
 
always@(posedge vga_clk  or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        pix_data <= BLACK ;
    else    if(pix_x >= 10'd0 && pix_x < ((H_VALID / 10) * 1 ))
        pix_data <= RED   ;
    else    if((pix_x >= (H_VALID / 10) * 1)  && pix_x < ((H_VALID / 10) * 2 ))
        pix_data <= ORANGE  ;
    else    if((pix_x >= (H_VALID / 10) * 2 ) && pix_x < ((H_VALID / 10) * 3 ))
        pix_data <= YELLOW   ;
    else    if((pix_x >= (H_VALID / 10) * 3 ) && pix_x < ((H_VALID / 10) * 4 ))
        pix_data <= GREEN   ;
    else    if((pix_x >= (H_VALID / 10) * 4 ) && pix_x < ((H_VALID / 10) * 5 ))
        pix_data <= CYAN   ;
    else    if((pix_x >= (H_VALID / 10) * 5 ) && pix_x < ((H_VALID / 10) * 6 ))
        pix_data <= BLUE    ;
    else    if((pix_x >= (H_VALID / 10) * 6 ) && pix_x < ((H_VALID / 10) * 7 ))
        pix_data <= PURPLE   ;
    else    if((pix_x >= (H_VALID / 10) * 7 )&& pix_x < ((H_VALID / 10) * 8 ))
        pix_data <= BLACK   ;
    else    if((pix_x >= (H_VALID / 10) * 8 ) && pix_x < ((H_VALID / 10) * 9 ))
        pix_data <= WHITE   ;
    else    if((pix_x >= (H_VALID / 10) * 9 ) && pix_x < H_VALID )
        pix_data <= GRAY   ;
    else
        pix_data <= BLACK   ;
      
 
 
 
 
endmodule

3.顶层模块vga_colorbar代码实现

RTL代码:

module vga_colorbar(    
    input   wire        sys_clk     ,
    input   wire        sys_rst_n   ,
    
    output  wire        hsync       ,
    output  wire        vsync       ,
    output  wire [15:0]  vga_rgb      

);

wire    vga_clk     ;
wire    locked      ;
wire    rst_n       ;

wire    [9:0]   pix_x   ;
wire    [9:0]   pix_y   ;
wire    [15:0]  pix_data ;

assign  rst_n = (sys_rst_n && locked);

clk_gen	clk_gen_inst (
	.areset ( ~sys_rst_n ),
	.inclk0 ( sys_clk ),
	.c0     ( vga_clk ),
	.locked ( locked )
	);

 
vga_ctrl  vga_ctrl_inst
 (

    .sys_rst_n(rst_n)   ,
    .vga_clk   (vga_clk )  ,
    .pix_data  (pix_data)   ,
    
    .hsync     (hsync)  ,
    .vsync     (vsync  )  ,
    .pix_y     (pix_y )  ,
    .pix_x     (pix_x )  ,
    .vga_rgb   (vga_rgb)   
         
    
            
         
 );
 
vga_pic     vga_pic_inst
(
    .vga_clk    (vga_clk ) ,
    .sys_rst_n  (rst_n) ,
    .pix_x      (pix_x ) ,
    .pix_y      (pix_y  ) ,
         
    .pix_data   (pix_data) 
  
  
);
 
 
endmodule


顶层模块仿真代码:文章来源地址https://www.toymoban.com/news/detail-765734.html

 `timescale 1ns/1ns
module tb_vga_colorbar();    
      reg       sys_clk     ;
      reg       sys_rst_n   ;
                           
      wire        hsync     ;
      wire        vsync     ;
      wire [15:0]  vga_rgb  ; 

initial
    begin
         sys_clk = 1'b1;
         sys_rst_n <= 1'b0;
         #20
         sys_rst_n <= 1'b1;
    end
     
always #10 sys_clk = ~sys_clk; //clk frequency

vga_colorbar   vga_colorbar_inst
(
   .sys_clk   (sys_clk ) ,
   .sys_rst_n (sys_rst_n ) ,
               
   .hsync     (hsync  ) ,
   .vsync     (vsync  ) ,
   .vga_rgb   (vga_rgb )

);




endmodule 

到了这里,关于FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA_学习_04_Verilog基础语法和Modelsem仿真

    前言:对于以前学过C/C++/C#的作者来讲,Verilog的基础语法算是 特别简单 的。本文主要介绍Verilog的基础语法和Modelsem仿真。 FPGA开发是以模块为基础的,每个可 综合 的.v文件都是一个模块,模块由 module 和 endmodule 来声明。在这两个的内部,完成模块功能的实现。 在Vi

    2024年02月05日
    浏览(34)
  • 学习如何独立的使用Modelsim进行仿真验证?——编写verilog文件并查看仿真波形

    本篇记录如何独立的使用Modelsim进行仿真,便于之后查看。 Modelsim独立仿真的步骤: 创建工作文件夹——编译设计文件——导入及运行仿真——调试结果 具体的: 1、新建一个工程 指定工程名称、路径和默认库名称。一般情况下,设定Default Library Name默认库名称为work。 指定的

    2023年04月08日
    浏览(31)
  • 北邮22级信通院数电:Verilog-FPGA(3)实验“跑通第一个例程”modelsim仿真及遇到的问题汇总(持续更新中)

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 注意:本篇文章所有绝对路径的展示都来自上一篇博客 北邮22级信通院数

    2024年02月07日
    浏览(37)
  • Verilog代码生成FPGA仿真波形文件(VCD)介绍

    Verilog代码生成FPGA仿真波形文件(VCD)介绍 在FPGA设计中,我们需要对设计的电路进行仿真以检查其正确性。VCD(Value Change Dump)文件是一种常用的仿真波形文件格式,可以记录电路仿真过程中各个信号的变化情况。本文将介绍如何使用Verilog代码来生成VCD文件。 首先,我们需

    2024年02月06日
    浏览(32)
  • 基于FPGA的MSK调制波形Verilog代码Quartus仿真

    名称:基于FPGA的MSK调制波形Verilog代码Quartus仿真(文末获取) 软件:Quartus 语言:Verilog 代码功能: 基于FPGA的MSK调制波形 1、输入调制原始数据,输出MSK调制波形 2、包括差分编码模块,MSK调制模块,DDS模块,有符号乘法器模块等 1. 工程文件 2. 程序文件 3. 程序编译 4. RTL图

    2024年02月20日
    浏览(26)
  • 基于FPGA的音乐喷泉控制Verilog代码Quartus仿真

    名称:基于FPGA的音乐喷泉控制Verilog代码Quartus仿真(文末获取) 软件:Quartus 语言:Verilog 代码功能: 基于FPGA的音乐喷泉控制 1、具有启动控制按键,按下后开始 2、喷泉具有6个喷嘴,可以手动切换三种工作模式 3、输入的音乐信号分为低音、中音、高音 4、将输入的音转换为

    2024年02月22日
    浏览(30)
  • 【安路FPGA】联合modelsim仿真

    第一在modelsim安装目录下新建一个文件夹Anlogic用来存放TD库文件: 打开modelsim仿真软件,feil→change Directory,选择刚才新建文件目录,在新建一个Library库如图所示: TD库文件al与common是必须要添加的两个库,我的芯片是ph1系列所以添加ph1 在去到这个路径会发现多了三个文件夹,在

    2024年02月08日
    浏览(38)
  • 基于FPGA的64bit算术乘法器设计Verilog代码Quartus仿真

    名称:基于FPGA的64bit算术乘法器设计Verilog代码Quartus仿真(文末获取) 软件:Quartus 语言:Verilog 代码功能: Verilog HDL设计64bits算术乘法器 基本功能 1.用 Veriloghdl设计实现64bit二进制整数乘法器,底层乘法器使用16*168*88*328*16小位宽乘法器来实现底层乘法器可以使用FPGA内部P实现

    2024年02月19日
    浏览(37)
  • 【FPGA】Quartus项目工程创建以及联合Modelsim进行仿真(FPGA项目创建与仿真)

    目录 软件下载 Quartus中设置Modelsim-Altera仿真器 创建新项目 编写项目代码 编写测试模块   这里使用的是Quartus Prime Light 18.1 以及ModelSim Intel FPGA 10.5b,两个软件在同一个地方下载,附网址https://www.intel.com/content/www/us/en/software-kit/665990/intel-quartus-prime-lite-edition-design-software-version-

    2024年03月15日
    浏览(56)
  • 紫光同创 FPGA 开发跳坑指南(三)—— 联合 Modelsim 仿真

        Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具,主要用于验证数字电路设计是否正确。紫光 Pango Design Suite 开发套件支持联合 Modelsim 仿真,这里作简要的介绍。 方法一     打开 Pango Design Suite,点击 Tools - Compile Simulation Libraries,在弹出来的窗口中,设置需要编译

    2023年04月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包