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