Abstract

  本实验实现了对SRAM每一个地址进行遍历读/写操作,然后对比读写前后的数据是否一致,最后通过一个LED灯的亮灭进行指示;

Introduction

  DE2-115上用的SRAM是IS61WV102416BL(1Mx16 High-Speed Asynchronous CMOS Static RAM With 3.3V Supply)

  

  

  

  我们把SRAM_CE,SRAM_OE,SRAM_UB,SRAM_LB置0,这样写操作时,只需送数据和地址,同时把SRAM_WE拉低,然后延时Twc时间在把SRAM_WE拉高,这时就把数据写入相应的地址;读数据时,只需把需要读出的地址放到SRAM的地址总线上,然后延迟Taa时间后就可以读出数据了.

  SRAM写时序:

  

  SRAM读时序:

  

sram_controller.v

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
`timescale 1ns/1ps
// ********************************************************************* //
// Filename: sram_controller.v                                           //
// Projects: sram_controller on DE2-115                                  //
//           without  external clock                                     //
// Function: check the wirte/read data by led,                           //
//           right:LED=1 Wrong:LED=0                                     //           
// Author  :                                                   //
// Date    :                                                   //
// Version : 1.0                                                         //
// Company :                                                             //
// ********************************************************************* //
 
module sram_controller(
//  intput
input clk_50,
input rst_n,
//  output
output[19:0] sram_addr,
output sram_wr_n,
output sram_ce_n,
output sram_oe_n,
output sram_ub_n,
output sram_lb_n,
output led,
//  inout
inout[15:0] sram_data
);
//
assign sram_ce_n = 1'b0;    //sram chip select always enable
assign sram_oe_n = 1'b0;    //sram output always enable
assign sram_ub_n = 1'b0;    //upper byte always available
assign sram_lb_n = 1'b0;    //lower byte always available
//
reg[25:0] delay;        //延时计数器,周期约为1.34s
always@(posedge clk_50 or negedge rst_n)
    if(!rst_n)
        delay <= 26'd0;
    else
        delay <= delay+1'b1;
//
reg[15:0] wr_data;
reg[15:0] rd_data;
reg[19:0] addr_r;
wire sram_wr_req;
wire sram_rd_req;
reg led_r;
 
assign sram_wr_req = (delay == 26'd9999);
assign sram_rd_req = (delay == 26'd19999);
 
always@(posedge clk_50 or negedge rst_n)
    if(!rst_n)
        wr_data <= 16'b0;
    else if(delay == 26'd29999)
        wr_data <= wr_data+1'b1;
         
always@(posedge clk_50 or negedge rst_n)
    if(!rst_n)
        addr_r <= 20'b0;
    else if(delay == 26'd29999)
        addr_r <= addr_r+1'b1;
     
always@(posedge clk_50 or negedge rst_n)
        if(!rst_n)
            led_r <= 1'b0;
        else if(delay == 26'd29999)
            begin
                if(wr_data == rd_data)
                    led_r <= 1'b1;
                else
                    led_r <= 1'b0;
            end
assign led = led_r;
//
`define DELAY_80NS  (cnt == 3'd7)   //80nss取决于Twc的值, cnt=7约140ns;
 
reg[3:0] cstate, nstate;
parameter   IDEL = 4'd0,
            WRT0 = 4'd1,
            WRT1 = 4'd2,
            REA0 = 4'd3,
            REA1 = 4'd4;
             
reg[2:0] cnt;
always@(posedge clk_50 or negedge rst_n)
    if(!rst_n)
        cnt <= 3'b0;
    else if(cstate == IDEL)
        cnt <= 3'b0;
    else
        cnt <= cnt+1'b1;
//  两段式状态机写法,时序逻辑      
always@(posedge clk_50 or negedge rst_n)
    if(!rst_n)
        cstate <= IDEL;
    else
        cstate <= nstate;
//  两段式状态机写法,组合逻辑          
always@(posedge clk_50 or negedge rst_n)
    case(cstate)
        IDEL:   if(sram_wr_req)
                    nstate <= WRT0;
                else if(sram_rd_req)
                    nstate <= REA0;
                else
                    nstate <= IDEL;
        WRT0:   if(`DELAY_80NS)
                    nstate <= WRT1;
                else
                    nstate <= WRT0;
        WRT1:   nstate <= IDEL;
        REA0:   if(`DELAY_80NS)
                    nstate <= REA1;
                else
                    nstate <= REA0;
        REA1:   nstate <= IDEL;
        default:nstate <= IDEL;
    endcase
     
assign sram_addr =addr_r;
//  锁存数据
reg sdlink;     //SRAM地址总线控制信号
always@(posedge clk_50 or negedge rst_n)
    if(!rst_n)
        rd_data <= 16'b0;
    else if(cstate == REA1)
        rd_data <= sram_data;
         
always@(posedge clk_50 or negedge rst_n)
    if(!rst_n)
        sdlink <= 1'b0;
    else
        case(cstate)
            IDEL:   if(sram_wr_req)
                        sdlink <= 1'b1;
                    else if(sram_rd_req)
                        sdlink <= 1'b0;
                    else
                        sdlink <= 1'b0;
            WRT0:   sdlink <= 1'b1;
            default:sdlink <= 1'b0;
        endcase
     
assign sram_data = sdlink ? wr_data:16'hzzzz;
assign sram_wr_n = ~sdlink;
 
endmodule

FPGA访问SRAM相关推荐

  1. STM32F427利用FSMC接口访问FPGA的SRAM(1)—— STM32F427启动文件

    该启动文件做好后,才能进行下一步(STM32F427利用FSMC接口访问FPGA的SRAM),所以此文记录如何制作F427的启动文件. 1.参考F407探索者的资料:TFTLCD显示实验.外部SRAM ...

  2. STM32F427利用FSMC接口访问FPGA的SRAM(3)—— STM32F427访问FPGA的SRAM

    参考STM32F407例程,外部SRAM章节. 关于时序的配置,主要是设置这7个参数,如果是SRAM,则只需关注前3个参数,和最后一个参数. 根据F427 datasheet也可以看出,前3个参数均设 ...

  3. FPGA扩展SRAM

    2019独角兽企业重金招聘Python工程师标准>>> 1 引言 随着数字信号处理技术的不断发展,大容量可编程逻辑器件的不断涌现,FPGA技术越来越多地应用在大规模集成电路设计中.在 ...

  4. 【长文】从三十年前说起,最全FPGA架构演进史介绍!

    摘要:自三十多年前问世以来,现场可编程门阵列(FPGAs)已被广泛用于实现来自不同领域的无数应用.由于其底层的硬件可重新配置性,与定制设计的芯片相比,FPGAs具有更快的设计周期和更低的开发成本.FP ...

  5. 光刻机基于dsp+fpga+ad+endac光纤传输的高速数据采集与伺服接口系统设计(一)

    光刻机双工件台运动控制系统,控制任务相当复杂,要求极高的速度和精度,且设 备体积庞大,各传感器执行器空间距离较远,线缆众多现场电磁干扰严重. 为满足控制系统要求,本文利用 DSP 的高速浮点运算能力. ...

  6. FPGA配置模式(Altera版)

    在自己总结FPGA配置模式之前,看到一篇关于Altera的FPGA芯片的配置方式的文章,写的不错,拿来学习下. FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持 ...

  7. FPGA SelectMap接口配置设计

    http://xilinx.eetop.cn/viewnews-682-page-2 摘要:与通常采用外围的CPLD器件和CPU来产生配置接口控制逻辑的方法不同,本文设计了采用嵌入到FPGA的Leon ...

  8. FPGA的发展历史及相关名词解释

    FPGA全称Field Programmable Gate Array,现场可编辑逻辑门阵列.它以PAL.GAL.CPLD等可编程逻辑器件为技术基础发展而成.相较全定制的ASIC(Applicatio ...

  9. FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程

    FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程 很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序 ...

最新文章

  1. 判断两个多边形相交的面积_聊聊3D模型组件—顶点,边,多边形
  2. Halcon知识:如何求一个工件的粗细
  3. Flex Skin Design Extensions Flex Component Kit 下载.
  4. layui 分页 固定底部_论layui的使用体验
  5. const 常量_条款03:尽可能使用const
  6. WORD如何定义新项目符号?
  7. BZOJ.4909.[SDOI2017]龙与地下城(正态分布 中心极限定理 FFT Simpson积分)
  8. 玩转SpringBoot 2 快速搭建 | Spring Initializr 篇
  9. html横向导入word
  10. 分享7个超实用的Emmet(zen coding)HTML代码使用技巧
  11. 《企业IT架构转型之道》边读边想——内容主线
  12. UEFI原理与编程(七):包及.dsc、.dec、.fdf文件
  13. 分段衰减衰减系数_深度学习中的固定学习率衰减策略总结
  14. 【图像超分辨率】Deep Learning for Image Super-resolution: A Survey
  15. 企业私有云搭建与作用
  16. PIE-engine APP 教程 ——太湖生态环境智能监测系统
  17. App Store审核规则简要汇总
  18. Vivo升级android版本,vivo手机系统怎么升级?vivo系统升级教程
  19. 京东数科前端岗位面历
  20. DirectD3D-光照和材质

热门文章

  1. 2020.10.19 第18节 预处理和宏定义
  2. Verilog HDL 语法学习笔记
  3. 怎么开传奇sf?传奇开服交流分享。
  4. 关于学校闪讯的路由器使用
  5. 学习java开发培训
  6. 南大计算机学院在职博士,南京大学双证在职博士
  7. 5G NR 下行同步SSB(2)-- PSS和SSS的用途
  8. 银河大百科【宇宙的数量级】
  9. python3.6实现随机森林算法(可视化)机器学习算法(赵志勇)学习笔记
  10. 国内计算机博士去百度云,于博士Cadence视频教程60集全套百度网盘分享