forked from p_lusterinc_xsync/xsync_fpge
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.
165 lines
4.7 KiB
165 lines
4.7 KiB
//
|
|
// @功能:
|
|
// 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
|