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.
|
|
// `include "zutils/zutils_edge_detecter.v" // `include "zutils/zutils_pluse_generator.v" // `include "zutils/zutils_register.v" module des_ttl_generator #( parameter REG_START_ADD = 0 ) ( input clk, //clock input input rst_n, //asynchronous reset input, low active
//regbus interface output [31:0] addr, input [31:0] wr_data, input wr_en,
inout wire [31:0] rd_data, //received serial data // 输入 input signal_in, //输出 output reg ttloutput //ttl原始数据 ); // // @功能: // 1. 功能:同步输出,脉冲输出 // 2. 输出脉冲 // 3. 输出脉冲时长可调 // 4. 输出极性可调 // // // @寄存器列表: // 地址 读写 默认 描述 // 0x00 wr 0x0 模式 0:同步输出 1:脉冲输出 // 0x01 wr 0x0 脉冲模式-脉冲触发方式 0:上升沿 1:下降沿触发 // 0x02 wr 0x0 脉冲模式-有效电平长度: 0~0xffffffff // 0x03 wr 0x0 输出极性 0:正极性 1:极性翻转 //
parameter ADD_NUM = 5; //寄存器数量
parameter REG_FUNC_ADD = REG_START_ADD + 0; //功能寄存器地址 parameter REG_PULSE_MODE_ADD = REG_START_ADD + 1; //脉冲模式寄存器地址 parameter REG_PULSE_MODE_RISE_FALL_ADD = REG_START_ADD + 2; //脉冲模式-脉冲触发方式寄存器地址 parameter REG_PULSE_MODE_VALID_LEN_ADD = REG_START_ADD + 3; //脉冲模式-有效电平长度寄存器地址 parameter REG_OUTPUT_POLARITY_ADD = REG_START_ADD + 4; //输出极性寄存器地址
reg ttl_origin_output; //ttl原始信号输出 wire ttl_after_process_output; //ttl处理后信号输出
assign signal_in_a = signal_in; //信号输入 reg signal_in_b = 0; //信号输入延迟一周期
/******************************************************************************* * 寄存器读写 * *******************************************************************************/ // parameter REG_END_ADD = REG_START_ADD + ADD_NUM - 1; //寄存器结束地址 // reg [31:0] register[REG_START_ADD:REG_END_ADD]; // integer i; // always @(posedge clk or negedge rst_n) begin // if (!rst_n) begin // for (i = 0; i < ADD_NUM; i = i + 1) begin // register[i] <= 0; // end // end else begin // if (wr_en && addr >= REG_START_ADD && addr <= REG_END_ADD) register[addr] <= wr_data; // end // end // assign rd_data = (addr >= REG_START_ADD && addr <= REG_END_ADD) ? register[addr] : 31'bz;
zutils_register #( .REG_START_ADD(REG_START_ADD), .ADD_NUM(5) ) _register ( .clk(clk), .rst_n(rst_n), .addr(addr), .wr_data(wr_data), .wr_en(wr_en), .rd_data(rd_data) );
// zutils_edge_detecter _signal_in ( // .clk(clk), // .rst_n(rst_n), // .signal_in(signal_in) // );
/******************************************************************************* * signal_a and signal_b * *******************************************************************************/ // signal_in 脉冲信号捕获 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin signal_in_b <= 0; end else begin signal_in_b <= signal_in_a; end end /******************************************************************************* * 脉冲模式输出 * *******************************************************************************/ // 电平计数 reg [31:0] signal_output_duration_cnt; assign signal_src_trigger = (_register.data[REG_PULSE_MODE_RISE_FALL_ADD] == 0) ? (signal_in_a & ~signal_in_b) : (~signal_in_a & signal_in_b); // 通过计数输出波形 assign ttl_after_process_output = (signal_output_duration_cnt < _register.data[REG_PULSE_MODE_VALID_LEN_ADD]) ? 1 : 0; // 脉冲计数 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin signal_output_duration_cnt <= 0; end else begin // 脉冲模式 if (_register.data[REG_FUNC_ADD] == 1) begin if (signal_src_trigger == 1) begin signal_output_duration_cnt <= 0; end else begin signal_output_duration_cnt <= signal_output_duration_cnt + 1; end end // 非脉冲模式 else begin signal_output_duration_cnt <= 0; end end end /******************************************************************************* * 信号输出控制 * *******************************************************************************/ reg ttloutput; always @(*) begin
case (_register.data[REG_FUNC_ADD]) 0: begin ttloutput = (_register.data[REG_OUTPUT_POLARITY_ADD][0] == 0) ? ttl_origin_output : !ttl_origin_output; end 1: begin ttloutput = (_register.data[REG_OUTPUT_POLARITY_ADD][0] == 0) ? ttl_after_process_output : !ttl_after_process_output; end default: ttloutput = 0; endcase end
endmodule
|