FPGA学习系列:内存128M的flash芯片设计.doc

上传人:白大夫 文档编号:3251740 上传时间:2019-08-06 格式:DOC 页数:11 大小:48.50KB
返回 下载 相关 举报
FPGA学习系列:内存128M的flash芯片设计.doc_第1页
第1页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《FPGA学习系列:内存128M的flash芯片设计.doc》由会员分享,可在线阅读,更多相关《FPGA学习系列:内存128M的flash芯片设计.doc(11页珍藏版)》请在三一文库上搜索。

1、FPGA学习系列:内存128M的flash芯片设计设计背景:FLASH闪存闪存的英文名称是Flash Memory,一般简称为Flash,它属于内存器件的一种,是一种不挥发性( Non-Volatile )内存。闪存的物理特性与常见的内存有根本性的差异:目前各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存;闪存在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。设计原理:我们的设计用的是W25Q128FV 内存128M的fl

2、ash芯片,大家可以自行在网上下载器件手册具体看所应用的具体命令和自己项目具体的应用和想发来设计。这款flash芯片的的存储是一个扇区4KB,一个扇区可以存256个字,一个字是8位,一个块是64KB,一共有256个块组成一个存储flash内存。我在下面的讲解中,将主要讲实现一下字节的读写,我用的协议是SPI协议,这个芯片支持QSPI,双端口SPI等。flash有三个状态寄存器,每一个状态寄存器的每一位都有各自的功能。大家可以具体的看器件手册,我给大家简单的讲一下第一个状态寄存器。这个状态寄存器第一位是可读忙和不忙的标志位,大家可以在我们的设计中判断芯片是否忙和不忙来是否进行下一步的操作。第二位

3、是一个写标志的信号,当写使能打开的时候它位1,只有它为1的时候我们才可以进行写,值得一说的不管是页操作,还是擦除等命令后都会使这个标志位变成0。然后前面的命令算的上的是保护命令,具体有使用的逻辑功能。在flash中我们写数据前先要擦除数据你想擦除的地方,然后进行写,如果没有用过的flash芯片的话那么可以不用擦除。毕竟我们的flash可是掉电不丢失数据的。我的设计思路是这样的我们先读出我们的器件厂商,和芯片ID,然后记性写命令,写使能打开,页操作写入数据(值得说明的是我们FLASH是新的所以没进行擦除命令,建议擦除-关闭写使能 - 打开写使能),然后读第一个寄存器判断芯片的第一位是否忙,不忙然

4、后进行读操作之后再数码管上显示出我们写入的数据。部分操作命令如下我们的发送格式为在时钟的上升沿写入命令,在时钟的下降沿读出命令,我们用的是标准的SPI协议,端口IO0,和IO1,都是单向的。写使能时序:读使能时序:之后别的时序我们将不展示,大家可以参考器件手册。设计架构图:我们的设计是用一个FSM控制器来控制发送什么命令,flash模块判断FSM发送过来的state信号来选择应该执行什么操作,当命令写入或者读出后,会发送一个flag_done命令,这个命令让我们判断上个指令是否完成,如果完成后FAM将发送下一个命令。设计代码:设计模块0modulefsm(clk,rst_n,flag_done

5、,command,addr,state,data);12 inputclk,rst_n;3 inputflag_done;/输入标志位4 outputreg7:0command;/输出命令5 outputreg23:0addr;/输出地址6 outputreg2:0state; /输出状态模式7 outputreg7:0data;/输出写入数据89 reg2:0state_s;10 reg20:0count;11 always(posedgeclk)12 if(!rst_n)13 begin14 state_s 15 data 16 addr 17 command 18 state 19 co

