名称:SRAM测试试验设计Verilog代码VIVADO  ARTIX-7开发板(文末获取)

软件:VIVADO

语言:Verilog

代码功能:

SRAM测试试验

测试SRAM接口,本试验用来试验SRAM的读写功能,通过在线调试工具观察读写的数据,并进行读写数据比对。

本代码已在ARTIX-7开发板验证,ARTIX-7开发板如下,其他开发板可以修改管脚适配:

ARTIX-7开发板.png

1简介

本试验用来试验SRAM的读写功能,通过在线调试工具观察读写的数据,并进行读写数据比对。

2实验原理

静态数据存储器SRAM是存储数据比较重要的器件,它由锁存器阵列构成。SRAM外部接口包括片选端口,读允许端口,写允许端口,地址端口,数据输出输入端口。在读写数据时,SRAM根据地址信号,经由译码电路选择读写的相对应的存储单元。我们开发板选择的SRAM型号是IS61WV12816EDBLL,可存储128K的数据,其管脚定下如下:

其时序如下图所示:

3程序设计

rst        , //软复位信号

                clk      , //时钟信号

                           

                sram_ab    , //sram的地址信号

                sram_db    , //sram双向数据信号

                sram_wr    , //sram写使能信号

                sram_rd    ,  //sram读使能信号

                error,      //用来数据比对,如果比对结果错误,则将error赋1,

                task_start , //Start    Testing ---LED1

                task_finish

               );

input           rst       ;

input           clk     ;

output [16:0]   sram_ab   ;

inout  [15:0]   sram_db   ;

output          sram_wr   ;

output          sram_rd   ;

output error;

output           task_start ;

output          task_finish;        

//ports

wire            rst       ;  

wire            clk     ;  

                             

parameter     IDLE     = 3'D0,

             WRITE_1  = 3'D1,

             WRITE_2  = 3'D2,

             READ_1   = 3'D3,

             READ_2   = 3'D4;

             

assign  sram_db = sram_rd ? sram_db_reg:'hz;

//计数用来产生25Mhz的时钟

reg [3:0] clk_count;

always @(posedge clk or negedge rst)

  if(!rst)

      begin

          clk_count<=4'd0;

      end

  else

       begin

             clk_count<=clk_count+4'b1;

       end  

assign clk25m = clk_count[2];

//sram读写state machine              

always @ (STATE or sram_ab or error or task_start)

begin

   case(STATE)

   IDLE    : if(task_start)

                 NEXT = WRITE_1;

             else

                 NEXT = IDLE   ;

   WRITE_1 : NEXT = WRITE_2;

   WRITE_2 : if( sram_ab >= 17'h1ffff)

                 NEXT = READ_1;

             else

                 NEXT = WRITE_1;

   READ_1  : NEXT = READ_2;

   READ_2  : if(  sram_ab >= 17'h1ffff)//error ||

                 NEXT = IDLE;

             else

                 NEXT = READ_1;

   default : NEXT = IDLE ;

   endcase

end

//registe the state

always @ (posedge clk25m or negedge rst)

if(!rst)

  STATE <= IDLE;

else

  STATE <= NEXT;

4实验现象

将目录“... \at7_prj_07\at7_prj\at7_prj.runs\impl_1”文件夹下的 at7_prj.bit 文件下载到开发板上,则sram开始自动读写操作,通过在线调试工具可以看到sram_rd信号为低电平时,表明FPGA在读SRAM数据,读出来的数据sram_db_dly与count_dly进行比对,数据一致,则说明sram读写正常,error信号一直是低电平。

部分代码展示:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2019/04/13 17:54:08
// Design Name: 
// Module Name: at7_prj
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////
module at7_prj(
               rst        , //软复位信号
                 clk      , //时钟信号
                             
                 sram_ab    , //sram的地址信号
                 sram_db    , //sram双向数据信号
                 sram_wr    , //sram写使能信号
                 sram_rd    ,  //sram读使能信号
                 error,      //用来数据比对,如果比对结果错误,则将error赋1,
                 task_start , //Start    Testing ---LED1 
                 task_finish
                ); 
input           rst       ; 
input           clk     ; 
 
output [16:0]   sram_ab   ; 
inout  [15:0]   sram_db   ; 
output          sram_wr   ; 
output          sram_rd   ; 
output error; 
output           task_start ; 
output          task_finish;         
//ports 
wire            rst       ;   
wire            clk     ;   
                              
(*mark_debug="TRUE"*)reg    [16:0]   sram_ab   ;   
   wire   [15:0]   sram_db   ;  
(*mark_debug="TRUE"*) reg    [15:0]   sram_db_dly ;
(*mark_debug="TRUE"*) reg             sram_wr   ;   
(*mark_debug="TRUE"*)reg             sram_rd   ;   
                              
reg             task_start ;  
reg             task_finish;  
//internal signals 
reg             clk_2; 
(*mark_debug="TRUE"*)wire            clk25m; 
reg  [2:0]      STATE,NEXT; 
(*mark_debug="TRUE"*) reg             error     ; 
(*mark_debug="TRUE"*)reg  [15:0]     sram_db_reg; 
reg  [15:0]     count      ;
(*mark_debug="TRUE"*)reg  [15:0]     count_dly      ; 
//parameters 
parameter     IDLE     = 3'D0, 
              WRITE_1  = 3'D1, 
              WRITE_2  = 3'D2, 
              READ_1   = 3'D3, 
              READ_2   = 3'D4; 
              
assign  sram_db = sram_rd ? sram_db_reg:'hz; 
//计数用来产生25Mhz的时钟
reg [3:0] clk_count; 
always @(posedge clk or negedge rst) 
   if(!rst) 
       begin 
           clk_count<=4'd0; 
       end
源代码

点击下方的公众号卡片获取

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