找回密码
 注册
关于网站域名变更的通知
查看: 323|回复: 5
打印 上一主题 下一主题

关于FPGA与MCU8位并行通信

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-8-7 14:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

* _2 M) P0 l; e! o+ G各位大神 ,我在做FPGAmcu8位并行通信,自定义协议 ,在Modelsim中仿真能达到要求(如上图) ,但板子上验证时出现了一些问题 。  f1 j! Z! _' k* A! r! o

& R; L/ |4 f: K1 s2 [module talk_to_mcu
% x% v4 f" _- d+ i& o* \6 c4 ~(
# ~* W9 V6 t+ X    inclk,rst,csn,data_in,data_out,flag_end0 b  j! P# u) d
);7 Y8 i9 G& c6 {  Z3 h
    input inclk,rst,csn;3 {* N, X& E: A' e
    input [31:0]data_in;
' [5 v# _4 Y0 E$ y    output [7:0]data_out;
9 f: Z* Q7 ^# X- p/ e+ B    output flag_end;
. v7 y( G2 R# Y' Y! `2 V2 J) h4 F& F
0 W1 N9 X' d( u0 E" h3 G8 i& o1 E    reg [7:0]data_out;4 q3 w- e/ v7 `  k; S! l. N. H
    reg [3:0]cnt;
7 P3 A; S! H9 y8 e* R) E2 e, d0 q! G" D    ( j9 h3 S  ?: }! X
    always @ (posedge inclk or negedge rst)
% p3 N+ I+ e3 ]8 v* M    begin
1 {" m5 K8 H, r% d) g        if (!rst)
3 Z" {. s5 k7 `( u* A( ?2 b/ z* q        begin 3 J; }% V2 D! f# A
          data_out<=0;  |: U1 [7 U6 p
            cnt<=0;) W  r' Z0 r; _4 \" r: A
        end  `' O$ d% K  V# ~) V5 Y$ r6 r9 Y# d$ o
        else if (csn)
0 w0 z+ _4 ^' B( d& D          cnt<=0;
$ W3 Z" w- ^$ M" v( b5 u        else
9 {% v0 g: e$ o* N- h' m, Z          begin( q$ j+ J. l- A2 ?9 r  Y- e
            cnt<=cnt+1'b1;
" e. ^% V; l% b0 E0 O7 _2 ?            case (cnt)7 `: M$ M. k7 W9 f- W6 k/ d
         4'd0: data_out<={data_in[31],data_in[30:24]};* h$ J9 s7 V- h* D# v  r" u% K7 Z& L
         4'd1: data_out<={data_in[23],data_in[22:16]};8 F8 F8 Q: w) \; m% t  M
         4'd2: data_out<={data_in[15],data_in[14:8]};/ |* r- E" K( M8 j
        4'd3: data_out<={data_in[7],data_in[6:0]};' o) }  b7 u* B/ G4 V4 j, `" ]
  endcase    & z6 g; J4 d" I: U* _; l3 O
        end
5 k6 V. l! ~/ h/ N3 ^    end ; _2 @, |8 o; W/ f8 v0 \
    assign  flag_end=(cnt==4'd5)?1'b1:1'b0;
0 M# x& X0 F( F% O. V% U* m+ ]0 k    endmodule   {" f0 r1 X4 }
            
) [: ]# K! |) M/ @以上是我的Verilog代码。) ]# q- t: v; I) o7 R  J
为何不能还是不能通信呢?
3 @2 C& C2 A; u7 _* O
% }+ Y& Z/ ]8 w/ A+ [+ B2 K1 O; U' i8 G* j

该用户从未签到

2#
 楼主| 发表于 2019-8-7 14:19 | 只看该作者

% V9 \5 _& V; L! R# [int   Communication ()
. M2 e/ Q: ?( _6 W  u, b
- e+ P. d4 h# ^( J  a{        
0 U$ H) x4 t4 |# z7 p* z7 r- _2 Z                int a[8];. t4 @* S% s) H- O0 t
          int i,flag;
, i4 Q4 F/ Y: R6 e2 P4 H8 J                CSN_L();  X2 L( X5 ?) D
         
$ i- r0 K' w+ G4 Y. c6 Q        for(i=0;i<4;i++)7 y9 U: h) U- g; K. @4 W
        {5 Q* q+ x4 S& S( S. w0 a
                INCLK_H();
/ e  _- X& R/ _                //delay_us(1);
1 P+ s& v, [/ z4 N8 h! f* D# R# Z                INCLK_L();9 V) @+ a6 A5 I; l
                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);
  W7 S2 L: `+ k% l8 q0 R                data=data<<1;
