如何利用BRAM實現數據延遲

  • 2019 年 10 月 30 日
  • 筆記

思考一下:

如何用foreach語句實現對變數賦值,其中所需值來自於一個給定的列表。

實際上,在Tcl 8.5版本以前,大家常利用foreach命令的副作用將列表中的元素分發給獨立的變數。例如,將列表xx中的值分別賦給變數x、y和z。這裡break命令作為一個失效安全保障,以處理xx中包含了多餘3個元素的情況。

在很多設計中都會遇到數據延遲線(Delay Line),尤其是在數字訊號處理的相關設計中,例如FIR濾波器就需要延遲線。延遲線有多種實現方式,例如可以通過移位暫存器實現(基於SLICEM中的LUT),也可以通過觸發器實現(基於SLICE中的FF),還可以通過BRAM實現。採用BRAM的實現方法如下圖所示。

圖中將BRAM配置為單埠RAM。其中RAM的工作模式為讀優先(Read_First,又稱為Read Before Write,即同時對同一地址進行讀寫操作時,將首先讀出該地址空間原有的數據,然後再將新數據寫入該地址空間。關於三種模式的具體區別,可閱讀這篇文章:write_first/read_first/no_change什麼區別),寫使能訊號WE恆接高。假定計數器模值為4,相應的時序如下圖所示。RAM初始值設置為0。在第一幀地址內,從0號地址讀出的數據為0,再將數據A寫入0號地址,從1號地址讀出的數據為0,再將數據B寫入1號地址。類似地,數據C和D分別寫入2號和3號地址。在第二幀地址內,從0號地址讀出的數據即為在第一幀地址內寫入的數據A,類似地,從1號、2號和3號地址中讀出的數據分別為B、C和D。由於對RAM的輸出選擇了一級寄存,因此從輸入端DIN到輸出端DOUT共有5級時鐘周期的延遲。

Xilinx FPGA中SLICEM里的LUT可配置為移位暫存器,以UltraScale系列FPGA為例,一個LUT6可配置為深度為32的移位暫存器,實現深度為32的數據延遲(在DCP中看到的SRL16E或SRLC32E,其實就是移位暫存器)。但對於大位寬、深延遲的場合,採用SRL16E或SRLC32E將佔用較多的CLB資源,例如,數據位寬為72-bit,延遲深度為1024,則需要消耗的LUT6為2304個(72×1024/32);而採用BRAM,只需要2個36Kb BRAM和少許LUT(實現計數器),且在功耗上有一定的優勢。

思考一下:

大位寬的數據延遲或數據快取,採用LUT實現時會有哪些弊端?