
FPGA Verilog SPI主机源码:实测160M无时序问题,兼容从机代码
最近在项目中需要实现个160MHz高速SPI通信,折腾了三天终于把时序调通。实测波形干净得能当
示波器广告图,顺手把主机和从机的Verilog代码都整理出来了,直接上干货。
先看SPI主机的核心设计思路。关键点在于时钟相位控制和状态机配合,这里用CPOL=0/CPHA=0模式
(时钟空闲低电平,数据在上升沿采样)。代码里最骚的操作是用系统时钟四分频直接怼160MHz输出,没加
PLL居然稳如老狗。
```verilog
module spi_master(
input clk, // 640MHz主时钟
input start,
output reg sclk,
output reg mosi,
input miso,
output reg cs,
output reg [7:0] data_out
);
reg [1:0] clk_div;
reg [3:0] bit_cnt;
reg [7:0] tx_data;
reg [7:0] rx_buffer;
always @(posedge clk) begin
if(start) begin
clk_div <= clk_div + 1;
// 四分频生成160MHz SPI时钟
sclk <= (clk_div == 2'b10) ? 1'b1 :
(clk_div == 2'b00) ? 1'b0 : sclk;
end
end
// 状态机处理数据移位