复位电路设计——利用PLL锁定信号(lock)产生复位信号

复位电路设计——利用PLL锁定信号(lock)产生复位信号

利用PLL锁定信号(lock)产生复位信号

在FPGA刚上电的时候,系统所需的时钟一般都要经过PLL倍频,在时钟锁定(即稳定输出)以前,整个系统应处于复位状态。因此,我们可以利用PLL的锁定信号来产生复位信号,具体代码实现和testbench如下。

module sys_rst(
    input  sys_clk,
    input  clk_locked,

    output rst
);

parameter CNT_LEN = 16'hffff;

reg  [15:0] cnt;
reg         rst_out;

always @(posedge sys_clk)
    if(cnt == CNT_LEN)
        rst_out <= 1'b0;
    else
        rst_out <= 1'b1;

always @(posedge sys_clk)
    if(cnt == CNT_LEN)
        cnt <= cnt;
    else if(clk_locked)
        cnt <= cnt + 1'b1;
    else
        cnt <= 0;

assign rst = rst_out;

endmodule


 

`timescale 1ns/1ns

module tb_sys_rst();
   
reg  clk;
reg  clk_locked;
wire rst;

initial begin
    clk = 0;
    clk_locked = 1'b0;
    #500;
    clk_locked = 1'b1;

end

always #25 clk = ~clk;

sys_rst u_sys_rst(
  .sys_clk    (clk ),
  .clk_locked (clk_locked),
  .rst        (rst )
);

endmodule

问题:

寄存器在上电后默认值是什么?在综合工具中如何设置?

PLL(Phase Locked Loop)是一种常用的时钟生成电路,可以将输入时钟的频率倍频或分频,并且可以实现锁相环功能,使得输出时钟与参考时钟保持同步。以下是一种可能的Verilog代码实现: ```verilog module pll ( input CLKIN, // 输入时钟 output CLKOUT0, // 输出时钟0 output CLKOUT1, // 输出时钟1 output LOCK // 锁定信号 ); parameter CLKIN_PERIOD = 10; // 输入时钟周期为10ns parameter CLKOUT0_PERIOD = 0.3125; // 输出时钟0周期为312.5ps parameter CLKOUT1_PERIOD = 0.15625; // 输出时钟1周期为156.25ps parameter Kp = 0.1; // 比例增益 parameter Ki = 0.01; // 积分增益 parameter Kd = 0.001; // 微分增益 reg [31:0] phase_reg0, phase_reg1; reg [31:0] freq_reg0, freq_reg1; reg [31:0] int_reg0, int_reg1; reg [31:0] div_reg0, div_reg1; wire [31:0] phase_diff0, phase_diff1; wire [31:0] freq_diff0, freq_diff1; wire [31:0] int_diff0, int_diff1; wire [31:0] div_diff0, div_diff1; wire reset; wire locked; // 相位检测器模块 phase_detector #( .CLKIN_PERIOD(CLKIN_PERIOD), .CLKOUT0_PERIOD(CLKOUT0_PERIOD), .CLKOUT1_PERIOD(CLKOUT1_PERIOD) ) phase_detector_inst ( .CLKIN(CLKIN), .CLKOUT0(CLKOUT0), .CLKOUT1(CLKOUT1), .PHASE_DIFF0(phase_diff0), .PHASE_DIFF1(phase_diff1) ); // 频率检测器模块 frequency_detector #( .CLKIN_PERIOD(CLKIN_PERIOD), .CLKOUT0_PERIOD(CLKOUT0_PERIOD), .CLKOUT1_PERIOD(CLKOUT1_PERIOD) ) frequency_detector_inst ( .CLKIN(CLKIN), .CLKOUT0(CLKOUT0), .CLKOUT1(CLKOUT1), .FREQ_DIFF0(freq_diff0), .FREQ_DIFF1(freq_diff1) ); // 积分模块 integrator #( .CLKIN_PERIOD(CLKIN_PERIOD), .CLKOUT0_PERIOD(CLKOUT0_PERIOD), .CLKOUT1_PERIOD(CLKOUT1_PERIOD) ) integrator_inst ( .CLKIN(CLKIN), .CLKOUT0(CLKOUT0), .CLKOUT1(CLKOUT1), .INT_DIFF0(int_diff0), .INT_DIFF1(int_diff1) ); // 微分模块 differentiator #( .CLKIN_PERIOD(CLKIN_PERIOD), .CLKOUT0_PERIOD(CLKOUT0_PERIOD), .CLKOUT1_PERIOD(CLKOUT1_PERIOD) ) differentiator_inst ( .CLKIN(CLKIN), .CLKOUT0(CLKOUT0), .CLKOUT1(CLKOUT1), .DIV_DIFF0(div_diff0), .DIV_DIFF1(div_diff1) ); // 锁相环控制器模块 loop_filter #( .CLKIN_PERIOD(CLKIN_PERIOD), .CLKOUT0_PERIOD(CLKOUT0_PERIOD), .CLKOUT1_PERIOD(CLKOUT1_PERIOD), .Kp(Kp), .Ki(Ki), .Kd(Kd) ) loop_filter_inst ( .CLKIN(CLKIN), .CLKOUT0(CLKOUT0), .CLKOUT1(CLKOUT1), .PHASE_DIFF0(phase_diff0), .PHASE_DIFF1(phase_diff1), .FREQ_DIFF0(freq_diff0), .FREQ_DIFF1(freq_diff1), .INT_DIFF0(int_diff0), .INT_DIFF1(int_diff1), .DIV_DIFF0(div_diff0), .DIV_DIFF1(div_diff1), .RESET(reset), .LOCK(locked) ); // 分频器模块,将输出时钟分频为1/2或1/4 always @(posedge CLKOUT0) begin div_reg0 <= div_reg0 + 1; if (div_reg0 == 0) begin phase_reg0 <= phase_reg0 + 1; if (phase_reg0 == 0) begin CLKOUT0 <= ~CLKOUT0; // 产生50%占空比的时钟 end end end always @(posedge CLKOUT1) begin div_reg1 <= div_reg1 + 1; if (div_reg1 == 0) begin phase_reg1 <= phase_reg1 + 1; if (phase_reg1 == 0) begin CLKOUT1 <= ~CLKOUT1; // 产生50%占空比的时钟 end end end // 频率、相位、积分、微分计数器 always @(posedge CLKIN) begin if (locked) begin freq_reg0 <= freq_reg0 + int_reg0 - div_reg0; freq_reg1 <= freq_reg1 + int_reg1 - div_reg1; phase_reg0 <= phase_reg0 + freq_reg0; phase_reg1 <= phase_reg1 + freq_reg1; int_reg0 <= int_reg0 + int_diff0; int_reg1 <= int_reg1 + int_diff1; div_reg0 <= div_reg0 + div_diff0; div_reg1 <= div_reg1 + div_diff1; end end // 外部复位端口 always @(posedge CLKIN) begin if (reset) begin phase_reg0 <= 0; phase_reg1 <= 0; freq_reg0 <= 0; freq_reg1 <= 0; int_reg0 <= 0; int_reg1 <= 0; div_reg0 <= 0; div_reg1 <= 0; CLKOUT0 <= 0; CLKOUT1 <= 0; end end endmodule ``` 该代码使用了相位检测器、频率检测器、积分器、微分器和锁相环控制器等模块实现PLL功能,同时还包含了分频器模块将输出时钟分频为1/2或1/4。需要注意的是,PLL的参数需要根据具体的应用场景进行调整,比如增益系数等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值