非同步時鐘的同步化,俗稱「慢打一拍 ,寄存一拍

2021-07-04 09:58:03 字數 1238 閱讀 6865

1.輸入訊號為什麼要寄存

一般來說,在全同步設計中,如果訊號來自同一時鐘域,各模組的輸入不需要寄存。只要滿足建立時間,保持時間的約束,可以保證在時鐘上公升沿到來時,輸入訊號已經穩定,可以取樣得到正確的值。但是如果模組需要使用輸入訊號的跳變沿(比如幀同步訊號),千萬不要直接這樣哦。

always @ (posedge inputs)

begin

...end

2.所有訊號都需要寄存兩拍嗎

如果這個輸入訊號來自非同步時鐘域(比如fpga晶元外部的輸入),必須寄存兩拍。第一拍將輸入訊號同步化,同步化後的輸出可能帶來建立/保持時間的衝突,產生亞穩態。需要再寄存一拍,減少(注意是減少)亞穩態帶來的影響。

如果這個輸入訊號來自於同一時鐘域且需要用到跳變沿,需要寄存一拍。否則時序報告多半會報clock skew > data delay,造成建立/保持時間的衝突。

總而言之,五條原則:

1.全域性時鐘的跳變沿最可靠。

2.來自非同步時鐘域的輸入需要寄存一次以同步化,再寄存一次以減少亞穩態帶來的影響。

3.不需要用到跳變沿的來自同一時鐘域的輸入,沒有必要對訊號進行寄存。

4.需要用到跳變沿的來自同一時鐘域的輸入,寄存一次即可。

5.需要用到跳變沿的來自不同時鐘域的輸入,需要用到3個觸發器,前兩個用以同步,第3個觸發器的輸出和第2個的輸出經過邏輯門來判斷跳變沿。

給出乙個verilog模板:

always @ (posedge clk) //不對輸入訊號進行寄存

begin

if (inputs)

begin

...end

...end

always @ (posedge clk) //對輸入訊號寄存一拍

begin

inputs_reg <= inputs;

if (inputs_reg == 1'b0 && inputs == 1'b1)

begin

...end

...end

always @ (posedge clk) //對輸入訊號寄存三拍

begin

inputs_reg1 <= inputs;

inputs_reg2 <= inputs_reg1;

inputs_reg3 <= inputs_reg2;

if (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0)

begin

...end

...end

javascript中非同步請求同步化

在處理大型公司的非同步請求時,為了迎合公司的整體框架,在傳送非同步請求時想要對獲取的資料作為返回值使用,但是卻無法實現,因為非同步 總是在同步的執行完後才開始 開始時用了錯誤的辦法,如下 var result ajax while result return reasult 我的思路是這樣的,還是利...

ACE Task svc 方法和同步化

根據c npv2 p199中描述,該方法會併發地執行在各個工作者執行緒中,該工作者執行緒在ace task中通過activate方法分配的。函式原型如下 virtual int activate long flags thr new lwp thr joinable thr inherit sche...

非同步fifo 跨時鐘域同步(非同步FIFO)

本文使用 zhihu on vscode 創作並發布 之前學習了跨時鐘域下的單bit訊號同步的方法,這些單bit訊號多是作為控制訊號或者標誌訊號來使用,再實際的專案中,處理多bit資料也是十分常見的,即資料的同步。非同步fifo的實現其實本質上和雙口ram是一樣的,其實現思路就是將資料在src cl...