A. fpga中fifo的大小為多少才不浪費存儲器資源
FIFO設置的位寬和你選用的FPGA一致,就可以最大限度利用資源、。
B. 請問FIFO是什麼意思
FIFO( First Input First Output)簡單說就是指先進先出。由於微電子技術的飛速發展,新一代FIFO晶元容量越來越大,體積越來越小,價格越來越便宜。作為一種新型大規模集成電路,FIFO晶元以其靈
活、方便、高效的特性,逐漸在高速數據採集、高速數據處理、高速數據傳輸以及多機處理系統中得到越來越廣泛的應用。
在系統設計中,以增加數據傳輸率、處理大量數據流、匹配具有不同傳輸率的系統為目的而廣泛使用FIFO存儲器,從而提高了系統性能。FIFO存儲器是一個先入先出的雙口緩沖器,即第一個進入其
內的數據第一個被移出,其中一個存儲器的輸入口,另一個口是存儲器的輸出口。對於單片FIFO來說,主要有兩種結構:觸發導向結構和零導向傳輸結構。觸發導向傳輸結構的FIFO是由寄存器陣列
構成的,零導向傳輸結構的FIFO是由具有讀和寫地址指針的雙口RAM構成。
(2)FIFO存儲器擴展閱讀:
FIFO存儲器是系統的緩沖環節,如果沒有FIFO存儲器,整個系統就不可能正常工作,它主要有幾方面的功能:
1、對連續的數據流進行緩存,防止在進機和存儲操作時丟失數據;
2、數據集中起來進行進機和存儲,可避免頻繁的匯流排操作,減輕CPU的負擔;
3、允許系統進行DMA操作,提高數據的傳輸速度。這是至關重要的一點,如果不採用DMA操作,數據傳輸將達不到傳輸要求,而且大大增加CPU的負擔,無法同時完成數據的存儲工作。
參考資料來源:網路-FIFO存儲器
C. 立創商城的存儲器怎麼樣FIFO存儲器好用嗎
質量還可以
D. FIFO和雙口RAM有什麼區別
在測控、儀器儀表、語音信號處理和圖像通信領域中往往需要多處理器分工完成數字信號處理(DSP)演算法和與外部系統的通信、控制、數據採集和人機介面功能。在多機系統中,CPU之間的通信常採用以下幾種方式:(1)串列通信。這種方式相對簡單,由於受到波特率的限制,在不同檔次單片機之間需要通信業務大的場合得不到很好的通信效果。(2)並行通信。利用CPU的I/O功能在CPU之間增加緩沖器或鎖存器實現雙機通信。通信性能較串列通信有所提高,但仍然得不到理想的效果。(3)利用共享式存儲器實現。DMA方式就是其中的一種,能夠達到數據的高速傳輸,但不能同時訪問存儲器,CPU必須等待匯流排,而且有些CPU不支持DMA功能。另一種是利用多埠存儲器,雙口RAM和FIFO是常用的兩種多埠的存儲器,允許多CPU同時訪問存儲器,大大提高了通信效率,而且對CPU沒有過多的要求,特別適合異種CPU之間非同步高速系統中。因此,受到硬體設計者的青睞。
雙口RAM是常見的共享式多埠存儲器,以圖1所示通用雙口靜態RAM為例來說明雙口RAM的工作原理和仲裁邏輯控制。雙口RAM最大的特點是存儲數據共享。圖1中,一個存儲器配備兩套獨立的地址、數據和控制線,允許兩個獨立的CPU或控制器同時非同步地訪問存儲單元。既然數據共享,就必須存在訪問仲裁控制。內部仲裁邏輯控制提供以下功能:對同一地址單元訪問的時序控制;存儲單元數據塊的訪問許可權分配;信令交換邏輯(例如中斷信號)等。
FIFO(First In First Out)全稱是先進先出的存儲器。先進先出也是FIFO的主要特點。
FIFO只允許兩端一個寫,一個讀,因此FIFO是一種半共享式存儲器。在雙機系統中,只允許一個CPU往FIFO寫數據,另一個CPU從FIFO讀數據。而且,只要注意標志輸出,空指示不寫,滿指示不讀,就不會發生寫入數據丟失和讀出數據無效。
本文介紹了以雙口RAM和FIFO為例,利用多埠存儲器設計多機系統。現對雙口RA幾FIFO比較如下:(1)FIFO的仲裁控制簡單,但其容量不如雙口RAM。由於先進先出的特點,特別適合數據緩沖和突發傳送數據。某些晶元的內部就集成小容量FIFO,例如,DSP的同步串口就集成兩個FIFO,用於接收和發送數據緩沖。雙口RAM的仲裁邏輯比FIFO復雜,但其容量較
大。由於存儲數據完全共享,適用於雙機系統的全局存儲器和大容量數據存儲共享,例如大容量磁碟的數據緩存可採用雙口RAM。(2)FIFO只給外部提供一個讀和一個寫信號,因此CPU用一個I/O地址便可讀或寫FIFO,使硬體趨於簡單,給編程也帶來一些方便,但CPU不能對FIFO內部的存儲器進行定址。雙口RAM由於有兩套地址線,使硬體較FIFO復雜,但允許CPU訪問內部存儲單元,因此CPU之間可以自己定主和分配數據塊以及數據單元,使軟體設計更加靈活。
在異種機系統設計中,利用雙口RAM和FIFO能夠實時、快速、靈活和方便地進行相互通信,得到滿意的效果。
E. FIFO存儲器代碼
mole fifo(clock,reset,read,write,fifo_in,fifo_out,fifo_empty,fifo_half,fifo_full);
input clock,reset,read,write;
input [7:0] fifo_in;
output [7:0] fifo_out;
output fifo_empty,fifo_half,fifo_full; //表示存儲單元使用情況的標志位
reg [7:0] fifo_out;
reg [2:0] read_ptr,write_ptr,counter; //讀,寫指針及計數器
reg [7:0] ram [7:0]; //8個8位的存儲單元
wire fifo_empty,fifo_half,fifo_full;
always@(posedge clock) //復位信號有效時給系統復位
if (reset)
begin
read_ptr=0;
write_ptr=0;
counter=0;
fifo_out=0;
end
else //做讀(數據輸出),寫(數據輸入)操作
case({read,write})
2'b00: //沒有讀寫指令
counter=counter;
2'b01: //寫指令,數據輸入FIFO
begin
ram[write_ptr]=fifo_in; //將輸入數據寫入存儲單元
counter=counter+1; //每寫入一個數就讓計數器加1
write_ptr=(write_ptr==7)?0:write_ptr+1;
/*寫指針加1,若指針指向最後一個存儲單元(write_ptr==7),則把指針指向第一個存儲單元*/
end
2'b10: //讀指令,數據從FIFO輸出
begin
fifo_out=ram[read_ptr]; //將存儲單元的數據輸出
counter=counter-1; //每讀出一個數就讓計數器減1
read_ptr=(read_ptr==7)?0:read_ptr+1;
/*讀指針加1,若指針指向最後一個存儲單元(read _ptr ==7),則把指針指向第一個存儲單元*/
end
2'b11: //讀寫指令,同時做數據輸入和輸出
begin
if(counter==0) //存儲單元是空的,所以當前輸入數據可以直接輸出
fifo_out=fifo_in;
else
begin
ram[write_ptr]=fifo_in;
fifo_out=ram[read_ptr];
write_ptr=(write_ptr==7)?0:write_ptr+1;
read_ptr=(read_ptr==7)?0:read_ptr+1;
end
end
endcase
assign fifo_empty=(counter==0); //存儲單元都是空的時候將標志位fifo_empty置1
assign fifo_full=(counter==7); //存儲單元都滿了的情況下將標志位fifo_full置1
assign fifo_half=(counter==4); //存儲單元佔用了一半的時候將標志位fifo_half置1
endmole
F. 什麼是FIFO
FIFO是First Input First Output的縮寫,先入先出隊列,這是一種傳統的按序執行方法,先進入的指令先完成並引退,跟著才執行第二條指令。
是一種先進先出的數據緩存器,它與普通存儲器的區別是沒有外部讀寫地址線,這樣使用起來非常簡單。
但缺點就是只能順序寫入數據,順序讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。
G. 求助!在用FPGA中得Block RAM製作FIFO存儲器時,FIFO的讀寫時鍾周期是不是固定的也就是說是由硬體定好了
設置FIFO讀寫周期是什麼意思?控制FIFO的讀寫時鍾?
為什麼不通過控制讀寫使能信號來實現?
H. FIFO 控制器 的作用是什麼
IFO 是先入先出存儲器的縮寫,FIFO 控制器在數字系統中被大量使用,可以作為數據緩存
使用。時鍾同步的FIFO 控制器介面如下圖所示,主要介面信號定義如下:
RST_N:非同步復位信號,當RST_N 為低電平時,FULL 輸出『0』,EMPTY 信號輸出『1』
電平,FIFO 指針指向0,FIFO 被清空;
CLK:時鍾信號,輸出信號與CLK 信號同步;
DATAIN:數據輸入信號,8 位匯流排;
RD:讀有效信號,高電平有效,當RD 位高時,在時鍾信號CLK 的上升沿,DATAOUT 輸
出一個8 位的有效數據;
WR:寫有效信號,當WR 為高電平時,在CLK 的上升沿,從DATAIN 信號向存儲器寫入
一個8 位的有效數據;
DATAOUT:數據輸出信號,8 位匯流排,在CLK 的上升沿,當RD 為高電平時,從FIFO 中
輸出一個8 位的數據;
FULL:存儲器寫滿標志信號,高電平時表示存儲器中的數據已經寫滿;
EMPTY:存儲器讀空標志信號,高電平時表示存儲器中的數據已經被讀空了。
要求:用Verilog 寫一個8x16 的FIFO,完成先入先出的功能,並且在FIFO讀空時輸出EMPTY
有效信號,讀指針RP 不再移動;FIFO 寫滿時輸出FULL 有效信號,並且即使WR 有效也
不再向存儲單元中寫入數據(寫指針WP 不再移動)。
存儲單元使用一個二維數組來建模。注意存儲單元的地址在讀或者寫到最高地址時要能回到
最低值。
寫出合適的testbench 來測試所寫的Verilog 代碼,檢驗其正確性。
mole fifo_mem(data,clk,rstN,wrN,rdN,empty,full);
inout [7:0] data;
input clk,rstN,wrN,rdN;
output empty,full;
reg [4:0] _cntr,rd_cntr;
wire [3:0] add;
ram16X8 ram(.data(data),.addr(addr),.wrN(wrN),.oe(wrN));
always @(posedge clk or negedge rstN)
if(!rstN) wr_cntr<=0;
else if (!wrN) wr_cntr<=wr_cntr+1;
always @ (posedge clk or negedge rstN)
if(!rstN) rd_cntr<=0;
else if(!rdN) rd_cntr<=rd_cntr+1;
assign addr=wrN?rd_cntr [3:0]: wr_cntr [3:0];
assign empty=(wr_cntr [3:0] == rd_cntr [3:0])&&!(wr_cntr[4]^rd_cntr[4]);
assign full=(wr_cntr [3:0] ==rd_cntr [3:0])&&(wr_cntr[4]^rd_cntr[4]);
endmole
I. 什麼是FIFO緩存隊列
FIFO是英文First In First Out 的縮寫,是一種先進先出的數據緩存器,他與普通存儲器的區別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。 FIFO一般用於不同時鍾域之間的數據傳輸,比如FIFO的一端時AD數據採集,另一端時計算機的PCI匯流排,假設其AD採集的速率為16位 100K SPS,那麼每秒的數據量為100K×16bit=1.6Mbps,而PCI匯流排的速度為33MHz,匯流排寬度32bit,其最大傳輸速率為1056Mbps,在兩個不同的時鍾域間就可以採用FIFO來作為數據緩沖。另外對於不同寬度的數據介面也可以用FIFO,例如單片機位8位數據輸出,而DSP可能是16位數據輸入,在單片機與DSP連接時就可以使用FIFO來達到數據匹配的目的。 3.FIFO的一些重要參數 FIFO的寬度:也就是英文資料里常看到的THE WIDTH,它只的是FIFO一次讀寫操作的數據位,就像MCU有8位和16位,ARM 32位等等,FIFO的寬度在單片成品IC中是固定的,也有可選擇的,如果用FPGA自己實現一個FIFO,其數據位,也就是寬度是可以自己定義的。 FIFO的深度:THE DEEPTH,它指的是FIFO可以存儲多少個N位的數據(如果寬度為N)。如一個8位的FIFO,若深度為8,它可以存儲8個8位的數據,深度為12 ,就可以存儲12個8位的數據,FIFO的深度可大可小,個人認為FIFO深度的計算並無一個固定的公式。在FIFO實際工作中,其數據的滿/空標志可以控制數據的繼續寫入或讀出。在一個具體的應用中也不可能由一些參數算數精確的所需FIFO深度為多少,這在寫速度大於讀速度的理想狀態下是可行的,但在實際中用到的FIFO深度往往要大於計算值。一般來說根據電路的具體情況,在兼顧系統性能和FIFO成本的情況下估算一個大概的寬度和深度就可以了。而對於寫速度慢於讀速度的應用,FIFO的深度要根據讀出的數據結構和讀出數據的由那些具體的要求來確定。 滿標志:FIFO已滿或將要滿時由FIFO的狀態電路送出的一個信號,以阻止FIFO的寫操作繼續向FIFO中寫數據而造成溢出(overflow)。 空標志:FIFO已空或將要空時由FIFO的狀態電路送出的一個信號,以阻止FIFO的讀操作繼續從FIFO中讀出數據而造成無效數據的讀出(underflow)。 讀時鍾:讀操作所遵循的時鍾,在每個時鍾沿來臨時讀數據。 寫時鍾:寫操作所遵循的時鍾,在每個時鍾沿來臨時寫數據。 讀指針:指向下一個讀出地址。讀完後自動加1。 寫指針:指向下一個要寫入的地址的,寫完自動加1。 讀寫指針其實就是讀寫的地址,只不過這個地址不能任意選擇,而是連續的。 4.FIFO的分類 根均FIFO工作的時鍾域,可以將FIFO分為同步FIFO和非同步FIFO。同步FIFO是指讀時鍾和寫時鍾為同一個時鍾。在時鍾沿來臨時同時發生讀寫操作。非同步FIFO是指讀寫時鍾不一致,讀寫時鍾是互相獨立的。 5.FIFO設計的難點 FIFO設計的難點在於怎樣判斷FIFO的空/滿狀態。為了保證數據正確的寫入或讀出,而不發生益處或讀空的狀態出現,必須保證FIFO在滿的情況下,不能進行寫操作。在空的狀態下不能進行讀操作。怎樣判斷FIFO的滿/空就成了FIFO設計的核心問題。由於同步FIFO幾乎很少用到,這里只描述非同步FIFO的空/滿標志產生問題。 補充: 在用到觸發器的設計中,不可避免的會遇到亞穩態的問題(關於亞穩態這里不作介紹,可查看相關資料)。在涉及到觸發器的電路中,亞穩態無法徹底消除,只能想辦法將其發生的概率將到最低。其中的一個方法就是使用格雷碼。格雷碼在相鄰的兩個碼元之間只由一位變換(二進制碼在很多情況下是很多碼元在同時變化)。這就會避免計數器與時鍾同步的時候發生亞穩態現象。但是格雷碼有個缺點就是只能定義2^n的深度,而不能像二進制碼那樣隨意的定義FIFO的深度,因為格雷碼必須循環一個2^n,否則就不能保證兩個相鄰碼元之間相差一位的條件,因此也就不是真正的各雷碼了。第二就是使用冗餘的觸發器,假設一個觸發器發生亞穩態的概率為P,那麼兩個及聯的觸發器發生亞穩態的概率就為P的平方。但這回導致延時的增加。亞穩態的發生會使得FIFO出現錯誤,讀/寫時鍾采樣的地址指針會與真實的值之間不同,這就導致寫入或讀出的地址錯誤。由於考慮延時的作用,空/滿標志的產生並不一定出現在FIFO真的空/滿時才出現。可能FIFO還未空/滿時就出現了空/滿標志。這並沒有什麼不好,只要保證FIFO不出現overflow or underflow 就OK了。 很多關於FIFO的文章其實討論的都是空/滿標志的不同演算法問題。 在Vijay A. Nebhrajani的《非同步FIFO結構》一文中,作者提出了兩個關於FIFO空/滿標志的演算法。 第一個演算法:構造一個指針寬度為N+1,深度為2^N位元組的FIFO(為便方比較將格雷碼指針轉換為二進制指針)。當指針的二進制碼中最高位不一致而其它N位都相等時,FIFO為滿(在Clifford E. Cummings的文章中以格雷碼表示是前兩位均不相同,而後兩位LSB相同為滿,這與換成二進製表示的MSB不同其他相同為滿是一樣的)。當指針完全相等時,FIFO為空。這也許不容易看出,舉個例子說明一下:一個深度為8位元組的FIFO怎樣工作(使用已轉換為二進制的指針)。FIFO_WIDTH=8, 補充: FIFO_DEPTH= 2^N = 8,N = 3,指針寬度為N+1=4。起初rd_ptr_bin和wr_ptr_bin均為「0000」。此時FIFO中寫入8個位元組的數據。wr_ptr_bin =「1000」,rd_ptr_bin=「0000」。當然,這就是滿條件。現在,假設執行了8次的讀操作,使得rd_ptr_bin =「1000」,這就是空條件。另外的8次寫操作將使wr_ptr_bin 等於「0000」,但rd_ptr_bin 仍然等於「1000」,因此FIFO為滿條件。 顯然起始指針無需為「0000」。假設它為「0100」,並且FIFO為空,那麼8個位元組會使wr_ptr_bin =「1100」,, rd_ptr_bin 仍然為「0100」。這又說明FIFO為滿。若寫指針的高兩位MSB大於讀指針的高兩位MSB則FIFO為「幾乎空」。 在Vijay A. Nebhrajani的《非同步FIFO結構》第三部分的文章中也提到了一種方法,那就是方向標志與門限。設定了FIFO容量的75%作為上限,設定FIFO容量的25%為下限。當方向標志超過門限便輸出滿/空標志,這與Clifford E. Cummings的文章中提到的STYLE #2可謂是異曲同工。他們都屬於保守的空滿判斷。其實這時輸出空滿標志FIFO並不一定真的空/滿。 說到此,我們已經清楚地看到,FIFO設計最關鍵的就是產生空/滿標志的演算法的不同產生了不同的FIFO。
J. 立創商城中的FIFO存儲器好用嗎
挺好用的,而且立創的品牌種類也比較多。