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

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