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

关于FPGA与MCU8位并行通信

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
& I% r- J2 V; _/ }2 _
各位大神 ,我在做FPGAmcu8位并行通信,自定义协议 ,在Modelsim中仿真能达到要求(如上图) ,但板子上验证时出现了一些问题 。
! t  f$ l1 P/ _: H/ f1 \
1 u# t1 q! k$ ~0 N- K& nmodule talk_to_mcu% K- B4 P' `7 r7 E) C8 B& x! s: Q$ B
(8 F7 k( ]+ B2 b, J
    inclk,rst,csn,data_in,data_out,flag_end' A: K, J2 \% w, R
);
& T- o0 b9 y$ x7 |; N7 \& ^0 L! T    input inclk,rst,csn;+ Q* y: L8 @& v+ F! M$ l8 {3 V7 ]1 t
    input [31:0]data_in;3 M1 c7 V+ r+ d* y0 t  {* r4 l
    output [7:0]data_out;
- l# N$ j( r3 p# \$ N' d    output flag_end;
2 @$ @1 \& T0 ~" c7 m7 w& U2 P9 @8 R8 [- g0 N  Z: y8 f4 {
    reg [7:0]data_out;! {5 a/ w4 L4 B7 G6 n) P, B
    reg [3:0]cnt;) c# {* a6 o) p# z2 }: w% u' T) B1 Z
    2 r, M0 q, J  O6 R7 ]0 `9 g
    always @ (posedge inclk or negedge rst)
% e; D9 J6 E! Q( \0 a3 o+ X    begin * x& O. P2 F) U, Y2 r  M
        if (!rst)1 q6 V9 U$ E4 q. X( b3 v& Y
        begin
) {( r! e# y$ Y8 m) V- |$ o" ~          data_out<=0;$ c- S( F7 t8 i
            cnt<=0;- R% H- c: a) H! j7 k( F% Y( l
        end
. I  U% e% c1 `3 a4 w/ Y  s# \        else if (csn); Q0 v! ^9 V/ d: z- ~7 P8 s. H0 W+ n7 T
          cnt<=0;2 k: i8 Q+ ?; V6 \
        else6 v6 R: W9 T" p& @; {
          begin
! d( o. N% k( c6 \  G" S& G: E            cnt<=cnt+1'b1;
  D# w( C: b# b: G5 U3 @9 t; }" K' Q            case (cnt)
; d* s( L  S9 ]1 m; r         4'd0: data_out<={data_in[31],data_in[30:24]};
( x9 K6 W6 e+ i- T0 w. J         4'd1: data_out<={data_in[23],data_in[22:16]};
' y5 ~$ Z, I: d7 a8 p8 Q& M         4'd2: data_out<={data_in[15],data_in[14:8]};
" c# b9 E9 p) y+ o: `* z9 h        4'd3: data_out<={data_in[7],data_in[6:0]};6 S4 v1 v. W7 [( q* F* H
  endcase    ( z0 `* _% |8 ~* l
        end5 X- ?7 y5 w! ?+ R: z2 _* C: ]
    end # I( _' K0 `$ Q3 A0 _# U
    assign  flag_end=(cnt==4'd5)?1'b1:1'b0;
1 J  z% ^5 f: R    endmodule
, P0 R! t, b" S4 n2 y) d            % ?+ x, p/ E/ x% c. S/ I
以上是我的Verilog代码。
. b: `% @# `, N; v0 z; {为何不能还是不能通信呢?
: N6 i/ |! U# j  q4 H8 V4 O8 `- N. r, T  E# ^1 |9 ]

) T& \$ Z" D$ w) V% H0 m

该用户从未签到

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

% X! u0 s; H3 H' H. Y" Gint   Communication ()( ?. h3 c5 M& |( ^" H4 Y: z

- r" Y3 D) l  j0 Y# z$ Z{        
% X1 J! w: b% r0 \7 L                int a[8];
# z" i; e1 \2 _; \1 d          int i,flag;
- v! ?( `# J8 t& P2 |- c                CSN_L();
  u7 u( l1 A, @* ~8 a         
. A5 F6 f+ g1 R+ T1 I6 W        for(i=0;i<4;i++)7 |$ O& O8 s) V; o
        {
$ S+ E; o2 z9 f2 Z% H' p                INCLK_H();
: e8 p. S5 D( |$ d                //delay_us(1);
) X8 K! G$ Y+ C6 v                INCLK_L();
. [! v0 Q  l, Z0 F% r8 i                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);! I4 L1 P! e  ]( [8 A
                data=data<<1;. `/ y% J; ]* {
                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6);, g- ^+ P# R. |
          data=data<<1;/ }) S7 R3 i3 d9 T9 v
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);
  X/ t) ]3 z! y! T                data=data<<1;4 u1 C, s+ h1 D* b  {: D  P2 q& ^
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);" A. \1 u, j' b/ `1 f- f( h) A% y% `# t
          data=data<<1;
# x( R$ y+ i+ F; T                data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3);
8 v' j9 c; ]7 @5 }2 u                data=data<<1;
* @" S6 z4 O. i5 p          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);9 |; t. Q6 t! n# e4 \
                data=data<<1;
