verilog存储器建模.ppt

上传人:tia****nde 文档编号:12707470 上传时间:2020-05-14 格式:PPT 页数:11 大小:181.50KB
返回 下载 相关 举报
verilog存储器建模.ppt_第1页
第1页 / 共11页
verilog存储器建模.ppt_第2页
第2页 / 共11页
verilog存储器建模.ppt_第3页
第3页 / 共11页
点击查看更多>>
资源描述
第16章存储器建模,学习内容:如何描述存储器如何描述双向端口,存储器件建模,描述存储器必须做两件事:说明一个适当容量的存储器。提供内容访问的级别,例如:只读读和写写同时读多个读操作,同时进行单个写操作同时有多个读和多个写操作,有保证一致性的方法,简单ROM描述,下面的ROM描述中使用二维寄存器组定义了一个存储器mem。ROM的数据单独保存在文件my_rom_data中,如右边所示。通常用这种方法使ROM数据独立于ROM描述。,timescale1ns/10psmodulemyrom(read_data,addr,read_en_);inputread_en_;input3:0addr;output3:0read_data;reg3:0read_data;reg3:0mem0:15;initial$readmemb(my_rom_data,mem);always(addrorread_en_)if(!read_en_)read_data=memaddr;endmodule,简单的RAM描述,RAM描述比ROM略微复杂,因为必须既有读功能又有写功能,而读写通常使用同一数据总线。这要求使用新的处理双向数据线的建模技术。在下面的例子中,若读端口未使能,则模型不驱动数据总线;此时若数据总线没有写数据驱动,则总线为高阻态Z。这避免了RAM写入时的冲突。,timescale1ns/1nsmodulemymem(data,addr,read,write);inout3:0data;input3:0addr;inputread,write;reg3:0memory0:15;/16*4/读assigndata=read?memoryaddr:4bz;/写always(posedgewrite)memoryaddr=data;endmodule,这个描述可综合,但许多工具仅仅产生一个寄存器堆,因此与一个真正的存储器相比耗费更多的面积。,参数化存储器描述,在下面的例子中,给出如何定义一个字长和地址均参数化的只读存储器件。,modulescalable_ROM(mem_word,address);parameteraddr_bits=8;/地址总线宽度parameterwordsize=8;/字宽parameterwords=(1addr_bits);/mem容量outputwordsize:1mem_word;/存储器字inputaddr_bits:1address;/地址总线regwordsize:1mem0:words-1;/mem声明/输出存储器的一个字wirewordsize:1mem_word=memaddress;endmodule,例中存储器字范围从0而不是1开始,因为存储器直接用地址线确定地址。也可以用下面的方式声明存储器并寻址。regwordsize:1mem1:words;/从地址1开始的存储器/存储器寻址时地址必须加1wirewordsize:1mem_word=memaddress+1;,存储器数据装入,可以使用循环或系统任务给存储器装入初始化数据用循环给存储器的每个字赋值for(i=0;imemsize;i=i+1)/initializememorymemai=wordsize1b1;调用系统任务$readmem$readmemb(mem_file.txt,mema);,可以用系统任务$readmem给一个ROM或RAM加载数据。对于ROM,开始时写入的数据就是其实际内容。对于RAM,可以通过初始化,而不是用不同的写周期给每个字装入数据以减少仿真时间。,使用双向端口,用关键词inout声明一个双向端口inout7:0databus;双向端口声明遵循下列规则:inout端口不能声明为寄存器类型,只能是net类型。这样仿真器若有多个驱动时可以确定结果值。对inout端口可以从任意一个方向驱动数据。端口数据类型缺省为net类型。不能对net进行过程赋值,只能在过程块外部持续赋值,或将它连接到基本单元。在同一时间应只从一个方向驱动inout端口。例如:在RAM模型中,如果使用双向数据总线读取RAM数据,同时在数据总线上驱动写数据,则会产生逻辑冲突,使数据总线变为未知。必须设计与inout端口相关的逻辑以确保正确操作。当把该端口作为输入使用时,必须禁止输出逻辑。,双向端口建模使用基本单元建模,modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;bufif1b1(bus_b,bus_a,en_a_b);bufif1b2(bus_a,bus_b,en_b_a);/Structuralmodulelogicendmodule,若en_a_b=1,基本单元b1使能,bus_a数据传送到bus_b,若en_b_a=1,基本单元b2使能,bus_b数据传送到bus_a,信号en_a_b和en_b_a控制使能,双向端口建模使用持续赋值建模,modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;assignbus_b=en_a_b?bus_a:bz;assignbus_a=en_b_a?bus_b:bz;/Structuralmodulelogicendmodule,若en_a_b=1,赋值语句驱动bus_a数据到bus_b,若en_b_a=1,赋值语句驱动bus_b值到bus_a,信号en_a_b和en_b_a控制使能,双向端口建模存储器端口建模,moduleram_cell(databus,rd,wr);inoutdatabus;inputrd,wr;regdatareg;assigndatabus=rd?datareg:bz;always(negedgewr)datareg=databus;endmodule,当rd=1时,datareg的值赋值databus,在wr下降沿,databus数据写入datareg,复习,问题:在Verilog中用什么结构定义一个存储器组?如何向存储器加载数据?如何通过一个双向(inout)端口传送数据?,解答:在Verilog中将存储器声明为一个一个2维寄存器阵列。可以用系统任务$readmem或$readmemb或用过程赋值向存储器加载数据因为inout两端信号必须都是net数据类型,因此只能使用基本单元,子模块,或持续赋值驱动数据。同时还必须注意确保在任何一端不要发生驱动冲突。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!