坑,,以后填
對於Lattice 的 FIFO 存儲器分為兩種,見下圖:
這兩個的主要區別是一個后面加DC一個不加,那這個DC是什么意思呢??DC這里是Dual Clock的意思,也就是雙時鍾的意思,那意思就很明顯了,另一個是單時鍾;更本質的可以說單時鍾是同步FIFO的意思,雙時鍾是異步FIFO的意思。
同步FIFO:
一、先看datasheet
顯示端口說明:
沒有輸出寄存器時的寫操作,可以看出,寫操作是在clk的上升沿的時候將 寫請求使能有效且寫數據准備好即可。寫入數據之后empty就會被拉低。
上圖顯示寫滿之后再寫數據就無效了。
讀時序:
上圖可以看出,在寫使能有效的一個時鍾周期之后數據才送出Q端口。
當最后一次讀取數據的時候,empty信號會被拉高,然后一個時鍾周期之后數據從Q端口送出。
在輸出端口使能了輸出寄存器之后,對FIFO的寫操作沒有影響,只是對讀操作有影響,具體影響是:在原來的基礎上又延時了一個時鍾周期。
最后需要注意的是:
這個操作和生成FIFO的設置有關系。
現在就看FIFO生成的時候的設置吧:
首先是名字和路徑以及語言的選擇,直接跳過。
打開后界面如下:
界面設置也很簡單, 先是FIFO的類型,默認即可;地址深度就是存多少個數據,這里深度只能是2的冪即2的n次方;數據寬度可以任意選擇,默認輸入和輸出的深度寬度是一樣的。Enable output reg選項就是使能輸出寄存器選項,選擇之后就是輸出端數據延時兩個時鍾周期輸出。
Controlled by RdEN 選擇時候,讀取的時候時序圖就是上面最后一個時序圖的時候。
設置輸入滿,輸出空的閾值;設置顯示內部數據個數。
最后選擇左下端的Import IPX to Diamond project 選項之后,生成的FIFO文件會直接加入到工程里面去。
同步FIFO就到這里。
異步FIFO
異步FIFO與同步FIFO有所不同,
先是端口:
可以看出它有兩個時鍾,但是本質其實和同步FIFO相似,可以看做為兩個同步FIFO,在不同的時鍾驅動下一個只進行讀操作,一個只進行寫操作,讀寫單獨操作互補影響,這里不做時序圖的介紹和記錄了,直接看生成時候的設置界面。
可以看到 上圖兩個紅色方塊內是兩個不同之處,上面是讀和寫操作都要設置FIFO的存儲深度和數據寬度。 而且深度要是2的冪。
最重要的是要確保輸入的深度乘以數據寬度要等於輸出的 深度乘以數據的寬度。否則生成不了FIFO。
下面方框內是數據的計數,讀寫數據分別計數。在寫數據的計數增加之后,讀數據的計數也會在讀時鍾作用下相應的增加。