您的位置:首页 > 其它

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

2011-03-31 14:43 603 查看

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封装的。引脚图和说明如下:













代码

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: