上一篇寫了幾個簡單的打拍同步器,這一篇看下帶有使能信號的多比特同步結構——DMUX同步器。
DMUX的典型結構是這樣的:
其遵循的原則就是,數(shù)據(jù)不同步只對控制信號同步,這點其實和異步fifo里的思路一樣,只不過異步fifo中的控制信號是多比特的格雷碼,而這個場景下的控制信號是in_vld。繼續(xù)觀察結構可以發(fā)現(xiàn),DMUX是將控制信號同步之后,在目的時鐘域獲取了控制信號的上升沿,以上升沿為使能信號采樣數(shù)據(jù)。因此使用這個結構需要滿足若干的要求:
1.數(shù)據(jù)和使能信號在源時鐘域為同步到來的信號;
2.使能信號需要維持一段時間(目的時鐘兩拍),確保同步器能夠穩(wěn)定采樣;
3.在目的時鐘域對數(shù)據(jù)完成采樣前,數(shù)據(jù)信號不能跳變;
如果不滿足以上的要求,那么就可能造成數(shù)據(jù)漏同步、錯同步等問題。接下來,完成代碼,接口改了下名字和其他模塊統(tǒng)一:
module async_nbit_dmux #(
parameter DL = 2,
parameter WD = 1,
parameter FF = 1
)( /*AUTOARG*/
// Outputs
o_data, o_en,
// Inputs
i_clk, i_rst_n, i_data, i_en, o_clk, o_rst_n
);
// ----------------------------------------------------------------
// Interface declare
// ----------------------------------------------------------------
input i_clk;
input i_rst_n;
input [WD -1:0]i_data;
input i_en;
input o_clk;
input o_rst_n;
output[WD -1:0]o_data;
output o_en;入口處仍舊可以選擇是否需要打拍后再進行同步操作:
// ----------------------------------------------------------------
// i_data dff
// ----------------------------------------------------------------
wire [WD -1:0]i_data_in;
wire i_en_in;
generate
if(FF == 0)begin: NO_IN_DFF
assign i_data_in = i_data;
assign i_en_in = i_en;
end //if(FF == 0)begin: NO_IN_DFF
else begin: IN_DFF
reg [WD -1:0]i_data_ff;
reg i_en_ff;
always @(posedge i_clk or negedge i_rst_n) begin
if(!i_rst_n)begin
i_data_ff 而后將控制信號同步到目的時鐘域,并捕捉其上升沿:
// ----------------------------------------------------------------
// i_en_in async
// ----------------------------------------------------------------
wire i_en_sync;
reg i_en_sync_ff;
wire i_en_sync_pulse;
reg i_en_sync_pulse_ff;
async_1bit_delay #(.DL(DL), .FF(0))
u_i_en_sync(
.i_clk (i_clk),
.i_rst_n (i_rst_n),
.i_data (i_en_in),
.o_clk (o_clk),
.o_rst_n (o_rst_n),
.o_data (i_en_sync)
);
always @(posedge o_clk or negedge o_rst_n) begin
if(!o_rst_n)
i_en_sync_ff 通過目的上升沿對數(shù)據(jù)進行采樣,并輸出結果:
// ----------------------------------------------------------------
// i_data_in sample
// ----------------------------------------------------------------
reg [WD -1:0]i_data_sync;
always @(posedge o_clk or negedge o_rst_n) begin
if(!o_rst_n)
i_data_sync 最后是仿真波形:
系列文章入口——
【芯片設計】SoC 101(一):緒論 | 【芯片設計】FIFO漫談(零)從無處不在的FIFO開始說起 | 【芯片設計】計算機體系結構(一)虛擬內存 | 【芯片設計】深入理解AMBA總線(零)緒論
| 【芯片設計】握手協(xié)議的介紹與時序說明 | 【芯片設計】復位那些小事 —— 復位消抖 | 【芯片設計】快速入門數(shù)字芯片設計(一)Introduction | 【芯片驗證】UVM源碼計劃(零)下定決心讀源碼前的自測環(huán)節(jié)
| 【芯片設計】異步電路碎碎念(一) 到底什么是異步電路
| 【芯片設計】從RTL到GDS(一):Introduction
| 其他文章鏈接——
【芯片驗證】sva_assertion: 15道助力飛升的斷言練習 | 【芯片驗證】可能是RTL定向驗證的巔峰之作 | 【芯片驗證】RTL仿真中X態(tài)行為的傳播 —— 從xprop說起 | 【芯片驗證】年輕人的第一個systemVerilog驗證環(huán)境全工程與解析 |
【芯片設計】verilog中有符號數(shù)和無符號數(shù)的本質探究
| 【芯片設計】論RTL中always語法的消失術 | 【芯片設計】代碼即注釋,注釋即代碼 | 【芯片設計】700行代碼的risc處理器你確實不能要求太多了 |
入職芯片開發(fā)部門后,每天摸魚之外的時間我們要做些什么呢 | 如何計算系統(tǒng)的outstanding 和 burst length? | 芯片搬磚日常·逼死強迫癥的關鍵詞不對齊事件 | 熟人社會里,一群沒有社會價值的局外人 |
|