代码:
module DispTimGen#(
parameter HOR_BW = 12 ,
parameter VER_BW = 11 ,
// 1080P @ 60Hz 参数值
parameter H_TOTAL = 2200 ,
parameter HS_START = 44 ,
parameter HDE_START = 192 ,
parameter HDE_END = 2112 ,
parameter V_TOTAL = 1125 ,
parameter VS_START = 5 ,
parameter VDE_START = 41 ,
parameter VDE_END = 1121
)(
//=================================== INPUT =====================================
input InClk ,
input InLocked ,
//=================================== OUTPUT ====================================
output reg OutVs ,
output reg OutHs ,
output reg OutDe
);
//localparam
//======================================================================================
//reg
reg [ HOR_BW-1:0 ] HsCnt = 'd0 ;
reg HsCntEnd = 'b0 ;
reg DispHsEn = 'd0 ;
reg [ VER_BW-1:0 ] VsCnt = 'd0 ;
reg VsCntEnd = 'b0 ;
reg VsEnd = 'd0 ;
reg DispVsEn = 'd0 ;
reg Rst = 'd0 ;
always @ (posedge InClk or negedge InLocked) begin //产生Timing计数复位信号
if( ! InLocked )
Rst <= 1'b1 ;
else
Rst <= 1'b0 ;
end
//======================================================================================
// HSync Cnt
always @ ( posedge InClk )begin
if(HsCnt[HOR_BW-1:0] == (H_TOTAL - 'd2))
HsCntEnd <= 1'd1;
else
HsCntEnd <= 1'd0;
end
always @( posedge InClk )begin
if( Rst )
HsCnt[HOR_BW-1:0] <= 'd0 ;
else begin
if( HsCntEnd )
HsCnt[HOR_BW-1:0] <= 'd0 ;
else
HsCnt[HOR_BW-1:0] <= HsCnt + 1'b1 ;
end
end
//======================================================================================
// VSync Cnt
always @ ( posedge InClk )begin
if( VsCnt[VER_BW-1:0] == (V_TOTAL - 1'b1) )
VsCntEnd <= 1'd1;
else
VsCntEnd <= 1'd0;
end
always @ (posedge InClk)begin
if( Rst )
VsCnt[VER_BW-1:0] <= 'd0 ;
else begin
if( HsCntEnd & VsCntEnd )
VsCnt[VER_BW-1:0] <= 'd0 ;
else if ( HsCntEnd )
VsCnt[VER_BW-1:0] <= VsCnt[VER_BW-1:0] + 1'b1 ;
end
end
//======================================================================================
// Hs OUTPUT Logic
always @( posedge InClk ) begin
if( Rst )
OutHs <= 1'b1 ;
else begin
if ( HsCnt[HOR_BW-1:0] == 'd0 )
OutHs <= 1'b0 ;
// HsDeStart - HsSyncStart
else if ( HsCnt[HOR_BW-1:0] == HS_START - 'd1 )
OutHs <= 1'b1 ;
end
end
//======================================================================================
// Vs OUTPUT Logic
always @( posedge InClk )begin
if( (VsCnt[VER_BW-1:0] == VS_START - 'd1) & HsCntEnd )
VsEnd <= 'd1 ;
else
VsEnd <= 'd0 ;
end
always @(posedge InClk ) begin
if( Rst ) begin
OutVs <= 1'b1 ;
end else begin
if( VsCnt[VER_BW-1:0] == 'd0 )
OutVs <= 1'b0 ;
else if( VsEnd )
OutVs <= 1'b1 ;
end
end
// De OUTPUT Logic
always @ (posedge InClk)begin
DispHsEn <= ((HsCnt[HOR_BW-1:0] >= HDE_START) & (HsCnt[HOR_BW-1:0] < HDE_END));
end
always @ (posedge InClk) begin
DispVsEn <= ((VsCnt[VER_BW-1:0] >= VDE_START) & (VsCnt[VER_BW-1:0] < VDE_END));
end
always @(posedge InClk ) begin
if( Rst ) begin
OutDe <= 1'b1 ;
end else begin
OutDe <= (DispVsEn & DispHsEn) ;
end
end
endmodule