VGA原理
视频图形阵列(Video Graphics Array,VGA),是IBM在1987年推出的视频传输标准。
VGA从屏幕左上角第一个像素点开始,自左向右进行扫描,每一行扫描完成后,回到下一行最左位置的像素点,继续上述过程,最后一行像素点扫描完成后,回到屏幕左上角,继续下一轮扫描。
VGA接口重点需要明确每一行的扫描时间,称为行时序,以及每一次屏幕扫描的时间,称为场时序。
行时序由四个部分组成,行同步(Hor Sync)、行消隐(Hor Back Porch)、行视频有效(Hor Active Video)、行前肩(Hor Front Porch)。先后顺序为,
Hor Sync -> Hor Back Porch -> Hor Active Video -> Hor Front Porch
其中,行同步信号需要是负脉冲,且行时序中的每个部分持续的时间单位为像素,即时钟周期。
场时序由四个部分组成,场同步(Ver Sync)、场消隐(Ver Back Porch)、场视频有效(Ver Active Video)、场前肩(Ver Front Porch)。先后顺序为,
Ver Sync -> Ver Back Porch -> Ver Active Video -> Ver Front Porch
其中,场同步信号需要时负脉冲,且场时序中每个部分持续的时间单位为行。
VGA在不同的分辨率和刷新频率下,对于行时序和场时序各个部分的时间要求也不相同,VGA时序参数给出常用显示模式与对应的行时序和场时序的参数。
VGA实现
本文实现的在分辨率为640*480,刷新频率为60Hz的VGA驱动。
- 时钟:25.175 MHz
- 行时序参数(单位:像素)
- 行同步(Hor Sync):96
- 行消隐(Hor Back Porch):48
- 行视频有效(Hor Active Video):640
- 行前肩(Hor Front Porch):16
- 场时序参数(单位:行)
- 场同步(Ver Sync):2
- 场消隐(Ver Back Porch):33
- 场视频有效(Ver Active Video):480
- 场前肩(Ver Front Porch) :10
VGA同步信号
module vga_dirver(
input wire clk_i,
input wire rst_i,
output reg hor_sync_o,
output reg ver_sync_o,
output wire display_en_o
);
localparam HOR_SYNC_CNT = 96;
localparam HOR_BACK_PORCH_CNT = 48;
localparam HOR_ACTIVE_VIDEO_CNT = 640;
localparam HOR_FRONT_PORCH_CNT = 16;
localparam HOR_PERIOD = 800;
localparam VER_SYNC_CNT = 2;
localparam VER_BACK_PORCH_CNT = 33;
localparam VER_ACTIVE_VIDEO_CNT = 480;
localparam VER_FRONT_PORCH_CNT = 10;
localparam VER_PERIOD = 525;
reg [31:0] hor_count;
reg [31:0] ver_count;
reg hor_sync;
reg ver_sync;
// hor_sync
always @ (*) begin
if(rst_i == 1'b1) begin
hor_sync = 1'b1;
end else begin
hor_sync = (hor_count < HOR_SYNC_CNT) ? 1'b0 : 1'b1;
end
end
// 访问显存,hor_sync_o 打一拍输出
always @ (posedge clk_i) begin
if(rst_i == 1'b1) begin
hor_sync_o <= 1'b1