module bt1120_gen #(
parameter H_SYNC = 44,
parameter H_FRONT_PORCH = 88,
parameter H_BACK_PORCH = 148,
parameter V_SYNC = 5,
parameter V_FRONT_PORCH = 4,
parameter V_BACK_PORCH = 36
)(
input clk,
input rst_p,
// input [5:0] h_sync_pixcels,
// input [5:0] h_front_porch_pixcels,
// input [5:0] h_back_porch_pixcels,
// input [5:0] v_sync_lines,
// input [5:0] v_front_porch_lines,
// input [5:0] v_back_porch_lines,
input [12:0] col,
input [12:0] row,
output reg[15:0] odata,
output reg v_sync,
output reg h_sync,
output reg de
);
parameter S_H_SYNC = 2'b00;
parameter S_H_BACK_PORCH = 2'b01;
parameter S_H_ACTIVE = 2'b10;
parameter S_H_FRONT_PORCH = 2'b11;
parameter S_V_SYNC = 2'b00;
parameter S_V_BACK_PORCH = 2'b01;
parameter S_V_ACTIVE = 2'b10;
parameter S_V_FRONT_PORCH = 2'b11;
reg [1:0] h_pre_state = S_H_FRONT_PORCH;
reg [1:0] h_nx_state = S_H_FRONT_PORCH;
reg [1:0] v_pre_state = S_V_SYNC;
reg [1:0] v_nx_state = S_V_SYNC;
reg [12:0] h_cnt = 0;
reg [12:0] v_cnt = 0;
reg [15:0] sync_code = 0;
reg de_r = 1'b0;
reg vid_sop_r = 1'b0;
wire pos_vid_sop;
reg fifo_rd_valid = 1'b0;
reg [15:0] fifo_rd_data_r = 16'd0;
reg [15:0] sync_code_r = 16'd0;
reg [15:0] sync_code_r1 = 16'd0;
reg de_r1 = 1'b0;
reg de_r2 = 1'b0;
reg h_sync_r = 1'b0;
reg h_sync_r1 = 1'b0;
reg h_sync_r2 = 1'b0;
reg v_sync_r = 1'b0;
reg v_sync_r1 = 1'b0;
reg v_sync_r2 = 1'b0;
reg data_en = 1'b0;
reg data_en_dly = 1'b0;
always @( posedge clk )
begin
if( h_nx_state == S_H_ACTIVE && v_nx_state == S_V_ACTIVE )
data_en <= 1'b1;
else
data_en <= 1'b0;
end
always @( posedge clk )
begin
data_en_dly <= data_en;
end
always @( posedge clk )
begin
if( data_en_dly )
fifo_rd_data_r <= fifo_rd_data_r + 1'b1;
else
fifo_rd_data_r <= 16'd0;
end
/***********************************************************************
***********************************************************************/
always @( posedge clk )//or posedge rst_p
begin
if( rst_p ) begin
h_pre_state <= S_H_FRONT_PORCH;
v_pre_state <= S_V_SYNC;
end else begin
h_pre_state <= h_nx_state;
v_pre_state <= v_nx_state;
end
end
always @( * )
begin
case( h_pre_state )
S_H_SYNC :
if( h_cnt == H_SYNC -1 )
h_nx_state <= S_H_BACK_PORCH;
else
h_nx_state <= S_H_SYNC;
S_H_BACK_PORCH :
begin
if( h_cnt == H_BACK_PORCH -1 )
h_nx_state <= S_H_ACTIVE;
else
h_nx_state <= S_H_BACK_PORCH;
end
S_H_ACTIVE :
begin
if( h_cnt == col -1 )
h_nx_state <= S_H_FRONT_PORCH;
else
h_nx_state <= S_H_ACTIVE;
end
S_H_FRONT_PORCH :
begin
if( h_cnt == H_FRONT_PORCH -1 )
h_nx_state <= S_H_SYNC;
else
h_nx_state <= S_H_FRONT_PORCH;
end
default:;
endcase
end
always @( * )
begin
case( v_pre_state )
S_V_SYNC :
begin
if( h_nx_state == S_H_FRONT_PORCH && h_pre_state == S_H_ACTIVE ) begin
if( v_cnt == V_SYNC -1 )
v_nx_state = S_V_BACK_PORCH;
else
v_nx_state = S_V_SYNC;
end else begin
v_nx_state = S_V_SYNC;
end
end
S_V_BACK_PORCH :
begin
if( h_nx_state == S_H_FRONT_PORCH && h_pre_state == S_H_ACTIVE ) begin
if( v_cnt == V_BACK_PORCH -1 )
v_nx_state = S_V_ACTIVE;
else
v_nx_state = S_V_BACK_PORCH;
end else begin
v_nx_state = S_V_BACK_PORCH;
end
end
S_V_ACTIVE :
begin
if( h_nx_state == S_H_FRONT_PORCH && h_pre_state == S_H_ACTIVE ) begin
if( v_cnt == row -1 )
v_nx_state = S_V_FRONT_PORCH;
else
v_nx_state = S_V_ACTIVE;
end else begin
v_nx_state = S_V_ACTIVE;
end
end
S_V_FRONT_PORCH :
begin
if( h_nx_state == S_H_FRONT_PORCH && h_pre_state == S_H_ACTIVE ) begin
if( v_cnt == V_FRONT_PORCH -1'b1 )
v_nx_state = S_V_SYNC;
else
v_nx_state = S_V_FRONT_PORCH;
end else begin
v_nx_state = S_V_FRONT_PORCH;
end
end
default:;
endcase
// end else begin
// v_nx_state = v_nx_state;
// end
//
end
/***********************************************************************
cnt
***********************************************************************/
always @( posedge clk )
begin
if( rst_p ) begin
h_cnt <= 0;
end else begin
case( h_nx_state )
S_H_SYNC :
begin
if( h_pre_state == S_H_FRONT_PORCH ) //&& h_cnt == H_FRONT_PORCH -1
h_cnt <= 0;
else
h_cnt <= h_cnt + 1'b1;
end
S_H_BACK_PORCH :
begin
if( h_pre_state == S_H_SYNC )//&& h_cnt == H_SYNC -1)
h_cnt <= 0;
else
h_cnt <= h_cnt + 1'b1;
end
S_H_ACTIVE :
begin
if( h_pre_state == S_H_BACK_PORCH)// && h_cnt == H_BACK_PORCH -1)
h_cnt <= 0;
else
h_cnt <= h_cnt + 1'b1;
end
S_H_FRONT_PORCH :
begin
if( h_pre_state == S_H_ACTIVE )//&& h_cnt == col -1)
h_cnt <= 0;
else
h_cnt <= h_cnt + 1'b1;
end
default:;
endcase
end
end
always @( posedge clk or posedge rst_p )
begin
if( rst_p)
v_cnt <= 0;
else begin
if( h_nx_state == S_H_FRONT_PORCH && h_pre_state == S_H_ACTIVE )
begin
case( v_nx_state )
S_V_SYNC :
begin
if( v_pre_state == S_V_FRONT_PORCH )
v_cnt <= 0;
else
v_cnt <= v_cnt + 1'b1;
end
S_V_BACK_PORCH :
begin
if( v_pre_state == S_V_SYNC )
v_cnt <= 0;
else
v_cnt <= v_cnt + 1'b1;
end
S_V_ACTIVE :
begin
if( v_pre_state == S_V_BACK_PORCH )
v_cnt <= 0;
else
v_cnt <= v_cnt + 1'b1;
end
S_V_FRONT_PORCH :
begin
if( v_pre_state == S_V_ACTIVE )
v_cnt <= 0;
else
v_cnt <= v_cnt + 1'b1;
end
default:;
endcase
end
end
end
/***********************************************************************
h_sync v_sync de
***********************************************************************/
always @( posedge clk )
begin
if( h_nx_state == S_H_SYNC )
h_sync_r <= 1'b1;
else
h_sync_r <= 1'b0;
end
always @( posedge clk )
begin
if( v_nx_state == S_V_SYNC )
v_sync_r <= 1'b1;
else
v_sync_r <= 1'b0;
end
always @( posedge clk )
begin
if( h_nx_state == S_H_ACTIVE && v_nx_state == S_V_ACTIVE )
de_r <= 1'b1;
else
de_r <= 1'b0;
end
/***********************************************************************
***********************************************************************/
always @( posedge clk )
begin
if( h_nx_state == S_H_ACTIVE && v_nx_state == S_V_ACTIVE )
sync_code <= 16'd0;
else if(( h_nx_state == S_H_BACK_PORCH) && ( v_nx_state == S_V_SYNC || v_nx_state == S_V_BACK_PORCH || v_nx_state == S_V_FRONT_PORCH))
case( h_cnt )
H_BACK_PORCH -2 : sync_code <= 16'habab;//16'hab00;//
H_BACK_PORCH -3 : sync_code <= 16'h0000;//16'h00ff;//
H_BACK_PORCH -4 : sync_code <= 16'h0000;//16'h8010;//
H_BACK_PORCH -5 : sync_code <= 16'hffff;//16'h8010;//
default:sync_code <= 16'h1080;
endcase
else if(( h_nx_state == S_H_FRONT_PORCH) && ( v_nx_state == S_V_SYNC || v_nx_state == S_V_BACK_PORCH || v_nx_state == S_V_FRONT_PORCH))
if( h_pre_state == S_H_ACTIVE)
sync_code <= 16'hffff;//16'h00ff;//
else begin
case(h_cnt )
0 : sync_code <= 16'h0000;//16'hb600;//
1 : sync_code <= 16'h0000;//16'h8010;//
2 : sync_code <= 16'hb6b6;//16'h8010;//
default:sync_code <= 16'h1080;
endcase
end
else if(( h_nx_state == S_H_BACK_PORCH)) begin // && ( v_nx_state == S_V_ACTIVE)
case(h_cnt )
H_BACK_PORCH -2 : sync_code <= 16'h8080;//16'h8000;//
H_BACK_PORCH -3 : sync_code <= 16'h0000;//16'h00ff;//
H_BACK_PORCH -4 : sync_code <= 16'h0000;//16'h8010;//
H_BACK_PORCH -5 : sync_code <= 16'hffff;//16'h8010;//
default:sync_code <= 16'h1080;
endcase
end
else if(( h_nx_state == S_H_FRONT_PORCH)) begin// && ( v_nx_state == S_V_ACTIVE)
if( h_pre_state == S_H_ACTIVE)
sync_code <= 16'hffff;//16'h00ff;//
else begin
case(h_cnt )
0 : sync_code <= 16'h0000;//16'h9d00;//
1 : sync_code <= 16'h0000;//16'h8010;//
2 : sync_code <= 16'h9d9d;//16'h8010;//
default:sync_code <= 16'h1080;
endcase
end
end
else begin
sync_code <= 16'h1080;
end
end
/***********************************************************************
sync
***********************************************************************/
always @( posedge clk )
begin
sync_code_r <= sync_code;
sync_code_r1<= sync_code_r;
de_r1 <= de_r;
de_r2 <= de_r1;
h_sync_r1 <= h_sync_r;
h_sync_r2 <= h_sync_r1;
v_sync_r1 <= v_sync_r;
v_sync_r2 <= v_sync_r1;
end
always @( posedge clk )
begin
odata <= sync_code_r1 + fifo_rd_data_r;
h_sync <= h_sync_r2;
v_sync <= v_sync_r2;
de <= de_r2;
end
endmodule