📄 vga_ctr.v
字号:
module vga(
input clk,
input rst_n,
input [2:0] RGB,
output Rgb_valid,
output hsync,//行同步信号
output vsync,//场同步信号
output vga_r,
output vga_g,
output vga_b
);
//--------------------------------------------------
reg[9:0] x_cnt; //行坐标(这里包括了行同步、后沿、有效数据区、前沿)
reg[9:0] y_cnt; //列坐标(这里包括了场同步、后沿、有效数据区、前沿)
always @ (posedge clk or negedge rst_n)
if(!rst_n) x_cnt <= 10'd0;
else if(x_cnt == 10'd1000) x_cnt <= 10'd0; //行计数只记到1000
else x_cnt <= x_cnt+1'b1;
always @ (posedge clk or negedge rst_n)
if(!rst_n) y_cnt <= 10'd0;
else if(y_cnt == 10'd665) y_cnt <= 10'd0; //场同步只记到665
else if(x_cnt == 10'd1000) y_cnt <= y_cnt+1'b1;//每计数完一行,场同步就加一
//--------------------------------------------------
wire valid; //有效数据显示区标志,就是你在液晶屏幕上可以看到的区域
/*要说明的一点是,当坐标不处于有效显示区时,R、G、B三原色信号接的电平都必须拉底(0)*/
assign valid = (x_cnt > 10'd180) && (x_cnt < 10'd980)
&& (y_cnt > 10'd35) && (y_cnt < 10'd635);
wire[9:0] xpos,ypos; //有效显示区坐标
assign xpos = x_cnt-10'd180;
assign ypos = y_cnt-10'd35;
//--------------------------------------------------
reg hsync_r,vsync_r;
always @ (posedge clk or negedge rst_n)
if (!rst_n) begin
hsync_r <= 1'b0;
vsync_r <= 1'b0;
end
else begin
hsync_r <= x_cnt <= 10'd50; //产生hsync信号(行同步)
vsync_r <= y_cnt <= 10'd6; //产生vsync信号(场同步)
end
assign hsync = hsync_r;
assign vsync = vsync_r;
assign {vga_r, vga_g, vga_b} = valid ? RGB : 3'b000;
assign Rgb_valid = valid;
/*
assign vga_r = valid ? 1 : 1'b0;
assign vga_g = valid ? 1 : 1'b0;
assign vga_b = valid ? 0 : 1'b0;
*/
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -