大多數(shù)FPGA器件都包含專用的嵌入式存儲器單元努释,雖然容量不大碘梢,但在小型設計中使用起來十分方便,同時可以簡化單板設計伐蒂,節(jié)約PCB空間煞躬。
由于不同外部存儲器接口的差異性,不可能去寫一個通用的接口控制器對外部存儲器操作逸邦。使用內部存儲器沒有這種問題恩沛。
FIFO介紹
先進先出的存儲隊列。一般在程序中的作用是作為 數(shù)據(jù)的隊列通道缕减,讓數(shù)據(jù)暫時緩存雷客,以等待讀取。與RAM明顯不同的是FIFO是沒有地址線的桥狡,因此不可隨機尋址搅裙,而是先進先出。
不同模塊之間的數(shù)據(jù)接口 总放,尤其是不同時鐘系統(tǒng)下的各個模塊之間的數(shù)據(jù)接口是系統(tǒng)設計的關鍵呈宇。用異步FIFO模塊來實現(xiàn)接口,接口雙方都在自己時鐘的同步下工作局雄,它們之間不需要相互握手,只需要跟接口FIFO模塊進行交互即可向接口FIFO中寫入數(shù)據(jù)或讀出數(shù)據(jù)存炮。
用這樣一個FIFO模塊實現(xiàn)FPGA內部不同時鐘系統(tǒng)之間的數(shù)據(jù)接口炬搭,使得設計變得容易。
Xilinx FIFO IP調用
調用FIFO Generator穆桂,進行自定義宫盔。其端口類型有三個選擇: Native、AXI Memory Mapped 以及AXI Stream三種享完。一般選擇Native即可灼芭,如果卻有特殊要求,比如需要與內存映射接口AXI或AXI流接口模塊交互般又,則選擇相應的接口的FIFO彼绷。
在選定了寫數(shù)據(jù)寬度和深度后巍佑,讀數(shù)據(jù)寬度和深度也隨之確定。
在狀態(tài)flag頁可以選擇性配置Almost Full flag和Almost empty flag寄悯∮┧ィ快要滿標志信號在FIFO寫到差一個就滿了時候拉高,快要空信號在FIFO中只剩1個數(shù)據(jù)時候拉高猜旬。
還可以配置programmable flag信號脆栋,即自己設置一個閾值,來設定FIFO中數(shù)據(jù)的深度為多少時候拉高信號洒擦。
定制好IP后椿争,通過例化使用該IP。
FIFO時序
寫時序
當寫使能wr_en拉高熟嫩,并且將待寫入數(shù)據(jù)等在din上丘薛,數(shù)據(jù)將會被寫入FIFO。圖中可以看到邦危,full信號在D3時被拉高洋侨,表明FIFO寫滿了。此時倦蚪,若繼續(xù)往里寫數(shù)據(jù)希坚,則會導致現(xiàn)在的數(shù)據(jù)覆蓋以前的數(shù)據(jù),所以當full信號被拉高時應該停止寫數(shù)據(jù)陵且。
讀時序
當讀使能拉高后裁僧,數(shù)據(jù)會在下一個周期從dout口輸出。當數(shù)據(jù)讀完后慕购,empty會被拉高聊疲。數(shù)據(jù)讀完后若繼續(xù)讀,則會導致讀取的數(shù)據(jù)為以前寫入的數(shù)據(jù)沪悲,所以當empty為高時應停止讀數(shù)據(jù)获洲。