同步fifo設計

1.同步fifo的功能點


當fifo寫滿的時候结耀,輸出滿標志.
當fifo讀空的時候抑党,輸出空標志.
寫滿之后不能繼續(xù)寫,即有滿標志撬碟,禁止向ram寫入數(shù)據(jù)诞挨,防止數(shù)據(jù)混亂.
讀空之后不能繼續(xù)讀,讀完所有數(shù)據(jù)呢蛤,禁止重復讀.
對于空滿標志的判斷惶傻,設計的思想是,當讀指針等于寫指針加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<={WH{1'd0}};
else if(valid_rd)
    rd_data<=fifo_ram[rd_pts];
else
    rd_data<={WH{1'd0}};
    
always@(posedge clk or negedge reset)
if(!reset)
    begin
    for(i=0;i<DH;i=i+1)
      fifo_ram[i]<=0;
    end
else 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<={AD{1'd0}};
else if(valid_wr)
    wr_pts<=wr_pts+1;
else if(wr_pts==15)
    wr_pts<={AD{1'd0}}  ;
else    
    wr_pts<=wr_pts      ;
    
    
always@(posedge clk or negedge reset)
if(!reset)
    rd_pts<={AD{1'd0}};
else if(valid_rd)
    rd_pts<=rd_pts+1;
else if(rd_pts==15)
    rd_pts<={AD{1'd0}}  ;
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];
end

always@(*)
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];
end
always@(*)
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];
end

always@(*)
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];
end
 endmodule

難點在于空滿標志的判斷,代碼里對空滿標志的判斷是一個近乎滿造烁,近乎空的狀態(tài).

3.測試波形

fifo設計要保證寫指針追不上讀指針 否过,讀指針追不上寫指針午笛;  
在fifo將寫0,將讀1的時候苗桂,下一拍拉高full药磺,告訴user,fifo已滿(近乎滿的臨界狀態(tài),不要在發(fā)送寫指令了)
如果user繼續(xù)發(fā)送寫指令誉察,則繼續(xù)輸出full標志与涡,同時寫指針不再自加,有效的寫命令不會生成持偏,user發(fā)送過來的數(shù)據(jù)不會被寫入到ram里.
直到有讀指針把full拉低驼卖。才可以繼續(xù)寫入數(shù)據(jù).   
1.1.png
1.2.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸿秆,隨后出現(xiàn)的幾起案子酌畜,更是在濱河造成了極大的恐慌,老刑警劉巖桥胞,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件考婴,死亡現(xiàn)場離奇詭異贩虾,居然都是意外死亡沥阱,警方通過查閱死者的電腦和手機缎罢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來考杉,“玉大人,你說我怎么就攤上這事崇棠。” “怎么了枕稀?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵询刹,是天一觀的道長。 經(jīng)常有香客問我萎坷,道長范抓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮虐呻,結果婚禮上象泵,老公的妹妹穿的比我還像新娘斟叼。我一直安慰自己,他們只是感情好朗涩,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谢床,像睡著了一般。 火紅的嫁衣襯著肌膚如雪出革。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天骂束,我揣著相機與錄音成箫,去河邊找鬼。 笑死蹬昌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凳厢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼治泥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了居夹?” 一聲冷哼從身側(cè)響起本冲,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤准脂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后檬洞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡湾戳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砾脑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡盅藻,死狀恐怖畅铭,靈堂內(nèi)的尸體忽然破棺而出氏淑,到底是詐尸還是另有隱情顶瞒,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布榴徐,位于F島的核電站,受9級特大地震影響耗帕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仿便,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一攒巍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柒莉,春花似錦、人聲如沸兢孝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夯秃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寝并,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工衬潦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留植酥,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓漂羊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親走越。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 學習鏈接:https://www.cnblogs.com/IClearner/p/6579754.html跨時鐘域...
    簡柏舟閱讀 2,117評論 0 1
  • by yang 最近準備數(shù)字IC崗時復習整理的知識點,參考了比較火的fpga面試題框都,和一些相關知識。主要是寫著自己...
    Yuhan盡量笑不露齒閱讀 8,026評論 0 4
  • FIFO是一種現(xiàn)先進先出的數(shù)據(jù)緩沖器熬尺,特點是沒有外部的讀寫地址。根據(jù)滿和空信號設計寫使能和讀使能來寫/讀FIFO粱哼,...
    黑心的一濤閱讀 4,109評論 0 3
  • 本文首發(fā)于個人博客 1.設計目標 設計一個參數(shù)可配置的異步FIFO妥衣,要求: FIFO深度從4開始在2的冪次方連續(xù)可...
    月見樽閱讀 1,954評論 0 0
  • FIFO即First In First Out,是一種先進先出數(shù)據(jù)存儲税手、緩沖器,我們知道一般的存儲器是用外部的讀寫...
    li_li_li_1202閱讀 5,053評論 0 5