项目背景: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 wir