forked from p_lusterinc_xsync/xsync_fpge
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.
353 lines
12 KiB
353 lines
12 KiB
module timecode_nextcode (
|
|
input [63:0] timecode,
|
|
input [7:0] frame_mum,
|
|
input drop,
|
|
output [63:0] timecode_next
|
|
);
|
|
wire [7:0] now_frame_units;
|
|
wire [7:0] frame10;
|
|
wire [7:0] sec;
|
|
wire [7:0] sec10;
|
|
wire [7:0] min;
|
|
wire [7:0] min10;
|
|
wire [7:0] hour;
|
|
wire [7:0] hour10;
|
|
|
|
assign now_frame_units = timecode[7:0] & 8'b0000_1111;
|
|
assign frame10 = timecode[15:8] & 8'b0000_0011;
|
|
assign sec = timecode[23:16]& 8'b0000_1111;
|
|
assign sec10 = timecode[31:24]& 8'b0000_0111;
|
|
assign min = timecode[39:32]& 8'b0000_1111;
|
|
assign min10 = timecode[47:40]& 8'b0000_0111;
|
|
assign hour = timecode[55:48]& 8'b0000_1111;
|
|
assign hour10 = timecode[63:56]& 8'b0000_0011;
|
|
|
|
wire houris23 = (hour10 == 2) && (hour == 3);
|
|
wire houris19 = (hour10 == 1) && (hour == 9);
|
|
wire houris09 = (hour10 == 0) && (hour == 9);
|
|
|
|
wire minis59 = (min10 == 5) && (min == 9);
|
|
wire minis49 = (min10 == 4) && (min == 9);
|
|
wire minis39 = (min10 == 3) && (min == 9);
|
|
wire minis29 = (min10 == 2) && (min == 9);
|
|
wire minis19 = (min10 == 1) && (min == 9);
|
|
wire minis09 = (min10 == 0) && (min == 9);
|
|
|
|
wire secis59 = (sec10 == 5) && (sec == 9);
|
|
wire secis49 = (sec10 == 4) && (sec == 9);
|
|
wire secis39 = (sec10 == 3) && (sec == 9);
|
|
wire secis29 = (sec10 == 2) && (sec == 9);
|
|
wire secis19 = (sec10 == 1) && (sec == 9);
|
|
wire secis09 = (sec10 == 0) && (sec == 9);
|
|
|
|
wire frameisfinal = (frame10 == 2) && (now_frame_units == (frame_mum - 20 - 1));
|
|
wire frameis19 = (frame10 == 1) && (now_frame_units == 9);
|
|
wire frameis09 = (frame10 == 0) && (now_frame_units == 9);
|
|
|
|
// reg [63:0] next_frame;
|
|
|
|
reg [63:0] next_frame;
|
|
wire [7:0] n_10hour;
|
|
wire [7:0] n_hour;
|
|
wire [7:0] n_10min;
|
|
wire [7:0] n_min;
|
|
wire [7:0] n_10sec;
|
|
wire [7:0] n_sec;
|
|
wire [7:0] n_10frame;
|
|
wire [7:0] n_frame;
|
|
assign n_10hour[7:0] = next_frame[63:56];
|
|
assign n_hour[7:0] = next_frame[55:48];
|
|
assign n_10min[7:0] = next_frame[47:40];
|
|
assign n_min[7:0] = next_frame[39:32];
|
|
assign n_10sec[7:0] = next_frame[31:24];
|
|
assign n_sec[7:0] = next_frame[23:16];
|
|
assign n_10frame[7:0] = next_frame[15:8];
|
|
assign n_frame[7:0] = next_frame[7:0];
|
|
|
|
|
|
|
|
function [63:0] assign_timecode;
|
|
input [7:0] hour_tens;
|
|
input [7:0] hour_units;
|
|
input [7:0] min_tens;
|
|
input [7:0] min_units;
|
|
input [7:0] sec_tens;
|
|
input [7:0] sec_units;
|
|
input [7:0] frame_tens;
|
|
input [7:0] frame_units;
|
|
begin
|
|
assign_timecode[7:0] = frame_units;
|
|
assign_timecode[15:8] = frame_tens;
|
|
assign_timecode[23:16] = sec_units;
|
|
assign_timecode[31:24] = sec_tens;
|
|
assign_timecode[39:32] = min_units;
|
|
assign_timecode[47:40] = min_tens;
|
|
assign_timecode[55:48] = hour_units;
|
|
assign_timecode[63:56] = hour_tens;
|
|
end
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
always @(*) begin
|
|
/*******************************************************************************
|
|
* HOUR *
|
|
*******************************************************************************/
|
|
if (houris23 && minis59 && secis59 && frameisfinal) begin //23:59:59:29
|
|
next_frame <= assign_timecode(0, 0, 0, 0, 0, 0, 0, 0);
|
|
end else if (houris19 && minis59 && secis59 && frameisfinal) begin //19:59:59:29
|
|
next_frame <= assign_timecode(2, 0, 0, 0, 0, 0, 0, 0);
|
|
end else if (houris09 && minis59 && secis59 && frameisfinal) begin //09:59:59:29
|
|
next_frame <= assign_timecode(1, 0, 0, 0, 0, 0, 0, 0);
|
|
end else if (minis59 && secis59 && frameisfinal) begin //xx:59:59:29
|
|
next_frame <= assign_timecode(hour10, hour + 1, 0, 0, 0, 0, 0, 0);
|
|
end
|
|
/*******************************************************************************
|
|
* MIN *
|
|
*******************************************************************************/
|
|
else if (minis49 && secis59 && frameisfinal) begin // xx:49:59:29
|
|
next_frame <= assign_timecode(hour10, hour, 5, 0, 0, 0, 0, 0);
|
|
end else if (minis39 && secis59 && frameisfinal) begin // xx:39:59:29
|
|
next_frame <= assign_timecode(hour10, hour, 4, 0, 0, 0, 0, 0);
|
|
end else if (minis29 && secis59 && frameisfinal) begin // xx:29:59:29
|
|
next_frame <= assign_timecode(hour10, hour, 3, 0, 0, 0, 0, 0);
|
|
end else if (minis19 && secis59 && frameisfinal) begin // xx:19:59:29
|
|
next_frame <= assign_timecode(hour10, hour, 2, 0, 0, 0, 0, 0);
|
|
end else if (minis09 && secis59 && frameisfinal) begin // xx:09:59:29
|
|
next_frame <= assign_timecode(hour10, hour, 1, 0, 0, 0, 0, 0);
|
|
end else if (secis59 && frameisfinal) begin // xx:xx:59:29
|
|
if (drop) begin
|
|
next_frame <= assign_timecode(hour10, hour, min10, min + 1, 0, 0, 0, 2);
|
|
end else begin
|
|
next_frame <= assign_timecode(hour10, hour, min10, min + 1, 0, 0, 0, 0);
|
|
end
|
|
end
|
|
/*******************************************************************************
|
|
* SECOND *
|
|
*******************************************************************************/
|
|
else if (secis49 && frameisfinal) begin // xx:xx:49:29
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, 5, 0, 0, 0);
|
|
end else if (secis39 && frameisfinal) begin // xx:xx:39:29
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, 4, 0, 0, 0);
|
|
end else if (secis29 && frameisfinal) begin // xx:xx:29:29
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, 3, 0, 0, 0);
|
|
end else if (secis19 && frameisfinal) begin // xx:xx:19:29
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, 2, 0, 0, 0);
|
|
end else if (secis09 && frameisfinal) begin // xx:xx:09:29
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, 1, 0, 0, 0);
|
|
end else if (frameisfinal) begin // xx:xx:xx:29
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, sec10, sec + 1, 0, 0);
|
|
end
|
|
/*******************************************************************************
|
|
* FRAME *
|
|
*******************************************************************************/
|
|
else if (frameis19) begin // xx:xx:xx:19
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, sec10, sec, 2, 0);
|
|
end else if (frameis09) begin // xx:xx:xx:09
|
|
next_frame <= assign_timecode(hour10, hour, min10, min, sec10, sec, 1, 0);
|
|
end else begin
|
|
next_frame <=
|
|
assign_timecode(hour10, hour, min10, min, sec10, sec, frame10, now_frame_units + 1);
|
|
end
|
|
end
|
|
assign timecode_next = next_frame;
|
|
|
|
|
|
// always @(*) begin
|
|
// /*******************************************************************************
|
|
// * HOUR *
|
|
// *******************************************************************************/
|
|
// if (houris23 && minis59 && secis59 && frameisfinal) begin //23:59:59:29
|
|
// n_10hour <= 0;
|
|
// n_hour <= 0;
|
|
// n_10min <= 0;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (houris19 && minis59 && secis59 && frameisfinal) begin //19:59:59:29
|
|
// n_10hour <= 2;
|
|
// n_hour <= 0;
|
|
// n_10min <= 0;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (houris09 && minis59 && secis59 && frameisfinal) begin //09:59:59:29
|
|
// n_10hour <= 1;
|
|
// n_hour <= 0;
|
|
// n_10min <= 0;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (minis59 && secis59 && frameisfinal) begin //xx:59:59:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour + 1;
|
|
// n_10min <= 0;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end /*******************************************************************************
|
|
// * MIN *
|
|
// *******************************************************************************/
|
|
// else if (minis49 && secis59 && frameisfinal) begin // xx:49:59:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= 5;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (minis39 && secis59 && frameisfinal) begin // xx:39:59:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= 4;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (minis29 && secis59 && frameisfinal) begin // xx:29:59:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= 3;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (minis19 && secis59 && frameisfinal) begin // xx:19:59:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= 2;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (minis09 && secis59 && frameisfinal) begin // xx:09:59:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= 1;
|
|
// n_min <= 0;
|
|
// n_10sec <= 0;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end /*******************************************************************************
|
|
// * SECOND *
|
|
// *******************************************************************************/
|
|
// else if (secis49 && frameisfinal) begin // xx:xx:49:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= 5;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (secis39 && frameisfinal) begin // xx:xx:39:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= 4;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (secis29 && frameisfinal) begin // xx:xx:29:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= 3;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (secis19 && frameisfinal) begin // xx:xx:19:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= 2;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (secis09 && frameisfinal) begin // xx:xx:09:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= 1;
|
|
// n_sec <= 0;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end else if (frameisfinal) begin // xx:xx:xx:29
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= sec10;
|
|
// n_sec <= sec;
|
|
// n_10frame <= 0;
|
|
// n_frame <= 0;
|
|
// end /*******************************************************************************
|
|
// * FRAME *
|
|
// *******************************************************************************/
|
|
// else if (frameis19) begin // xx:xx:xx:19
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= sec10;
|
|
// n_sec <= sec;
|
|
// n_10frame <= 2;
|
|
// n_frame <= 0;
|
|
// end else
|
|
// if (frameis09) begin // xx:xx:xx:09
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= sec10;
|
|
// n_sec <= sec;
|
|
// n_10frame <= 1;
|
|
// n_frame <= 0;
|
|
// end else begin
|
|
// n_10hour <= hour10;
|
|
// n_hour <= hour;
|
|
// n_10min <= min10;
|
|
// n_min <= min;
|
|
// n_10sec <= sec10;
|
|
// n_sec <= sec;
|
|
// n_10frame <= frame10;
|
|
// n_frame <= now_frame_units + 1;
|
|
// end
|
|
// end
|
|
// assign timecode_next = next_frame;
|
|
|
|
// assign timecode_next[7:0] = n_frame;
|
|
// assign timecode_next[15:8] = n_10frame;
|
|
// assign timecode_next[23:16] = n_sec;
|
|
// assign timecode_next[31:24] = n_10sec;
|
|
// assign timecode_next[39:32] = n_min;
|
|
// assign timecode_next[47:40] = n_10min;
|
|
// assign timecode_next[55:48] = n_hour;
|
|
// assign timecode_next[63:56] = n_10hour;
|
|
|
|
|
|
// wire [63:0] tmp_timecode_next;
|
|
// assign tmp_timecode_next = timecode + 1;
|
|
// assign timecode_next = tmp_timecode_next;
|
|
|
|
|
|
endmodule
|