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

[复制链接]
 楼主| ynhp0428 发表于 2016-7-27 20:51 | 显示全部楼层 |阅读模式

各位大神 ,我在做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 | 显示全部楼层
  1. int   Communication ()

  2. {       
  3.                 int a[8];
  4.           int i,flag;
  5.                 CSN_L();
  6.           
  7.         for(i=0;i<4;i++)
  8.         {
  9.                 INCLK_H();
  10.                 //delay_us(1);
  11.                 INCLK_L();
  12.                 data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);
  13.                 data=data<<1;
  14.                 data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);
  15.           data=data<<1;
  16.           data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);
  17.                 data=data<<1;
  18.           data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);
  19.           data=data<<1;
  20.                 data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);
  21.                 data=data<<1;
  22.           data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
  23.                 data=data<<1;
  24.           data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);
  25.                 data=data<<1;
  26.           data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
  27.          
  28.         }
  29.                 INCLK_H();
  30.           delay_us(1);
  31.                 flag=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);
  32.           INCLK_L();
  33.           CSN_H();
  34.                 if (flag)
  35.                         return  OK;
  36.                 else
  37.                         return ERROR;
  38.        
  39. }


以上是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第一个上升沿就开始传输数据了吗?
玄德 发表于 2016-7-27 22:06 | 显示全部楼层

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


 楼主| ynhp0428 发表于 2016-7-27 22:19 | 显示全部楼层
玄德 发表于 2016-7-27 22:06
我说两次,是因为:
csn先保持为高,然后给出第一个clk上升沿,使cnt复位为0;
csn降为低,保持,然后给出 ...

好的 ,感谢大神 ,我去尝试一下
407214944 发表于 2018-4-20 16:44 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部