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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

164 lines
4.9 KiB

  1. module timecode_output #(
  2. parameter REG_START_ADD = 0,
  3. parameter SYS_CLOCK_FREQ = 10000000
  4. ) (
  5. input clk, //clock input
  6. input rst_n, //asynchronous reset input, low active
  7. //寄存器读写接口
  8. input [31:0] addr,
  9. input [31:0] wr_data,
  10. input wr_en,
  11. output wire [31:0] rd_data,
  12. /*******************************************************************************
  13. * TIMECODE输出 *
  14. *******************************************************************************/
  15. input [31:0] ext_timecode_format,
  16. input [63:0] ext_timecode_data,
  17. input ext_timecode_tigger_sig,
  18. input ext_timecode_serial_data,
  19. input [63:0] internal_timecode_data,
  20. input internal_timecode_tigger_sig,
  21. input [31:0] internal_timecode_format,
  22. input internal_timecode_serial_data,
  23. /*******************************************************************************
  24. * 输出接口 *
  25. *******************************************************************************/
  26. output stm32if_timecode_tigger_sig,
  27. output reg timecode_out_bnc,
  28. output reg timecode_out_bnc_select, // 电平选择 0line,1:mic
  29. output reg timecode_out_bnc_state_led,
  30. output reg timecode_out_headphone,
  31. output reg timecode_out_headphone_select, // 电平选择 0line,1:mic
  32. output reg timecode_out_headphone_state_led
  33. );
  34. // 1ms
  35. reg [31:0] r0_timecode_select; //时码输入选择器
  36. reg [31:0] r1_timecode0; //时码原始码0 //注意这个数据要比ext_timecode_serial_data晚一帧
  37. reg [31:0] r2_timecode1; //时码原始码1 //注意这个数据要比ext_timecode_serial_data晚一帧
  38. reg [31:0] r3_timecode_format; //
  39. reg [31:0] r4_bnc_outut_level_select; // 0:line, 1:mic
  40. reg [31:0] r5_headphone_outut_level_select; // 0:line, 1:mic
  41. wire [31:0] reg_wr_index;
  42. zutils_register_advanced #(
  43. .REG_START_ADD(REG_START_ADD)
  44. ) _register (
  45. .clk(clk),
  46. .rst_n(rst_n),
  47. .addr(addr),
  48. .wr_data(wr_data),
  49. .wr_en(wr_en),
  50. .rd_data(rd_data),
  51. .reg0(r0_timecode_select),
  52. .reg1(r1_timecode0),
  53. .reg2(r2_timecode1),
  54. .reg3(r3_timecode_format),
  55. .reg4(r4_bnc_outut_level_select),
  56. .reg5(r5_headphone_outut_level_select),
  57. .reg_wr_sig(reg_wr_sig),
  58. .reg_index (reg_wr_index)
  59. );
  60. always @(posedge clk or negedge rst_n) begin
  61. if (!rst_n) begin
  62. r0_timecode_select <= 0;
  63. r4_bnc_outut_level_select <= 0;
  64. r5_headphone_outut_level_select <= 0;
  65. end else begin
  66. if (reg_wr_sig) begin
  67. case (reg_wr_index)
  68. 31'h0: r0_timecode_select <= wr_data;
  69. 31'h4: r4_bnc_outut_level_select <= wr_data;
  70. 31'h5: r5_headphone_outut_level_select <= wr_data;
  71. default: begin
  72. end
  73. endcase
  74. end
  75. end
  76. end
  77. reg out_timecode_serial_data;
  78. reg timecode_tigger_sig;
  79. always @(posedge clk or negedge rst_n) begin
  80. if (!rst_n) begin
  81. r1_timecode0 <= 0;
  82. r2_timecode1 <= 0;
  83. r3_timecode_format <= 0;
  84. out_timecode_serial_data <= 0;
  85. timecode_tigger_sig <= 0;
  86. end else begin
  87. case (r0_timecode_select)
  88. 0: begin
  89. r1_timecode0 <= 0;
  90. r2_timecode1 <= 0;
  91. r3_timecode_format <= 0;
  92. out_timecode_serial_data <= 0;
  93. timecode_tigger_sig <= 0;
  94. end
  95. // 内部时码
  96. 1: begin
  97. r1_timecode0 <= internal_timecode_data[31:0];
  98. r2_timecode1 <= internal_timecode_data[63:32];
  99. r3_timecode_format <= internal_timecode_format;
  100. out_timecode_serial_data <= internal_timecode_serial_data;
  101. timecode_tigger_sig <= internal_timecode_tigger_sig;
  102. end
  103. // 外部时码
  104. 2: begin
  105. r1_timecode0 <= ext_timecode_data[31:0];
  106. r2_timecode1 <= ext_timecode_data[63:32];
  107. r3_timecode_format <= ext_timecode_format;
  108. out_timecode_serial_data <= ext_timecode_serial_data;
  109. timecode_tigger_sig <= ext_timecode_tigger_sig;
  110. end
  111. default: begin
  112. r1_timecode0 <= 0;
  113. r2_timecode1 <= 0;
  114. r3_timecode_format <= 0;
  115. out_timecode_serial_data <= 0;
  116. timecode_tigger_sig <= 0;
  117. end
  118. endcase
  119. end
  120. end
  121. zutils_pluse_generator _pluse_generator (
  122. .clk(clk),
  123. .rst_n(rst_n),
  124. .pluse_width(1000), //1ms
  125. .pluse_delay(32'd0),
  126. .trigger(timecode_tigger_sig),
  127. .output_signal(stm32if_timecode_tigger_sig)
  128. );
  129. always @(*) begin
  130. timecode_out_bnc <= out_timecode_serial_data;
  131. timecode_out_bnc_select <= r4_bnc_outut_level_select[0];
  132. timecode_out_bnc_state_led <= 1;
  133. timecode_out_headphone <= out_timecode_serial_data;
  134. timecode_out_headphone_select <= r5_headphone_outut_level_select[0];
  135. timecode_out_headphone_state_led <= 1;
  136. end
  137. endmodule