FPGA访问SRAM
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相关推荐
- STM32F427利用FSMC接口访问FPGA的SRAM(1)—— STM32F427启动文件
该启动文件做好后,才能进行下一步(STM32F427利用FSMC接口访问FPGA的SRAM),所以此文记录如何制作F427的启动文件. 1.参考F407探索者的资料:TFTLCD显示实验.外部SRAM ...
- STM32F427利用FSMC接口访问FPGA的SRAM(3)—— STM32F427访问FPGA的SRAM
参考STM32F407例程,外部SRAM章节. 关于时序的配置,主要是设置这7个参数,如果是SRAM,则只需关注前3个参数,和最后一个参数. 根据F427 datasheet也可以看出,前3个参数均设 ...
- FPGA扩展SRAM
2019独角兽企业重金招聘Python工程师标准>>> 1 引言 随着数字信号处理技术的不断发展,大容量可编程逻辑器件的不断涌现,FPGA技术越来越多地应用在大规模集成电路设计中.在 ...
- 【长文】从三十年前说起,最全FPGA架构演进史介绍!
摘要:自三十多年前问世以来,现场可编程门阵列(FPGAs)已被广泛用于实现来自不同领域的无数应用.由于其底层的硬件可重新配置性,与定制设计的芯片相比,FPGAs具有更快的设计周期和更低的开发成本.FP ...
- 光刻机基于dsp+fpga+ad+endac光纤传输的高速数据采集与伺服接口系统设计(一)
光刻机双工件台运动控制系统,控制任务相当复杂,要求极高的速度和精度,且设 备体积庞大,各传感器执行器空间距离较远,线缆众多现场电磁干扰严重. 为满足控制系统要求,本文利用 DSP 的高速浮点运算能力. ...
- FPGA配置模式(Altera版)
在自己总结FPGA配置模式之前,看到一篇关于Altera的FPGA芯片的配置方式的文章,写的不错,拿来学习下. FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持 ...
- FPGA SelectMap接口配置设计
http://xilinx.eetop.cn/viewnews-682-page-2 摘要:与通常采用外围的CPLD器件和CPU来产生配置接口控制逻辑的方法不同,本文设计了采用嵌入到FPGA的Leon ...
- FPGA的发展历史及相关名词解释
FPGA全称Field Programmable Gate Array,现场可编辑逻辑门阵列.它以PAL.GAL.CPLD等可编程逻辑器件为技术基础发展而成.相较全定制的ASIC(Applicatio ...
- FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程
FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程 很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序 ...
最新文章
- 判断两个多边形相交的面积_聊聊3D模型组件—顶点,边,多边形
- Halcon知识:如何求一个工件的粗细
- Flex Skin Design Extensions Flex Component Kit 下载.
- layui 分页 固定底部_论layui的使用体验
- const 常量_条款03:尽可能使用const
- WORD如何定义新项目符号?
- BZOJ.4909.[SDOI2017]龙与地下城(正态分布 中心极限定理 FFT Simpson积分)
- 玩转SpringBoot 2 快速搭建 | Spring Initializr 篇
- html横向导入word
- 分享7个超实用的Emmet(zen coding)HTML代码使用技巧
- 《企业IT架构转型之道》边读边想——内容主线
- UEFI原理与编程(七):包及.dsc、.dec、.fdf文件
- 分段衰减衰减系数_深度学习中的固定学习率衰减策略总结
- 【图像超分辨率】Deep Learning for Image Super-resolution: A Survey
- 企业私有云搭建与作用
- PIE-engine APP 教程 ——太湖生态环境智能监测系统
- App Store审核规则简要汇总
- Vivo升级android版本,vivo手机系统怎么升级?vivo系统升级教程
- 京东数科前端岗位面历
- DirectD3D-光照和材质