原创 基于DE1的SRAM测试

2011-3-8 20:52 2856 15 17 分类: FPGA/CPLD

     该测试的功能主要测试DE1的sram驱动,用一个拨码开关设置sram的读和写,当写入sram时,连续的写入,大约60ns写一次,当拨码开关设置成读时,就读出最后写的数据,在两位数码管中显示。所以读出的数据是随机的,没有按照固定的时间去读,而是随操作者的拨码开关而定。

      因为DE1的sram是512K大小的,型号为IS61Lv25616,字宽为16位,而本测试只需要能读写sram,所以只用到了其中的低8位,它的数据位有两个控制脚,分别为LB和UB,所以在程序中将UB一直设为1,不用。

      其引脚功能分布如下:

Clk50Mhz---------------------------------------------fpga的clk时钟

RstN--------------------------------------------------复位按键信号

SwOe --------------------------------------------------拨码开关,为1时写

SramData----------------------------------------------控制sram的双向数据口

Hex0---------------------------------------------------数码管0,显示低4位

Hex1---------------------------------------------------数码管1,显示高4位

LedW--------------------------------------------------led红,写数据时指示

LedW--------------------------------------------------led绿,读数据时指示

SramLbN---------------------------------------------控制sram是否用低8位数据

SramUbN---------------------------------------------控制sram是否用高8位数据

SramWeN----------------------------------------------控制sram的写

SramOeN----------------------------------------------控制sram的输出

SramCeN----------------------------------------------选中sram芯片

SramAdr-----------------------------------------------sram的18位地址线

 

其代码如下:

module SramTest(Clk50Mhz,RstN,SwOe,SramData,Hex0,Hex1,LedW,LedR,

              SramLbN,SramUbN,SramWeN,SramOeN,SramCeN,SramAdr);

               

input Clk50Mhz,RstN,SwOe;

inout [7:0]SramData;

output [17:0]SramAdr;

output[6:0]Hex0,Hex1;

output LedW,LedR,SramLbN,SramUbN,SramWeN,SramOeN,SramCeN;

 

//only use the low 8 bit of the data,and chose the chip forever

assign SramLbN=1'd0;

assign SramUbN=1'd1;

assign SramCeN=1'd0;

assign SramOeN=1'd0;

 

//control the read or write signal

assign LedW=(SwOe==1)?1:0;       //when the toggle switch(SwWrite) is toggled,it will be '1',and the write from sram is enable

//assign LedR=(SwRead==0)?1:0;

 

//delay to insure the write timeing sequence

reg[1:0]Delay60Ns;

