声明:本篇文章面向在已对SPI的四种时序有所了解的人
我们采用SPI3模式以及将FPGA作从机,STM32作主机的方式讲解,在STM32控制部分采用的是半双工模式,但其实半双工与全双工区别不大,
稍加修改即可
本片文章是接续上篇文章的,如果未浏览上一篇文章的,可以在此跳转SPI驱动代码详解SPI代码详解FPGA-verilog部分(FPGA+STM32)(二)
本文是FPGA通过SPI接收的数据做出应答的模块,比如改变ADC采样率,将ADC采集的数据放在RAM中和从RAM中取出再发送给单片机
module samplingCtrl (
input clk,
input rstn,
input [31:0] FCW, //频率控制字,是由单片机发送过来的
input en, //采样使能控制信号,是由单片机发送过来的
input [11:0] AD9226_Din_0, //AD9226模块0采样后转换出来的数字量
input [11:0] AD9226_Din_1, //AD9226模块1采样后转换出来的数字量
input [11:0] AD9226_Din_2, //AD9226模块2采样后转换出来的数字量
input [6:0] rd_addr, //读RAM地址,是由单片机发送过来的
output reg clk_sampling_1, //AD9226模块0时钟,由频率控制字控制
output reg clk_sampling_2, //AD9226模块1时钟,由频率控制字控制
output reg clk_sampling_0, //AD9226模块2时钟,由频率控制字控制
output reg [11:0] AD9226_Dout_0, //从RAM0中读出的AD9226模块0采集的数据,将来发送给STM32
output reg [11:0] AD9226_Dout_1, //从RAM1中读出的AD9226模块1采集的数据,将来发送给STM32
output reg [11:0] AD9226_Dout_2, //从RAM2中读出的AD9226模块2采集的数据,将来发送给STM32
output reg busy //判断一组采样(设置的是1024个点或者512个点)是否完成
);
localparam OFFSET_VALID = 7'd0; //RAM偏移地址可以过滤掉采集的前几个不太正常的数据,但是一般数据都是正常的,这个功能暂时不开启
wire clk_sampling; //ADC模块的采样时钟
reg [1:0] r_en;
wire pos_en;
reg [1:0] r_clk_sampling;
wire pos_clk_sampling;
wire neg_clk_sampling;
reg wr_en;
reg [6:0] wr_addr;
wire [15:0] ram_dout0;
wire [15:0] ram_dout1;
wire [15:0] ram_dout2;
//
always @(posedge clk , negedge rstn)
begin
if(<

最低0.47元/天 解锁文章
1万+





