上学期刚学完单片机原理,所以上手DE2板子比较容易,RAM 和 ROM概念之前早已经建立。趁着打完使命召唤后有些疲倦,就写一个关于DE2板子上的SRAM的学习笔记缓解一下。+_+
首先,DE2上SRAM的大小是512KB,型号为ISSI- IS61LV25616AL-10TL ,TSOP封装,原理图如下:
引脚说明:
这里说明下地址总线A0-A17,一共18位,2^18=256K != 512KB ,这个可能是RAM芯片内部有一个译码器吧唧。
数据总线I/O 0~I/O 15 ,16位输出。
真值表:
下面直接上代码:
功能介绍:
1、RAM地址发生,我们用一个KEY0作为一个计数器,当人为按下时,4位计数器count++,高位的14位直接补0;
2、用按键KEY1作为WE,当按下时,写入当前按键状态(数据);
3、开发板上SW0 ~ SW15 作为数据输入;
4、HEX3~HEX0显示目的地址的数据,HEX4显示地址;
5、UB和LB都同时打开,方便读取所有数据;
//Top Module
module SRAM(
input [1:0] KEY, //pushbutton [1:0]
input [15:0] SW, //toggle switch[15:0]
output [6:0] HEX0, //7-seg display
output [6:0] HEX1, //7-seg display
output [6:0] HEX2, //7-seg display
output [6:0] HEX3, //7-seg display
output [6:0] HEX4, //7-seg display
output [6:0] HEX5, //7-seg display
output [6:0] HEX6, //7-seg display
output [3:0] LEDG, //led green[3:0]
output [15:0] LEDR, //led red[15:0]
inout [15:0] SRAM_DQ, //SRAM data bus 16 bits
output [17:0] SRAM_ADDR, //SRAM address bus 18 bits
output SRAM_UB_N, //SRAM high-byte data mask
output SRAM_LB_N, //SRAM low-byte data mask
output SRAM_WE_N, //SRAM write enable
output SRAM_CE_N, //SRAM chip enable
output SRAM_OE_N //SRAM output enable
);
reg [3:0] shortCount;
assign HEX5=7'b011_1111; //-用不上的数码管先关闭
assign HEX6=7'b011_1111; //-
assign HEX6=7'b011_1111; //-
//memeory address
//connect KEY0 switch to led to upcount and display
always @(negedge KEY[0])
begin
shortCount<=shortCount+1;
end
assign LEDG[3:0]=shortCount;
//display the hex value of the short counter
//this is also the memory address
HexDigit Digit4(HEX4,shortCount);
//SRAM Interface
assign SRAM_ADDR={14'h0,shortCount}; //SRAM Address bus 18 bits
assign SRAM_UB_N=0; //hi byte select enabled
assign SRAM_LB_N=0; //lo byte select enabled
assign SRAM_CE_N=0; //chip is enabled
assign SRAM_WE_N=KEY[1]; //write when KEY1 is pressed
assign SRAM_OE_N=0; //output enable is overidden by WE
//if KEY1 is not pressed, then float bus, so that SRAM can drive it (read)
//if KEY1 is pressed, drive it with data from SW[15:0] to be stored in SRAM (write)
assign SRAM_DQ=(KEY[1]?16'hzzzz:SW[15:0]);
//show memory on the LEDs and 7-seg display
assign LEDR[15:0]=SRAM_DQ;
HexDigit Digit0(HEX0,SRAM_DQ[3:0]);
HexDigit Digit1(HEX1,SRAM_DQ[7:4]);
HexDigit Digit2(HEX2,SRAM_DQ[11:8]);
HexDigit Digit3(HEX3,SRAM_DQ[15:12]);
endmodule
//Decode one hex digit for LED 7-seg display
module HexDigit(segs,num
//input [3:0] num,
//output reg [6:0] segs
);
input [3:0] num;
output [6:0] segs;
reg [6:0] segs;
always @(num)
begin
case(num)
4'h0: segs = 7'b1000000;
4'h1: segs = 7'b1111001;
4'h2: segs = 7'b0100100;
4'h3: segs = 7'b0110000;
4'h4: segs = 7'b0011001;
4'h5: segs = 7'b0010010;
4'h6: segs = 7'b0000010;
4'h7: segs = 7'b1111000;
4'h8: segs = 7'b0000000;
4'h9: segs = 7'b0010000;
4'ha: segs = 7'b0001000;
4'hb: segs = 7'b0000011;
4'hc: segs = 7'b1000110;
4'hd: segs = 7'b0100001;
4'he: segs = 7'b0000110;
4'hf: segs = 7'b0001110;
default segs = 7'b1111111;
endcase
end
endmodule
由于管脚较多,采取导入txt引脚文件。在取变量名时,可以和官方的CSV文档里面相同,这样方便直接导入。