+ J; E( W- R) `, R: v1 k          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1);
1 A$ c1 _7 S! N) E0 [                data=data<<1;& T+ X: v" [+ X1 O
          data|=GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);0 S" F* E) B+ R
         * \9 j$ ~2 b) l
        }
. @, p+ m: R9 S4 A8 a, _& m                INCLK_H();
* h6 z- `: }! r          delay_us(1);
5 E0 L4 Q0 X7 K, G/ h' _                flag=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);
4 A$ B+ e" f+ }# K; ?" \' M          INCLK_L();; T$ I8 J1 |4 j; e
          CSN_H();4 |0 q; D3 O$ ]/ ~
                if (flag)! ^: P. U5 t9 N4 I- c) I
                        return  OK;/ x: n: ]& n+ v( q, f! y7 e, a
                else 7 {1 q  q4 ?1 u: }! {
                        return ERROR;1 G1 W% D+ `, [1 s9 k
        ; L' N5 s/ c/ R# \/ [9 t
}' E" @, n; k/ W( Q3 n# I4 x6 k
复制代码
; J& V8 {4 S% }2 l- o- Y
: B% N2 Q' |8 S1 A7 x- y. s6 l- g; R3 q2 D
以上是32 的代码。

该用户从未签到

3#
发表于 2019-8-7 16:23 | 只看该作者
从程序看,
3 n) P, }* G6 b( i, ^是用CPU产生时钟送给FPGA,然后从FPGA里分四次共读出32位数据。1 }. `6 r! q( J+ f
两个程序都有问题,但主要问题是cpu方面,没有和PFGA时序配合好。9 x+ @% v* e2 }5 l
$ M% l% E" p: v9 {& D0 m2 D
FPGA方面:
: g) g1 c5 b, ], A; F1、你先给了csn为0,这样cnt=0根本没有执行,后面自然就不对。
( L% u5 v! f" K2、cnt超过3以后,没有复位的语句。. {+ D. I, Q5 a: s
3、FPGA必须收到两次inclk的上升沿,才能执行到输出语句;而cpu给出的顺序不对。5 W9 U7 `$ L* V
这几项是大错误。0 V& \7 ]+ z/ E$ O- q
另外有毛病:) L3 i% }7 z* R
1、{data_in[31],data_in[30:24]},直接用 data_in[31:24]。不要多此一举。
, Q1 l1 W9 K; ]8 D2、case里面缺少default项。  e. n$ O% }% l
+ D/ _. z& H* q5 Y3 f8 Y& V# ]' h! a: [
cpu方面:
! i- s& u  P6 R0 T: c- M+ Q逐位读,然后再拼起来,也是多此一举。直接读整个寄存器就可以,不用拼。

点评

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
# K7 z1 D/ P9 ]从程序看,
' W/ V& I  C. y5 t7 y& t' H# v是用CPU产生时钟送给FPGA,然后从FPGA里分四次共读出32位数据。1 j% q3 c  q" Z/ x: j+ Z
两个程序都有问题,但主要问 ...
! z, ]2 r# L- l, j3 L$ }; F3 d) g
1.csn给低是想模仿SPI里头的拉低开始传输,从Modelsim仿真时达到了效果了,cnt超过3后想发一个脉冲作为结束的标志,不过有点不明白FPGA为何必须收到两次inclk的上升沿才能执行呢?仿真里不是inclk第一个上升沿就开始传输数据了吗?
1 E1 C9 T* {! C" H) x

点评

是因为: 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
, `# s# S# p+ Y0 ?: q' w1 d1.csn给低是想模仿SPI里头的拉低开始传输,从Modelsim仿真时达到了效果了,cnt超过3后想发一个脉冲作为结 ...

1 B5 \! @& F/ q6 b/ B6 u/ `7 `1 N. U
) F% M: y8 f$ [6 I0 h是因为:
9 ~3 s' B' h. |  B. n6 s3 k  Wcsn先保持为高,然后给出第一个clk上升沿,使cnt复位为0;
6 a1 a; ?+ j$ Q% z; ~( b- g, Ncsn降为低,保持,然后给出第2个clk上升沿,这时会送出数据。8 A5 C4 s& ^7 h9 P2 U/ R% S- r
这才是符合你verilog的操作过程。

点评

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

该用户从未签到

6#
 楼主| 发表于 2019-8-7 16:25 | 只看该作者
A-Lin 发表于 2019-8-7 16:24
4 Z% @" R" d4 F# k是因为:6 O) \  L; N6 ~) [0 P
csn先保持为高,然后给出第一个clk上升沿,使cnt复位为0;
- g- E1 J  t0 r" t9 r$ C& Pcsn降为低,保持,然后给出第2个 ...
9 s8 ~+ B) u7 F4 h

8 |# |/ v/ T3 j& Z0 k0 t8 x6 b; c* R好的 ,感谢大神 ,我试一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-16 07:53 , Processed in 0.140625 second(s), 32 queries , Gzip On.

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

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

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