杭电计算机组成原理实验RISC-V 实验 存储器设计实验
- 一、实验目的与要求
- 二、实验设计与程序代码
- 三、实验仿真
- 四、电路图
- 五、引脚配置
- 六、思考与探索
- 1、 实验结果记录:
- 2、 实验结论:
- 3、 问题与解决方案:
- 4、 思考题:
- a) 存储器单元是否被写入成功,通过对存储器的读入就知道了数据的正确。
- b) 原来的数据,说明存储器模块是先进行读入再对数据进行写入。
- c) clk_dm读入来的时候读出的数据为DM_Addr地址选择的数据。和板级验证一致
- d) 不同的数据的存储类型的存储的方式和数据的类型对数据是有差别的,无论是数据的类型是RAM还是ROM是存在差别的。同时还存在不同数据存储的风格,例如DRAM,SRAM,VRAM,FPM DRAM,EDO DRAM等等。
- e) 可以通过高5位的数据将存储器里面的数据提取出来,再将数据通过低两位的类型对数据进行处理,提取出相关需要的数据。
- f) 实验过程中是第一次使用IP核,对实验的操作存在差异,同时还存在很多代码编写的问题,在过程主,通过多次编译和报错的修改,将数据进行了相关的修改,并成功通过实验。
一、实验目的与要求
1、 实验目的:
a) 学习使用ISE开发工具的MemoryIP核,设计生成存储器模块的方法
b) 学习存储器的结构及读写原理,掌握存储器的设计方法
2、 实验要求:首先使用ISE开发工具,用IP核导航设计一个64*32位的存储器IP核,然后引用该IP核构造一个存储器实例,实现存储器模块。
二、实验设计与程序代码
1、 模块设计说明
(描述整个实验的设计方案,分几个模块,各模块的功能,各模块之间的连接关系,板级验证方案等,可附图)
这次实验主要训练的是IP盒的生成,所以IP盒的生成根据要求按照以下步骤
后面直接生成即可
coe文件格式如下(数据自己随便写)
2、 实验程序源代码及注释等
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 16:08:55 05/15/2021
// Design Name:
// Module Name: DM
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module DM(
input wire Mem_Write,clk_25M,clk_dm,
input wire [7:2] DM_Addr,
input wire [1:0] MW_Data_s,
output wire [3:0] AN,
output wire [7:0] seg
);
wire [31:0] input_num;
wire [31:0] output_num;
RAM_B myRAM(clk_dm,Mem_Write,DM_Addr,input_num,output_num);//这个模块主要是相关存储器的模块
changechoose mychoose(MW_Data_s,input_num);//这个模块主要是设计相关的输入数据的选择
ShowNum myShowNum(clk_25M,output_num,seg,AN);//这个模块主要是相关数据显示模块
endmodule
module changechoose(
input wire [1:0] MW_Data_s,
output reg [31:0] input_num
);
always@(MW_Data_s)
begin
case(MW_Data_s)
0:begin input_num=32'h00000abb;end
1:begin input_num=32'h11111111;end
2:begin input_num=32'h22222222;end
3:begin input_num=32'h33333333;end
endcase
end
endmodule
module ShowNum(//数码管模块用于显示数据
input clk_25M,
input [31:0] F,
output reg [7:0]seg,
output reg [3:0]AN
);
parameter count=10000;
reg [31:0] clk_num;
reg [3:0] digit;
reg [2:0] which;
initial
begin
clk_num=0;
which=0;
digit=0;
end
always@(posedge clk_25M)
begin
if(clk_num<count)
begin clk_num<=clk_num+1;end
else
begin
clk_num<=0;
which<=which+3'b001;
case(which)
0: begin digit<=F[3:0];end
1: begin digit<=F[7:4];end
2: begin digit<=F[11:8];end
3: begin digit<=F[15:12];end
4: begin digit<=F[19:16];end
5: begin digit<=F[23:20];end
6: begin digit<=F[27:24];end
7: begin digit<=F[31:28];end
endcase
end
end
always@(digit,which)
begin
case(which)
1: begin AN=4'b1111;end
2: begin AN=4'b1110;end
3: begin AN=4'b1101;end
4: begin AN=4'b1100;end
5: begin AN=4'b1011;end
6: begin AN=4'b1010;end
7: begin AN=4'b1001;end
0: begin AN=4'b1000;end
default:AN=4'bzzzz;
endcase
case(digit)
0:seg[7:0]=8'b00000011;
1:seg[7:0]=8'b10011111;
2:seg[7:0]=8'b00100101;
3:seg[7:0]=8'b00001101;
4:seg[7:0]=8'b10011001;
5:seg[7:0]=8'b01001001;
6:seg[7:0]=8'b01000001;
7:seg[7:0]=8'b00011111;
8:seg[7:0]=8'b00000001;
9:seg[7:0]=8'b00001001;
10:seg[7:0]=8'b00010001;
11:seg[7:0]=8'b11000001;
12:seg[7:0]=8'b01100011;
13:seg[7:0]=8'b10000101;
14:seg[7:0]=8'b01100001;
15:seg[7:0]=8'b01110001;
default:seg[7:0]=8'b11111111;
endcase
end
endmodule
三、实验仿真
1、 仿真代码
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 16:36:59 05/16/2021
// Design Name: RAM_B
// Module Name: D:/ShuZiDianLu/example/DM2/testDM.v
// Project Name: DM2
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: RAM_B
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
module testDM;
// Inputs
reg clka;
reg [0:0] wea;
reg [5:0] addra;
reg [31:0] dina;
// Outputs
wire [31:0] douta;
// Instantiate the Unit Under Test (UUT)
RAM_B uut (
.clka(clka),
.wea(wea),
.addra(addra),
.dina(dina),
.douta(douta)
);
initial begin
// Initialize Inputs
clka = 0;
wea = 0;
addra = 0;
dina = 0;
// Wait 100 ns for global reset to finish
// Add stimulus here
#100
clka = 1;
wea = 0;
addra = 1;
#100
clka = 0;
wea = 0;
addra = 2;
#100
clka = 1;
wea = 0;
addra = 3;
#100
clka = 0;
wea = 1;
addra = 0;
dina = 0;
#100
clka = 0;
wea = 0;
addra = 0;
end
endmodule
(含仿真源代码、仿真验证方案)
2、 仿真波形
(运行仿真时,波形截图)
3、 仿真结果分析
(对仿真波形进行分析)
先将0 1 2 3 的数据进行读出 发现没有问题,然后将0号数据存入到0号单元,再将0号单元数据进行读出,发现没有问题。
四、电路图
(开发工具中显示的电路模块图)
五、引脚配置
(引脚约束文件的内容,描述主要配置情况)
NET "Mem_Write" CLOCK_DEDICATED_ROUTE = FALSE;
#PlanAhead Generated physical constraints
NET "AN[3]" LOC = L21;
NET "AN[2]" LOC = M22;
NET "AN[1]" LOC = M21;
NET "AN[0]" LOC = N22;
#PlanAhead Generated IO constraints
NET "AN[3]" IOSTANDARD = LVCMOS18;
NET "AN[2]" IOSTANDARD = LVCMOS18;
NET "AN[1]" IOSTANDARD = LVCMOS18;
NET "AN[0]" IOSTANDARD = LVCMOS18;
#PlanAhead Generated physical constraints
NET "DM_Addr[7]" LOC = T3;
NET "DM_Addr[6]" LOC = U3;
NET "DM_Addr[5]" LOC = T4;
NET "DM_Addr[4]" LOC = V3;
NET "DM_Addr[3]" LOC = V4;
NET "DM_Addr[2]" LOC = W4;
NET "MW_Data_s[1]" LOC = Y4;
NET "MW_Data_s[0]" LOC = Y6;
NET "seg[7]" LOC = H19;
NET "seg[6]" LOC = G20;
NET "seg[5]" LOC = J22;
NET "seg[4]" LOC = K22;
NET "seg[3]" LOC = K21;
NET "seg[2]" LOC = H20;
NET "seg[1]" LOC = H22;
NET "seg[0]" LOC = J21;
NET "clk_25M" LOC = H4;
NET "clk_dm" LOC = R4;
NET "Mem_Write" LOC = AB8;
#PlanAhead Generated IO constraints
NET "DM_Addr[7]" IOSTANDARD = LVCMOS18;
NET "DM_Addr[6]" IOSTANDARD = LVCMOS18;
NET "DM_Addr[5]" IOSTANDARD = LVCMOS18;
NET "DM_Addr[4]" IOSTANDARD = LVCMOS18;
NET "DM_Addr[3]" IOSTANDARD = LVCMOS18;
NET "DM_Addr[2]" IOSTANDARD = LVCMOS18;
NET "MW_Data_s[1]" IOSTANDARD = LVCMOS18;
NET "MW_Data_s[0]" IOSTANDARD = LVCMOS18;
NET "seg[7]" IOSTANDARD = LVCMOS18;
NET "seg[6]" IOSTANDARD = LVCMOS18;
NET "seg[5]" IOSTANDARD = LVCMOS18;
NET "seg[4]" IOSTANDARD = LVCMOS18;
NET "seg[3]" IOSTANDARD = LVCMOS18;
NET "seg[2]" IOSTANDARD = LVCMOS18;
NET "seg[1]" IOSTANDARD = LVCMOS18;
NET "seg[0]" IOSTANDARD = LVCMOS18;
NET "clk_25M" IOSTANDARD = LVCMOS18;
NET "Mem_Write" IOSTANDARD = LVCMOS18;
NET "clk_dm" IOSTANDARD = LVCMOS18;
NET "DM_Addr[7]" PULLDOWN;
NET "DM_Addr[6]" PULLDOWN;
NET "DM_Addr[5]" PULLDOWN;
NET "DM_Addr[4]" PULLDOWN;
NET "DM_Addr[3]" PULLDOWN;
NET "DM_Addr[2]" PULLDOWN;
NET "MW_Data_s[1]" PULLDOWN;
NET "MW_Data_s[0]" PULLDOWN;
NET "clk_25M" PULLDOWN;
NET "clk_dm" PULLDOWN;
NET "Mem_Write" PULLDOWN;
六、思考与探索
1、 实验结果记录:
(实验操作的过程及结果记录)
存储器地址 初始化数据 读出数据 写入新数据 读出数据
0000000H 00000820H 00000820H X 00000820H
0000001H 00632020H 00632020H X 00632020H
0000002H 00010FFFH 00010FFFH 11111111H 00010FFFH
0000002H X 1111111H X 11111111H
2、 实验结论:
(分析实验结果,给出实验结论)
通过板机验证,整个模块符合算法。
3、 问题与解决方案:
问题:发现有部分开关存在没有载入的情况。
解决方案:发现是字符写错了,写改了就好了。
(整个实验过程中发生了什么问题?你是如何解决的。)
4、 思考题:
a) 存储器单元是否被写入成功,通过对存储器的读入就知道了数据的正确。
b) 原来的数据,说明存储器模块是先进行读入再对数据进行写入。
c) clk_dm读入来的时候读出的数据为DM_Addr地址选择的数据。和板级验证一致
d) 不同的数据的存储类型的存储的方式和数据的类型对数据是有差别的,无论是数据的类型是RAM还是ROM是存在差别的。同时还存在不同数据存储的风格,例如DRAM,SRAM,VRAM,FPM DRAM,EDO DRAM等等。
e) 可以通过高5位的数据将存储器里面的数据提取出来,再将数据通过低两位的类型对数据进行处理,提取出相关需要的数据。
f) 实验过程中是第一次使用IP核,对实验的操作存在差异,同时还存在很多代码编写的问题,在过程主,通过多次编译和报错的修改,将数据进行了相关的修改,并成功通过实验。
(力所能及,尝试实践或回答教材后面的思考与探索题目)