请教大侠,为何用verilog编写的SPI从机在quartusII上编译零警告,时序仿真也通过,就是无
//设计的SPI仿真时序是,CLK:____|---|____|---|____|---|____|---|____|---|____|---|____|---|____|---|____
CS :--|__________________________________________________________________________|--
MOSI:______________________________________________________________________________全部是低电平】
MISO :___|--------|________|--------|________|--------|_________|--------|___________
该SPI的使用的是,上升沿发送数据,下降沿接收数据,CS低电平有效
仿真是完全没有问题,可是就是烧写进程序后,用逻辑发生器去模拟信号,MOSI完全没有响应
无论是在仿真还是在实际上,我已经对通过另一个模块对u8Send加了一个8'b10101010数据,可是实际电路就是出来来。急死了
用的芯片是maxII
该SPI接口只用了10个逻辑单元,悲剧啊。请高手指教下。是不是有什么地方不对?
module SPI_Slaver(u8Send,u8Recv,SigRecv,MOSI,MISO,SCK,CS);
input u8Send; //fpga程序通过该接口将一个字节发往外部
output u8Recv; //fpga程序通过该接口将主机传过来的数据接收
output SigRecv; //该信号的上升沿表示已有一个字节接收到了,在u8Recv里面
output MISO; //MISO
input SCK,CS,MOSI; //SPI 接口
reg MISO;
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 //如果是一个字节的开始,则先将u8Send的数据锁存在移位寄存器里面
StartFlag=1;
MISO=u8Send;
ShiftReg=u8Send;
end
else begin //不是一个字节的开始,则移位寄存器工作
MISO=ShiftReg;
ShiftReg={ShiftReg,tmpMOSI};
end
end
end
always @(negedge SCK)begin
tmpMOSI=MOSI; //在下降沿所存主机传过来的信号
end──
assign SigRecv=CS;
assign u8Recv={ShiftReg,tmpMOSI};
endmodule 拿示波器测一下接口上相关的信号看看,是否符合SPI协议的时序。 完全符合。。就是用示波器测试的。。MISO 完全没有信号返回 我近期也在研究FPGA和单片机的模拟SPI通信的问题,我用的是PIC18F452,有SPI接口,所以只要FPGA模拟即可,写的代码仿真貌似是对的,但对于用到和单片机通信却发现自己不会写了 module spi(sclk ,cs ,data_Tx,data_Rx,miso,mosi);
parameter n=8;
input sclk,cs;
inputmosi; //单片机的数据通过串行方式一位一位通过此端口进入FPGA
input data_Tx; /*FPGA要发送出去的数据,
此数据来源可以是FPGA内部其他模块输出来的数据,
通过此端口进入SPI模块,发送给单片机*/
output miso;//FPGA的数据通过此端口以串行方式输出到单片机
output data_Rx;//FPGA已接收数据,N位_参数化
reg miso;
reg data_Rx;
regi;
always @(posedge sclk )
begin
if(cs==1)
begin
i<=n-1'b1;
miso<=1'bz;
end
else
begin
data_Rx<=mosi;
miso <= data_Tx;
i <= i-3'b1;
if (i==0)
i <= n-1'b1;
end
end
endmodule 我想实现的一个简单的功能,就是将单片机发送的数据写到FPGA的RAM里,将RAM理的数据读到单片机里,请教各位大侠 楼上的。参考我的程序就可以了啊 相信还是时序的问题,好好想想,在always模块触发条件满足的时候数据是不是就绪了,如果数据到达的时间和触发条件(比如下降沿)同时满足,很可能就会造成没有有效数据写或者读。以前遇到过此类问题,不知道对楼主又没帮助。我是个菜鸟,多学习。多学习。
页:
[1]