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