日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FIFO的verilog代码

發布時間:2023/12/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FIFO的verilog代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ??FIFO是英文First In First Out 的縮寫,是一種先進先出的數據緩存器,他與普通存儲器的區別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。 FIFO的一些重要參數 1、FIFO的寬度:也就是英文資料里常看到的THE WIDTH,它指的是FIFO一次讀寫操作的數據位,就像MCU有8位和16位,ARM 32位等等。 2、FIFO的深度:THE DEEPTH,它指的是FIFO可以存儲多少個N位的數據(如果寬度為N)。如一個8位的FIFO,若深度為8,它可以存儲8個8位的數據,深度為12 ,就可以存儲12個8位的數據。 3、滿標志:FIFO已滿或將要滿時由FIFO的狀態電路送出的一個信號,以阻止FIFO的寫操作繼續向FIFO中寫數據而造成溢出(overflow)。 4、空標志:FIFO已空或將要空時由FIFO的狀態電路送出的一個信號,以阻止FIFO的讀操作繼續從FIFO中讀出數據而造成無效數據的讀出(underflow)。 5、讀指針:指向下一個讀出地址。讀完后自動加1。

 6、寫指針:指向下一個要寫入的地址的,寫完自動加1。


? ? ?對于FIFO,讀寫指針都指向一個內存的初始位置,每進行一次讀寫操作,相應的指針就遞增一次,指向下一個內存位置。當指針移動到了內存的最后一個位置時,它又重新跳回初始位置。在FIFO非滿或非空的情況下,這個過程將隨著讀寫控制信號的變化一直進行下去。如果FIFO處于空的狀態,下一個讀動作將會導致向下溢(underflow),一個無效的數據被讀人;同樣,對于一個滿了的FIFO,進行寫動作將會導致向上溢出(overflow),一個有用的數據被新寫入的數據覆蓋。這兩種情況都屬于誤動作,因此需要設置滿和空兩個信號,對滿信號置位表示FIFO處于滿狀態,對滿信號復位表示FIFO非滿,還有空間可以寫入數據;對空信號置位表示FIFO處于空狀態,對空信號復位表示FIFO非空,還有有效的數據可以讀出。

/************************************** * Module: fifo * Date:2014-08-10 * Author: hemmingway@163.com * * Description: FIFO存儲器設計 ***************************************/ module fifo(clk,rstp,din,writep,readp,dout,emptyp,fullp ); input clk; input rstp; // 復位信號 input[15:0] din; input readp; input writep; output[15:0] dout; output emptyp; output fullp; parameter DEPTH = 2,MAX_COUNT=2'b11; //定義地址最大值reg emptyp; reg fullp; reg[15:0] dout; reg[(DEPTH-1):0] tail; reg[(DEPTH-1):0] head; reg[(DEPTH-1):0] count; reg[15:0] fifomem[0:MAX_COUNT]; // 定義fifo存儲器,4個16位的存儲器// dout被賦給tail指針指向的數值 always @(posedge clk) beginif(rstp==1) begindout <= 16'h0000; // 復位信號有效置0endelse begindout <= fifomem[tail]; //將fifomem中第tail個單元給doutend end// 寫入數據 always @(posedge clk) beginif(rstp==1'b0 && writep == 1'b1 && fullp == 1'b0) beginfifomem[head]<=din; // 寫入end end// head指針遞增 always @(posedge clk) beginif(rstp==1'b1) beginhead<=2'b00;endelse beginif(writep==1'b1 && fullp==1'b0) beginhead<=head+1;endend end//tail指針遞增 always @(posedge clk) beginif(rstp==1'b1) begintail<=2'b00;endelse beginif(readp==1'b1 && emptyp==1'b0) begintail<=tail+1;endend end// 計數器 always @(posedge clk) beginif (rstp == 1'b1) begincount <= 2'b00;endelse begincase ({readp, writep})2'b00: count <= count;2'b01: if (count != MAX_COUNT) count <= count + 1; //為寫狀態時計數器進行加法計數2'b10: if (count != 2'b00)count <= count - 1; //為讀狀態計數器進行減法計數2'b11:count <= count;endcaseend end// empty指針 always @(count) beginif (count == 2'b00)emptyp <= 1'b1; //count為0時emptyp賦為1elseemptyp <= 1'b0; end// fullp指針 always @(count) beginif (count == MAX_COUNT)fullp <= 1'b1; //計數到最大時fullp賦為1elsefullp <= 1'b0; endendmodule



/************************************** * Module: test_fifo * Date:2014-08-10 * Author: hemmingway@163.com * * Description: FIFO測試程序 ***************************************/ module test_fifo;reg clk; reg rstp; reg [15:0] din; reg readp; reg writep; wire [15:0] dout; wire emptyp; wire fullp;reg [15:0] value; fifo U1 (.clk(clk),.rstp(rstp),.din(din),.readp(readp),.writep(writep),.dout(dout),.emptyp(emptyp),.fullp(fullp));// 讀任務 task read_word; begin@(negedge clk);readp = 1;@(posedge clk) #5;readp = 0; end endtask// 寫任務 task write_word; input [15:0] value; begin@(negedge clk);din = value;writep = 1;@(posedge clk);#5;din = 16'hzzzz;writep = 0; end endtaskinitial beginclk = 0;forever begin#10 clk = 1;#10 clk = 0;end endinitial begin//test1;test2; //調用測試模塊2 endtask test1; begindin = 16'hzzzz;writep = 0;readp = 0;rstp = 1;#50 rstp = 0;#50;write_word (16'h1111);write_word (16'h2222);write_word (16‘h3333); //寫入3個數據read_word;read_word; //讀兩個write_word (16‘h4444); //在寫一個數據repeat (6) beginread_word; endwrite_word (16'h0001);write_word (16'h0002);write_word (16'h0003);write_word (16'h0004);write_word (16'h0005);write_word (16'h0006);write_word (16'h0007);write_word (16'h0008); repeat (6) beginread_word;end end endtasktask test2; reg [15:0] writer_counter; beginwriter_counter = 16'h0001;din = 16'hzzzz;writep = 0;readp = 0;rstp = 1;#50 rstp = 0;#50;fork//寫數據beginrepeat (500) begin@(negedge clk);if (fullp == 1'b0) beginwrite_word (writer_counter);#5;writer_counter = writer_counter + 1;end#50;endend//讀數據beginforever begin@(negedge clk);if (emptyp == 1'b0) beginread_word;end #50;endendjoin end endtaskendmodule

總結

以上是生活随笔為你收集整理的FIFO的verilog代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。