您的位置:首页 > 其它

【FPGA】【VGA学习】【最简版】纯色显示

2018-03-13 14:35 411 查看
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name:    vga_test
//
//////////////////////////////////////////////////////////////////////////////////
module green_VGA(
input clk,
output vga_hs,
output vga_vs,
output [4:0] vga_r,
output [5:0] vga_g,
output [4:0] vga_b
);
//-----------------------------------------------------------//
// 水平扫描参数的设定1024*768 60Hz VGA
//-----------------------------------------------------------//
parameter LinePeriod =1344;            //行周期数
parameter H_SyncPulse=136;             //行同步脉冲(Sync a)
parameter H_BackPorch=160;             //显示后沿(Back porch b)
parameter H_ActivePix=1024;            //显示时序段(Display interval c)
parameter H_FrontPorch=24;             //显示前沿(Front porch d)
parameter Hde_start=296;
parameter Hde_end=1320;

//-----------------------------------------------------------//
// 垂直扫描参数的设定1024*768 60Hz VGA
//-----------------------------------------------------------//
parameter FramePeriod =806;           //列周期数
parameter V_SyncPulse=6;              //列同步脉冲(Sync o)
parameter V_BackPorch=29;             //显示后沿(Back porch p)
parameter V_ActivePix=768;            //显示时序段(Display interval q)
parameter V_FrontPorch=3;             //显示前沿(Front porch r)
parameter Vde_start=35;
parameter Vde_end=803;

reg[10 : 0] x_cnt;
reg[9 : 0]  y_cnt;
reg[4 : 0]  vga_r_reg;
reg[5 : 0]  vga_g_reg;
reg[4 : 0]  vga_b_reg;
reg hsync_r;
reg vsync_r;
reg hsync_de;
reg vsync_de;

wire vga_clk;
//----------------------------------------------------------------
////////// 水平扫描计数
//----------------------------------------------------------------
always @ (posedge vga_clk)
if(x_cnt == LinePeriod) x_cnt <= 1;
else x_cnt <= x_cnt+ 1;

//----------------------------------------------------------------
////////// 水平扫描信号hsync,hsync_de产生
//----------------------------------------------------------------
always @ (posedge vga_clk)
begin
if(x_cnt == 1) hsync_r <= 1'b0;             //产生hsync信号
else if(x_cnt == H_SyncPulse) hsync_r <= 1'b1;
//这里行扫描中的hsync信号的用处(猜测):帮助数据信号实现频率的同步
//在"Back porch","active video time","Front porch"时,hsync为1,其他时间为0
//注意:通过x_cnt完成了对hsync_r的调节

if(x_cnt == Hde_start) hsync_de <= 1'b1;    //产生hsync_de信号
else if(x_cnt == Hde_end) hsync_de <= 1'b0;
//这里的hsync_de标明了行扫描中显示在屏幕上的数据的传送时间
//当hsync_de为1时,表明正在传送有效数据,当hsync_de为0时,则表明目前没有传送有效数据
end

//----------------------------------------------------------------
////////// 垂直扫描计数
//----------------------------------------------------------------
always @ (posedge vga_clk)
if(y_cnt == FramePeriod) y_cnt <= 1;
else if(x_cnt == LinePeriod) y_cnt <= y_cnt+1;
//若某一行【除了最后一行】的行扫描(水平扫描)完成后,则y_cnt加一
//若最后一行的行扫描完成后,则y_cnt置一

//----------------------------------------------------------------
////////// 垂直扫描信号vsync, vsync_de产生
//----------------------------------------------------------------
always @ (posedge vga_clk)
begin
if(y_cnt == 1) vsync_r <= 1'b0;    //产生vsync信号
else if(y_cnt == V_SyncPulse) vsync_r <= 1'b1;
//这里的vsync信号与上面的hsync信号雷同
////这里行扫描中的vsync信号的用处(猜测):帮助数据信号实现频率的同步
////在"Back porch","active video time","Front porch"时,vsync为1,其他时间为0
////注意:通过y_cnt完成了对vsync_r的调节

if(y_cnt == Vde_start) vsync_de <= 1'b1;    //产生vsync_de信号
else if(y_cnt == Vde_end) vsync_de <= 1'b0;
end
//这里的vsync_de信号与上面的hsync_de信号雷同
//注意:vsync_de是标明了允许视频data进行传输的时间(在列扫描的"back porch"及"front porch"中是可能有”hsync_de=高电平“的情况出现的)
//----------------------------------------------------------------
////////// 经VGA至显示器上,所显示的数据(想要显示出的图像)
//----------------------------------------------------------------
always @(negedge vga_clk)
begin
vga_r_reg<=0;                       //VGA显示全绿
vga_g_reg<=6'b000001;
vga_b_reg<=1;
end

assign vga_hs = hsync_r;
assign vga_vs = vsync_r;
assign vga_r = (hsync_de & vsync_de)?vga_r_reg:5'b00000;
assign vga_g = (hsync_de & vsync_de)?vga_g_reg:6'b000000;
assign vga_b = (hsync_de & vsync_de)?vga_b_reg:5'b00000;

//----------------------------------------------------------------
////////// 产生65Mhz VGA Clock
//----------------------------------------------------------------

pll pll_inst
(
.inclk0(clk),
.c0(vga_clk),               // 65.0Mhz for 1024x768(60hz)
.areset(1'b0),
.locked()
);

endmodule
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VGA 最简版本