原创 【博客大赛】基于FPGA的串行flash的读写控制(三)-串行flash操作的状态机实现

2015-9-7 21:28 11198 23 82 分类: FPGA/CPLD

    上两篇都是对串行flash的介绍,我们的主角FPGA还没有登场。大家如果看了前两篇关于串行flash的介绍,这么多的命令,这么多的操作,需要有一根主线把他们串起来,这根主线应该就是FPGA中的状态机。

 

    本设计采用的SO管脚作为忙状态信号的方式,整个操作分为2组状态机,第一组位于底层,主要控制flash各命令时序的产生;第二组位于第一组的上层,控制flash各个操作对应的命令流。

 

    首先介绍控制flash各命令时序产生的状态机,该状态机包括所有命令的所有状态,如表1所示。

表1

符号

名称

功能

IDLE

空闲

无任何操作进行的状态

CMD

命令传输

向flash发送8bits命令的状态,不同的命令发送不同的命令字

ADDR_H

高位地址

向flash发送8bits高位地址的状态

ADDR_M

中间地址

向flash发送8bits中间地址的状态

ADDR_L

低位地址

向flash发送8bits低位地址的状态

DUMMY

地址填充位

向flash发送8bits地址填充位的状态

REG_DATA

读状态寄存器数据

从flash读取状态寄存器数据的状态

ID_DATA

读芯片ID数据

从flash读取芯片ID的状态

RX_DATA

接收数据

从flash存储单元读取数据的状态

TX_DATA

发送数据

向flash存储单元写入数据的状态

AAI_TX_

DATA_H

AAI word编程高位字节数据

在AAI word编程模式下,向flash存储单元写入高8位数据的状态

AAI_TX_

DATA_L

AAI word编程低位字节数据

在AAI word编程模式下,向flash存储单元写入低8位数据的状态

AAI_TEMP

AAI word数据传输间隔

在AAI word编程模式下,数据传输的间隔,在此间隔状态下,需判断SO管脚电平,SO为0表示忙,1表示空闲,在空闲状态下可进行下一次双字节数据的写入。

AAI_TX_

CMD

AAI word数据传输过程中的命令字

在AAI word编程模式下,在进行下一个双字节数据的传输前,需要传输8bits的AAI word编程命令。

DONE

传输完成

传输完成

    对应于flash操作的各个命令(参见第二篇),其状态机过程如表2所示。

表2

命令

命令字

状态机跳转过程

读操作(25Mhz)

8'h03

IDLE - CMD - ADDRH/M/L - RX_DATA - DONE

高速读操作(50MHz)

8'h0b

IDLE - CMD - ADDRH/M/L - DUMMY - RX_DATA - DONE

扇区擦除

8'h20

IDLE - CMD - ADDRH/M/L - DONE

32K字节块擦除

8'h52

IDLE - CMD - ADDRH/M/L - DONE

64K字节块擦除

8'hb8

IDLE - CMD - ADDRH/M/L - DONE

芯片擦除

8'h60 或8'hc7

IDLE - CMD - DONE

Byte编程

8'h02

IDLE - CMD - ADDRH/M/L - TX_DATA - DONE

AA word编程

8'had

IDLE - CMD - ADDRH/M/L - AAI_TX_DATA_H - AAI_TX_DATA_L - AAI WAIT - AAI_TEMP - CMD - AAI_TX_DATA_H - AAI_TX_DATA_L - AAI WAIT - AAI_TEMP - CMD - AAI_TX_DATA_H - AAI_TX_DATA_L - AAI WAIT - AAI_TEMP - DONE

读状态寄存器

8'h05

IDLE - CMD - REG_DATA - DONE

使能写状态寄存器

8'h50

IDLE - CMD - DONE

写状态寄存器

8'h01

IDLE - CMD - TX_DATA - DONE

写使能

8'h06

IDLE - CMD - DONE

写去使能

8'h04

IDLE - CMD - DONE

读ID

8'h90 或8'hab

IDLE - CMD - ADDRH/M/L - ID_DATA - DONE

JEDEC读ID

8'h9f

IDLE - CMD - RX_DATA - DONE

使能SO作为忙状态信号

8'h70

IDLE - CMD - DONE

去使能SO作为忙状态信号

8'h80

IDLE - CMD - DONE

 

下面介绍控制flash读写操作对应命令流的状态机,该命令流默认前一次命令操作完成,总线空闲。flash命令集请参见第一篇的表3。

执行一次写操作(包括Byte编程和AAI word编程模式)需执行的命令流为:

WREN:写使能;

EWSR:使能写状态寄存器;

WRSR:写状态寄存器,将BPL位置为0;

WREN:写使能;

