SRAM的读写操作
自己写的SRAM的程序,主要在于实用性,适应工作的工程需要。使用芯片为:
芯片时序图为:
代码:
/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name : ZF_SRAM.v
** CreateDate :2014.11
** Funtions : SRAM的读写功能,CS、LB、UB都被固定住(CS1 =L,CS2 =H,LB=L,UB=L)。读:WE =H,OE =L/写:we = L,OE = X;
上电之后,先对SRAM 进行初始化,然后再写入读出。
sram上半屏的数据地址:0- 5183(288*18),下半屏地址:5184 - 10367
** Operate on :M5C06N3L114C7
** Copyright :All rights reserved.
** Version :V1.0
**---------------------------Modify the file information----------------
** Modified by :
** Modified data :
** Modify Content:
*******************************************************************************/ module ZF_SRAM(
clk_90m,
rst_n, wr_reg, //写数据使能
rd_reg, //读数据使能 addr_wr_reg, //写数据地址
addr_rd_reg, //读数据地址
data_wr_reg, //写操作数据寄存器
data_rd_reg, //读出的数据寄存器 cs_sram,
wr_sram, //we
rd_sram, //oe
addr_sram,
data_sram_wr, //写入的数据
data_sram_rd, //读入的数据
dir_data, //数据方向控制
wr_over,
rd_over, test_1,
test_2 ); parameter width = ; input clk_90m;
input rst_n; input wr_reg; //写使能
input rd_reg; //读使能 input [width -:] addr_wr_reg; //地址寄存器
input [width -:] addr_rd_reg; //地址寄存器
input [width -:] data_wr_reg; //待写数据寄存器
output [width -:] data_rd_reg; //读出的数据寄存器
reg [width -:] data_rd_reg_1; //读出的数据寄存器 output reg wr_sram; //we
output reg rd_sram; //oe
output reg cs_sram; output reg [width-:] addr_sram; //写出的信号
output reg [width-:] data_sram_wr; //写出的数据
input [width-:] data_sram_rd; //读入的数据
output reg dir_data; //数据方向的控制
output reg wr_over;
output reg rd_over;
reg [width-:] data_zifu;
output test_1;
output test_2; //***************读写状态机**********************//
parameter idel_0 = 'd0; //初始化显示界面
parameter idel_1 = 'd1; //初始化显示界面2
parameter idel_2 = 'd2; //初始化显示界面
parameter idel_3 = 'd3; //初始化显示界面2
parameter idel_4 = 'd4; //初始化显示界面
parameter idel_5 = 'd5; //初始化显示界面 parameter idel = 'd6;
parameter wr_1 = 'd7; //拉低cs
parameter wr_2 = 'd8; //拉低wr
parameter wr_3 = 'd9; //保持
parameter wr_4 = 'd10; //拉高cs,wr
parameter wr_5 = 'd11; //拉高结束
parameter wr_6 = 'd12; //拉低结束
parameter wr_7 = 'd13; //拉低结束
/* 留几个状态间隔 */ parameter rd_1 = 'd17; //拉低cs
parameter rd_2 = 'd18; //拉低rd
parameter rd_3 = 'd19; //保持
parameter rd_4 = 'd20; //拉高cs,rd
parameter rd_5 = 'd21; //拉高结束
parameter rd_6 = 'd22; //拉低结束
parameter rd_7 = 'd23; //拉低结束 reg [:] state;
reg [:] i;
always @(posedge clk_90m or negedge rst_n)
begin
if(!rst_n)
begin
state <= idel_0;
data_zifu <= ;
wr_sram <= ;
rd_sram <= ;
cs_sram <= ;
addr_sram<= ;
data_sram_wr<= ;
dir_data <= ;
wr_over <= ;
rd_over <= ;
i <= ;
end
else
begin
case(state)
idel_0:
begin
wr_sram <= ;
rd_sram <= ;
cs_sram <= ; addr_sram <= ;
dir_data <= ;
state <= idel_1;
end
idel_1:
begin
if(i > )
begin
i <= ;
state <= idel;
end
else
begin
addr_sram <= i;
data_sram_wr <= 'h0000;
state <= idel_2;
end
end
idel_2:
begin
cs_sram <= ;
state <= idel_3;
end
idel_3:
begin
state <= idel_4;
wr_sram <= ;
end
idel_4:
begin
state <= idel_5;
wr_sram <= ;
end
idel_5 :
begin
wr_sram <= ;
cs_sram <= ;
i <= i + ;
state <= idel_1;
end
//----------------------------//
/* 初始化完毕 */
idel:
begin
wr_sram <= ;
rd_sram <= ;
cs_sram <= ; addr_sram <= ;
dir_data <= ;
wr_over <= ;
rd_over <= ;
if(wr_reg) //写使能有效
begin
dir_data <= ; //写方向
addr_sram <= addr_wr_reg; //寄存地址
data_sram_wr <= data_wr_reg; //寄存写入的数据
state <= wr_1;
end
else if(rd_reg)
begin
dir_data <= ; //读方向
addr_sram <= addr_rd_reg; //寄存地址
state <= rd_1;
end
else
state <= idel;
end
wr_1:
begin
state <= wr_2;
cs_sram <= ;
end
wr_2:
begin
state <= wr_3;
wr_sram <= ;
end
wr_3:
begin
state <= wr_4;
wr_sram <= ;
end
wr_4:
begin
state <= wr_5;
cs_sram <= ;
wr_sram <= ;
end
wr_5:
begin
wr_over <= ;
state <= wr_6;
end
wr_6:
begin
wr_over <= ;
state <= idel;
end //-------------------//
rd_1:
begin
state <= rd_2;
cs_sram <= ;
end
rd_2:
begin
state <= rd_3;
rd_sram <= ;
end
rd_3:
begin
state <= rd_4;
rd_sram <= ;
end
rd_4:
begin
data_zifu <= data_sram_rd; //读取数据
state <= rd_5;
rd_sram <= ;
cs_sram <= ;
end
rd_5:
begin
rd_over <= ;
state <= rd_7;
end
rd_6:
begin
rd_over <= ;
state <= idel;
end
default:state <= idel;
endcase
end
end always @(posedge clk_90m or negedge rst_n)
begin
if(!rst_n)
begin
data_rd_reg_1 <= ;
end
else if(rd_over)
begin
data_rd_reg_1 <= data_zifu;
end
else
data_rd_reg_1 <= data_rd_reg_1;
end assign data_rd_reg = data_rd_reg_1;
//----------------------------
assign test_1 = wr_reg;
assign test_2 = data_sram_wr[]; endmodule
仿真后复合读写时序。
为了检测sram是否读写成功,则可以让FPGA来来写数据,用单片机来读取数据,然后在线验证是否读取的数据是否正确:
程序打包上传,链接地址为:http://i.cnblogs.com/Files.aspx
SRAM的读写操作的更多相关文章
- 如何减小SRAM读写操作时的串扰
静态存储器SRAM是一款不需要刷新电路即能保存它内部存储数据的存储器.在SRAM 存储阵列的设计中,经常会出现串扰问题发生.那么要如何减小如何减小SRAM读写操作时的串扰,以及提高SRAM的可靠性呢, ...
- 10.异步SRAM的FPGA读写操作
异步SRAM:正如其名,不是与特定的时钟信号同步运行,而是根据输入信号的状态运行的.因为没有信号表明读取时已确定了有效数据,也没有信号表明写入时已接收到数据,所以,需要获取制造商的数据手册,根据时序图 ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...
- [转]Android - 文件读写操作 总结
转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...
- App.Config详解及读写操作
App.Config详解及读写操作 App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而 ...
- 使用Python对Excel表格进行简单的读写操作(xlrd/xlwt)
算是一个小技巧吧,只是进行一些简单的读写操作.让人不爽的是xlrd和xlwt是相对独立的,两个模块的对象不能通用,读写无法连贯操作,只能单独读.单独写,尚不知道如何解决. #①xlrd(读) #cod ...
- io流对文件读写操作
public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedRead ...
- PHP文件读写操作之文件写入代码
在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...
- INI 文件的读写操作
在C#中对INI文件进行读写操作,在此要引入using System.Runtime.InteropServices; 命名空间,具体方法如下: #region 变量 private static r ...
随机推荐
- HD1580(尼姆博弈入门)
启蒙博客:http://www.cnblogs.com/jiangjun/archive/2012/11/01/2749937.html 尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流 ...
- zoj3819Average Score
Average Score Time Limit: 2 Seconds Memory Limit: 65536 KB Bob is a freshman in Marjar Universi ...
- AngularJS 的数据绑定
单向绑定(ng-bind) 和 双向绑定(ng-model) 的区别 ng-bind 单向数据绑定($scope -> view),用于数据显示,简写形式是 {{}}. 1 <span n ...
- c++新特性与boost
<Boost程序库探秘——深度解析C++准标准库>之试读 前一阵子还看到一篇文章,说C#要重蹈C++的覆辙,这里说的C++的覆辙是什么呢?是指C++语言过于臃肿的功能特性,导致学习人员的流 ...
- 新浪微博客户端(11)-自定义checkBox
在最后一个欢迎界面上添加一个CheckBox. // 2.添加4个UIImageView ; i < NEW_FEATURE_NUMS; i++) { UIImageView *imageVie ...
- 初步揭秘node.js中的事件
当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...
- WP_Image_Editor_Imagick 漏洞临时解决方法
导读 阿里云推送的一条短信通知:存放在上面的WordPress程序有WP_Image_Editor_Imagick漏洞问题,需要登入后台补丁等等的暗示.当然,如果需要在线补丁则需要升级阿里云的安骑士专 ...
- 如何修改git的当前登录信息
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 之前用的大师的git登录名,后来开通了自己的,需要换成自己的,其实修改方式很简单. $vim .gi ...
- Stanford机器学习---第九讲. 聚类
原文:http://blog.csdn.net/abcjennifer/article/details/7914952 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- HDU 1710 二叉树的遍历 Binary Tree Traversals
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...