網站首頁 編程語言 正文
??????? 芯片設計,包括FPGA程序設計中,都可能出現時鐘選擇器。在時鐘選擇器設計中,非常重要的一點就是避免在時鐘切換時產生毛刺。
??????? 關于glitch free時鐘選擇器設計的文章很多,但大多數都是直接給出了幾種設計方法,而沒有思考過程。本文則記錄了自己的這一過程。
1. glitch free時鐘選擇器的基本結構會是什么樣的?
??????? 假設存在兩個時鐘,clka和clkb,sel為0時clka輸出,為1時clkb輸出;當前sel為0,clka正在輸出。在上述假設下,如果sel切換為1,那么clkb需要輸出。
??????? 首先從考慮實現glitch free需要滿足什么樣的條件。第一,clka的輸出需要先被同步關閉;第二,clkb需要在clka同步關閉后,再被同步開啟。
??????? 為了滿足上述條件,在最簡的實現下,clka時鐘域至少存在一個寄存器,該寄存器輸出clka的時鐘控制信號,用于實現clka的同步輸出/禁止控制,該寄存器記為q2;同理clkb時鐘域也存在這樣一個寄存器,記為q4。
??????? 除了clka同步禁止外,禁止和啟動順序也很重要。clka需要先被禁止,然后clkb同步使能。所以,clkb的控制邏輯需要知道何時clka被禁止。為了實現該過程,那么q2的輸出一定會被反饋給clkb的控制邏輯,然后送給q4。q2的輸出為clka時鐘域的信號,當他被送給q4前,需要經由clkb重新進行同步處理。同理,q4到q2之間也存在同樣的反饋回路和同步過程。
??????? 基于上述分析,glitch free時鐘選擇器的最簡實現中,至少包含4個寄存器。q2和q4分別產生clka和clkb的同步時鐘控制信號。在q2之前還存在q1,在q4之前還存在q3,分別實現對上文提到的反饋信號的同步處理。
??????? 在q1和q2之間還存在簡單的組合邏輯,該組合邏輯的輸入分別是sel和feedback_b,feedback_b與q4輸出相關,也就是與clkb輸出狀態相關;同理,在q3和q4之間也存在這樣的組合邏輯。這兩部分組合邏輯的作用是為了實現sel信號對時鐘使能/禁止的控制。
2. q1和q2,q3和q4之間的組合邏輯是什么樣的?
??????? q1和q2之間,q3和q4之間的控制邏輯應該是相似的。該組合邏輯有兩個輸入,以clka時鐘為例,應該滿足以下條件:
??????? 當sel為1時,clka輸出被禁止,feedback_b的值不重要;
??????? 當sel由1切換為0時,組合邏輯輸出不會立即發生變化。而是等待feedback_b,當feedback_b也發生變化時,組合邏輯輸出才會變化,最終使能clka。
??????? 基于上述思考,可以考慮在q1和q2之間使用“與”邏輯。該“與”邏輯的行為是:當sel為1時,組合邏輯輸出立即變化,導致clka最先被同步關閉;當sel由1變為0時,只是滿足了“與”邏輯輸出值變化的一個條件,需要繼續等待feedback_b變化后,輸出才會翻轉,最終使能clka。
3. 時鐘使能/禁止邏輯
??????? 這部分選擇的自由度應該比較大。我們就選擇使用或邏輯來實現時鐘輸出的使能和禁止,當時鐘被禁止時,輸出為常1。clka和clkb的“或”邏輯輸出,進行“與”操作后作為最終的時鐘輸出。如下圖。
4. 分析并確定具體的實現邏輯
??????? 當我們確定基本結構和組合邏輯的基本形式后,需要找到一個切入點來確定最終的實現形式。個人認為最好的切入點是sel變化時,被禁止的時鐘。因為禁止行為最先發生,使能行為后發生。
??????? 假設sel由0變為1,此時q2的輸出需要在下一個clka上升沿后立即變為1,從而實現clka的禁止操作。
???????? 代碼如下。
`timescale 1ps / 1ps
module clk_switch (
input clka,
input clkb,
input sel, // 0: clka, 1: clkb
output clk_o
);
reg ff1, ff2, ff3, ff4;
wire clka_inner_src, clkb_inner_src;
always_ff @ (posedge clka) begin
ff2 <= ~sel & ~ff1;
ff1 <= ff4;
end
always_ff @ (posedge clkb) begin
ff3 <= ff2;
ff4 <= sel & ~ff3;
end
assign clka_inner_src = ~ff2 | clka;
assign clkb_inner_src = ~ff4 | clkb;
assign clk_o = clka_inner_src & clkb_inner_src;
endmodule
????????
原文鏈接:https://blog.csdn.net/yinyeyy/article/details/125831541
相關推薦
- 2022-08-06 C語言詳解關鍵字sizeof與unsigned及signed的用法_C 語言
- 2022-08-27 windows?10安裝和使用docker_docker
- 2023-03-16 ProxyWidget和Element更新的正確方式詳解_Android
- 2022-02-13 如何將pytorch模型部署到安卓
- 2022-11-14 Python中__init__.py文件的作用_python
- 2022-05-11 Nginx代理Redis哨兵主從配置
- 2022-10-31 Kotlin定義其他類的實現詳解_Android
- 2022-02-25 git提交到本地倉庫了,但是分支卻推送不上去怎么回退到提交之前的狀態
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支