剛上研一時跟着實驗室師兄做一個FPGA壓縮算法實現 項目,算法采用最新的LPAQ壓縮算法,FPGA采用xilinx KC705。
項目做了一年,到最后結尾的時候,測試性能,發現速度不能達標。師兄們頂着很大的壓力進行各種嘗試,卻效果顯微。
項目結束后師兄開始找工作,輪到我接着去改進這個壓縮算法的硬件性能。老師給我的意見是在mig這塊,用SDRAM替換DDR3 SDRAM也許能提升性能。畢竟之前的速度瓶頸在與mig的讀延時過大,拖累的其他模塊的流水線效率。
遂開始進行SDRAM與DDR3讀寫速度調研,發現DDR3雖然在突然讀寫大規模數據上速度遠高於SDRAM,但是在離散型數據的讀寫情況下,讀寫速度和延時效果卻不如SDRAM。而我們的工程中是大量的對離散的哈希地址進行讀寫操作。
於是我開始更改工程的mig模塊,和與之相連的cache模塊。思路是將8個數據位寬為32bit的SDRAM進行並聯,達到之前DDR3一次讀寫256bit有效數據的效果。
代碼更改完成后,發現第一次讀SDRAM出來的數據就和正確工程仿真結果相異。仔細尋找出錯原因,發現在於往SDRAM中進行寫數據操作時存在問題,數據並沒有寫到正確的地址當中。
其實這個問題在我當初進行SDRAM調研時就已發現。在進行讀寫仿真時發現,第一個數據總是不能正確的寫入第一個地址,而是將第二個數據寫入了第一個地址,第一個數據丟失,同樣最后一個地址沒有寫入數據。
今天又仔細研讀了一下SDRAM的操作手冊,發現出現這樣的情況是有原因的。以下給出SDRAM操作手冊中的寫數據流控圖:

wr_en信號有效時,在時鍾上升沿才能采集到寫入該地址的數據信息。
我之前采用的測試操作是:給出地址,並發出ACTIVE命令,然后給出有效數據,並給出SDRAM寫操作。然后給出下一個地址,ACTIVE,然后是數據和WRITE指令......
這樣操作的結果就是數據寫入了上一個地址,而第一個數據和最后一個地址丟失:

為解決寫錯位的問題,有兩種方法可以采用使得數據與地址對其。第一種方法是在發出WRITE指令后再給出一個NOP指令,使得數據在dq總線上延時一拍:

方法二是控制流控,在讀寫操作中寄存一個dq_reg信號,將這個信號在write信號給出一拍后再傳入數據總線,也可以達到數據地址對齊的目的。使用該方法要注意流控,好處是寫數據操作只
占用了2個clk,而方法一占用了3個clk,SDRAM工作頻率一般是100MHz,方法二相當於在寫操作減少了10ns,這個數值在工程項目中是很客觀的。建議采用流控的辦法來使得數據地址對齊。
