|
想用fpga做spi slave 用stm32驱动
初步代码如下:
module SpiSlave(clk,nrst,sclk,nss,miso,mosi,led);
input clk,nrst,sclk,nss,mosi;
output miso;
output [3:0] led;
reg [15:0] sr;
reg [3:0] RegLed;
reg SclkCnt,SclkCntR;
reg NssCnt,NssCntR;
assign miso = sr[15];
always @(posedge clk or negedge nrst )
begin
if(!nrst) begin
sr <= 0;
SclkCntR <= 0;
NssCntR <= 0;
end
else
if(NssCntR != NssCnt ) begin //检测上升沿
RegLed <= sr[3:0];
NssCntR <= ~NssCntR;
end
else
if( SclkCntR != SclkCnt) begin
SclkCntR <= ~SclkCntR;
sr <= {sr[14:0],mosi};
end
end
//打算用这种方法检测上升沿
always @(posedge sclk or negedge nrst)
begin
if(!nrst)
SclkCnt <= 0;
else
SclkCnt <= ~SclkCnt;
end
always @(posedge nss or negedge nrst)
begin
if(!nrst)
NssCnt <= 0;
else
NssCnt <= ~NssCnt;
end
assign led = RegLed;
endmodule
综合后下载时运行并用逻辑分析仪分析发现结果时好时坏,
led最多有50%是显示所要的结果
而且发现SclkCnt和SclkCntR居然有时和sclk同时变化
按逻辑来说SclkCntR应该比SclkCnt和Sclk慢一个时钟的
求高手指教
是不是两个边沿触发 效果不好?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|