verilog存储器建模

上传人:平*** 文档编号:47517743 上传时间:2018-07-02 格式:PPT 页数:11 大小:181.86KB
返回 下载 相关 举报
verilog存储器建模_第1页
第1页 / 共11页
verilog存储器建模_第2页
第2页 / 共11页
verilog存储器建模_第3页
第3页 / 共11页
verilog存储器建模_第4页
第4页 / 共11页
verilog存储器建模_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《verilog存储器建模》由会员分享,可在线阅读,更多相关《verilog存储器建模(11页珍藏版)》请在金锄头文库上搜索。

1、第16章 存储器建模学习内容: 如何描述存储器 如何描述双向端口存储器件建模描述存储器必须做两件事: 说明一个适当容量的存储器。 提供内容访问的级别,例如: 只读 读和写 写同时读 多个读操作,同时进行单个写操作 同时有多个读和多个写操作,有保证一致性的方法简单ROM描述下面的ROM描述中使用二维寄存器组定义了一个存储器mem。ROM的数据 单独保存在文件my_rom_data中,如右边所示。通常用这种方法使ROM数 据独立于ROM描述。timescale 1ns/10ps module myrom (read_data, addr, read_en_);input read_en_;inpu

2、t 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 = memaddr; endmodulemy_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101简单的RAM描述RAM描述比ROM略微复杂,因为必须既有读功能又有

3、写功能,而读写通常使用同一数据总线。这要求使用新的处理双向数据线的建模技术。在下面的例子中,若读端口未使能,则模型不驱动数据总线;此时若数据总线没有写 数据驱动,则总线为高阻态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 ? memoryaddr : 4bz; / 写always ( posedge

4、write)memoryaddr = 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; / 存储器

5、字input addr_bits:1 address; / 地址总线reg wordsize:1 mem 0 : words-1; / mem声 明 / 输出存储器的一个字wire wordsize:1 mem_word = memaddress; endmodule 例中存储器字范围从0而不是1开始,因为存储器直接用地址线确定地址。也 可以用下面的方式声明存储器并寻址。 reg wordsize:1 mem 1:words; / 从地址1开始的存储器/ 存储器寻址时地址必须加1wire wordsize:1 mem_word = mem address + 1; 存储器数据装入可以使用循环或

6、系统任务给存储器装入初始化数据用循环给存储器的每个字赋值for (i= 0; i memsize; i = i+ 1) / initialize memorymema i = wordsize 1b1; 调用系统任务$readmem$readmemb(“mem_file. txt“, mema); 可以用 系统任务$readmem给一个ROM或RAM加载数据。对于ROM ,开始时写入的数据就是其实际内容。对于RAM,可以通过初始化,而不是用不同的写周期给每个字装入数据以减少仿真时间。 使用双向端口用关键词inout声明一个双向端口inout 7:0 databus;双向端口声明遵循下列规则:i

7、nout端口不能声明为寄存器类型,只能是net类型。 这样仿真器若有多个驱动时可以确定结果值。 对inout端口可以从任意一个方向驱动数据。端口数据类型缺省为net类 型。不能对net进行过程赋值,只能在过程块外部持续赋值,或将它连 接到基本单元。在同一时间应只从一个方向驱动inout端口。 例如:在RAM模型中,如果使用双向数据总线读取RAM数据,同时在 数据总线上驱动写数据,则会产生逻辑冲突,使数据总线变为未知。 必须设计与inout端口相关的逻辑以确保正确操作。当把该端口作为输入 使用时,必须禁止输出逻辑。双向端口建模 使用基本单元建模module bus_xcvr( bus_a, bu

8、s_b, en_a_b, en_b_a);inout bus_a, bus_b;input en_a_b, en_b_a;bufif1 b1 (bus_b, bus_a, en_a_b);bufif1 b2 (bus_a, bus_b, en_b_a);/ Structural module logicendmodule 若en_a_b=1,基本单元b1使 能,bus_a数据传送到bus_b若en_b_a=1,基本单元b2使 能,bus_b数据传送到bus_a信号en_a_b和en_b_a控制使能双向端口建模 使用持续赋值建模module bus_xcvr( bus_a, bus_b, en_

9、a_b, en_b_a);inout bus_a, bus_b;input en_a_b, en_b_a;assign bus_b = en_a_b ? bus_a : bz;assign bus_a = en_b_a ? bus_b : bz;/ Structural module logicendmodule 若en_a_b=1,赋值语句 驱动bus_a数据到bus_b若en_b_a=1,赋值语句 驱动bus_b值到bus_a信号en_a_b和en_b_a控制使能双向端口建模 存储器端口建模module ram_cell( databus, rd, wr);inout databus;in

10、put rd, wr;reg datareg;assign databus = rd ? datareg : bz;always ( negedge wr)datareg = databus; endmodule当rd=1时,datareg的 值赋值databus在wr下降沿,databus 数据写入datareg复习问题:在Verilog中用什么结构定义一个存储器组?如何向存储器加载数据?如何通过一个双向(inout)端口传送数据?解答:在Verilog中将存储器声明为一个一个2维寄存器阵列。可以用系统任务$readmem或$readmemb或用过程赋值向存储器加载数据因为inout两端信号必须都是net数据类型,因此只能使用基本单元,子模块 ,或持续赋值驱动数据。同时还必须注意确保在任何一端不要发生驱动冲突 。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号