|
驱动VGA主要做好以下几个部分就可以了!
1. 选好显示模式从而确定刷新率.比如说:显示模式是640*480 60hz的刷新率
则行计数器的驱动时钟频率为25MHZ 则显示器的刷新率为 25MHz/800/525=59.2HZ 满足要求。
2. 选好行同步计数器和场同步计数器的驱动时钟频率
3. 就是写好行同步信号和场同步信号(时序)
4. 筛选有效显示区域
就640*480模式来说 行同步脉冲是96 、场同步脉冲为2 !行同步脉冲和场同步脉冲就是进行 行消隐和场消隐 目的分别是使行扫描回到下一行的初始位置、使扫描回到屏幕的左上方。
下面是程序代码:
module vga(clock,switch,vga_RGB,hsync,vsync);
input clock;
input[1:0] switch;
output[2:0] vga_RGB; //VGA数据三种颜色的输出
output hsync,vsync; //行同步信号和场同步信号
reg[2:0] data;
reg[2:0] h_dat;
reg[2:0] v_dat;
reg[9:0] hcount;
reg[9:0] vcount;
reg clk25;
//************************************************//
always@(posedge clock)
begin
clk25=~clk25;
end
//****************************************************//
always@(posedge clk25) //行同步信号计数器
begin
if(hcount==10'd799)
hcount<=10'd0;
else
hcount<=hcount+1'd1;
end
always@(posedge clk25) //场同步信号计数器
begin
if(hcount==10'd799)
if(vcount==10'd524)
vcount<=10'd0;
else
vcount<=vcount+1'd1;
end
//**************************************************//
wire dat_act; //有效显示区域
assign dat_act=(hcount>=143)&&(hcount<783)&&(vcount>=34)&&(vcount<514);
//****************************************************//
reg hsync_r,vsync_r;
always@(posedge clk25) //行同步信号的产生
begin
if(hcount==10'd0)
hsync_r=1'b0;
else if(hcount==10'd96)
hsync_r=1'b1;
end
//*******************************************//
always@(posedge clk25) //场同步信号的产生
begin
if(vcount==10'd0)
vsync_r=1'b0;
else if(vcount==10'd2)
vsync_r=1'b1;
end
assign hsync=hsync_r;
assign vsync=vsync_r;
//**********************************************//
//wire[9:0] xpos,ypos;
//assign xpos=hcount-10'd143;
//assign ypos=vcount-10'd34;
//wire e_read;
//ssign e_read=(xpos>120)&&(xpos<420)&&(ypos>120)&&(ypos<514);
//assign vga_g=(dat_act) ? 1 : 1'b0;
//assign vga_r=(dat_act) ? e_read : 1'b0;
assign vga_RGB=(dat_act) ? data : 3'h0;
always @(posedge clk25)
begin
case(switch[1:0])
2'd0: data <= h_dat; //选择横彩条
2'd1: data <= v_dat; //选择竖彩条
2'd2: data <= (v_dat ^ h_dat); //产生棋盘格
2'd3: data <= (v_dat ~^ h_dat); //产生棋盘格
endcase
end
always @(posedge clk25) //产生竖彩条
begin
if(hcount < 223)
v_dat <= 3'h7; //白
else if(hcount < 303)
v_dat <= 3'h6; //黄
else if(hcount < 383)
v_dat <= 3'h5; //青
else if(hcount < 463)
v_dat <= 3'h4; //绿
else if(hcount < 543)
v_dat <= 3'h3; //紫
else if(hcount < 623)
v_dat <= 3'h2; //红
else if(hcount < 703)
v_dat <= 3'h1; //蓝
else
v_dat <= 3'h0; //黑
end
always @(posedge clk25) //产生横彩条
begin
if(vcount < 94)
h_dat <= 3'h7; //白
else if(vcount < 154)
h_dat <= 3'h6; //黄
else if(vcount < 214)
h_dat <= 3'h5; //青
else if(vcount < 274)
h_dat <= 3'h4; //绿
else if(vcount < 334)
h_dat <= 3'h3; //紫
else if(vcount < 394)
h_dat <= 3'h2; //红
else if(vcount < 454)
h_dat <= 3'h1; //蓝
else
h_dat <= 3'h0; //黑
end
endmodule |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|