Browse Source

update

master
zhaohe 1 year ago
parent
commit
a5cb5390ef
  1. 60
      led_test.pds
  2. 16
      source/src/input/ttl_input.v
  3. 148
      source/src/output/ttl_output.v
  4. 115
      source/src/zutils/zsimple_pll.v
  5. 105
      source/src/zutils/zutils_freq_detector_v2.v

60
led_test.pds

@ -1,5 +1,5 @@
(_flow fab_demo "2021.1-SP7"
(_comment "Generated by Fabric Compiler (version on 2021.1-SP7<build 86875>) at Sat Mar 2 18:19:24 2024")
(_comment "Generated by Fabric Compiler (version on 2021.1-SP7<build 86875>) at Sat Mar 2 22:23:23 2024")
(_version "1.0.5")
(_status "initial")
(_project
@ -59,7 +59,7 @@
)
(_file "source/src/output/ttl_output.v"
(_format verilog)
(_timespec "2024-03-02T18:19:22")
(_timespec "2024-03-02T22:23:06")
)
(_file "source/src/zutils/zutils_pwm_generator.v"
(_format verilog)
@ -147,7 +147,7 @@
)
(_file "source/src/input/ttl_input.v"
(_format verilog)
(_timespec "2024-03-02T17:48:39")
(_timespec "2024-03-02T22:21:29")
)
(_file "source/src/zutils/ztuils_sig_devide.v"
(_format verilog)
@ -167,7 +167,11 @@
)
(_file "source/src/zutils/zsimple_pll.v"
(_format verilog)
(_timespec "2024-03-02T16:28:23")
(_timespec "2024-03-02T22:20:29")
)
(_file "source/src/zutils/zutils_freq_detector_v2.v"
(_format verilog)
(_timespec "2024-03-02T22:20:27")
)
)
)
@ -239,17 +243,17 @@
(_db_output
(_file "compile/Top_comp.adf"
(_format adif)
(_timespec "2024-03-02T18:16:20")
(_timespec "2024-03-02T22:22:37")
)
)
(_output
(_file "compile/Top.cmr"
(_format verilog)
(_timespec "2024-03-02T18:16:19")
(_timespec "2024-03-02T22:22:36")
)
(_file "compile/cmr.db"
(_format text)
(_timespec "2024-03-02T18:16:20")
(_timespec "2024-03-02T22:22:37")
)
)
)
@ -265,21 +269,21 @@
(_db_output
(_file "synthesize/Top_syn.adf"
(_format adif)
(_timespec "2024-03-02T18:16:47")
(_timespec "2024-03-02T22:22:46")
)
)
(_output
(_file "synthesize/Top_syn.vm"
(_format structural_verilog)
(_timespec "2024-03-02T18:16:49")
(_timespec "2024-03-02T22:22:46")
)
(_file "synthesize/Top.snr"
(_format text)
(_timespec "2024-03-02T18:16:51")
(_timespec "2024-03-02T22:22:47")
)
(_file "synthesize/snr.db"
(_format text)
(_timespec "2024-03-02T18:16:52")
(_timespec "2024-03-02T22:22:47")
)
)
)
@ -300,21 +304,21 @@
(_db_output
(_file "device_map/Top_map.adf"
(_format adif)
(_timespec "2024-03-02T18:16:55")
(_timespec "2024-03-02T22:22:50")
)
)
(_output
(_file "device_map/Top_dmr.prt"
(_format text)
(_timespec "2024-03-02T18:16:54")
(_timespec "2024-03-02T22:22:49")
)
(_file "device_map/Top.dmr"
(_format text)
(_timespec "2024-03-02T18:16:55")
(_timespec "2024-03-02T22:22:50")
)
(_file "device_map/dmr.db"
(_format text)
(_timespec "2024-03-02T18:16:55")
(_timespec "2024-03-02T22:22:50")
)
)
)
@ -323,7 +327,7 @@
(_input
(_file "device_map/led_test.pcf"
(_format pcf)
(_timespec "2024-03-02T18:16:55")
(_timespec "2024-03-02T22:22:50")
)
)
)
@ -338,33 +342,33 @@
(_db_output
(_file "place_route/Top_pnr.adf"
(_format adif)
(_timespec "2024-03-02T18:17:42")
(_timespec "2024-03-02T22:23:05")
)
)
(_output
(_file "place_route/Top.prr"
(_format text)
(_timespec "2024-03-02T18:17:42")
(_timespec "2024-03-02T22:23:05")
)
(_file "place_route/Top_prr.prt"
(_format text)
(_timespec "2024-03-02T18:17:41")
(_timespec "2024-03-02T22:23:05")
)
(_file "place_route/clock_utilization.txt"
(_format text)
(_timespec "2024-03-02T18:17:41")
(_timespec "2024-03-02T22:23:05")
)
(_file "place_route/Top_plc.adf"
(_format adif)
(_timespec "2024-03-02T18:17:09")
(_timespec "2024-03-02T22:22:56")
)
(_file "place_route/Top_pnr.netlist"
(_format text)
(_timespec "2024-03-02T18:17:42")
(_timespec "2024-03-02T22:23:05")
)
(_file "place_route/prr.db"
(_format text)
(_timespec "2024-03-02T18:17:43")
(_timespec "2024-03-02T22:23:05")
)
)
)
@ -395,23 +399,23 @@
)
(_task tsk_gen_bitstream
(_command cmd_gen_bitstream
(_gci_state (_integer 3))
(_gci_state (_integer 2))
(_output
(_file "generate_bitstream/Top.sbit"
(_format text)
(_timespec "2024-03-02T18:18:14")
(_timespec "2024-03-02T22:23:21")
)
(_file "generate_bitstream/Top.smsk"
(_format text)
(_timespec "2024-03-02T18:18:14")
(_timespec "2024-03-02T22:23:21")
)
(_file "generate_bitstream/Top.bgr"
(_format text)
(_timespec "2024-03-02T18:18:14")
(_timespec "2024-03-02T22:23:21")
)
(_file "generate_bitstream/bgr.db"
(_format text)
(_timespec "2024-03-02T18:18:16")
(_timespec "2024-03-02T22:23:23")
)
)
)

16
source/src/input/ttl_input.v

@ -44,6 +44,7 @@ module ttl_input #(
reg [31:0] r6_ttlin2_filter_factor; // !滤波
reg [31:0] r7_ttlin3_filter_factor; // !滤波
reg [31:0] r8_ttlin4_filter_factor; // !滤波
reg [31:0] r9_freq_detect_bias; // !频率探测偏差
wire ttlin1_af_en; // !使能信号过滤后的信号1
@ -88,6 +89,7 @@ module ttl_input #(
r6_ttlin2_filter_factor <= 32'd02;
r7_ttlin3_filter_factor <= 32'd02;
r8_ttlin4_filter_factor <= 32'd02;
r9_freq_detect_bias <= 32'd10;
end
else begin
if (reg_wr_sig) begin
@ -102,6 +104,8 @@ module ttl_input #(
r7_ttlin3_filter_factor <= wr_data;
8:
r8_ttlin4_filter_factor <= wr_data;
9:
r9_freq_detect_bias <= wr_data;
default: begin
end
endcase
@ -146,32 +150,36 @@ module ttl_input #(
zutils_freq_detector
zutils_freq_detector_v2
freq_detector1 (
.clk(clk),
.rst_n(rst_n),
.freq_detect_bias(r9_freq_detect_bias),
.pluse_input(ttlin1_sig_af_filter),
.pluse_width_cnt(r1_ttlin1_freq_detector)
);
zutils_freq_detector
zutils_freq_detector_v2
freq_detector2 (
.clk(clk),
.rst_n(rst_n),
.freq_detect_bias(r9_freq_detect_bias),
.pluse_input(ttlin2_sig_af_filter),
.pluse_width_cnt(r2_ttlin2_freq_detector)
);
zutils_freq_detector
zutils_freq_detector_v2
freq_detector3 (
.clk(clk),
.rst_n(rst_n),
.freq_detect_bias(r9_freq_detect_bias),
.pluse_input(ttlin3_sig_af_filter),
.pluse_width_cnt(r3_ttlin3_freq_detector)
);
zutils_freq_detector
zutils_freq_detector_v2
freq_detector4 (
.clk(clk),
.rst_n(rst_n),
.freq_detect_bias(r9_freq_detect_bias),
.pluse_input(ttlin4_sig_af_filter),
.pluse_width_cnt(r4_ttlin4_freq_detector)
);

148
source/src/output/ttl_output.v

@ -1,7 +1,6 @@
module ttl_output #(
parameter REG_START_ADD = 0,
parameter SYS_CLOCK_FREQ = 10000000,
// parameter TEST = 0,
parameter ID = 1
) (
input clk, //clock input
@ -39,21 +38,34 @@ module ttl_output #(
reg [31:0] reg_input_polarity_ctrl;
//!TTLOUT_触发信号边沿类型
reg [31:0] reg_input_trigger_edge_select;
//!输出脉冲宽度
reg [31:0] output_pluse_width;
// !频率探测偏差
reg [31:0] freq_detect_bias;
//!输出脉冲延迟
reg [31:0] output_pluse_delay;
//!输入信号频率探测 read only
reg [31:0] reg_sig_in_freq_detect;
//!输出信号频率探测 read only
reg [31:0] reg_sig_out_freq_detect;
//!寄存器写入时相对地址
wire [31:0] reg_wr_index;
wire signal_in_choose; //!原始信号
wire signal_in_multiplication;//!倍频后的信号
wire [31:0] reg_wr_index;//!寄存器写入时相对地址
reg signal_in_choose; //!原始信号
wire signal_in_pll;//!倍频后的信号
wire signal_in_polarity_ctrl;//!极性翻转后的信号
//信号流转图
//
// signal_in[]
// ---> signal_in_choose
// --->
//
//
//!TTLOUT_寄存器自动赋值选择器
zutils_register_advanced #(
.REG_START_ADD(REG_START_ADD)
@ -69,9 +81,12 @@ module ttl_output #(
.reg2(reg_input_freq_division),
.reg3(reg_input_freq_multiplication),
.reg4(reg_input_polarity_ctrl),
.reg5(reg_sig_in_freq_detect),
.reg6(reg_sig_out_freq_detect),
.reg7(reg_input_trigger_edge_select),
.reg5(reg_input_trigger_edge_select),
.reg6(output_pluse_width),
.reg7(output_pluse_delay),
.reg8(freq_detect_bias),
.regE(reg_sig_in_freq_detect),
.regF(reg_sig_out_freq_detect),
.reg_wr_sig(reg_wr_sig),
.reg_index(reg_wr_index)
);
@ -84,9 +99,10 @@ module ttl_output #(
reg_input_freq_division<=0;
reg_input_freq_multiplication<=0;
reg_input_polarity_ctrl<=0;
reg_input_trigger_edge_select<=1;
// reg_sig_in_freq_detect<=0;
// reg_sig_out_freq_detect<=0;
reg_input_trigger_edge_select<=1; //上升沿触发
output_pluse_width<= 1000; // 100us
output_pluse_delay<=0;
freq_detect_bias<= 32'd10;
end
else begin
if (reg_wr_sig) begin
@ -101,10 +117,14 @@ module ttl_output #(
reg_input_freq_multiplication <= wr_data;
4:
reg_input_polarity_ctrl <= wr_data;
// 5:
// reg_sig_in_freq_detect <= wr_data;
// 6:
// reg_sig_out_freq_detect <= wr_data;
5:
reg_input_trigger_edge_select <= wr_data;
6:
output_pluse_width <= wr_data;
7:
output_pluse_delay <= wr_data;
8:
freq_detect_bias <= wr_data;
default: begin
end
endcase
@ -112,96 +132,32 @@ module ttl_output #(
end
end
assign signal_in_choose = signal_in[2];
//!信号选择器
always @(*) begin
if(reg_input_signal_select <= 31) begin
signal_in_choose <= signal_in[reg_input_signal_select];
end
else begin
signal_in_choose <= 0;
end
end
zsimple_pll _simple_pll (
.clk(clk),
.rst_n(rst_n),
.insignal(signal_in_choose),
.insignal(signal_in[2]),
.trigger_eage_type(reg_input_trigger_edge_select[0]),
.freq_division(32'd2),
.freq_multiplication(32'd3),
.freq_detect_bias(freq_detect_bias),
.freq_division(reg_input_freq_division),
.freq_multiplication(3),
.cfg_change(reg_wr_sig),
.outsignal(signal_in_multiplication)
.outsignal(signal_in_pll)
);
assign ttloutput_state_led = 1;
assign ttloutput = signal_in_multiplication;
assign ttloutput = signal_in_pll;
/*******************************************************************************
* 内部信号 *
*******************************************************************************/
// //脉冲输出
// 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_32t1 _signal_select (
// .chooseindex(reg_input_signal_select),
// .signal(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),
// .pluse_delay(reg_pulse_mode_trigger_delay),
// .trigger(signal_src_trigger),
// .output_signal(ttl_after_process_output)
// );
// zutils_pwm_generator #(
// .SYS_CLOCK_FREQ(SYS_CLOCK_FREQ),
// .OUTPUT_FREQ(1000 * ID)
// ) _test_signal_generator (
// .clk(clk),
// .rst_n(rst_n),
// .output_signal(test_signal_output)
// );
// wire [15:0] signal_output_select_in;
// assign signal_output_select_in[0] = 1'b0;
// assign signal_output_select_in[1] = 1'b1;
// assign signal_output_select_in[2] = test_signal_output;
// assign signal_output_select_in[3] = signal_in_choose;
// assign signal_output_select_in[4] = !signal_in_choose;
// assign signal_output_select_in[5] = ttl_after_process_output;
// assign signal_output_select_in[6] = !ttl_after_process_output;
// assign signal_output_select_in[7] = 1'b0;
// assign signal_output_select_in[15:8] = 8'b0;
// zutils_multiplexer_16t1 _signal_output_select (
// .chooseindex(reg_output_signal_select),
// .signal(signal_output_select_in),
// .signalout(ttloutput)
// );
// // assign ttloutput_state_led = !ttloutput;
endmodule

115
source/src/zutils/zsimple_pll.v

@ -4,6 +4,7 @@ module zsimple_pll (
input insignal, //!输入信号
input trigger_eage_type,
input wire [31:0] freq_detect_bias, //! 频率偏差计数
input wire [31:0] freq_division,
input wire [31:0] freq_multiplication,
input wire cfg_change,
@ -29,6 +30,7 @@ module zsimple_pll (
reg insignal_division; //! 输入信号分频后的信号
reg insignal_multiplication;//! 输入信号倍频后的信号
reg insignal_pluse_width_modulation;//! 输入信号脉宽调制后的信号
zutils_edge_detecter edge_detecter (
@ -66,92 +68,72 @@ module zsimple_pll (
end
end
// 倍频
//
// 触发计数
// 更新计数
//
//
// 计数器
reg [31:0] freq_cnt_cache;
reg [31:0] freq_cnt;
always @(posedge clk or posedge module_reset) begin
if (module_reset) begin
freq_cnt <= 0;
freq_cnt_cache <= 32'hffff_ffff;
end
else begin
if (insignal_division) begin
if(freq_cnt == 0) begin
freq_cnt_cache <= 32'hffff_ffff;
end
else begin
freq_cnt_cache <= freq_cnt;
end
freq_cnt <= 0;
end
else begin
freq_cnt <= freq_cnt + 1;
if(freq_cnt >= 32'hffff_ffff) begin
freq_cnt_cache <= 32'hffff_ffff;
freq_cnt <= 0;
end
end
end
end
wire [31:0] insignal_multiplication_freq_cnt;
wire pluse_width_cnt_lock;
zutils_freq_detector_v2
freq_detector (
.clk(clk),
.rst_n(rst_n),
.freq_detect_bias(freq_detect_bias),
.pluse_input(insignal_division),
.pluse_width_cnt(insignal_multiplication_freq_cnt),
.pluse_width_cnt_lock(pluse_width_cnt_lock)
);
reg [31:0] multiplication_state;
reg [31:0] multiplication_cnt;
reg [31:0] append_pluse_cnt;
reg [31:0] multiplication_state;
reg [31:0] gen_pluse_cnt;
always @(posedge clk or posedge module_reset) begin
if (module_reset) begin
if (module_reset || !pluse_width_cnt_lock) begin
multiplication_cnt <= 0;
insignal_multiplication <= 0;
append_pluse_cnt <= 0;
multiplication_state <= 0;
gen_pluse_cnt <= 0;
insignal_multiplication <= 0;
end
else begin
case (multiplication_state)
0 : begin // !默认状态
if(insignal_division) begin
0 : begin
gen_pluse_cnt <= 0;
multiplication_cnt <= 0;
insignal_multiplication <= 0;
//触发一次脉冲
insignal_multiplication <= 1;
if(freq_multiplication >= 1 && freq_cnt_cache != 32'hffff_ffff) begin
// 进入额外脉冲状态
multiplication_state <= 1;
append_pluse_cnt <= 0;
multiplication_cnt <= 0;
end
end
else begin
insignal_multiplication <= 0;
if(pluse_width_cnt_lock) begin
multiplication_state <= 1;
end
end
1 : begin
if(append_pluse_cnt < freq_multiplication && freq_cnt_cache != 32'hffff_ffff && freq_multiplication > 0) begin
if(multiplication_cnt < freq_cnt_cache) begin
multiplication_cnt <= multiplication_cnt + freq_multiplication + 1;
if(insignal_division) begin
multiplication_state <= 2;
gen_pluse_cnt <= 0;
multiplication_cnt <= 0;
end
end
2: begin
if(multiplication_cnt < insignal_multiplication_freq_cnt>>1) begin
multiplication_cnt <= multiplication_cnt + freq_multiplication + 1;
insignal_multiplication <= 1;
end
else if(multiplication_cnt >= insignal_multiplication_freq_cnt) begin
gen_pluse_cnt <= gen_pluse_cnt + 1;
insignal_multiplication <= 1;
multiplication_cnt <= 0;
gen_pluse_cnt <= gen_pluse_cnt + 1;
end
else begin
if(gen_pluse_cnt >= freq_multiplication ) begin
multiplication_state <= 1;
insignal_multiplication <= 0;
multiplication_cnt <= 0;
end
else begin
insignal_multiplication <= 1;
multiplication_cnt <= 0;
append_pluse_cnt <= append_pluse_cnt + 1;
multiplication_cnt <= multiplication_cnt + freq_multiplication + 1;
insignal_multiplication <= 0;
end
end
else begin
multiplication_state <= 0;
insignal_multiplication <= 0;
end
end
default: begin
multiplication_state <= 0;
@ -160,5 +142,6 @@ module zsimple_pll (
end
end
assign outsignal = insignal_multiplication;
endmodule

105
source/src/zutils/zutils_freq_detector_v2.v

@ -0,0 +1,105 @@
//
// @功能:
// 1. 滤波(add later)
// 2. 频率探测
// 3. 输出灯光控制
//
module zutils_freq_detector_v2
(
input clk, //! 时钟输入
input rst_n, //! 复位输入
input pluse_input, //! 输入信号1
input wire [31:0] freq_detect_bias, //! 频率偏差计数
output reg [31:0]pluse_width_cnt, //! 输出捕获到的脉冲宽度
output wire pluse_width_cnt_lock //! 输出捕获到的脉冲宽度锁定信号
);
reg in_signal_last;
reg in_signal_rising_edge; //! 上升沿
reg [31:0] state; //! 频率捕获状态
reg [31:0] freq_detect; //! 探测到频率cache1
reg [31:0] freq_detect_cnt;//! 实时频率探测计数
//!in_signal_last 捕获
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
in_signal_last <= 0;
end
else begin
in_signal_last <= pluse_input;
end
end
//!边沿捕获
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
in_signal_rising_edge <= 0;
end
else begin
if (in_signal_last == 0 && pluse_input == 1) begin
in_signal_rising_edge <= 1;
end
else if (in_signal_last == 1 && pluse_input == 0) begin
in_signal_rising_edge <= 0;
end
else begin
in_signal_rising_edge <= 0;
end
end
end
assign freq_detect_stable = (freq_detect <= freq_detect_cnt + freq_detect_bias + 1 && freq_detect >= freq_detect_cnt - freq_detect_bias - 1);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
state <= 0;
freq_detect <=0;
pluse_width_cnt <= 32'hffff_ffff;
end
else begin
case (state)
0: begin
// 频率探测中
if(in_signal_rising_edge) begin
freq_detect <= freq_detect_cnt;
freq_detect_cnt <= 0;
if(freq_detect_stable) begin
state <= 1;
pluse_width_cnt <= freq_detect;
end
else begin
pluse_width_cnt <= 32'hffff_ffff;
end
end
else begin
freq_detect_cnt <= freq_detect_cnt + 1;
end
end
1: begin
// 判断频率是否发生变化如果频率发生变化则重新探测
if(in_signal_rising_edge || freq_detect_cnt> freq_detect+ 1) begin
freq_detect_cnt <= 0;
if(!freq_detect_stable) begin
state <= 0;
pluse_width_cnt <= 32'hffff_ffff;
end
end
else begin
freq_detect_cnt <= freq_detect_cnt + 1;
end
end
default: begin
state <= 0;
end
endcase
end
end
assign pluse_width_cnt_lock = (state == 1);
endmodule
Loading…
Cancel
Save