forked from p_lusterinc_xsync/xsync_fpge
11 changed files with 883 additions and 562 deletions
-
150led_test.pds
-
22source/src/config.v
-
105source/src/des_ttl_generator.v
-
152source/src/output/ttl_output.v
-
77source/src/rd_data_router.v
-
416source/src/src_timecode.v
-
232source/src/src_ttl_parser.v
-
156source/src/top.v
-
64source/src/zutils/zutils_multiplexer_16t1.v
-
28source/src/zutils/zutils_pwm_generator.v
-
43source/src/zutils/zutils_register.v
@ -0,0 +1,22 @@ |
|||||
|
//STM32寄存器地址 |
||||
|
`define REG_ADD_OFF_STM32 16'h0000 |
||||
|
`define REG_ADD_OFF_FPGA_TEST 16'h00020 |
||||
|
//控制中心寄存器地址 |
||||
|
`define REG_ADD_OFF_CONTROL_SENSOR 16'h00030 |
||||
|
//输入组件 |
||||
|
`define REG_ADD_OFF_TTLIN1 16'h0100 |
||||
|
`define REG_ADD_OFF_TTLIN2 16'h0110 |
||||
|
`define REG_ADD_OFF_TTLIN3 16'h0120 |
||||
|
`define REG_ADD_OFF_TTLIN4 16'h0130 |
||||
|
`define REG_ADD_OFF_TIMECODE_IN 16'h0140 |
||||
|
`define REG_ADD_OFF_GENLOCK_IN 16'h0150 |
||||
|
//输出组件 |
||||
|
`define REG_ADD_OFF_TTLOUT1 16'h0200 |
||||
|
`define REG_ADD_OFF_TTLOUT2 16'h0210 |
||||
|
`define REG_ADD_OFF_TTLOUT3 16'h0220 |
||||
|
`define REG_ADD_OFF_TTLOUT4 16'h0230 |
||||
|
`define REG_ADD_OFF_TIMECODE_OUT 16'h0240 |
||||
|
`define REG_ADD_OFF_GENLOCK_OUT 16'h0250 |
||||
|
`define REG_ADD_OFF_STM32_IF 16'h0260 |
||||
|
//调试组件 |
||||
|
`define REG_ADD_OFF_DEBUGER 16'h0300 |
@ -1,105 +0,0 @@ |
|||||
// |
|
||||
// @功能: |
|
||||
// 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 |
|
||||
|
|
||||
//寄存器读写接口 |
|
||||
output [31:0] addr, |
|
||||
input [31:0] wr_data, |
|
||||
input wr_en, |
|
||||
inout wire [31:0] rd_data, |
|
||||
|
|
||||
input signal_in, //输入信号 |
|
||||
output ttloutput //ttl输出信号 |
|
||||
); |
|
||||
|
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* 寄存器列表 * |
|
||||
*******************************************************************************/ |
|
||||
// |
|
||||
// 模式寄存器 |
|
||||
// [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]; |
|
||||
|
|
||||
// |
|
||||
// 脉冲模式-有效电平长度: |
|
||||
// 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), |
|
||||
.reg0(reg_function), |
|
||||
.reg1(reg_config), |
|
||||
.reg2(reg_pulse_mode_valid_len) |
|
||||
); |
|
||||
|
|
||||
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) |
|
||||
); |
|
||||
|
|
||||
|
|
||||
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,152 @@ |
|||||
|
// |
||||
|
// @功能: |
||||
|
// 1. 功能:同步输出,脉冲输出 |
||||
|
// 2. 输出脉冲 |
||||
|
// 3. 输出脉冲时长可调 |
||||
|
// 4. 输出极性可调 |
||||
|
// |
||||
|
module ttl_output #( |
||||
|
parameter REG_START_ADD = 0, |
||||
|
parameter TEST = 0 |
||||
|
) ( |
||||
|
input clk, //clock input |
||||
|
input rst_n, //asynchronous reset input, low active |
||||
|
|
||||
|
//寄存器读写接口 |
||||
|
output [31:0] addr, |
||||
|
input [31:0] wr_data, |
||||
|
input wr_en, |
||||
|
output wire [31:0] rd_data, |
||||
|
|
||||
|
input [7: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 |
||||
|
|
||||
|
|
||||
|
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) |
||||
|
); |
||||
|
|
||||
|
/******************************************************************************* |
||||
|
* 内部信号 * |
||||
|
*******************************************************************************/ |
||||
|
|
||||
|
//脉冲输出 |
||||
|
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_16t1 _signal_select ( |
||||
|
.chooseindex(reg_input_signal_select), |
||||
|
.signal({8'b0, 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), |
||||
|
.trigger(signal_src_trigger), |
||||
|
.output_signal(ttl_after_process_output) |
||||
|
); |
||||
|
|
||||
|
zutils_pwm_generator #( |
||||
|
.SYS_CLOCK_FREQ(50000000), |
||||
|
.OUTPUT_FREQ(1000) |
||||
|
) _test_signal_generator ( |
||||
|
.clk(clk), |
||||
|
.rst_n(rst_n), |
||||
|
.output_signal(test_signal_output) |
||||
|
); |
||||
|
|
||||
|
|
||||
|
zutils_multiplexer_16t1 _signal_output_select ( |
||||
|
.chooseindex(reg_output_signal_select), |
||||
|
.signal({ |
||||
|
8'b0, |
||||
|
/*7*/ 0, |
||||
|
/*6*/ 0, |
||||
|
/*5*/ ttl_after_process_output, |
||||
|
/*4*/ !ttl_after_process_output, |
||||
|
/*3*/ signal_in_choose, |
||||
|
/*2*/ test_signal_output, |
||||
|
/*1*/ 1, |
||||
|
/*0*/ 0 |
||||
|
}), |
||||
|
.signalout(ttloutput) |
||||
|
); |
||||
|
assign ttloutput_state_led = ttloutput; |
||||
|
|
||||
|
endmodule |
@ -0,0 +1,77 @@ |
|||||
|
`include "config.v" |
||||
|
/* |
||||
|
* Hacky baud rate generator to divide a 50MHz clock into a 115200 baud |
||||
|
* rx/tx pair where the rx clcken oversamples by 16x. |
||||
|
*/ |
||||
|
module rd_data_router ( |
||||
|
input [31:0] addr, |
||||
|
|
||||
|
input [31:0] stm32_rd_data, |
||||
|
input [31:0] fpga_test_rd_data, |
||||
|
input [31:0] control_sensor_rd_data, |
||||
|
input [31:0] ttlin1_rd_data, |
||||
|
input [31:0] ttlin2_rd_data, |
||||
|
input [31:0] ttlin3_rd_data, |
||||
|
input [31:0] ttlin4_rd_data, |
||||
|
input [31:0] timecode_in_rd_data, |
||||
|
input [31:0] genlock_in_rd_data, |
||||
|
input [31:0] ttlout1_rd_data, |
||||
|
input [31:0] ttlout2_rd_data, |
||||
|
input [31:0] ttlout3_rd_data, |
||||
|
input [31:0] ttlout4_rd_data, |
||||
|
input [31:0] timecode_out_rd_data, |
||||
|
input [31:0] genlock_out_rd_data, |
||||
|
input [31:0] stm32_if_rd_data, |
||||
|
input [31:0] debuger_rd_data, |
||||
|
|
||||
|
output reg [31:0] rd_data_out |
||||
|
); |
||||
|
|
||||
|
// //STM32寄存器地址 |
||||
|
// localparam REG_ADD_OFF_STM32 = 16'h0000; |
||||
|
// localparam REG_ADD_OFF_FPGA_TEST = 16'h00020; |
||||
|
// //控制中心寄存器地址 |
||||
|
// localparam REG_ADD_OFF_CONTROL_SENSOR = 16'h00030; |
||||
|
// //输入组件 |
||||
|
// localparam REG_ADD_OFF_TTLIN1 = 16'h0100; |
||||
|
// localparam REG_ADD_OFF_TTLIN2 = 16'h0110; |
||||
|
// localparam REG_ADD_OFF_TTLIN3 = 16'h0120; |
||||
|
// localparam REG_ADD_OFF_TTLIN4 = 16'h0130; |
||||
|
// localparam REG_ADD_OFF_TIMECODE_IN = 16'h0140; |
||||
|
// localparam REG_ADD_OFF_GENLOCK_IN = 16'h0150; |
||||
|
// //输出组件 |
||||
|
// localparam REG_ADD_OFF_TTLOUT1 = 16'h0200; |
||||
|
// localparam REG_ADD_OFF_TTLOUT2 = 16'h0210; |
||||
|
// localparam REG_ADD_OFF_TTLOUT3 = 16'h0220; |
||||
|
// localparam REG_ADD_OFF_TTLOUT4 = 16'h0230; |
||||
|
// localparam REG_ADD_OFF_TIMECODE_OUT = 16'h0240; |
||||
|
// localparam REG_ADD_OFF_GENLOCK_OUT = 16'h0250; |
||||
|
// localparam REG_ADD_OFF_STM32_IF = 16'h0260; |
||||
|
// //调试组件 |
||||
|
// localparam REG_ADD_OFF_DEBUGER = 16'h0300; |
||||
|
|
||||
|
|
||||
|
always @(*) begin |
||||
|
case (addr >> 8) |
||||
|
// `REG_ADD_OFF_STM32 >> 8: rd_data_out = stm32_rd_data; |
||||
|
// `REG_ADD_OFF_FPGA_TEST >> 8: rd_data_out = fpga_test_rd_data; |
||||
|
// `REG_ADD_OFF_CONTROL_SENSOR >> 8: rd_data_out = control_sensor_rd_data; |
||||
|
// `REG_ADD_OFF_TTLIN1 >> 8: rd_data_out = ttlin1_rd_data; |
||||
|
// `REG_ADD_OFF_TTLIN2 >> 8: rd_data_out = ttlin2_rd_data; |
||||
|
// `REG_ADD_OFF_TTLIN3 >> 8: rd_data_out = ttlin3_rd_data; |
||||
|
// `REG_ADD_OFF_TTLIN4 >> 8: rd_data_out = ttlin4_rd_data; |
||||
|
// `REG_ADD_OFF_TIMECODE_IN >> 8: rd_data_out = timecode_in_rd_data; |
||||
|
// `REG_ADD_OFF_GENLOCK_IN >> 8: rd_data_out = genlock_in_rd_data; |
||||
|
// `REG_ADD_OFF_TTLOUT1 >> 8: rd_data_out = ttlout1_rd_data; |
||||
|
// `REG_ADD_OFF_TTLOUT2 >> 8: rd_data_out = ttlout2_rd_data; |
||||
|
// `REG_ADD_OFF_TTLOUT3 >> 8: rd_data_out = ttlout3_rd_data; |
||||
|
// `REG_ADD_OFF_TTLOUT4 >> 8: rd_data_out = ttlout4_rd_data; |
||||
|
// `REG_ADD_OFF_TIMECODE_OUT >> 8: rd_data_out = timecode_out_rd_data; |
||||
|
// `REG_ADD_OFF_GENLOCK_OUT >> 8: rd_data_out = genlock_out_rd_data; |
||||
|
// `REG_ADD_OFF_STM32_IF >> 8: rd_data_out = stm32_if_rd_data; |
||||
|
// `REG_ADD_OFF_DEBUGER >> 8: rd_data_out = debuger_rd_data; |
||||
|
default: rd_data_out = 0; |
||||
|
endcase |
||||
|
end |
||||
|
|
||||
|
endmodule |
@ -1,208 +1,208 @@ |
|||||
module src_timecode_parser #( |
|
||||
parameter REG_START_ADD = 0 |
|
||||
) ( |
|
||||
input clk, //clock input |
|
||||
input rst_n, //asynchronous reset input, low active |
|
||||
|
|
||||
//regbus interface |
|
||||
output reg [31:0] addr, |
|
||||
input [31:0] wr_data, |
|
||||
input wr_en, |
|
||||
|
|
||||
inout wire [31:0] rd_data, //received serial data |
|
||||
// 输入 |
|
||||
input timecode_signal_in, |
|
||||
//输出 |
|
||||
output wire timecode_signal_orgin_output, //ttl原始数据 |
|
||||
output wire timecode_freq_trigger_signal |
|
||||
); |
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* 寄存器读写 * |
|
||||
*******************************************************************************/ |
|
||||
|
|
||||
// |
|
||||
// @功能: |
|
||||
// 1. 采样TIMECODE信号 |
|
||||
// 2. 转发TIMECODE信号 |
|
||||
// 3. TIMECODE信号成功解析 |
|
||||
// 4. TIMECODE采样计数 |
|
||||
// |
|
||||
// @寄存器列表: |
|
||||
// 地址 读写 默认 描述 |
|
||||
// 0x00 wr 0x0 timecode bit周期 |
|
||||
// 0x01 r 0x0 flag bit[0]:timecode_ready_flag |
|
||||
// 0x02 r 0x0 timecode [31:0] |
|
||||
// 0x03 r 0x0 timecode [63:32] |
|
||||
// 0x04 r 0x0 timecode_ready_signal_pluse_width //识别到一帧timecode信号后,输出一个脉冲信号,用于同步其他模块 |
|
||||
|
|
||||
parameter REG_TIMECODE_BIT_PERIOD_ADD = REG_START_ADD + 0; //timecode bit周期寄存器地址 |
|
||||
|
|
||||
|
|
||||
parameter ADD_NUM = 5; //寄存器数量 |
|
||||
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; |
|
||||
|
|
||||
|
|
||||
|
|
||||
// 416us 500us 520us |
|
||||
// 边沿触发--> 采样偏移同步 |
|
||||
// |
|
||||
|
|
||||
// 416us采用 160byte 采样到同步 |
|
||||
// 电平变化修正采样计数 |
|
||||
|
|
||||
// |
|
||||
// 配置: |
|
||||
// 1. 制式 |
|
||||
// 2. |
|
||||
|
|
||||
// 边沿信号捕获 |
|
||||
|
|
||||
|
|
||||
reg [160-1:0] tc_bit_2x; //timecode 每1/2bit |
|
||||
reg [79:0] tc_bit; //timecode 每1bit |
|
||||
reg sample_signal; //采样信号 |
|
||||
reg [31:0] sample_time_cnt; //采样计数 |
|
||||
wire sample_time_calibrate_signal; //采样信号修正器 |
|
||||
reg time_code_signal_edge; //timecode原始信号的边沿信号,即timecode上升沿或者下降沿时,置1 |
|
||||
assign timecode_signal_in_a = timecode_signal_in; // |
|
||||
reg timecode_signal_in_b; // |
|
||||
reg tc_sync_signal_edge; // timecode捕获到同步信号时,置1,此时可以解析timecode信号,并将其存放到寄存中 |
|
||||
|
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* timecode边沿信号捕获 * |
|
||||
*******************************************************************************/ |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
timecode_signal_in_b <= 0; |
|
||||
end else begin |
|
||||
timecode_signal_in_b <= timecode_signal_in_a; |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
time_code_signal_edge <= 0; |
|
||||
end else begin |
|
||||
if (timecode_signal_in_a != timecode_signal_in_b) begin |
|
||||
time_code_signal_edge <= 1; |
|
||||
end else begin |
|
||||
time_code_signal_edge <= 0; |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
assign sample_time_calibrate_signal = time_code_signal_edge; |
|
||||
|
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* BIT信号映射 * |
|
||||
*******************************************************************************/ |
|
||||
// |
|
||||
// 采样点 采样点 采样点 采样点 |
|
||||
// + + + + |
|
||||
// ___------------_______-------- |
|
||||
// 0 1 |
|
||||
// timecode的每个bit要通过两个点进行判断,所以需要2x的采样率 |
|
||||
// |
|
||||
always @(*) begin |
|
||||
for (i = 0; i < 79; i = i + 1) begin |
|
||||
tc_bit[i] = !tc_bit_2x[i*2] & tc_bit_2x[i*2+1]; |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* 采样信号生成器 * |
|
||||
*******************************************************************************/ |
|
||||
// |
|
||||
// 1. 当捕获到timecode原始信号的边沿时,校准采样信号计数器 |
|
||||
// 2. 当采样信号计数器到达采样点时,输出采样信号 |
|
||||
// 3. 当采样信号计数器到达2倍采样点时,重置采样信号计数器 |
|
||||
// |
|
||||
assign timecode_sample_cnt_reset_signal = ( |
|
||||
sample_time_calibrate_signal|| |
|
||||
sample_time_cnt >= (register[REG_TIMECODE_BIT_PERIOD_ADD] << 1) |
|
||||
); |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
sample_time_cnt <= 0; |
|
||||
sample_signal <= 0; |
|
||||
end else begin |
|
||||
if (timecode_sample_cnt_reset_signal) begin |
|
||||
sample_time_cnt <= 0; |
|
||||
sample_signal <= 0; |
|
||||
end else if (sample_time_cnt == register[REG_TIMECODE_BIT_PERIOD_ADD]) begin |
|
||||
sample_time_cnt <= sample_time_cnt + 1; |
|
||||
sample_signal <= 1; |
|
||||
end else begin |
|
||||
sample_time_cnt <= sample_time_cnt + 1; |
|
||||
sample_signal <= 0; |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
// |
|
||||
// 根据sample_signal捕获timecode信号 |
|
||||
// |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
tc_bit_2x <= 0; |
|
||||
end else begin |
|
||||
if (sample_signal) begin |
|
||||
tc_bit_2x <= {tc_bit_2x[158:0], timecode_signal_in}; |
|
||||
end else begin |
|
||||
tc_bit_2x <= tc_bit_2x; |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* tc_sync_signal_edge * |
|
||||
*******************************************************************************/ |
|
||||
// ___------------_______-------- |
|
||||
// 0 1 |
|
||||
// |
|
||||
// 捕获timecode同步信号 |
|
||||
// |
|
||||
// 同步信号 |
|
||||
// 0011_1111_11111_1101 |
|
||||
// 1111_0101__0101_0101__0101_0101__0101_1101 |
|
||||
// |
|
||||
reg [31:0] sync_code_pattern = 32'b1111_0101__0101_0101__0101_0101__0101_1101; |
|
||||
assign tc_sync_signal = (tc_bit == sync_code_pattern); |
|
||||
reg tc_sync_signal_b; |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
tc_sync_signal_b <= 0; |
|
||||
end else begin |
|
||||
tc_sync_signal_b <= tc_sync_signal; |
|
||||
|
|
||||
if (tc_sync_signal & !tc_sync_signal_b) begin |
|
||||
tc_sync_signal_edge <= 1; |
|
||||
end else begin |
|
||||
tc_sync_signal_edge <= 0; |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
assign timecode_freq_trigger_signal = tc_sync_signal_edge; |
|
||||
|
|
||||
|
|
||||
|
|
||||
endmodule |
|
||||
|
// module src_timecode_parser #( |
||||
|
// parameter REG_START_ADD = 0 |
||||
|
// ) ( |
||||
|
// input clk, //clock input |
||||
|
// input rst_n, //asynchronous reset input, low active |
||||
|
|
||||
|
// //regbus interface |
||||
|
// output reg [31:0] addr, |
||||
|
// input [31:0] wr_data, |
||||
|
// input wr_en, |
||||
|
|
||||
|
// inout wire [31:0] rd_data, //received serial data |
||||
|
// // 输入 |
||||
|
// input timecode_signal_in, |
||||
|
// //输出 |
||||
|
// output wire timecode_signal_orgin_output, //ttl原始数据 |
||||
|
// output wire timecode_freq_trigger_signal |
||||
|
// ); |
||||
|
|
||||
|
// /******************************************************************************* |
||||
|
// * 寄存器读写 * |
||||
|
// *******************************************************************************/ |
||||
|
|
||||
|
// // |
||||
|
// // @功能: |
||||
|
// // 1. 采样TIMECODE信号 |
||||
|
// // 2. 转发TIMECODE信号 |
||||
|
// // 3. TIMECODE信号成功解析 |
||||
|
// // 4. TIMECODE采样计数 |
||||
|
// // |
||||
|
// // @寄存器列表: |
||||
|
// // 地址 读写 默认 描述 |
||||
|
// // 0x00 wr 0x0 timecode bit周期 |
||||
|
// // 0x01 r 0x0 flag bit[0]:timecode_ready_flag |
||||
|
// // 0x02 r 0x0 timecode [31:0] |
||||
|
// // 0x03 r 0x0 timecode [63:32] |
||||
|
// // 0x04 r 0x0 timecode_ready_signal_pluse_width //识别到一帧timecode信号后,输出一个脉冲信号,用于同步其他模块 |
||||
|
|
||||
|
// parameter REG_TIMECODE_BIT_PERIOD_ADD = REG_START_ADD + 0; //timecode bit周期寄存器地址 |
||||
|
|
||||
|
|
||||
|
// parameter ADD_NUM = 5; //寄存器数量 |
||||
|
// 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; |
||||
|
|
||||
|
|
||||
|
|
||||
|
// // 416us 500us 520us |
||||
|
// // 边沿触发--> 采样偏移同步 |
||||
|
// // |
||||
|
|
||||
|
// // 416us采用 160byte 采样到同步 |
||||
|
// // 电平变化修正采样计数 |
||||
|
|
||||
|
// // |
||||
|
// // 配置: |
||||
|
// // 1. 制式 |
||||
|
// // 2. |
||||
|
|
||||
|
// // 边沿信号捕获 |
||||
|
|
||||
|
|
||||
|
// reg [160-1:0] tc_bit_2x; //timecode 每1/2bit |
||||
|
// reg [79:0] tc_bit; //timecode 每1bit |
||||
|
// reg sample_signal; //采样信号 |
||||
|
// reg [31:0] sample_time_cnt; //采样计数 |
||||
|
// wire sample_time_calibrate_signal; //采样信号修正器 |
||||
|
// reg time_code_signal_edge; //timecode原始信号的边沿信号,即timecode上升沿或者下降沿时,置1 |
||||
|
// assign timecode_signal_in_a = timecode_signal_in; // |
||||
|
// reg timecode_signal_in_b; // |
||||
|
// reg tc_sync_signal_edge; // timecode捕获到同步信号时,置1,此时可以解析timecode信号,并将其存放到寄存中 |
||||
|
|
||||
|
|
||||
|
// /******************************************************************************* |
||||
|
// * timecode边沿信号捕获 * |
||||
|
// *******************************************************************************/ |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// timecode_signal_in_b <= 0; |
||||
|
// end else begin |
||||
|
// timecode_signal_in_b <= timecode_signal_in_a; |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// time_code_signal_edge <= 0; |
||||
|
// end else begin |
||||
|
// if (timecode_signal_in_a != timecode_signal_in_b) begin |
||||
|
// time_code_signal_edge <= 1; |
||||
|
// end else begin |
||||
|
// time_code_signal_edge <= 0; |
||||
|
// end |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
|
// assign sample_time_calibrate_signal = time_code_signal_edge; |
||||
|
|
||||
|
|
||||
|
// /******************************************************************************* |
||||
|
// * BIT信号映射 * |
||||
|
// *******************************************************************************/ |
||||
|
// // |
||||
|
// // 采样点 采样点 采样点 采样点 |
||||
|
// // + + + + |
||||
|
// // ___------------_______-------- |
||||
|
// // 0 1 |
||||
|
// // timecode的每个bit要通过两个点进行判断,所以需要2x的采样率 |
||||
|
// // |
||||
|
// always @(*) begin |
||||
|
// for (i = 0; i < 79; i = i + 1) begin |
||||
|
// tc_bit[i] = !tc_bit_2x[i*2] & tc_bit_2x[i*2+1]; |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
|
// /******************************************************************************* |
||||
|
// * 采样信号生成器 * |
||||
|
// *******************************************************************************/ |
||||
|
// // |
||||
|
// // 1. 当捕获到timecode原始信号的边沿时,校准采样信号计数器 |
||||
|
// // 2. 当采样信号计数器到达采样点时,输出采样信号 |
||||
|
// // 3. 当采样信号计数器到达2倍采样点时,重置采样信号计数器 |
||||
|
// // |
||||
|
// assign timecode_sample_cnt_reset_signal = ( |
||||
|
// sample_time_calibrate_signal|| |
||||
|
// sample_time_cnt >= (register[REG_TIMECODE_BIT_PERIOD_ADD] << 1) |
||||
|
// ); |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// sample_time_cnt <= 0; |
||||
|
// sample_signal <= 0; |
||||
|
// end else begin |
||||
|
// if (timecode_sample_cnt_reset_signal) begin |
||||
|
// sample_time_cnt <= 0; |
||||
|
// sample_signal <= 0; |
||||
|
// end else if (sample_time_cnt == register[REG_TIMECODE_BIT_PERIOD_ADD]) begin |
||||
|
// sample_time_cnt <= sample_time_cnt + 1; |
||||
|
// sample_signal <= 1; |
||||
|
// end else begin |
||||
|
// sample_time_cnt <= sample_time_cnt + 1; |
||||
|
// sample_signal <= 0; |
||||
|
// end |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
|
// // |
||||
|
// // 根据sample_signal捕获timecode信号 |
||||
|
// // |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// tc_bit_2x <= 0; |
||||
|
// end else begin |
||||
|
// if (sample_signal) begin |
||||
|
// tc_bit_2x <= {tc_bit_2x[158:0], timecode_signal_in}; |
||||
|
// end else begin |
||||
|
// tc_bit_2x <= tc_bit_2x; |
||||
|
// end |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
|
// /******************************************************************************* |
||||
|
// * tc_sync_signal_edge * |
||||
|
// *******************************************************************************/ |
||||
|
// // ___------------_______-------- |
||||
|
// // 0 1 |
||||
|
// // |
||||
|
// // 捕获timecode同步信号 |
||||
|
// // |
||||
|
// // 同步信号 |
||||
|
// // 0011_1111_11111_1101 |
||||
|
// // 1111_0101__0101_0101__0101_0101__0101_1101 |
||||
|
// // |
||||
|
// reg [31:0] sync_code_pattern = 32'b1111_0101__0101_0101__0101_0101__0101_1101; |
||||
|
// assign tc_sync_signal = (tc_bit == sync_code_pattern); |
||||
|
// reg tc_sync_signal_b; |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// tc_sync_signal_b <= 0; |
||||
|
// end else begin |
||||
|
// tc_sync_signal_b <= tc_sync_signal; |
||||
|
|
||||
|
// if (tc_sync_signal & !tc_sync_signal_b) begin |
||||
|
// tc_sync_signal_edge <= 1; |
||||
|
// end else begin |
||||
|
// tc_sync_signal_edge <= 0; |
||||
|
// end |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
// assign timecode_freq_trigger_signal = tc_sync_signal_edge; |
||||
|
|
||||
|
|
||||
|
|
||||
|
// endmodule |
@ -1,131 +1,131 @@ |
|||||
module src_ttl_parser #( |
|
||||
parameter REG_START_ADD = 0 |
|
||||
) ( |
|
||||
input clk, //clock input |
|
||||
input rst_n, //asynchronous reset input, low active |
|
||||
|
// module src_ttl_parser #( |
||||
|
// parameter REG_START_ADD = 0 |
||||
|
// ) ( |
||||
|
// input clk, //clock input |
||||
|
// input rst_n, //asynchronous reset input, low active |
||||
|
|
||||
//regbus interface |
|
||||
output reg [31:0] addr, |
|
||||
input [31:0] wr_data, |
|
||||
input wr_en, |
|
||||
|
// //regbus interface |
||||
|
// output reg [31:0] addr, |
||||
|
// input [31:0] wr_data, |
||||
|
// input wr_en, |
||||
|
|
||||
inout wire [31:0] rd_data, //received serial data |
|
||||
// 输入 |
|
||||
input ttlin, |
|
||||
//输出 |
|
||||
output wire ttl_output //ttl原始数据 |
|
||||
); |
|
||||
// |
|
||||
// @功能: |
|
||||
// 1. 计算ttl频率 |
|
||||
// 2. 转发ttl信号 |
|
||||
// 3. 分频倍频 |
|
||||
// |
|
||||
// @寄存器列表: |
|
||||
// 地址 读写 默认 描述 |
|
||||
// 0x00 r 0x0 function 0:原始信号输出 1:频率信号源 |
|
||||
// 0x01 r 0x0 freq //一个周期的计数,单位为 1/50M s |
|
||||
// 0x02 wr 0x0 pll_mul //暂不支持 |
|
||||
// 0x03 wr 0x0 pll_div |
|
||||
// 0x04 wr 0x0 [0]:信号源是上升沿触发,还是下降沿触发 |
|
||||
// |
|
||||
|
// inout wire [31:0] rd_data, //received serial data |
||||
|
// // 输入 |
||||
|
// input ttlin, |
||||
|
// //输出 |
||||
|
// output wire ttl_output //ttl原始数据 |
||||
|
// ); |
||||
|
// // |
||||
|
// // @功能: |
||||
|
// // 1. 计算ttl频率 |
||||
|
// // 2. 转发ttl信号 |
||||
|
// // 3. 分频倍频 |
||||
|
// // |
||||
|
// // @寄存器列表: |
||||
|
// // 地址 读写 默认 描述 |
||||
|
// // 0x00 r 0x0 function 0:原始信号输出 1:频率信号源 |
||||
|
// // 0x01 r 0x0 freq //一个周期的计数,单位为 1/50M s |
||||
|
// // 0x02 wr 0x0 pll_mul //暂不支持 |
||||
|
// // 0x03 wr 0x0 pll_div |
||||
|
// // 0x04 wr 0x0 [0]:信号源是上升沿触发,还是下降沿触发 |
||||
|
// // |
||||
|
|
||||
|
|
||||
reg ttl_origin_output; //ttl原始信号输出 |
|
||||
reg ttl_after_process_output; //ttl处理后信号输出 |
|
||||
|
// reg ttl_origin_output; //ttl原始信号输出 |
||||
|
// reg ttl_after_process_output; //ttl处理后信号输出 |
||||
|
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* 寄存器读写 * |
|
||||
*******************************************************************************/ |
|
||||
|
// /******************************************************************************* |
||||
|
// * 寄存器读写 * |
||||
|
// *******************************************************************************/ |
||||
|
|
||||
parameter ADD_NUM = 5; //寄存器数量 |
|
||||
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; |
|
||||
|
// parameter ADD_NUM = 5; //寄存器数量 |
||||
|
// 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; |
||||
|
|
||||
parameter REG_FUNC_ADD = REG_START_ADD + 0; |
|
||||
parameter REG_FREQ_ADD = REG_START_ADD + 1; |
|
||||
parameter REG_PLL_MUL_ADD = REG_START_ADD + 2; |
|
||||
parameter REG_PLL_DIV_ADD = REG_START_ADD + 3; |
|
||||
parameter REG_TTL_EDGE_ADD = REG_START_ADD + 4; |
|
||||
|
// parameter REG_FUNC_ADD = REG_START_ADD + 0; |
||||
|
// parameter REG_FREQ_ADD = REG_START_ADD + 1; |
||||
|
// parameter REG_PLL_MUL_ADD = REG_START_ADD + 2; |
||||
|
// parameter REG_PLL_DIV_ADD = REG_START_ADD + 3; |
||||
|
// parameter REG_TTL_EDGE_ADD = REG_START_ADD + 4; |
||||
|
|
||||
/******************************************************************************* |
|
||||
* ttl输出路径选择 * |
|
||||
*******************************************************************************/ |
|
||||
|
// /******************************************************************************* |
||||
|
// * ttl输出路径选择 * |
||||
|
// *******************************************************************************/ |
||||
|
|
||||
assign ttl_output = (register[REG_FUNC_ADD] == 0) ? ttl_origin_output : ttl_after_process_output; |
|
||||
|
// assign ttl_output = (register[REG_FUNC_ADD] == 0) ? ttl_origin_output : ttl_after_process_output; |
||||
|
|
||||
/******************************************************************************* |
|
||||
* 原始信号输出 * |
|
||||
*******************************************************************************/ |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
ttl_origin_output <= 0; |
|
||||
end else begin |
|
||||
ttl_origin_output <= ttlin; |
|
||||
end |
|
||||
end |
|
||||
|
// /******************************************************************************* |
||||
|
// * 原始信号输出 * |
||||
|
// *******************************************************************************/ |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// ttl_origin_output <= 0; |
||||
|
// end else begin |
||||
|
// ttl_origin_output <= ttlin; |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
/******************************************************************************* |
|
||||
* ttl_in_last信号捕获 * |
|
||||
*******************************************************************************/ |
|
||||
reg ttl_in_last; |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
ttl_in_last <= 0; |
|
||||
end else begin |
|
||||
ttl_in_last <= ttlin; |
|
||||
end |
|
||||
end |
|
||||
|
// /******************************************************************************* |
||||
|
// * ttl_in_last信号捕获 * |
||||
|
// *******************************************************************************/ |
||||
|
// reg ttl_in_last; |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// ttl_in_last <= 0; |
||||
|
// end else begin |
||||
|
// ttl_in_last <= ttlin; |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
|
|
||||
/******************************************************************************* |
|
||||
* 频率探测 * |
|
||||
*******************************************************************************/ |
|
||||
reg [31:0] ttl_freq_cnt; |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
ttl_freq_cnt <= 0; |
|
||||
end else begin |
|
||||
if (ttlin && !ttl_in_last) begin |
|
||||
register[REG_FREQ_ADD] <= ttl_freq_cnt; |
|
||||
ttl_freq_cnt <= 0; |
|
||||
end |
|
||||
if (ttl_freq_cnt != 32'hffff_ffff_ffff_ffff) begin |
|
||||
ttl_freq_cnt <= ttl_freq_cnt + 1; |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
|
// /******************************************************************************* |
||||
|
// * 频率探测 * |
||||
|
// *******************************************************************************/ |
||||
|
// reg [31:0] ttl_freq_cnt; |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// ttl_freq_cnt <= 0; |
||||
|
// end else begin |
||||
|
// if (ttlin && !ttl_in_last) begin |
||||
|
// register[REG_FREQ_ADD] <= ttl_freq_cnt; |
||||
|
// ttl_freq_cnt <= 0; |
||||
|
// end |
||||
|
// if (ttl_freq_cnt != 32'hffff_ffff_ffff_ffff) begin |
||||
|
// ttl_freq_cnt <= ttl_freq_cnt + 1; |
||||
|
// end |
||||
|
// end |
||||
|
// end |
||||
|
|
||||
/******************************************************************************* |
|
||||
* 分频 * |
|
||||
*******************************************************************************/ |
|
||||
reg [31:0] ttl_in_cnt; |
|
||||
always @(posedge clk or negedge rst_n) begin |
|
||||
if (!rst_n) begin |
|
||||
ttl_in_cnt <= 0; |
|
||||
end else begin |
|
||||
if (ttlin && !ttl_in_last) begin |
|
||||
if (ttl_in_cnt <= register[REG_PLL_MUL_ADD]) begin |
|
||||
ttl_in_cnt <= ttl_in_cnt + 1; |
|
||||
end else begin |
|
||||
ttl_in_cnt <= 0; |
|
||||
ttl_after_process_output <= 1; |
|
||||
end |
|
||||
end else begin |
|
||||
ttl_after_process_output <= 0; |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
endmodule |
|
||||
|
// /******************************************************************************* |
||||
|
// * 分频 * |
||||
|
// *******************************************************************************/ |
||||
|
// reg [31:0] ttl_in_cnt; |
||||
|
// always @(posedge clk or negedge rst_n) begin |
||||
|
// if (!rst_n) begin |
||||
|
// ttl_in_cnt <= 0; |
||||
|
// end else begin |
||||
|
// if (ttlin && !ttl_in_last) begin |
||||
|
// if (ttl_in_cnt <= register[REG_PLL_MUL_ADD]) begin |
||||
|
// ttl_in_cnt <= ttl_in_cnt + 1; |
||||
|
// end else begin |
||||
|
// ttl_in_cnt <= 0; |
||||
|
// ttl_after_process_output <= 1; |
||||
|
// end |
||||
|
// end else begin |
||||
|
// ttl_after_process_output <= 0; |
||||
|
// end |
||||
|
// end |
||||
|
// end |
||||
|
// endmodule |
@ -0,0 +1,64 @@ |
|||||
|
module zutils_multiplexer_16t1 ( |
||||
|
input [31:0] chooseindex, |
||||
|
input wire [15:0] signal, |
||||
|
output reg signalout |
||||
|
); |
||||
|
|
||||
|
always @(*) begin |
||||
|
case (chooseindex) |
||||
|
0: begin |
||||
|
signalout = signal[0]; |
||||
|
end |
||||
|
1: begin |
||||
|
signalout = signal[1]; |
||||
|
end |
||||
|
2: begin |
||||
|
signalout = signal[2]; |
||||
|
end |
||||
|
3: begin |
||||
|
signalout = signal[3]; |
||||
|
end |
||||
|
4: begin |
||||
|
signalout = signal[4]; |
||||
|
end |
||||
|
5: begin |
||||
|
signalout = signal[5]; |
||||
|
end |
||||
|
6: begin |
||||
|
signalout = signal[6]; |
||||
|
end |
||||
|
7: begin |
||||
|
signalout = signal[7]; |
||||
|
end |
||||
|
8: begin |
||||
|
signalout = signal[8]; |
||||
|
end |
||||
|
9: begin |
||||
|
signalout = signal[9]; |
||||
|
end |
||||
|
10: begin |
||||
|
signalout = signal[10]; |
||||
|
end |
||||
|
11: begin |
||||
|
signalout = signal[11]; |
||||
|
end |
||||
|
12: begin |
||||
|
signalout = signal[12]; |
||||
|
end |
||||
|
13: begin |
||||
|
signalout = signal[13]; |
||||
|
end |
||||
|
14: begin |
||||
|
signalout = signal[14]; |
||||
|
end |
||||
|
15: begin |
||||
|
signalout = signal[15]; |
||||
|
end |
||||
|
default: begin |
||||
|
signalout = 0; |
||||
|
end |
||||
|
endcase |
||||
|
end |
||||
|
|
||||
|
|
||||
|
endmodule |
@ -0,0 +1,28 @@ |
|||||
|
module zutils_pwm_generator #( |
||||
|
parameter SYS_CLOCK_FREQ = 50000000, |
||||
|
parameter OUTPUT_FREQ = 1000 |
||||
|
) ( |
||||
|
input clk, |
||||
|
input rst_n, |
||||
|
output reg output_signal |
||||
|
|
||||
|
); |
||||
|
|
||||
|
localparam COUNT = SYS_CLOCK_FREQ / OUTPUT_FREQ; |
||||
|
reg [31:0] counter = 0; |
||||
|
|
||||
|
always @(posedge clk or negedge rst_n) begin |
||||
|
if (!rst_n) begin |
||||
|
counter <= 0; |
||||
|
output_signal <= 0; |
||||
|
end else begin |
||||
|
if (counter == 0) begin |
||||
|
counter <= COUNT - 1; |
||||
|
output_signal <= 1; |
||||
|
end else begin |
||||
|
counter <= counter - 1; |
||||
|
output_signal <= 0; |
||||
|
end |
||||
|
end |
||||
|
end |
||||
|
endmodule |
Write
Preview
Loading…
Cancel
Save
Reference in new issue