大部分开发者使用 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_swis signalclk_a_reg:std_logic:='0'; signalclk_b_reg:std_logic:='0'; begin cntrl_a:process(clk_a) begin iffalling_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 引脚 。
使用 100 MHz 的 XPM 同步器宏来对其进行去抖。XPM 宏的输出用于切换时钟并路由至 GPIO 引脚 。
创建了一个简单的测试平台,可以在时序仿真中运行仿真,以确定实现中是否存在故障。
在上图中可以看到时序仿真中没有观察到任何故障。
下一步是对电路板进行编程,并观察在硬件中实现设计时设备中是否存在故障。
将频率设置为 6.25 MHz 和 8.125 MHz。默认情况下,当选择输入为低电平时,将输出 8.125 MHz 时钟。将其切换至高电平将输出切换至 6.25 MHz 时钟。
当然,我们需要能够确定切换发生时输出上是否存在任何毛刺。因此,使用示波器监测内部同步选择信号和时钟输出引脚。
从下面观察输出时钟时可以看出,当时钟的选择线改变时,在输出时钟线上没有观察到毛刺。
尽管现代 FPGA 包含更先进、功能更强大的时钟管理和时钟电路,但一些低端FPGA上这些电路并不存在,我们就需要自己去创建始终切换电路。
审核编辑:刘清
-
寄存器
+关注
关注
31文章
5304浏览量
119883 -
存储器
+关注
关注
38文章
7443浏览量
163541 -
逻辑门
+关注
关注
1文章
139浏览量
24016 -
时钟切换电路
+关注
关注
0文章
7浏览量
5764 -
PLL电路
+关注
关注
0文章
92浏览量
6389
原文标题:【数字实验室】时钟切换
文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论