基于FPGA的VGA/LCD显示控制器设计(附代码)

大侠好,欢迎来到fpga技术江湖,江湖偌大,相见即是缘分。大侠可以关注fpga技术江湖,在“闯荡江湖”、行侠仗义栏里获取其他感兴趣的资源,或者一起煮酒言欢。  
今天给大侠带来基于fpga的vga/lcd显示控制器设计,由于篇幅较长,分三篇。今天带来第三篇,下篇,程序的仿真与测试以及总结,话不多说,上货。
前两篇和之前推送过关于vga显示相关的文章,这里给个超链接,给各位大侠作个参考。
基于fpga的vga/lcd显示控制器设计(上)
基于fpga的vga/lcd显示控制器设计(中)
源码系列:基于fpga的vga驱动设计(附源工程)
导读
vga (video graphics array) 即视频图形阵列,是ibm于1987年随ps/2机(personalsystem 2)一起推出的使用模拟信号的一种视频传输标准。这个标准对于现今的个人电脑市场已经十分过时。但在当时具有分辨率高、显示速率快、颜色丰富等优点,在彩色显示器领域取得了广泛的应用,是众多制造商所共同支持的一个低标准。
lcd ( liquid crystal display 的简称)液晶显示器。lcd 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置tft(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过tft上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。按照背光源的不同,lcd可以分为ccfl显示器和led显示器两种。lcd已经替代crt成为主流,价格也已经下降了很多,并已充分普及。
在之前的文章中介绍了如何获取、处理摄像头提供的视频信号,在实际应用中还需要将经过处理的信号显示在显示器上。这个过程与信号处理中的过程上是相反的,将数字信号按照电视信号的制式组成合乎时序、格式要求的信号,并加入用于控制的各种同步信号。本篇将通过 fpga实现一个 vga/lcd 显示控制器的实例,并详细介绍实现过程。
第三篇内容摘要:本篇会介绍程序的仿真与测试以及总结等相关内容。
四、程序的仿真与测试
为了检验程序是否实现预先设定的功能,需要编写仿真程序。仿真程序的主要代码如下:
module test; //寄存器 reg clk; reg rst; //参数 parameter line_fifo_awidth = 7; //wire 申明 wire int; wire [31:0] wb_addr_o; wire [31:0] wb_data_i; wire [31:0] wb_data_o; wire [3:0] wb_sel_o; wire wb_we_o; wire wb_stb_o; wire wb_cyc_o; wire [2:0] wb_cti_o; wire [1:0] wb_bte_o; wire wb_ack_i; wire wb_err_i; wire [31:0] wb_addr_i; wire [31:0] wbm_data_i; wire [3:0] wb_sel_i; wire wb_we_i; wire wb_stb_i; wire wb_cyc_i; wire wb_ack_o; wire wb_rty_o; wire wb_err_o; reg pclk_i; wire pclk; wire hsync; wire vsync; wire csync; wire blanc; wire [7:0] red; wire [7:0] green; wire [7:0] blue; wire dvi_pclk_p_o; wire dvi_pclk_m_o; wire dvi_hsync_o; wire dvi_vsync_o; wire dvi_de_o; wire [11:0] dvi_d_o; wire vga_stb_i; wire clut_stb_i; reg scen; // 测试程序变量 integer wd_cnt; integer error_cnt; reg [31:0] data; reg [31:0] pattern; reg int_warn; integer n; integer mode; reg [7:0] thsync, thgdel; reg [15:0] thgate, thlen; reg [7:0] tvsync, tvgdel; reg [15:0] tvgate, tvlen; reg hpol; reg vpol; reg cpol; reg bpol; integer p, l; reg [31:0] pn; reg [31:0] pra, paa, tmp; reg [23:0] pd; reg [1:0] cd; reg pc; reg [31:0] vbase; reg [31:0] cbase; reg [31:0] vbara; reg [31:0] vbarb; reg [7:0] bank; // 常量定义 `define ctrl 32'h0000_0000 `define stat 32'h0000_0004 `define htim 32'h0000_0008 `define vtim 32'h0000_000c `define hvlen 32'h0000_0010 `define vbara 32'h0000_0014 `define vbarb 32'h0000_0018 `define use_vc 1 parameter pclk_c = 20; //测试内容 initial begin $timeformat (-9, 1, ns, 12); $display(); $display(******************************************************); $display(*vga/lcd controller simulation started ... *); $display(******************************************************); $display(); `ifdef waves $shm_open(waves); $shm_probe(as,test,as); $display(info: signal dump enabled ...); `endif scen = 0; error_cnt = 0; clk = 0; pclk_i = 0; rst = 0; int_warn=1; repeat(20) @(posedge clk); rst = 1; repeat(20) @(posedge clk); if(0) begin end else if(1) begin `ifdef vga_12bit_dvi dvi_pd_test; `endif end else begin // 测试区域 $display(); $display(*****************************************************); $display(*** xxx test ***); $display(*****************************************************); s0.fill_mem(1); repeat(10) @(posedge clk); //参数设置 vbara = 32'h0000_0000; vbarb = 32'h0001_0000; m0.wb_wr1( `vbara, 4'hf, vbara ); m0.wb_wr1( `vbarb, 4'hf, vbarb ); thsync = 0; thgdel = 0; thgate = 340; thlen = 345; tvsync = 0; tvgdel = 0; tvgate = 240; tvlen = 245; /* thsync = 0; thgdel = 0; thgate = 63; thlen = 70; tvsync = 0; tvgdel = 0; tvgate = 32; tvlen = 36; */ hpol = 0; vpol = 0; cpol = 0; bpol = 0; m0.wb_wr1( `htim, 4'hf, {thsync, thgdel, thgate} ); m0.wb_wr1( `vtim, 4'hf, {tvsync, tvgdel, tvgate} ); m0.wb_wr1( `hvlen, 4'hf, {thlen, tvlen} ); mode = 2; for(bank=0;bank<3;bank=bank + 1) begin case(mode) 0: begin cd = 2'h2; pc = 1'b0; end 1: begin cd = 2'h0; pc = 1'b0; end 2: begin cd = 2'h0; pc = 1'b1; end 3: begin cd = 2'h1; pc = 1'b0; end endcase m0.wb_wr1( `ctrl, 4'hf, { 16'h0, // reserved bpol, cpol, vpol, hpol, pc, // 1'b0, // pc cd, // 2'h2, // cd 2'h0, // vbl 1'b0, // reserved 1'b1, // cbswe 1'b1, // vbswe 1'b0, // bsie 1'b0, // hie 1'b0, // vie 1'b1 // video enable }); $display(mode: %0d screen: %0d, mode, bank); //repeat(2) @(posedge vsync); @(posedge vsync); // 每一行数据 for(l=0;l五、总结
本篇介绍了一个 vga/lcd 显示控制器的实例。首先介绍了 vga/lcd 显示的相关知识,然后介绍了程序的主要结构和主要功能模块的实现过程。最后用一个测试程序验证程序的功能是否满足要求。本章为各位大侠设计自己的 vga/lcd 显示控制器提供了一个可以使用的方案。
本篇到此结束,各位大侠,有缘再见!


全方位测评奥迪Q7 35TFSI 运动型
国家鼓励的电动汽车到底安全吗?
联网汽车对于物联网卡都有哪些个性化需求
红米终于攻克技术难题,成功实现LCD屏下指纹
即将上市的RX 6000系列如何呢?
基于FPGA的VGA/LCD显示控制器设计(附代码)
微软六款15英寸Surface Laptop3的配置与与价格曝光
虹科电子即将亮相第四届IME西部微波会
VR将颠覆所有产业,眼下的路该怎么走?
纵行科技ZETag供应链物流可视化方案 助力汽车供应链管理数字化转型
LG 五年亏损 45 亿美元,手机业务下滑,索尼会不会是下一个?
NFC与RFID技术有什么新的发展
三星S10+评测 素质均衡却又不乏亮点
如何知道电池是否有剩余电量
电容爆炸的原因 电解电容内部结构分析
柔性玻璃的制备方法
如何恰当挑选5G网线
IC设备精密零部件厂商富创精密拟A股IPO 已接受中信证券辅导
医疗系统中的USB隔离解决方案
骁龙660和625哪个省电_骁龙625和660功耗对比