杭电计算机组成原理实验RISC-V 实验 存储器设计实验

杭电计算机组成原理实验RISC-V 实验 存储器设计实验

一、实验目的与要求

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核,对实验的操作存在差异,同时还存在很多代码编写的问题,在过程主,通过多次编译和报错的修改,将数据进行了相关的修改,并成功通过实验。

(力所能及,尝试实践或回答教材后面的思考与探索题目)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值