使用FPGA开发板驱动VGA显示器
1. 本次使用的是cyclone4开发板,先看下原理图,因为右边的RGB应该是模拟信号量,但是本次例程只接了3根线,那就是说颜色只有8种。
2. 代码,输出信号有R,G,B三色,就是上图右边的,行同步信号(扫描完一行),场同步信号。VGA收发双方没有时钟信号做同步,但是通常会约定发送方有一个基本的时钟,行同步信号HSYNC在每行开始的时候产生一个固定宽度的高脉冲。场同步信号VSYNC在每帧(即一次全屏的图像)开始的时候产生一个固定宽度的高脉冲。我对关键的信号,画了时序图,发现不是很理解程序的机制。
module VGA( clock, switch, disp_RGB, hsync, vsync ); input clock; //系统输入时钟 50MHz input [1:0]switch; output [2:0]disp_RGB; //VGA数据输出 output hsync; //VGA行同步信号 output vsync; //VGA场同步信号 reg [9:0] hcount; //VGA行扫描计数器 reg [9:0] vcount; //VGA场扫描计数器 reg [2:0] data; reg [2:0] h_dat; reg [2:0] v_dat; //reg [9:0] timer; reg flag; wire hcount_ov; wire vcount_ov; wire dat_act; wire hsync; wire vsync; reg vga_clk; //VGA行、场扫描时序参数表 parameter hsync_end = 10'd95, hdat_begin = 10'd143, hdat_end = 10'd783, hpixel_end = 10'd799, vsync_end = 10'd1, vdat_begin = 10'd34, vdat_end = 10'd514, vline_end = 10'd524; always @(posedge clock) begin vga_clk = ~vga_clk; end //************************VGA驱动部分******************************* //行扫描 always @(posedge vga_clk) begin if (hcount_ov) hcount <= 10'd0; else hcount <= hcount + 10'd1; end assign hcount_ov = (hcount == hpixel_end); //场扫描 always @(posedge vga_clk) begin if (hcount_ov) begin if (vcount_ov) vcount <= 10'd0; else vcount <= vcount + 10'd1; end end assign vcount_ov = (vcount == vline_end); //数据、同步信号输 assign dat_act = ((hcount >= hdat_begin) && (hcount < hdat_end)) && ((vcount >= vdat_begin) && (vcount < vdat_end)); assign hsync = (hcount > hsync_end); assign vsync = (vcount > vsync_end); assign disp_RGB = (dat_act) ? data : 3'h00; //************************显示数据处理部分******************************* //图片显示延时计数器 /*always @(posedge vga_clk) begin flag <= vcount_ov; if(vcount_ov && ~flag) timer <= timer + 1'b1; end */ always @(posedge vga_clk) begin case(switch[1:0]) 2'd0: data <= h_dat; //选择横彩条 2'd1: data <= v_dat; //选择竖彩条 2'd2: data <= (v_dat ^ h_dat); //产生棋盘格 2'd3: data <= (v_dat ~^ h_dat); //产生棋盘格 endcase end always @(posedge vga_clk) //产生竖彩条 begin if(hcount < 223) v_dat <= 3'h7; //白 else if(hcount < 303) v_dat <= 3'h6; //黄 else if(hcount < 383) v_dat <= 3'h5; //青 else if(hcount < 463) v_dat <= 3'h4; //绿 else if(hcount < 543) v_dat <= 3'h3; //紫 else if(hcount < 623) v_dat <= 3'h2; //红 else if(hcount < 703) v_dat <= 3'h1; //蓝 else v_dat <= 3'h0; //黑 end always @(posedge vga_clk) //产生横彩条 begin if(vcount < 94) h_dat <= 3'h7; //白 else if(vcount < 154) h_dat <= 3'h6; //黄 else if(vcount < 214) h_dat <= 3'h5; //青 else if(vcount < 274) h_dat <= 3'h4; //绿 else if(vcount < 334) h_dat <= 3'h3; //紫 else if(vcount < 394) h_dat <= 3'h2; //红 else if(vcount < 454) h_dat <= 3'h1; //蓝 else h_dat <= 3'h0; //黑 end endmodule
3. 用quartus软件综合一下工程,烧写,插上显示器的VGA接口,可以看到显示器显示的8种颜色。
分类:
FPGA
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App