含PLL的lock信号的异步复位同步释放

本文介绍了一种基于PLL的复位逻辑设计,包括PLL模块、异步复位同步释放电路等部分。详细解释了各部分的工作原理,如iRstN信号如何影响D触发器的状态变化,以及门电路如何确保系统稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下图展示了该结构:

结构分为三部分,分别是PLL的异步复位同步释放,PLL模块,和系统的异步复位同步释放。

         PLL模块由IP核产生,使用异步复位,当锁定时候,Locked信号置位。

         异步复位同步释放部分当iRstN信号低电平,所有D触发器输出0,产生复位信号;iRstN信号置位,四个D触发器都有可能存在亚稳态,使得输出电平可能为原先电平或者为D端的输入电平。Reg2与reg4在iRstN置位的瞬间,不管是否亚稳态,则输出都为低电平,系统仍然处在复位状态;Reg1和Reg3在iRstN置位的瞬间,若仍为低电平,则经过两个时钟后复位输出为高;若为D端口的输入,则在一个时钟后,复位输出为高。通过两个D触发器的缓冲,消除亚稳态的影响。

         在系统复位部分,D触发器的异步复位输入端及的是一个门电路。该门电路在或门输入前,将输入信号取反,其真值表如下

Lock信号         |       iRstN        |       门输出

--------------------------------------------------------------------

0               |       0           |       1

0               |       1            |       1

1               |       0           |  1

1               |       1           |  0


