目錄
1、跨時(shí)鐘域方法的原因
2、跨時(shí)鐘處理的兩種思路
3、跨時(shí)鐘域分類——單比特信號(hào)跨時(shí)鐘
3.1.1慢時(shí)鐘———快時(shí)鐘。(滿足三邊沿準(zhǔn)則,有效事件可以被安全采樣)
3.1.2慢時(shí)鐘———快時(shí)鐘。(不滿足三邊沿準(zhǔn)則,有效事件可以被安全采樣)
3.2.1有效事件傳輸背景下確保有效事件的數(shù)量定義一致。(如何確??鐣r(shí)鐘前后單電平對(duì)應(yīng)單事件?)
?3.2.1.1邊沿檢測(cè)電路
3.2.2.2脈沖同步器(快時(shí)鐘--慢時(shí)鐘)
3.3多有效可控事件背景下使用反饋機(jī)制
3.4單bit信號(hào)跨時(shí)鐘方法總結(jié)
4、跨時(shí)鐘域信號(hào)的分類——多比特?cái)?shù)據(jù)信號(hào)。
4.6異步FIFO
4.5 同步FIFO
5異步FIFO
5.6.1格雷碼
1、跨時(shí)鐘域方法的原因
? 異步時(shí)鐘信號(hào)直接傳輸在信號(hào)跳變時(shí)違背本地時(shí)鐘域的時(shí)序要求(建立時(shí)間約束,保持時(shí)間約束),容易產(chǎn)生亞穩(wěn)態(tài),無(wú)法確定亞穩(wěn)態(tài)何時(shí)結(jié)束以及結(jié)束時(shí)保持在何種狀態(tài)上。
2、跨時(shí)鐘處理的兩種思路
- 對(duì)代跨時(shí)鐘的信息先緩存,然后由另一時(shí)鐘域接口取出 ————異步FIFO
- 速度緩慢、可控的信號(hào)(配置信號(hào),使能en、指示flag)我們對(duì)其進(jìn)行一些處理。例如拉長(zhǎng)持續(xù)時(shí)間,然后直接傳輸過(guò)去,亞穩(wěn)態(tài)的問(wèn)題通過(guò)同步器解決。適用于低速信號(hào)傳輸。
3、跨時(shí)鐘域分類——單比特信號(hào)跨時(shí)鐘
3.1.1慢時(shí)鐘———快時(shí)鐘。(滿足三邊沿準(zhǔn)則,有效事件可以被安全采樣)
? ?????????接收時(shí)鐘的頻率是發(fā)送時(shí)鐘的1.5倍以上,跨時(shí)鐘信號(hào)的最小持續(xù)時(shí)間必然跨越接受時(shí)鐘說(shuō)的三個(gè)相鄰時(shí)鐘邊沿,經(jīng)過(guò)同步器該有效事件可以被安全傳輸。
3.1.2慢時(shí)鐘———快時(shí)鐘。(不滿足三邊沿準(zhǔn)則,有效事件可以被安全采樣)
????????接收時(shí)鐘的頻率小于發(fā)送時(shí)鐘的1.5倍,將有效事件的持續(xù)時(shí)間拉長(zhǎng)滿足三邊沿準(zhǔn)則,然后再經(jīng)過(guò)同步器傳輸。
always@(posedge clk_a or negedge arst)//(D觸發(fā)器)(打拍可拉長(zhǎng)持續(xù)時(shí)間)
if(!arst)
data_reg <=0;
else
data_reg <=data_in;
always@(posedge clk_b or negedge brst)//同步器(時(shí)鐘域?yàn)閷⒁降臅r(shí)鐘域)(兩個(gè)連續(xù)的D觸發(fā)器)
if(!brst)
begin
data_breg <=0;
data_breg2<=0;
end
else
begin
data_breg <=data_reg;
data_breg2<=data_breg2;
end
3.2.1有效事件傳輸背景下確保有效事件的數(shù)量定義一致。(如何確??鐣r(shí)鐘前后單電平對(duì)應(yīng)單事件?)
- 脈沖同步電路
- 邊沿檢測(cè)電路
?3.2.1.1邊沿檢測(cè)電路
? ? ? ?對(duì)一個(gè)持續(xù)電平的上升沿或者下降沿進(jìn)行檢測(cè),并將檢測(cè)后的電平作為有效事件,就可以做到無(wú)論跨時(shí)鐘輸出電平持續(xù)多少個(gè)cycle,有效檢測(cè)電平只持續(xù)一個(gè)cycle,邊沿檢測(cè)常適用于慢時(shí)鐘到快時(shí)鐘。
? ?要實(shí)現(xiàn)邊沿檢測(cè),最直接的想法是用兩級(jí)寄存器,第二級(jí)寄存器鎖存住某個(gè)時(shí)鐘上升沿到來(lái)時(shí)的輸入電平,第一級(jí)寄存器鎖存住下一個(gè)時(shí)鐘沿到來(lái)時(shí)的輸入電平,如果這兩個(gè)寄存器鎖存住的電平信號(hào)不同,就說(shuō)明檢測(cè)到了邊沿,具體是上升沿還是下降沿可以通過(guò)組合邏輯來(lái)實(shí)現(xiàn)。如下圖所示:(思想:延遲一個(gè)寄存器)
//邊沿檢測(cè)電路
//2014/12/10
module edge_cap
(
input clk, rst_n,
input pulse,
output pos_edge,
output neg_edge
);
reg pulse_r1, pulse_r2;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
pulse_r1 <= 1'b0;
pulse_r2 <= 1'b0;
end
else
begin
pulse_r1 <= pulse;
pulse_r2 <= pulse_r1;
end
assign pos_edge = (pulse_r1 && ~pulse_r2) ?1:0;
assign neg_edge = (~pulse_r1 && pulse_r2) ?1:0;
endmodule
?異步信號(hào)同步化
,一般采用多加一級(jí)寄存器的方法來(lái)減小亞穩(wěn)態(tài)的發(fā)生概率,如下圖所示:
//異步信號(hào)邊沿檢測(cè)電路,三級(jí)寄存器實(shí)現(xiàn)
//2014/12/08
module edge_cap
(
input clk, rst_n,
input pulse,
output pos_edge,
output neg_edge
);
reg pulse_r1, pulse_r2, pulse_r3;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
pulse_r1 <= 1'b0;
pulse_r2 <= 1'b0;
pulse_r3 <= 1'b0;
end
else
begin
pulse_r1 <= pulse;
pulse_r2 <= pulse_r1;
pulse_r3 <= pulse_r2;
end
assign pos_edge = (pulse_r2 && ~pulse_r3) ?1:0;
assign neg_edge = (~pulse_r2 && pulse_r3) ?1:0;
endmodule
3.2.2.2脈沖同步器(快時(shí)鐘--慢時(shí)鐘)
????????對(duì)于快時(shí)鐘域單電平脈沖信號(hào)跨時(shí)鐘到慢時(shí)鐘域常使用脈沖同步器電路,脈沖同步器在異步時(shí)鐘域時(shí)鐘頻率彼此差距較大的場(chǎng)景下能節(jié)省觸發(fā)器資源??鞎r(shí)鐘域脈沖持續(xù)時(shí)間無(wú)法滿足三邊沿準(zhǔn)則,需要通過(guò)翻轉(zhuǎn)電路拉長(zhǎng)脈沖電平以保證有效事件被采樣,在接收時(shí)鐘通過(guò)邊沿檢測(cè)回復(fù)原單電平脈沖。
?
`timescale 1ns/1ns
module pulse_detect(
input clk_fast ,
input clk_slow ,
input rst_n ,
input data_in ,
output dataout
);
reg data_level,data_level1,data_level2,data_level3;//翻轉(zhuǎn)電路
always @(posedge clk_fast or negedge rst_n)
if(!rst_n)
data_level<=0;
else
data_level<= (data_in)? ~data_level : data_level;
always @(posedge clk_slow or negedge rst_n)//同步器
if(!rst_n)
begin
data_level1<=0;
data_level2<=0;
end
else
begin
data_level1<=data_level;
data_level2<=data_level1;
end
always @(posedge clk_slow or negedge rst_n)// D觸發(fā)器
if(!rst_n)
data_level3<=0;
else
data_level3<=data_level2;
assign dataout= data_level2^data_level3;
endmodule
3.3多有效可控事件背景下使用反饋機(jī)制
????????現(xiàn)有多個(gè)連續(xù)的有效事件需要進(jìn)行跨時(shí)鐘,單個(gè)事件的發(fā)起時(shí)刻是可控的,這時(shí)建議使用反饋機(jī)制保證各有效事件跨時(shí)鐘傳輸?shù)陌踩浴?/span>
3.4單bit信號(hào)跨時(shí)鐘方法總結(jié)
- ?1.在單有效事件傳輸背景下,首先要確認(rèn)是否需要用單周期脈沖表示單有效事件,若沒(méi)有要求,傳輸信號(hào)滿足三邊沿準(zhǔn)則后可經(jīng)同步器直接傳輸
- ??? 2.在單有效事件傳輸背景下,對(duì)于滿足三邊沿準(zhǔn)則的慢時(shí)鐘域到快時(shí)鐘域的跨時(shí)鐘信號(hào)可以優(yōu)先考慮邊沿檢測(cè)電路,其他其他情況下可使用脈沖同步器(快時(shí)鐘到慢時(shí)鐘)
- ??? 3.邊沿檢測(cè)電路與脈沖同步器的思路類似,先保證跨時(shí)鐘信號(hào)滿足三邊沿準(zhǔn)則以傳遞有效狀態(tài),然后通過(guò)邊沿檢測(cè)獲取單周期脈沖,二者的區(qū)別在于邊沿檢測(cè)電路的信號(hào)事先滿足三邊沿準(zhǔn)則,脈沖同步器的信號(hào)需要翻轉(zhuǎn)電路產(chǎn)生長(zhǎng)電平,因此也可以考慮將不滿足三邊沿準(zhǔn)則的短脈沖本地打拍取邏輯或輸出得到滿足三邊沿準(zhǔn)則的長(zhǎng)電平信號(hào)再打拍來(lái)跨時(shí)鐘,并在異步時(shí)鐘域取上升沿檢測(cè)信號(hào),這種方式代碼寫(xiě)起來(lái)簡(jiǎn)單但可能導(dǎo)致資源消耗過(guò)多?。(寄存器延遲一個(gè)時(shí)鐘比較。)
- ??? 4.在多有效可控事件傳輸?shù)谋尘跋?,可考慮對(duì)以上電路加入反饋控制
- ??? 5.在多有效不可控事件傳輸?shù)?/strong>背景下,如發(fā)生兩有效事件無(wú)時(shí)鐘間隔連發(fā),則上述跨時(shí)鐘方法無(wú)法保證有效狀態(tài)的傳遞與有效事件數(shù)量的識(shí)別,此時(shí)只能引入緩存機(jī)制,采用如DPRAM或者異步FIFO的方式保證數(shù)據(jù)的安全傳輸。
-
4、跨時(shí)鐘域信號(hào)的分類——多比特?cái)?shù)據(jù)信號(hào)。
-
FIFO
-
4.1FIFO定義
-
????????FIFO是英文First In First Out的縮寫(xiě),是一種先進(jìn)先出的數(shù)據(jù)緩存器,他與普通存儲(chǔ)器的區(qū)別是沒(méi)有外部讀寫(xiě)地址線,這樣使用起來(lái)非常簡(jiǎn)單,但缺點(diǎn)就是只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫(xiě)指針自動(dòng)加1完成,不能像普通存儲(chǔ)器那樣可以由地址線決定讀取或?qū)懭肽硞€(gè)指定的地址。
- 4.2、FIFO功能
FIFO存儲(chǔ)器是系統(tǒng)的緩沖環(huán)節(jié),如果沒(méi)有FIFO存儲(chǔ)器,整個(gè)系統(tǒng)就不可能正常工作,它主要有幾方面的功能:1)對(duì)連續(xù)的數(shù)據(jù)流]進(jìn)行緩存,防止在進(jìn)機(jī)和存儲(chǔ)操作時(shí)丟失數(shù)據(jù);
2)數(shù)據(jù)集中起來(lái)進(jìn)行進(jìn)棧和存儲(chǔ),可避免頻繁的總線操作,減輕CPU的負(fù)擔(dān);
3)允許系統(tǒng)進(jìn)行DMA操作,提高數(shù)據(jù)的傳輸速度。這是至關(guān)重要的一點(diǎn),如果不采用DMA操作,數(shù)據(jù)傳輸將達(dá)不到傳輸要求,而且大大增加CPU的負(fù)擔(dān),無(wú)法同時(shí)完成數(shù)據(jù)的存儲(chǔ)工作。
- 4.3、FIFO分類
????????FIFO的分類根據(jù)FIFO工作的時(shí)鐘域,可以將FIFO分為同步FIFO和異步FIFO。同步FIFO是指讀時(shí)鐘和寫(xiě)時(shí)鐘為同一個(gè)時(shí)鐘。在時(shí)鐘沿來(lái)臨時(shí)同時(shí)發(fā)生讀寫(xiě)操作。異步FIFO是指讀寫(xiě)時(shí)鐘不一致,讀寫(xiě)時(shí)鐘是互相獨(dú)立的。同步FIFO和異步FIFO如圖所示,從圖中可以看到,同步FIFO 具有一個(gè)獨(dú)立的時(shí)鐘端口 clock,因此所有的輸入輸出信號(hào)都同步于 clock 信號(hào)。而在異步FIFO 結(jié)構(gòu)中,寫(xiě)端口和讀端口分別有獨(dú)立的時(shí)鐘,所有與寫(xiě)相關(guān)的信號(hào)都是同步于寫(xiě)時(shí)鐘 wrclk,所有與讀相關(guān)的信號(hào)都是同步于讀時(shí)鐘 rdclk。????????同步 FIFO 常用于同步時(shí)鐘的數(shù)據(jù)緩存,異步 FIFO 常用于跨時(shí)鐘域的數(shù)據(jù)信號(hào)的傳遞,例如時(shí)鐘域 A 下的數(shù)據(jù) data1 傳遞給異步時(shí)鐘域 B,當(dāng) data1 為連續(xù)變化信號(hào)時(shí),如果直接傳遞給時(shí)鐘域 B 則可能會(huì)導(dǎo)致收非所送的情況,即在采集過(guò)程中會(huì)出現(xiàn)包括亞穩(wěn)態(tài)問(wèn)題在內(nèi)的一系列問(wèn)題,使用異步 FIFO 能夠?qū)⒉煌瑫r(shí)鐘域中的數(shù)據(jù)同步到所需的時(shí)鐘域中。
- 4.4FIFO的幾個(gè)重要參數(shù)
FIFO 的寬度:FIFO 一次讀寫(xiě)操作的數(shù)據(jù)位 N;
FIFO 的深度:FIFO 可以存儲(chǔ)多少個(gè)寬度為 N 位的數(shù)據(jù)。
空標(biāo)志:對(duì)于雙時(shí)鐘 FIFO 又分為讀空標(biāo)志 rdempty 和寫(xiě)空標(biāo)志 wrempty。FIFO 已空或?qū)⒁諘r(shí)由 FIFO
的狀態(tài)電路送出的一個(gè)信號(hào),以阻止 FIFO 的讀操作繼續(xù)從 FIFO 中讀出數(shù)據(jù)而造成無(wú)效數(shù)據(jù)的讀出。
滿標(biāo)志:對(duì)于雙時(shí)鐘 FIFO 又分為讀滿標(biāo)志 rdfull 和寫(xiě)滿標(biāo)志 wrfull。FIFO 已滿或?qū)⒁獙?xiě)滿時(shí)由 FIFO
的狀態(tài)電路送出的一個(gè)信號(hào),以阻止 FIFO 的寫(xiě)操作繼續(xù)向 FIFO 中寫(xiě)數(shù)據(jù)而造成溢出。
讀時(shí)鐘:讀 FIFO 時(shí)所遵循的時(shí)鐘,在每個(gè)時(shí)鐘的上升沿觸發(fā)。
寫(xiě)時(shí)鐘:寫(xiě) FIFO 時(shí)所遵循的時(shí)鐘,在每個(gè)時(shí)鐘的上升沿觸發(fā)。
- 4.3、FIFO分類
-
4.5 同步FIFO
-
?? 模塊主要分為讀/寫(xiě)指針、讀寫(xiě)指針的比較邏輯和RAM存儲(chǔ)。 -
`timescale 1ns/1ns /**********************************RAM************************************/ module dual_port_RAM #(parameter DEPTH = 16, parameter WIDTH = 8)( input wclk ,input wenc ,input [$clog2(DEPTH)-1:0] waddr //深度對(duì)2取對(duì)數(shù),得到地址的位寬。 ,input [WIDTH-1:0] wdata //數(shù)據(jù)寫(xiě)入 ,input rclk ,input renc ,input [$clog2(DEPTH)-1:0] raddr //深度對(duì)2取對(duì)數(shù),得到地址的位寬。 ,output reg [WIDTH-1:0] rdata //數(shù)據(jù)輸出 ); reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1]; always @(posedge wclk) begin if(wenc) RAM_MEM[waddr] <= wdata; end always @(posedge rclk) begin if(renc) rdata <= RAM_MEM[raddr]; end endmodule /**********************************SFIFO************************************/ module sfifo#( parameter WIDTH = 8, parameter DEPTH = 16 )( input clk , input rst_n , input winc , input rinc , input [WIDTH-1:0] wdata , output reg wfull , output reg rempty , output wire [WIDTH-1:0] rdata ); reg [$clog2(DEPTH):0] waddr,raddr; dual_port_RAM #(.DEPTH (DEPTH), .WIDTH (WIDTH)) dual_port_RAM ( .wclk (clk ), .wenc (wenc ), .waddr (waddr), .wdata (wdata), .rclk (clk ), .renc (renc ), .raddr (raddr), .rdata (rdata) ); always @(posedge clk or negedge rst_n)//讀數(shù)據(jù)計(jì)數(shù)加一 if(!rst_n) raddr<=0; else if(renc) raddr<=raddr+1'd1; else raddr<=raddr; always @(posedge clk or negedge rst_n)//寫(xiě)數(shù)據(jù)計(jì)數(shù)加一 if(!rst_n) waddr<=0; else if(wenc) waddr<=waddr+1'd1; else waddr<=waddr; always @(posedge clk or negedge rst_n) //判斷空滿狀態(tài) if(!rst_n)begin wfull<=0; rempty<=0; end else begin wfull<=(waddr==raddr+DEPTH); rempty<=(waddr==raddr); end assign wenc = winc && !wfull; assign renc = rinc && !rempty; endmodule
5.6異步FIFO
- ????????異步FIFO主要是由雙端口存儲(chǔ)器、寫(xiě)指針產(chǎn)生邏輯、讀指針產(chǎn)生邏輯及空滿標(biāo)志產(chǎn)生邏輯4部分組成。讀寫(xiě)操作是由兩個(gè)完全不同時(shí)鐘域的時(shí)鐘所控制。在寫(xiě)時(shí)鐘域部分,由寫(xiě)指針?biāo)a(chǎn)生邏輯生成寫(xiě)端口所需要的寫(xiě)地址和寫(xiě)控制信號(hào);在讀時(shí)鐘域部分,由讀指針產(chǎn)生邏輯生成讀斷口所需要的讀地址和讀控制信號(hào);在空滿標(biāo)志產(chǎn)生部分,通常是把寫(xiě)指針與讀指針相互比較產(chǎn)生空滿標(biāo)志。
1.?雙口RAM,用于數(shù)據(jù)的存儲(chǔ)。(RAM中的指針的地址取FIFO中的地址的除地址第一位外的地址,因?yàn)镕IFO中的第一位是標(biāo)志位)
2.?數(shù)據(jù)寫(xiě)入控制器,在wenc信號(hào)的使能下,數(shù)據(jù)寫(xiě)入控制器使RAM讀入數(shù)據(jù),同時(shí)數(shù)據(jù)寫(xiě)地址指針加一。
3.?數(shù)據(jù)讀取控制器,在renc信號(hào)的使能下,數(shù)據(jù)讀出控制器使RAM讀出數(shù)據(jù),同時(shí)數(shù)據(jù)讀地址指針加一。
4.?讀指針同步器:使用寫(xiě)時(shí)鐘的兩級(jí)觸發(fā)器采集讀指針,輸出到數(shù)據(jù)寫(xiě)入控制器。
5.?寫(xiě)指針同步器:?使用讀時(shí)鐘的兩級(jí)觸發(fā)器采集寫(xiě)指針,輸出到數(shù)據(jù)讀取控制器。
????????本題解采用的空滿判斷的方式是用格雷碼的比較來(lái)產(chǎn)生空滿信號(hào),同時(shí)產(chǎn)生的空滿信號(hào),會(huì)與輸入的winc,rinc輸入的是能信號(hào),共同控制數(shù)據(jù)是否寫(xiě)入和讀出。
-
????????
-
????????
- ????????異步FIFO主要是由雙端口存儲(chǔ)器、寫(xiě)指針產(chǎn)生邏輯、讀指針產(chǎn)生邏輯及空滿標(biāo)志產(chǎn)生邏輯4部分組成。讀寫(xiě)操作是由兩個(gè)完全不同時(shí)鐘域的時(shí)鐘所控制。在寫(xiě)時(shí)鐘域部分,由寫(xiě)指針?biāo)a(chǎn)生邏輯生成寫(xiě)端口所需要的寫(xiě)地址和寫(xiě)控制信號(hào);在讀時(shí)鐘域部分,由讀指針產(chǎn)生邏輯生成讀斷口所需要的讀地址和讀控制信號(hào);在空滿標(biāo)志產(chǎn)生部分,通常是把寫(xiě)指針與讀指針相互比較產(chǎn)生空滿標(biāo)志。
-
`timescale 1ns/1ns /***************************************RAM*****************************************/ module dual_port_RAM #(parameter DEPTH = 16, parameter WIDTH = 8)( input wclk ,input wenc ,input [$clog2(DEPTH)-1:0] waddr //深度對(duì)2取對(duì)數(shù),得到地址的位寬。 ,input [WIDTH-1:0] wdata //數(shù)據(jù)寫(xiě)入 ,input rclk ,input renc ,input [$clog2(DEPTH)-1:0] raddr //深度對(duì)2取對(duì)數(shù),得到地址的位寬。 ,output reg [WIDTH-1:0] rdata //數(shù)據(jù)輸出 ); reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1]; always @(posedge wclk) begin if(wenc) RAM_MEM[waddr] <= wdata; end always @(posedge rclk) begin if(renc) rdata <= RAM_MEM[raddr]; end endmodule /***************************************AFIFO*****************************************/ module asyn_fifo#( parameter WIDTH = 8, parameter DEPTH = 16 )( input wclk , input rclk , input wrstn , input rrstn , input winc , input rinc , input [WIDTH-1:0] wdata , output wire wfull , output wire rempty , output wire [WIDTH-1:0] rdata ); /**********************addr bin gen*************************/ //RAM讀寫(xiě)地址的變化 reg [ADDR_WIDTH:0] waddr_bin; reg [ADDR_WIDTH:0] raddr_bin; parameter ADDR_WIDTH = $clog2(DEPTH); always@(posedge rclk or negedge rrstn)//counter read if(!rrstn) raddr_bin<=0; else if(renc) raddr_bin<=raddr_bin+1'd1; else raddr_bin<=raddr_bin; always@(posedge wclk or negedge wrstn)//counter write if(!wrstn) waddr_bin<=0; else if(wenc) waddr_bin<=waddr_bin+1'd1; else waddr_bin<=waddr_bin; assign wenc = winc && !wfull; assign renc = rinc && !rempty; /**********************addr gray gen*************************/ //二進(jìn)制轉(zhuǎn)換為格雷碼 wire [ADDR_WIDTH:0] waddr_gray; wire [ADDR_WIDTH:0] raddr_gray; reg [ADDR_WIDTH:0] wptr; reg [ADDR_WIDTH:0] rptr; assign waddr_gray = waddr_bin ^ (waddr_bin>>1);//二進(jìn)制轉(zhuǎn)換為格雷碼 assign raddr_gray = raddr_bin ^ (raddr_bin>>1);//二進(jìn)制轉(zhuǎn)換為格雷碼 always @(posedge rclk or negedge rrstn)//打一拍避免沖突與競(jìng)爭(zhēng) if(!rrstn) rptr<=0; else rptr<=raddr_gray; always @(posedge wclk or negedge wrstn)//打一拍避免沖突與競(jìng)爭(zhēng) if(!wrstn) wptr<=0; else wptr<=waddr_gray; /**********************syn addr gray*************************/ //同步器打兩拍 reg [ADDR_WIDTH:0] wptr_buff; reg [ADDR_WIDTH:0] wptr_syn; reg [ADDR_WIDTH:0] rptr_buff; reg [ADDR_WIDTH:0] rptr_syn; always@(posedge rclk or negedge rrstn) //同步器:格雷碼寫(xiě)地址同步至讀時(shí)鐘域 if(!rrstn) begin wptr_buff<=0; wptr_syn<=0; end else begin wptr_buff<=wptr; wptr_syn<=wptr_buff; end always@(posedge wclk or negedge wrstn)// 格雷碼讀地址同步至寫(xiě)時(shí)鐘域 if(!wrstn) begin rptr_buff<=0; rptr_syn<=0; end else begin rptr_buff<=rptr; rptr_syn<=rptr_buff; end /**********************full empty gen*************************/ //空滿狀態(tài)判斷 assign wfull = (wptr == {~rptr_syn[ADDR_WIDTH:ADDR_WIDTH-1],rptr_syn[ADDR_WIDTH-2:0]}); assign rempty = (rptr == wptr_syn); /**********************RAM*************************/ wire [ADDR_WIDTH-1:0] waddr; wire [ADDR_WIDTH-1:0] raddr; assign waddr = waddr_bin[ADDR_WIDTH-1:0]; assign raddr = raddr_bin[ADDR_WIDTH-1:0]; dual_port_RAM #(.DEPTH(DEPTH), .WIDTH(WIDTH) )dual_port_RAM( .wclk (wclk), .wenc (wenc), .waddr(waddr[ADDR_WIDTH-1:0]), //深度對(duì)2取對(duì)數(shù),得到地址的位寬。 .wdata(wdata), //數(shù)據(jù)寫(xiě)入 .rclk (rclk), .renc (renc), .raddr(raddr[ADDR_WIDTH-1:0]), //深度對(duì)2取對(duì)數(shù),得到地址的位寬。 .rdata(rdata) //數(shù)據(jù)輸出 ); endmodule
5.6.1格雷碼
- ????????
采用格雷碼的原因:?jiǎn)蝏it翻轉(zhuǎn)
???? 每?jī)蓚€(gè)相鄰編碼之間只有一位是不同的,并且對(duì)于N位格雷碼,當(dāng)從最高位編碼(對(duì)應(yīng)二進(jìn)制2^N -1)跳轉(zhuǎn)到最低位編碼(對(duì)應(yīng)0)時(shí)也只會(huì)發(fā)生1bit跳轉(zhuǎn)。單bit跳轉(zhuǎn)意味著格雷碼在通過(guò)二級(jí)同步器跨時(shí)鐘時(shí),輸出不會(huì)出現(xiàn)不可控的中間狀態(tài),只能是正確的更新?tīng)顟B(tài)或者保持原來(lái)的狀態(tài)。
-
二進(jìn)制碼與gray碼的轉(zhuǎn)換關(guān)系
-
??????????????二進(jìn)制轉(zhuǎn)換成格雷碼:? assign??? gray? =? (bin >>1)^bin;
-
格雷碼轉(zhuǎn)換成二進(jìn)制碼:
???? bin[N-1]? = gray[N-1];
??? for(i=0;i<(N-1);i+1)begin
?????????? bin[i] = ^(gray[N-1:0]>>i);??
??? end文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-657480.html
-
-
???????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-657480.html
- ????????
-
- 4.2、FIFO功能
-
到了這里,關(guān)于跨時(shí)鐘域方法(同步器、異步FIFO、邊沿檢測(cè)器、脈沖同步器、同步FIFO)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!