【无标题】

本文详细介绍了VGA协议的实验目的,包括理解VGA控制时序参数并使用Verilog在不同显示模式下实现VGA显示。通过在行、场同步信号中加入延时,观察其对显示效果的影响。实验涵盖了时钟模块、数据产生模块和VGA控制模块的设计,以及代码实现。最后,讨论了行场同步信号和消隐信号在显示过程中的作用,以及如何设计延时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的

  1. 深入了解VGA协议,理解不同显示模式下的VGA控制时序参数(行频、场频、水平/垂直同步时钟周期、显示后沿/前沿等概念和计算方式);

  2. 通过Verilog编程,在至少2种显示模式下(640480@60Hz,1024768@75Hz)分别实现以下VGA显示,并对照VGA协议信号做时序分析:1)屏幕上显示彩色条纹;2)显示自定义的汉字字符(姓名-学号);3)输出一幅彩色图像。

  3. 在Verilog代码中,将行、场同步信号中,故意分别加入一定 ms延时(用delay命令),观察会出现什么现象。

二、VGA协议以及实现VGA显示

1.概念

’VGA(Video Graphics Array)视频图形阵列是 IBM 于1987年提出的一个使用模拟信号的电脑显示标准。VGA具有分辨率高、显示速率快、颜色丰富等优点。VGA 接口不但是CRT 显示设备的标准接口,同样也是 LCD 液晶显示设备的标准接口,具有广泛的应用范围。
使用原理:显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左向右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,开始下一帧。隔行扫描是指电子束扫描时每隔一行扫一线,完成一屏后在返回来扫描剩下的线,隔行扫描的显示器闪烁的厉害,会让使用者的眼睛疲劳。在此我们选择逐行扫描的方式。

2.使用设备

设备为DE2-115

TIPS:
具体实现方式请根据开发板来,就比如DE2-115这块板子,需要传输rgb三原色的数据和行场同步信号,也需要传输时钟、和消隐信号,且RBG是888位宽的,其他板子可能不一样,需要更改
在这里插入图片描述

3.模块设计

模块分为时钟模块、数据产生模块、和vga控制模块,时钟模块产生所需时钟,但这里并不是根据分辨率自动设置,而是写死在了640*480 @ 60HZ,所以为25M,如果要写其他的,自行更改
数据产生模块是根据vga控制模块传出来的位置来控制所显示的输出,再把所显示的数据输出回传到vga控制模块
vga控制模块就是输出vga协议的一些控制信号
在这里插入图片描述

4.代码

若显示彩条,可以直接复制下面代码,把数据生成模块厉的rom实例化和图片输出注释就行,再把彩条输出的输出取消注释

若是显示图片,需要调用rom核,并且需要将图片转成bmp文件,再把bmp转为mif文件,然后在调用rom的时候将图片转为的mif文件设为初始化文件,这样就可以通过地址来读取rom里存储的图片数据,当判断条件成立时,就可以把图片显示到显示屏上了。
counter25M.v:

module counter25M(
  input   wire          clk           , //VGA时
  input   wire          rst_n         , //复位
  output  reg         clk_25M         
);

always @(posedge clk or negedge rst_n) begin
     if (!rst_n) begin
         clk_25M <= 1'b0     ; 
     end else  begin
         clk_25M <=  ~clk_25M;
     end 
end
endmodule

data_generate.v:

module data_generate(
 input   wire         clk             , //VGA时钟,640*480 60hz 25.2MHz
 input   wire         rst_n           , //复位

 input   wire  [10:0] h_addr           , //数据有效显示区域,行地址
 input   wire  [10:0] v_addr           , //数据有效显示区域,列地址
 output  reg  [23:0] data_display       //显示数据
);
wire [23:0] q_sig;//从ip核里取出的图片数据
reg  [15:0] address_sig;//取图片的地址
wire        pic_area;//是否在图片显示的区域
parameter PIC_WIDTH = 9'd200;//图片长
parameter PIC_HEIGH = 9'd200;//图片宽
parameter BALCK    = 24'h000000,
          RED      = 24'hFF0000,
          GREEN    = 24'h00FF00,
          BLUE     = 24'h0000FF,
          YELLOW   = 24'hFFFF00,
          SKY_BULE = 24'h00FFFF,
          PURPLE   = 24'hFF00FF,
          GRAY     = 24'hC0C0C0,
          WHITE    = 24'hFFFFFF;

//调用ip核,取数据
//存入的图片为512*512,640*480
rom	rom_inst (
	.address ( address_sig ),
	.clock ( clk ),
	.q ( q_sig )
	);

assign pic_area = h_addr <= PIC_WIDTH && v_addr <= PIC_HEIGH;
//位置变化
always @(posedge clk or negedge rst_n) begin
     if (!rst_n) begin
      address_sig <= 16'd0;
     end else if ( address_sig == 40000 ) begin
      address_sig <= 16'd0;
     end else if ( pic_area ) begin//在显示区域里随着地址变化自动变换
      address_sig <= h_addr + v_addr * 200 ;
     end
     else begin //大于图片显示区域,将保持地址
      address_sig <= address_sig ;
     end
end


//状态输出,图片输出
always @(posedge clk or negedge rst_n) begin
     if (!rst_n) begin
        data_display <= WHITE   ; 
     end else begin
        case (pic_area)
            0   : data_display <=   RED           ;
            1   : data_display <=   q_sig         ;  
            default: data_display <= data_display ;
        endcase
     end
end

/* //状态输出,彩条输出
always @(posedge clk or negedge rst_n) begin
     if (!rst_n) begin
        data_display <= WHITE   ; 
     end else begin
        case (h_addr)
            0   : data_display <=   BALCK         ;  
            80  : data_display <=   RED           ;
            160 : data_display <=   GREEN         ;  
            240 : data_display <=   BLUE          ; 
            320 : data_display <=   YELLOW        ;   
            400 : data_display <=   SKY_BULE      ;     
            480 : data_display <=   PURPLE        ;   
            560 : data_display <=   GRAY          ; 
            default: data_display <= data_display ;
        endcase
     end
end */

endmodule

vga_contro.v

`define vga_640_480
`include "vga_param.v"



module vga_contro(
 input   wire         clk            , //VGA时钟,640*480 60hz 25.2MHz
 input   wire         rst_n          , //复位
 input   wire  [23:0] data_display   , //显示数据

 output  reg   [10:0] h_addr         , //数据有效显示区域,行地址,只有当有效的时候,
 output  reg   [10:0] v_addr         , //数据有效显示区域,列地址
 output  reg           disp_vld      , //表示输入的是否是有效数据,即为显示区域内的数据
 output  wire          v_sync        , //场同步信号,有效数据的条件之一
 output  wire          h_sync        , //行同步信号,有效数据的条件之一,只有当行和场的同步信号都有效之后,后面输入的才是有效数据
 output  reg   [7:0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值