实验3 SRAM 实验
实验3:SRAM实验
存储器系统是计算机中存放程序和数据的场所,分为内存和外存。THINPAD-Cloud教学计算机设置了两组RAM作为内存,使用FLASH存储器作为外存。本实验主要完成内存存储器的读写访问过程。
SRAM实验目的
-
熟悉THINPAD-Cloud教学计算机内存储器的配置及与总线的连接方式;
-
掌握教学机内存(SRAM)的访问时序和方法;
-
理解总线数据传输的基本原理。
实验内容
使用教学计算机上的FPGA芯片,设计一个状态机和内存读写逻辑,完成对存储器RAM的访问。具体要求如下:
- 初始化操作
①单击复位按钮
②将拨码开关设置为起始地址 Addr,地址单位为 32 位字
③单击时钟按钮
④将拨码开关设置为初始数据 Data
⑤单击时钟按钮
- BaseRAM 操作
①单击 20 次时钟按钮,对 BaseRAM 进行 10 次写入操作,地址连续
②单击 20 次时钟按钮,对 BaseRAM 上述地址进行 10 次读取操作,读取结果应在每两次按键后显示在 16 个 LED 灯上,只需显示数据的低 16 位
③程序将 LED 灯显示的数据,与正确数据进行比较
- ExtRAM 操作
①单击 20 次时钟按钮,对 ExtRAM 进行 10 次写入操作,地址与 BaseRAM 相同,数据为 (BaseRAM 相同地址的数据 + 5)
②单击 20 次时钟按钮,对 ExtRAM 上述地址进行 10 次读取操作,读取结果应在每两次按键后显示在 16 个 LED 灯上,只需显示数据的低 16 位
③程序将 LED 灯显示的数据,与正确数据进行比较
内存数据验证
另外,在实验的过程中,在线的程序将在每轮测试结束后,读取 BaseRAM 和 ExtRAM 存储器中的数据,并与预期数据比较。
在线的测试过程中,对 SRAM 的每个读写操作都会按下两次手动时钟按钮,请严格按照此标准设计状态机。
实验原理
对于存储器芯片的访问,首先要熟悉存储器芯片的访问时序,并了解THINPAD-Cloud教学机上存储器芯片与FPGA芯片的具体连接方式,也就是说,如何在THINPAD-Cloud教学机上具体实现对RAM芯片的访问时序。
THINPAD-Cloud教学计算机上使用的是四片1M*16位的SRAM,两片一组构成一个32位存储器,分别为BaseRAM和ExtRAM,下图是SRAM的访问时序:
从时序要求上看,读取SRAM时要提前准备好地址,并将数据线设置成高阻,然后就可以读出数据了;写SRAM时要提前准备好地址和数据,然后将写信号拉低即可将数据写入相应地址。(IS61WV102416BLL-10TLI,接的 3.3V,延迟是10ns,可以见相应的手册。)
要完成实验,就要给内存芯片提供地址、数据和控制信号。初始地址和数据均来自拨码开关,需要有寄存器接收并保存好,然后分别送到地址总线和数据总线。控制信号有3个,以BaseRAM为例,分别是Base_RAM_EN、Base_RAM_OE和Base_RAM_WE,对应连接到BaseRAM的/CE、/OE和/WE管脚,需要根据对存储芯片的访问要求来正确设置。RAM芯片上还有字节使能信号RAM_BE_N[0..3],低电平有效,分别用于使能32位数据线的四个字节 [7..0] [15..8] [23..16] [31..24],当字节使能信号为'1'时,相应的字节输出为高阻态'Z'。
需要指出的是,由于BaseRAM和串口共同连接在一条总线上,需要使串口不工作,这可以通过串口的控制信号(/UART_RD和/UART_WR)来实现。
主要实验步骤
本实验的完成需要用FPGA芯片来控制存储芯片的读写,根据实验要求,需要在FPGA中实现地址寄存器、数据寄存器,并实现一个简单的状态机来控制对存储芯片的访问。具体步骤如下:
-
定义输入信号:
a. 拨码开关决定读写地址或数据。
b. 绑定RAM的数据线、地址线。
c. 绑定LED灯,用来显示从内存中读出的数据。
-
定义状态机:(注意是两个状态机)
a. 读写状态控制的状态机:控制当前控制器是处于读状态还是写状态。
b. 内存读周期、写周期的状态机(内存控制器状态机):根据时钟进行跳转,控制读写的过程。
-
验证过程
a. 将编译好的内存控制器烧入实验板。
b. 拨动拨码开关预设一个值,在每个写周期,作为写入内存的数据;在每个读周期,该值作为内存地址,控制器从该内存位置处读出数据。该预设值在同一个读/写周期内不改变。
c. 写周期,LED灯显示当前写入的地址;读周期,LED灯最终显示从内存中读出的数据。
d. 注意观察LED上地址和数据的变化,是否符合实验的设计要求。
e. 记录实验结果。
f. 可以自行设计该实验展示的方式。
注意:
实验板上拨码开关SW1~SW32是ON端表示1,相反表示0;时钟和复位按钮CLK、RST均是按下为1,放开为0。
实验数据
将实验过程中对内存读写的数据记录在下表中:
写内存 | 读内存 | 读写一致性 |
---|---|---|
地址 数据 | 地址 数据 | |
思考题
-
静态存储器的读和写各有什么特点?
-
什么是RAM芯片输出的高阻态?它的作用是什么?
-
本实验完成的是将Base_RAM和Ext_RAM作为独立的存储器单独进行访问的功能。如果希望将Base_RAM和Ext_RAM作为一个统一的64位数据的存储器进行访问,该如何进行?
实验提示
本实验最重要的一点是对于SRAM说明书中读写时序的理解,只有正确理解了时序,按照说明书的要求给出信号,SRAM就可以正确的响应。因此,在实验之前必须要阅读和理解一下SRAM的说明书,理解一下时序的概念。
实验可以按照以下的步骤:
(1)可以先不接入时钟50MHz,使用手工时钟来给出SRAM所需要的信号。虽然这种方式可以完成本实验的要求,但是在实际系统中是不能使用的。为了能够对后续的处理器CPU实验有所帮助,建议接入50MHz的时钟来完成SRAM的读写。虽然两种方式在实际表现方式上面有非常大的区别,但是其状态机是类似的,可以将状态机应用于接入到50MHz的内存驱动中。(如果已经掌握了SRAM的时序的话,可以直接尝试使用50MHz的时钟进行驱动。)
(2)完成手工的内存读写之后,改写成为可以接入50MHz的时钟信号,用以驱动内存的读写。整个实验的电路结构可以按照下图来完成。
thinpad_top是本实验所需要实现的功能,sram_controller用来完成对SRAM的真正读写。由于SRAM的延迟非常低,50MHz的时钟完全足够驱动SRAM。clock_btn用来驱动用户接口的状态机。thinpad_top的每一个步骤都对应着SRAM_Controller状态机的一次完整执行。(后面进行串口读写的过程也是类似的。)
常见的错误:
1. 需要把串口禁止掉。
assign uart_rdn = 1\'b1;
assign uart_wrn = 1\'b1;
2. 需要把byte enable使能,打开所有的字节位。
assign base_ram_be_n = 4\'b0000;
assign ext_ram_be_n = 4\'b0000;
3. 注意数据的位数。比如上述如果直接写:4'h1的话,就把最后一位给禁止了,其它三位使能。
4. 注意,在Thinpad实验平台中,内存是按照字编址的(不是按照字节编址的),字的位宽是32位,但是在RISC-V中是按照字节寻址的。因此,这里面两者是有差异的,需要考虑如何把对于字节的访问翻译为对应的对于字的访问(当然需要配合字节的使能信号)。在本实验中体现不明显,在后面的处理器实验中必须要考虑到这一点。
5. 这是使用inout作为输入输出的方式
assign base_ram_data_wire = data_z ? 32\'bz : ram_data;
如果data_z是1的话,base_ram_data_wire是高阻态,等待内存(或者串口)的输出。如果是0的话,ram_data可以作为输入。
9. 如果使用云平台上的读写内存的工具,在进行读写的时候FPGA内部的电路会被清空,在读写完成之后会重新写入FPGA,这个时候整个系统就跟刚刚把bit文件下载到FPGA中一样。
下面是本实验的工作截图:
在测试和验证的时候,可以充分利用云平台的读内存的工具。上述图中,读取内存地址为0的位置,显示低的两个字节到LED上。在平台上有读取内存地址的工具,可以对照看是否读取或者写入正确。