Sector/Block/Chip erase:擦除操作,在写入前必须对相应的存储区域进行擦除;

WREN:写使能;

EBSY:使能SO作为忙状态信号;

Byte/AAI word program:Byte编程和AAI word编程模式;

DBSY:去使能SO作为忙状态信号;

WRDI:写去使能。

 

执行一次读操作(包括25MHz和50MHz的读模式)可直接发送相应的读命令和读地址,无需配合其他命令。

 

以上是FPGA控制串行flash的主线,欢迎各位高手大牛指正。如果您想了解设计的细节部分,欢迎留言,我会尽力作答。

 

另外我手头上有串行flash和SRAM数据通讯的源代码,哦,你想要啊?你想要啊?你想要说清除就行了嘛。你想要的话我会给你的,你想要我当然不会不给你的,不可能你说要我不给你,你说不要我却偏要给你,大家讲道理嘛。现在我数三下,你要说清楚你到底要不要。要的话就留言吧,对了还要留下你的邮箱。

 

另外的另外,请允许我抒发一下感情。这段代码是我在没有任何借鉴的情况下死磕出来的,唯一的参考就是FLASH芯片和SRAM芯片的datasheet。期间遇到了许多问题,也是凭着一股死磕的劲把一个一个问题搞定了,我可以保证这段代码是经过仿真和板级验证过的。技术就是通过不断的分享和交流才能进步,希望这段代码能对您的工作学习有帮助,也欢迎各位大牛能提出改进建议!如果您能为我的博文投上一票,将是对我的劳动成果的鼓励,也是对死磕、分享和交流精神的鼓励,谢谢!

PARTNER CONTENT

文章评论59条评论)

登录后参与讨论

用户377235 2016-6-14 11:30

初学者,正是要找好资料。希望得到源程序。1103129252@qq.com 谢谢!

用户448088 2016-1-5 22:52

396783203@qq.com。 谢谢

用户406627 2016-1-4 10:57

楼主,也请将串行flash和SRAM数据通讯的源代码发给我,linwenwww376@163.com,谢谢!

用户406627 2016-1-4 10:54

谢谢分享,写的挺好。求楼主的代码 linwenwww376@163.com,谢谢!

用户377235 2015-11-13 12:34

Text

用户894053 2015-10-11 21:28

谢谢分享,支持。1284714582@qq.com

用户1851029 2015-10-8 11:40

楼主辛苦了,谢谢楼主的分享, 求代码2521204756@qq.com

用户1756156 2015-10-5 14:39

楼主辛苦了,求发一下代码,1206901571@qq.com

用户1845900 2015-9-30 16:29

是挺老的哦,不过开发的原理、编程的思想永不过时哦!

用户1856179 2015-9-30 09:12

谢谢楼主的分享, 求代码934818998qq.com
相关推荐阅读
用户1845900 2016-05-20 13:28
【来点不一样的】Microsemi(原Actel)最新FPGA和开发板介绍
最近接触到了一款Microsemi(原Actel)的代理商艾懋电子开发的SmartFusion2 Starter Kit开发板,逐渐了解了Microsemi(原Actel)FPGA的一些情况。 ...
用户1845900 2015-11-25 11:24
【博客大赛】FPGA实现实时视频加权均值滤波
本文设计的是一种加权均值滤波算法,窗口大小是5(列)*1(行),适用于灰度图像实时视频处理,可以有效淡化视频竖条纹。同时为了保持图像的细节,采用如下图所示的加权窗口。 同时考虑到一场视频...
用户1845900 2015-09-07 21:33
【博客大赛】基于FPGA的串行flash的读写控制(一)----串行flash的管脚、寄存器和操作命令
1、串行flash简介     串行flash是用串行接口进行连续数据存取的小尺寸,低功耗的flash memory。串行flash比并行flash用更少的线从系统中传送数据。对于引脚数目少的...
用户1845900 2015-09-07 21:30
【博客大赛】基于FPGA的串行flash的读写控制(二)-串行flash操作时序
1、 读操作(25Mhz)     该操作支持最高时钟速率为25Mhz的读操作。执行该操作时,芯片内部地址指针自动递增,连续输出从起始地址单元开始的数据,直到遇到CE#信号的上升沿。如果到达最...
用户1845900 2015-09-01 15:28
Vivado IP core管理-FPGA器件型号变更时的 IP core管理
在FPGA工程开发和维护的过程中,有可能需要在原有的代码上进行增量开发,但是发现原来选用的FPGA器件资源不够,需要更换器件。对于你自己一行行写的代码都好办,但是工程里调用的IP core与FPG...
EE直播间
更多
我要评论
59
23
关闭 站长推荐上一条 /3 下一条