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.
111 lines
3.0 KiB
111 lines
3.0 KiB
|
|
module timecode_generator #(
|
|
parameter SYS_CLOCK_FREQ = 10000000
|
|
) (
|
|
input clk, //clock input
|
|
input rst_n, //asynchronous reset input, low active
|
|
|
|
input [31:0] timecode_format, //!timecode格式
|
|
|
|
input timecode0_wen, //!timecode[0:31]写信号
|
|
input [31:0] timecode0, //!timecode[0:31]写数据
|
|
output [31:0] timecode0_export, //!timecode[0:31]输出
|
|
input timecode1_wen, //!timecode[32:63]写信号
|
|
input [31:0] timecode1, //!timecode[32:63]写数据
|
|
output [31:0] timecode1_export, //!timecode[32:63]输出
|
|
|
|
input en, //!使能信号,只有在失能的情况才能修改timecode
|
|
|
|
output wire out_timecode_serial_data,
|
|
output wire out_trigger_sig,
|
|
output wire [31:0] out_timecode0,
|
|
output wire [31:0] out_timecode1
|
|
);
|
|
|
|
wire [7:0] out_frame_num;
|
|
wire out_drop_frame;
|
|
|
|
wire frame_trigger_sig;
|
|
wire first_frame_sig;
|
|
|
|
|
|
timecode_basesig_generator #(
|
|
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ)
|
|
) basesig_generator (
|
|
.clk (clk),
|
|
.rst_n (rst_n),
|
|
.timecode_format (timecode_format),
|
|
.en (en),
|
|
.out_timecode_trigger_sig(frame_trigger_sig), //帧时钟触发信号
|
|
.out_first_frame_sig (first_frame_sig),
|
|
.out_frame_num (out_frame_num),
|
|
.out_drop_frame (out_drop_frame)
|
|
);
|
|
|
|
reg [63:0] timecode;
|
|
wire [63:0] timecode_next;
|
|
timecode_nextcode nextcode (
|
|
.frame_mum (out_frame_num),
|
|
.drop (out_drop_frame),
|
|
.timecode (timecode),
|
|
.timecode_next(timecode_next)
|
|
);
|
|
|
|
reg timecode_trigger_sig;
|
|
always @(posedge clk or negedge rst_n) begin
|
|
if (!rst_n) begin
|
|
timecode <= 0;
|
|
timecode_trigger_sig <= 0;
|
|
|
|
end else begin
|
|
if (!en) begin
|
|
if (timecode0_wen || timecode1_wen) begin
|
|
if (timecode0_wen) begin
|
|
timecode[31:0] <= timecode0;
|
|
end
|
|
if (timecode1_wen) begin
|
|
timecode[63:32] <= timecode1;
|
|
end
|
|
end
|
|
end else begin
|
|
if (frame_trigger_sig) begin
|
|
// if (!first_frame_sig) begin
|
|
timecode <= timecode_next;
|
|
// end
|
|
timecode_trigger_sig <= 1;
|
|
end else begin
|
|
timecode_trigger_sig <= 0;
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
end
|
|
|
|
assign timecode0_export = timecode[31:0];
|
|
assign timecode1_export = timecode[63:32];
|
|
|
|
|
|
wire [63:0] out_timecode;
|
|
timecode_serialization #(
|
|
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ)
|
|
) serialization (
|
|
.clk (clk),
|
|
.rst_n (rst_n),
|
|
.timecode_format(timecode_format),
|
|
|
|
.trigger_sig(timecode_trigger_sig),
|
|
.timecode (timecode),
|
|
|
|
.out_timecode_serial_data(out_timecode_serial_data),
|
|
.out_trigger_sig (out_trigger_sig),
|
|
.out_timecode (out_timecode)
|
|
);
|
|
|
|
// out_timecode0
|
|
// out_timecode1
|
|
|
|
assign out_timecode0 = out_timecode[31:0];
|
|
assign out_timecode1 = out_timecode[63:32];
|
|
|
|
endmodule
|