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