Vivado:ROM和RAM的verilog代码实现

这篇具有很好参考价值的文章主要介绍了Vivado:ROM和RAM的verilog代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要介绍ROM和RAM实现的verilog代码版本,可以借鉴参考下。

一、ROM设计方法

Read-only memory(ROM)使用ROM_STYLE属性选择使用寄存器或块RAM资源来实现ROM,示例代码如下:

//使用块RAM资源实现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实现,可以使用RAM_STYLE属性强制规定使用的资料类型。

  • (*rom_style = "block" *)表示用Block RAM实现

  • (*rom_style = "reg" *)表示用寄存器实现

  • (*rom_style = "distributed" *)表示用分布式 RAM实现

  • (*rom_style = "uram" *)表示用uram实现

1、单端口RAM

单端口RAM支持3种不同的读写同步模式,解决同时读写同一地址的情况,每一个读、写端口都可以配置为:

  • Write-First模式:新内容载入时可以马上被读取;

  • Read-First模式:新内容载入时,先读取旧的内容;

  • No-Change模式:新内容载入时,不读取该地址的内容(即维持之前的值不变);

// 数据输出可复位的单端块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


// 写优先模式的单端块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

2、伪双端口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

3、真双端口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

4、初始化RAM内容

初始化RAM可以在HDL源代码中进行,也可以利用外部数据文件设置。

//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

三、总结

本文介绍了如何使用Verilog  HDL实现ROM和RAM,以及一些常见的设计方法和示例代码。在任何情况下,都要格外注意存储器的读写一致性和正确性,确保系统的稳定性和正确性。文章来源地址https://www.toymoban.com/news/detail-491485.html

到了这里,关于Vivado:ROM和RAM的verilog代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog快速入门(17)—— ROM的简单实现

    (1) 四选一多路器 (2)异步复位的串联T触发器 (3)奇偶校验 (4)移位运算与乘法 (5)位拆分与运算 (6)使用子模块实现三输入数的大小比较 (7)4位数值比较器电路 (8)4bit超前进位加法器电路 (9)优先编码器电路① (10)用优先编码器①实现键盘编码电路 (11)8线-3线优先编码器 (12)使用8线-3线

    2024年02月08日
    浏览(40)
  • RAM与ROM的区别

    I.MX6U-ALPHA 开发板上带有一个 256MB/512MB 的 DDR3 内存芯片,一般 Cortex-A 芯 片自带的 RAM 很小,比如 I.MX6U 只有 128KB 的 OCRAM 。如果要运行 Linux 的话完全不够 用的,所以必须要外接一片 RAM 芯片。 对于 Cortex-A 系列芯片而言, uboot,Linux内核 等是在 DDR 上运行的。 例如之前所有的裸

    2024年02月06日
    浏览(33)
  • Verilog基础之十六、RAM实现

    目录 一、前言 二、工程设计 2.1 RAM IP核使用 2.2 设计代码 2.3 仿真代码 2.4 综合结果 2.5 仿真结果     工程设计中除逻辑计算单元外,存储单元也是不可获取的部分,RAM(Random Access Memory)随机存取存储器即可以写入数据,也可读取数据,写入或读取的位置由输入的地址决定。

    2024年02月06日
    浏览(25)
  • 【Verilog】用双口RAM实现同步FIFO

    端口说明如下表。 双口RAM端口说明: 同步FIFO端口说明: 输入描述: input clk , input rst_n , input winc , input rinc , input [WIDTH-1:0] wdata 输出描述: output reg wfull , output reg rempty , output wire [WIDTH-1:0] rdata 双口RAM和代码框架: 同步FIFO,就是我们学习其他经典计算机语言(如C语言)的数据结

    2024年02月07日
    浏览(28)
  • Unity获取Android手机的RAM和剩余RAM和ROM

    项目工作需要,在游戏APP运行时,获取当前手机的剩余运行内存RAM和ROM。并且要适用于不同的项目,思来想去。最终想到这样的办法,具体的获取的方法在Android工程中实现,然后生成aar ,在Unity中调用。 用AndroidStudio创建一个新项目。创建一个com.pub.mylibrary包名。然后创建一

    2024年02月16日
    浏览(24)
  • 内存RAM和ROM之间的区别

    ROM和RAM都是一种存储技术,只是两者原理不同,RAM为随机存储,掉电不会保存数据,而ROM可以在掉电的情况下,依然保存原有的数据。ROM和RAM指的都是半导体存储器。本来的含义是:ROM是Read Only Memory的意思,也就是说这种存储器只能读,不能写。而RAM是Random Access Memory的缩写

    2023年04月08日
    浏览(27)
  • 简语RAM、ROM、flash、eMMC(通俗易懂)

    先来看RAM与ROM RAM: Random-Access Memory的缩写,意思为“随机存取存储器” ROM:Read-Only Memory的缩写,意思为“只读存储器” 总体来看:都是存储器 最大区别:ROM可以在停止供电的时候仍然保存着数据;RAM在停止供电的时候数据丢失 RAM分两大类:         第一类 称为静态

    2023年04月21日
    浏览(27)
  • 【物联网】ROM、RAM和FLASH的区别

    在计算机领域,我们经常听到ROM、FLASH和RAM这些术语,它们是计算机中不同类型的存储器。虽然它们都用于存储数据,但它们之间有着明显的区别。本文将详细介绍ROM、FLASH和RAM的区别,并给出具体的例子和解释。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣

    2024年02月08日
    浏览(23)
  • 固态硬盘、机械硬盘、RAM、ROM的区别和联系

    很多人都知道RAM与ROM的区别和固态硬盘与机械硬盘的区别,但可能还是会有人问:机械硬盘和固态硬盘分别属于RAM还是ROM?所以,本篇文章就来解释一下这四者的关系。 要搞清楚这四者的关系,得先了解存储介质的类型。存储介质有半导体、磁性物和光盘等类型,这里主要说

    2024年02月12日
    浏览(30)
  • STM32 -4 关于STM32的RAM、ROM

    一 、说明 它主要用于存储代码,FLASH 存储器的内容在掉电后不会丢失,STM32 芯片在运行的时候,也能对自身的内部 FLASH 进行读写,因此,若内部 FLASH 存储了应用程序后还有剩余的空间,我们可以把它像外部 SPI-FLASH 那样利用起来,存储一些程序运行时产生的需要掉电保存的

    2024年02月09日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包