vga
2012-05-22 23:38
85 查看
module VGA(
RESET,
GCLKP1,
GCLKP2,
R,
G,
B,
VS,
HS
);
input RESET;
input GCLKP1,GCLKP2;
output [3:0]R,G,B;
wire [3:0]R,G,B;
output VS,HS;
wire VS,HS;
//-- SuperVGA timing from NEC monitor manual
//-- Horizontal :
//-- ______________ _____________
//-- | | |
//-- _______________| VIDEO |_______________| VIDEO (next line)
//--
//-- ___________ _____________________ ______________________
//-- |_| |_|
//-- B C <------D-----><-E->
//-- <----------A---------->
//--
//--
//-- Vertical :
//-- ______________ _____________
//-- | | |
//-- _______________| VIDEO |_______________| VIDEO (next frame)
//--
//-- ___________ _____________________ ______________________
//-- |_| |_|
//-- P Q <------R-----><-S->
//-- <----------O---------->
//--
//-- For VESA 800*600 @ 60Hz:
//-- Fh (kHz) :37.88
//-- A (us) :26.4
//-- B (us) :3.2
//-- C (us) :2.2
//-- D (us) :20.0
//-- E (us) :1.0
//--
//-- Fv (Hz) :60.32
//-- O (ms) :16.579
//-- P (ms) :0.106
//-- Q (ms) :0.607
//-- R (ms) :15.84
//-- S (ms) :0.026
//--
//--
//-- Horizonal timing information:
//--
//-- Mode name Pixel sync back active front whole line
//-- clock pulse porch time porch period
//-- (MHz) (us) (pix) (pix) (pix) (pix) (pix)
//--
//-- VGA 800x600 60Hz 40 3.2 128 85 806 37 1056
//--
//-- Vertical timing information:
//-- Mode name Lines line sync back active front whole frame
//-- Total width pulse porch time porch period
//-- (us) (us)(lin) (us)(lin) (us) (lin) (us)(lin) (us) (lin)
//--
//-- VGA 800x600 60Hz 628 26.40 106 4 554 21 15945 604 -1* 16579 628
//------------------------------------------------
//------------------------------------------------
//parameter H_PIXELS = 10'd640; //-- 806
//parameter H_FRONTPORCH = 5'd16; //-- 37
//parameter H_SYNCTIME = 7'd96; //-- 128
//parameter H_BACKPORCH = 6'd48; //-- 85
//parameter H_SYNCSTART = H_PIXELS + H_FRONTPORCH;
//parameter H_SYNCEND = H_SYNCSTART + H_SYNCTIME;
//parameter H_PERIOD = H_SYNCEND + H_BACKPORCH;
//
//parameter V_LINES = 9'd480; //-- 604
//parameter V_FRONTPORCH = 4'd11; //-- -1
//parameter V_SYNCTIME = 2'd2; //-- 4
//parameter V_BACKPORCH = 6'd32; //-- 21
//parameter V_SYNCSTART = V_LINES + V_FRONTPORCH;
//parameter V_SYNCEND = V_SYNCSTART + V_SYNCTIME;
//parameter V_PERIOD = V_SYNCEND + V_BACKPORCH;
parameter H_PIXELS = 640; //-- 806
parameter H_FRONTPORCH = 16; //-- 37
parameter H_SYNCTIME = 96; //-- 128
parameter H_BACKPORCH = 48; //-- 85
parameter H_SYNCSTART = H_PIXELS + H_FRONTPORCH;
parameter H_SYNCEND = H_SYNCSTART + H_SYNCTIME;
parameter H_PERIOD = H_SYNCEND + H_BACKPORCH;
parameter V_LINES = 480; //-- 604
parameter V_FRONTPORCH = 11; //-- -1
parameter V_SYNCTIME = 2; //-- 4
parameter V_BACKPORCH = 32; //-- 21
parameter V_SYNCSTART = V_LINES + V_FRONTPORCH;
parameter V_SYNCEND = V_SYNCSTART + V_SYNCTIME;
parameter V_PERIOD = V_SYNCEND + V_BACKPORCH;
//------------------------------------------------
//------------------------------------------------
reg HsyncB;
reg VsyncB;
reg [9:0]Hcnt;
reg [9:0]Vcnt;
reg Enable;
reg TempR;
reg TempG;
reg TempB;
wire [3:0]ColorR;
wire [3:0]ColorG;
wire [3:0]ColorB;
//--Clock:
//reg [2:0]Count;
wire Period1uS, Period1mS;
reg CLK;
wire CLKTemp ;
//-- Globle Clock Assignment
reg [5:0]Count_clk; //-- 1MHz
reg [9:0]Count1_clk; //-- 1KHz
reg [9:0]Count2_clk; //-- 1Hz
//-- 25 MHz
always@(posedge GCLKP1)
CLK <= ~CLK;
//-----------------------------------------------
//--GCLKP : 50MHz
//--Period: 1uS (Period1uS <= GCLKP1; )
always@(negedge RESET or posedge GCLKP2)
begin
if(!RESET)
Count_clk <= 6'b0;
else if(Count_clk > 6'b110000)
Count_clk <= 6'b0; //-- 1uS
else
Count_clk <= Count_clk + 1'b1;
end
assign Period1uS = Count_clk[5];
//-----------------------------------------------
//--Period: 1mS
always@(negedge RESET or posedge Period1uS)
begin
if(!RESET)
Count1_clk <= 10'b0;
else if(Count1_clk > 10'b1111100110)
Count1_clk <= 10'b0; //-- 1mS
else
Count1_clk <= Count1_clk + 1'b1;
end
assign Period1mS = Count1_clk[9];
//-----------------------------------------------
//--Period: 1S
always@(negedge RESET or posedge Period1mS)
begin
if(!RESET)
Count2_clk <= 10'b0;
else if(Count2_clk > 10'b1111100110)
Count2_clk <= 10'b0; //-- 1S
else
Count2_clk <= Count2_clk + 1'b1;
end
//-- 2 Hz
assign CLKTemp = Count2_clk[8];
//================================================================================================
//-- VGA Clock process
//--------------------------------------------------------------------------------------------------
//-- Horizontal counter
always@(negedge RESET or posedge CLK)
begin
if(!RESET)
Hcnt <= 10'b0;
else if(Hcnt < H_PERIOD)
Hcnt <= Hcnt + 1'b1;
else
Hcnt <= 10'b0;
end
//------------------------------------------------
//-- Vertical counter
always@(negedge RESET or posedge HsyncB)
begin
if(!RESET)
Vcnt <= 10'b0;
else if(Vcnt < V_PERIOD)
Vcnt <= Vcnt + 1'b1;
else
Vcnt <= 10'b0;
end
//------------------------------------------------
//-- Horizontal Sync
//always@(negedge RESET or posedge CLK)
// begin
// if(!RESET)
// HsyncB <= 1'b1;
// else if( Hcnt>=(H_PIXELS + H_FRONTPORCH) && Hcnt<(H_PIXELS + H_FRONTPORCH + H_SYNCTIME) )
// HsyncB <= 1'b0;
// else
// HsyncB <= 1'b1;
// end
always@(negedge RESET or posedge CLK)
begin
if(!RESET)
HsyncB <= 1'b1;
else if( Hcnt>=(H_PIXELS + H_FRONTPORCH) && Hcnt<(H_PIXELS + H_FRONTPORCH + H_SYNCTIME) )
HsyncB <= 1'b0;
else
HsyncB <= 1'b1;
end
//------------------------------------------------
//-- Vertical Sync
always@(negedge RESET or posedge HsyncB)
begin
if(!RESET)
VsyncB <= 1'b1;
else if( (Vcnt >= (V_LINES + V_FRONTPORCH) ) && (Vcnt<(V_LINES + V_FRONTPORCH + V_SYNCTIME) ) )
VsyncB <= 1'b0;
else
VsyncB <= 1'b1;
end
assign HS = HsyncB;
assign VS = VsyncB;
//==============================================
//----------------------------------------------
always@(posedge CLK)
begin
if(!RESET)
Enable <= 1'b0;
else if(Hcnt >= H_PIXELS || Vcnt >= V_LINES)
Enable <= 1'b0;
else
Enable <= 1'b1;
end
//------------------------------------------------
reg [2:0]Count_2;
always@(negedge RESET or posedge CLKTemp)
begin
if(!RESET)
Count_2 <= 3'b0;
else
Count_2 <= Count_2 + 1'b1;
end
//------------------------------------------------
always@(Hcnt[7:5])
begin
case(Hcnt[7:5])
3'b000:
begin
TempR <= 1'b1;
TempG <= 1'b1;
TempB <= 1'b1;
end
3'b001:
begin
TempR <= 1'b0;
TempG <= 1'b0;
TempB <= 1'b0;
end
3'b010:
begin
TempR <= 1'b1;
TempG <= 1'b0;
TempB <= 1'b0;
end
3'b011:
begin
TempR <= 1'b0;
TempG <= 1'b0;
TempB <= 1'b1;
end
3'b100:
begin
TempR <= 1'b0;
TempG <= 1'b1;
TempB <= 1'b0;
end
3'b101:
begin
TempR <= 1'b1;
TempG <= 1'b0;
TempB <= 1'b1;
end
3'b110:
begin
TempR <= 1'b1;
TempG <= 1'b1;
TempB <= 1'b0;
end
3'b111:
begin
TempR <= 1'b1;
TempG <= 1'b1;
TempB <= 1'b1;
end
default:
begin
TempR <= 1'b0;
TempG <= 1'b0;
TempB <= 1'b0;
end
endcase
end
//-------------------------------------------------
assign R = (Enable != 1'b1)? 4'b0:
(TempR == 1'b1)?{Count_2,1'b1}:4'b0;
assign G = (Enable != 1'b1)? 4'b0:
(TempG == 1'b1)?{1'b1,Count_2}:4'b0;
assign B = (Enable != 1'b1)? 4'b0:
(TempB == 1'b1)?{1'b1,Count_2[0],Count_2[1],Count_2[2]}:4'b0;
endmodule
RESET,
GCLKP1,
GCLKP2,
R,
G,
B,
VS,
HS
);
input RESET;
input GCLKP1,GCLKP2;
output [3:0]R,G,B;
wire [3:0]R,G,B;
output VS,HS;
wire VS,HS;
//-- SuperVGA timing from NEC monitor manual
//-- Horizontal :
//-- ______________ _____________
//-- | | |
//-- _______________| VIDEO |_______________| VIDEO (next line)
//--
//-- ___________ _____________________ ______________________
//-- |_| |_|
//-- B C <------D-----><-E->
//-- <----------A---------->
//--
//--
//-- Vertical :
//-- ______________ _____________
//-- | | |
//-- _______________| VIDEO |_______________| VIDEO (next frame)
//--
//-- ___________ _____________________ ______________________
//-- |_| |_|
//-- P Q <------R-----><-S->
//-- <----------O---------->
//--
//-- For VESA 800*600 @ 60Hz:
//-- Fh (kHz) :37.88
//-- A (us) :26.4
//-- B (us) :3.2
//-- C (us) :2.2
//-- D (us) :20.0
//-- E (us) :1.0
//--
//-- Fv (Hz) :60.32
//-- O (ms) :16.579
//-- P (ms) :0.106
//-- Q (ms) :0.607
//-- R (ms) :15.84
//-- S (ms) :0.026
//--
//--
//-- Horizonal timing information:
//--
//-- Mode name Pixel sync back active front whole line
//-- clock pulse porch time porch period
//-- (MHz) (us) (pix) (pix) (pix) (pix) (pix)
//--
//-- VGA 800x600 60Hz 40 3.2 128 85 806 37 1056
//--
//-- Vertical timing information:
//-- Mode name Lines line sync back active front whole frame
//-- Total width pulse porch time porch period
//-- (us) (us)(lin) (us)(lin) (us) (lin) (us)(lin) (us) (lin)
//--
//-- VGA 800x600 60Hz 628 26.40 106 4 554 21 15945 604 -1* 16579 628
//------------------------------------------------
//------------------------------------------------
//parameter H_PIXELS = 10'd640; //-- 806
//parameter H_FRONTPORCH = 5'd16; //-- 37
//parameter H_SYNCTIME = 7'd96; //-- 128
//parameter H_BACKPORCH = 6'd48; //-- 85
//parameter H_SYNCSTART = H_PIXELS + H_FRONTPORCH;
//parameter H_SYNCEND = H_SYNCSTART + H_SYNCTIME;
//parameter H_PERIOD = H_SYNCEND + H_BACKPORCH;
//
//parameter V_LINES = 9'd480; //-- 604
//parameter V_FRONTPORCH = 4'd11; //-- -1
//parameter V_SYNCTIME = 2'd2; //-- 4
//parameter V_BACKPORCH = 6'd32; //-- 21
//parameter V_SYNCSTART = V_LINES + V_FRONTPORCH;
//parameter V_SYNCEND = V_SYNCSTART + V_SYNCTIME;
//parameter V_PERIOD = V_SYNCEND + V_BACKPORCH;
parameter H_PIXELS = 640; //-- 806
parameter H_FRONTPORCH = 16; //-- 37
parameter H_SYNCTIME = 96; //-- 128
parameter H_BACKPORCH = 48; //-- 85
parameter H_SYNCSTART = H_PIXELS + H_FRONTPORCH;
parameter H_SYNCEND = H_SYNCSTART + H_SYNCTIME;
parameter H_PERIOD = H_SYNCEND + H_BACKPORCH;
parameter V_LINES = 480; //-- 604
parameter V_FRONTPORCH = 11; //-- -1
parameter V_SYNCTIME = 2; //-- 4
parameter V_BACKPORCH = 32; //-- 21
parameter V_SYNCSTART = V_LINES + V_FRONTPORCH;
parameter V_SYNCEND = V_SYNCSTART + V_SYNCTIME;
parameter V_PERIOD = V_SYNCEND + V_BACKPORCH;
//------------------------------------------------
//------------------------------------------------
reg HsyncB;
reg VsyncB;
reg [9:0]Hcnt;
reg [9:0]Vcnt;
reg Enable;
reg TempR;
reg TempG;
reg TempB;
wire [3:0]ColorR;
wire [3:0]ColorG;
wire [3:0]ColorB;
//--Clock:
//reg [2:0]Count;
wire Period1uS, Period1mS;
reg CLK;
wire CLKTemp ;
//-- Globle Clock Assignment
reg [5:0]Count_clk; //-- 1MHz
reg [9:0]Count1_clk; //-- 1KHz
reg [9:0]Count2_clk; //-- 1Hz
//-- 25 MHz
always@(posedge GCLKP1)
CLK <= ~CLK;
//-----------------------------------------------
//--GCLKP : 50MHz
//--Period: 1uS (Period1uS <= GCLKP1; )
always@(negedge RESET or posedge GCLKP2)
begin
if(!RESET)
Count_clk <= 6'b0;
else if(Count_clk > 6'b110000)
Count_clk <= 6'b0; //-- 1uS
else
Count_clk <= Count_clk + 1'b1;
end
assign Period1uS = Count_clk[5];
//-----------------------------------------------
//--Period: 1mS
always@(negedge RESET or posedge Period1uS)
begin
if(!RESET)
Count1_clk <= 10'b0;
else if(Count1_clk > 10'b1111100110)
Count1_clk <= 10'b0; //-- 1mS
else
Count1_clk <= Count1_clk + 1'b1;
end
assign Period1mS = Count1_clk[9];
//-----------------------------------------------
//--Period: 1S
always@(negedge RESET or posedge Period1mS)
begin
if(!RESET)
Count2_clk <= 10'b0;
else if(Count2_clk > 10'b1111100110)
Count2_clk <= 10'b0; //-- 1S
else
Count2_clk <= Count2_clk + 1'b1;
end
//-- 2 Hz
assign CLKTemp = Count2_clk[8];
//================================================================================================
//-- VGA Clock process
//--------------------------------------------------------------------------------------------------
//-- Horizontal counter
always@(negedge RESET or posedge CLK)
begin
if(!RESET)
Hcnt <= 10'b0;
else if(Hcnt < H_PERIOD)
Hcnt <= Hcnt + 1'b1;
else
Hcnt <= 10'b0;
end
//------------------------------------------------
//-- Vertical counter
always@(negedge RESET or posedge HsyncB)
begin
if(!RESET)
Vcnt <= 10'b0;
else if(Vcnt < V_PERIOD)
Vcnt <= Vcnt + 1'b1;
else
Vcnt <= 10'b0;
end
//------------------------------------------------
//-- Horizontal Sync
//always@(negedge RESET or posedge CLK)
// begin
// if(!RESET)
// HsyncB <= 1'b1;
// else if( Hcnt>=(H_PIXELS + H_FRONTPORCH) && Hcnt<(H_PIXELS + H_FRONTPORCH + H_SYNCTIME) )
// HsyncB <= 1'b0;
// else
// HsyncB <= 1'b1;
// end
always@(negedge RESET or posedge CLK)
begin
if(!RESET)
HsyncB <= 1'b1;
else if( Hcnt>=(H_PIXELS + H_FRONTPORCH) && Hcnt<(H_PIXELS + H_FRONTPORCH + H_SYNCTIME) )
HsyncB <= 1'b0;
else
HsyncB <= 1'b1;
end
//------------------------------------------------
//-- Vertical Sync
always@(negedge RESET or posedge HsyncB)
begin
if(!RESET)
VsyncB <= 1'b1;
else if( (Vcnt >= (V_LINES + V_FRONTPORCH) ) && (Vcnt<(V_LINES + V_FRONTPORCH + V_SYNCTIME) ) )
VsyncB <= 1'b0;
else
VsyncB <= 1'b1;
end
assign HS = HsyncB;
assign VS = VsyncB;
//==============================================
//----------------------------------------------
always@(posedge CLK)
begin
if(!RESET)
Enable <= 1'b0;
else if(Hcnt >= H_PIXELS || Vcnt >= V_LINES)
Enable <= 1'b0;
else
Enable <= 1'b1;
end
//------------------------------------------------
reg [2:0]Count_2;
always@(negedge RESET or posedge CLKTemp)
begin
if(!RESET)
Count_2 <= 3'b0;
else
Count_2 <= Count_2 + 1'b1;
end
//------------------------------------------------
always@(Hcnt[7:5])
begin
case(Hcnt[7:5])
3'b000:
begin
TempR <= 1'b1;
TempG <= 1'b1;
TempB <= 1'b1;
end
3'b001:
begin
TempR <= 1'b0;
TempG <= 1'b0;
TempB <= 1'b0;
end
3'b010:
begin
TempR <= 1'b1;
TempG <= 1'b0;
TempB <= 1'b0;
end
3'b011:
begin
TempR <= 1'b0;
TempG <= 1'b0;
TempB <= 1'b1;
end
3'b100:
begin
TempR <= 1'b0;
TempG <= 1'b1;
TempB <= 1'b0;
end
3'b101:
begin
TempR <= 1'b1;
TempG <= 1'b0;
TempB <= 1'b1;
end
3'b110:
begin
TempR <= 1'b1;
TempG <= 1'b1;
TempB <= 1'b0;
end
3'b111:
begin
TempR <= 1'b1;
TempG <= 1'b1;
TempB <= 1'b1;
end
default:
begin
TempR <= 1'b0;
TempG <= 1'b0;
TempB <= 1'b0;
end
endcase
end
//-------------------------------------------------
assign R = (Enable != 1'b1)? 4'b0:
(TempR == 1'b1)?{Count_2,1'b1}:4'b0;
assign G = (Enable != 1'b1)? 4'b0:
(TempG == 1'b1)?{1'b1,Count_2}:4'b0;
assign B = (Enable != 1'b1)? 4'b0:
(TempB == 1'b1)?{1'b1,Count_2[0],Count_2[1],Count_2[2]}:4'b0;
endmodule
相关文章推荐
- 当年我QB的封笔之作——在VGA 12h 模式下实时抖动绘制真彩色数据
- 色差输出 S-Video YUV YCbCr YPvPr RGB VGA WXGA
- (原創) 如何產生VGA的Color Pattern Generator? (SOC) (Verilog) (DE2) (DE2-70)
- VGA视频信号采集新途径!
- DIV & VGA & HDMI
- 信号接口-视频输出端口介绍(HDMI、DVI、VGA、RGB、分量、S端子)
- 【IT动态】VGA 接头将在 2015 年走入历史,苹果:「花这么久啊?」我:觉得挺快的!
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--VGA驱动(十)
- Camera OV9650 VGA 模式输出寄存器配置表
- Android屏幕分辨率详解(VGA、HVGA、QVGA、WVGA、WQVGA)
- pda hvga vga
- 深入浅出VGA和DVI接口
- 各种显式模式 整理汇总(VGA,XGA...)
- WVGA VGA QVGA QWVGA是什么意思
- 电脑开机显示“Windows\system\vgaoem.fon”丢失的解决方法
- 关于S5pv210 +SDA7123 VGA转换芯片代替经典2440+SM502 方案的可行性
- 关于S5PV210 LVDS/VGA等方案的考虑——关于SDA7123和ch7034的性价比分析
- 多显示器实现屏幕扩展(VGA DVI HDMI)
- VGA时序及其原理
- yuv RGB h.264 vga都是什么意思,有什么关系