最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

數(shù)字IC手撕代碼-同步FIFO

2022-12-08 00:23 作者:不吃蔥的酸菜魚  | 我要投稿

目錄

????????原理介紹

????????同步FIFO的工作方式

????????FIFO空滿的產(chǎn)生

????????計(jì)數(shù)器判斷空滿

????????代碼

????????????????Dual Port RAM

????????????????sync_FIFO

????????????????testbench

????????波形圖

原理介紹

? ? ? ? 在設(shè)計(jì)系統(tǒng)時,會包含工作在不同時鐘頻率下的元件,例如處理器和外設(shè)。數(shù)據(jù)在這些元件之間傳輸時先進(jìn)先出(FIFO first in first out)陣列起到了重要作用。FIFO是用于對在通信總線上傳輸?shù)臄?shù)據(jù)進(jìn)行排列的簡單存儲結(jié)構(gòu)。

? ? ? ? 因此,F(xiàn)IFO常用來傳輸跨不同時鐘域的數(shù)據(jù)。

? ? ? ? 本節(jié)介紹簡單的同步FIFO架構(gòu),讀寫使用同樣的時鐘,為我們后續(xù)寫異步FIFO(讀寫時鐘非同源)做鋪墊。

? ? ? ? 下面給出了一個同步FIFO的通用架構(gòu),DPRAM(Dual Port RAM 雙端口RAM)作為存儲器來存儲信息,在此之上添加判斷DPRAM空滿信息的組件后,整個模塊就是一個同步FIFO了,讀寫分別使用不同的使能和地址信號(讀、寫使能,讀、寫地址分立),使得整個模塊可以進(jìn)行同時讀寫。

? ? ? ? ?通過讀、寫指針產(chǎn)生各自的讀、寫地址,送到讀、寫端口。寫指針指向下一個要寫入的地址,讀指針指向下一個要讀取的地址。有效寫使能使得寫指針遞增, 有效的讀使能使讀指針遞增。

? ? ? ? 圖中的“狀態(tài)模塊”產(chǎn)生FIFO的空滿信號,如果“fifo_full”有效,則說明FIFO內(nèi)部的空間已滿,不能再寫入數(shù)據(jù)。如果“fifo_empty”有效,則說明FIFO內(nèi)乜有可供讀取的下一個有效數(shù)據(jù)。通過對讀寫指針位置的判斷,該模塊也可以指示出任意時刻FIFO中空或滿區(qū)域的個數(shù)。

同步FIFO的工作方式

? ? ? ? 復(fù)位后,讀寫指針都?xì)w0。此時“fifo_empty”信號置為有效而“fifo_full”保持低電平。因?yàn)镕IFO為空,所以阻止對FIFO的讀操作,只能進(jìn)行寫操作。后續(xù)的寫操作會增加寫指針的值,并將“fifo_empty”信號置為無效。在寫到最后一個數(shù)據(jù)時,寫指針等于RAM_SIZE-1。此時進(jìn)行一個寫指針會使寫指針滾回到0,并將“fifo_full”信號置為高電平。

? ? ? ? 總之,在讀、寫指針相等時,F(xiàn)IFO要么空要么滿,所以需要對兩種情況進(jìn)行區(qū)分。

FIFO空滿的產(chǎn)生

? ? ? ? 以深度為4的FIFO為例,一開始讀寫指針指向同一個位置,F(xiàn)IFO為空。寫入三個數(shù)據(jù)之后,寫指針指向RAM_SIZE-1=3的位置,此時再寫入一個數(shù)據(jù),寫指針(wr_ptr)滾回0,和讀指針指向同一個位置,此時FIFO為滿。

? ? ? ? 根據(jù)這種邏輯,很容易推導(dǎo)出這么一個結(jié)論:無論讀寫指針此時指向什么位置,當(dāng)wr_ptr+1==rd_ptr時,F(xiàn)IFO再寫入一個數(shù)據(jù)就滿了,所以有:?

