net22 FPGA flash
SPI时序支持两种模式
两个标志位 CPOL CPHA
CPOL 0 CPHA 0 (都为0的状态) 时钟来临之前是0 最后是0
CPOL 1 CPHA 1 (都为1的状态) 上升沿来临之前是高电平,然后变为低电平。最后一个时钟结束的时候为高。
CS_N(S):为片选线,为fpga的输出信号,flash的输入信号,低电平有效
SCK(c):时钟线,为FPGA的输出信号,Flash的输入信号,flash根据该信号的上升沿锁存sdi发来的数据,根据该信号 的下降沿通过sdo输出数据
Sdi(D):数据线,为FPGA的输出信号,flash的输入信号,fpga可通过sdi的总线串行的传输数据到flash
Sdo(Q):数据线,为FPGA的输出信号,flash的输入信号,FLASH 可通过 SDO 的总线串行的传输数据到 FPGA
falsh数据线有 1 根的 也有 2 根 的 输入 输出 一起使用的
把数据写入flash需要先把要写入的区域进行擦除,且擦除的标准是固定的,不能想擦除多大就擦除多大。
当写入数据到flash的时候,只能把flash里边的存储单元里边的1改变成0。也就是说写数据的时候只能把1改成0。所以需要在写入之前需要通过(SE)擦除的指令把flash的存储单元都变成1的状态 。
M25P16的flash芯片 最大时钟频率50Mhz 此处我们进行擦除时用12.5Mhz
32个扇区 每个扇区256页,每页256个字节 256X256=65536字节/1024=64K
最小的一次能写入的数据量是1页(页写功能),一页包含256个字节(byte。所以最低的是8位地址线。11111_1111=256
再大一个级别是扇区,每个扇区包含256页(page),【相当于比页还大的区域】
不同的falsh存储空间不同,包含扇区不同,扇区地址不同。
需要23位地址线加上扩展的1bit地址线一共24bit地址线 24...16 扇区地址 15...8 页地址 7...0 字节地址
falsh的擦除分为扇区擦除,全擦除。
扇区擦除:只擦除扇区。
全擦除:擦除整片flash。
在擦除之前会执行一个写使能指令(WREN),就是让我们去配置里边的寄存器,使得这里边能被写,能被操作。需要单独去发送,发送之后才能执行扇区擦除。当扇区擦除执行完之后,写使能寄存器会自动复位,又进入到非写使能状态。所以在每次进行SE指令前都要执行写使能指令。
flash根据sck的上升沿锁存sdi的数据,因此sdi的每一位最好都能被sck的上升沿采集到的稳定的时刻(sdi 的中间位置对着sck的上升沿时最稳定)。
写使能指令:先把cs_n置为低,在确定sdi数据被锁存(8'h06)结束后,就可以将cs_n拉高。
写使能指令 8'h06 (flash芯片手册上查) WREN结束后,为了保证WREN被FLASH存储,因此cs_n拉高的时间至少需要100ns
之后再次拉低cs_n为发送SE指令做准备。首先拉低cs_n,然后发送SE指令D8h,以及3个byte的地址位。由于是扇区擦除,给出的地址位只有高8位有效(扇区地址),低16位(页地址,字节地址)无论何值 都对该扇区的擦除没有影响。在给出最后一位byte地址位后,确保被选中的扇区可以被擦除,cs_n至少3秒高电平状态。
flash有状态寄存器可以读取现在擦除的状态,但是这样我们写的代码量会比较大。所以一般使用延时计数来去判断是否擦除完毕。
在给出最后1byte地址位后,确保被选中的扇区可以被擦除,cs_n需要至少3秒高电平的状态 等一会
写的时候 计数 0~8 9位 让cs做扩展 bit计数时让cs再晚一个bit 9个bit 确保不会因时钟掩盖之类的(0 0状态下sdi最后为0 没有这个写不进去)
可以把sdi赋值给移位寄存器,通过移位寄存器的方式把sdi时序生成出来。
ise: creat prom file界面,ise impact 固化程序,要的是mcs文件
固化mcs文件,直接就烧到flash上?不用写么?
页写功能(page program【简称PP】)
和擦除一样,执行页写功能之前需要执行写使能(WRITE EN)操作,执行完PP后写使能自动复位,每次执行页写之前都得先执行写使能操作。
页写 就要对页地址位进行操作,先是24位的页地址,后面是1~256字节的8位数据。
需要发送共 256X8+32=2080 bit数据。PP指令1字节,地址3字节,数据256字节,cs_n为低的冗余周期,共260*8+1个bit周期。0~2079。
执行页写的数据是在执行页写PP指令之前就需要把256字节的一页数据缓存到ram或者fifo缓冲器中,当pp_flag到来就可以从缓冲器中读取有个字节数据发送一个字节,知道1个页数据发送完毕。
位数太多,读取每个数据都要 rd_fifo_en就很麻烦,要找规律,因为是8bit数据 为1000,所以每次加 8 的话低 3 位数据不改变,所以以此为规律,当第三位为特定值的时候拉高 rd_fifo_en。
仿真 task gendata; taskend
读控制器
READ DATA BYTE 读数据指令 简称RDB指令,指令码为8'h03,读指令可以读取flash地址空间的任何一个byte数据,不受扇区,页的限制。
读数据时只需要给出读命令即可,不需要像SE,PP先给出写使能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)