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

求助大神帮看看CPLD做SPI从的程序,非常感谢!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-22 10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
本帖最后由 ygcgsa 于 2019-4-22 11:16 编辑 * Q! }. t9 A& ~
3 e" F3 R" q, V: A2 F. n, A
2 }; f/ G7 e+ b. w3 c4 x
我是用STM32和EPM240做SPI通信,STM32为主SPI,cpld为从SPI,8位通信,将always@(posedge CS_N or negedge rst_n) 下的   o. B( i% z9 I4 u  Y- z' ]' \
else
; g+ K6 p% \$ v* y        begin7 E5 q  P8 k9 h) V. b5 p0 R
            txd_data <=txd_data+1'b1;   
5 @- I* T2 w1 E* N        end+ G, x8 R, ?: G& v3 b
换成 txd_data <=5'b11100;(固定赋值)或txd_data <=rxd_data,数据都可以正常传输给STM32,但是当换成txd_data+1'b1后,每次加的值都不对,我实测了几组数据大概如下:
; C) X$ N4 B( A+ c4 s" [; q1,5,9,13,17,22,24,27,30,16,35,38,41,46,48) g: i% O& \  A8 P
1,5,9,13,17,22,24,27,30,16,35,39,42,47,51有一定的重复规律性
2 G+ O+ U% X7 g+ |4 Q+ T  H& d查了CS_N信号的边沿,也没有发现有多个上升沿,百思不得其解,情高手帮忙看看代码有没有问题6 \5 V" W3 j2 U3 O, m

* F3 T3 P/ N2 Dmodule spi(clk,rst_n,CS_N,SCK,MOSI,MISO,rxd_data);5 Z# ~: W1 ?% u( N
input clk;               //CPLD时钟,50MHZ3 s8 V3 d/ c8 p4 h) y' t
input rst_n;8 t+ W" g6 X6 Q7 `$ a9 b% X  X
input CS_N;
! O2 F+ ^6 p( l# V! Zinput SCK;             //STM32发送的SPI时钟,实测周期2uS. a2 p. c+ l: y9 M/ b$ Q
input MOSI;; G/ G5 y/ J( a3 l0 u
reg [7:0] txd_data;
. b' L# ?6 N+ J# Zoutput reg MISO;
, }7 Z" k  \: ?$ nreg [7:0] rxd_data;
. q( I) V3 S7 T' \. i9 x: h) Toutput [7:0] rxd_data;& ?/ {8 n9 C& v' B$ o+ e9 m

1 Y3 ^* V5 j1 B" o; X% |3 n
+ N- k. M+ n& h- [( b
; `0 R6 b% a9 q+ Q6 d4 J! h//-------------------------capture the sck-----------------------------         
3 f9 t9 F9 O9 q8 _reg sck_r0,sck_r1;+ S1 r. I" _' {' {
wire sck_n,sck_p;
5 F3 b+ ^6 X  I% @9 {always@(posedge clk or negedge rst_n)/ |8 p9 t0 T- d
begin
4 |5 b% Y0 F3 o- b    if(!rst_n)
: U, K6 `1 G* G/ g( O: D        begin
4 J: T8 P* c1 h, k. c$ Y            sck_r0 <= 1'b1;   //sck of the idle state is high
7 d% I* `" s" j9 F            sck_r1 <= 1'b1;
* J9 w1 O' s8 Y- L/ e; |        end7 w. N1 e- I8 P; `/ a
    else
; _+ w1 e7 n' k* G) d8 s. O        begin
# p( I. L: |4 O' V5 x3 `            sck_r0 <= SCK;# E: Z/ x# ~, [8 P
            sck_r1 <= sck_r0;, M: O! _2 _* I" y- s) A) j
        end
7 U) I0 H. r0 |* R# V7 P! T  ?end
2 N2 p; b" S6 `: |2 g! w! d2 l  b
assign sck_n = (~sck_r0 & sck_r1)? 1'b1:1'b0;   //capture the sck down
" z0 `) M! `+ r5 hassign sck_p = (~sck_r1 & sck_r0)? 1'b1:1'b0;   //capture the sck up) [8 T3 L# p- n" M1 Q9 l

' m* I) b2 `0 h) {& t9 T, ^' I/ H) E# l0 e2 m& z
//-----------------------spi_slaver read data-------------------------------
. J" a+ M$ X! q4 _7 W8 V4 e9 Vreg rxd_flag_r;
* q/ O( W  u1 _reg [2:0] rxd_state;: I. ]0 `6 x: N: g8 A( m4 }* i& I3 b
always@(posedge clk or negedge rst_n)9 a& R  P' `: f
begin
* {  J3 M4 z% R: T4 m    if(!rst_n)3 n& ^' f+ M  [4 G( F0 w$ ?% _& D
        begin
- G( I9 P# i: O            rxd_data <= 1'b0;" K" \+ }' k' H3 X
            rxd_flag_r <= 1'b0;- \2 P) Z* V7 S7 D2 X
            rxd_state <= 1'b0;% o* L6 G$ T# L6 }4 k0 ?! a
        end5 W+ t! }, W! u. h
    else if(sck_n && !CS_N)  
. f/ H! k* z% {6 w        begin6 e6 A' Z2 M2 D( `$ y, m
            case(rxd_state)
, E" ~3 Z  X; Q3 I+ Z0 \0 w" u* Q                3'd0:begin
: C* N$ |: w2 j5 J9 |- f                        rxd_data[7] <= MOSI;/ O7 W# S+ b% `# d& D8 H  R/ \6 ~# k
                        rxd_flag_r <= 1'b0;  //reset rxd_flag
: X4 Z' c. g( z- F% q3 S( V                        rxd_state <= 3'd1;
% K' W& u/ Y" {+ G3 |# S% f& I                      end: j0 G# \6 }" I' K' w/ t! m& G
                3'd1:begin
3 V0 B8 Q3 A# d9 U/ d% \                        rxd_data[6] <= MOSI;5 B2 H! j- `9 u& b3 ^' V5 h
                        rxd_state <= 3'd2;+ e% Y% i2 c$ v  h# T( |# o% X  \6 E" w
                      end3 b, n! F+ Z7 z, h: X
                3'd2:begin/ a4 @: d6 G! _, Z
                        rxd_data[5] <= MOSI;. U. p0 n# g) s  V* g, x6 S
                        rxd_state <= 3'd3;
3 ^& v/ U0 Q1 I( s% R# H- j                      end* b0 X. v. Z* H5 q# x
                3'd3:begin
  |* g, Z8 k: I0 {" m) J                        rxd_data[4] <= MOSI;+ j' }% r& j* l3 m2 T& N( F, l- `  q
                        rxd_state <= 3'd4;, V. l2 |. r$ U' D" D+ o& ^% ~
                      end
) b  v, h' W: E5 r' H5 L* W$ W                3'd4:begin
8 t: h& D; k6 l3 N                        rxd_data[3] <= MOSI;
* g. n; N: D1 |: }$ ~                        rxd_state <= 3'd5;
, Y/ _  `$ u" d, S; N: k' _6 `1 z                      end- g# A$ d$ K2 \- k% Z. p+ N
                3'd5:begin$ k1 k2 _0 a3 {, T  o4 w: o
                        rxd_data[2] <= MOSI;1 s7 R, o. Y* ]% U, P. w
                        rxd_state <= 3'd6;
( w/ u1 v. l" l. ]                      end+ S- O5 C& r  X9 S; o. @
                3'd6:begin
. w6 T! e3 f2 N5 b4 k7 T                        rxd_data[1] <= MOSI;
6 K, Y! y( q" D, H; Y( ?                        rxd_state <= 3'd7;
6 n* o) v' A  J  h7 a8 W                      end% [* B5 |2 f( J3 G
                3'd7:begin) U9 u6 K2 m, K* r+ z6 a
                        rxd_data[0] <= MOSI;) M& }$ o" [7 R& O2 q
                        rxd_flag_r <= 1'b1;  //set rxd_flag7 v0 s+ Q' c3 a6 O5 x
                        rxd_state <= 3'd0;
: w7 j1 A+ N9 s2 P$ A7 V                      end3 k, v2 d- B% u( U6 p$ {1 f9 A
                default: ;+ Q6 u4 R9 V# V7 ]& K" n
            endcase& @* R$ A3 R; q+ f1 o5 M, F
            / T2 n3 z$ a- s) o( e( l
        end
$ p& N. F! x- r! Q6 K- R. E; y6 H8 jend, `% s8 ?0 X6 }' B  _
always@(posedge CS_N or negedge rst_n)          //当CPLD捕捉到SPI_CS信号的上升沿时,要给STM32发送的数据加1' A3 u4 t4 R: r! v% Q0 f
begin" h. O% d% V5 J5 R
    if(!rst_n)
4 e' W& }* o$ `; \6 P2 P/ w        begin. ^" m3 G% p' L0 i% E/ {  b7 V3 j
            txd_data <= 1'b0;2 \' R+ V/ X0 L% m) F4 ?8 K
        end  p4 X% W6 L0 X3 T
    else$ B4 R7 |: P# k
        begin; h5 I1 i5 x$ r4 y
            txd_data <=txd_data+1'b1;   6 d" G4 _: v5 l: w
        end9 ^9 [5 j1 G( r& Z) `& Z( C+ _
end
$ j& D  I  R) Q9 N; |1 L) m7 b//---------------------spi_slaver send data---------------------------8 e$ |0 |, t9 f6 q
reg [2:0] txd_state;
! n; V) q# X; E! J1 A2 malways@(posedge clk or negedge rst_n)2 R' ^4 m9 O' \, g
begin# Z# X% ^# ~) f* D3 `
    if(!rst_n)
8 }% T, k9 X  E3 r/ V/ a$ z5 n6 e6 H; R        begin( X5 S9 w) O) ^0 V( K
            txd_state <= 1'b0;2 ], c: U) ]4 o/ Y9 a5 R
            MISO <=1'b0;
2 a# s, n, g6 G$ V4 C- l            
' w$ F! i4 y/ B        end- b! R3 K# s) y5 E0 |) _) X4 J
    else if(sck_p && !CS_N)
: n. {) _# r# d* T6 S( y        begin/ t# ^, _9 O6 C  L3 A) z7 H
            case(txd_state)7 {: ]. k% L3 j4 s3 C0 O/ p
                3'd0:begin0 U. U9 S: K% L' _
                        MISO <= txd_data[7];, N0 R4 n) g- }4 X; s
                        txd_state <= 3'd1;3 ?$ D" b& b) o5 n7 Q: b% r
                      end
# B' Q; L$ F/ y5 S                3'd1:begin
6 E+ Y1 T# |7 J: h                        MISO <= txd_data[6];
- r3 c" [9 J, b8 x( v) ^                        txd_state <= 3'd2;0 G$ s: ~, H$ B: ?* x
                      end
: G3 B# o/ e" |% z8 ^                3'd2:begin& O- J' j) e7 M
                        MISO <= txd_data[5];
$ t2 e# b3 G4 L0 j  g                        txd_state <= 3'd3;0 M, {' a% U0 F. H9 S9 z3 h
                      end
" ?; @3 \% F& V  J0 `. U3 M                3'd3:begin/ ?5 G3 J% X8 K8 h( a' C) u
                        MISO <= txd_data[4];6 ^7 a4 \! D* U! y- Y/ a
                        txd_state <= 3'd4;  v5 Z0 H$ v5 ^+ A2 e& j
                      end
1 M& ]; U6 j1 L+ D                3'd4:begin' h0 {' @3 P* _! x) I
                        MISO <= txd_data[3];
' o) d! f( }% E( p' P/ N& H                        txd_state <= 3'd5;1 u* d* R/ v& p7 P) q
                      end+ P4 B  i4 l6 }' x# I, v' d
                3'd5:begin
9 ^# j4 n, l3 L* f                        MISO <= txd_data[2];
: S: r, T6 j! o# k8 q" n# T                        txd_state <= 3'd6;& V/ S0 A2 @0 l9 \5 a  a
                      end/ X3 O' R; ]/ Q, L2 O
                3'd6:begin* O' ?. u, H' O
                        MISO <= txd_data[1];
& |" L, w0 D. z8 s& J3 ?                        txd_state <= 3'd7;
) g1 D5 I: V% G) M/ V! ]2 Z                      end; C& E: }. S! o! Z3 R9 F
                3'd7:begin
) z% J7 g& l: |: N! ?                        MISO <= txd_data[0];
& Z* `3 i+ }+ X2 f2 @/ J                        txd_state <= 3'd0;
& F. l- O$ z1 U1 b$ I                        
: r. G6 ~6 [. e, w! K  w# E  ?' Z                      end4 M4 D6 X: {$ k6 d* C  @
                default: ;
  {$ K1 O0 U' L  V+ q: P            endcase
+ C- z* P9 g# Y" g; c        end+ {6 T  N3 M- ]" }* Z3 U& Q$ W
    else if(CS_N)' D& Y' E6 k/ S8 v0 M& F
       begin
, a: v3 [% ^0 j* B; P) v          MISO <=1'b0;/ ~/ O0 A7 |9 E; u0 T# A1 `$ ^
       end! \5 l* ]1 K4 f% G: r( {
, x; V+ \- h: r$ K
   
* F1 ^& E6 z9 d6 J  q+ P" I& D! Rend! b) b( `4 O9 G6 J

& D% G' p& A! C1 @# d; Y0 o+ d5 a; f: B# n1 S, q, O0 K% [+ K
endmodule
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 05:38 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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