FPGA實現RAM--LPM_RAM


  我們知道,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。

  

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM