2.程序代如下(彩条显示):
module vga(
clk,rst_n,
vga_r,vga_g,vga_b,clk_vga,
hsync,vsync,VGA_BLANK_N,VGA_SYNC_N,
);
input clk; //时钟信号
input rst_n; //复位信号
output [7:0] vga_r ;
output [7:0] vga_g ;
output [7:0] vga_b ;
output clk_vga; //VGA工作时钟
output hsync;
output vsync;
output VGA_BLANK_N;
output VGA_SYNC_N;
reg [7:0]vga_r,vga_g,vga_b;
//------------------------------------ 640*480,刷新频率60Hz,时钟频率25Mhz
parameterH_FRONT=16;
parameterH_SYNC=96;
parameterH_BACK=48;
parameterH_ACT=640;
parameterH_BLANK=H_FRONT+H_SYNC+H_BACK;
parameterH_TOTAL=H_FRONT+H_SYNC+H_BACK+H_ACT;
//Vertical Parameter 11+2+32+480=525
parameterV_FRONT=10;
parameterV_SYNC=2;
parameterV_BACK=33;
parameterV_ACT=480;
parameterV_BLANK=V_FRONT+V_SYNC+V_BACK;
parameterV_TOTAL=V_FRONT+V_SYNC+V_BACK+V_ACT;
assignVGA_SYNC_N=1'b0; //Ifnot SOG, Sync input should be tied to 0;
assignVGA_BLANK_N=~((x_cnt<H_BLANK)||(y_cnt<V_BLANK));
//------------------------------------
// 分频
reg clk_vga;
always @(posedge clk or negedge rst_n)
if (!rst_n)
clk_vga<=1'b0;
else clk_vga<=~clk_vga;
//------------------------------------
//行列坐标的计算
reg [9:0] x_cnt;
reg [9:0] y_cnt;
always @(posedgeclk_vga or negedge rst_n)
if (!rst_n) begin
x_cnt<=10'd0; //行计数开始
end
else if (x_cnt==800) x_cnt<=0;
else x_cnt<=x_cnt+1;
always @(posedge clk_vga or negedge rst_n)
if (!rst_n) begin
y_cnt<=10'd0; //行计数开始
end
else if (y_cnt==525) y_cnt<=0;
else if (x_cnt==800) y_cnt<=y_cnt+1;
//----------------------------------
//同步信号的产生
reg hsync_r,vsync_r;
always @(posedge clk_vgaor negedge rst_n)
if (!rst_n) hsync_r<=1'b1; //同步信号拉高
else if(x_cnt==0)
hsync_r<=1'b0; //行计数开始,行同步信号拉低
else if(x_cnt==96)
hsync_r<=1'b1; //行计数开始,行同步信号拉高
always @(posedge clk_vga or negedge rst_n)
if (!rst_n) vsync_r<=1'b1; //同步信号拉高
else if(y_cnt==0)
vsync_r<=1'b0; //行计数开始,行同步信号拉低
else if(y_cnt==2)
vsync_r<=1'b1; //行计数开始,行同步信号拉高
assign hsync=hsync_r;
assign vsync=vsync_r;
always @(posedge clk_vga or negedge rst_n)
if (!rst_n)
begin
vga_r=8'b00000000;
vga_g=8'b00000000;
vga_b=8'b00000000;
end
else if(144<=x_cnt&&x_cnt<=223)
begin
vga_r=8'b11111111;
vga_g=8'b00000000;
vga_b=8'b00000000;
end
else if(224<=x_cnt&&x_cnt<=303)
begin
vga_r=8'b11111111;
vga_g=8'b11111111;
vga_b=8'b00000000;
end
else if(304<=x_cnt&&x_cnt<=383)
begin
vga_r=8'b00000000;
vga_g=8'b11111111;
vga_b=8'b00000000;
end
else if(384<=x_cnt&&x_cnt<=463)
begin
vga_r=8'b00000000;
vga_g=8'b11111111;
vga_b=8'b11111111;
end
else if(464<=x_cnt&&x_cnt<=543)
begin
vga_r=8'b11111111;
vga_g=8'b00000000;
vga_b=8'b11111111;
end
else if(544<=x_cnt&&x_cnt<=623)
begin
vga_r=8'b00000000;
vga_g=8'b00000000;
vga_b=8'b11111111;
end
else if(624<=x_cnt&&x_cnt<=703)
begin
vga_r=8'b00000000;
vga_g=8'b00000000;
vga_b=8'b00000000;
end
else if(704<=x_cnt&&x_cnt<=783)
begin
vga_r=8'b11111111;
vga_g=8'b11111111;
vga_b=8'b11111111;
end
else
begin
vga_r=8'b11111111;
vga_g=8'b11111111;
vga_b=8'b11111111;
end
endmodule
module VGA_test(
OSC_50, //原CLK2_50时钟信号
VGA_CLK, //VGA自时钟
VGA_HS, //行同步信号
VGA_VS, //场同步信号
VGA_BLANK, //复合空白信号控制信号 当BLANK为低电平时模拟视频输出消隐电平,此时从R9~R0,G9~G0,B9~B0输入的所有数据被忽略
VGA_SYNC, //符合同步控制信号 行时序和场时序都要产生同步脉冲
VGA_R, //VGA绿色
VGA_B, //VGA蓝色
VGA_G); //VGA绿色
input OSC_50; //外部时钟信号CLK2_50
output VGA_CLK,VGA_HS,VGA_VS,VGA_BLANK,VGA_SYNC;
output [7:0] VGA_R,VGA_B,VGA_G;
parameter H_FRONT = 16; //行同步前沿信号周期长
parameter H_SYNC = 96; //行同步信号周期长
parameter H_BACK = 48; //行同步后沿信号周期长
parameter H_ACT = 640; //行显示周期长
parameter H_BLANK = H_FRONT+H_SYNC+H_BACK; //行空白信号总周期长
parameter H_TOTAL = H_FRONT+H_SYNC+H_BACK+H_ACT; //行总周期长耗时
parameter V_FRONT = 11; //场同步前沿信号周期长
parameter V_SYNC = 2; //场同步信号周期长
parameter V_BACK = 31; //场同步后沿信号周期长
parameter V_ACT = 480; //场显示周期长
parameter V_BLANK = V_FRONT+V_SYNC+V_BACK; //场空白信号总周期长
parameter V_TOTAL = V_FRONT+V_SYNC+V_BACK+V_ACT; //场总周期长耗时
reg [10:0] H_Cont; //行周期计数器
reg [10:0] V_Cont; //场周期计数器
wire [7:0] VGA_R; //VGA红色控制线
wire [7:0] VGA_G; //VGA绿色控制线
wire [7:0] VGA_B; //VGA蓝色控制线
reg VGA_HS;
reg VGA_VS;
reg [10:0] X; //当前行第几个像素点
reg [10:0] Y; //当前场第几行
reg CLK_25;
always@(posedge OSC_50)
begin
CLK_25=~CLK_25; //时钟
end
assign VGA_SYNC = 1'b0; //同步信号低电平
assign VGA_BLANK = ~((H_Cont<H_BLANK)||(V_Cont<V_BLANK)); //当行计数器小于行空白总长或场计数器小于场空白总长时,空白信号低电平
assign VGA_CLK = ~CLK_to_DAC; //VGA时钟等于CLK_25取反
assign CLK_to_DAC = CLK_25;
always@(posedge CLK_to_DAC)
begin
if(H_Cont<H_TOTAL) //如果行计数器小于行总时长
H_Cont<=H_Cont+1'b1; //行计数器+1
else H_Cont<=0;
评论0