always@(posedge Clk50Mhz or negedge RstN)

    if(!RstN)Delay60Ns<=2'd0;

    else if(Delay60Ns==2'd3)

            Delay60Ns<=2'd0;

    else Delay60Ns<=Delay60Ns+2'd1;

 

//write for the sram

reg[7:0] r_SramData;

reg[17:0]r_SramAddr;

reg r_SramWeN;

reg r_SramOeN;

always@(posedge Clk50Mhz or negedge RstN)

    if(!RstN)

    begin

        r_SramOeN<=1'd1;

        r_SramWeN<=1'd1;

        r_SramData<=8'd0;

        r_SramAddr<=18'd0;

    end

    else if(LedW)              //read sram enable

    begin

        r_SramOeN<=1'd1;

        r_SramData<=r_SramData+8'd1;

        r_SramAddr<=r_SramAddr+18'd1;

        r_SramWeN<=1'd0;

        if(Delay60Ns==2'd3)

            r_SramWeN<=1'd1;

    end

    else //if(LedR)

    begin

        r_SramOeN<=1'd0;

        if(Delay60Ns==2'd3)

        r_SramWeN<=1'd1;     

    end

assign SramWeN=r_SramWeN;

//assign SramOeN=r_SramOeN;

assign SramAdr=r_SramAddr;

assign SramData=SwOe ? r_SramData:8'bZ;

 

//read for the sram   

reg[7:0] r_Hex;

always@(posedge Clk50Mhz or negedge RstN)

    if(!RstN)

        r_Hex<=8'd0;

    else if(!LedW)              //read sram enable

    begin

        if(Delay60Ns==2'd3)

            r_Hex<=r_SramData;

    end

 

//disply the number of reading sram

reg[6:0] r_Hex0,r_Hex1;

//always@(r_SramData)

always@(posedge Clk50Mhz or negedge RstN)

    if(!RstN)

    begin

        r_Hex0<=7'd0;

        r_Hex1<=7'd0;

    end

    else if(!SwOe)

    begin

        r_Hex0<=SetHex(r_Hex[3:0]);

        r_Hex1<=SetHex(r_Hex[7:4]);

    end

assign Hex0=r_Hex0;

assign Hex1=r_Hex1;

 

//SetHex :function of encode

function [6:0] SetHex;

input[3:0] Number;

case(Number)

    4'd0: SetHex = 7'b100_0000; //0

    4'd1: SetHex = 7'b111_1001; //1

    4'd2: SetHex = 7'b010_0100; //2

    4'd3: SetHex = 7'b011_0000; //3

    4'd4: SetHex = 7'b001_1001; //4

    4'd5: SetHex = 7'b001_0010; //5

    4'd6: SetHex = 7'b000_0010; //6

    4'd7: SetHex = 7'b111_1000; //7

    4'd8: SetHex = 7'b000_0000; //8

    4'd9: SetHex = 7'b001_1000; //9

    4'd10: SetHex = 7'b000_1000; //A

    4'd11: SetHex = 7'b000_0011; //B

    4'd12: SetHex = 7'b100_0110; //C

    4'd13: SetHex = 7'b010_0001; //D

    4'd14: SetHex = 7'b000_0110; //E

    4'd15: SetHex = 7'b000_1110; //F

    default:SetHex = 7'b111_1111; //default

endcase

endfunction

 

endmodule

      注:在用altera的DE1开发板调试Sram驱动时,出现了上篇文章提出的错误:Error: BIDIR pin "SramData[0]" feeds BIDIR pin " renamed_port_9"。(弄了一天才发现是moudle模块中重复定义了SramData。),当把这个错误解决后,Sram的驱动也就成功了。

 

 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户401088 2011-7-12 14:09

好好的代码粘过来就成这样了,麻烦LZ移步--> http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4865577&bbs_id=1029

用户401088 2011-7-12 14:08

麻烦LZ帮忙看一下我写的这个代码,一直不知问题出在哪。 oe、ce 接地, 用we信号控制读写, 我的操作过程如下: 读:1、打开读信号,锁存地址传到地址总线 2、锁存数据,关闭读信号 写:1、打开写信号,锁存地址和数据 2、等待SRAM总线高阻形成 3、关闭写信号,完成写过程 不知这样操作行不行? 代码如下: module sram_ctrl ( clk,rst_n, read,write,addr_i,wdata_i,rdata_o, SRAM_DQ, SRAM_ADDR,SRAM_LB_N,SRAM_UB_N,SRAM_CE_N,SRAM_OE_N,SRAM_WE_N ); input clk; input rst_n; input [22:0] addr_i; input read; input write; input [15:0] wdata_i; output [15:0] rdata_o; inout [15:0] SRAM_DQ; // SRAM Data bus 16 Bits output [22:0] SRAM_ADDR; // SRAM Address bus 18 Bits output SRAM_LB_N; // SRAM Low-byte Data Mask output SRAM_UB_N; // SRAM High-byte Data Mask output SRAM_CE_N; // SRAM Chip chipselect output SRAM_OE_N; // SRAM Output chipselect output SRAM_WE_N; // SRAM Write chipselect assign SRAM_LB_N=1'b1; assign SRAM_UB_N=1'b1; assign SRAM_OE_N=1'b1; assign SRAM_CE_N=1'b1; reg HIGHZ; reg [22:0] SRAM_ADDR_r; reg SRAM_WE_N_r; reg [15:0] rdata_r; reg [15:0] wdata_r; reg [2:0] CS; //状态寄存 parameter IDLE=0; parameter R_START=1; parameter R_FINISH=2; parameter W_START=3; parameter THIGHZ=4; parameter W_FINISH=5; always@(posedge clk or negedge rst_n) if(!rst_n)begin HIGHZ<=0; SRAM_WE_N_r<=1; SRAM_ADDR_r<=0; rdata_r<=0; wdata_r<=0; end else begin case(CS) IDLE: begin HIGHZ<=0; if(read) CS<=R_START; else if(write) CS<=W_START; else CS<=IDLE; end R_START:begin SRAM_WE_N_r<=1; SRAM_ADDR_r<=addr_i; CS<=R_FINISH; end R_FINISH:begin rdata_r<=SRAM_DQ; SRAM_WE_N_r<=0; CS<=IDLE; end W_START:begin SRAM_WE_N_r<=0; SRAM_ADDR_r<=addr_i; wdata_r<=wdata_i; CS<=THIGHZ; end THIGHZ:begin //等待SRAM总线上拉成高阻 CS<=W_FINISH; HIGHZ<=1;//高阻形成信号,送给inout做判断 end W_FINISH:begin SRAM_WE_N_r<=1; CS<=IDLE; end default:CS<=IDLE; endcase end assign SRAM_DQ=HIGHZ ? wdata_r : 16'bzzzz_zzzz_zzzz_zzzz; //HIGHZ控制inout方向 assign SRAM_WE_N=SRAM_WE_N_r; assign SRAM_ADDR=SRAM_ADDR_r; assign rdata_o=rdata_r; endmodule
相关推荐阅读
用户253961 2012-03-03 11:54
Matlab DIP(瓦)ch3小笔记
         对应上篇文章Matlab DIP(瓦) ch3中用到的一些小知识点,自己联系时写下的小笔记。 matlab版本2009a,matlab7.8的。 f = imr...
用户253961 2012-03-03 11:51
Matlab DIP(瓦) ch3练习
      Matlab是一种图像视频处理实现的好工具,因为matlab是基于数组操作的,而一副图像就是一个数组。因此搞DIP或者CV的是一种必需掌握的工具。     为了学会使用matlab...
用户253961 2012-03-01 18:46
opencv源码解析之滤波前言
     对图像的滤波和平滑是出来数字图像处理和计算机视觉非常重要的一个步骤,那么什么是滤波呢?滤波用编程语言到底是怎么实现的呢?效果怎么样?本人打算学习opencv有关滤波的源码,进一步加强图像...
用户253961 2011-09-24 23:14
怎样在MFC中捕获摄像头并显示出来
Visual_C++编程实现摄像头视频捕捉.pdf 说实话,要用MFC显示摄像头视频,对于入门者来说真是件难事情。网上这方面的文档简直就是太少了。倒是有很多源代码,但是对于MFC不熟悉的同学有源代码...
用户253961 2011-05-31 16:53
Hdb3之FPGA实现
  (转载请写明出处,谢谢!) 一:前言     这2天在帮一同学弄用cpld实现hdb3的编码和解码,要用vhdl,可惜我只是会一点verilog,所以我开始就用verilog来写,写出来后看点v...
用户253961 2011-05-30 21:53
基于FPGA的bmp图片显示
好久没有更新博客了,最近去了趟厦门参加考研复试,在深圳实习了1个月,然后赶回来弄毕设,一时间没更新博客。下面把我毕业设计的论文放上来,毕设题目是《基于大规模fpga的bmp图库管理》,这个题目名字...
EE直播间
更多
我要评论
2
15
关闭 站长推荐上一条 /3 下一条