
时序图:

时序表:

代码:
//采用行扫描方法;600*480
module vga1(
clk,rst_n,
rgb,hsync,vsync
);
input clk,rst_n;
output[2:0] rgb;
output hsync; //行控制信号
output vsync; //列控制信号
//========640*480===========//
parameter hsync_end=10'd95, //同步脉冲
hdata_begin=10'd143, //有效时间开始时间
hdata_end=10'd783, //有效数据传输完时间
hpixel_end=10'd799, //总帧长
vsync_end=10'd1, //同步脉冲
vdata_begin=10'd34, //有效数据传输开始
vdata_end=10'd514, //有效时间结束时间
vpixel_end=10'd524; //总帧长
wire vflag,hflag;
reg[9:0] x_cnt; //行时间脉冲
reg[9:0] y_cnt; //列时间脉冲
reg clk_vga; //vga时间脉冲信号
//将信号2分频
[email=always@%28posedge]always@(posedge[/email] clk or negedge rst_n)
if(!rst_n)
clk_vga<=1'b0;
else
clk_vga<=~clk_vga;
//==========================//
assign hflag=(x_cnt==hpixel_end); //一行完成的使能位
[email=always@%28posedge]always@(posedge[/email] clk_vga or negedge rst_n)
if(!rst_n)
x_cnt<=10'd0;
else if(hflag)
x_cnt<=10'd0; //一行完成后,x_cnt清零
else
x_cnt<=x_cnt+1'b1;
//===============================//
assign vflag=(y_cnt==vpixel_end); //列结束信号
[email=always@%28posedge]always@(posedge[/email] clk_vga or negedge rst_n)
if(!rst_n)
y_cnt<=10'd0;
else
if(hflag) //换行使能位,每行800帧就列就变一帧
begin
if(vflag)
y_cnt<=10'd0;
else
y_cnt<=y_cnt+1'b1;
end
//=========================================//
wire data_act;
//================同步信号的产生===================//
assign hsync=(x_cnt>hsync_end);
assign vsync=(y_cnt>vsync_end);
//=================有效区域的选择============================//
assign data_act=(x_cnt>=hdata_begin)&&(x_cnt<=hdata_end)
&&(y_cnt>=vdata_begin)&&(y_cnt<=vdata_end);
//================显示颜色===================//
assign rgb=data_act ?3'b111:3'd0; |