自己写的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的读写操作的更多相关文章

  1. 如何减小SRAM读写操作时的串扰

    静态存储器SRAM是一款不需要刷新电路即能保存它内部存储数据的存储器.在SRAM 存储阵列的设计中,经常会出现串扰问题发生.那么要如何减小如何减小SRAM读写操作时的串扰,以及提高SRAM的可靠性呢, ...

  2. 10.异步SRAM的FPGA读写操作

    异步SRAM:正如其名,不是与特定的时钟信号同步运行,而是根据输入信号的状态运行的.因为没有信号表明读取时已确定了有效数据,也没有信号表明写入时已接收到数据,所以,需要获取制造商的数据手册,根据时序图 ...

  3. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  4. [转]Android - 文件读写操作 总结

     转自:http://blog.csdn.net/ztp800201/article/details/7322110 Android - 文件读写操作 总结 分类: Android2012-03-05 ...

  5. App.Config详解及读写操作

    App.Config详解及读写操作   App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而 ...

  6. 使用Python对Excel表格进行简单的读写操作(xlrd/xlwt)

    算是一个小技巧吧,只是进行一些简单的读写操作.让人不爽的是xlrd和xlwt是相对独立的,两个模块的对象不能通用,读写无法连贯操作,只能单独读.单独写,尚不知道如何解决. #①xlrd(读) #cod ...

  7. io流对文件读写操作

    public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedRead ...

  8. PHP文件读写操作之文件写入代码

    在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发 ...

  9. INI 文件的读写操作

    在C#中对INI文件进行读写操作,在此要引入using System.Runtime.InteropServices; 命名空间,具体方法如下: #region 变量 private static r ...

随机推荐

  1. php编程常用经验

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数&quo ...

  2. (翻译)初学者的object-C指南

    初学者的object-C指南 英文原文:http://blog.teamtreehouse.com/the-beginners-guide-to-objective-c-language-and-va ...

  3. awk命令--update20150120

    简介 awk是一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符分割成field,切开的部分再进行各种分析处理. 模式和动作: 任何awk语句都是由模式和动作组成,模式部分决定动作语句何时触发 ...

  4. Linux SSH安全策略限制IP登录方法(转)

    本文介绍了Linux SSH安全策略限制IP登录的两种方法.具体如下: 方法一: 首先需要限制登录的ip(或者如果需要自己本地登录,查看最后登录ip即可) Vim /etc/hosts.allow 输 ...

  5. Linux常用命令 查看进程信息时 copy的-----温故而知新

    1.查进程    ps命令查找与进程相关的PID号:    ps a 显示现行终端机下的所有程序,包括其他用户的程序.    ps -A 显示所有程序.    ps c 列出程序时,显示每个程序真正的 ...

  6. ASP.NTE 5 Target framework dnx451 and dnxcore50(转)原文:http://www.cnblogs.com/xishuai/p/aspnet5-target-framework-dnx451-and-dnxcore50.html

    中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NTE 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...

  7. MapReduce使用JobControl管理实例

    import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; impo ...

  8. WiFi入口流量O2O微应用平台

    WiFi入口流量O2O微应用平台 随着智能手机一年比一年销量大好,传统的互联网的流量争夺战场已经转向了移动互联网,各大巨头纷纷出招,智能wifi路由器就是其中最重要的一块战略高地.所谓的智能路由器,解 ...

  9. Ubuntu 下 LAMP 的配置文件路径 转:

      配置文件路径: 1>apache 的配置文件路径 /etc/apache2/apache2.conf 2>apache 网站字符编码配置路径 /etc/apache2/conf.d/c ...

  10. Vmware怎样使用nat和桥接方式解决虚拟机联网问题

    对于很多的linux初学者来说,最开始学习linux时通常是在虚拟机上进行的,然而对于新手来说虚拟机联网会对他们来说是比较困难的.这里我根据自己的经验写了一篇文档分享给大家.下面对几种连接方式进行简单 ...