国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

跨時(shí)鐘域方法(同步器、異步FIFO、邊沿檢測(cè)器、脈沖同步器、同步FIFO)

這篇具有很好參考價(jià)值的文章主要介紹了跨時(shí)鐘域方法(同步器、異步FIFO、邊沿檢測(cè)器、脈沖同步器、同步FIFO)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

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è)寄存器

fifo如何夸時(shí)鐘域解決問(wèn)題的,FPGA升級(jí)打怪,fpga開(kāi)發(fā)

//邊沿檢測(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ā)生概率,如下圖所示:

fifo如何夸時(shí)鐘域解決問(wèn)題的,FPGA升級(jí)打怪,fpga開(kā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ù)原單電平脈沖。

fifo如何夸時(shí)鐘域解決問(wèn)題的,FPGA升級(jí)打怪,fpga開(kāi)發(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. ?1.在單有效事件傳輸背景下,首先要確認(rèn)是否需要用單周期脈沖表示單有效事件,若沒(méi)有要求,傳輸信號(hào)滿足三邊沿準(zhǔn)則后可經(jīng)同步器直接傳輸
  2. ??? 2.在單有效事件傳輸背景下,對(duì)于滿足三邊沿準(zhǔn)則的慢時(shí)鐘域到快時(shí)鐘域的跨時(shí)鐘信號(hào)可以優(yōu)先考慮邊沿檢測(cè)電路,其他其他情況下可使用脈沖同步器(快時(shí)鐘到慢時(shí)鐘)
  3. ??? 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. ??? 4.在多有效可控事件傳輸?shù)谋尘跋?,可考慮對(duì)以上電路加入反饋控制
  5. ??? 5.多有效不可控事件傳輸?shù)?/strong>背景下,如發(fā)生兩有效事件無(wú)時(shí)鐘間隔連發(fā),則上述跨時(shí)鐘方法無(wú)法保證有效狀態(tài)的傳遞與有效事件數(shù)量的識(shí)別,此時(shí)只能引入緩存機(jī)制,采用如DPRAM或者異步FIFO的方式保證數(shù)據(jù)的安全傳輸。

  1. 4、跨時(shí)鐘域信號(hào)的分類——多比特?cái)?shù)據(jù)信號(hào)。

  2. FIFO

    1. 4.1FIFO定義

    2. ????????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è)指定的地址。

      1. 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ā)。


      2. 4.5 同步FIFO

        • fifo如何夸時(shí)鐘域解決問(wèn)題的,FPGA升級(jí)打怪,fpga開(kāi)發(fā)

          ?? 模塊主要分為讀/寫(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如何夸時(shí)鐘域解決問(wèn)題的,FPGA升級(jí)打怪,fpga開(kāi)發(fā)
        • `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

到了這里,關(guān)于跨時(shí)鐘域方法(同步器、異步FIFO、邊沿檢測(cè)器、脈沖同步器、同步FIFO)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【opencv】傳統(tǒng)目標(biāo)檢測(cè):Haar檢測(cè)器實(shí)現(xiàn)人臉檢測(cè)

    【opencv】傳統(tǒng)目標(biāo)檢測(cè):Haar檢測(cè)器實(shí)現(xiàn)人臉檢測(cè)

    傳統(tǒng)目標(biāo)分類器主要包括Viola Jones Detector、HOG Detector、DPM Detector,本文主要介紹VJ檢測(cè)器,在VJ檢測(cè)器基礎(chǔ)上發(fā)展出了Haar檢測(cè)器,Haar檢測(cè)器也是更為全面、使用更為廣泛的檢測(cè)器。 Viola Jones Detector是作為人臉檢測(cè)器被Viola和Jones提出來(lái)的,后來(lái)Rainer Lienhart和Jochen Maydt將這個(gè)檢測(cè)

    2024年02月12日
    瀏覽(28)
  • 1001序列檢測(cè)器

    1001序列檢測(cè)器

    multisim仿真文件:1001序列檢測(cè)器(mealy機(jī))-單片機(jī)文檔類資源-CSDN下載 modelsim仿真文件:1001序列檢測(cè)器modelsim仿真和測(cè)試文件-單片機(jī)文檔類資源-CSDN下載 實(shí)驗(yàn)報(bào)告:1001序列檢測(cè)器實(shí)驗(yàn)報(bào)告-單片機(jī)文檔類資源-CSDN下載 電 子 科 技 大 學(xué) 課程設(shè)計(jì)名稱: ??????????1001 序列檢

    2024年02月06日
    瀏覽(27)
  • ChatGPT檢測(cè)器(Detector)

    現(xiàn)階段可使用的Detector如以下所示,在網(wǎng)頁(yè)端有5個(gè)(3個(gè)支持中文),api有3個(gè)途徑,代碼運(yùn)行成功的有一個(gè)。 名稱 地址 特性 GPTZero https://gptzero.me/ 支持中英文,判定較為嚴(yán)格,有開(kāi)源代碼 OpenAI GPT2 Output Detector https://openai-openai-detector.hf.space/ 支持中英文,判定寬松 Hello-Simple

    2023年04月27日
    瀏覽(26)
  • OpenCV分類檢測(cè)器訓(xùn)練

    OpenCV中有兩個(gè)程序可以訓(xùn)練級(jí)聯(lián)分類器: opencv_haartraining 和opencv_traincascade。opencv_traincascade 是一個(gè)新程序,使用OpenCV 2.x API 以C++ 編寫(xiě)。這二者主要的區(qū)別是 opencv_traincascade 支持 Haar、Hog和 LBP(Local Binary Patterns) 三種特征,并易于增加其他的特征。與Haar特征相比,LBP特征是整數(shù)

    2024年02月17日
    瀏覽(26)
  • 簡(jiǎn)易溫度檢測(cè)器電路原理

    簡(jiǎn)易溫度檢測(cè)器電路原理

    在日常生活中,對(duì)溫度的及時(shí)檢測(cè)能夠減免火災(zāi)的發(fā)生,所以今天就說(shuō)說(shuō)溫度檢測(cè)器。 實(shí)際功能 在常溫下顯示數(shù)字0,隨著溫度的升高,數(shù)碼管逐步顯示1、3、8,分別代表三檔溫度,并且在顯示8的時(shí)候,LED燈開(kāi)始閃爍,代表溫度過(guò)高而報(bào)警,當(dāng)溫度下降時(shí),數(shù)碼管的顯示狀態(tài)

    2024年02月09日
    瀏覽(21)
  • 序列檢測(cè)器的verilog實(shí)現(xiàn)

    序列檢測(cè)器的verilog實(shí)現(xiàn)

    設(shè)計(jì)一個(gè)序列檢測(cè)同步時(shí)序邏輯電路,要實(shí)現(xiàn)的功能如下: 當(dāng)已有輸入碼流出現(xiàn)序列 111000或101110時(shí)輸出檢測(cè)信號(hào)為1 ,否則輸出為0。在時(shí)序上檢測(cè)到完整序列的 下一個(gè)時(shí)鐘周期 輸出檢測(cè)結(jié)果。輸入信號(hào)有效為1時(shí)表示當(dāng)前輸入有效,否則表示無(wú)效。之前輸入依舊計(jì)入序列中

    2024年02月06日
    瀏覽(26)
  • OpenCV 如何實(shí)現(xiàn)邊緣檢測(cè)器

    OpenCV 如何實(shí)現(xiàn)邊緣檢測(cè)器

    返回:OpenCV系列文章目錄(持續(xù)更新中......) 上一篇:OpenCV如何實(shí)現(xiàn)拉普拉斯算子的離散模擬 下一篇?:OpenCV系列文章目錄(持續(xù)更新中......) 在本教程中,您將學(xué)習(xí)如何: 使用 OpenCV 函數(shù)?cv::Canny?實(shí)現(xiàn) Canny 邊緣檢測(cè)器。 Canny Edge探測(cè)器 [48]由John F. Canny于1986年開(kāi)發(fā)。Canny 算法

    2024年04月25日
    瀏覽(24)
  • 實(shí)驗(yàn) 5 巴克碼檢測(cè)器

    實(shí)驗(yàn) 5 巴克碼檢測(cè)器

    5.1 實(shí) 驗(yàn) 目 的 (1) 了解通信領(lǐng)域中經(jīng)常使用的巴克碼檢測(cè)器的設(shè)計(jì)方法。 (2) 掌握使用狀態(tài)機(jī)設(shè)計(jì)時(shí)序電路的方法。 5.2 實(shí) 驗(yàn) 儀 器 與 器 材 (1) EDA 開(kāi)發(fā)軟件 一 套 (2) 微 機(jī) 一 臺(tái) (3) 實(shí)驗(yàn)開(kāi)發(fā)系統(tǒng) 一 臺(tái) (4) 打印機(jī) 一 臺(tái) (5) 其他器件與材料 若 干 5.3 實(shí) 驗(yàn) 說(shuō) 明 巴 克 碼 檢 測(cè)

    2024年02月01日
    瀏覽(23)
  • OpenCV實(shí)戰(zhàn)——尺度不變特征檢測(cè)器

    特征檢測(cè)的不變性是一個(gè)重要概念,雖然方向不變性(即使圖像旋轉(zhuǎn)也能檢測(cè)到相同特征點(diǎn))能夠被簡(jiǎn)單特征點(diǎn)檢測(cè)器(例如 FAST 特征檢測(cè)器等)處理,但難以實(shí)現(xiàn)在圖像尺度改變時(shí)特征保持不變。為了解決這一問(wèn)題,在計(jì)算機(jī)視覺(jué)中引入了尺度不變特征的概念。 無(wú)論對(duì)象是在哪

    2023年04月20日
    瀏覽(23)
  • 簡(jiǎn)單的狀態(tài)機(jī)設(shè)計(jì)——序列檢測(cè)器

    簡(jiǎn)單的狀態(tài)機(jī)設(shè)計(jì)——序列檢測(cè)器

    1.序列檢測(cè)器 序列檢測(cè)器是時(shí)序數(shù)字電路中非常常見(jiàn)的設(shè)計(jì)之一。它的邏輯功能是將一個(gè)指定的序列從數(shù)字碼流中識(shí)別出來(lái)。 2.例1:\\\"10010\\\"序列檢測(cè)器 對(duì)串行輸入的數(shù)據(jù)進(jìn)行檢測(cè),檢測(cè)“10010”。設(shè)X為數(shù)字碼流輸入,Z為檢出標(biāo)記輸出,高電平表示“發(fā)現(xiàn)指定序列”,低電平表

    2024年02月11日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包