0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Vivado:ROM和RAM的verilog代碼實現(xiàn)

CHANBAEK ? 來源:FPGA入門到精通 ? 作者:未可知摩爾 ? 2023-05-16 16:57 ? 次閱讀

本文主要介紹ROMRAM實現(xiàn)的verilog代碼版本,可以借鑒參考下。

一、ROM設計方法

Read-only memory(ROM)使用ROM_STYLE屬性選擇使用寄存器或塊RAM資源來實現(xiàn)ROM,示例代碼如下:

//使用塊RAM資源實現(xiàn)ROM
module rams_sp_rom_1 (
    input clk, 
    input rd_en, 
    input [5:0] rd_addr, 
    output [19:0] dout
);

(*rom_style = "block" *) reg [19:0] data;

always @(posedge clk) begin
    if (rd_en)
        case(rd_addr)
        6'd0: data <= 20'h0200A; 
        6'd1: data <= 20'h00300;
        6'd2: data <= 20'h08101; 
        ......
        6'd32: data <= 20'h00301; 
        default: data <= 20'h00102;
        endcase
end

assign dout = data;

endmodule

二、RAM設計方式

RAM設計方式有很多,可以用BRAM、LUT、分布式RAM、URAM實現(xiàn),可以使用RAM_STYLE屬性強制規(guī)定使用的資料類型。

  • (*ram_style = "block" *)表示用Block RAM實現(xiàn)
  • (*ram_style = "reg" *)表示用寄存器實現(xiàn)
  • (*ram_style = "distributed" *)表示用分布式 RAM實現(xiàn)
  • (*ram_style = "uram" *)表示用uram實現(xiàn)

1、單端口RAM

端口RAM支持3種不同的讀寫同步模式,解決同時讀寫同一地址的情況,每一個讀、寫端口都可以配置為:

  • Write-First模式:新內(nèi)容載入時可以馬上被讀取;
  • Read-First模式:新內(nèi)容載入時,先讀取舊的內(nèi)容;
  • No-Change模式:新內(nèi)容載入時,不讀取該地址的內(nèi)容(即維持之前的值不變);
// 數(shù)據(jù)輸出可復位的單端塊RAM,Read_first
module rams_sp_rf_rst (
    input clk, 
    input en, 
    input we, 
    input rst, 
    input [9:0]addr, 
    input [15:0]di, 
    output reg [15:0]dout
);

reg [15:0] ram [1023:0];

always @(posedge clk)
    if (en) begin //塊RAM使能
        if (we) ram[addr] <= di; //寫使能
        if (rst) dout <= 0;   //輸出復位
        else dout <= ram[addr];
    end

endmodule


// 寫優(yōu)先模式的單端塊RAM,Wrist_first
module rams_sp_wf (
    input clk, 
    input en, 
    input we, 
    input [9:0] addr, 
    input [15:0] di, 
    output reg [15:0] dout
);

reg [15:0] ram [1023:0];

always @(posedge clk)
    if (en) begin
        if (we) begin
            RAM[addr] <= di;
            dout <= di;
        end
        else dout <= RAM[addr];
    end

endmodule


// No-Change模式的單端塊RAM
module rams_sp_wf (
    input clk, 
    input en, 
    input we, 
    input [9:0] addr, 
    input [15:0] di, 
    output reg [15:0] dout
);

reg [15:0] ram [1023:0];

always @(posedge clk)
    if (en) begin
        if (we) RAM[addr] <= di;
        else dout <= RAM[addr];
    end

endmodule

3、偽雙端口RAM

// 單時鐘控制,偽雙端塊RAM
module simple_dual_one_clock (
    input clk,
    input ena,
    input enb,
    input wea,
    input [9:0] addra,
    input [15:0] dia,
    input [9:0] addrb,
    output reg [15:0] dob
);

reg [15:0] ram [1023:0];

always @(posedge clk)  //寫
    if (ena) 
        if (wea) ram[addra] <= dia;

always @(posedge clk) 
    if (enb) dob <= ram[addrb];  //讀

endmodule


// 雙時鐘控制,偽雙端塊RAM
module simple_dual_two_clocks (
    input clk,
    input ena,
    input enb,
    input wea,
    input [9:0] addra,
    input [15:0] dia,
    input [9:0] addrb,
    output reg [15:0] dob
);

