本文主要介紹ROM和RAM實(shí)現(xiàn)的verilog代碼版本,可以借鑒參考下。
一、ROM設(shè)計方法
Read-only memory(ROM)使用ROM_STYLE屬性選擇使用寄存器或塊RAM資源來實(shí)現(xiàn)ROM,示例代碼如下:
//使用塊RAM資源實(shí)現(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設(shè)計方式
RAM設(shè)計方式有很多,可以用BRAM、LUT、分布式RAM、URAM實(shí)現(xiàn),可以使用RAM_STYLE屬性強(qiáng)制規(guī)定使用的資料類型。
- (*ram_style = "block" *)表示用Block RAM實(shí)現(xiàn)
- (*ram_style = "reg" *)表示用寄存器實(shí)現(xiàn)
- (*ram_style = "distributed" *)表示用分布式 RAM實(shí)現(xiàn)
- (*ram_style = "uram" *)表示用uram實(shí)現(xiàn)
1、單端口RAM
單端口RAM支持3種不同的讀寫同步模式,解決同時讀寫同一地址的情況,每一個讀、寫端口都可以配置為:
- Write-First模式:新內(nèi)容載入時可以馬上被讀?。?/li>
- Read-First模式:新內(nèi)容載入時,先讀取舊的內(nèi)容;
- No-Change模式:新內(nèi)容載入時,不讀取該地址的內(nèi)容(即維持之前的值不變);
// 數(shù)據(jù)輸出可復(fù)位的單端塊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; //輸出復(fù)位
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源代碼中進(jìn)行,也可以利用外部數(shù)據(jù)文件設(shè)置。
//Verilog初始化為一個值
reg [DATA_WIDTH-1:0] ram [DEPTH-1:0];
integer i;
initial for (i=0; i < DEPTH; i=i+1) ram[i] = 0;
//讀取二進(jìn)制形式存儲文件
reg [31:0] ram [0:3];
initial begin
$readmemb("ram.data", ram, 0, 3);
end
//讀取16進(jìn)制形式存儲文件
reg [31:0] ram [0:3];
initial begin
$readmemh("ram.data", ram, 0, 3);
end
三、總結(jié)
本文介紹了如何使用Verilog HDL實(shí)現(xiàn)ROM和RAM,以及一些常見的設(shè)計方法和示例代碼。對于不同類型的存儲器,我們介紹了不同的實(shí)現(xiàn)方式,包括分布式RAM、單端口RAM和偽雙端口RAM等。在任何情況下,都要格外注意存儲器的讀寫一致性和正確性,確保系統(tǒng)的穩(wěn)定性和正確性。
-
ROM
+關(guān)注
關(guān)注
4文章
563瀏覽量
85731 -
RAM
+關(guān)注
關(guān)注
8文章
1368瀏覽量
114640 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110074 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521 -
Vivado
+關(guān)注
關(guān)注
19文章
812瀏覽量
66470
發(fā)布評論請先 登錄
相關(guān)推薦
評論