vga显示
一、实验内容
实验要求
实现vga接口显示,可以将需要发送的数据显示屏幕上。
实验环境
实验平台:特权同学Cy4_Altera开发板
实验软件:Quartus 18.1 + Modelsim 10.7
主控芯片:EP4CE6E22C8
二、系统框图
![image-20210105201113869](https://i-blog.csdnimg.cn/blog_migrate/49e3c12177311017469549a0a561a5a5.png)
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
![image-20210105202714303](https://i-blog.csdnimg.cn/blog_migrate/4a1952e483e95dcd4f76a95ea8e558f1.png)
根据上面的参数,设计相应的时序。同时hsync的拉高表示一帧的开始。
![image-20210105205445462](https://i-blog.csdnimg.cn/blog_migrate/003083b85a9debbcb172deedd7d33f0e.png)
关键在于输出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的仿真结果。
![image-20210105214440731](https://i-blog.csdnimg.cn/blog_migrate/272cd2d7265d7b8a60a14e8de3b53c5e.png)
hcnt计数到95时hsync拉低,数据正确。
![image-20210105214753626](https://i-blog.csdnimg.cn/blog_migrate/d46c5c5df80e561b1b6f121566a57c87.png)
hcnt计数到143拉高,这里提前了一拍,拉高,可以保证数据就能够与实际要求的位置同步。如下图所示。
![image-20210105214927029](https://i-blog.csdnimg.cn/blog_migrate/8d551527e7b153ee0916ffa38696d2a6.png)
最后是相应的结果,基本是正确的。
![image-20210105215054152](https://i-blog.csdnimg.cn/blog_migrate/34f0884b1e01f037757e014852f678e4.png)
没问题,那就下板测试。
![image-20210105223043366](https://i-blog.csdnimg.cn/blog_migrate/d5b9d581418df1db457428863ce38425.png)
结果正确,搞定。
六、总结与讨论*
1.先设计时序图,然后编写代码,使用modelsim仿真,最后下板测试,这是一个连续的过程。若还是有问题,可以考虑使用ila抓取数据,进一步查找问题。