|
FPGA的时钟是24M
SPI主机的时钟为16M,没有采用同步设计。直接用异步信号:
才入门不久,SPI已经验证通过,用本模块实现了一个FPGA与MCU之间变量数值的交换协议,稳定性很好,实测通信误码率为0.000000000015
最后加了个CRC校验
module SPI_Slaver(
input [7:0]u8Send, //需要给主机的数据线
output [7:0]u8Recv,//从主机机接收到的数据
output recv_a, //接收完成信号,高电平有效,对FPGA时钟来说是异步信号
output MISO,
input MOSI,SCK,CS //CS 是使能信号,低电平有效
);
reg tmpMOSI;
reg [7:0]shiftReg;
reg startFlag;
initial begin
startFlag<=0;
end
always @(posedge SCK or posedge CS)begin
if(CS==1)begin
startFlag<=0; //高电平复位
end
else begin
if(startFlag==0)begin
shiftReg[7:0]<=u8Send[7:0]; //在CS低电平后的第一个SCK上升沿锁存需要发送的数据
end
else begin
shiftReg[7:0]<={shiftReg[6:0],tmpMOSI}; //在第2--8个上升沿移位,将下降沿锁存的数据放进移位寄存器
end
startFlag<=1'b1;
end
end
always @(negedge SCK)begin
tmpMOSI=MOSI; //下降沿锁存信号
end
assign MISO=shiftReg[7]; //MISO引脚时钟对应移位寄存器最高位
assign recv_a=CS; //异步接收完毕信号,发给FPGA内部的
assign u8Recv[7:0]={shiftReg[6:0],tmpMOSI}; //接收到的数据,送往FPGA内部
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|