根据项目需求,设计一个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控制器设计相关推荐

  1. 基于 FPGA 的 UART 控制器设计(VHDL)(下)

    今天给大侠带来基于FPGA的 UART 控制器设计(VHDL)(下),由于篇幅较长,分三篇.今天带来第三篇,下篇,使用 FPGA 实现 UART.话不多说,上货. 之前有关于 Veriliog HDL ...

  2. 基于FPGA的SDRAM控制器设计(二)

    基于FPGA的SDRAM控制器设计(二) 1. SDRAM理论基础 2. SDRAM初始化模块以及仿真 3.TOP模块的仲裁机制 4. SDRAM刷新模块代码以及仿真 5.代码 6.参考资料 1. S ...

  3. 基于FPGA的SDRAM控制器设计(1)

    基于FPGA的SDRAM初始化配置 SDRAM简述 SDRAM的引脚及作用 SDRAM初始化时序控制 SDRAM上电时序代码 SDRAM测试模块的代码 仿真测试结果 参考文献 总结 SDRAM简述 S ...

  4. 基于FPGA的SDRAM控制器设计(2)

    基于FPGA的SDRAM的自刷新操作 SDRAM自刷新简述 SDRAM自刷新时序图 SDRAM自刷新代码 仿真模块的代码 仿真结果测试 参考文献 总结 SDRAM自刷新简述 SDRAM作为一个RAM并 ...

  5. 基于FPGA的PID控制器设计

    1 知识背景 PID控制应该算是应用非常广泛的控制算法了.常见的比如控制环境温度,控制无人机飞行高度速度等.PID我们将其分成三个参数,如下: P-比例控制,基本作用就是控制对象以线性的方式增加,在一 ...

  6. 基于FPGA的SDRAM控制器设计(一)----------SDRAM初始化

    本文设计思路与讲解于参考邓堪文老师的视频,感谢-(不太适合一点基础都没有的小白) SDRAM简介 SDRAM(synchronous Dynamic Random ),同步动态随机存储器,同步指内存工 ...

  7. 基于FPGA的SPI FLASH控制器设计

    1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...

  8. 基于FPGA的以太网控制器(MAC)设计(中)

    今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,以太网控制器(MAC)程序的实现.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生 ...

  9. 基于FPGA的以太网控制器(MAC)设计(下)

    今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第三篇,下篇,程序的仿真与测试和总结.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生活.与之相 ...

最新文章

  1. vmware esxi 5.1 开启嵌套虚拟化
  2. Executors框架——5种常用的线程池介绍及区别
  3. multipartfile前端怎么传_前端那些事如何更好管理 Api 接口
  4. 关于 Angular Component ngOnDestroy 钩子函数的调用时机
  5. 交叉编译android版htop
  6. Burst Balloons
  7. 动手学深度学习Pytorch Task03
  8. Java小游戏之飞翔的小鸟
  9. python如何打开文件选择框_python文件选择对话框的操作方法
  10. (20200226已解决)PyCharm里的黄色波浪线
  11. 最优化理论——线搜索技术·黄金分割法
  12. 禾赛科技2022数字芯片提前批笔试
  13. ps2015安装guideguide参考线辅助工具
  14. 小日本的恶趣味?育碧让玩家用VR外设闻屁味
  15. NAND flash 基础知识
  16. 下载Excel文件功能通过火狐浏览器下载没有后缀名
  17. C++ 静态成员变量和静态成员函数
  18. Linux命令及其全称(转)
  19. Learning without Forgetting 论文阅读和对应代码详解
  20. 文件夹加密软件推荐-文件夹加密超级大师

热门文章

  1. 设计模式-装饰器模式
  2. 超酷!纯CSS3烧烤动画实现教程
  3. 情绪管理:如何与狼相处?
  4. Python随机选择Maya场景元素
  5. QTableWidget setitem不显示
  6. Nginx配置ssl证书(https证书)
  7. docker制作mysql5.7镜像详解
  8. @#####haohaohao#####推荐系统技术演进趋势:从召回到排序再到重排
  9. php openssl.capath,php - openssl_pkey_get_public返回false,但是密钥确实存在 - 堆栈内存溢出...
  10. 计算机网络题库---错题本