// // @功能: // 1. 功能:同步输出,脉冲输出 // 2. 输出脉冲 // 3. 输出脉冲时长可调 // 4. 输出极性可调 // module ttl_output #( parameter REG_START_ADD = 0, parameter SYS_CLOCK_FREQ = 10000000, parameter TEST = 0, parameter ID = 1 ) ( input clk, //clock input input rst_n, //asynchronous reset input, low active //寄存器读写接口 input [31:0] addr, input [31:0] wr_data, input wr_en, output wire [31:0] rd_data, input [31:0] signal_in, output ttloutput, //ttl输出信号 output ttloutput_state_led //ttl输出状态信号 ); /******************************************************************************* * 寄存器列表 * *******************************************************************************/ // // 输入信号选择器 // 0: 信号0 // 1: 信号1 // ... // x: 信号x wire [31:0] reg_input_signal_select; // // 输出信号选择器 // [0] // 0:输出0 // 1:输出1 // 2:测试信号输出 // 3:原始信号 // 4:原始信号翻转输出 // 5:脉冲输出 // 6:脉冲信号翻转输出 localparam REG1_INIT = TEST ? 2 : 0; wire [31:0] reg_output_signal_select; // // 配置寄存器 // [0] 脉冲输入时候触发信号 0:上升沿 1:下降沿触发 // wire [31:0] reg_config; assign pluse_input_trigger_signal = reg_config[0]; // // 脉冲模式-有效电平长度: // 0~0xffffffff // wire [31:0] reg_pulse_mode_valid_len; // 脉冲模式-有效电平长度: 0~0xffffffff // // 脉冲模式-触发延时: // 0~0xffffffff // wire [31:0] reg_pulse_mode_trigger_delay; // 脉冲模式-触发延时: 0~0xffffffff zutils_register16 #( .REG_START_ADD(REG_START_ADD), .REG1_INIT(REG1_INIT) ) _register ( .clk(clk), .rst_n(rst_n), .addr(addr), .wr_data(wr_data), .wr_en(wr_en), .rd_data(rd_data), .reg0(reg_input_signal_select), .reg1(reg_output_signal_select), .reg2(reg_config), .reg3(reg_pulse_mode_valid_len), .reg4(reg_pulse_mode_trigger_delay) ); /******************************************************************************* * 内部信号 * *******************************************************************************/ //脉冲输出 wire pluse_output; // 输入信号上升沿事件 wire in_signal_rising_edge; // 输入信号下降沿事件 wire in_signal_falling_edge; // 输入信号上升沿或下降沿事件 wire in_signal_edge; // 输出的脉冲触发信号的触发信号 wire signal_src_trigger; assign signal_src_trigger = (pluse_input_trigger_signal==0) ? (in_signal_rising_edge) : (in_signal_falling_edge); wire signal_in_choose; zutils_multiplexer_32t1 _signal_select ( .chooseindex(reg_input_signal_select), .signal(signal_in), .signalout(signal_in_choose) ); // 边沿检测 zutils_edge_detecter _signal_in ( .clk(clk), .rst_n(rst_n), .in_signal(signal_in_choose), .in_signal_rising_edge(in_signal_rising_edge), .in_signal_falling_edge(in_signal_falling_edge), .in_signal_edge(in_signal_edge) ); // 短脉冲,触发生成,长脉冲 zutils_pluse_generator _pluse_generator ( .clk(clk), .rst_n(rst_n), .pluse_width(reg_pulse_mode_valid_len), .pluse_delay(reg_pulse_mode_trigger_delay), .trigger(signal_src_trigger), .output_signal(ttl_after_process_output) ); zutils_pwm_generator #( .SYS_CLOCK_FREQ(SYS_CLOCK_FREQ), .OUTPUT_FREQ(1000 * ID) ) _test_signal_generator ( .clk(clk), .rst_n(rst_n), .output_signal(test_signal_output) ); wire [15:0] signal_output_select_in; assign signal_output_select_in[0] = 1'b0; assign signal_output_select_in[1] = 1'b1; assign signal_output_select_in[2] = test_signal_output; assign signal_output_select_in[3] = signal_in_choose; assign signal_output_select_in[4] = !signal_in_choose; assign signal_output_select_in[5] = ttl_after_process_output; assign signal_output_select_in[6] = !ttl_after_process_output; assign signal_output_select_in[7] = 1'b0; assign signal_output_select_in[15:8] = 8'b0; zutils_multiplexer_16t1 _signal_output_select ( .chooseindex(reg_output_signal_select), .signal(signal_output_select_in), .signalout(ttloutput) ); // assign ttloutput_state_led = !ttloutput; assign ttloutput_state_led = 1; endmodule