名称: W25Q64 SPI读写控制 Verilog Gowin
软件: Gowin IDE
语言: Verilog
代码功能: 实现W25Q64 SPI Flash 的读写、ID读取及数据展示,通过按键控制读写操作和数码管显示,适用于嵌入式存储系统。
代码实现思路:
本设计以模块化方式实现SPI Flash 的读写控制。顶层模块通过按键消抖采集用户输入,SPI控制模块生成读写请求,SPI接口模块负责与Flash的时序通信,数码管显示模块实时反馈操作状态。整体采用状态机驱动,确保操作流程清晰可靠,各模块配合协调,便于扩展和调试。
代码结构:
-?top:顶层模块,协调各功能模块实现整体控制。
-?key_jitter:按键消抖模块,提供稳定的按键信号。
-?spi_control:SPI读写控制模块,生成数据读写请求。
-?spi_interface:SPI接口模块,实现与Flash的数据时序通信。
-?spi_read_ctrl:读控制模块,实现Flash ID和数据的读取。
-?spi_write_ctrl:写控制模块,实现数据写入和擦除操作。
-?display:数码管显示模块,实时显示当前操作状态。
1、工程文件
2、程序文件
3、程序编译
4、RTL图
5、管脚分配
## 部分代码预览
```verilog
// 以下为top.v前100行
//按下key[2]写数据
//按下key[1]读数据
//按下key[0]读ID
module top(
input ? ? ? ? ? clk,
input ? ? ? ? ? rst_n,
input ? [2:0] ? key_in,
input ? ? ? ? ? key_shift,//切换显示内容
input ? ? ? ? ? miso,// 主机采样从机发送
output ? ? ? ? ?mosi,// 主机发送从机
output ? ? ? ? ?sclk,// 串行时钟
output ? ? ? ? ?cs_n, // 片选信号
output ?[3:0] ? bit_select,//数码管位选
output ?[7:0] ? seg_select//数码管段选
);
wire ? ?[2:0] ? ? ? key_out;
wire ? ? ? ? ? ? ? ?req;
wire ? ? ? ? ? ? ? ?done;
wire ? ?[7:0] ? ? ? rx_data;
wire ? ?[7:0] ? ? ? tx_data;
wire ? ?[23:0] ? ? ?seg_data;
//按键消抖
key_jitter i0_key_jitter(
.clkin(clk),
.key_in(key_in[0]), //输入
.key_negedge(key_out[0]) //消抖后按键下降沿
);
//按键消抖
key_jitter i1_key_jitter(
.clkin(clk),
.key_in(key_in[1]), //输入
.key_negedge(key_out[1]) //消抖后按键下降沿
);
//按键消抖
key_jitter i2_key_jitter(
.clkin(clk),
.key_in(key_in[2]), //输入
.key_negedge(key_out[2]) //消抖后按键下降沿
);
spi_control u_spi_control(
.clk(clk),
.rst_n(rst_n),
.key_out(key_out),
.din(rx_data),
.done(done),
.dout(tx_data),
.req(req),
.seg_data(seg_data)
);
spi_interface u_spi_interface(
.clk(clk),
.rst_n(rst_n),
.din(tx_data),
.req(req),
.dout(rx_data),
.done(done),
.miso(miso),
.mosi(mosi),
.sclk(sclk),
.cs_n(cs_n)
);
//显示模块
display i_display(
.clk(clk),
.rst_n(rst_n),
.key_shift(key_shift),
.key_in(key_out),
.seg_data(seg_data),
.bit_select(bit_select),
.seg_select(seg_select)
);
endmodule
```
代码下载(付费可见):
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1543
462