verilog存储器建模.ppt

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
verilog存储器建模

第16章 存储器建模 学习内容: 如何描述存储器 如何描述双向端口 存储器件建模 描述存储器必须做两件事: 说明一个适当容量的存储器。 提供内容访问的级别,例如: 只读 读和写 写同时读 多个读操作,同时进行单个写操作 同时有多个读和多个写操作,有保证一致性的方法 简单ROM描述 下面的ROM描述中使用二维寄存器组定义了一个存储器mem。ROM的数据单独保存在文件my_rom_data中,如右边所示。通常用这种方法使ROM数据独立于ROM描述。 `timescale 1ns/10ps module myrom (read_data, addr, read_en_); input read_en_; input [3:0] addr; output [3:0] read_data; reg [3:0] read_data; reg [3:0] mem [0:15]; initial $readmemb (my_rom_data, mem); always @( addr or read_en_) if (! read_en_) read_data = mem[addr]; endmodule my_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101 简单的RAM描述 RAM描述比ROM略微复杂,因为必须既有读功能又有写功能,而读写通常使用同一数据总线。这要求使用新的处理双向数据线的建模技术。在下面的例子中,若读端口未使能,则模型不驱动数据总线;此时若数据总线没有写数据驱动,则总线为高阻态Z。这避免了RAM写入时的冲突。 `timescale 1ns /1ns module mymem (data, addr, read, write); inout [3:0] data; input [3:0] addr; input read, write; reg [3:0] memory [0:15]; // 16*4 // 读 assign data = read ? memory[addr] : 4bz; // 写 always @( posedge write) memory[addr] = data; endmodule 这个描述可综合,但许多工具仅仅产生一个寄存器堆,因此与一个真正的存储器相比耗费更多的面积。 参数化存储器描述 在下面的例子中,给出如何定义一个字长和地址均参数化的只读存储器件。 module scalable_ROM (mem_word, address); parameter addr_bits = 8; // 地址总线宽度 parameter wordsize = 8; // 字宽 parameter words = (1 addr_bits); // mem容量 output [wordsize:1] mem_word; // 存储器字 input [addr_bits:1] address; // 地址总线 reg [wordsize:1] mem [0 : words-1]; // mem声明 // 输出存储器的一个字 wire [wordsize:1] mem_word = mem[address]; endmodule 例中存储器字范围从0而不是1开始,因为存储器直接用地址线确定地址。也可以用下面的方式声明存储器并寻址。 reg [wordsize:1] mem [1:words]; // 从地址1开始的存储器 // 存储器寻址时地址必须加1 wire [wordsize:1] mem_word = mem[ address + 1]; 存储器数据装入 可以使用循环或系统任务给存储器装入初始化数据 用循环给存储器的每个字赋值 for (i= 0; i memsize; i = i+ 1) // initialize memory mema[ i] = {wordsize{ 1b1}}; 调用系统任务$readmem $readmemb(mem_file. txt, mema); 可以用 系统任务$readmem给一个ROM或RAM加载数据。对于ROM,开始时写入的数据就是其实际内容。对于RAM,可以通过初始化,而不是

文档评论(0)

wuyoujun92 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档