reg [15:0] ram [1023:0];

always @(posedge clka)  //寫
    if (ena)
        if (wea) ram[addra] <= dia;

always @(posedge clkb)
    if (enb) dob <= ram[addrb];  //讀

endmodule

4、真雙端口RAM

// 帶有兩個寫端口的雙端塊RAM
module rams_tdp_rf_rf (
    input clka,
    input clkb,
    input ena,
    input enb,
    input wea,
    input web,
    input [9:0] addra,
    input [9:0] addrb,
    input [15:0] dia,
    input [15:0] dib,
    output reg [15:0] doa,
    output reg [15:0] dob
);

reg [15:0] ram [1023:0];

always @(posedge clka)      //端口1
    if (ena) begin
        if (wea) ram[addra] <= dia;
        doa <= ram[addra];
    end

always @(posedge clkb)      //端口2
    if (enb) begin
        if (web) ram[addrb] <= dib;
        dob <= ram[addrb];
    end

endmodule


// 帶有可選輸出寄存器的塊RAM
module rams_pipeline (
    input clk1, 
    input clk2, 
    input we, 
    input en1, 
    input en2, 
    input [9:0] addr1, 
    input [9:0] addr2, 
    input [15:0] di, 
    output reg [15:0] res1, 
    output reg [15:0] res2
);

reg [15:0] RAM [1023:0];
reg [15:0] do1;
reg [15:0] do2;

