vga显示
一、实验内容
实验要求
实现vga接口显示,可以将需要发送的数据显示屏幕上。
实验环境
实验平台:特权同学Cy4_Altera开发板
实验软件:Quartus 18.1 + Modelsim 10.7
主控芯片:EP4CE6E22C8
二、系统框图

VGA实现的接口时序,即hsync和vsync都为高有效(其中一种)。
不论是vsync,还是hsync,都是在addressable video区域输出有效的数据,而hsync是在front_porch后出现信号。
三、设计分析
根据上面的时序图,我们需要设计相应的时序波形。我们设计的分辨率以640x480@60Hz为例进行实现。
其时钟频率为25MHz,与输入的时钟频率一致。
主要的参数有front porch、sync time、back porch、top/left border、addr time、totaltime

根据上面的参数,设计相应的时序。同时hsync的拉高表示一帧的开始。

关键在于输出vsync信号和hsync信号,以及在有效的数据方位内输出将要显示的数据。
四、实验步骤
采用parameter定义一些宏变量,来实现相应的功能,方便适应其他的分辨率和显示帧数。
根据时序图编写代码,然后使用modelsim仿真查看结果。
//hsync_flag
always @(posedge clk)
begin
if (rst == 1'b1)
hsync_flag <= 1'b0;
else if (hcnt == (H_SYNC_TIME - 'd1))
hsync_flag <= 1'b0;
else if (hcnt == (H_TOTAL_TIME - 'd1))
hsync_flag <= 1'b1;
end
//vsync_flag
always @(posedge clk)
begin
if (rst == 1'b1)
vsync_flag <=1'b0;
else if (vcnt == (V_SYNC_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1))
vsync_flag <= 1'b0;
else if (vcnt == (V_TOTAL_TIME - 'd1) && hcnt == (H_TOTAL_TIME - 'd1))
vsync_flag <= 1'b1;
end
其中很重要的就是hsync和vsync信号的产生。
五、实际波形仿真
查看modelsim的仿真结果。

hcnt计数到95时hsync拉低,数据正确。

hcnt计数到143拉高,这里提前了一拍,拉高,可以保证数据就能够与实际要求的位置同步。如下图所示。

最后是相应的结果,基本是正确的。

没问题,那就下板测试。

结果正确,搞定。
六、总结与讨论*
1.先设计时序图,然后编写代码,使用modelsim仿真,最后下板测试,这是一个连续的过程。若还是有问题,可以考虑使用ila抓取数据,进一步查找问题。