北邮计算机原理实验-存储器
实验名称:存储器实验 学院:信息与通信工程学院 班级:2017211113 姓名:*** 学号:********** 同组成员姓名:李凝 同组成员学号:**********
一、实验目的
1. 熟练掌握 GPIO 输入输出操作。 2. 掌握存储器原理及应用。 3. 学会根据时序图编写程序。
二、实验原理及内容
(一)实验原理
1. 双端口存储器简介双端口存储器是指同一个存储器具有两组相互独立的读写控制线路,进行并行的独立操作,是一种高速工作的存储器。
2. 双端口存储器
clock: 系统时钟50Mhz,用于提供RAM读写数据;
wraddress: 写数据地址,将数据写入该地址的 RAM 存储区内; data: 写入的数据 0~7; wren: 写使能高电平有效;
rdadress: 读数据地址,将内存中的数据从RAM存储区读出;
(二)实验内容
1. 基础部分(必做实验) 1)基于FPGA设计存储器; 2)C 编语言编程实现 ARM 对 FPGA 设计的存储器进行读写测试,并送指示灯显示数据; 2. 提高部分(选做实验)
1)基于 FPGA 设计双存储器 M1、M2;
2)C编语言编程实现ARM对M1、M2储器读写操作,并从M1、M2某个地址单元中读取
数据,将读取的数据进行运算,并将运算结果送到M1某个地址单元保存,再将结果读出送指示灯显示;
三、硬件接线图与软件程序流程图
(一)、硬件接线图
管脚与模块连接
ARM接口
(二)软件程序流程图
开始 定时器初始化 GPIO初始化 读 写 按键检测 按键消抖 按键消抖 获取地址(0~2位) 获取地址(0~2位) GPIO写入读信号 读取拨码开关数据 内存 地址线写入 数据线写入 从内存获取数据 LED显示写入数据 LED显示读取数据 While(1) 四、源程序
(一)C语言程序
#include \"stm32f4xx.h\" #include \"delay.h\"
/******************************* 功 能:LED端口初始化 参 数:无 返回值:无
*******************************/
#define KEY_READ() GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8) // 上按键检测 #define KEY_WRITE() GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_11) // 下按键检测
#define CLK(val) GPIO_WriteBit(GPIOF, GPIO_Pin_6, (BitAction)val) // FPGA 时钟信号 #define WREN(val) GPIO_WriteBit(GPIOF, GPIO_Pin_7, (BitAction)val) // FPGA 读写信号
/******************************* 功 能:LED灯读写数据显示 参 数:无 返回值:无
*******************************/
void Led_Init(void) { }
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //开启GPIOB的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 \\
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Write(GPIOB, 0x0000);
| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitTypeDef GPIO_InitStructure;
/******************************* 功 能:拨码开关端口初始化 参 数:无 返回值:无
*******************************/ void Sw_Init(void) {
GPIO_Pin_11; }
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //开启GPIOC的时钟 GPIO_InitTypeDef GPIO_InitStructure;
(二)Verilog语言程序(Quartus中)
module double_ram( clock, data, rdaddress, wraddress, wren, q ); input clock; input [3:0]data; input [2:0]rdaddress; input [2:0]wraddress; input wren; output [3:0]q; wire [3:0]n_rdaddress = {1'b0,rdaddress}; wire [3:0]n_wraddress = {1'b0,wraddress}; ram2 ram2 ( .clock(clock), .data(data),
);
endmodule
.rdaddress(n_rdaddress), .wraddress(n_wraddress), .wren(wren), .q(q)
五、实验结果
实现了数据的对指定地址的写入、读取操作。 拨码开关的前三位为地址,后四位为数据。通过4位LED灯的亮灭表示该地址对应的数据。
(1)写操作:
显示写入的数据0101 写入数据0101
过程:
按下“写”开关,在该地址写入此时 拨码开关4~7 的数据“0101”,并存储在该地址,LED灯显示写入的数据“0101”
(2)读操作
读出此地址数据0101 按下读开关 此时所读地址
过程:
将4个数据置位,地址开关(拨码开关0~2位)拨到之前写入地址,按下“读”开关, 此时LED灯显示该地址存储的数据“0101”
六、实验总结(出现的问题和解决方法)
实验过程中出现的问题: Quartus的烧录不稳定
第一次操作时,仅仅将Keil和Quartus的代码烧录一次(先Quartus后Keil),但是实际有效果的只是Keil的代码,所以展现的效果中时钟出现了问题,无法实现数据的存储和读取。(按下read直接全亮)
解决办法:先烧录Keil代码,再烧录Quartus,先检验试验结果,若出现上述情况,接着把Quartus代码烧录,以实现目的效果。
七、实验收获与心得体会
通过这次实验,我不仅将之前数电中的FPGA知识得到了应用,加之本学期学习的ARM编程,两者融会贯通,更加促进了知识的理解和吸收,加深了我对计算机原理实验开发板的认识,将理论付诸实践,提升了动手能力。
因篇幅问题不能全部显示,请点此查看更多更全内容