always @(posedge clk1) begin  //端口1可讀可寫
    if (we == 1'b1) RAM[addr1] <= di;
    do1 <= RAM[addr1];
end

always @(posedge clk2)      //端口2只用于讀
    do2 <= RAM[addr2];

always @(posedge clk1)
    if (en1 == 1'b1) res1 <= do1;

always @(posedge clk2)
    if (en2 == 1'b1) res2 <= do2;

endmodule

5、初始化RAM內(nèi)容

初始化RAM可以在HDL源代碼中進行,也可以利用外部數(shù)據(jù)文件設置。

//Verilog初始化為一個值
reg [DATA_WIDTH-1:0] ram [DEPTH-1:0];
integer i;
initial for (i=0; i < DEPTH; i=i+1) ram[i] = 0;

//讀取二進制形式存儲文件
reg [31:0] ram [0:3];
initial begin
    $readmemb("ram.data", ram, 0, 3);
end

//讀取16進制形式存儲文件
reg [31:0] ram [0:3];
initial begin
    $readmemh("ram.data", ram, 0, 3);
end

三、總結(jié)

本文介紹了如何使用Verilog HDL實現(xiàn)ROM和RAM,以及一些常見的設計方法和示例代碼。對于不同類型的存儲器,我們介紹了不同的實現(xiàn)方式,包括分布式RAM、單端口RAM和偽雙端口RAM等。在任何情況下,都要格外注意存儲器的讀寫一致性和正確性,確保系統(tǒng)的穩(wěn)定性和正確性。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ROM
    ROM
    +關(guān)注

    關(guān)注

    4

    文章

    549

    瀏覽量

    85563
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1350

    瀏覽量

    114370
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1335

    瀏覽量

    109847
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4694

    瀏覽量

    68078
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    799

    瀏覽量

    66129
收藏 人收藏

    評論

    相關(guān)推薦

    Vivado的多種RAM編寫方式

    過多介紹。下面給出幾個各種實現(xiàn)方式的Verilog示例代碼。分布式RAM下面給出一個異步讀模式的雙口分布式RAM的示例:module ram
    發(fā)表于 09-29 09:40

    Vivado中進行HDL代碼設計

    代碼中初始化RAM組件更容易;支持package;自定義類型;枚舉類型;沒有reg和wire之間的混淆。Verilog語言的優(yōu)勢有:與C語言類似的語法;代碼結(jié)構(gòu)更緊湊;支持塊注釋(老
    發(fā)表于 09-29 10:08

    fpga實現(xiàn)jpeg Verilog代碼

    本站提供的fpga實現(xiàn)jpeg Verilog代碼資料,希望能夠幫你的學習。
    發(fā)表于 05-27 15:09 ?200次下載

    Vivado Synthesis中如何為Verilog代碼中的“include file”設置路徑?

    Verilog代碼開發(fā)時,我們可以把經(jīng)常會用到的公共變量和參數(shù),單獨放在一個cfg.v文件中,然后在別的文件中include這個文件,這樣便于代碼的組織管理,可以使得代碼結(jié)構(gòu)更加清晰
    發(fā)表于 11-10 14:49 ?9540次閱讀

    ROM、RAM、DRAM、SRAM和FLASH的區(qū)別

    常見存儲器概念辨析:RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存儲器可以分為很多種類,其中根據(jù)掉電數(shù)據(jù)是否丟失可以分為RAM(隨機存取存儲器)和ROM
    發(fā)表于 12-04 14:23 ?2701次閱讀

    ramrom的區(qū)別之處

    存儲器是數(shù)字系統(tǒng)中用以存儲大量信息的設備或部件,是計算機和數(shù)字設備中的重要組成部分。存儲器可分為隨機存取存儲器(ram)和只讀存儲器(rom)兩大類。要說它倆有什么區(qū)別,下面就由英尚微電子為大家解惑
    發(fā)表于 05-10 10:28 ?3147次閱讀

    ROMRAM有哪些區(qū)別

    RAMROM的區(qū)別在概念、運行速度、在手機存儲的功能上有不同。
    的頭像 發(fā)表于 11-19 15:30 ?1.3w次閱讀

    采用IEEE745格式的浮點+ROM RAM的方式成功實現(xiàn)FFT的設計

    采用IEEE745格式的浮點+ROM RAM的方式成功實現(xiàn)FFT的設計(嵌入式開發(fā)要學什么知乎)-采用IEEE745格式的浮點+ROM RAM
    發(fā)表于 07-30 16:21 ?9次下載
    采用IEEE745格式的浮點+<b class='flag-5'>ROM</b> <b class='flag-5'>RAM</b>的方式成功<b class='flag-5'>實現(xiàn)</b>FFT的設計

    淺談單片機romram代碼的關(guān)系,以及為什么要加上拉電阻

    ROM,RAM以及code,dataram掉電丟失rom掉電不丟失因為單片機RAM很有限,所以將不變的保存到ROM中CODE關(guān)鍵字的作用就是
    發(fā)表于 11-25 18:36 ?8次下載
    淺談單片機<b class='flag-5'>rom</b>和<b class='flag-5'>ram</b>與<b class='flag-5'>代碼</b>的關(guān)系,以及為什么要加上拉電阻

    一個單片機軟件需要多少ROMRAM

    :Total ROM size: 即所需實際ROM最小值,包括代碼code, 只讀數(shù)據(jù)RO Data,還需包括初始化的讀寫數(shù)據(jù),因為斷電后這部分數(shù)據(jù)需存儲于ROM中,上電后裝載到
    發(fā)表于 12-20 19:14 ?0次下載
    一個單片機軟件需要多少<b class='flag-5'>ROM</b>和<b class='flag-5'>RAM</b>

    Vivado使用技巧-支持的Verilog語法

    )和連線(wire)息息相關(guān)。Verilog便具有將ASM圖表和電路框圖用計算機語言表達的能力,本文將講述Vivado綜合支持的Verilog硬件描述語言; Verilog提供了行為化
    的頭像 發(fā)表于 12-29 10:30 ?5119次閱讀

    手機上的ROMRAM技術(shù)原理

    ROMRAM的區(qū)別是什么?ROMRAM都是一種存儲技術(shù),只是兩者原理不同,RAM為隨機存儲,掉電不會保存數(shù)據(jù),而
    的頭像 發(fā)表于 03-30 14:53 ?2538次閱讀

    單片機中的RAM vs ROM

    單片機中的RAM vs ROM
    的頭像 發(fā)表于 09-28 17:57 ?1108次閱讀

    巧言單片機RAMROM

    巧言單片機RAMROM
    的頭像 發(fā)表于 10-17 15:45 ?727次閱讀

    什么是RAMROM

    RAM(Random Access Memory,隨機存取存儲器)和ROM(Read-Only Memory,只讀存儲器)是計算機存儲系統(tǒng)中的兩種重要組成部分,它們在計算機的性能和功能上扮演著不同的角色。下面將分別詳細解釋RAM
    的頭像 發(fā)表于 08-30 11:38 ?1830次閱讀