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.
145 lines
5.3 KiB
145 lines
5.3 KiB
// `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
|