基于FPGA的VGA显示彩条、字符、图片

您所在的位置:网站首页 qq字符joker图片 基于FPGA的VGA显示彩条、字符、图片

基于FPGA的VGA显示彩条、字符、图片

2024-06-20 02:23| 来源: 网络整理| 查看: 265

文章目录 一、VGA二、时序图三、实现0.时钟分频1.彩条显示2.字符显示3.图片显示 四、代码1.vga驱动模块2.显示数据生成模块3.按键消抖模块4.顶层模块5.TCL绑定引脚代码 五、效果RTL视图彩条字符图片视频 六、参考

一、VGA

什么是VGA?VGA不是用来显示的那块屏幕,而是用来传输信号的接口。VGA全称是Video Graphics Array,即视频图形阵列,是模拟信号的一种视频传输标准。

二、时序图

在这里插入图片描述

三、实现

不同分辨率对应参数 在这里插入图片描述

0.时钟分频

分别使用640×480 60HZ和800×600 72HZ,对应时钟分别为25M和50M,需要使用PLL进行分频 时钟频率 = 行帧长 × 列帧长 * 刷新率,640 ×480 60HZ对应时钟频率= 800 ×525 × 60 = 25.2M ip核里面找到ALTPLL 在这里插入图片描述 基础时钟选择50M 在这里插入图片描述 取消勾选输出使能 在这里插入图片描述 c0默认输出50M即可,c1分频到25M,如需其他时钟频率可以自己进行设置 在这里插入图片描述 勾选如下选项后finish在这里插入图片描述

1.彩条显示

根据当前行地址判断需要显示的颜色即可。

2.字符显示

在子模提取工具里面输入需要显示的字符并设置字符大小为64*64 在这里插入图片描述 然后点击文件-另存为,把图片保存为BMP图片 在这里插入图片描述 再点击文件-打开,把保存的BMP图片打开得到整体的字符 在这里插入图片描述 再点击选项按如下参数设置 在这里插入图片描述

最后点击生成字符并保存字符为文本文件 在这里插入图片描述 最后得到字符如下 在这里插入图片描述 把得到的字符在verilog里面使用即可 在这里插入图片描述

3.图片显示

由于一张640×480的24位的图片的大小超过了芯片的内存,无法把图片保存进去,故采用一张128*78的图片进行显示。 原图: 在这里插入图片描述

使用工具把图片转为HEX文件 在这里插入图片描述 转换完成得到data1.hex,内容如图 在这里插入图片描述 图片数据太多需要使用ROM来存储数据 打开quartus,找到ROM 在这里插入图片描述 设置位宽度为16位,大小为图片大小128×78 = 9984 在这里插入图片描述 取消勾选下列选项 在这里插入图片描述 找到刚才生成的data1.hex文件 在这里插入图片描述 勾选以下选项后直接finsh即可 在这里插入图片描述 数据的读取和使用可以参考后面的代码部分

四、代码

基于EP4CEF17C8型号芯片

1.vga驱动模块 module vga_dirve (input wire clk, //系统时钟 input wire rst_n, //复位 input wire [ 15:0 ] rgb_data, //16位RGB对应值 output wire vga_clk, //vga时钟 25M output reg h_sync, //行同步信号 output reg v_sync, //场同步信号 output reg [ 11:0 ] addr_h, //行地址 output reg [ 11:0 ] addr_v, //列地址 output wire [ 4:0 ] rgb_r, //红基色 output wire [ 5:0 ] rgb_g, //绿基色 output wire [ 4:0 ] rgb_b //蓝基色 ); // 640 * 480 60HZ localparam H_FRONT = 16; // 行同步前沿信号周期长 localparam H_SYNC = 96; // 行同步信号周期长 localparam H_BLACK = 48; // 行同步后沿信号周期长 localparam H_ACT = 640; // 行显示周期长 localparam V_FRONT = 11; // 场同步前沿信号周期长 localparam V_SYNC = 2; // 场同步信号周期长 localparam V_BLACK = 31; // 场同步后沿信号周期长 localparam V_ACT = 480; // 场显示周期长 // 800 * 600 72HZ // localparam H_FRONT = 40; // 行同步前沿信号周期长 // localparam H_SYNC = 120; // 行同步信号周期长 // localparam H_BLACK = 88; // 行同步后沿信号周期长 // localparam H_ACT = 800; // 行显示周期长 // localparam V_FRONT = 37; // 场同步前沿信号周期长 // localparam V_SYNC = 6; // 场同步信号周期长 // localparam V_BLACK = 23; // 场同步后沿信号周期长 // localparam V_ACT = 600; // 场显示周期长 localparam H_TOTAL = H_FRONT + H_SYNC + H_BLACK + H_ACT; // 行周期 localparam V_TOTAL = V_FRONT + V_SYNC + V_BLACK + V_ACT; // 列周期 reg [ 11:0 ] cnt_h ; // 行计数器 reg [ 11:0 ] cnt_v ; // 场计数器 reg [ 15:0 ] rgb ; // 对应显示颜色值 // 对应计数器开始、结束、计数信号 wire flag_enable_cnt_h ; wire flag_clear_cnt_h ; wire flag_enable_cnt_v ; wire flag_clear_cnt_v ; wire flag_add_cnt_v ; wire valid_area ; // 25M时钟 行周期*场周期*刷新率 = 800 * 525* 60 wire clk_25 ; // 50M时钟 1040 * 666 * 72 wire clk_50 ; //PLL pll pll_inst ( .areset ( ~rst_n ), .inclk0 ( clk ), .c0 ( clk_50 ), //50M .c1 ( clk_25 ), //25M ); //根据不同分配率选择不同频率时钟 assign vga_clk = clk_25; // 行计数 always @( posedge vga_clk or negedge rst_n ) begin if ( !rst_n ) begin cnt_h


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3