<think>在Xilinx FPGA中,MMCM(Mixed-Mode Clock Manager)用于生成和调整时钟。当MMCM配置完成后,需要等待时钟稳定,此时LOCK信号会拉高,表示时钟已经稳定可用。LOCK信号拉高的时机取决于MMCM的锁定时间,这通常由时钟的输入频率、反馈路径以及倍频/分频系数决定。 ### 问题分析: - **锁定时间**:MMCM需要一定时间(通常为输入时钟周期的若干倍)来锁定相位和频率。锁定时间不是固定的,但可以通过仿真或数据手册估算。 - **LOCK信号行为**:在配置后,LOCK信号会先保持低电平,直到时钟稳定才会拉高。如果输入时钟不稳定或配置参数超出范围,LOCK可能永远不会拉高。 ### 示例代码(MMCM原语使用): 以下代码展示了MMCM的原语实例化,并包复位控制和LOCK信号监测: ```verilog module mmcm_example ( input wire clk_in, // 输入时钟(例如100MHz) input wire reset, // 异步复位 output wire clk_out, // 输出时钟(例如200MHz) output wire locked // 锁定信号 ); // MMCM原语 MMCME2_BASE #( .BANDWIDTH("OPTIMIZED"), // 时钟带宽(OPTIMIZED, HIGH, LOW) .CLKFBOUT_MULT_F(10.0), // 反馈时钟倍频系数(2.000-64.000) .CLKFBOUT_PHASE(0.0), // 反馈时钟相位偏移(-360.000-360.000) .CLKIN1_PERIOD(10.0), // 输入时钟周期(ns) .CLKOUT0_DIVIDE_F(5.0), // CLKOUT0分频系数(1.000-128.000) .CLKOUT0_DUTY_CYCLE(0.5), // CLKOUT0占空比(0.01-0.99) .DIVCLK_DIVIDE(1), // 分频系数(1-106) .REF_JITTER1(0.0), // 输入参考时钟的抖动(0.000-0.999 ns) .STARTUP_WAIT("FALSE") // 延迟DONE直到LOCK有效(TRUE/FALSE) ) mmcm_inst ( .CLKOUT0(clk_out), // 输出时钟(200MHz) .LOCKED(locked), // 锁定信号 .CLKFBIN(clkfb), // 反馈时钟输入 .CLKIN1(clk_in), // 输入时钟 .PWRDWN(1'b0), // 掉电模式(0=正常) .RST(reset), // 异步复位(高有效) .CLKFBOUT(clkfb) // 反馈时钟输出 ); endmodule ``` ### 锁定时间分析: - **复位释放后**:当复位信号(`reset`)释放(变为低电平)后,MMCM开始锁定过程。 - **锁定时间估算**:锁定时间通常为输入时钟周期的100-200倍。例如,输入时钟为100MHz(周期10ns),则锁定时间大约为1-2μs。但实际时间可能因温度、电压和工艺变化而不同。 - **监控LOCK信号**:在设计中,必须等待LOCK信号拉高后才能使用输出时钟,否则可能发生亚稳态或逻辑错误。 ### 测试代码(验证LOCK行为): ```verilog module mmcm_tb; reg clk_in; reg reset; wire clk_out; wire locked; // 实例化MMCM mmcm_example uut ( .clk_in(clk_in), .reset(reset), .clk_out(clk_out), .locked(locked) ); // 生成输入时钟(100MHz) initial begin clk_in = 0; forever #5 clk_in = ~clk_in; // 10ns周期 end // 复位和测试 initial begin reset = 1; // 初始复位 #100; // 保持100ns复位 reset = 0; // 释放复位 // 等待锁定(最长等待100us) #100_000; // 100us超时 if (!locked) begin $display("Error: MMCM failed to lock!"); $finish; end // 继续其他测试... #1000; $finish; end endmodule ``` ### 常见问题及解决: 1. **LOCK信号不拉高**: - 检查输入时钟是否稳定(复位期间必须存在)。 - 检查复位信号是否在时钟稳定前过早释放(建议复位至少持续100ns)。 - 检查MMCM配置参数(如倍频/分频系数)是否在允许范围内。 2. **锁定时间过长**: - 增加复位释放后的等待时间。 - 优化时钟参数(如减少倍频系数或增加分频系数)。 3. **LOCK信号抖动**: - 确保电源和地线稳定,噪声可能导致锁定失败。 - 在MMCM配置中使用较低的带宽(`BANDWIDTH="LOW"`)以提高稳定性,但会增加锁定时间。 ### 实际应用建议: - 在FPGA设计中,使用LOCK信号作为其他逻辑的复位条件: ```verilog wire global_reset = !locked || external_reset; ``` §§相关问题§§: 1. MMCM和PLL在Xilinx FPGA中的主要区别是什么? 2. 如何通过Vivado TCL脚本获取MMCM的锁定时间估算值? 3. 当输入时钟频率变化时,MMCM的LOCK信号会如何反应? 4. 使用MMCM生成相位偏移时钟(例如90度相移)的配置步骤是什么?</think>### MMCM时钟稳定与LOCK信号行为分析 在Xilinx FPGA中,MMCM(Mixed-Mode Clock Manager)的LOCK信号是时钟稳定状态的关键指示器。当MMCM配置完成且时钟信号稳定后,LOCK信号会拉高,表示时钟管理器已锁定相位和频率。 #### LOCK信号拉高时机 1. **锁定过程时间**: - 锁定时间 = (输入时钟周期) × (锁定计数器值) - 默认锁定计数器值 ≈ 1024个输入时钟周期 - 例如:100MHz输入时钟 → 锁定时间 ≈ 1024 × 10ns = 10.24μs 2. **影响锁定时间的因素**: ```verilog MMCME4_ADV #( .CLKIN1_PERIOD(10.0), // 输入时钟周期(ns) .LOCK_WAIT("FALSE"), // 锁定等待配置 .LOCK_FB_DETECT("LOCKED"), // 反馈检测模式 .LOCK_CNT1(1024), // 阶段1锁定计数器 .LOCK_CNT2(1024) // 阶段2锁定计数器 ) ``` - `LOCK_CNT1` 和 `LOCK_CNT2` 共同决定总锁定时间 - 实际锁定时间 = (LOCK_CNT1 + LOCK_CNT2) × 输入时钟周期 3. **典型锁定过程**: ```mermaid timeline title MMCM锁定过程 section 复位阶段 复位释放 : 0 ns 时钟开始振荡 : 0 ns section 锁定阶段 频率锁定 : 约50%锁定时间 相位锁定 : 约90%锁定时间 section 完成 LOCK拉高 : 100%锁定时间 ``` #### 完整MMCM实现与LOCK监控代码 ```verilog `timescale 1ns/1ps module mmcm_lock_monitor ( input wire clk_in, // 输入时钟 (100MHz) input wire reset, // 异步复位 output wire clk_out, // 输出时钟 (200MHz) output wire locked, // MMCM锁定状态 output reg [15:0] lock_time_ns // 锁定时间测量 ); // MMCM实例化 wire clk_fb; wire locked_int; MMCME4_ADV #( .BANDWIDTH("OPTIMIZED"), .CLKIN1_PERIOD(10.0), // 100MHz输入时钟 .CLKFBOUT_MULT_F(10.0), // 100MHz × 10 = 1000MHz .CLKOUT0_DIVIDE_F(5.0), // 1000MHz / 5 = 200MHz输出 .DIVCLK_DIVIDE(1), .REF_JITTER1(0.01), .STARTUP_WAIT("FALSE"), .LOCK_CNT1(1024), // 阶段1锁定计数器 .LOCK_CNT2(1024) // 阶段2锁定计数器 ) mmcm_inst ( .CLKIN1(clk_in), .CLKFBIN(clk_fb), .CLKOUT0(clk_out), .LOCKED(locked_int), .CLKFBOUT(clk_fb), .PWRDWN(1'b0), .RST(reset) ); assign locked = locked_int; // 锁定时间测量逻辑 reg [31:0] counter = 0; reg measuring = 0; always @(posedge clk_in or posedge reset) begin if (reset) begin measuring <= 0; counter <= 0; lock_time_ns <= 0; end else begin if (!locked_int && !measuring) begin measuring <= 1; // 开始测量 counter <= 0; end if (measuring) begin counter <= counter + 1; if (locked_int) begin measuring <= 0; // 计算实际锁定时间(ns) lock_time_ns <= (counter * 10); // 100MHz时钟周期=10ns end end end end endmodule ``` #### LOCK信号不拉高的常见原因 1. **输入时钟问题**: ```verilog // 时钟输入约束示例 create_clock -period 10.000 -name clk_in [get_ports clk_in] set_input_jitter clk_in 0.05 ``` - 输入时钟频率超出MMCM工作范围 - 输入时钟抖动过大(>150ps RMS) - 输入时钟存在毛刺或中断 2. **配置参数错误**: - 输出频率超出器件支持范围 - 反馈路径配置错误(`CLKFBIN`未正确连接) - 分频/倍频系数组合无效 3. **复位问题**: ```verilog // 正确的复位序列 initial begin reset = 1; #1000; // 保持复位至少1μs reset = 0; #10000; // 等待锁定 end ``` - 复位时间不足(应 > 100ns) - 复位信号异步释放导致亚稳态 4. **电源/温度问题**: - 心电压低于规格(<0.95V) - 结温超过125℃ - 电源噪声过大(>50mV纹波) #### 调试LOCK信号的ILA监控代码 ```verilog // 在顶层模块添加ILA监控 ila_mmcm ila_inst ( .clk(clk_in), .probe0(locked), // LOCK信号 .probe1(reset), // 复位信号 .probe2(clk_fb), // 反馈时钟 .probe3(lock_time_ns), // 锁定时间 .probe4(mmcm_inst__DRDY) // MMCM内部状态 ); // ILA配置约束 set_property C_DATA_DEPTH 4096 [get_hw_ilas -of_objects [get_hw_devices]] set_property TRIGGER_COMPARE_VALUE eq1 [get_hw_probes -of_objects [get_hw_ilas]] ``` ### LOCK信号状态诊断表 | 现象 | 可能原因 | 解决方案 | |------|----------|----------| | LOCK永不拉高 | 输入时钟丢失 | 检查时钟源和约束 | | LOCK瞬间拉高后下降 | 反馈路径错误 | 确认CLKFBIN连接 | | LOCK抖动 | 电源噪声 | 增加去耦电容 | | LOCK延迟过长 | 锁定计数器过大 | 减小LOCK_CNT值 | | LOCK在温度变化时失效 | 超出工作温度 | 改进散热设计 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值