? ? ? ? fifo_full =?(rd_ptr == (wr_ptr + 1'b1))&& wr_fifo

從而有判斷FIFO為滿的RTL 代碼:

? ? ? ? 類似的,當(dāng)讀操作使得兩個指針在下一個時鐘相等時,F(xiàn)IFO變空,產(chǎn)生“fifo_empty”信號。有如下關(guān)系:無論讀寫指針此時指向什么位置,當(dāng)rd_ptr+1==wr_ptr時,F(xiàn)IFO再讀出一個數(shù)據(jù)就空了。

? ? ? ? fifo_empty?= (wr_ptr == (rd_ptr + 1'b1))&& rd_fifo

從而有判斷FIFO為空的RTL 代碼:?

計(jì)數(shù)器判斷空滿

????????FIFO還有另一種利用計(jì)數(shù)器來指示FIFO空滿的方法。

? ? ? ? 計(jì)數(shù)器的寬度要與FIFO的深度相等,這樣計(jì)數(shù)器才能記錄FIFO數(shù)據(jù)的最大個數(shù)。計(jì)數(shù)器在復(fù)位時初始化為0,隨后的任何寫操作會將其遞增1,任何讀操作會使其遞減1。

? ? ? ? 在計(jì)數(shù)器為0時,很容易判斷FIFO處于空狀態(tài),而當(dāng)計(jì)數(shù)器的值等于FIFO的大小時,就能判斷FIFO處于滿狀態(tài)。

? ? ? ? 對于這種采用計(jì)數(shù)器來判斷空滿的方式實(shí)現(xiàn)比較簡單,但是和上一個比較讀寫指針位置的方法相比資源占用會高一些。因?yàn)檫@種方法要求增加額外的硬件(計(jì)數(shù)器)來進(jìn)行計(jì)數(shù)。

代碼

????????簡單來說,F(xiàn)IFO就是一個有判斷空滿邏輯的雙端口RAM,下面我們來寫一下以指針循環(huán)一周期判斷空滿的方式的同步FIFO,但是在之前我們先要寫一個雙端口RAM來存儲數(shù)據(jù)。

Dual Port RAM

????????整個雙端口RAM其實(shí)就是一個簡單的寫使能時,把數(shù)據(jù)寫入輸入的寫地址。讀使能時,把數(shù)據(jù)從地址里讀出來的那么一個功能,后續(xù)在FIFO中例化該Dual Port RAM模塊。

sync_FIFO

? ? ? ? 此外,還寫了一個判斷位寬的函數(shù)clog.v

testbench

波形圖

? ? ? ? 仿真結(jié)果和分析的結(jié)果一致, 寫入16個數(shù)據(jù)將FIFO寫滿,此時full信號拉高;讀出16個數(shù)據(jù)將FIFO讀空,此時empty信號拉高;寫入8個數(shù)據(jù)之后,同時讀寫,寫入數(shù)據(jù)和讀出數(shù)據(jù)均保持一致,功能正確。

????????了解了同步FIFO的設(shè)計(jì)方法后,再進(jìn)行異步FIFO的設(shè)計(jì)就比較簡單了,下篇博客記錄如何寫一個異步FIFO,解決FIFO中跨時鐘域的問題。


數(shù)字IC手撕代碼-同步FIFO的評論 (共 條)

分享到微博請遵守國家法律
天柱县| 乌拉特前旗| 萝北县| 达孜县| 建始县| 苏尼特右旗| 峨眉山市| 长岭县| 陇西县| 垣曲县| 偏关县| 龙泉市| 木兰县| 奉贤区| 永嘉县| 鹰潭市| 伊春市| 灵丘县| 昌宁县| 石楼县| 台北市| 大关县| 凤凰县| 南乐县| 阳高县| 台中市| 遂宁市| 新河县| 阳山县| 喀什市| 隆子县| 亚东县| 乌海市| 新宁县| 兴海县| 西青区| 宜兰市| 浠水县| 通城县| 石棉县| 常德市|