您的当前位置:首页正文

实验五_存储器设计

2022-02-10 来源:钮旅网
计算机组成原理

实验五

《存储器设计》

实验报告

姓名:吴速碘 黄紫微 学号:******** ******** 班级:计算机二班 日期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

因篇幅问题不能全部显示,请点此查看更多更全内容