实验五
《存储器设计》
实验报告
姓名:吴速碘 黄紫微 学号:******** ******** 班级:计算机二班 日期2015、5、25
实验五 存储器设计
一、 实验目的
1、 掌握RAM和ROM的Verilog语言描述方法; 2、 学习用宏模块的方法定制RAM和ROM。
二、 实验任务
1、设计并实现一个128*16 的单端口的RAM; 2、设计并实现一个128*16的ROM;
3、设计并实现一个双端口的128*16的RAM 4、设计并实现一个16*32的FIFO。
5、设计并实现正弦信号发生器,见“正弦信号发生器实验指南”。
三、 实验步骤
1 编写Verilog代码(见附页)
2功能仿真
进行分析与综合,排除语法上的错误 建立波形仿真文件,输入激励 生成功能仿真网表
进行功能仿真,观察输出结果
3选择器件
DE2_70开发板的使用者请选择EP2C70F896C6
4绑定管脚 5 下载验证
DE2_70开发板的下载:使用USB-Blaster进行下载
四、实验内容
五、实验思考题
1、分析存储器采用三态输出的原因是什么?
存储器的输出端是连接在数据总线上的。数据总线相当于一条车流频繁的大马路,必须在绿灯条件下,车辆才能进入这条大马路,否则要撞车发生交通事故。同理, 存储器中的数据是不能随意传送到数据总线上的。例如,若数据总线上的数据是“1”(高电平5V),存储器中的数据是“0”(低电平0V),两种数据若碰到 一起就会发生短路而损坏单片机。因此,存储器输出端口不仅能呈现“l”和“0”两种状态,还应具有第三种状态“高阻\"态。呈“高阻\"态时,输出端口相当于 断开,对数据总线不起作用,此时数据总线可被其他器件占用。当其他器件呈“高阻”态时,存储器在片选允许和输出允许的条件下,才能将自己的数据输出到数据 总线上。
2、单端口和双端口的区别是什么?
单端口ram是ram的读写只有一个端口,同时只能读或者只能写。 双端口ram是ram读端口和写端口分开,一个端口能读,另一个端口可以同时写。
3、什么情况下考虑采用双端口存储器?
(1)为了使CPU不致因为等待存储器读写操作的完成而无事可做,可以采取一些加速CPU和存储器之间有效传输的特殊措施:
采用更高速的主存储器,或加长存储器的字长; 采用并行操作的双端口存储器;
在CPU和主存储器之间插入一个高速缓冲存储器(Cache),以缩短读出时间; 在每个存储器周期中存取几个字.(采用交叉存储器)
(2)双端口存储器是指同一个存储器具有两组相互独立的读写控制线路,由于进行并行的独立操作,是一种高速工作的存储器。 (3)
当两个端口的地址不相同时,在两个端口上进行读写操作,一定不会发生冲突。当
任一端口被选中驱动时,就可对整个存储器进行存取,每一个端口都有自己的片选控制和输出驱动控制。
当两个端口同时存取存储器同一存储单元时,便发生读写冲突。为解决此问题,特
设置了BUSY标志。由片上的判断逻辑决定对哪个端口优先进行读写操作,而暂时关闭另一个被延迟的端口。
总之,当两个端口均为开放状态(BUSY为高电平)且存取地址相同时,发生读写
冲突.此时判断逻辑可以使地址匹配或片使能匹配下降至5ns,并决定对哪个端口进行存取.
4、FIFO的工作特点是什么?为什么常用于实现程序中的子程序调用、递归等? 特点:
FIFO存储器是系统的缓冲环节,如果没有FIFO存储器,整个系统就不可能正常工作,它主要有几方面的功能:
1)对连续的数据流进行缓存,防止在进机和存储操作时丢失数据;
2)数据集中起来进行进机和存储,可避免频繁的总线操作,减轻CPU的负担; 3)允许系统进行DMA操作,提高数据的传输速度。这是至关重要的一点,如果不采用DMA操作,数据传输将达不到传输要求,而且大大增加CPU的负担,无法同时完成数据的存储工作。 因此,选择合适的存储芯片对于提高系统性能很重要,在以往的设计中经常采用的是“乒乓型”存储方式,这种方式就是采用两片存储器, 数据首先进入其中一片,当数据满时再让数据进入第二片存储器,同时通过逻辑控制,将第一片存储器中的数据取走,以此类推,两片轮流对数据进行缓存。这种方 式有着较明显的缺点,首先是控制复杂,要有专门的逻辑来维护这种轮流机制;其次,数据流的流向要不断变化,限制了数据流的速率,还容易产生干扰。从数据传 输上说,缓存芯片容量越大,对后续时序要求就越低,可减少总线操作的频次;但从数据存储上说,就意味着需要开辟更大的内存空间来进行进行缓冲,会增加计算机的内存开销,而且容量越大,成本也越高。因此,在综合考虑系统性能和成本的基础上,选择满足系统需要的芯片即可。 在FIFO存储器而不是地址总线上附加了表示内部缓冲器状态(Buffer Full,缓冲器已满;Buffer Empty,缓冲器为空)的状态引脚,连接于FIFO的双方利用该状态进行操作的控制。另外,还设计了在接通电源及复位(Reset)或由于操作中的某些异常等原因而重新初始化(无数据状态)FIFO的复位引脚,这可以说是FIFO存储器的特点。
Verilog代码
《sinwaveV》
module sinwaveV
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6) (
input clk,
output reg [(DATA_WIDTH-1):0] q );
reg [(ADDR_WIDTH-1):0] Q1; wire newclk;
reg [4:0] clk_cnt;
assign newclk = clk_cnt[4];
always @(posedge CLK) begin
clk_cnt <= clk_cnt+1; end
always @(posedge newclk) begin
Q1<=Q1+1; end
lpm_rom0 lpm_rom0_inst ( .address ( Q1), .clock ( CLK ), .q ( DOUT ) );
endmodule
《test1》
// synopsys translate_off `timescale 1 ps / 1 ps // synopsys translate_on module test1 ( address, clock, data, wren, q);
input [6:0] address; input clock;
input [15:0] data; input wren; output [15:0] q;
`ifndef ALTERA_RESERVED_QIS // synopsys translate_off `endif
tri1 clock;
`ifndef ALTERA_RESERVED_QIS // synopsys translate_on `endif
wire [15:0] sub_wire0;
wire [15:0] q = sub_wire0[15:0];
altsyncram altsyncram_component ( .address_a (address), .clock0 (clock), .data_a (data), .wren_a (wren), .q_a (sub_wire0), .aclr0 (1'b0), .aclr1 (1'b0),
.address_b (1'b1),
.addressstall_a (1'b0), .addressstall_b (1'b0), .byteena_a (1'b1), .byteena_b (1'b1), .clock1 (1'b1), .clocken0 (1'b1), .clocken1 (1'b1), .clocken2 (1'b1), .clocken3 (1'b1), .data_b (1'b1), .eccstatus (), .q_b (),
.rden_a (1'b1), .rden_b (1'b1), .wren_b (1'b0)); defparam
altsyncram_component.clock_enable_input_a = \"BYPASS\ altsyncram_component.clock_enable_output_a = \"BYPASS\
altsyncram_component.intended_device_family = \"Cyclone IV GX\ altsyncram_component.lpm_hint = \"ENABLE_RUNTIME_MOD=NO\ altsyncram_component.lpm_type = \"altsyncram\ altsyncram_component.numwords_a = 128,
altsyncram_component.operation_mode = \"SINGLE_PORT\ altsyncram_component.outdata_aclr_a = \"NONE\ altsyncram_component.outdata_reg_a = \"CLOCK0\
altsyncram_component.power_up_uninitialized = \"FALSE\ altsyncram_component.read_during_write_mode_port_a \"NEW_DATA_NO_NBE_READ\
altsyncram_component.widthad_a = 7, altsyncram_component.width_a = 16,
altsyncram_component.width_byteena_a = 1;
endmodule
=
《test2》
// synopsys translate_off `timescale 1 ps / 1 ps // synopsys translate_on module test2 ( address, clock, q);
input [6:0] address; input clock; output [15:0] q;
`ifndef ALTERA_RESERVED_QIS // synopsys translate_off `endif
tri1 clock;
`ifndef ALTERA_RESERVED_QIS // synopsys translate_on `endif
wire [15:0] sub_wire0;
wire [15:0] q = sub_wire0[15:0];
altsyncram altsyncram_component ( .address_a (address), .clock0 (clock), .q_a (sub_wire0), .aclr0 (1'b0), .aclr1 (1'b0), .address_b (1'b1),
.addressstall_a (1'b0), .addressstall_b (1'b0), .byteena_a (1'b1), .byteena_b (1'b1), .clock1 (1'b1), .clocken0 (1'b1),
.clocken1 (1'b1), .clocken2 (1'b1), .clocken3 (1'b1),
.data_a ({16{1'b1}}), .data_b (1'b1), .eccstatus (), .q_b (),
.rden_a (1'b1), .rden_b (1'b1), .wren_a (1'b0), .wren_b (1'b0)); defparam
altsyncram_component.address_aclr_a = \"NONE\
altsyncram_component.clock_enable_input_a = \"BYPASS\ altsyncram_component.clock_enable_output_a = \"BYPASS\ altsyncram_component.init_file = \"vv_CPU.mif\
altsyncram_component.intended_device_family = \"Cyclone IV GX\ altsyncram_component.lpm_hint = \"ENABLE_RUNTIME_MOD=NO\ altsyncram_component.lpm_type = \"altsyncram\ altsyncram_component.numwords_a = 128,
altsyncram_component.operation_mode = \"ROM\ altsyncram_component.outdata_aclr_a = \"NONE\ altsyncram_component.outdata_reg_a = \"CLOCK0\ altsyncram_component.widthad_a = 7, altsyncram_component.width_a = 16,
altsyncram_component.width_byteena_a = 1;
endmodule
《test3》
// synopsys translate_off `timescale 1 ps / 1 ps // synopsys translate_on module test3 ( clock, data,
rdaddress, wraddress, wren, q);
input clock;
input [15:0] data; input [6:0] rdaddress; input [6:0] wraddress; input wren; output [15:0] q;
`ifndef ALTERA_RESERVED_QIS // synopsys translate_off `endif
tri1 clock; tri0 wren;
`ifndef ALTERA_RESERVED_QIS // synopsys translate_on `endif
wire [15:0] sub_wire0;
wire [15:0] q = sub_wire0[15:0];
altsyncram altsyncram_component ( .address_a (wraddress), .clock0 (clock), .data_a (data), .wren_a (wren),
.address_b (rdaddress), .q_b (sub_wire0), .aclr0 (1'b0), .aclr1 (1'b0),
.addressstall_a (1'b0), .addressstall_b (1'b0), .byteena_a (1'b1), .byteena_b (1'b1), .clock1 (1'b1), .clocken0 (1'b1), .clocken1 (1'b1), .clocken2 (1'b1), .clocken3 (1'b1),
.data_b ({16{1'b1}}), .eccstatus (), .q_a (),
.rden_a (1'b1), .rden_b (1'b1), .wren_b (1'b0)); defparam
altsyncram_component.address_aclr_b = \"NONE\ altsyncram_component.address_reg_b = \"CLOCK0\
altsyncram_component.clock_enable_input_a = \"BYPASS\ altsyncram_component.clock_enable_input_b = \"BYPASS\ altsyncram_component.clock_enable_output_b = \"BYPASS\
altsyncram_component.intended_device_family = \"Cyclone IV GX\ altsyncram_component.lpm_type = \"altsyncram\ altsyncram_component.numwords_a = 128, altsyncram_component.numwords_b = 128,
altsyncram_component.operation_mode = \"DUAL_PORT\ altsyncram_component.outdata_aclr_b = \"NONE\ altsyncram_component.outdata_reg_b = \"CLOCK0\
altsyncram_component.power_up_uninitialized = \"FALSE\ altsyncram_component.read_during_write_mode_mixed_ports \"DONT_CARE\
altsyncram_component.widthad_a = 7, altsyncram_component.widthad_b = 7, altsyncram_component.width_a = 16, altsyncram_component.width_b = 16,
altsyncram_component.width_byteena_a = 1;
endmodule
=
《test4》
// synopsys translate_off `timescale 1 ps / 1 ps // synopsys translate_on module test4 ( clock, data, rdreq, wrreq, empty, full, q,
usedw);
input clock;
input [15:0] data; input rdreq; input wrreq; output empty; output full; output [15:0] q; output [4:0] usedw;
wire [4:0] sub_wire0; wire sub_wire1; wire sub_wire2;
wire [15:0] sub_wire3;
wire [4:0] usedw = sub_wire0[4:0]; wire empty = sub_wire1; wire full = sub_wire2;
wire [15:0] q = sub_wire3[15:0];
scfifo scfifo_component (
.clock (clock), .data (data), .rdreq (rdreq), .wrreq (wrreq), .usedw (sub_wire0), .empty (sub_wire1), .full (sub_wire2), .q (sub_wire3), .aclr (),
.almost_empty (), .almost_full (), .sclr ()); defparam
scfifo_component.add_ram_output_register = \"OFF\
scfifo_component.intended_device_family = \"Cyclone IV GX\ scfifo_component.lpm_numwords = 32, scfifo_component.lpm_showahead = \"OFF\ scfifo_component.lpm_type = \"scfifo\ scfifo_component.lpm_width = 16, scfifo_component.lpm_widthu = 5,
scfifo_component.overflow_checking = \"ON\ scfifo_component.underflow_checking = \"ON\ scfifo_component.use_eab = \"ON\";
endmodule
因篇幅问题不能全部显示,请点此查看更多更全内容