菜鸟一枚,奉上一个耗费10个逻辑单元的SPI从机Verilog程序,望高手指正下
FPGA的时钟是24MSPI主机的时钟为16M,没有采用同步设计。直接用异步信号:
才入门不久,SPI已经验证通过,用本模块实现了一个FPGA与MCU之间变量数值的交换协议,稳定性很好,实测通信误码率为0.000000000015
最后加了个CRC校验
module SPI_Slaver(
input u8Send, //需要给主机的数据线
output u8Recv,//从主机机接收到的数据
output recv_a, //接收完成信号,高电平有效,对FPGA时钟来说是异步信号
output MISO,
inputMOSI,SCK,CS //CS 是使能信号,低电平有效
);
reg tmpMOSI;
reg 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<=u8Send;//在CS低电平后的第一个SCK上升沿锁存需要发送的数据
end
else begin
shiftReg<={shiftReg,tmpMOSI}; //在第2--8个上升沿移位,将下降沿锁存的数据放进移位寄存器
end
startFlag<=1'b1;
end
end
always @(negedge SCK)begin
tmpMOSI=MOSI; //下降沿锁存信号
end
assign MISO=shiftReg; //MISO引脚时钟对应移位寄存器最高位
assign recv_a=CS; //异步接收完毕信号,发给FPGA内部的
assign u8Recv={shiftReg,tmpMOSI};//接收到的数据,送往FPGA内部
endmodule mark ( ⊙ o ⊙ )啊!
笑 mark 感谢分享 如果SPI主、从设备都是同一时钟域的话,你的代码是可以的。
但一般而言SPI主设备是MCU,作为从设备的FPGA与MCU是不同的时钟域,要面临跨时钟域的问题,可以通过FPGA对输入信号进行过采样解决。
具体参考 http://www.fpga4fun.com/SPI2.html 实测通信误码率为0.000000000015
用什么方法测得的?我也想测测我写的spi slave 回复【6楼】DanielDeng
-----------------------------------------------------------------------
在这个SPI协议之上还有一个链路层通讯协议。实现FPGA与DSP之间的通讯。其中还配了了一个FPGA上生成CRC的模块,然后DSP上作校验。所以在这么久的运行过程中,记录出错个数和总的通讯量就可以测试误码率了 果断记号 这个学习下。 记号,想用SPI的方式驱动一下ADF4360-0,先看下思路~ 采用异步的方式的话,用的是CPLD是不是就不用外接晶振了?
初学者,忘能者指点下,谢谢! 研究下 mark mark 楼主的做法是OK的,我也用过类似的实现。
CPLD如果再挂个有源晶振,经济上也很不划算。 mark 支持个~ 支持个~ mark 回复【19楼】get500wan
-----------------------------------------------------------------------
这个学习下。 mark mark 回复【楼主位】zf12862177
-----------------------------------------------------------------------
一起学习,我也菜鸟!1 phuck 这个是CPOL=0,CPHA=0的SPI吗? 围观一下。 这个学习下。 SPI 10逻辑。。。标记下。。。 很实用学习一下 我表示我现在对SPI协议 情有独钟{:victory:} mark mark~ 写的不错。学习 我也支持下 程序复制走了 留着学习 MARK!! 学习学习~ mark makr~
页:
[1]