如何仅使用逻辑门和寄存器产生无毛刺输出的时钟切换?

来源: OpenFPGA

大部分开发者使用 BUFGCTRL 或 BUFGMUX进行时钟切换,它们在时钟切换上可以提供无毛刺输出。然而,了解所涉及的原理是有好处的。

当然,无论我们在同步逻辑中使用哪种技术,重要的是要确保在进行时钟切换时输出上没有毛刺。任何故障都可能导致下游逻辑的错误行为。


(资料图片)

那么,让我们看看如何仅使用逻辑门和寄存器产生无毛刺输出的时钟切换。Peter 大神介绍了如下电路。

使用两个寄存器来存储选择信号的状态。这些状态在时钟的下降沿更新,并且取消选择的寄存器将其时钟保持在复位状态。由于下降沿,时钟处于低电平,并且输出时钟保持低电平。它将保持低电平,直到所选时钟变低(以更新其控制寄存器)并变高。

在 Vivado 中实现这一点很简单。只需几行代码即可创建时钟切换。

libraryieee;useieee.std_logic_1164.all;entityclk_swisport(clk_a:instd_logic;clk_b:instd_logic;sel:instd_logic;clk_out:outstd_logic);endentity;architecturertlofclk_swissignalclk_a_reg:std_logic:="0";signalclk_b_reg:std_logic:="0";begincntrl_a:process(clk_a)beginiffalling_edge(clk_a)thenclk_a_reg<=(notsel)and(notclk_b_reg);endif;endprocess;cntrl_b:process(clk_b)beginiffalling_edge(clk_b)thenclk_b_reg<=seland(notclk_a_reg);endif;endprocess;clk_out<=(clk_a_regandclk_a)or(clk_b_regandclk_b);endarchitecture;

使用PLL将系统的时钟 (100MHz) 划分为两个随机且不相关的频率。输出时钟引出到GPIO 引脚 。

使用 100 MHz 的 XPM 同步器宏来对其进行去抖。XPM 宏的输出用于切换时钟并路由至 GPIO 引脚 。

创建了一个简单的测试平台,可以在时序仿真中运行仿真,以确定实现中是否存在故障。

在上图中可以看到时序仿真中没有观察到任何故障。

下一步是对电路板进行编程,并观察在硬件中实现设计时设备中是否存在故障。

将频率设置为 6.25 MHz 和 8.125 MHz。默认情况下,当选择输入为低电平时,将输出 8.125 MHz 时钟。将其切换至高电平将输出切换至 6.25 MHz 时钟。

当然,我们需要能够确定切换发生时输出上是否存在任何毛刺。因此,使用示波器监测内部同步选择信号和时钟输出引脚。

从下面观察输出时钟时可以看出,当时钟的选择线改变时,在输出时钟线上没有观察到毛刺。

尽管现代 FPGA包含更先进、功能更强大的时钟管理和时钟电路,但一些低端FPGA上这些电路并不存在,我们就需要自己去创建始终切换电路。

审核编辑:刘清

相关新闻