跨時鐘域電路設計——單bit信號

前面提到了簡單的雙電平鎖存器,下面是一些單bit同步電路。

一、慢時鐘域向快時鐘域

邊沿檢測同步器

將慢時鐘域的脈沖搬移并縮小為快時鐘域的脈沖。

既可以檢測上升沿,也可以檢測下降沿。

如上圖,慢時鐘下一個有效脈沖的最短周期為慢時鐘的一個周期,站在快時鐘的角度下,這個慢時鐘域的信號會在快時鐘域下持續很多個周期。實際上,這個脈沖在慢時鐘域只發生了一次,所以如果用快時鐘去檢查有效脈沖的翻轉邊沿是最準確的。邊沿上升與下降也只有一次。

適用條件:data_width>clk_fast+T_hold,最安全的就是兩個同步周期長度。這樣才能保證慢時鐘域的脈沖足夠保持到被快時鐘的同步器采樣到。

其verilog代碼如下:

二、快時鐘域向慢時鐘域

脈沖同步器

從快時鐘域的取出一個單時鐘寬度脈沖,在慢時鐘域建立新的單時鐘寬度脈沖

?

圖中陰影部分為快時鐘域下的翻轉電路。

由于在慢時鐘域下直接采樣快時鐘域的信號,很大概率會采樣失敗。因此,我們采用翻轉電路對有效脈沖進行標定。

適用條件:輸入脈沖間隔>=2*clk_slow。輸入脈沖相隔過近,則慢時鐘域的新脈沖也緊密相鄰,結果是輸出脈沖比一個時鐘周期寬;如果太近,則無法檢測到每一個脈沖。

其verilog代碼如下:

針對此脈沖同步器出現的問題:源時鐘域中的第一個脈沖和第二個脈沖間隔過短,第一個脈沖未完成同步,第二脈沖又將狀態清空,導致最終脈沖同步丟失。我們引入握手機制進行解決,思路如下:

(1) 同步請求產生;當同步器處于空閑(即上一次已同步完成)時,源同步脈沖到達時產生同步請求信號sync_req;

(2) 同步請求信號sync_req同步到目的時鐘域,目的時鐘域產生脈沖信號并將產生應答信號sync_ack;

(3) 同步應答信號sync_ack同步到源時鐘域,源時鐘域檢測到同步應答信號sync_ack后,清除同步請求信號;

(4)?目的時鐘域檢測到sync_req撤銷后,清除sync_ack應答;源時鐘域將到sync_ack清除后,認為一次同步完成,可以同步下一個脈沖。

verilog代碼如下:

