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

描述

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

PLL电路

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

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

PLL电路

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

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

 

library ieee;

use ieee.std_logic_1164.all;


entity clk_sw is port(

    clk_a : in std_logic;

    clk_b : in std_logic;

    sel : in std_logic;

    clk_out : out std_logic);

end entity; 



architecture rtl of clk_sw is 


signal clk_a_reg : std_logic :='0';

signal clk_b_reg : std_logic :='0';


begin


cntrl_a : process(clk_a)

begin

    if falling_edge(clk_a) then 

        clk_a_reg <= (not sel) and (not clk_b_reg);

    end if;

end process;


cntrl_b : process(clk_b)

begin

    if falling_edge(clk_b) then 

        clk_b_reg <= sel and (not clk_a_reg);

    end if;

end process;


clk_out <= (clk_a_reg and clk_a) or (clk_b_reg and clk_b);


end architecture;

 

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

PLL电路

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

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

PLL电路

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

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

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

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

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

PLL电路PLL电路

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






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分