搜索
bottom↓
回复: 7

请教大侠,为何用verilog编写的SPI从机在quartusII上编译零警告,时序仿真也通过,就是无

[复制链接]

出0入0汤圆

发表于 2010-8-17 20:53:56 | 显示全部楼层 |阅读模式
//设计的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 [7:0]u8Send;    //fpga程序通过该接口将一个字节发往外部
output [7:0]u8Recv;   //fpga程序通过该接口将主机传过来的数据接收
output SigRecv;      //该信号的上升沿表示已有一个字节接收到了,在u8Recv里面
output MISO;         //MISO
input SCK,CS,MOSI;   //SPI 接口

reg MISO;
reg tmpMOSI;
reg [6: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     //如果是一个字节的开始,则先将u8Send的数据锁存在移位寄存器里面
             StartFlag=1;
             MISO=u8Send[7];
             ShiftReg=u8Send[6:0];
         end
         else begin                //不是一个字节的开始,则移位寄存器工作
             MISO=ShiftReg[6];         
             ShiftReg[6:0]={ShiftReg[5:0],tmpMOSI};
         end
      end
      
end

always @(negedge SCK)begin
        tmpMOSI=MOSI;           //在下降沿所存主机传过来的信号
end──

assign SigRecv=CS;
assign u8Recv[7:0]={ShiftReg[6:0],tmpMOSI};

endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-8-17 22:38:29 | 显示全部楼层
拿示波器测一下接口上相关的信号看看,是否符合SPI协议的时序。

出0入0汤圆

 楼主| 发表于 2010-8-17 22:42:54 | 显示全部楼层
完全符合。。就是用示波器测试的。。MISO 完全没有信号返回

出0入0汤圆

发表于 2010-8-18 01:09:30 | 显示全部楼层
我近期也在研究FPGA和单片机的模拟SPI通信的问题,我用的是PIC18F452,有SPI接口,所以只要FPGA模拟即可,写的代码仿真貌似是对的,但对于用到和单片机通信却发现自己不会写了

出0入0汤圆

发表于 2010-8-18 01:11:02 | 显示全部楼层
module spi(sclk        ,cs        ,data_Tx,data_Rx,miso,mosi);
parameter n=8;
input sclk,cs;
input  mosi;        //单片机的数据通过串行方式一位一位通过此端口进入FPGA
input [n-1:0]data_Tx;        /*FPGA要发送出去的数据,
                                                此数据来源可以是FPGA内部其他模块输出来的数据,
                                                通过此端口进入SPI模块,发送给单片机*/

output miso;//FPGA的数据通过此端口以串行方式输出到单片机

output [n-1:0]data_Rx;//FPGA已接收数据,N位_参数化
reg miso;
reg [n-1:0]data_Rx;
reg  [2:0]i;
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

出0入0汤圆

发表于 2010-8-18 01:17:49 | 显示全部楼层
我想实现的一个简单的功能,就是将单片机发送的数据写到FPGA的RAM里,将RAM理的数据读到单片机里,请教各位大侠

出0入0汤圆

 楼主| 发表于 2010-8-18 22:47:19 | 显示全部楼层
楼上的。参考我的程序就可以了啊

出0入0汤圆

发表于 2010-8-20 09:56:01 | 显示全部楼层
相信还是时序的问题,好好想想,在always模块触发条件满足的时候数据是不是就绪了,如果数据到达的时间和触发条件(比如下降沿)同时满足,很可能就会造成没有有效数据写或者读。以前遇到过此类问题,不知道对楼主又没帮助。我是个菜鸟,多学习。多学习。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 17:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表