module HANDSHAKE_PULSE_SYNC(src_clk         , //source clock src_rst_n       , //source clock reset (0: reset)src_pulse       , //source clock pulse insrc_sync_fail   , //source clock sync state: 1 clock pulse if sync fail.dst_clk         , //destination clock dst_rst_n       , //destination clock reset (0:reset)dst_pulse       //destination pulse out);//PARA   DECLARATION//INPUT  DECLARATION
input               src_clk     ; //source clock 
input               src_rst_n   ; //source clock reset (0: reset)
input               src_pulse   ; //source clock pulse ininput               dst_clk     ; //destination clock 
input               dst_rst_n   ; //destination clock reset (0:reset)//OUTPUT DECLARATION
output              src_sync_fail   ; //source clock sync state: 1 clock pulse if sync fail.
output              dst_pulse       ; //destination pulse out//INTER  DECLARATION
wire                dst_pulse       ;
wire                src_sync_idle   ;
reg                 src_sync_fail   ;
reg                 src_sync_req    ;
reg                 src_sync_ack    ;
reg                 ack_state_dly1  ;
reg                 ack_state_dly2  ;
reg                 req_state_dly1  ;
reg                 req_state_dly2  ;
reg                 dst_req_state   ;
reg                 dst_sync_ack    ;//--========================MODULE SOURCE CODE==========================--//--=========================================--
// DST Clock :
// 1. generate src_sync_fail; 
// 2. generate sync req 
// 3. sync dst_sync_ack
//--=========================================--
assign src_sync_idle = ~(src_sync_req | src_sync_ack );//report an error if src_pulse when sync busy ;
always @(posedge src_clk or negedge src_rst_n)
beginif(src_rst_n == 1'b0)src_sync_fail   <= 1'b0 ;else if (src_pulse & (~src_sync_idle)) src_sync_fail   <= 1'b1 ;else src_sync_fail   <= 1'b0 ;
end//set sync req if src_pulse when sync idle ;
always @(posedge src_clk or negedge src_rst_n)
beginif(src_rst_n == 1'b0)src_sync_req    <= 1'b0 ;else if (src_pulse & src_sync_idle) src_sync_req    <= 1'b1 ;else if (src_sync_ack)src_sync_req    <= 1'b0 ;
endalways @(posedge src_clk or negedge src_rst_n)
beginif(src_rst_n == 1'b0)beginack_state_dly1  <= 1'b0 ;ack_state_dly2  <= 1'b0 ;src_sync_ack    <= 1'b0 ;         endelsebeginack_state_dly1  <= dst_sync_ack     ;ack_state_dly2  <= ack_state_dly1   ;src_sync_ack    <= ack_state_dly2   ;         end        
end//--=========================================--
// DST Clock :
// 1. sync src sync req 
// 2. generate dst pulse
// 3. generate sync ack
//--=========================================--
always @(posedge dst_clk or negedge dst_rst_n)
beginif(dst_rst_n == 1'b0)beginreq_state_dly1  <= 1'b0 ;req_state_dly2  <= 1'b0 ;dst_req_state   <= 1'b0 ;endelsebeginreq_state_dly1  <= src_sync_req     ;req_state_dly2  <= req_state_dly1   ;dst_req_state   <= req_state_dly2   ;end
end//Rising Edge of dst_state generate a dst_pulse;
assign dst_pulse = (~dst_req_state) & req_state_dly2 ; //set sync ack when src_req = 1 , clear it when src_req = 0 ;
always @(posedge dst_clk or negedge dst_rst_n)
beginif(dst_rst_n == 1'b0)dst_sync_ack    <= 1'b0;else if (req_state_dly2)  dst_sync_ack    <= 1'b1;else  dst_sync_ack    <= 1'b0;
endendmodule

三、對比

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253880.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據同步 rsync+notify架構

rsync 同步命令&#xff0c;非常好用 notify是監控本地文件的變化的 、安裝配置 1. 安裝rsync&#xff0c;inotify-tools sudo apt-get install rsync inotify-tools 2. 拷貝rsync配置文件 mkdir /etc/rsync cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/rsync/ 3. 服…

OC_KVC與KVO簡單介紹

KVC KVC概述 KVC 即 Key-value coding 鍵值編碼&#xff0c;是指iOS的開發中&#xff0c;可以允許開發者通過Key名直接訪問對象的屬性&#xff0c;或者給對象的屬性賦值。 KVC案例 interface Person : NSObjectproperty (nonatomic,assign) int age; property (nonatomic,copy)…

C語言100例01 PHP版(練習)

題目&#xff1a;有1、2、3、4個數字&#xff0c;能組成多少個互不相同且無重復數字的三位數&#xff1f;都是多少&#xff1f; 程序分析&#xff1a;可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去 掉不滿足條件的排列。 代碼&#xff1a; 1 for($i1;$i&l…

嵌入式根文件系統制作

1:文件系統分類&#xff1a; 基于flash的文件系統&#xff1a;flash有兩種&#xff0c;一種是NOR,另一種NAND。NOR型 FLASH主要用于存放程序。NAND型 FLASH主要用于存放數據。NOR的特點是可在芯片內執行。這樣應用程序可以直接在flash內存內運行&#xff0c;不必再把代碼讀到…

跨時鐘域電路設計——結繩法

信號從快時鐘域到慢時鐘域過渡時&#xff0c;慢時鐘可能無法對快時鐘變化太快的信號進行采樣。 之前的同步器法對兩個時鐘間的關系有要求&#xff0c;結繩法適用于任何時鐘域之間的過渡。 結繩法的原理是將快時鐘信號的脈沖周期延長&#xff0c;等到慢時鐘周期采樣后再“解繩”…

我之理解---計時器setTimeout 和clearTimeout

今天在寫個圖片切換的問題 有動畫滯后的問題&#xff0c;才動手去查setTimeout 和clearTimeout。之前寫的圖片播放器也有類似的問題&#xff0c;有自動start按鈕 和stop按鈕&#xff0c; 其他都正常&#xff0c;問題出在每次多次快速的點擊start按鈕時&#xff0c;圖片播放的速…

002服務提供者Eureka

1、POM配置 和普通Spring Boot工程相比&#xff0c;僅僅添加了Eureka、Spring Boot Starter Actuator依賴和Spring Cloud依賴管理 <dependencies><!--添加Eureka Server依賴--><dependency><groupId>org.springframework.cloud</groupId><art…

使用Busybox構造cramfs根文件系統

使用Busybox構造cramfs根文件系統 11.1、下載Busybox&#xff0c;如果系統中沒有mkcramfs工具則還要下載mkcramfs壓縮工具。本文件系統使用Busybox-1.10.1&#xff0c;cramfs-1.1。壓縮文件Busybox-1.10.1.tar.bz2&#xff0c;cramfs-1.1.tar.gz。 22.解壓文件&#xff1a; tar…

關于二維碼分塊上色(彩色二維碼)的算法研究

原文:關于二維碼分塊上色&#xff08;彩色二維碼&#xff09;的算法研究眾所周知&#xff0c;二維碼通常是黑白的&#xff0c;而且是由若干個長方形或正方形小塊平鋪而成。但從人們的審美角度來看&#xff0c;常見的黑白二維碼不免讓人審美疲勞。本文試著從分塊上色的角度對二維…

20145309信息安全系統設計基礎第12周學習總結后篇

指針與聲明 聲明 1、C語言中變量的聲明 類型&#xff08;type&#xff09; 聲明符&#xff08;declarator&#xff09; 2、最簡單的聲明是變量 3、指針數組 指針數組是一個數組數組里的元素都是指針例&#xff1a;int *daytab[13]4、數組指針 數組指針是一個指針指針指向一個類…

跨時鐘域電路設計——多bit信號FIFO

多個bit信號的跨時鐘域僅僅通過簡單的同步器同步時不安全的。 如下圖&#xff1a; 雖然信號都同步到目的時鐘域&#xff0c;可完成的功能卻與設計的初衷不相符。 解決方案之一為對信號進行格雷碼編碼&#xff0c;但此方案只適用于連續變化的信號。另一種方案為增加新的控制信號…

嵌入式linux系統中設備驅動程序

嵌入式linux系統中設備驅動程序是內核的一部分&#xff0c;完成對設備初始、讀寫操作和控制等功能。驅動程序隱藏了硬件設備的具體細節&#xff0c;對不同的設備提供一致的接口&#xff0c;這些接口通過file_Operation結構來定義&#xff0c;設計驅動程序的大部分工作就是根據硬…

WPF 打印實例

原文:WPF 打印實例在WPF 中可以通過PrintDialog 類方便的實現應用程序打印功能&#xff0c;本文將使用一個簡單實例進行演示。首先在VS中編輯一個圖形&#xff08;如下圖所示&#xff09;。 將需要打印的內容放入同一個<Canvas>中&#xff0c;并起名為“printArea”&…

mongodb 物理刪除數據

剛開始用mongodb的時候&#xff0c;感覺很好用&#xff0c;速度很快&#xff0c;不過后面就遇到一個問題&#xff0c;數據物理內存一直增加&#xff0c;刪除表也不管用。 然后網上找了各種辦法&#xff0c;最后發現一個辦法管用&#xff0c;就是物理刪除存儲數據。 操作如下&am…

計數排序、桶排序和基數排序

計數排序 當輸入的元素是 n 個 0 到 k 之間的整數時&#xff0c;它的運行時間是 Θ(n k)。計數排序不是比較排序&#xff0c;排序的速度快于任何比較排序算法。 由于用來計數的數組C的長度取決于待排序數組中數據的范圍&#xff08;等于待排序數組的最大值與最小值的差加上1&a…

靜態時序分析——基礎概念

一、簡述 靜態時序分析是檢查系統時序是否滿足要求的主要手段。以往時序的驗證依賴于仿真&#xff0c;采用仿真的方法&#xff0c;覆蓋率跟所施加的激勵有關&#xff0c;有些時序違例會被忽略。此外&#xff0c;仿真方法效率非常的低&#xff0c;會大大延長產品的開發周期。靜…

linux framebuffer 例子

昨天做的一個極簡單的framebuffer的例子&#xff0c;用來學習怎樣操作fb設備。 這段代碼是在picogl的vesafb backend部分的基礎上簡出來的&#xff0c;所以變量名還保留著。 流程如下&#xff1a; &#xff11; 打開framebuffer設備&#xff1b; &#xff12; 通過ioctl取得f…

加載數據時,頁面顯示正在加載的動畫,支持移動端

最近在使用ionic3做一個移動端APP&#xff0c;在用戶網絡環境差的時候&#xff0c;查詢數據會比較慢&#xff0c;這個時候需要模擬其他成熟的APP給頁面上加入一個加載的動畫。由于一開始我不知道ionic3本身已經提供了一套組件&#xff0c;所以自己先做了一套樣式。提供給不用框…

靜態時序分析——單周期

一、建立時間的檢查 建立時間的檢查是指檢查電路里每一個觸發器的數據和時鐘的關系是否滿足建立時間的要求。 我們以上圖為例進行建立時間檢查。由圖可知&#xff0c;我們主要針對第二個觸發器UFF1進行檢查。我們可以梳理時序關系如下&#xff1a; 通過這個圖&#xff0c;我們…

自己搭建的CISCO實驗環境

交換機&#xff1a;設備型號&#xff1a; CISCO 3750 24-TS 3臺CISCO 3750 48-PS 1臺路由器&#xff1a;設備型號&#xff1a;1.CISCO 2821 3臺2.CISCO 3745 3臺 物理拓撲圖如下&#xff1a; 轉載于:https://blog.51cto.com/zxs3026/2156424