项目背景:FPGA 串行模式控制9914出点频
需求: SPI 发送包含写模式 和 读模式,帧格式为地址加数据,数据长度是随寄存器的长度变化的。 另外空闲时钟和片选信号的不同也会导致读时序的不同。因此这个mater 必须包含 读/写功能
,发送数据长度可变功能,等。
初步设想:
发射使能信号采用触发模式,一旦收到发送触发的上升沿就进入发送/读取状态机,同时输出busy信号耦合到触发上进行触发保护避免发送时被中断。
发射完毕后关闭busy信号。
状态机状态可分为:
空闲状态-> 等待发送
地址发送状态-> cnt(0-7) cnt == 7 时进入下一状态,并清零cnt
数据发送状态-> cnt(0-7) cnt == 7 时进入下一状态,并清零cnt,数据状态下有两个相关量,一个是数据发送长度 data_lenth,一个是当前发送数据 data_loc,当两者相等时,进入发送完成状态,否则返回数据发送状态。同时应输出data_loc,以便外部更新发送数据
完成状态-> 相关信号清零,返回空闲
完成代码如下
`timescale 1ns / 1ps
/////////////////////
///*shx 20220308*///
////////////////////
module Spi_master(
input wire sclk , // System Clock.
input wire srstn , // System Reset. Low Active
//====== Control / Status ======================
input wire start , // Write or Read Start
output reg busy , // Write or Read Finish
input wire [ 7 : 0] addr , // Write / Read Start Address
input wire [ 3 : 0] data_len , // data length
output reg [ 3 : 0] data_loc , // data_location now
//====== Rx Interface =========================
input wire [ 7 : 0] tx_data , // Rx Read Data
//====== Tx Interface =====================
output wire [ 7 : 0] rx_data , // Tx Write Data
//====== ReRAM SPI Interface ===================
output wire SPI_SCLK , // SPI Clock
output wire SPI_CSN , // SPI Chip Select
output wire SPI_MOSI , // SPI Master Output
input wire SPI_MISO // SPI Master Input
);
//==============================================================
// Local Registe Declare
//=========================================

本文档详细介绍了在FPGA中设计SPI_Master模块的过程,包括满足可变长度数据发送、读写功能的需求。通过状态机实现,包括空闲、地址发送、数据发送和完成状态,以及相应的控制信号和时序处理。代码中展示了具体的VHDL实现,包括状态转换和数据传输逻辑。
最低0.47元/天 解锁文章
366

被折叠的 条评论
为什么被折叠?



