【笔记】DE2 硬件和处理器范例-2 External SRAM interface (DE2)(digital logic)(verilog hdl)

Introduction

    本项目练习使用外部的61LV25616 SRAM,实现以下目标:

  • 用KEY0作为时钟输入,驱动一个4位的计数器,以产生一个地址码,然后在前面补充14个0扩展成18位的地址码。这个地址码作为存储器的地址在HEX4和绿色的LED上显示。
  • 使用SWITCH[15:0]作为写入SRAM的数据。
  • 使用KEY1作为写使能。注意写使能低电平有效,即按钮按下时。
  • 在红色LED和HEX3-0上显示存储器总线(读或写)。
  • 这个双向的总线可用以下语句配置读或写,注意在Altera的Cyclone II系列,只用FPGA的I/O引脚可作为三态设备。如果指定内部三态,将例化为多路选择器。

        assign SRAM_DQ=(key[1]?16’hzzzz:SW[15:0]);

Design

IS61LV25616简介

    ISSI IS61LV25616是高速SRAM,容量为512KB。DE2上用的是TSOP封装的。引脚图和说明如下:

image

image

image

代码

  
    
1 //Top Module
// project 2 External SRAM interface
2  
3   module SRAM_IO(
4 input [ 1 : 0 ] KEY, // pushbutton [1:0]
5 input [ 15 : 0 ] SW, // toggle switch[15:0]
6 output [ 6 : 0 ] HEX0, // 7-seg display
7 output [ 6 : 0 ] HEX1, // 7-seg display
8 output [ 6 : 0 ] HEX2, // 7-seg display
9 output [ 6 : 0 ] HEX3, // 7-seg display
10 output [ 6 : 0 ] HEX4, // 7-seg display
11 output [ 6 : 0 ] HEX5, // 7-seg display
12 output [ 6 : 0 ] HEX6, // 7-seg display
13 output [ 3 : 0 ] LEDG, // led green[3:0]
14 output [ 15 : 0 ] LEDR, // led red[15:0]
15 inout [ 15 : 0 ] SRAM_DQ, // SRAM data bus 16 bits
16 output [ 17 : 0 ] SRAM_ADDR, // SRAM address bus 18 bits
17 output SRAM_UB_N, // SRAM high-byte data mask
18 output SRAM_LB_N, // SRAM low-byte data mask
19 output SRAM_WE_N, // SRAM write enable
20 output SRAM_CE_N, // SRAM chip enable
21 output SRAM_OE_N // SRAM output enable
22 );
23
24 reg [ 3 : 0 ] shortCount;
25
26 assign HEX5 = 7 ' b011_1111; //-
27 assign HEX6 = 7 ' b011_1111; //-
28 assign HEX6 = 7 ' b011_1111; //-
29
30 // memeory address
31 // connect KEY0 switch to led to upcount and display
32 always @( negedge KEY[ 0 ])
33 begin
34 shortCount <= shortCount + 1 ;
35 end
36 assign LEDG[ 3 : 0 ] = shortCount;
37 // display the hex value of the short counter
38 // this is also the memory address
39 HexDigit Digit4(HEX4,shortCount);
40
41 // SRAM Interface
42 assign SRAM_ADDR = { 14 ' h0,shortCount}; //SRAM Address bus 18 bits
43 assign SRAM_UB_N = 0 ; // hi byte select enabled
44 assign SRAM_LB_N = 0 ; // lo byte select enabled
45 assign SRAM_CE_N = 0 ; // chip is enabled
46 assign SRAM_WE_N = KEY[ 1 ]; // write when KEY1 is pressed
47 assign SRAM_OE_N = 0 ; // output enable is overidden by WE
48 // if KEY1 is not pressed, then float bus, so that SRAM can drive it (read)
49 // if KEY1 is pressed, drive it with data from SW[15:0] to be stored in SRAM (write)
50 assign SRAM_DQ = (KEY[ 1 ] ? 16 ' hzzzz:SW[15:0]);
51 // show memory on the LEDs and 7-seg display
52 assign LEDR[ 15 : 0 ] = SRAM_DQ;
53 HexDigit Digit0(HEX0,SRAM_DQ[ 3 : 0 ]);
54 HexDigit Digit1(HEX1,SRAM_DQ[ 7 : 4 ]);
55 HexDigit Digit2(HEX2,SRAM_DQ[ 11 : 8 ]);
56 HexDigit Digit3(HEX3,SRAM_DQ[ 15 : 12 ]);
57
58 endmodule

  
    
1 // Decode one hex digit for LED 7-seg display
2
3 module HexDigit(segs,num
4 // input [3:0] num,
5 // output reg [6:0] segs
6 );
7 input [ 3 : 0 ] num;
8 output [ 6 : 0 ] segs;
9 reg [ 6 : 0 ] segs;
10
11 always @(num)
12 begin
13 case (num)
14 4 ' h0: segs = 7 ' b1000000;
15 4 ' h1: segs = 7 ' b1111001;
16 4 ' h2: segs = 7 ' b0100100;
17 4 ' h3: segs = 7 ' b0110000;
18 4 ' h4: segs = 7 ' b0011001;
19 4 ' h5: segs = 7 ' b0010010;
20 4 ' h6: segs = 7 ' b0000010;
21 4 ' h7: segs = 7 ' b1111000;
22 4 ' h8: segs = 7 ' b0000000;
23 4 ' h9: segs = 7 ' b0010000;
24 4 ' ha: segs = 7 ' b0001000;
25 4 ' hb: segs = 7 ' b0000011;
26 4 ' hc: segs = 7 ' b1000110;
27 4 ' hd: segs = 7 ' b0100001;
28 4 ' he: segs = 7 ' b0000110;
29 4 ' hf: segs = 7 ' b0001110;
30 default segs = 7 ' b1111111;
31 endcase
32 end
33
34 endmodule

Results and Analysis

    经下载测试,按KEY0来产生一个时钟脉冲,驱动4位的计数器,计数输出显示在HEX4和绿色的LED上。当没按下KEY1时,HEX3-0的显示是浮动的,这时SRAM执行的读操作,按下KEY1,HEX3-0显示当前SW[15:0]的值,当然同样的值也显示在红色的LED上,这时为写SRAM。由上面的真值表可知通过KEY1控制WE的高低,进而控制读写。都由

assign SRAM_WE_N=KEY[1];

 

assign SRAM_DQ = (KEY[1]? 16'hzzzz : SW[15:0]);

实现。

Conclusion

    因为本例采用按KEY0产生时钟脉冲的方法来验证SRAM的读写操作。大大简化了时序控制的问题。IS61LV25616共7种端口,16位的双向的数据总线SRAM_DQ;18位的地址总线SRAM_ADDR;高/低8位标记SRAM_UB_N和SRAM_LB_N;读写使能SRAM_WE_N;片选使能SRAM_CE_N;输出使能SRAM_OE_N;标识符里的_N表示低电平有效。本例比较投机的地方就是关于4位计数器生成的地址码,总共16个地址码,便于验证,可每按一次KEY0,设置一次SW[15:0]作为输入数据,再按一次KEY1记录当前数据。连续记录16个数据后,可通过按KEY0观察HEX3-0的输出。

Reference

1> 61LV25616_SRAM data sheet

2> ECE 576 Cornell University

3> Terasic’s DE2 user manual and code example

你可能感兴趣的:(interface)