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

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. module timecode_nextcode (
  2. input [63:0] timecode,
  3. input [7:0] frame_mum,
  4. input drop,
  5. output [63:0] timecode_next
  6. );
  7. wire [7:0] now_frame_units;
  8. wire [7:0] frame10;
  9. wire [7:0] sec;
  10. wire [7:0] sec10;
  11. wire [7:0] min;
  12. wire [7:0] min10;
  13. wire [7:0] hour;
  14. wire [7:0] hour10;
  15. assign now_frame_units = timecode[7:0] & 8'b0000_1111;
  16. assign frame10 = timecode[15:8] & 8'b0000_0011;
  17. assign sec = timecode[23:16]& 8'b0000_1111;
  18. assign sec10 = timecode[31:24]& 8'b0000_0111;
  19. assign min = timecode[39:32]& 8'b0000_1111;
  20. assign min10 = timecode[47:40]& 8'b0000_0111;
  21. assign hour = timecode[55:48]& 8'b0000_1111;
  22. assign hour10 = timecode[63:56]& 8'b0000_0011;
  23. wire houris23 = (hour10 == 2) && (hour == 3);
  24. wire houris19 = (hour10 == 1) && (hour == 9);
  25. wire houris09 = (hour10 == 0) && (hour == 9);
  26. wire minis59 = (min10 == 5) && (min == 9);
  27. wire minis49 = (min10 == 4) && (min == 9);
  28. wire minis39 = (min10 == 3) && (min == 9);
  29. wire minis29 = (min10 == 2) && (min == 9);
  30. wire minis19 = (min10 == 1) && (min == 9);
  31. wire minis09 = (min10 == 0) && (min == 9);
  32. wire secis59 = (sec10 == 5) && (sec == 9);
  33. wire secis49 = (sec10 == 4) && (sec == 9);
  34. wire secis39 = (sec10 == 3) && (sec == 9);
  35. wire secis29 = (sec10 == 2) && (sec == 9);
  36. wire secis19 = (sec10 == 1) && (sec == 9);
  37. wire secis09 = (sec10 == 0) && (sec == 9);
  38. wire frameisfinal = (frame10 == 2) && (now_frame_units == (frame_mum - 20 - 1));
  39. wire frameis19 = (frame10 == 1) && (now_frame_units == 9);
  40. wire frameis09 = (frame10 == 0) && (now_frame_units == 9);
  41. // reg [63:0] next_frame;
  42. reg [63:0] next_frame;
  43. wire [7:0] n_10hour;
  44. wire [7:0] n_hour;
  45. wire [7:0] n_10min;
  46. wire [7:0] n_min;
  47. wire [7:0] n_10sec;
  48. wire [7:0] n_sec;
  49. wire [7:0] n_10frame;
  50. wire [7:0] n_frame;
  51. assign n_10hour[7:0] = next_frame[63:56];
  52. assign n_hour[7:0] = next_frame[55:48];
  53. assign n_10min[7:0] = next_frame[47:40];
  54. assign n_min[7:0] = next_frame[39:32];
  55. assign n_10sec[7:0] = next_frame[31:24];
  56. assign n_sec[7:0] = next_frame[23:16];
  57. assign n_10frame[7:0] = next_frame[15:8];
  58. assign n_frame[7:0] = next_frame[7:0];
  59. function [63:0] assign_timecode;
  60. input [7:0] hour_tens;
  61. input [7:0] hour_units;
  62. input [7:0] min_tens;
  63. input [7:0] min_units;
  64. input [7:0] sec_tens;
  65. input [7:0] sec_units;
  66. input [7:0] frame_tens;
  67. input [7:0] frame_units;
  68. begin
  69. assign_timecode[7:0] = frame_units;
  70. assign_timecode[15:8] = frame_tens;
  71. assign_timecode[23:16] = sec_units;
  72. assign_timecode[31:24] = sec_tens;
  73. assign_timecode[39:32] = min_units;
  74. assign_timecode[47:40] = min_tens;
  75. assign_timecode[55:48] = hour_units;
  76. assign_timecode[63:56] = hour_tens;
  77. end
  78. endfunction
  79. always @(*) begin
  80. /*******************************************************************************
  81. * HOUR *
  82. *******************************************************************************/
  83. if (houris23 && minis59 && secis59 && frameisfinal) begin //23:59:59:29
  84. next_frame <= assign_timecode(0, 0, 0, 0, 0, 0, 0, 0);
  85. end else if (houris19 && minis59 && secis59 && frameisfinal) begin //19:59:59:29
  86. next_frame <= assign_timecode(2, 0, 0, 0, 0, 0, 0, 0);
  87. end else if (houris09 && minis59 && secis59 && frameisfinal) begin //09:59:59:29
  88. next_frame <= assign_timecode(1, 0, 0, 0, 0, 0, 0, 0);
  89. end else if (minis59 && secis59 && frameisfinal) begin //xx:59:59:29
  90. next_frame <= assign_timecode(hour10, hour + 1, 0, 0, 0, 0, 0, 0);
  91. end
  92. /*******************************************************************************
  93. * MIN *
  94. *******************************************************************************/
  95. else if (minis49 && secis59 && frameisfinal) begin // xx:49:59:29
  96. next_frame <= assign_timecode(hour10, hour, 5, 0, 0, 0, 0, 0);
  97. end else if (minis39 && secis59 && frameisfinal) begin // xx:39:59:29
  98. next_frame <= assign_timecode(hour10, hour, 4, 0, 0, 0, 0, 0);
  99. end else if (minis29 && secis59 && frameisfinal) begin // xx:29:59:29
  100. next_frame <= assign_timecode(hour10, hour, 3, 0, 0, 0, 0, 0);
  101. end else if (minis19 && secis59 && frameisfinal) begin // xx:19:59:29
  102. next_frame <= assign_timecode(hour10, hour, 2, 0, 0, 0, 0, 0);
  103. end else if (minis09 && secis59 && frameisfinal) begin // xx:09:59:29
  104. next_frame <= assign_timecode(hour10, hour, 1, 0, 0, 0, 0, 0);
  105. end else if (secis59 && frameisfinal) begin // xx:xx:59:29
  106. if (drop) begin
  107. next_frame <= assign_timecode(hour10, hour, min10, min + 1, 0, 0, 0, 2);
  108. end else begin
  109. next_frame <= assign_timecode(hour10, hour, min10, min + 1, 0, 0, 0, 0);
  110. end
  111. end
  112. /*******************************************************************************
  113. * SECOND *
  114. *******************************************************************************/
  115. else if (secis49 && frameisfinal) begin // xx:xx:49:29
  116. next_frame <= assign_timecode(hour10, hour, min10, min, 5, 0, 0, 0);
  117. end else if (secis39 && frameisfinal) begin // xx:xx:39:29
  118. next_frame <= assign_timecode(hour10, hour, min10, min, 4, 0, 0, 0);
  119. end else if (secis29 && frameisfinal) begin // xx:xx:29:29
  120. next_frame <= assign_timecode(hour10, hour, min10, min, 3, 0, 0, 0);
  121. end else if (secis19 && frameisfinal) begin // xx:xx:19:29
  122. next_frame <= assign_timecode(hour10, hour, min10, min, 2, 0, 0, 0);
  123. end else if (secis09 && frameisfinal) begin // xx:xx:09:29
  124. next_frame <= assign_timecode(hour10, hour, min10, min, 1, 0, 0, 0);
  125. end else if (frameisfinal) begin // xx:xx:xx:29
  126. next_frame <= assign_timecode(hour10, hour, min10, min, sec10, sec + 1, 0, 0);
  127. end
  128. /*******************************************************************************
  129. * FRAME *
  130. *******************************************************************************/
  131. else if (frameis19) begin // xx:xx:xx:19
  132. next_frame <= assign_timecode(hour10, hour, min10, min, sec10, sec, 2, 0);
  133. end else if (frameis09) begin // xx:xx:xx:09
  134. next_frame <= assign_timecode(hour10, hour, min10, min, sec10, sec, 1, 0);
  135. end else begin
  136. next_frame <=
  137. assign_timecode(hour10, hour, min10, min, sec10, sec, frame10, now_frame_units + 1);
  138. end
  139. end
  140. assign timecode_next = next_frame;
  141. // always @(*) begin
  142. // /*******************************************************************************
  143. // * HOUR *
  144. // *******************************************************************************/
  145. // if (houris23 && minis59 && secis59 && frameisfinal) begin //23:59:59:29
  146. // n_10hour <= 0;
  147. // n_hour <= 0;
  148. // n_10min <= 0;
  149. // n_min <= 0;
  150. // n_10sec <= 0;
  151. // n_sec <= 0;
  152. // n_10frame <= 0;
  153. // n_frame <= 0;
  154. // end else if (houris19 && minis59 && secis59 && frameisfinal) begin //19:59:59:29
  155. // n_10hour <= 2;
  156. // n_hour <= 0;
  157. // n_10min <= 0;
  158. // n_min <= 0;
  159. // n_10sec <= 0;
  160. // n_sec <= 0;
  161. // n_10frame <= 0;
  162. // n_frame <= 0;
  163. // end else if (houris09 && minis59 && secis59 && frameisfinal) begin //09:59:59:29
  164. // n_10hour <= 1;
  165. // n_hour <= 0;
  166. // n_10min <= 0;
  167. // n_min <= 0;
  168. // n_10sec <= 0;
  169. // n_sec <= 0;
  170. // n_10frame <= 0;
  171. // n_frame <= 0;
  172. // end else if (minis59 && secis59 && frameisfinal) begin //xx:59:59:29
  173. // n_10hour <= hour10;
  174. // n_hour <= hour + 1;
  175. // n_10min <= 0;
  176. // n_min <= 0;
  177. // n_10sec <= 0;
  178. // n_sec <= 0;
  179. // n_10frame <= 0;
  180. // n_frame <= 0;
  181. // end /*******************************************************************************
  182. // * MIN *
  183. // *******************************************************************************/
  184. // else if (minis49 && secis59 && frameisfinal) begin // xx:49:59:29
  185. // n_10hour <= hour10;
  186. // n_hour <= hour;
  187. // n_10min <= 5;
  188. // n_min <= 0;
  189. // n_10sec <= 0;
  190. // n_sec <= 0;
  191. // n_10frame <= 0;
  192. // n_frame <= 0;
  193. // end else if (minis39 && secis59 && frameisfinal) begin // xx:39:59:29
  194. // n_10hour <= hour10;
  195. // n_hour <= hour;
  196. // n_10min <= 4;
  197. // n_min <= 0;
  198. // n_10sec <= 0;
  199. // n_sec <= 0;
  200. // n_10frame <= 0;
  201. // n_frame <= 0;
  202. // end else if (minis29 && secis59 && frameisfinal) begin // xx:29:59:29
  203. // n_10hour <= hour10;
  204. // n_hour <= hour;
  205. // n_10min <= 3;
  206. // n_min <= 0;
  207. // n_10sec <= 0;
  208. // n_sec <= 0;
  209. // n_10frame <= 0;
  210. // n_frame <= 0;
  211. // end else if (minis19 && secis59 && frameisfinal) begin // xx:19:59:29
  212. // n_10hour <= hour10;
  213. // n_hour <= hour;
  214. // n_10min <= 2;
  215. // n_min <= 0;
  216. // n_10sec <= 0;
  217. // n_sec <= 0;
  218. // n_10frame <= 0;
  219. // n_frame <= 0;
  220. // end else if (minis09 && secis59 && frameisfinal) begin // xx:09:59:29
  221. // n_10hour <= hour10;
  222. // n_hour <= hour;
  223. // n_10min <= 1;
  224. // n_min <= 0;
  225. // n_10sec <= 0;
  226. // n_sec <= 0;
  227. // n_10frame <= 0;
  228. // n_frame <= 0;
  229. // end /*******************************************************************************
  230. // * SECOND *
  231. // *******************************************************************************/
  232. // else if (secis49 && frameisfinal) begin // xx:xx:49:29
  233. // n_10hour <= hour10;
  234. // n_hour <= hour;
  235. // n_10min <= min10;
  236. // n_min <= min;
  237. // n_10sec <= 5;
  238. // n_sec <= 0;
  239. // n_10frame <= 0;
  240. // n_frame <= 0;
  241. // end else if (secis39 && frameisfinal) begin // xx:xx:39:29
  242. // n_10hour <= hour10;
  243. // n_hour <= hour;
  244. // n_10min <= min10;
  245. // n_min <= min;
  246. // n_10sec <= 4;
  247. // n_sec <= 0;
  248. // n_10frame <= 0;
  249. // n_frame <= 0;
  250. // end else if (secis29 && frameisfinal) begin // xx:xx:29:29
  251. // n_10hour <= hour10;
  252. // n_hour <= hour;
  253. // n_10min <= min10;
  254. // n_min <= min;
  255. // n_10sec <= 3;
  256. // n_sec <= 0;
  257. // n_10frame <= 0;
  258. // n_frame <= 0;
  259. // end else if (secis19 && frameisfinal) begin // xx:xx:19:29
  260. // n_10hour <= hour10;
  261. // n_hour <= hour;
  262. // n_10min <= min10;
  263. // n_min <= min;
  264. // n_10sec <= 2;
  265. // n_sec <= 0;
  266. // n_10frame <= 0;
  267. // n_frame <= 0;
  268. // end else if (secis09 && frameisfinal) begin // xx:xx:09:29
  269. // n_10hour <= hour10;
  270. // n_hour <= hour;
  271. // n_10min <= min10;
  272. // n_min <= min;
  273. // n_10sec <= 1;
  274. // n_sec <= 0;
  275. // n_10frame <= 0;
  276. // n_frame <= 0;
  277. // end else if (frameisfinal) begin // xx:xx:xx:29
  278. // n_10hour <= hour10;
  279. // n_hour <= hour;
  280. // n_10min <= min10;
  281. // n_min <= min;
  282. // n_10sec <= sec10;
  283. // n_sec <= sec;
  284. // n_10frame <= 0;
  285. // n_frame <= 0;
  286. // end /*******************************************************************************
  287. // * FRAME *
  288. // *******************************************************************************/
  289. // else if (frameis19) begin // xx:xx:xx:19
  290. // n_10hour <= hour10;
  291. // n_hour <= hour;
  292. // n_10min <= min10;
  293. // n_min <= min;
  294. // n_10sec <= sec10;
  295. // n_sec <= sec;
  296. // n_10frame <= 2;
  297. // n_frame <= 0;
  298. // end else
  299. // if (frameis09) begin // xx:xx:xx:09
  300. // n_10hour <= hour10;
  301. // n_hour <= hour;
  302. // n_10min <= min10;
  303. // n_min <= min;
  304. // n_10sec <= sec10;
  305. // n_sec <= sec;
  306. // n_10frame <= 1;
  307. // n_frame <= 0;
  308. // end else begin
  309. // n_10hour <= hour10;
  310. // n_hour <= hour;
  311. // n_10min <= min10;
  312. // n_min <= min;
  313. // n_10sec <= sec10;
  314. // n_sec <= sec;
  315. // n_10frame <= frame10;
  316. // n_frame <= now_frame_units + 1;
  317. // end
  318. // end
  319. // assign timecode_next = next_frame;
  320. // assign timecode_next[7:0] = n_frame;
  321. // assign timecode_next[15:8] = n_10frame;
  322. // assign timecode_next[23:16] = n_sec;
  323. // assign timecode_next[31:24] = n_10sec;
  324. // assign timecode_next[39:32] = n_min;
  325. // assign timecode_next[47:40] = n_10min;
  326. // assign timecode_next[55:48] = n_hour;
  327. // assign timecode_next[63:56] = n_10hour;
  328. // wire [63:0] tmp_timecode_next;
  329. // assign tmp_timecode_next = timecode + 1;
  330. // assign timecode_next = tmp_timecode_next;
  331. endmodule