支持原創,如需轉載請注明出處。
由於本人一直使用的是A家的芯片,所以本次針對FIFO的讀寫操作也僅僅是在調用Quartus ii上的IP核上進行。
針對FIFO有兩種使用方式,同步FIFO和異步FIFO,同步的不想多說。以下所有操作均為異步FIFO即DCFIFO。
- 針對FIFO讀操作的兩種不同設計做一下解釋:Normal mode 和Show-ahead mode,前者為先來讀請求信號,接下來一個時鍾才將q端數據讀出。后者來讀請求信號,這即將q讀數據讀出。
IP核設置如圖(1)
兩種時序操作如下圖:
Normal mode
Normal mode:將讀信號rdreq置高后,下個時鍾才能將q端數據讀出。
Show-ahead mode
Show-ahead mode:將讀信號rdreq置高后,該時鍾才能將q端數據讀出,即數據已經在q端口准備好,讀請求一到數據即讀出。
2.針對rdusedw和rdempty的使用。
一般讀取操作判斷FIFO中數據都是根據rdusedw和rdempty來決定是否開啟讀操作的。當你讀完FIFO內數據的同時,讀端口狀態並不會馬上響應,即rdusedw不會在緊接的時鍾為0,rdempty不會高電平有效。這是由於FIFO有讀保護邏輯,所以更新才會慢上兩拍,如果此時再更具該信號判斷FIFO是否可讀必然會處錯誤,所以解決辦法延時一個時鍾之后再判斷reusedw是否大於0來決定能否開啟下一讀取操作(有先決條件)。
前方高能預警:上述操作針對的情況是讀時鍾 rdclk >= 2wrclk,如果不滿足條件就會導致FIFO滿。
因為通過判斷reusedw大於0,開啟讀操作,之后再延時1個時鍾等待reusedw變化,本次讀操作需要兩個時鍾才完成,若不滿足 rdclk >= 2wrclk必然會導致FIFO滿狀況的出現。
針對 wrclk < rdclk < 2wrclk情況,一般操作是可以讓FIFO中緩存一定數量的數據,之后在開始進行讀取操作,這樣FIFO中的數據一段一段的讀出就不會有問題。
問題升級:前提是讀操作和寫操作沒有任何關系:針對wrclk < rdclk < 2wrclk,FIFO深度為1024情況,數據一致在想FIFO中寫,要求保持FIFO中一直有256個數據存在,該過程如何判斷和如何操作。
解決辦法還沒想到,待續!