6、unt 20 end21 else22 case(state_s)23 0 : begin24 if(count 25 count 26 else27 begin/发送读厂商ID的命令28 command 29 addr 30 state 31 count 32 end33 if(flag_done)/检查是否完成34 state_s 35 end36 37 1 : begin38 if(count 39 count 40 else41 begin/写使能42 command 43 state 44 count 45 end46 if(flag_done)/检查是否完成47 state_s 4

7、8 end49 50 2 : begin51 if(count 52 count 53 else54 begin/页操作55 command 56 addr 57 state 58 data 59 count 60 end61 if(flag_done)/检查是否完成62 state_s 63 end64 65 3 : begin66 if(count 67 count 68 else69 begin/读寄存器70 command 71 count 72 state 73 end74 if(flag_done)/检查是否完成75 state_s 76 end77 78 4 : begin79

8、if(count 80 count 81 else82 begin/读数据83 command 84 addr 85 state 86 count 87 end88 end89 90 default:state_s 91 endcase9293endmodule0moduleflash (clk ,rst_n,q0,q1,sclk,cs,command,addr,state, data,show_data,flag_done);12 inputclk,rst_n; 3 inputq0;4 outputregq1;5 outputregsclk;6 outputregcs;7 input7:0c

9、ommand; /输入命令8 input23:0addr; /地址9 input2:0state; /状态10 input7:0data; /数据11 outputreg23:0show_data; /显示12 outputregflag_done; /命令完成标志1314 reg5:0count;15 reg5:0cnt;16 reg31:0temp;17 reg15:0d;18 reg5:0count_s;19 reg7:0dou;20 reg39:0xie;21 reg7:0r_reg;2223 always(posedgeclk)24 if(!rst_n)25 begin26 sclk

10、 27 count_s 28 end29 elseif(cs)30 begin31 count_s 32 sclk 33 end34 else35 begin36 if(count_s =25-1) /产生1M的时钟37 begin38 count_s 39 sclk 40 end41 else42 count_s 43 end4445 reg1:0signle_s;4647 /边沿检测电路48 always(posedgeclk ornegedgerst_n)49 if(!rst_n)50 begin51 signle_s 52 end53 else54 begin55 signle_s05

11、6 signle_s157 end5859 assignpose_dge =signle_s0/上升沿脉冲60 assignnege_dge =signle_s0/下降沿脉冲61 62 reg1:0s;63 reg1:0s1,s2,s3,s4;64 always(posedgeclk ornegedgerst_n)65 if(!rst_n)66 begin67 q1 68 count 69 cs 70 temp 71 d 72 cnt 73 s 74 s1 75 s2 76 s3 77 flag_done 78 s4 79 end80 else81 begin82 if(state =1)/s

12、tate = 1进入读芯片的厂商和ID83 case(s)84 0:begincs 85 86 1 :begin87 if(nege_dge) /下降沿发送数据88 begin89 if(count 90 begin91 q1 92 count 93 temp 94 end95 else96 begin97 count 98 s 99 end100 end101 else102 q1 103 end104 105 2 : begin106 if(pose_dge) /上升沿采集数据107 begin108 if(count 109 begin110 count 111 d 112 end113

13、 else114 begin115 s 116 cs 117 count 118 flag_done 119 show_data 120 end121 end122 else123 begin124 s 125 end126 end127 128 3 : begin129 flag_done 130 end131 132 endcase133 134 elseif(state =2) /state = 2进入读模式135 case(s1)136 0:begincs 137138 1 :begin139 if(nege_dge)140 begin141 if(count 142 begin143

14、 q1 144 count 145 temp 146 end147 else148 begin149 count 150 s1 151 end152 end153 else154 q1 155 end156 157 2 : begin158 if(pose_dge)159 begin160 if(count 161 begin162 count 163 dou 164 s1 165 end166 else167 begin168 s1 169 cs 170 count 171 flag_done 172 show_data 173 end174 end175 else176 begin177

15、s1 178 end179 end180 181 3 : begin182 flag_done 183 end184 endcase185186 elseif(state =3) /state = 3 进入写使能模式187 case(s2)188 0:begincs 189190 1 :begin191 if(nege_dge)192 begin193 if(count 194 begin195 q1 196 count 197 temp 198 end199 else200 begin201 count 202 s2 203 cs 204 flag_done 205 end206 end20

16、7 else208 q1 209 end210211 2 :flag_done 212 endcase213214 elseif(state =4) /state = 4 进入页写操作215 case(s3)216 0:begincs 217218 1 :begin219 if(nege_dge)220 begin221 if(count 222 begin223 q1 224 count 225 xie 226 end227 else228 begin229 count 230 s3 231 cs 232 flag_done 233 end234 end235 else236 q1 237

17、end238239 2 :flag_done 240241 endcase242243 elseif(state =5) /state = 5 进入读第一个状态寄存器 操作244 case(s4)245 0:begincs 246247 1 :begin248 if(nege_dge)249 begin250 if(count 251 begin252 q1 253 count 254 r_reg 255 end256 else257 begin258 count 259 s4 260 end261 end262 else263 q1 264 end265266 2 : begin267 if

18、(pose_dge)268 begin269 if(count 270 begin271 count 272 d 273 end274 else275 begin276 cs 277 count 278 if(!d8)/判断BUSY位忙不忙, 不忙进入下个状态279 begin280 flag_done 281 s4 282 end283 else/忙继续读第一个寄存器284 s4 285 end286 end287 else288 begin289 s4 290 end291 end292293 3 :flag_done 294295 endcase296297 end298299endmoduleSignalTap 采集图图中显示的和我们的设计一样,发送的各个命令也是一样的,我们写入的是AA然后下班接收的也是AA。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1