<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 跨越時(shí)鐘域

跨越時(shí)鐘域

作者: 時(shí)間:2023-12-26 來(lái)源:電子森林 收藏

設計可以使用多個(gè)。每個(gè)內部形成一個(gè)“域”,如果在另一個(gè)中需要在一個(gè)中生成的信號,則需要格外小心。

本文引用地址:http://dyxdggzs.com/article/202312/454268.htm

1-信號

假設 clkB 域中需要來(lái)自 clkA 域的信號。 它需要“同步”到 clkB 域,因此我們要構建一個(gè)同步器設計,它從 clkA 域獲取一個(gè)信號,并在 clkB 域中創(chuàng )建一個(gè)新信號。

在第一種設計中,我們假設與 clkA 和 clkB 時(shí)鐘速度相比,“信號輸入”變化緩慢。
您需要做的就是使用兩個(gè)觸發(fā)器將信號從 clkA 移動(dòng)到 clkB。

module Signal_CrossDomain(    

input clkA, 

// we actually don't need clkA in that example, but it is here for completeness as we'll need it in further examples    input SignalIn_clkA,    

input clkB,   

output SignalOut_clkB

);

// We use a two-stages shift-register to synchronize SignalIn_clkA to the clkB clock domain

reg [1:0] SyncA_clkB;

always @(posedge clkB) SyncA_clkB[0] <= SignalIn_clkA;   // notice that we use clkB

always @(posedge clkB) SyncA_clkB[1] <= SyncA_clkB[0];   // notice that we use clkB

assign SignalOut_clkB = SyncA_clkB[1];  // new signal synchronized to (=ready to be used in) clkB domain

endmodule

兩個(gè)觸發(fā)器具有延遲信號的副作用。

例如,在以下波形中,您可以看到慢速移動(dòng)的信號被兩個(gè)觸發(fā)器同步(和延遲)到 clkB 域:


跨時(shí)鐘域 2 - 標志

另一個(gè)時(shí)鐘域的標志

如果需要跨越時(shí)鐘域的信號只是一個(gè)脈沖(即它只持續一個(gè)時(shí)鐘周期),我們稱(chēng)之為“標志”。 以前的設計通常不起作用(標志可能會(huì )丟失,或者看到時(shí)間過(guò)長(cháng),具體取決于所使用的時(shí)鐘的比例)。

我們仍然希望使用同步器,但該同步器適用于標志。

訣竅是將標志轉換為電平變化,這樣可以更容易地跨越時(shí)鐘域。

module Flag_CrossDomain(

    input clkA,

    input FlagIn_clkA,   // this is a one-clock pulse from the clkA domain

    input clkB,

    output FlagOut_clkB   // from which we generate a one-clock pulse in clkB domain

);

reg FlagToggle_clkA;

always @(posedge clkA) FlagToggle_clkA <= FlagToggle_clkA ^ FlagIn_clkA;  // when flag is asserted, this signal toggles (clkA domain)

reg [2:0] SyncA_clkB;

always @(posedge clkB) SyncA_clkB <= {SyncA_clkB[1:0], FlagToggle_clkA};  // now we cross the clock domains

assign FlagOut_clkB = (SyncA_clkB[2] ^ SyncA_clkB[1]);  // and create the clkB flag

endmodule

現在,如果您希望 clkA 域收到確認(clkB 收到標志),只需添加繁忙信號即可。

module FlagAck_CrossDomain(

    input clkA,

    input FlagIn_clkA,

    output Busy_clkA,

    input clkB,

    output FlagOut_clkB

);

reg FlagToggle_clkA;

always @(posedge clkA) FlagToggle_clkA <= FlagToggle_clkA ^ (FlagIn_clkA & ~Busy_clkA);

reg [2:0] SyncA_clkB;

always @(posedge clkB) SyncA_clkB <= {SyncA_clkB[1:0], FlagToggle_clkA};

reg [1:0] SyncB_clkA;

always @(posedge clkA) SyncB_clkA <= {SyncB_clkA[0], SyncA_clkB[2]};

assign FlagOut_clkB = (SyncA_clkB[2] ^ SyncA_clkB[1]);

assign Busy_clkA = FlagToggle_clkA ^ SyncB_clkA[1];

endmodule

跨越時(shí)鐘域 3 - 任務(wù)

在另一個(gè)時(shí)鐘域中完成任務(wù)

如果 clkA 域中有任務(wù)需要在 clkB 域中完成,則可以使用以下設計。

這是一種方法

module TaskAck_CrossDomain(

    input clkA,

    input TaskStart_clkA,

    output TaskBusy_clkA, TaskDone_clkA,

    input clkB,

    output TaskStart_clkB, TaskBusy_clkB,

    input TaskDone_clkB

);

reg FlagToggle_clkA, FlagToggle_clkB, Busyhold_clkB;

reg [2:0] SyncA_clkB, SyncB_clkA;

always @(posedge clkA) FlagToggle_clkA <= FlagToggle_clkA ^ (TaskStart_clkA & ~TaskBusy_clkA);

always @(posedge clkB) SyncA_clkB <= {SyncA_clkB[1:0], FlagToggle_clkA};

assign TaskStart_clkB = (SyncA_clkB[2] ^ SyncA_clkB[1]);

assign TaskBusy_clkB = TaskStart_clkB | Busyhold_clkB;

always @(posedge clkB) Busyhold_clkB <= ~TaskDone_clkB & TaskBusy_clkB;

always @(posedge clkB) if(TaskBusy_clkB & TaskDone_clkB) FlagToggle_clkB <= FlagToggle_clkA;

always @(posedge clkA) SyncB_clkA <= {SyncB_clkA[1:0], FlagToggle_clkB};

assign TaskBusy_clkA = FlagToggle_clkA ^ SyncB_clkA[2];

assign TaskDone_clkA = SyncB_clkA[2] ^ SyncB_clkA[1];

endmodule

下面是一個(gè)匹配的仿真波形

跨越時(shí)鐘域 4 - 數據總線(xiàn)

數據總線(xiàn)到另一個(gè)時(shí)鐘域

為了將數據總線(xiàn)(2 位寬或更高)從一個(gè)時(shí)鐘域移動(dòng)到另一個(gè)時(shí)鐘域,我們可以使用多種技術(shù)。

這里有一些想法。

格雷碼:如果數據總線(xiàn)是單調計數器(即僅遞增或遞減),我們可以將其轉換為格雷碼,該格雷碼具有跨時(shí)鐘域的能力(在某些時(shí)序條件下)。

數據凍結:如果數據總線(xiàn)是非單調的,則使用標志向另一個(gè)域發(fā)出信號以捕獲該值(當它在源時(shí)鐘域中凍結時(shí))。

數據突發(fā):如果數據總線(xiàn)有許多需要跨越時(shí)鐘域的連續值,請使用異步 FIFO,從源時(shí)鐘域推送值,然后從另一個(gè)域讀回值。



關(guān)鍵詞: FPGA 時(shí)鐘 時(shí)鐘域

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>