12 changed files with 341 additions and 393 deletions
-
BINACPGL22G核心板原理图.pdf
-
17README.md
-
164led_test.fdc
-
104led_test.pds
-
196source/src/des_ttl_generator.v
-
54source/src/top.v
-
25source/src/zutils/zutils_debug_led.v
-
48source/src/zutils/zutils_edge_detecter.v
-
29source/src/zutils/zutils_multiplexer_4t1.v
-
10source/src/zutils/zutils_pluse_generator.v
-
44source/src/zutils/zutils_register.v
-
43source/test/test_top.v
@ -0,0 +1,17 @@ |
|||
``` |
|||
核心板引脚分配: |
|||
|
|||
define_attribute {p:rst_n} {PAP_IO_DIRECTION} {INPUT} |
|||
define_attribute {p:rst_n} {PAP_IO_LOC} {U12} |
|||
define_attribute {p:rst_n} {PAP_IO_VCCIO} {3.3} |
|||
define_attribute {p:rst_n} {PAP_IO_STANDARD} {LVTTL33} |
|||
|
|||
define_attribute {p:sys_clk} {PAP_IO_DIRECTION} {INPUT} |
|||
define_attribute {p:sys_clk} {PAP_IO_LOC} {B5} |
|||
define_attribute {p:sys_clk} {PAP_IO_VCCIO} {3.3} |
|||
define_attribute {p:sys_clk} {PAP_IO_STANDARD} {LVTTL33} |
|||
|
|||
|
|||
|
|||
|
|||
``` |
@ -1,145 +1,105 @@ |
|||
// `include "zutils/zutils_edge_detecter.v" |
|||
// `include "zutils/zutils_pluse_generator.v" |
|||
// `include "zutils/zutils_register.v" |
|||
// |
|||
// @功能: |
|||
// 1. 功能:同步输出,脉冲输出 |
|||
// 2. 输出脉冲 |
|||
// 3. 输出脉冲时长可调 |
|||
// 4. 输出极性可调 |
|||
// |
|||
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, |
|||
//寄存器读写接口 |
|||
output [31:0] addr, |
|||
input [31:0] wr_data, |
|||
input wr_en, |
|||
inout wire [31:0] rd_data, |
|||
|
|||
inout wire [31:0] rd_data, //received serial data |
|||
// 输入 |
|||
input signal_in, |
|||
//输出 |
|||
output reg ttloutput //ttl原始数据 |
|||
input signal_in, //输入信号 |
|||
output 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; |
|||
|
|||
// |
|||
// 模式寄存器 |
|||
// [0] 0:同步输出 1:脉冲输出 |
|||
wire [31:0] reg_function; |
|||
|
|||
// |
|||
// 配置寄存器 |
|||
// [0] 脉冲输入时候触发信号 0:上升沿 1:下降沿触发 |
|||
// [1] 输出极性控制位 0:输出高电平 1:输出低电平 |
|||
// |
|||
wire [31:0] reg_config; |
|||
assign pluse_input_trigger_signal = reg_config[0]; |
|||
assign output_polarity = !reg_config[1]; |
|||
|
|||
zutils_register #( |
|||
.REG_START_ADD(REG_START_ADD), |
|||
.ADD_NUM(5) |
|||
// |
|||
// 脉冲模式-有效电平长度: |
|||
// 0~0xffffffff |
|||
// |
|||
wire [31:0] reg_pulse_mode_valid_len; // 脉冲模式-有效电平长度: 0~0xffffffff |
|||
|
|||
//脉冲输出 |
|||
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); |
|||
|
|||
zutils_register16 #( |
|||
.REG_START_ADD(REG_START_ADD) |
|||
) _register ( |
|||
.clk(clk), |
|||
.rst_n(rst_n), |
|||
.addr(addr), |
|||
.wr_data(wr_data), |
|||
.wr_en(wr_en), |
|||
.rd_data(rd_data) |
|||
.rd_data(rd_data), |
|||
.reg0(reg_function), |
|||
.reg1(reg_config), |
|||
.reg2(reg_pulse_mode_valid_len) |
|||
); |
|||
|
|||
// zutils_edge_detecter _signal_in ( |
|||
// .clk(clk), |
|||
// .rst_n(rst_n), |
|||
// .signal_in(signal_in) |
|||
// ); |
|||
zutils_edge_detecter _signal_in ( |
|||
.clk(clk), |
|||
.rst_n(rst_n), |
|||
.in_signal(signal_in), |
|||
.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), |
|||
.trigger(signal_src_trigger), |
|||
.output_signal(ttl_after_process_output) |
|||
); |
|||
|
|||
|
|||
/******************************************************************************* |
|||
* 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 |
|||
assign output_signal0 = (output_polarity == 1) ? signal_in : !signal_in; |
|||
assign output_signal1 = (output_polarity == 1) ? ttl_after_process_output : !ttl_after_process_output; |
|||
|
|||
zutils_multiplexer_4t1 multiplexer_4t1 ( |
|||
.chooseindex(reg_function), |
|||
.signal0(output_signal0), |
|||
.signal1(output_signal1), |
|||
.signal2(0), |
|||
.signal3(0), |
|||
.signalout(ttloutput) |
|||
); |
|||
|
|||
endmodule |
@ -0,0 +1,25 @@ |
|||
module zutils_debug_led #( |
|||
parameter PERIOD_COUNT = 1000000 |
|||
) ( |
|||
input clk, //clock input |
|||
input rst_n, //asynchronous reset input, low active |
|||
output reg debug_led |
|||
); |
|||
|
|||
reg [31:0] counter; |
|||
|
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
counter <= 0; |
|||
debug_led <= 1'b0; |
|||
end else begin |
|||
if (counter == PERIOD_COUNT - 1) begin |
|||
counter <= 0; |
|||
debug_led <= ~debug_led; |
|||
end else begin |
|||
counter <= counter + 1; |
|||
end |
|||
end |
|||
end |
|||
|
|||
endmodule |
@ -1,44 +1,44 @@ |
|||
module zutils_edge_detecter ( |
|||
input clk, //clock input |
|||
input rst_n, //asynchronous reset input, low active |
|||
input wire signal_in |
|||
|
|||
input wire in_signal, |
|||
output reg in_signal_last, |
|||
output reg in_signal_rising_edge, |
|||
output reg in_signal_falling_edge, |
|||
output reg in_signal_edge |
|||
); |
|||
|
|||
reg signal_in_last = 0; |
|||
assign now = signal_in; |
|||
assign last = signal_in_last; |
|||
|
|||
reg rsing_edge_signal; |
|||
reg falling_edge_signal; |
|||
reg edge_sginal; |
|||
// reg in_signal_rising_edge; |
|||
// reg in_signal_falling_edge; |
|||
// reg in_signal_edge; |
|||
|
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
signal_in_last <= 0; |
|||
in_signal_last <= 0; |
|||
end else begin |
|||
signal_in_last <= signal_in; |
|||
in_signal_last <= in_signal; |
|||
end |
|||
end |
|||
|
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
rsing_edge_signal <= 0; |
|||
falling_edge_signal <= 0; |
|||
edge_sginal <= 0; |
|||
in_signal_rising_edge <= 0; |
|||
in_signal_falling_edge <= 0; |
|||
in_signal_edge <= 0; |
|||
end else begin |
|||
if (signal_in_last == 0 && signal_in == 1) begin |
|||
rsing_edge_signal <= 1; |
|||
falling_edge_signal <= 0; |
|||
edge_sginal <= 1; |
|||
end else if (signal_in_last == 1 && signal_in == 0) begin |
|||
rsing_edge_signal <= 0; |
|||
falling_edge_signal <= 1; |
|||
edge_sginal <= 1; |
|||
if (in_signal_last == 0 && in_signal == 1) begin |
|||
in_signal_rising_edge <= 1; |
|||
in_signal_falling_edge <= 0; |
|||
in_signal_edge <= 1; |
|||
end else if (in_signal_last == 1 && in_signal == 0) begin |
|||
in_signal_rising_edge <= 0; |
|||
in_signal_falling_edge <= 1; |
|||
in_signal_edge <= 1; |
|||
end else begin |
|||
rsing_edge_signal <= 0; |
|||
falling_edge_signal <= 0; |
|||
edge_sginal <= 0; |
|||
in_signal_rising_edge <= 0; |
|||
in_signal_falling_edge <= 0; |
|||
in_signal_edge <= 0; |
|||
end |
|||
end |
|||
end |
|||
|
@ -0,0 +1,29 @@ |
|||
module zutils_multiplexer_4t1 ( |
|||
input [31:0] chooseindex, |
|||
input wire signal0, |
|||
input wire signal1, |
|||
input wire signal2, |
|||
input wire signal3, |
|||
output reg signalout |
|||
); |
|||
|
|||
always @(*) begin |
|||
case (chooseindex) |
|||
0: begin |
|||
signalout = signal0; |
|||
end |
|||
1: begin |
|||
signalout = signal1; |
|||
end |
|||
2: begin |
|||
signalout = signal2; |
|||
end |
|||
3: begin |
|||
signalout = signal3; |
|||
end |
|||
default: begin |
|||
signalout = 0; |
|||
end |
|||
endcase |
|||
end |
|||
endmodule |
Write
Preview
Loading…
Cancel
Save
Reference in new issue