导读
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 显示控制器提供了一个可以使用的方案。
美国频发的枪击案该如何结束?iGun提出了解决办法
2018年全球车载显示面板出货量将达1.7亿片,各家纷纷开拓新的车载显示应用
充电宝最好的牌子是什么?双十一充电宝必选清单分享
LoRaWAN网络将进入英国市场,应对当地挑战
最新测试技术在芯片良率提高中发挥新作用
基于FPGA的VGA/LCD显示控制器设计
中国电信携手中国银行打造点到内高可靠5G端到端安全网络
传声器的主要参数
专家预测比特币未来市场发展趋势 加密货币或将凛冬将至
纳米材料和纳米微制造技术推动无线柔性可穿戴电子设备的发展
浙江电信 5G赋能未来 创新改变浙江
直流电阻测试仪的功能都有哪些
防盗结构的智能锁占领着高端市场 获取到行业的最大利益
印制电路板温升因素分析及解决方法
一图看懂!RK3568与RK3399怎么选?
工业连接器UL认证怎么办理?
华为鸿蒙系统公测升级更新,有哪些机型可申请
柔宇怒怼质疑:谣言纯属无稽之谈
同时踩下刹车和油门:英特尔的“精神内耗”
30000台Mac被恶意软件侵入 如何检查自己的Mac?