forked from p_lusterinc_xsync/xsync_fpge
10 changed files with 611 additions and 92 deletions
-
118led_test.pds
-
3source/src/config.v
-
69source/src/input/genlock_input_module.v
-
3source/src/input/ttl_input.v
-
117source/src/internal/internal_clock_generator.v
-
116source/src/internal/internal_genlock_generator.v
-
3source/src/output/ttl_output.v
-
116source/src/sys/sys_clock.v
-
81source/src/sys/sys_genlock.v
-
77source/src/top.v
@ -0,0 +1,69 @@ |
|||
`include "../config.v" |
|||
module genlock_input_module #( |
|||
parameter REG_START_ADD = 0, |
|||
parameter SYS_CLOCK_FREQ = 10000000 |
|||
) ( |
|||
|
|||
input clk, //! 时钟输入 |
|||
input rst_n, //! 复位输入 |
|||
|
|||
input [31:0] addr, //! 寄存器地址 |
|||
input [31:0] wr_data, //! 写入数据 |
|||
input wr_en, //! 写使能 |
|||
output wire [31:0] rd_data, //! 读出数据 |
|||
|
|||
input genlock_in_hsync, //! genlock hsync |
|||
input genlock_in_vsync, //! genlock vsync |
|||
input genlock_in_fsync, //! genlock fsync |
|||
|
|||
output genlock_freq_signal, //! genlock freq signal |
|||
output genlock_in_state_led |
|||
|
|||
|
|||
); |
|||
|
|||
reg [31:0] r1_genlock_freq_detect_bias; |
|||
reg [31:0] r2_genlock_freq; |
|||
|
|||
wire [31:0] reg_wr_index; |
|||
zutils_register_advanced #( |
|||
.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), |
|||
.reg1 (r1_genlock_freq_detect_bias), |
|||
.reg2 (r2_genlock_freq), |
|||
.reg_wr_sig(reg_wr_sig), |
|||
.reg_index (reg_wr_index) |
|||
); |
|||
|
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
r1_genlock_freq_detect_bias <= `FREQ_DETECT_BIAS_DEFAULT; |
|||
end else begin |
|||
if (reg_wr_sig) begin |
|||
case (reg_wr_index) |
|||
1: r1_genlock_freq_detect_bias <= wr_data; |
|||
default: begin |
|||
end |
|||
endcase |
|||
end |
|||
end |
|||
end |
|||
|
|||
zutils_freq_detector_v2 freq_detector1 ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.freq_detect_bias(r1_genlock_freq_detect_bias), |
|||
.pluse_input (ttlin1_sig_af_filter), |
|||
.pluse_width_cnt (r2_genlock_freq) |
|||
); |
|||
|
|||
assign genlock_freq_signal = genlock_in_hsync; |
|||
assign genlock_in_state_led = 1; |
|||
|
|||
endmodule |
@ -0,0 +1,117 @@ |
|||
`include "../config.v" |
|||
module internal_clock_generator #( |
|||
parameter REG_START_ADD = 0, |
|||
parameter SYS_CLOCK_FREQ = 10000000 |
|||
) ( |
|||
|
|||
input clk, //! 时钟输入 |
|||
input rst_n, //! 复位输入 |
|||
|
|||
input [31:0] addr, //! 寄存器地址 |
|||
input [31:0] wr_data, //! 写入数据 |
|||
input wr_en, //! 写使能 |
|||
output wire [31:0] rd_data, //! 读出数据 |
|||
|
|||
output clk_output //! 输出频率 |
|||
|
|||
); |
|||
|
|||
reg [31:0] r1_contrl_mode; //! 控制模式,目前未使用 |
|||
reg [31:0] r2_en; //!使能控制 |
|||
reg [31:0] r3_setting_cnt; //!格式 |
|||
wire [31:0] r4_detect_freq; //!输出频率探测 |
|||
|
|||
wire [31:0] reg_wr_index; |
|||
zutils_register_advanced #( |
|||
.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), |
|||
.reg1 (r1_contrl_mode), |
|||
.reg2 (r2_en), |
|||
.reg3 (r3_setting_cnt), |
|||
.reg4 (r4_detect_freq), |
|||
.reg_wr_sig(reg_wr_sig), |
|||
.reg_index (reg_wr_index) |
|||
); |
|||
|
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
r1_contrl_mode <= 0; |
|||
r2_en <= 1; |
|||
r3_setting_cnt <= 0; |
|||
end else begin |
|||
if (reg_wr_sig) begin |
|||
case (reg_wr_index) |
|||
1: r1_contrl_mode <= wr_data; |
|||
2: r2_en <= wr_data; |
|||
3: r3_setting_cnt <= wr_data; |
|||
default: begin |
|||
end |
|||
endcase |
|||
end |
|||
end |
|||
end |
|||
|
|||
|
|||
reg state; |
|||
reg [31:0] cnt; |
|||
reg clk_sig; |
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
state <= 0; |
|||
clk_sig <= 0; |
|||
cnt <= 0; |
|||
end else begin |
|||
case (state) |
|||
0: begin |
|||
cnt <= 0; |
|||
clk_sig <= 0; |
|||
|
|||
if (r2_en[0]) begin |
|||
state <= 1; |
|||
clk_sig <= 1; |
|||
end |
|||
|
|||
end |
|||
1: begin |
|||
if (!r2_en[0]) begin |
|||
state <= 0; |
|||
end else begin |
|||
if (cnt < (r3_setting_cnt >> 1)) begin |
|||
cnt <= cnt + 1; |
|||
clk_sig <= 1; |
|||
end else if (cnt >= (r3_setting_cnt >> 1) && cnt < r3_setting_cnt) begin |
|||
cnt <= cnt + 1; |
|||
clk_sig <= 0; |
|||
end else begin |
|||
cnt <= 0; |
|||
clk_sig <= 1; |
|||
end |
|||
end |
|||
end |
|||
endcase |
|||
end |
|||
end |
|||
|
|||
|
|||
|
|||
zutils_freq_detector_v2 freq_detector1 ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.freq_detect_bias(1), |
|||
.pluse_input (clk_sig), |
|||
.pluse_width_cnt (r4_detect_freq) |
|||
); |
|||
|
|||
assign clk_output = clk_sig; |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
endmodule |
@ -0,0 +1,116 @@ |
|||
`include "../config.v" |
|||
module internal_genlock_generator #( |
|||
parameter REG_START_ADD = 0, |
|||
parameter SYS_CLOCK_FREQ = 10000000 |
|||
) ( |
|||
|
|||
input clk, //! 时钟输入 |
|||
input rst_n, //! 复位输入 |
|||
|
|||
input [31:0] addr, //! 寄存器地址 |
|||
input [31:0] wr_data, //! 写入数据 |
|||
input wr_en, //! 写使能 |
|||
output wire [31:0] rd_data, //! 读出数据 |
|||
|
|||
output genlock_freq_signal //! genlock freq signal |
|||
|
|||
); |
|||
|
|||
reg [31:0] r1_contrl_mode; //! 控制模式,目前未使用 |
|||
reg [31:0] r2_en; //!使能控制 |
|||
reg [31:0] r3_format; //!格式 |
|||
wire [31:0] r4_detect_freq; //!输出频率探测 |
|||
|
|||
wire [31:0] reg_wr_index; |
|||
zutils_register_advanced #( |
|||
.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), |
|||
.reg1 (r1_contrl_mode), |
|||
.reg2 (r2_en), |
|||
.reg3 (r3_format), |
|||
.reg4 (r4_detect_freq), |
|||
.reg_wr_sig(reg_wr_sig), |
|||
.reg_index (reg_wr_index) |
|||
); |
|||
|
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
r1_contrl_mode <= 0; |
|||
r2_en <= 1; |
|||
r3_format <= 0; |
|||
end else begin |
|||
if (reg_wr_sig) begin |
|||
case (reg_wr_index) |
|||
1: r1_contrl_mode <= wr_data; |
|||
2: r2_en <= wr_data; |
|||
3: r3_format <= wr_data; |
|||
default: begin |
|||
end |
|||
endcase |
|||
end |
|||
end |
|||
end |
|||
|
|||
wire genlock_fps2397_clk; |
|||
wire genlock_fps2398_clk; |
|||
wire genlock_fps2400_clk; |
|||
wire genlock_fps2500_clk; |
|||
wire genlock_fps2997_clk; |
|||
wire genlock_fps3000_clk; |
|||
wire genlock_fps5000_clk; |
|||
wire genlock_fps5994_clk; |
|||
wire genlock_fps6000_clk; |
|||
wire genlock_sig_output; |
|||
|
|||
zutils_genlock_clk_generator #( |
|||
.SYS_CLOCK_FREQ(SYS_CLOCK_FREQ) |
|||
) genlock ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.ctrl_sig (r2_en[0]), |
|||
.genlock_fps2397_clk(genlock_fps2397_clk), |
|||
.genlock_fps2398_clk(genlock_fps2398_clk), |
|||
.genlock_fps2400_clk(genlock_fps2400_clk), |
|||
.genlock_fps2500_clk(genlock_fps2500_clk), |
|||
.genlock_fps2997_clk(genlock_fps2997_clk), |
|||
.genlock_fps3000_clk(genlock_fps3000_clk), |
|||
.genlock_fps5000_clk(genlock_fps5000_clk), |
|||
.genlock_fps5994_clk(genlock_fps5994_clk), |
|||
.genlock_fps6000_clk(genlock_fps6000_clk) |
|||
); |
|||
|
|||
zutils_multiplexer_32t1_v2 genlock_clk_output_mult ( |
|||
.chooseindex(r3_format), |
|||
//in |
|||
.in0 (genlock_fps2397_clk), |
|||
.in1 (genlock_fps2398_clk), |
|||
.in2 (genlock_fps2400_clk), |
|||
.in3 (genlock_fps2500_clk), |
|||
.in4 (genlock_fps2997_clk), |
|||
.in5 (genlock_fps3000_clk), |
|||
.in6 (genlock_fps5000_clk), |
|||
.in7 (genlock_fps5994_clk), |
|||
.in8 (genlock_fps6000_clk), |
|||
//out |
|||
.out (genlock_sig_output) |
|||
); |
|||
|
|||
zutils_freq_detector_v2 freq_detector1 ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.freq_detect_bias(1), |
|||
.pluse_input (genlock_sig_output), |
|||
.pluse_width_cnt (r4_detect_freq) |
|||
); |
|||
|
|||
|
|||
assign genlock_freq_signal = genlock_sig_output; |
|||
assign genlock_in_state_led = 1; |
|||
|
|||
endmodule |
@ -0,0 +1,116 @@ |
|||
`include "../config.v" |
|||
module sys_clock #( |
|||
parameter REG_START_ADD = 0, |
|||
parameter SYS_CLOCK_FREQ = 10000000 |
|||
) ( |
|||
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 sys_clock |
|||
); |
|||
|
|||
/******************************************************************************* |
|||
* 寄存器列表 * |
|||
*******************************************************************************/ |
|||
reg [31:0] reg1_sig_src; //!信号源选择 |
|||
reg [31:0] reg2_freq_division_ctrl; //!分频控制 |
|||
reg [31:0] reg3_freq_multiplication_ctrl; //!倍频控制 |
|||
reg [31:0] reg4_freq_detect_bias; //!频率探测滤波系数 |
|||
reg [31:0] reg5_trigger_edge_select; //!触发电平 |
|||
wire [31:0] regE_infreq_detect; //!输入频率探测 |
|||
wire [31:0] regF_outfreq_detect; //!输出频率探测 |
|||
|
|||
wire [31:0] reg_wr_index; //!寄存器写入时相对地址 |
|||
wire signal_in_choose; //!选择的信号源 |
|||
wire signal_in_af_pll; |
|||
|
|||
|
|||
//!TTLOUT_寄存器自动赋值选择器 |
|||
zutils_register_advanced #( |
|||
.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), |
|||
.reg1 (reg1_sig_src), |
|||
.reg2 (reg2_freq_division_ctrl), |
|||
.reg3 (reg3_freq_multiplication_ctrl), |
|||
.reg4 (reg4_freq_detect_bias), |
|||
|
|||
.regE (regE_infreq_detect), |
|||
.regF (regF_outfreq_detect), |
|||
.reg_wr_sig(reg_wr_sig), |
|||
.reg_index (reg_wr_index) |
|||
); |
|||
|
|||
//!寄存器写入逻辑 |
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
|
|||
reg1_sig_src <= 0; |
|||
reg2_freq_division_ctrl <= 0; |
|||
reg3_freq_multiplication_ctrl <= 0; |
|||
reg4_freq_detect_bias <= `FREQ_DETECT_BIAS_DEFAULT; |
|||
end else begin |
|||
if (reg_wr_sig) begin |
|||
case (reg_wr_index) |
|||
1: reg1_sig_src <= wr_data; |
|||
2: reg2_freq_division_ctrl <= wr_data; |
|||
3: reg3_freq_multiplication_ctrl <= wr_data; |
|||
4: reg4_freq_detect_bias <= wr_data; |
|||
default: begin |
|||
end |
|||
endcase |
|||
end |
|||
end |
|||
end |
|||
|
|||
//!信号选择器 |
|||
zutils_multiplexer_32t1 signal_in_multiplexer ( |
|||
.chooseindex(reg1_sig_src), |
|||
.signal (signal_in), |
|||
.signalout (signal_in_choose) |
|||
); |
|||
|
|||
//!pll信号处理 |
|||
zsimple_pll _simple_pll ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.insignal (signal_in_choose), |
|||
.trigger_eage_type (reg5_trigger_edge_select[0]), |
|||
.freq_detect_bias (reg4_freq_detect_bias), |
|||
.freq_division (reg2_freq_division_ctrl), |
|||
.freq_multiplication(reg3_freq_multiplication_ctrl), |
|||
.polarity_ctrl (1'd0), |
|||
.cfg_change (reg_wr_sig), |
|||
.outsignal (signal_in_af_pll) |
|||
); |
|||
|
|||
zutils_freq_detector_v2 in_freq_detector ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.freq_detect_bias(reg4_freq_detect_bias), |
|||
.pluse_input (signal_in_choose), |
|||
.pluse_width_cnt (regE_infreq_detect) |
|||
); |
|||
|
|||
zutils_freq_detector_v2 output_freq_detector ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.freq_detect_bias(reg4_freq_detect_bias), |
|||
.pluse_input (sys_clock), |
|||
.pluse_width_cnt (regF_outfreq_detect) |
|||
); |
|||
assign sys_clock = signal_in_af_pll; |
|||
|
|||
endmodule |
@ -0,0 +1,81 @@ |
|||
`include "../config.v" |
|||
module sys_genlock #( |
|||
parameter REG_START_ADD = 0, |
|||
parameter SYS_CLOCK_FREQ = 10000000 |
|||
) ( |
|||
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 internal_genlock_sig, |
|||
input external_genlock_sig, |
|||
|
|||
output reg sys_genlock_tigger_sig |
|||
); |
|||
|
|||
/******************************************************************************* |
|||
* 寄存器列表 * |
|||
*******************************************************************************/ |
|||
reg [31:0] reg1_sig_src; //!信号源选择 |
|||
reg [31:0] reg2_genlock_freq_detect_bias; //!频率探测滤波参数 |
|||
wire [31:0] reg3_sig_freq; //!信号源频率 |
|||
|
|||
wire [31:0] reg_wr_index; //!寄存器写入时相对地址 |
|||
|
|||
//!TTLOUT_寄存器自动赋值选择器 |
|||
zutils_register_advanced #( |
|||
.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), |
|||
.reg1 (reg1_sig_src), |
|||
.reg2 (reg2_genlock_freq_detect_bias), |
|||
.reg3 (reg3_sig_freq), |
|||
.reg_wr_sig(reg_wr_sig), |
|||
.reg_index (reg_wr_index) |
|||
); |
|||
|
|||
//!寄存器写入逻辑 |
|||
always @(posedge clk or negedge rst_n) begin |
|||
if (!rst_n) begin |
|||
reg1_sig_src <= 0; |
|||
reg2_genlock_freq_detect_bias <= `FREQ_DETECT_BIAS_DEFAULT; |
|||
end else begin |
|||
if (reg_wr_sig) begin |
|||
case (reg_wr_index) |
|||
1: reg1_sig_src <= wr_data; |
|||
2: reg2_genlock_freq_detect_bias <= wr_data; |
|||
default: begin |
|||
end |
|||
endcase |
|||
end |
|||
end |
|||
end |
|||
|
|||
always @(*) begin |
|||
if (!reg1_sig_src[0]) begin |
|||
sys_genlock_tigger_sig <= internal_genlock_sig; |
|||
end else begin |
|||
sys_genlock_tigger_sig <= external_genlock_sig; |
|||
end |
|||
end |
|||
|
|||
zutils_freq_detector_v2 freq_detector1 ( |
|||
.clk (clk), |
|||
.rst_n (rst_n), |
|||
.freq_detect_bias(reg2_genlock_freq_detect_bias), |
|||
.pluse_input (sys_genlock_tigger_sig), |
|||
.pluse_width_cnt (reg3_sig_freq) |
|||
); |
|||
|
|||
|
|||
endmodule |
Write
Preview
Loading…
Cancel
Save
Reference in new issue