|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
v% ]# S- U& s% ?' O, | 先说一下小弟遇到的情况吧,用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不用考虑,遇到的问题和它们无关。
2 J: y7 l- t& A4 J 对于写的程序,在线的语法,仿真都没问题,可是什么我下载到Acte的A3P250-IFG144芯片上时,程序经常会莫名奇妙的死循环在状态机“DELAY_2>DELAY_3>DELAY_3>DELAY_3”,中间直接跳过CYC_3,而且一直不停的在“DELAY_2>DELAY_3>DELAY_3>DELAY_3”循环。
% | T! j9 @# X- S) b FPGA的资源我只用了13%,在线仿真的逻辑和时序都是没问题的,到时为什么会一直在状态机“DELAY_2>DELAY_3>DELAY_3>DELAY_3”死循环呢??想尽了办法,困扰了几天,实在不知道小弟的程序哪里有问题,请各位大神帮我看看,指点一下,小弟万分感谢!!程序如下:. \5 \, g2 M0 a1 c
" c& z/ q( E2 t) ^2 v+ T0 U0 J2 \) W* `8 m" T
SPI_ctrl(clk, //15.36MHZ
) s0 P3 w- H/ \! _$ g" I rst,2 O; a" C0 o4 R( s1 l
mode,/ s! f! k, P9 ]5 F; ?
EN_SPI,
1 V+ Q1 A# d, G4 h! T# a7 z radd_ROM,
. ]- w4 @! b- L; e4 P: _$ P SPI_Dout,( q: v+ W5 }% K6 I4 s8 r1 n2 y$ q
& M' s" `, P: N, k0 ^
SPI_CS,; `* Z) j& t$ g3 k) d! Z
SPI_SCLK,: `# W; M1 [8 r' S J" j$ Y
op_code,
4 ]$ U( I! h, ^$ Q& \4 | D_fromROM,
" K6 M7 j# I7 q2 |, h4 U D_fromROM_ready' K# ? D5 j# h0 C& |+ L
);" U$ W3 S- T: v
( E1 _1 b7 M9 j' X2 @% ]3 q
input clk,rst;& X. _- U: d' }& @' T
input mode;/ H+ P# G) C& t& ^
input EN_SPI;
& L3 `7 R5 V% F/ F0 m' X Q0 r3 \input[15:0] radd_ROM; 7 T$ n y. [) f( o: T' E
input[7:0] SPI_Dout;) F6 h+ L X8 W b
7 U& V# V. O, U( \- C' [) v7 Uoutput SPI_SCLK;
3 u) y6 M7 M6 Q% S* a, m5 Zoutput SPI_CS;
4 E" ?$ t1 ^0 m0 e: F( Z9 m2 z' boutput[23:0] op_code;
; z- G5 q& a9 b0 r3 f- Doutput[7:0] D_fromROM;- B6 \: d5 X2 s8 {6 w; U9 R! m
output D_fromROM_ready;4 {" w0 f( z) k( c. j1 \1 c/ D, j
4 R; Q& k8 \2 }3 @* Z2 ~( l( o
parameter READ_CNT=8’d32;
4 G& f/ d5 }+ V: `0 G* U- ?" I. x: j1 O5 j6 P
parameter SPI_READ=8’b0000_0011;) s9 H0 e. h$ S+ A
# }" {) @' v% e* O
parameter IDLE=4’b0000,% \, B- N1 q! \+ z
Initial_1=4’b0001,
' h9 O$ B/ D4 w Y& J. A( r CYC_1=4’b0010," o$ G* C5 @) p: N
DELAY_1=4’b0011,5 b G* I. ]9 A$ i; L
CYC_2=4’b0100,! X+ v7 ]4 C+ D
DELAY_2=4’b0101," w% W0 Z8 I. v6 P8 ~' n; Z& }
CYC_3=4’b0110,* N' p. s+ q& z# S
DELAY_3=4’b0111,2 A7 M/ y- C4 a
JUDGE_1=4’b1000,
+ i$ }& a4 Y4 n ~" h0 W' H4 {& ~ SPI_rdBack=4’b1001;
4 R% E1 ^* c0 r( l; ?1 q: }9 G4 O1 R! K
reg[3:0] state;
- Y% }/ ?2 _7 W4 Hreg[7:0] SCLK_cnt;4 T: U. U; y0 {8 d9 ?) t* g
Always@( posedge rst or posedge clk) begin, j9 m) j5 N8 l0 s& Q. J" w. s
if (rst) begin
- x& ]3 E/ o8 g% e SPI_SCLK<=1’b0;
8 d6 E# T6 h* E3 q SPI_CS<=1’b1;4 a# @, b& R5 v3 G, a
op_code<=24’b0;
; F N* h0 D; w6 A4 d& U1 }( B D_fromROM<=8’b0;) @0 I0 h( i3 w2 D5 ]# }8 i
D_fromROM_ready<=1’b0;
$ t2 @2 m0 \- s3 L" o# ~ SCLK_cnt<=8’d0;
1 Y7 P4 }8 }+ h state<=IDLE;
+ X, E% K9 u% f1 S, C/ a end* X* w2 y7 m) J0 S/ R9 G# P. w0 S
else if ( EN_SPI==1‘b1’) begin
( X1 a v4 x9 b* [# I case(state)
) T$ l8 |/ U2 m1 e, u" W IDLE: begin
: D, g+ w4 M! j2 Z& U' c if(mode==1’b0) begin
8 A0 h! Q6 E1 C* Y# D* d7 T& d state<=Initial_1;7 }4 Y* k6 ^# w7 F; k
end# G% W( l3 D: C
else begin2 a0 m* w' d/ R( c& @
state<=IDLE;9 i Q# Q a. _8 o$ o
end) F. t$ Z% ~, U" ], Z
end
6 H) |' @/ W+ P' L' K6 j2 i Initial_1:begin
4 c- _& H- e/ P op_code<={SPI_READ,radd_ROM};
4 Y6 _, a7 a Y+ H SCLK_cnt<=READ_CNT;
) i( ?0 S9 {/ c state<=CYC_1;
* J3 n& G( z4 x5 g$ r end# I y/ t# k, g* `; o( w4 J
CYC_1:begin+ `& d7 h8 R, m
SPI_CS<=1’b0;% C$ S3 f. H! _2 w' P6 a
state<=DELAY_1;
5 x* j' s: {3 g; r$ I3 E& A3 t end e& C4 g% i; Q) h
DELAY_1:begin) j% @/ L \9 x* K* ^
SPI_CS<=1’b0;
' F8 ~/ C5 M! ~6 _9 F state<=CYC_2;
* R) @* Z; s8 W2 Y end
s: ~! }' j6 x1 n, ] f* u CYC_2:begin! `0 x: a3 A/ V+ M8 M+ }% w
SPI_SCLK<=1’b1;9 B( B7 s6 ?: B6 y. S
state<=DELAY_2;
2 k% f+ h2 s6 Z! @! T1 _ end
! q2 X2 |+ L. |, y6 z DELAY_2:begin _8 V$ X; v0 o7 ~0 L' G
SPI_SCLK<=1’b1;5 z! P6 x2 Y3 L. a, A. k4 c
SCLK_cnt<=SCLK_cnt-8’d1;
' C a, N% l5 R/ f7 z# q state<=CYC_3;
: X2 ~# c; `8 K end
# z6 h& g1 b9 ]/ B, x- E, \ CYC_3:begin' x5 r0 }: Z% \7 a5 f ?5 m
SPI_SCLK<=1’b0;* R6 b- f q3 s, \! ^3 t% s
state<=DELAY_3;: Z4 n. E# Z2 C% \! R5 g/ M$ i1 C
end
: R! C$ w/ c" g q DELAY_3:begin
/ Z0 _/ N' {9 ^! H SPI_SCLK<=1’b0;1 k* H6 Q: _0 J4 f, b
if(SCLK_cnt==8’d0) begin
9 U+ j/ x" p+ f/ T D_fromROM<=SPI_Dout;
: n2 }( M% P7 g+ ~+ L7 e state<=JUDGE_1;
) ?) E' W+ b5 \3 F0 T' p end- {$ i% Y* n) w
else begin
5 N# ^: f8 s( G9 `* d, e state<=CYC_2;
! P1 q8 P: h" a/ v3 T( }; J! h( m end- }" i. P% m) [0 ?
end
+ t* w( m- _: \' V JUDGE_1:begin- ^9 p6 Y( d4 O: `+ D, g4 I5 q
SPI_CS<=1’b1;. ]% ^, \% i) E) m8 F' h, b7 V
if(op_code[23:16]==SPI_READ) begin
+ f9 X* C& B7 n D_fromROM_ready<=1’b1;
! v, f# ~4 n1 S6 f) ~# a state<=SPI_rdBack;
5 f4 K9 T3 }; y" K" `6 c end
/ z9 m, L2 M$ s& T* g4 M% V! ] else begin' q$ h7 d* X) Z9 Y4 [( i, i+ Q# _
state<=IDLE;% w0 A$ Q D z0 ^$ s+ S1 b
end
$ G( \3 I2 b0 o* p% H' \7 A end
7 b2 H$ h) K5 z" T* ?: N1 z! [8 u$ T SPI_rdBack:begin
& v p9 Y" K8 G3 C3 R% i& }1 t D_fromROM_ready<=1’b0;
2 h0 [/ u9 d) S8 v" S2 G4 p5 i state<=IDLE;
& R- f, I- P3 m end
7 h9 ^: e0 ~$ e- @8 ` default:begin
* Q/ @0 G2 b1 j; _* X state<=IDLE;, u) b- C/ {, V
end' O' g' ?6 H1 c6 s V" z
endcase% C& j0 l ~% E
end
9 c! ?8 y$ _$ |4 i$ B else begin
2 T( l8 b1 F- }/ r+ G SPI_SCLK<=1’b0;
* j+ _, d2 U5 Q SPI_CS<=1’b1;, p% h4 S- }: y' S! A- w. F) R
op_code<=24’b0;5 \9 Z7 Q9 C, n* U$ C
D_fromROM<=8’b0;5 \. f4 k4 }! R% G9 Y: e
D_fromROM_ready<=1’b0;
9 B- v* |9 [$ d' i7 X SCLK_cnt<=8’d0; s5 d! l- @5 M! B$ w
state<=IDLE;, N/ o3 W. ]+ F- ?% d
end
8 `0 |& y! k8 _end |
|