FPGA 黑金XC6SLX9 08.spi_flash源码分析 spi flash数据的读取擦除写入实验(1)

article/2025/3/10 20:32:47

Spi flash 数码管显示flash两位数 按键可实现数据写入 流程图

 

 

//
//                                                                              //
//                                                                              //
//  Author: meisq                                                               //
//          msq@qq.com                                                          //
//          ALINX(shanghai) Technology Co.,Ltd                                  //
//          heijin                                                              //
//     WEB: http://www.alinx.cn/                                                //
//     BBS: http://www.heijin.org/                                              //
//                                                                              //
//
//                                                                              //
// Copyright (c) 2017,ALINX(shanghai) Technology Co.,Ltd                        //
//                    All rights reserved                                       //
//                                                                              //
// This source file may be used and distributed without restriction provided    //
// that this copyright statement is not removed from the file and that any      //
// derivative work contains the original copyright notice and the associated    //
// disclaimer.                                                                  //
//                                                                              //
//

//================================================================================
//  Revision History:
//  Date          By            Revision    Change Description
//--------------------------------------------------------------------------------
//  2017/5/3     meisq          1.0         Original
//*******************************************************************************/
//黑金fpga开发板spi flash分析流程从上至下  
//模块1 spi_flash_test功能:启动后读取flash 0地址一个字节数据  在数码管种显示出来;//
//                        按一次按键读取的数据增加1 并擦除写入到0地址,最后读取并显示出来
`include "spi_flash_defines.v"  //里面宏定义flash命令
module spi_flash_test(
    input            clk,  //外部时钟
    input            rst_n, //外部复位引脚
    input            key1, //外部按键引脚
    output           ncs,  //spi flash 片选引脚
    output           dclk, // clock spi flash 时钟引脚
    output           mosi, // master output    spi flash数据输出引脚
    input            miso, // master input  spi flash数据输入引脚
    output [5:0]     seg_sel, //数码管选中引脚
    output [7:0]     seg_data //数码管段点亮引脚
);
localparam S_IDLE       = 0;//程序组合时序控制状态 准备态
localparam S_READ_ID    = 1; //读取数据状态
localparam S_SE         = 2;//Sector Erase //擦除删去态
localparam S_PP         = 3; //写数据态
localparam S_READ       = 4;//读取数据状态
localparam S_WAIT       = 5; //等待按键按下
reg[3:0] state;//状态寄存器

wire      button_negedge;//按键下降沿有效标志  1
reg[7:0]  read_data; //从spi flash 读取数据存储寄存器
reg[31:0] timer;  //定时计数寄存器

reg            flash_read;  //flash 读取数据标志
reg            flash_write; //flash 写数据标志
reg            flash_bulk_erase; //flash 整个芯片擦除标志
reg            flash_sector_erase; flash 扇区擦除标志
wire           flash_read_ack; //flash 读取数据应答标志
wire           flash_write_ack; //flash 写数据应答标志
wire           flash_bulk_erase_ack; //flash 整个芯片擦除应答
wire           flash_sector_erase_ack;//flash 扇区擦除应答
reg[23:0]      flash_read_addr; //flash 读取数据地址
reg[23:0]      flash_write_addr; //flash 写数据地址
reg[23:0]      flash_sector_addr; //flash 扇区擦除地址
reg[7:0]       flash_write_data_in; //flash 写数据数据
wire[8:0]      flash_read_size; //flash 读取数据大小
wire[8:0]      flash_write_size; //flash 写数据大小
wire           flash_write_data_req; //flash 写数据请求数据
wire[7:0]      flash_read_data_out; //flash 读取数据
wire           flash_read_data_valid; //flash 读取数据有效

//模块2 ax_debounce 读取按键返回值:上升沿  下降沿   有效标志:功能当有按键按下 button_negedge下降沿为1
ax_debounce ax_debounce_m0
(
    .clk             (clk),
    .rst             (~rst_n),
    .button_in       (key1),
    .button_posedge  (),
    .button_negedge  (button_negedge),
    .button_out      ()
);
wire[6:0] seg_data_0;//模块3 seg_decoder数码管编码转换 功能:将4位的十六进制数转换成数码管对应的7位数
seg_decoder seg_decoder_m0(
    .bin_data  (read_data[3:0]),
    .seg_data  (seg_data_0)
);
wire[6:0] seg_data_1;//模块3 seg_decoder数码管编码转换 功能:将4位的十六进制数转换成数码管对应的7位数
seg_decoder seg_decoder_m1(
    .bin_data  (read_data[7:4]),
    .seg_data  (seg_data_1)
);
seg_scan seg_scan_m0(//模块4 seg_scan数码管刷新模块,功能实时刷新数码管数据
    .clk        (clk),
    .rst_n      (rst_n),
    .seg_sel    (seg_sel),
    .seg_data   (seg_data),
    .seg_data_0 ({1'b1,7'b1111_111}),
    .seg_data_1 ({1'b1,7'b1111_111}),
    .seg_data_2 ({1'b1,7'b1111_111}),
    .seg_data_3 ({1'b1,7'b1111_111}),
    .seg_data_4 ({1'b1,seg_data_1}),
    .seg_data_5 ({1'b1,seg_data_0})
);
assign flash_read_size = 9'd1; //读取flash数据大小是1
assign flash_write_size = 9'd1;//写入flash数据大小也是1
always@(posedge clk or negedge rst_n) //所有功能模块逻辑功能控制
begin
    if(rst_n == 1'b0)//上电或复位初始化数据
    begin
        state <= S_IDLE;

        flash_read <= 1'b0;
        flash_write <= 1'b0;
        flash_bulk_erase <= 1'b0;
        flash_sector_erase <= 1'b0;
        flash_read_addr <= 24'd0;
        flash_write_addr <= 24'd0;
        flash_sector_addr <= 24'd0;
        flash_write_data_in <= 8'd0;
        timer <= 32'd0;
    end
    else
        case(state)
            S_IDLE://开机稳定后进入读取flash状态
            begin
                if(timer >= 32'd12_499_999)
                    state <= S_READ;
                else
                    timer <= timer + 32'd1;
            end
            S_WAIT://等待按键按下
                if(button_negedge == 1'b1)
                begin
                    state <= S_SE;//1、如果按键按下 进入flash擦除态  准备写入数据
                    read_data <= read_data + 8'd1;
                end
            S_SE: //flash删去查出态
            begin
                if(flash_sector_erase_ack == 1'b1)//确认扇区擦除成功 进入flash写数据态
                begin
                    flash_sector_erase <= 1'b0;
                    state <= S_PP;
                end
                else
                begin //1、flash扇区擦除标志和地址设置
                    flash_sector_erase <= 1'b1;
                    flash_sector_addr <= 24'd0;
                end
            end
            S_PP: //flash 准备写数据
            begin
                if(flash_write_data_req == 1'b1)//2、判断flash准备好  设置写入数据
                    flash_write_data_in <= read_data;

                if(flash_write_ack == 1'b1) //3、写数据完成 进入读取数据态
                begin
                    flash_write <= 1'b0;
                    state <= S_READ;
                end
                else
                begin
                    flash_write <= 1'b1; //1、设置写数据标志及地址
                    flash_write_addr <= 24'd0;
                end
            end
            S_READ://读取flash态
            begin
                if(flash_read_data_valid == 1'b1)//2、读取有效数据
                    read_data <= flash_read_data_out;

                if(flash_read_ack == 1'b1)//3、读取数据应答 则进入等待按键按下态
                begin
                    flash_read <= 1'd0;
                    state <= S_WAIT;
                end
                else
                begin
                    flash_read <= 1'd1; //1、设置读取数据标志和地址
                    flash_read_addr <= 24'd0;
                end
            end
            default:
                state <= S_IDLE;
        endcase
end

spi_flash_top spi_flash_top_m0(//模块5 spi_flash_top flash控制。功能:实现数据的读取 擦除  写入
    .sys_clk                     (clk                      ),
    .rst                         (~rst_n                   ),
    .nCS                         (ncs                      ),
    .DCLK                        (dclk                     ),
    .MOSI                        (mosi                     ),
    .MISO                        (miso                     ),
    .clk_div                     (16'd0                    ), // 50Mhz / 4
    .flash_read                  (flash_read               ),
    .flash_write                 (flash_write              ),
    .flash_bulk_erase            (flash_bulk_erase         ),
    .flash_sector_erase          (flash_sector_erase       ),
    .flash_read_ack              (flash_read_ack           ),
    .flash_write_ack             (flash_write_ack          ),
    .flash_bulk_erase_ack        (flash_bulk_erase_ack     ),
    .flash_sector_erase_ack      (flash_sector_erase_ack   ),
    .flash_read_addr             (flash_read_addr          ),
    .flash_write_addr            (flash_write_addr         ),
    .flash_sector_addr           (flash_sector_addr        ),
    .flash_write_data_in         (flash_write_data_in      ),
    .flash_read_size             (flash_read_size          ),
    .flash_write_size            (flash_write_size         ),
    .flash_write_data_req        (flash_write_data_req     ),
    .flash_read_data_out         (flash_read_data_out      ),
    .flash_read_data_valid       (flash_read_data_valid    )
);
endmodule 


http://chatgpt.dhexx.cn/article/FXvbT0m7.shtml

相关文章

FPGA最简单的按键消抖(AX301)

就是20ms扫描2个状态&#xff0c;通过2个状态进行判断 module key_test( input wire key_a, input wire clk, input wire rst_n, output reg led ); reg [19:0]cnt; reg key_tma; always(posedge clk or negedge rst_n) if(rst_n1b0) cnt<20d0; else if(cnt20d999_999) beg…

基于FPGA的IIC协议详解——EEPROM控制器(1)

IIC协议举例 常用IIC协议使用地方常见IIC协议的注意点24LC64芯片读写命令的时序图eeprom控制器的系统框图时序图设计代码设计EEPROM控制器测试模块的代码结束语 常用IIC协议使用地方 熟悉一个协议一定要知道这个协议应该用到什么地方&#xff0c;IIC协议作为飞利浦公司定义的一…

FPGA连接电脑找不到UART串口

打开设备管理器看看是哪个芯片 百度搜索其官网 我的是CP2102N 网址是https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers 安装驱动后即可

FPGA实现千兆以太网发送

科研要求&#xff0c;使用手上的DE2-115开发板实现千兆以太网的数据发送 千兆以太网使用的时钟频率为125MHz&#xff0c;一般的GMII接口由于收发数据所使用的数据线为8根即一个时钟周期的上升沿可以发送8bit数据&#xff0c;而DE2-115开发板所使用的接口为RGMII&#xff0c;收发…

fpga 运行linux,如何使用PCIe总线将FPGA板连接到运行Linux的X86主机

步骤1:零件清单 0。运行Ubuntu 1的构建/主机计算机。 Xilinx VC707或KC705板 2。 FPGA板电源线 3。 USB转Micro-USB电缆 4。 8线PCIE带状电缆(可选) 步骤2:将板卡连接到主机 如果外形尺寸如果允许,将板卡直接插入主机板主板上的开放PCIE插槽中。在这些说明中,我们使用的是1…

FPGA 定点数

​ 定点数就是小数位宽不发生改变的数&#xff0c;小数点位置固定。 定点数位宽构成&#xff1a;{符号位&#xff0c;整数位&#xff0c;小数位} 当定点数为有符号数&#xff0c;数据的最高位为符号位&#xff0c;整数位和小数位需要根据精度去定义位宽。 假如一个定点数位…

黑金核心板32bitDDR3 MIG核UI接口仿真模型搭建

图2-4-1为黑金开发板上两片DDR3原理图。 1. 搭建仿真模型时需要例化两个ddr3_model,不然仿真时init_calib_complete信号会一直低。 2.还要考虑信号的延时&#xff0c;需要例化WireDelay模块&#xff0c;如Xilinx官方中给的例程中所示&#xff0c;不然app_rd_data数据一直是红…

基于FPGA的UDP 通信(五)

引言 前文链接&#xff1a; 基于FPGA的UDP 通信&#xff08;一&#xff09; 基于FPGA的UDP 通信&#xff08;二&#xff09; 基于FPGA的UDP 通信&#xff08;三&#xff09; 基于FPGA的UDP 通信&#xff08;四&#xff09; 本文基于FPGA设计千兆以太网通信模块UDP数据发送…

Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写

碎碎念&#xff1a; 终于熬过了期末周&#xff0c;可以开始快乐的开发之旅了。 这一期作为一千粉后的首篇博客&#xff0c;由于之后项目会涉及到相关的部分&#xff0c;因此介绍的是使用FPGA实现SD NAND FLASH的读写操作&#xff0c;以雷龙发展提供的CS创世SD NAND FLASH样品为…

【FPGA算法加速】运行PYNQ,对应FPGA芯片版本:赛灵思黑金AX7020

黑金AX7020开放板实物图&#xff1a; 这里的右下角需要连接本地的路由器&#xff0c;图中并未连上&#xff0c;PC端与FPGA在同一路由的网下&#xff0c;到时候PC端可以在线访问FPGA的资源。 一、连接FPGA硬件设备 1、 SD卡插回开发板&#xff0c;确认开发板启动模式为 SD卡模…

黑金Xilinx FPGA学习笔记(一)verilogHDL扫盲文-(1)

verilog简介 HDL 顾名思义Hardware Description Languag verilog HDL 语言的语法和格式都比较随便&#xff0c;它没有 VDL HDL 语言那么严谨&#xff0c;因此受到了广泛的应用。 0.3RTL级和组合逻辑级 笔者的眼中 Verilog HDL 语言建立的硬件模块可以 分为有时钟源和无时钟…

基于FPGA的示波器设计

目录 一、设计要求 二、系统架构设计 一、设计要求 本次基于FPGA的示波器设计主要技术要求包含以下内容&#xff1a; 系统能够实现模数转换功能&#xff0c;即包含ADC驱动模块&#xff1b;系统能够实现ADC采集数据的缓存功能&#xff1b;系统包含辅助测试模块&#xff0c;DA…

FPGA实现 贪吃蛇

一. 硬件 黑金AX4010AN430显示屏&#xff08;480*272&#xff09;蓝牙模块安卓手机 采用app通过蓝牙模块来操作蛇的移动情况 二. 数据的存储 reg[18:0] Snake[0:7]; //蛇 18:10 x 9:1 y 0 :flag 是否是蛇身 reg[17:0] Food; // 食物三. 蛇的移动的方向 通过上下左右来…

黑金全部开发板资料(FPGA+ZYNQ)分享

黑金开发板 能找到的所有黑金开发板的资料&#xff0c;足够学习使用。 ALTERA CYCLONE 10 黑金开发板ZYNQ7020_2019 黑金zynq7015_2017 黑金zynq7010_2017 …

FPAG—UART串口实现与解析-黑金fpga资料解析

UART实现-黑金fpga开发板案例解析 uart 异步串口通讯 无需时钟线&#xff0c;俩根线一跟复制发数据一根负责收数据。 具体的时序如下图1&#xff1a; 图1&#xff1a;UART时序图 可以看到 当数据线由高位变为地位时&#xff0c;即遇到一个下降沿时刻&#xff0c;表示开始这一…

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十四:SD卡模块

驱动SD卡是件容易让人抓狂的事情,驱动SD卡好比SDRAM执行页读写,SD卡虽然不及SDRAM的麻烦要求(时序参数),但是驱动过程却有猥琐操作。除此此外,描述语言只要稍微比较一下C语言,描述语言一定会泪流满面,因为嵌套循环,嵌套判断,或者嵌套函数等都是它的痛。. 史莱姆模块是…

黑金AX7Z100 FPGA开发板移植LWIP库(二)PL端

前言 上一篇博文中实验了PS端移植LwIP库的演示程序。本篇接下来基于Vivado17.4整理比较详细的PL端移植过程。 一、Vivado 工程建立 1、新建一个空工程&#xff0c;名称为net_lwip_pl。 2、FPGA芯片选择xc7z100ffg900-2。 二、配置PS&PL系统硬件 1、工程建好以后&…

【FPGA从0开始系列】黑金EP4CE10F17C8开发板按键实验(二)

项目目录 1.实验目的2.准备阶段3.实验原理4.编写Verilog HDL程序5.配置引脚6.查看和分析RTL7.下载程序8.总结 1.实验目的 查阅AX4010黑金系列用户手册&#xff0c;编写按键程序&#xff0c;实验简单的按键控制LED的功能&#xff0c;同时学习 Quartus RTL Viewer 的使用 2.准备…

汉诺塔(C语言实现)

目录 汉诺塔的游戏规则&#xff1a; 当A只有一个环的时候&#xff1a; 当A只有两个环的时候&#xff1a; 当A只有三个环的时候&#xff1a; 思路&#xff1a; 当n1时&#xff1a; 当n2时&#xff1a; 当n3时&#xff1a; 当n4时&#xff1a; 见代码 运行截图 汉诺塔的游戏…

【C语言】汉诺塔问题

汉诺塔是一个非常经典的问题&#xff0c;其背后是一个传说故事&#xff1a; 在世界中心贝拿勒斯&#xff08;在印度北部&#xff09;的圣庙里&#xff0c;一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&#xff0c;在其中一根针上从下到上地穿好了由大到小的6…