七、基于FPGA的Flash控制器设计
根据项目需求,设计一个Flash控制器。以便将完成低速数据的存储。Flash选用了S25FL032。使用单线SPI接口,接线如图:
1,Flash S25fl032介绍
1.1 IO描述
1.2 相关命令介绍
1.3主要命令时序介绍
1.3.1 READ命令时序(读数据命令,最大支持40MHZ)
1.3.2 FAST_READ 命令时序(读数据命令,最大支持104MHZ)
1.3.3 READ_ID命令时序(读ID)
1.3.4 WREN,WRDI命令时序(写使能或写不使能)
1.3.5 PP命令(写时序)
1.3.6 SE命令时序(擦除)
2,控制器设计
该Flash支持4线和2线,1线读写;在设计中要求速率不高,因此,使用最简单的单线完成。
2.1 端口设计
spi_flash_control #(parameter [31:0] SYSCLK = 32'd100_000_000,parameter [31:0] SPICLK = 32'd10_000_000
)(input sys_clk,input sys_rst,input cmd_start,input [31:0] cmd_addr,input [31:0] wr_data, //write 4 byteoutput [31:0] rd_data, //read 4 byteoutput reg cmd_done,output flash_cs_n,output flash_sclk,input flash_sdi,output flash_sdo
);
端口介绍:
cmd_start:发起命令,启动控制器;
cmd_addr:命令与地址;高8bit为命令,低24bit为地址;如果命令与地址无关,则低位为0;
wr_data:写数据;一次写4字节;
rd_data:读数据,一次读4自己;
cmd_done:命令完成,控制器完成一次操作。
2.2 命令解析
此处实现根据不同命令,控制实现读写选择,写寄存器装配;写时序bit长度计算。
//flash cmd always @(posedge sys_clk) beginif(sys_rst) begin start_data_reg <= 0;spi_bit_len <= 0;wr_start <= 0;rd_start <= 0;end else if(cmd_start && cmd_addr[31:24] == 8'h03) begin start_data_reg <= {cmd_addr,32'd0};spi_bit_len <= 8 + 24 + 32;wr_start <= 0;rd_start <= 1;end else if(cmd_start && cmd_addr[31:24] == 8'h0b) begin start_data_reg <= {cmd_addr,32'd0};spi_bit_len <= 8 + 24 + 8 + 32;wr_start <= 0;rd_start <= 1;end else if(cmd_start && cmd_addr[31:24] == 8'h90) begin start_data_reg <= {cmd_addr,32'd0};spi_bit_len <= 8 + 24 + 8 + 8;wr_start <= 0;rd_start <= 1;end else if(cmd_start && cmd_addr[31:24] == 8'h05) begin start_data_reg <= {cmd_addr,32'd0};spi_bit_len <= 8 + 8;wr_start <= 0;rd_start <= 1;end else if(cmd_start && cmd_addr[31:24] == 8'h06) begin start_data_reg <= {cmd_addr,32'd0};spi_bit_len <= 8;wr_start <= 1;rd_start <= 0;end else if(cmd_start && cmd_addr[31:24] == 8'h02) begin start_data_reg <= {cmd_addr,wr_data};spi_bit_len <= 8 + 24 + 32;wr_start <= 1;rd_start <= 0;end else if(cmd_start && cmd_addr[31:24] == 8'h08) begin start_data_reg <= {cmd_addr,32'd0};spi_bit_len <= 8 + 24;wr_start <= 1;rd_start <= 0;end else begin start_data_reg <= start_data_reg;spi_bit_len <= spi_bit_len;wr_start <= 0;rd_start <= 0;end end
2.3 SPI CLK生成
//spi clk always @ (posedge sys_clk) begin if(sys_rst) begin clk_div <= 0;clk_cnt <= 0;end else if(spi_run_en && clk_cnt >= spirate_val) begin clk_div <= !clk_div;clk_cnt <= 0; end else if(spi_run_en) begin clk_div <= clk_div;clk_cnt <= clk_cnt + 1;end else beginclk_div <= 0;clk_cnt <= 0;end clk_div_reg <= clk_div;clk_div_pose <= clk_div && !clk_div_reg;clk_div_nege <= !clk_div && clk_div_reg;end
2.4 控制器状态机
控制完成命令,数据读写设计。
//spi state always @ (posedge sys_clk) begin if(sys_rst)spi_state <= idlestate;else case(spi_state) idlestate : if(wr_start) spi_state <= wrstartstate;else if(rd_start)spi_state <= rdstartstate;else spi_state <= idlestate;wrstartstate : spi_state <= wrstate;wrstate : if(spi_bit_cnt == 0)spi_state <= wrdonestate;else spi_state <= wrstate;wrdonestate : spi_state <= idlestate;rdstartstate : spi_state <= rdstate;rdstate : if(spi_bit_cnt == 0)spi_state <= rddonestate;else spi_state <= rdstate;rddonestate : spi_state <= idlestate;default : spi_state <= idlestate;endcaseend always @ (posedge sys_clk) begin if(sys_rst) begin spi_run_en <= 0;spi_bit_cnt <= 0;cs_int <= 0;sclk_int <= 0;sdo_int <= 0;cmd_done <= 0;tx_shift_data <= 0;rx_shift_data <= 0;rx_data_reg <= 0;endelse case(spi_state)idlestate : begin spi_run_en <= 0;spi_bit_cnt <= 0;cs_int <= 0;sclk_int <= 0;sdo_int <= 0;cmd_done <= 0;tx_shift_data <= 0;rx_shift_data <= 0; rx_data_reg <= rx_data_reg; end wrstartstate : begin spi_run_en <= 1;spi_bit_cnt <= spi_bit_len;cs_int <= 1;sclk_int <= 0;sdo_int <= 0;cmd_done <= 0;tx_shift_data <= start_data_reg;rx_shift_data <= 0; rx_data_reg <= rx_data_reg; end wrstate : if(clk_div_nege) begin tx_shift_data <= {tx_shift_data[62:0],1'b0};spi_bit_cnt <= spi_bit_cnt - 1;end else begin spi_run_en <= 1;spi_bit_cnt <= spi_bit_cnt;cs_int <= 1;cmd_done <= 0;sclk_int <= clk_div;sdo_int <= tx_shift_data[63];tx_shift_data <= tx_shift_data;rx_shift_data <= 0; rx_data_reg <= rx_data_reg; end wrdonestate : begin spi_run_en <= 0;spi_bit_cnt <= 0;cs_int <= 0;sclk_int <= 0;sdo_int <= 0;cmd_done <= 1;tx_shift_data <= 0;rx_shift_data <= 0; rx_data_reg <= rx_data_reg; end rdstartstate : begin spi_run_en <= 1;spi_bit_cnt <= spi_bit_len;cs_int <= 1;sclk_int <= 0;sdo_int <= 0;cmd_done <= 0;tx_shift_data <= start_data_reg;rx_shift_data <= 0; rx_data_reg <= rx_data_reg; end rdstate : if(clk_div_nege) begin tx_shift_data <= {tx_shift_data[62:0],1'b0};spi_bit_cnt <= spi_bit_cnt - 1;end else if(clk_div_pose) begin rx_shift_data <= {rx_shift_data[31:0],flash_sdi};end else begin spi_run_en <= 1;spi_bit_cnt <= spi_bit_cnt;cs_int <= 1;cmd_done <= 0;sclk_int <= clk_div;sdo_int <= tx_shift_data[63];tx_shift_data <= tx_shift_data;rx_shift_data <= rx_shift_data; rx_data_reg <= rx_data_reg; end rddonestate : begin spi_run_en <= 0;spi_bit_cnt <= 0;cs_int <= 0;sclk_int <= 0;sdo_int <= 0;cmd_done <= 1;tx_shift_data <= 0;rx_shift_data <= 0; rx_data_reg <= rx_shift_data; end endcase end
七、基于FPGA的Flash控制器设计相关推荐
- 基于 FPGA 的 UART 控制器设计(VHDL)(下)
今天给大侠带来基于FPGA的 UART 控制器设计(VHDL)(下),由于篇幅较长,分三篇.今天带来第三篇,下篇,使用 FPGA 实现 UART.话不多说,上货. 之前有关于 Veriliog HDL ...
- 基于FPGA的SDRAM控制器设计(二)
基于FPGA的SDRAM控制器设计(二) 1. SDRAM理论基础 2. SDRAM初始化模块以及仿真 3.TOP模块的仲裁机制 4. SDRAM刷新模块代码以及仿真 5.代码 6.参考资料 1. S ...
- 基于FPGA的SDRAM控制器设计(1)
基于FPGA的SDRAM初始化配置 SDRAM简述 SDRAM的引脚及作用 SDRAM初始化时序控制 SDRAM上电时序代码 SDRAM测试模块的代码 仿真测试结果 参考文献 总结 SDRAM简述 S ...
- 基于FPGA的SDRAM控制器设计(2)
基于FPGA的SDRAM的自刷新操作 SDRAM自刷新简述 SDRAM自刷新时序图 SDRAM自刷新代码 仿真模块的代码 仿真结果测试 参考文献 总结 SDRAM自刷新简述 SDRAM作为一个RAM并 ...
- 基于FPGA的PID控制器设计
1 知识背景 PID控制应该算是应用非常广泛的控制算法了.常见的比如控制环境温度,控制无人机飞行高度速度等.PID我们将其分成三个参数,如下: P-比例控制,基本作用就是控制对象以线性的方式增加,在一 ...
- 基于FPGA的SDRAM控制器设计(一)----------SDRAM初始化
本文设计思路与讲解于参考邓堪文老师的视频,感谢-(不太适合一点基础都没有的小白) SDRAM简介 SDRAM(synchronous Dynamic Random ),同步动态随机存储器,同步指内存工 ...
- 基于FPGA的SPI FLASH控制器设计
1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...
- 基于FPGA的以太网控制器(MAC)设计(中)
今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,以太网控制器(MAC)程序的实现.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生 ...
- 基于FPGA的以太网控制器(MAC)设计(下)
今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第三篇,下篇,程序的仿真与测试和总结.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生活.与之相 ...
最新文章
- vmware esxi 5.1 开启嵌套虚拟化
- Executors框架——5种常用的线程池介绍及区别
- multipartfile前端怎么传_前端那些事如何更好管理 Api 接口
- 关于 Angular Component ngOnDestroy 钩子函数的调用时机
- 交叉编译android版htop
- Burst Balloons
- 动手学深度学习Pytorch Task03
- Java小游戏之飞翔的小鸟
- python如何打开文件选择框_python文件选择对话框的操作方法
- (20200226已解决)PyCharm里的黄色波浪线
- 最优化理论——线搜索技术·黄金分割法
- 禾赛科技2022数字芯片提前批笔试
- ps2015安装guideguide参考线辅助工具
- 小日本的恶趣味?育碧让玩家用VR外设闻屁味
- NAND flash 基础知识
- 下载Excel文件功能通过火狐浏览器下载没有后缀名
- C++ 静态成员变量和静态成员函数
- Linux命令及其全称(转)
- Learning without Forgetting 论文阅读和对应代码详解
- 文件夹加密软件推荐-文件夹加密超级大师
热门文章
- 设计模式-装饰器模式
- 超酷!纯CSS3烧烤动画实现教程
- 情绪管理:如何与狼相处?
- Python随机选择Maya场景元素
- QTableWidget setitem不显示
- Nginx配置ssl证书(https证书)
- docker制作mysql5.7镜像详解
- @#####haohaohao#####推荐系统技术演进趋势:从召回到排序再到重排
- php openssl.capath,php - openssl_pkey_get_public返回false,但是密钥确实存在 - 堆栈内存溢出...
- 计算机网络题库---错题本