vga彩条显示,640*480模式可以显示1600*900
1. VGA显示
1.1 VGA的端口定义
1.2 VGA的显示时序
扫描显示的过程
行同步时序
场同步时序
二维时序图
1.3 像素点与时序
1.4 此处选择DELL_E2016HV型显示器,分辨率1600900;显示模式为640480@60
2. vivado设计与仿真
2.1 总体框图
2.2 clk_gen模块,主要实现100MHz转25MHz
引入locked和rst_n的必要性,IP核产生的时钟有延时,可以利用locked信号作为标识
在vivado中使用pll,使用的时候直接调用IP核
搜索clk,选择红色框
设置PLL,其他选项默认
仿真图
clk_25mhz产生的时候需要注意的点
1.复位信号sys_rst_n高电平有效,这里的低电平有效是对输入时的数据进行了取反操作
2.clk_25mhz并不是立即产生的,复位信号无效后的第2个周期产生了一个高电平,下图可以看出;
延时 1655-115=150ns 后产生正常的50MHz信号
2.3 vga_pic模块,实现坐标位置与数据的转换
2.3.1 vga_pic.v文件
利用坐标位置 pix_x 赋值时使用到了 casez 语句,增强代码可读性和节省资源;
使用 if-else 多层嵌套也是可以的;
亦可使用 case 语句在关键点赋值,例如 pix_x = 63,…;其他时间保持不变即可
module vga_pic
(
input wire vga_clk ,
input wire sys_rst_n ,
input wire [9:0] pix_x ,
input wire [9:0] pix_y ,
output reg [11:0] pix_data
);
parameter H_VALID = 10'd640,
V_VALID = 10'd480;
parameter RED = 12'hF00,
ORANGE = 12'hF80,
YELLOW = 12'hFF0,
GREEN = 12'h0F0,
CYAN = 12'h0FF,
BLUE = 12'h00F,
PURPLE = 12'hF0F,
BLACK = 12'h000,
WHITE = 12'hFFF,
GRAY = 12'hDDD;
always@(posedge vga_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
pix_data <= RED;
else casez(pix_x)
10'b00_00??_???? : pix_data <= RED ;
10'b00_01??_???? : pix_data <= ORANGE;
10'b00_10??_???? : pix_data <= YELLOW;
10'b00_11??_???? : pix_data <= GREEN ;
10'b01_00??_???? : pix_data <= CYAN ;
10'b01_01??_???? : pix_data <= BLUE ;
10'b01_10??_???? : pix_data <= PURPLE;
10'b01_11??_???? : pix_data <= BLACK ;
10'b10_00??_???? : pix_data <= WHITE ;
10'b10_01??_???? : pix_data <= GRAY ;
endcase
endmodule
2.4 vga_ctrl模块,实现数据的转换显示
2.4.1 色彩565与444的转换
从NEXYS4_DDR的原理图可以看出,其使用权电阻网络,且红、绿、蓝的色深为4位
对比565,将多余的低位除去,可得444的编码