zf12862177 发表于 2010-8-17 20:53:56

请教大侠,为何用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

flamingwave 发表于 2010-8-17 22:38:29

拿示波器测一下接口上相关的信号看看,是否符合SPI协议的时序。

zf12862177 发表于 2010-8-17 22:42:54

完全符合。。就是用示波器测试的。。MISO 完全没有信号返回

sujiebin 发表于 2010-8-18 01:09:30

我近期也在研究FPGA和单片机的模拟SPI通信的问题,我用的是PIC18F452,有SPI接口,所以只要FPGA模拟即可,写的代码仿真貌似是对的,但对于用到和单片机通信却发现自己不会写了

sujiebin 发表于 2010-8-18 01:11:02

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

sujiebin 发表于 2010-8-18 01:17:49

我想实现的一个简单的功能,就是将单片机发送的数据写到FPGA的RAM里,将RAM理的数据读到单片机里,请教各位大侠

zf12862177 发表于 2010-8-18 22:47:19

楼上的。参考我的程序就可以了啊

hellonemo 发表于 2010-8-20 09:56:01

相信还是时序的问题,好好想想,在always模块触发条件满足的时候数据是不是就绪了,如果数据到达的时间和触发条件(比如下降沿)同时满足,很可能就会造成没有有效数据写或者读。以前遇到过此类问题,不知道对楼主又没帮助。我是个菜鸟,多学习。多学习。
页: [1]
查看完整版本: 请教大侠,为何用verilog编写的SPI从机在quartusII上编译零警告,时序仿真也通过,就是无