同步fifo的串並 同步fifo設計

2021-10-19 05:58:33 字數 4370 閱讀 4313

1.同步fifo的功能點

當fifo寫滿的時候,輸出滿標誌.

當fifo讀空的時候,輸出空標誌.

寫滿之後不能繼續寫,即有滿標誌,禁止向ram寫入資料,防止資料混亂.

讀空之後不能繼續讀,讀完所有資料,禁止重複讀.

對於空滿標誌的判斷,設計的思想是,當讀指標等於寫指標加1,且同時有乙個寫使能,這樣,就認為fifo已滿,這是滿的臨界條件,近乎滿。空標誌也是同樣的原理。

2.設計**

module sync_fifo

clk ,

reset ,

fifo_wr ,

fifo_rd ,

wr_data ,

rd_data ,

full ,

empty

//*****************************parameter define*********************

parameter wh=8 ;//ram width

parameter dh=16 ;//ram deepth

parameter ad=4 ;//ram addr

//*****************************signal define*********************

input clk ;

input reset ;

input fifo_wr ;

input fifo_rd ;

input [wh-1:0] wr_data ;

output full ;

output empty ;

output [wh-1:0] rd_data ;

reg [ad-1:0] wr_pts ;

reg [ad-1:0] rd_pts ;

reg [wh-1:0] fifo_ram [dh-1:0] ;

wire valid_wr ;

wire valid_rd ;

reg [wh-1:0] rd_data ;

reg full ;

reg empty ;

reg [ad-1:0] wp ;//wr_pts gray code

reg [ad-1:0] wp_s ;//wr_pts+1 gray code

reg [ad-1:0] rp ;//rd_pts gray code

reg [ad-1:0] rp_s ;//rd_pts+1 gray code

wire [ad-1:0] wr_pts_s0 ;//wr_pts interal signal

wire [ad-1:0] wr_pts_s1 ;//wr_pts+1 interal signal

wire [ad-1:0] rp_pts_s0 ;//rd_pts interal signal

wire [ad-1:0] rp_pts_s1 ;//rd_pts+1 interal signal

integer i ;

//*****************************code brgin*********************

//*****************************part1:ram************************

always@(posedge clk or negedge reset)

if(!reset)

rd_data<=};

else if(valid_rd)

rd_data<=fifo_ram[rd_pts];

else

rd_data<=};

always@(posedge clk or negedge reset)

if(!reset)

begin

for(i=0;i

fifo_ram[i]<=0;

endelse if (valid_wr)

fifo_ram[wr_pts]<=wr_data;

else

fifo_ram[wr_pts]<=fifo_ram[wr_pts];

//*****************************part2:full/empty*********************

always@(posedge clk or negedge reset)

if(!reset)

full<=1'd0;

else if(fifo_wr&&(rp==wp_s))

full<=1'd1;

else

full<=full;

always@(posedge clk or negedge reset)

if(!reset)

empty<=1'd1;

else if(fifo_rd&&(wp==rp_s))

empty<=1'd1;

else

empty<=empty;

//*****************************part3:wr/rd*********************

assign valid_wr=fifo_wr&&(~full);

assign valid_rd=fifo_rd&&(~empty);

//******************************part4:wr/rd_pts pro**********************

always@(posedge clk or negedge reset)

if(!reset)

wr_pts<=};

else if(valid_wr)

wr_pts<=wr_pts+1;

else if(wr_pts==15)

wr_pts<=} ;

else

wr_pts<=wr_pts ;

always@(posedge clk or negedge reset)

if(!reset)

rd_pts<=};

else if(valid_rd)

rd_pts<=rd_pts+1;

else if(rd_pts==15)

rd_pts<=} ;

else

rd_pts<=rd_pts ;

//*********************************part5:b-to-g************************

assign wr_pts_s0=wr_pts;

assign wr_pts_s1=wr_pts+1;

assign rp_pts_s0=rd_pts;

assign rp_pts_s1=rd_pts+1;

always@(*)

begin

wp[3]=wr_pts_s0[3];

wp[2]=wr_pts_s0[3]^wr_pts_s0[2];

wp[1]=wr_pts_s0[2]^wr_pts_s0[1];

wp[0]=wr_pts_s0[1]^wr_pts_s0[0];

endalways@(*)

begin

wp_s[3]=wr_pts_s1[3];

wp_s[2]=wr_pts_s1[3]^wr_pts_s1[2];

wp_s[1]=wr_pts_s1[2]^wr_pts_s1[1];

wp_s[0]=wr_pts_s1[1]^wr_pts_s1[0];

endalways@(*)

begin

rp[3]=rp_pts_s0[3];

rp[2]=rp_pts_s0[3]^rp_pts_s0[2];

rp[1]=rp_pts_s0[2]^rp_pts_s0[1];

rp[0]=rp_pts_s0[1]^rp_pts_s0[0];

endalways@(*)

begin

rp_s[3]=rp_pts_s1[3];

rp_s[2]=rp_pts_s1[3]^rp_pts_s1[2];

rp_s[1]=rp_pts_s1[2]^rp_pts_s1[1];

rp_s[0]=rp_pts_s1[1]^rp_pts_s1[0];

endendmodule

難點在於空滿標誌的判斷,**裡對空滿標誌的判斷是乙個近乎滿,近乎空的狀態.

3.測試波形

fifo設計要保證寫指標追不上讀指標 ,讀指標追不上寫指標;

在fifo將寫0,將讀1的時候,下一拍拉高full,告訴user,fifo已滿(近乎滿的臨界狀態,不要在傳送寫指令了)

如果user繼續傳送寫指令,則繼續輸出full標誌,同時寫指標不再自加,有效的寫命令不會生成,user傳送過來的資料不會被寫入到ram裡.

直到有讀指標把full拉低。才可以繼續寫入資料.

1.1.png

1.2.png

fifo的rdata 同步FIFO設計

我們常見的同步fifo一般都是固定位寬輸入,固定位寬輸出的,因此他們之間的關係一般來說都是固定的,比較容易理解,網上也有很多類似的 去指導怎麼編寫,在此不再贅述。如果突發奇想,新增乙個選通訊號wstrb呢?那麼這個世界是不是就不太一樣了呀 假設題目如下 編寫 實現如下的同步fifo功能,示意圖如下 ...

非同步fifo 同步FIFO設計實現

在學習跨時鐘域處理的時候,有一種方法是用非同步fifo來處理跨時鐘域處理的。那麼在這之前先看看同步fifo實現。所謂同步fifo,就是讀寫時鐘是同乙個時鐘頻率。本次實現是通過計數器的形式來實現滿空標誌。具體實現如下 module fifo sync input clk input rst n inp...

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

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