89 lines
2.5 KiB
Verilog
89 lines
2.5 KiB
Verilog
/////////////////////////////////////////////////////////////////
|
|
// Author - Imants Pulkstenis
|
|
// Date - 04.04.2020
|
|
// Project name - Audio FFT on FPGA
|
|
// Module name - vertical counter
|
|
//
|
|
// Detailed module description:
|
|
//
|
|
//
|
|
//
|
|
// Revision:
|
|
// A - initial design
|
|
// B -
|
|
// C -
|
|
//
|
|
///////////////////////////////////////////////////////////////////
|
|
module vertical_counter #(
|
|
parameter
|
|
VSYNC_LINES = 521,
|
|
VSYNC_DISPLAY = 480,
|
|
VSYNC_PULSE = 2,
|
|
VSYNC_FRONT_PORCH = 10,
|
|
VSYNC_BACK_PORCH = 29
|
|
)(
|
|
//input clk,
|
|
input i_Hsync,
|
|
output o_Vsync,
|
|
output o_v_display,
|
|
output [8:0] o_v_line
|
|
);
|
|
//----------Internal registers, constants and wariables-----
|
|
reg vsync_reg = 1'b1;
|
|
reg [9:0] counter_reg = 'h0;
|
|
reg [8:0] counter_line_reg = 'h0;
|
|
reg [2:0] r_state=VS_FRONT_PORCH, r_next=VS_FRONT_PORCH;
|
|
localparam [2:0] VS_FRONT_PORCH = 'h0,
|
|
VS_PULSE = 'h1,
|
|
VS_BACK_PORCH = 'h2,
|
|
VS_DISPLAY = 'h3;
|
|
|
|
//---------state register sequential always block-----------
|
|
always @(posedge i_Hsync ) begin
|
|
r_state <= r_next;
|
|
end
|
|
|
|
//----next state & outputs, combinational always block------
|
|
always@(posedge i_Hsync) begin
|
|
counter_reg <= counter_reg + 1;
|
|
|
|
case (r_state)
|
|
VS_FRONT_PORCH: begin
|
|
vsync_reg <= 1'b1;
|
|
if(counter_reg == VSYNC_FRONT_PORCH - 2)
|
|
r_next <= VS_PULSE;
|
|
end
|
|
VS_PULSE:begin
|
|
vsync_reg <= 1'b0;
|
|
if(counter_reg == VSYNC_FRONT_PORCH +
|
|
VSYNC_PULSE - 2)
|
|
r_next <= VS_BACK_PORCH;
|
|
end
|
|
VS_BACK_PORCH:begin
|
|
vsync_reg <= 1'b1;
|
|
if(counter_reg == VSYNC_FRONT_PORCH +
|
|
VSYNC_PULSE +
|
|
VSYNC_BACK_PORCH - 2) begin
|
|
r_next <= VS_DISPLAY;
|
|
counter_line_reg <= 'h0;
|
|
end
|
|
end
|
|
VS_DISPLAY:begin
|
|
vsync_reg <= 1'b1;
|
|
counter_line_reg <= counter_line_reg + 1;
|
|
if(counter_reg == VSYNC_FRONT_PORCH +
|
|
VSYNC_PULSE +
|
|
VSYNC_BACK_PORCH +
|
|
VSYNC_DISPLAY - 1) begin
|
|
r_next <= VS_FRONT_PORCH;
|
|
counter_reg <= 'h0;
|
|
end
|
|
end
|
|
endcase
|
|
end
|
|
|
|
assign o_Vsync = vsync_reg;
|
|
assign o_v_display = (counter_line_reg >= 1 && counter_line_reg <= VSYNC_DISPLAY) ? 1'b1 : 1'b0 ;
|
|
assign o_v_line = counter_line_reg - 1 ;
|
|
|
|
endmodule |