【數(shù)字實驗室】時鐘切換
掃描二維碼
隨時隨地手機看文章
大部分開發(fā)者使用 BUFGCTRL 或 BUFGMUX進(jìn)行時鐘切換,它們在時鐘切換上可以提供無毛刺輸出。然而,了解所涉及的原理是有好處的。

當(dāng)然,無論我們在同步邏輯中使用哪種技術(shù),重要的是要確保在進(jìn)行時鐘切換時輸出上沒有毛刺。任何故障都可能導(dǎo)致下游邏輯的錯誤。
那么,讓我們看看如何僅使用邏輯門和寄存器產(chǎn)生無毛刺輸出的時鐘切換。Peter 大神介紹了如下電路。

使用兩個寄存器來存儲選擇信號的狀態(tài)。這些狀態(tài)在時鐘的下降沿更新,并且取消選擇的寄存器將其時鐘保持在復(fù)位狀態(tài)。由于下降沿,時鐘處于低電平,并且輸出時鐘保持低電平。它將保持低電平,直到所選時鐘變低(以更新其控制寄存器)并變高。
在 Vivado 中實現(xiàn)這一點很簡單。只需幾行代碼即可創(chuàng)建時鐘切換。
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將系統(tǒng)的時鐘 (100MHz) 劃分為兩個隨機且不相關(guān)的頻率。輸出時鐘引出到GPIO 引腳 。

使用 100 MHz 的 XPM 同步器宏來對其進(jìn)行去抖。XPM 宏的輸出用于切換時鐘并路由至 GPIO 引腳 。
創(chuàng)建了一個簡單的測試平臺,可以在時序仿真中運行仿真,以確定實現(xiàn)中是否存在故障。

在上圖中可以看到時序仿真中沒有觀察到任何故障。
下一步是對電路板進(jìn)行編程,并觀察在硬件中實現(xiàn)設(shè)計時設(shè)備中是否存在故障。
將頻率設(shè)置為 6.25 MHz 和 8.125 MHz。默認(rèn)情況下,當(dāng)選擇輸入為低電平時,將輸出 8.125 MHz 時鐘。將其切換至高電平將輸出切換至 6.25 MHz 時鐘。
當(dāng)然,我們需要能夠確定切換發(fā)生時輸出上是否存在任何毛刺。因此,使用示波器監(jiān)測內(nèi)部同步選擇信號和時鐘輸出引腳。
從下面觀察輸出時鐘時可以看出,當(dāng)時鐘的選擇線改變時,在輸出時鐘線上沒有觀察到毛刺。


盡管現(xiàn)代 FPGA 包含更先進(jìn)、功能更強大的時鐘管理和時鐘電路,但一些低端FPGA上這些電路并不存在,我們就需要自己去創(chuàng)建時鐘切換電路。