我們知道,RAM是用來在程序運行中存放隨機變量的數據空間,使用時可以利用QuartusII的LPM功能實現RAM的定制。
軟件環境:QuartusII 11.0
操作系統:win7
實現方法一、利用LPM_RAM:
1.首先准備好存儲器初始化文件,即.mif文件。
該文件的生成方法見《如何生成mif文件》;
本文預先生成了一個正弦波的數據文件,TEST1.mif,可以在QuartusII中打開,以便查看內容:【file】/【open】,在文件類型中選擇memory files,打開TEST1.mif,內容如下:

2.生成LPM_RAM塊
1)在QuartusII中,【tools】/【megawizard plugin manager】,打開向導,選擇【memory compiler】文件夾下的RAM:這里選擇單口RAM,
即:RAM:1-PORT,命名為RAM1P:

2)設置存儲深度為128,數據寬度為8bit、選擇嵌入式M4K RAM實現、使用單時鍾方案:

3)取消選擇“數據輸出鎖存”,不需要時鍾使能端:

4)使用mif初始化該RAM塊、允許“在系統(In System)存儲器讀寫”,並將此RAM的ID設置為RAM1:
- 載入前面生成的存儲器初始化文件:TEST1.mif;
- ID主要用於多RAM系統時,對不同RAM的識別,此處命名為RAM1;
- 關於“在系統存儲器讀寫”的含義,后續會補一片文章,專門介紹該工具的使用;

經過以上設置,即可生成一個名字為RAM1P.v的文件,以后就可以對其進行例化和使用。
3. 對RAM1P.v進行例化,就可以使用,例化方法如下:
module TEST( input [6:0] address, input clock, input [7:0] data, input wren, output [7:0] q ); RAM1P RAM1P_inst ( .address ( address ), .clock ( clock ), .data ( data ), .wren ( wren ), .q ( q ) ); endmodule
推薦使用verilog文本的方式進行例化,博主十分不贊成用原理圖的方式來例化各個模塊。
生成的RTL圖:

4.對該RAM塊進行仿真,以便了解端口的特性:

- 由於使用的時鍾方案為單時鍾(single clock),因此無論wren=0還是1,Q都輸出address指定的地址中的數據;可以從verilog描述中看出這是利用assign語句實現的(verilog代碼見下文)。
- 當wren=1時,將數據輸入端data的數據寫入到address指定的存儲單元內。
輸出的數據依次為0x80,0x86,0x8c,0x92……,對比前文所顯示的mif文件內容,可以驗證mif文件已經成功導入;
而接下來輸出的數據0x0c、0x0d、0x0c、0x0c,是在wren=1期間,由數據輸入端data寫入到地址04、05、06、07中的數據;
接下來繼續輸出0xb0、0xb6……,則仍然為mif中對應地址的初始化數據。
說明:在編譯過程中,如果使用cycloneII器件,可能會出現錯誤“Error: M4K memory block WYSIWYG primitive……”,解決辦法為:
【ASSIGNMENTS 】/【 SETTING】,找到如下位置,在name中輸入“CYCLONEII_SAFE_WRITE”,在DEFAULT SETTING中輸入“VERIFIED_SAFE”;
然后點擊add按鈕:

方法二、使用verilog純文本的描述方式:
生成同樣功能的RAM塊,代碼如下:
module RAM1P( input [6:0] address, input clock, input [7:0] data, input wren, output [7:0] q ); (* ram_init_file = "TEST1.mif " *) reg [7:0] mem[127:0]; always@(posedge clock) if(wren) mem[address] <= data; /*在時鍾的上升沿寫入數據*/ assign q = mem[address]; endmodule
注意此時mif文件載入RAM的方法,是利用文本描述的方式實現的,此種方式有一個缺點,就是不能在modelsim中進行仿真:
(* ram_init_file = "TEST1.mif " *) reg [7:0] mem[127:0];
對比兩種方法的優缺點:
經過QuartusII的編譯報告可以看出,方法2比方法1相比,占用了很多的LE,同時還使用了1024個register,故方法2是十分不經濟的,這里給出只是提供一個參考,便於理解LPM_RAM的工作方式,平時應用時,建議使用方法1來構建RAM。

