|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
# o" e9 D( Y- ~/ v- @
先说一下小弟遇到的情况吧,用ACTEL的A3P250-1FG144芯片,在Libero11.1编译环境中编译的,其实是很简单的一个读取外置EEROM的SPI程序,每次上电时外部会恒定的给出mode=0(读模式)信号,芯片工作使能信号恒有效(EN_SPI=1),然后利用15.36MHZ的时钟,产生3.84MHZ的SCLK时钟,送给外部EEROM,片选信号SPI_CS每次低电平信号选片,并串转换的模块p2s、s2p没有写在帖子里(主要是和我遇到的问题没关系,就没写进来),即SPI_SI,SPI_SO不用考虑,遇到的问题和它们无关。 : B4 G1 r( r" d" h: @ F6 P
对于写的程序,在线的语法,仿真都没问题,可是什么我下载到Acte的A3P250-IFG144芯片上时,程序经常会莫名奇妙的死循环在状态机“DELAY_2>DELAY_3>DELAY_3>DELAY_3”,中间直接跳过CYC_3,而且一直不停的在“DELAY_2>DELAY_3>DELAY_3>DELAY_3”循环。
# m, n2 C2 W; E) n" \9 Z FPGA的资源我只用了13%,在线仿真的逻辑和时序都是没问题的,到时为什么会一直在状态机“DELAY_2>DELAY_3>DELAY_3>DELAY_3”死循环呢??想尽了办法,困扰了几天,实在不知道小弟的程序哪里有问题,请各位大神帮我看看,指点一下,小弟万分感谢!!程序如下:7 g) J$ j! Y, ]6 } H
|3 O' e5 w/ `( G+ ^: ^& g* x. n. \! L& A
SPI_ctrl(clk, //15.36MHZ: _! j+ d% t0 d
rst,
& N! P3 S9 [5 V mode,
& ^* l: c; Y, ^ t8 r EN_SPI,( S6 a0 x0 k9 }2 D( c7 C! B8 n/ n
radd_ROM,
# U* @% g3 o1 N+ v SPI_Dout,7 c: @: b+ N( K
$ U# c8 F( H- y% |! f SPI_CS,
# f j; s! r/ S! u SPI_SCLK,7 L1 x2 G8 u' q+ O2 l- |
op_code,
\& x( e. @6 z' M, m! J' m D_fromROM,
1 S1 n: r( T. g D_fromROM_ready
0 R! u5 s6 C2 e! M# A% w0 B );
, x$ T5 L+ L* Z
5 L; u* v* }. D1 sinput clk,rst; ]0 c/ s6 N3 Y+ x n n% k. a
input mode;* m5 V6 S, x9 e' {% R! d. N6 j9 {
input EN_SPI;
* n, }; p/ x4 u6 R$ Sinput[15:0] radd_ROM;
* [ N, B1 F9 Vinput[7:0] SPI_Dout;
/ s$ H6 w: j, B8 L, x
2 H/ _! y+ b! h" @: L- _output SPI_SCLK;) u+ k0 a9 n" ?8 R
output SPI_CS;/ E4 @; Q. [7 }# Z' q* l
output[23:0] op_code;
* {) r' Q4 d0 p$ c% soutput[7:0] D_fromROM;$ {3 l( u: u6 c% X
output D_fromROM_ready;
+ v, s' s3 U6 @5 m+ ~) n F" o' k# l7 `$ b9 w3 i' }( b
parameter READ_CNT=8’d32;
6 W/ X. X3 a2 \2 ?0 f$ C8 m1 d \7 c: ?, t: D& c
parameter SPI_READ=8’b0000_0011;
& h; N/ ~3 G! Z: _
4 g+ y& j3 A/ }parameter IDLE=4’b0000,
6 W5 ?; A! x4 I3 ~) E, [0 C Initial_1=4’b0001,
( v* P% C3 D7 { CYC_1=4’b0010,6 K x6 J+ h, K! v
DELAY_1=4’b0011,
. n5 @) v+ M- Q, A3 y$ x" }/ F$ S( G1 ] CYC_2=4’b0100,
K# l, F! S. i ^1 r2 ]4 o+ u DELAY_2=4’b0101,: `2 c' K+ @) t1 ?$ f
CYC_3=4’b0110,
3 p1 e) @6 C3 M: e3 Z DELAY_3=4’b0111,
i4 { J; }8 d9 a+ Y/ r7 z JUDGE_1=4’b1000,
3 I- ~( c6 b5 A7 O" F# E/ o SPI_rdBack=4’b1001;
6 _7 Z8 e# o0 h* Q2 x% E. S" Q8 G$ d0 v: h, r2 w
reg[3:0] state;
+ P. v1 R' L/ T! Q( Y/ treg[7:0] SCLK_cnt;
" K$ v: E6 {, V& T8 u% S; hAlways@( posedge rst or posedge clk) begin
( c# H% O. D9 q& K" P if (rst) begin( r( [6 p, Q& W( M# R! ?& J9 y
SPI_SCLK<=1’b0;+ o* C8 v" a! u' B
SPI_CS<=1’b1;
. q' \. c7 R6 H1 z7 |1 E) T op_code<=24’b0;8 D2 d: g: D- r6 H1 @' x P2 h
D_fromROM<=8’b0;( ]7 M2 o- O+ j' Q! |; V/ `
D_fromROM_ready<=1’b0;; P0 _4 }1 Y4 o/ V7 p
SCLK_cnt<=8’d0;9 t2 K1 g" A! B
state<=IDLE;. D- O4 G! n& q. j) y R
end3 J8 A- B/ b, {* M- ~2 q# ^# M7 r( @
else if ( EN_SPI==1‘b1’) begin( e, v) B$ h* A. y
case(state)
& f, x8 P( `$ C/ { IDLE: begin
# j" s: ?2 [( E' u if(mode==1’b0) begin
* Q+ e* F4 Q- D$ Y0 _ state<=Initial_1;
. {8 D9 |" D" R1 A! z( j( ]9 Q) L, o- t end/ p: l# x8 ]/ p. |2 G- O9 {6 A
else begin: f. u u/ F# g. f; f. m
state<=IDLE;
! { o3 v9 L9 @% J5 E. _ end7 F r7 L$ M- m$ w2 m: L# }+ I" L
end
, _$ U1 [- g+ z6 F Initial_1:begin |1 {5 s/ ?- q o
op_code<={SPI_READ,radd_ROM};
+ B6 f" Z* j x" }# c" Q! Y: u2 U SCLK_cnt<=READ_CNT;" O/ r9 l* {2 Y) r+ h
state<=CYC_1;
+ h* A/ {( j5 m8 K# j9 o end
. J1 R' x; o' x CYC_1:begin6 R' E9 x+ y- e9 R2 J. M
SPI_CS<=1’b0;& P/ U6 h# [9 ^6 }* @) }
state<=DELAY_1; ) {$ c, B$ A* b. ^$ q
end
! P4 N! k5 M3 q DELAY_1:begin
$ d0 l7 ^6 F; H/ c/ @ C SPI_CS<=1’b0;
: _: h9 {5 S/ Q- E- K7 ]1 V state<=CYC_2;
; _/ Y& [; c. M$ @3 e1 j5 Y/ m end) y* h2 O) }; M
CYC_2:begin
- n& W" ^9 d( G SPI_SCLK<=1’b1;
! P: N. m; A T state<=DELAY_2;
5 J) r; K& t0 ^# t4 f1 n. E% d end$ }+ V3 ?1 S. |/ D
DELAY_2:begin: F$ g' C% ~) z$ w0 X7 K1 Y
SPI_SCLK<=1’b1;
! H w E/ K! t0 `5 V SCLK_cnt<=SCLK_cnt-8’d1;( S ~, X0 Q+ G+ t! G3 g( c
state<=CYC_3;3 d% F6 }3 k* u
end
8 m5 B6 H: E5 u8 ?' g% d' A/ d5 W CYC_3:begin9 m' `0 F: L- d- a3 d8 u1 i, W
SPI_SCLK<=1’b0;
. e. l8 t8 t9 s) p! k& Q state<=DELAY_3;
2 S; q5 N; t2 |$ G end
! Y- O0 r& s' ^* Q) i% n! X DELAY_3:begin7 R) Q) v1 Q+ |& q/ k
SPI_SCLK<=1’b0;0 w) o$ G5 a6 N' U% i# d
if(SCLK_cnt==8’d0) begin
/ E+ _2 F3 R9 J0 c2 L9 Q1 x D_fromROM<=SPI_Dout;
* c) R, U5 j5 y( C' ]$ ? state<=JUDGE_1;) }6 Z( U# u( C$ E a. k
end5 F: K1 f2 Q9 v7 q. s" L1 d
else begin7 ~& ]/ T- {$ K+ P5 l
state<=CYC_2;; K8 j: z3 D& X$ y# P9 D0 g
end! W' t v1 i3 k; J
end
% M$ W% ]7 \- E% D2 a' n5 o JUDGE_1:begin
% i6 y& C( {6 ]+ e, ^3 K. B SPI_CS<=1’b1;
/ ?, S1 [% d1 y if(op_code[23:16]==SPI_READ) begin
" a8 [3 O& m$ e4 |% Z- `+ q D_fromROM_ready<=1’b1;
, S( T O: X; z state<=SPI_rdBack;
- E& p( p- a0 v/ |8 ]1 P end" c3 M5 R; M/ R7 K. }
else begin
% W$ D, c3 @2 j& ^3 B- p) D state<=IDLE;
( b4 L0 x: r. u; Z end
+ q' ]) @; h) r" W" b o end8 r0 E B O0 w. S0 a' X8 u
SPI_rdBack:begin p- U+ H4 h5 I% g" k) i1 x2 w7 F7 x) R
D_fromROM_ready<=1’b0;6 @) _! | ^( d2 G& G2 ]3 R
state<=IDLE;5 F. d0 d1 ^2 p7 s+ ^6 j `
end6 n9 M$ Q! F0 ?% w) o; U" t' e' v
default:begin
+ R% l, _* m0 D, b0 v! u" S state<=IDLE;
# e# e4 t2 W; C0 W% j end
, N2 k5 r L. _$ `" J endcase+ r5 n' K- L6 K
end H0 j* \7 O5 i2 v* p
else begin
% I% e+ t: |/ n1 p3 M SPI_SCLK<=1’b0;; G% g, S2 g; o% t! E9 E0 _- \% e7 g
SPI_CS<=1’b1;# T/ l" B! F$ M- w3 I
op_code<=24’b0;* g* d" G0 j3 l' D% }9 O
D_fromROM<=8’b0;
/ Z; T N3 ?4 n+ h& |9 }2 k4 C D_fromROM_ready<=1’b0;# T N2 _, @) p O2 U$ O- k
SCLK_cnt<=8’d0;+ r6 s- }4 Y: \( \& S
state<=IDLE;& L: }3 s# N, w4 x) b2 ]
end+ i1 ?, h" x* O
end |
|