You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

161 lines
3.9 KiB

module timecode_basesig_generator #(
parameter SYS_CLOCK_FREQ = 10000000
) (
input clk,
input rst_n,
input [31:0] timecode_format,
input wire en,
output out_timecode_trigger_sig,
output reg out_first_frame_sig,
output reg [7:0] out_frame_num,
output reg out_drop_frame
);
localparam FPS2398Format = 0;
localparam FPS2400Format = 1;
localparam FPS2500Format = 2;
localparam FPS2997Format = 3;
localparam FPS2997DropFormat = 4;
localparam FPS3000Format = 5;
/*******************************************************************************
* clk generator *
*******************************************************************************/
wire fps2398format_clk;
wire fps2400format_clk;
wire fps2500format_clk;
wire fps2997format_clk;
wire fps2997dropformat_clk;
wire fps3000format_clk;
zutils_pwm_generator_advanced #(
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.OUTPUT_FREQ_P00(2398)
) fps2398format (
.clk(clk),
.rst_n(rst_n),
.ctrl_sig(en),
.output_signal(fps2398format_clk)
);
zutils_pwm_generator_advanced #(
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.OUTPUT_FREQ_P00(2400)
) fps2400format (
.clk(clk),
.rst_n(rst_n),
.ctrl_sig(en),
.output_signal(fps2400format_clk)
);
zutils_pwm_generator_advanced #(
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.OUTPUT_FREQ_P00(2500)
) fps2500format (
.clk(clk),
.rst_n(rst_n),
.ctrl_sig(en),
.output_signal(fps2500format_clk)
);
zutils_pwm_generator_advanced #(
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.OUTPUT_FREQ_P00(2997)
) fps2997format (
.clk(clk),
.rst_n(rst_n),
.ctrl_sig(en),
.output_signal(fps2997format_clk)
);
zutils_pwm_generator_advanced #(
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.OUTPUT_FREQ_P00(2997)
) fps2997dropformat (
.clk(clk),
.rst_n(rst_n),
.ctrl_sig(en),
.output_signal(fps2997dropformat_clk)
);
zutils_pwm_generator_advanced #(
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
.OUTPUT_FREQ_P00(3000)
) fps3000format (
.clk(clk),
.rst_n(rst_n),
.ctrl_sig(en),
.output_signal(fps3000format_clk)
);
zutils_multiplexer_32t1_v2 timecode_clk_output_mult (
.chooseindex(timecode_format),
//in
.in0(fps2398format_clk),
.in1(fps2400format_clk),
.in2(fps2500format_clk),
.in3(fps2997format_clk),
.in4(fps2997dropformat_clk),
.in5(fps3000format_clk),
//out
.out(out_timecode_sig_clk_pwm)
);
zutils_edge_detecter timecode_sig_clk_output_edge_detecter (
.clk(clk),
.rst_n(rst_n),
.in_signal(out_timecode_sig_clk_pwm),
.in_signal_rising_edge(out_timecode_trigger_sig)
);
always @(posedge clk or negedge rst_n) begin
if (!rst_n || !en) begin
out_first_frame_sig <= 1;
end else begin
if (out_first_frame_sig && out_timecode_trigger_sig) begin
out_first_frame_sig <= 0;
end
end
end
/*******************************************************************************
* 格式解析 *
*******************************************************************************/
always @(*) begin
case (timecode_format)
FPS2398Format: begin
out_frame_num <= 24;
out_drop_frame <= 0;
end
FPS2400Format: begin
out_frame_num <= 24;
out_drop_frame <= 0;
end
FPS2500Format: begin
out_frame_num <= 25;
out_drop_frame <= 0;
end
FPS2997Format: begin
out_frame_num <= 30;
out_drop_frame <= 0;
end
FPS2997DropFormat: begin
out_frame_num <= 30;
out_drop_frame <= 0;
end
default begin
out_frame_num <= 30;
out_drop_frame <= 0;
end
endcase
end
endmodule