; E2 F) C5 ^4 x) O! T; ^                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);1 Y/ O9 [! ~& G
          data=data<<1;
7 \$ N; F( O: O% |+ I          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);
8 ?6 d# d# g; \5 \) K- N                data=data<<1;2 _/ E* P( m+ g5 @, k' J: R6 V9 K% @
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);
) A5 ~5 `: d, r" e1 g. H          data=data<<1;
" ?$ h1 g/ W' e* f0 m                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);
. T) p8 T+ j3 p! ?- X8 K                data=data<<1;* L( N/ F! P2 q
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
  [7 j% w$ }, b0 X5 W& g                data=data<<1;. V5 s+ K  J+ |- w. D. L; f
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);
( o( Q: |1 {9 d$ G0 X0 G                data=data<<1;. V) d& \1 g! B1 W" W
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);- C6 y' A  @- h" k; @
         
8 |: [4 Q1 M( j: }+ R) t* I4 [        }
7 T; L  M9 j) A                INCLK_H();
& R2 B+ j. f5 S! X! Q: M          delay_us(1);
$ u1 n0 V4 d# C  ?7 _* n                flag=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);7 u. g$ I) I/ G6 \  M
          INCLK_L();- l3 u" o8 t  x( h! k
          CSN_H();. u* d$ Y' R" N$ f
                if (flag)
  C. n2 L( r/ D" o1 }$ }                        return  OK;
$ ]6 g0 S: {& g' h; O8 Q7 J" s2 R                else
2 H1 j% p3 b) _% U                        return ERROR;! y( b4 i4 Y& k$ a0 f# N) l
        
4 H  M: d4 J. ~9 G6 p}; ?) H+ I1 B, O& j' D* B7 R
复制代码$ ?$ V( @' N; U9 ~

& ~, h0 f* T& Q6 z1 b9 m, H* P2 p/ f9 v5 U
以上是32 的代码。

该用户从未签到

3#
发表于 2019-8-7 16:23 | 只看该作者
从程序看,- R8 {( ^" P! O6 O* j$ N$ Q
是用CPU产生时钟送给FPGA,然后从FPGA里分四次共读出32位数据。( N7 Z( \' }( f8 F1 q! J" e3 J# l
两个程序都有问题,但主要问题是cpu方面,没有和PFGA时序配合好。4 i: {% J5 d# ~3 Z* i  @
8 F6 K% N9 u( O5 z) o1 C3 k
FPGA方面:
/ t1 n% j+ s8 Y- |2 o% w1、你先给了csn为0,这样cnt=0根本没有执行,后面自然就不对。
( o' }# O. ]2 ?  ~2、cnt超过3以后,没有复位的语句。
% R2 ?" }5 i* v5 E# g3、FPGA必须收到两次inclk的上升沿,才能执行到输出语句;而cpu给出的顺序不对。
# H1 i/ r+ L& i这几项是大错误。
9 q5 k; n; I; g另外有毛病:2 x. X3 ]% e5 f, o% _+ Y8 E
1、{data_in[31],data_in[30:24]},直接用 data_in[31:24]。不要多此一举。
# L4 d" J) D( c( W  _& x( g2、case里面缺少default项。
" \: `& x. w* K+ _4 z& Y- h
8 l4 A2 |3 a; Ycpu方面:: W+ p* X5 l0 C( a  ~' H! I
逐位读,然后再拼起来,也是多此一举。直接读整个寄存器就可以,不用拼。

点评

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

该用户从未签到

4#
 楼主| 发表于 2019-8-7 16:24 | 只看该作者
A-Lin 发表于 2019-8-7 16:23
) l# L' L; N1 Z. T( s! v从程序看,
: i/ t' T% {$ B, t! J( o: S# @是用CPU产生时钟送给FPGA,然后从FPGA里分四次共读出32位数据。$ s. O1 }3 i( n; r
两个程序都有问题,但主要问 ...

/ Y4 B* t; V% ]0 d1.csn给低是想模仿SPI里头的拉低开始传输,从Modelsim仿真时达到了效果了,cnt超过3后想发一个脉冲作为结束的标志,不过有点不明白FPGA为何必须收到两次inclk的上升沿才能执行呢?仿真里不是inclk第一个上升沿就开始传输数据了吗?
+ L- y9 ]7 @6 @6 c7 k4 K

点评

是因为: csn先保持为高,然后给出第一个clk上升沿,使cnt复位为0; csn降为低,保持,然后给出第2个clk上升沿,这时会送出数据。 这才是符合你verilog的操作过程。  详情 回复 发表于 2019-8-7 16:24

该用户从未签到

5#
发表于 2019-8-7 16:24 | 只看该作者
cat12620 发表于 2019-8-7 16:24
& D, z9 L3 i; H1.csn给低是想模仿SPI里头的拉低开始传输,从Modelsim仿真时达到了效果了,cnt超过3后想发一个脉冲作为结 ...

; Q2 e) y* a! Z. z; a" i
1 v* \* z2 o8 w是因为:  R6 r  n4 |; k( L8 ~
csn先保持为高,然后给出第一个clk上升沿,使cnt复位为0;
" A% X7 H3 m4 o; s8 y" i% J# ^csn降为低,保持,然后给出第2个clk上升沿,这时会送出数据。
$ e  ?# \1 d: B- y0 j8 K7 f这才是符合你verilog的操作过程。

点评

好的 ,感谢大神 ,我试一下。  详情 回复 发表于 2019-8-7 16:25

该用户从未签到

6#
 楼主| 发表于 2019-8-7 16:25 | 只看该作者
A-Lin 发表于 2019-8-7 16:24; d3 k. v  n1 [8 C
是因为:
6 h" H1 v# j) S4 q0 Y5 [- hcsn先保持为高,然后给出第一个clk上升沿,使cnt复位为0;
4 o; X6 J) c* Y: ocsn降为低,保持,然后给出第2个 ...

: b9 n4 c- E. Q; N, a% ]- m8 L6 L. M- b8 V' p3 ?0 H4 `% H
好的 ,感谢大神 ,我试一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-12 21:02 , Processed in 0.156250 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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