同步FIFO之VHDL描述_第1頁
同步FIFO之VHDL描述_第2頁
同步FIFO之VHDL描述_第3頁
同步FIFO之VHDL描述_第4頁
同步FIFO之VHDL描述_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、同步FIFO之VHDL描述 (1作者:skycanny 時間:2007-09-28 16:09:38來自:skycanny的筆記瀏覽次數(shù):1601文字大小:【大】【中】【小】同步FIFO之VHDL描述同步FIFO的意思是說FIFO的讀寫時鐘是同一個時鐘,不同于異步FIFO,異步FIFO的讀寫時鐘是完全異步的。同步FIFO的對外接口包括時鐘,清零,讀請求,寫請求,數(shù)據(jù)輸入總線,數(shù)據(jù)輸出總線,空以及滿信號。下面分別對同步FIFO的對外接口信號作一描述:1 時鐘,輸入,用于同步FIFO的讀和寫,上升沿有效;2 清零,輸入,異步清零信號,低電平有效,該信號有效時,F(xiàn)IFO被清空;3 寫請求,輸入,低電

2、平有效,該信號有效時,表明外部電路請求向FIFO寫入數(shù)據(jù);4 讀請求,輸入,低電平有效,該信號有效時,表明外部電路請求從FIFO中讀取數(shù)據(jù);5 數(shù)據(jù)輸入總線,輸入,當寫信號有效時,數(shù)據(jù)輸入總線上的數(shù)據(jù)被寫入到FIFO中;6 數(shù)據(jù)輸出總線,輸出,當讀信號有效時,數(shù)據(jù)從FIFO中被讀出并放到數(shù)據(jù)輸出總線上;7 空,輸出,高電平有效,當該信號有效時,表明FIFO中沒有任何數(shù)據(jù),全部為空;8 滿,輸出,高電平有效,當該信號有效時,表明FIFO已經(jīng)滿了,沒有空間可用來存貯數(shù)據(jù)。使用VHDL描述的FIFO將以上面的接口為基礎,并且可以參數(shù)化配置FIFO的寬度和深度。先把對外接口描述出來吧。- Design

3、er : skycanny- Date : 2007-1-29- Description : Synchronous FIFO created by VHDLlibrary ieee;entity sfifo is generic(width : positivedepth : positive;port(clk : in std_logic;rst : in std_logic;wq : in std_logic;rq : in std_logic;data : in std_logic_vector(width - 1 downto 0;q : in std_logic_vector(wi

4、dth - 1 downto 0;empty : out std_logic;full : out std_logic;end entity sfifo;-同步FIFO內(nèi)部通過控制電路和RAM實現(xiàn),控制電路主要包括寫指針管理電路,讀指針管理電路,以及FIFO狀態(tài)判斷電路,對于同步FIFO來講,讀和寫的指針管理電路實際上就是二進制計數(shù)器?,F(xiàn)在的FPGA都具有Block RAM,通過VHDL描述可以對其進行調(diào)用,為了能夠?qū)崿F(xiàn)任意深度和寬度的FIFO,那么在用VHDL描述RAM的時候需要使用generic使得RAM的調(diào)用能夠參書化。同樣,對于讀寫指針計數(shù)器,也需要參數(shù)化的描述方法。下面主要對FIFO

5、的狀態(tài)判斷如何判斷進行一些說明。假設寬度任意而深度為8的FIFO,當讀指針read_pointer和寫指針write_pointer的值一樣的時候,很顯然,這時FIFO的狀態(tài)為空。比較麻煩的是對FIFO是否已經(jīng)滿的狀態(tài)的判斷,因為存在兩種情況,第一種情況時寫指針write_pointer比讀指針read_pointer大,比如writer_pointer = 7而read_pointer = 0,還有一種情況時寫指針writer_pointer比讀指針read_pointer小,比如writer_pointer = 2而read_pointer = 3。由于讀寫電路在循環(huán)的讀寫RAM,所以在上

6、面的兩種情況下FIFO實際上都已經(jīng)滿了。那么如何對讀寫指針的判斷比較容易的得出FIFO已經(jīng)滿了,同時這樣的判斷電路還要容易參數(shù)化?第一種情況下,write_pointer read_pointer = 7,實際上就是FIFO深度減一,第二種情況下,(write_pointer + 8 read_pointer = 7,也是FIFO深度減一。從上面的討論就可以很容易進行判斷FIFO狀態(tài)了,假設FIFO的深度用depth表示,則FIFO狀態(tài)判斷用偽碼表示如下:1 Empty狀態(tài)判斷:If writer_pointer = read_pointerFIFO is empty;ElseFIFO is

7、not empty;End if;2. Full狀態(tài)判斷:If writer_pointer read_pointerIf write_pointer read_pointer = depthFIFO is full;ElseFIFO is not full;End if;ElseIf write_pointer read_pointer = 1FIFO is full;ElseFIFO is not full;End if;End if;下面的框圖主要描述同步FIFO的內(nèi)部結構,畫出框圖有助于對電路結構的理解,同樣也有助于RTL代碼的編寫 今天就先寫到這里吧,大家有什么問題和意見可以提出來,

8、以便我及早的發(fā)現(xiàn)問題,不要等到要寫代碼的的時候才發(fā)現(xiàn)就麻煩了。今天又重新安裝了UltraEdit, Quartus II6.0和Modelsim SE 6.0,這次安裝以后系統(tǒng)沒有發(fā)現(xiàn)什么異常。另外還安裝了紫光的拼音輸入法,用習慣了這個,微軟呀,智能ABC這些都用不太習慣。最后把系統(tǒng)備份了一下,以免將來出了什么問題還可以還原一下,呵呵。還是接著昨天的同步FIFO之VHDL描述。突然發(fā)現(xiàn)用于實現(xiàn)FIFO的RAM必須是真正意義上的雙口RAM,也就是讀寫可以同時進行的,以前只是用VHDL描述過單端口的RAM,雙口RAM還沒有描述過,不過曾經(jīng)看到過Xilinx FPGA/CPLD的開發(fā)工具ISE的Co

9、re Genertor好像提供雙口RAM的軟核,所以我想用HDL語言也就應該可以描述從而調(diào)用雙口RAM,這個等到具體寫雙口RAM的RTL代碼的時候再研究。還有一個問題就是FIFO的讀寫請求控制信號必須要控制FIFO讀寫指針的產(chǎn)生電路,只有讀寫信號信號有效的時候,F(xiàn)IFO讀寫指針才能是有效的,負責是無效而且要保持不變,這個容易理解。今天,就先完成寫指針產(chǎn)生和管理電路的RTL代碼吧,其實很簡單,就是一個二進制計數(shù)器。下面就是VHDL的代碼,大家看看有沒有什么問題。- Designer : skycanny- Date : 2007-2-2- Description : write_pointer

10、is created - Modification : add FIFO status full judge 2007-2-3 skycannylibrary ieee;entity write_pointer isgeneric不明白寫/讀指針為什么是“depth-1 downto 0”位的矢量,depth不是FIFO的深度嗎?難道深度16的FIFO的寫/讀指針為std_logic_vector(15 downto 0類型嗎?( depth : positive ;port(clk : in std_logic;rst : in std_logic;wq : in std_logic;ful

11、l : in std_logic;wr_pt : out std_logic_vector(depth - 1 downto 0 ;end entity;architecture RTL of write_pointer issignal wr_pt_t : std_logic_vector(depth - 1 downto 0; - writer pointer counterbeginprocess(rst, clkbeginif rst = 0 thenwr_pt_t 0;elsif clkevent and clk = 1 thenif wq = 0 and full = 0 then

12、wr_pt_t = wr_pt_t + 1;end if;end process;wr_pt = wr_pt_t;end RTL;同步FIFO之VHDL描述 (2作者:skycanny 時間:2007-09-28 16:09:38來自:skycanny的筆記瀏覽次數(shù):1602文字大?。骸敬蟆俊局小俊拘 拷裉鞙蕚渫瓿赏紽IFO其他模塊的代碼,主要包括讀指針管理和產(chǎn)生電路,F(xiàn)IFO狀態(tài)判斷電路,以及雙端口RAM的VHDL描述。先是讀指針管理和產(chǎn)生電路:- Designer:skycanny- Date:2007-2-3- Description:read_pointer is created e

13、ntity read_pointer isgeneric( depth:positive;port( clk:instd_logic; rst:instd_logic; rq:instd_logic; empty:instd_logic; rd_pt:outstd_logic_vector(depth - 1 downto 0;end entity read_pointer;architecture RTL of read_pointer issignalrd_pt_t:std_logic_vector(depth - 1 downto 0; - read pointer counterbeg

14、inprocess(rst, clkbeginif rst = 0 thenrd_pt_t 0;elsif clkevent and clk = 1 thenif rq = 0 and empty = 0 thenrd_pt_t = rd_pt_t + 1;end if;end process;rd_pt = rd_pt_t;end RTL;-剛才想了一下,讀寫指針產(chǎn)生電路必須要對FIFO的狀態(tài)進行判斷,所以又對上面的代碼進行了一點修改(上面的代碼是修改過的),判斷FIFO的狀態(tài),這一點在剛開始的時候給疏忽了,幸好剛才給發(fā)現(xiàn)了。同樣昨天寫的寫指針產(chǎn)生電路沒有判斷FIFO的full狀態(tài),也要進行

15、修改,還是在昨天的基礎上修改吧,就不在這里羅嗦了,下面就是FIFO狀態(tài)判斷電路的VHDL描述。- Designer : skycanny- Date : 2007-2-3- Description : read_pointer is created library ieee;entity judge_status isgeneric(depth : positive;port(clk : in std_logic;rst : in std_logic;wr_pt : in std_logic_vector(depth - 1 downto 0;rd_pt : in std_logic_vect

16、or(depth - 1 downto 0;empty : out std_logic;full : out std_logic;end entity judge_status;architecture RTL of judge_status isbeginprocess(rst, clkbeginif rst = 0 thenempty = 1;elsif clkevent and clk = 1 thenif wr_pt = rd_pt thenempty = 1;elseempty = 0;end if;end if;end process;process(rst, clkbeginif

17、 rst = 0 thenfull rd_pt thenif (rd_pt + depth = wr_pt thenfull = 1;else full = 0;end if;elseif (wr_pt + 1 = rd_pt thenfull = 1;elsefull = 0;end if; end if;end if;end process;end RTL;-廣告時間歡迎訪問skycanny的筆記(副站 ?,F(xiàn)在就開始雙口RAM的VHDL描述吧,這個可是很重要的。下面的代碼在Altera的CycloneII系列的器件上通過了后仿真。- Designer : skycanny- Date :

18、2007-2-3- Description : This VHDL file is designed to generate a dual port ram - Device : Cyclone IIlibrary ieee;entity dualram isgeneric(width : positive := 16;depth : positive := 8;port(- port a is only for writing -clka : in std_logic;wr : in std_logic;addra : in std_logic_vector(depth - 1 downto

19、 0;datain : in std_logic_vector(width - 1 downto 0;- port b is only for reading -clkb : in std_logic;rd : in std_logic;addrb : in std_logic_vector(depth - 1 downto 0;dataout : out std_logic_vector(width - 1 downto 0 -;end entity dualram;architecture Behavioral of dualram istype ram is array(2 * dept

20、h - 1 downto 0 of std_logic_vector(width - 1 downto 0;signal dualram : ram;beginprocess(clka, clkbbeginif clkaevent and clka = 1 thenif wr = 0 thendualram(conv_integer(addra = datain;end if;end if;end process;process(clkbbeginif clkbevent and clkb = 1 thenif rd = 0 thendataout = dualram(conv_integer

21、(addrb;end if;end if;end process;end Behavioral;-抓個后仿真的圖形吧,需要testbench的投票留言。另外今天還發(fā)現(xiàn)前仿真的時候可以用generic傳遞參數(shù),而后仿真的時候就不能用generic傳遞參數(shù)了,Modelsim會報錯“No default binding for component at”。后來想了一下確實應該是這樣的,因為后仿真的時候電路都已經(jīng)布局布線完成了,還有什么參數(shù)需要generic傳遞呀?昨天晚上把所有的模塊描述都完成了,同時還完成了雙端口RAM的后仿真,從目前的仿真結果來看,應該沒有什么問題。今天的任務就是把這些模塊組裝

22、起來并完成前后仿真,這樣同步FIFO的VHDL描述就算全部完成了。按照前面的思路和框圖,把這些模塊組裝起來應該很簡單,下面就直接給出VHDL代碼。當然組裝的過程還要排查除了雙口RAM以外電路的代碼描述有沒有問題,如果有問題的話就就地改正了,呵呵。在代碼的集成和仿真的時候還真發(fā)現(xiàn)了一些問題,主要包括數(shù)據(jù)的寄存,以及空滿狀態(tài)判斷上,最后的代碼使用Quartus II6.0綜合和布局布線,選用的是CycloneII系列的器件,并用Modelsim進行了功能仿真和時序仿真,兩種仿真均通過。下面主要是集成的定層文件和時序仿真圖(圖1,圖2,圖3,圖4,圖5)。- Designer : skycanny-

23、 Date : 2007-2-4- Description : Synchronous FIFO created by VHDLlibrary ieee;entity sfifo isgeneric(width : positive := 16;depth : positive := 8;port(clk : in std_logic;rst : in std_logic;wq : in std_logic;rq : in std_logic;data : in std_logic_vector(width - 1 downto 0;q : out std_logic_vector(width

24、 - 1 downto 0;empty : out std_logic;full : out std_logic;end entity sfifo;-architecture structure of sfifo issignal empty_t : std_logic;signal full_t : std_logic;signal wr_pt : std_logic_vector(depth - 1 downto 0;signal rd_pt : std_logic_vector(depth - 1 downto 0;signal wr : std_logic;signal rd : st

25、d_logic;component write_pointergeneric(depth : positive :=8 ;port(clk : in std_logic;rst : in std_logic;wq : in std_logic;full : in std_logic;wr : out std_logic;wr_pt : out std_logic_vector(depth - 1 downto 0 ;end component;component read_pointergeneric(depth : positive :=8 ;port(clk : in std_logic;

26、rst : in std_logic;rq : in std_logic;empty : in std_logic;rd : out std_logic;rd_pt : out std_logic_vector(depth - 1 downto 0 ;end component;component judge_statusgeneric(depth : positive :=8;port(clk : in std_logic;rst : in std_logic;wr_pt : in std_logic_vector(depth - 1 downto 0;rd_pt : in std_logi

27、c_vector(depth - 1 downto 0;empty : out std_logic;full : out std_logic;end component;component dualramgeneric(width : positive := 16;depth : positive := 8;port(- port a is only for writing -clka : in std_logic;wr : in std_logic;addra : in std_logic_vector(depth - 1 downto 0;datain : in std_logic_vector(width - 1 downto 0;- port b is

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論