目标:
-
驗證寫FIFO功能的實作。
-
嘗試讀模式能不能也使用寫FIFO來實作
-
用DMA實作突發讀功能
一、驗證寫FIFO功能的實作
文檔說明:
- 寫FIFO:16 x 32 位 深度寫 FIFO
- 寫 FIFO 由所有存儲控制器所共用,包括:
· 寫資料 FIFO,用于存儲要寫入存儲器的 AHB 資料(最多 32 位)以及 AHB 傳輸的一個控制位(突發或非連續模式)。
· 寫位址 FIFO,用于存儲 AHB 位址(最多 28 位)以及 AHB 資料大小(最多 2 位)。在突發模式下工作時,将僅存儲起始位址,但越過頁邊界時除外(适用于 PSRAM 和SDRAM)。在此情況下, AHB 突發傳輸将分成兩個 FIFO 條目。
思考:
深度是16,是以允許的最大突發長度應該可以是16以下(或者可以比16高,比如突發的過程中已經讀走幾位了)。而且寫資料和寫位址是分開的。
有個問題:寫資料FIFO到底是多大不清楚,寫位址到底是多大也不清楚。
之前的寫入過程的實作是用指針指向兩個資料區,然後分别++:
for(BufferSize=buffer_cnt; BufferSize !=0; BufferSize--)
{
*((volatile unsigned short int *)(0x60000000+(offset<<1))) = data; //從0~buffer_cnt
offset++;
data++;
}
這樣雖然看着是同步,但 實際上每次控制的還是一個位址一個資料。由“寫FIFO位址”可知,每次隻需傳首位址即可,那麼嘗試:傳輸16個一下的資料,每次隻是資料++,位址不++,看能否傳輸成功:
以每次傳6個資料為例
這是之前位址指針也跟着++ 的FPGA端的波形:

可以看出6個資料分了三次突發:0~4、 5、 6 三次。
下面将寫部分代碼修改為:(去掉位址指針++)
for(BufferSize=buffer_cnt; BufferSize !=0; BufferSize--)
{
*((volatile unsigned short int *)(0x60000000+(offset<<1))) = data; //從0~buffer_cnt
data++;
}