发新帖本帖赏金 1.00元(功能说明)我要提问
返回列表
打印
[FPGA]

求助各位大神,FPGA与MCU并行通信的问题

[复制链接]
1709|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

各位大神 ,我在做FPGA与MCU8位并行通信,自定义协议 ,在Modelsim中仿真能达到要求(如上图) ,但板子上验证时出现了一些问题 。

module talk_to_mcu
(
    inclk,rst,csn,data_in,data_out,flag_end
);
    input inclk,rst,csn;
    input [31:0]data_in;
    output [7:0]data_out;
    output flag_end;

    reg [7:0]data_out;
    reg [3:0]cnt;
   
    always @ (posedge inclk or negedge rst)
    begin
        if (!rst)
        begin
          data_out<=0;
            cnt<=0;
        end
        else if (csn)
          cnt<=0;
        else
          begin
            cnt<=cnt+1'b1;
            case (cnt)
         4'd0: data_out<={data_in[31],data_in[30:24]};
         4'd1: data_out<={data_in[23],data_in[22:16]};
         4'd2: data_out<={data_in[15],data_in[14:8]};
        4'd3: data_out<={data_in[7],data_in[6:0]};
  endcase   
        end
    end
    assign  flag_end=(cnt==4'd5)?1'b1:1'b0;
    endmodule
            
以上是我的Verilog代码。
为何不能还是不能通信呢?


相关帖子

沙发
ynhp0428|  楼主 | 2016-7-27 20:53 | 只看该作者
int   Communication ()

{       
                int a[8];
          int i,flag;
                CSN_L();
          
        for(i=0;i<4;i++)
        {
                INCLK_H();
                //delay_us(1);
                INCLK_L();
                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);
                data=data<<1;
                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);
          data=data<<1;
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);
                data=data<<1;
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);
          data=data<<1;
                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);
                data=data<<1;
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
                data=data<<1;
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);
                data=data<<1;
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
         
        }
                INCLK_H();
          delay_us(1);
                flag=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);
          INCLK_L();
          CSN_H();
                if (flag)
                        return  OK;
                else
                        return ERROR;
       
}


以上是32 的代码

使用特权

评论回复
板凳
玄德| | 2016-7-27 21:28 | 只看该作者
本帖最后由 玄德 于 2016-7-27 21:30 编辑

从程序看,
是用CPU产生时钟送给FPGA,然后从FPGA里分四次共读出32位数据。
两个程序都有问题,但主要问题是cpu方面,没有和PFGA时序配合好。

FPGA方面:
1、你先给了csn为0,这样cnt=0根本没有执行,后面自然就不对。
2、cnt超过3以后,没有复位的语句。
3、FPGA必须收到两次inclk的上升沿,才能执行到输出语句;而cpu给出的顺序不对。
这几项是大错误。
另外有毛病:
1、{data_in[31],data_in[30:24]},直接用 data_in[31:24]。不要多此一举。
2、case里面缺少default项。

cpu方面:
逐位读,然后再拼起来,也是多此一举。直接读整个寄存器就可以,不用拼。


使用特权

评论回复

打赏榜单

ynhp0428 打赏了 1.00 元 2016-07-27
理由:兵贵神速

地板
ynhp0428|  楼主 | 2016-7-27 21:36 | 只看该作者
玄德 发表于 2016-7-27 21:28
从程序看,
是用CPU产生时钟送给FPGA,然后从FPGA里分四次共读出32位数据。
两个程序都有问题,但主要问题 ...

1.csn给低是想模仿SPI里头的拉低开始传输,从Modelsim仿真时达到了效果了,cnt超过3后想发一个脉冲作为结束的标志,不过有点不明白FPGA为何必须收到两次inclk的上升沿才能执行呢?仿真里不是inclk第一个上升沿就开始传输数据了吗?

使用特权

评论回复
5
玄德| | 2016-7-27 22:06 | 只看该作者

我说两次,是因为:
csn先保持为高,然后给出第一个clk上升沿,使cnt复位为0;
csn降为低,保持,然后给出第2个clk上升沿,这时会送出数据。
这才是符合你verilog的操作过程。


使用特权

评论回复
6
ynhp0428|  楼主 | 2016-7-27 22:19 | 只看该作者
玄德 发表于 2016-7-27 22:06
我说两次,是因为:
csn先保持为高,然后给出第一个clk上升沿,使cnt复位为0;
csn降为低,保持,然后给出 ...

好的 ,感谢大神 ,我去尝试一下

使用特权

评论回复
7
407214944| | 2018-4-20 16:44 | 只看该作者

使用特权

评论回复
发新帖 本帖赏金 1.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