|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 i6 F3 B% E+ w1 Z9 i: m x9 s
先说一下小弟遇到的情况吧,用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不用考虑,遇到的问题和它们无关。 # }, w: p2 L5 n" B9 `
对于写的程序,在线的语法,仿真都没问题,可是什么我下载到Acte的A3P250-IFG144芯片上时,程序经常会莫名奇妙的死循环在状态机“DELAY_2>DELAY_3>DELAY_3>DELAY_3”,中间直接跳过CYC_3,而且一直不停的在“DELAY_2>DELAY_3>DELAY_3>DELAY_3”循环。
* v% ~0 t6 b i0 e; n FPGA的资源我只用了13%,在线仿真的逻辑和时序都是没问题的,到时为什么会一直在状态机“DELAY_2>DELAY_3>DELAY_3>DELAY_3”死循环呢??想尽了办法,困扰了几天,实在不知道小弟的程序哪里有问题,请各位大神帮我看看,指点一下,小弟万分感谢!!程序如下:
7 y' ^) ^3 o9 s8 S+ d' ~5 K/ H2 ?( Q( C
0 d4 L6 F- w* w! Y
SPI_ctrl(clk, //15.36MHZ. F* _; D4 p6 y' I
rst,
7 K: c, e" e4 ~; O- S) t mode,
: t/ |+ t; O2 M7 \; R EN_SPI,/ v# e+ N% P/ p2 a: A
radd_ROM,
+ i* ]2 O% h \# L8 |; k SPI_Dout,
3 l* {+ ?, }: F. ]+ W
: G8 _( N* V+ }- [/ _+ B5 }: c5 u SPI_CS," ~5 w- ]0 o- d6 } t
SPI_SCLK,! Y1 k9 |5 X6 T
op_code,
6 c: Y4 K( X1 V: x. U- A6 }4 u$ M D_fromROM,
; v" J5 [4 _8 r5 i; L$ }; K D_fromROM_ready) [/ B9 k& g7 J0 ?& _& L
);
, `/ V- y) n: D3 m/ o- R: [2 S/ H) M, c% J
input clk,rst;
% h6 b+ [% a/ Z5 |9 _, ]input mode;9 Z# K7 B* q/ H( N" z! j+ F
input EN_SPI;3 U; L9 ]2 O7 U4 X; H
input[15:0] radd_ROM;
1 o6 u8 B% G4 d( ^% Kinput[7:0] SPI_Dout;
8 U; @0 Y) `6 W! {" z p8 r5 r
& J# G9 O, j# Joutput SPI_SCLK;
! v9 v/ r5 w& `& i6 g6 E4 v% Soutput SPI_CS;
, w$ Q- G4 |2 o8 H3 o/ {+ G4 A( loutput[23:0] op_code;0 X* W- `! Y/ s( ? y/ Q- V
output[7:0] D_fromROM;
8 [* ^% o$ _7 O! m uoutput D_fromROM_ready;
( `. g+ |" f0 L L% g8 I* ?# E7 n, W5 X" h% _2 t( K% ]+ l
parameter READ_CNT=8’d32;
/ |5 I5 A+ p* h9 p; ? ~3 L
+ q* A$ S+ a/ L) |parameter SPI_READ=8’b0000_0011;/ }8 L. D* L4 t" A5 q+ h$ Y
9 S: ~6 ?3 T3 w; i. nparameter IDLE=4’b0000,: A' i4 h/ }: M" w% [% ?
Initial_1=4’b0001,
m& J6 K w+ a5 o: y CYC_1=4’b0010,( _1 o" c7 s# W8 P0 c2 {% q* t3 D
DELAY_1=4’b0011,& L [8 ^! O6 }; U; p& ^. [
CYC_2=4’b0100,; p1 j& U& `8 \" Q
DELAY_2=4’b0101,
% ]2 m8 S( o T% x: B$ V1 D CYC_3=4’b0110,
6 z9 S; m; h, n2 k8 a DELAY_3=4’b0111,8 y2 |& n* R% i+ \, i# v
JUDGE_1=4’b1000,$ K, O! A9 w" f, f2 x* P
SPI_rdBack=4’b1001;
+ y7 V n% N Y) P
1 p# l" f3 _, M8 \reg[3:0] state;3 U$ L a% O" |2 I& \" b( A; d( I" M! Y% m
reg[7:0] SCLK_cnt;
. g( C' R' ^1 r( A4 F& U7 @Always@( posedge rst or posedge clk) begin
* t; ]5 v6 M1 K if (rst) begin
( w; p/ t+ d' L SPI_SCLK<=1’b0;( T- p, T9 X/ U
SPI_CS<=1’b1;* n4 o" `0 e% d% e! m/ n: `( E" g
op_code<=24’b0;% E' H1 j- v4 A. g! n) K6 Q% s( l
D_fromROM<=8’b0;9 Z7 i7 o2 z. f, E3 P6 @
D_fromROM_ready<=1’b0;
& `2 T% E$ n2 ^; ^1 @1 v4 C SCLK_cnt<=8’d0;
+ }( w+ v+ j3 x |( _4 _ state<=IDLE;
B& `3 x0 T" H1 {$ N0 m: ? end t" Y/ C; }) y9 `( P
else if ( EN_SPI==1‘b1’) begin
: N0 V9 D6 y, D case(state)
( U% X! l/ L# U/ v6 o) J" j5 z- Q IDLE: begin, y# o+ e- L% P
if(mode==1’b0) begin3 Z, G4 H! c, E. q7 C$ x' _. B
state<=Initial_1;
2 J, M! W) u4 M9 T$ d) {6 o) o& W end; C0 Y8 ]3 t7 m* c% a/ b% i5 k; F
else begin
. l1 S: k3 S1 j+ _1 d- v state<=IDLE;$ e) Z$ s/ g' [6 a j
end
/ r0 q$ a+ [4 `$ b! Q. w, f& @3 U o end
- \' g( @* a( Z- Z Initial_1:begin1 v+ c% N; _9 ^/ p) G+ {
op_code<={SPI_READ,radd_ROM};
5 ~8 _& o/ ^) e; U SCLK_cnt<=READ_CNT;- j8 ^) m/ ~* i
state<=CYC_1;& k9 Q) K: n+ y6 E( ]9 G' C
end1 K! z9 `* e6 O# Q
CYC_1:begin$ U- o( o- R3 c a4 ^
SPI_CS<=1’b0;
7 q" x! }3 E* H3 {; F4 y7 t# `* T7 E state<=DELAY_1;
& t/ ]" N0 O, G* X0 Z9 _ end
! F! G- {/ A& \0 U4 w DELAY_1:begin2 V5 C9 U' K0 \
SPI_CS<=1’b0;6 s0 N6 W8 m( x# F" p( X/ l; z
state<=CYC_2;8 J3 L( T% Y; x7 |: Z! x6 J
end
* o2 t1 J) [- f7 Z0 }2 I CYC_2:begin
8 ?% Z; y) d( C' @ SPI_SCLK<=1’b1;2 |2 g5 K/ ]! f* ]7 C
state<=DELAY_2;. \2 y4 ^& \* f1 j2 Y' _
end
% s# O: p2 U6 e0 Q: p DELAY_2:begin
3 f4 b3 T. S% Z6 l- c$ M SPI_SCLK<=1’b1;
! }7 c# E3 J$ _$ @5 C SCLK_cnt<=SCLK_cnt-8’d1;
( m& I% T+ A, ? state<=CYC_3;1 U# Z0 U2 Q- [4 M7 A0 v
end8 v- G* X: d) }# ^& n( ^
CYC_3:begin2 J, X8 \* K0 i+ [' u
SPI_SCLK<=1’b0;
" S. n# V: |4 u4 ` state<=DELAY_3;- ~; o; Z" ]9 M+ n! E
end
+ A4 r! r4 {' m DELAY_3:begin
- w2 m3 y; H/ N- O3 ]1 @8 ]! q SPI_SCLK<=1’b0;
7 \2 {! j2 P) G6 q9 J5 @3 ? if(SCLK_cnt==8’d0) begin y8 W2 {/ j3 r2 B$ O0 D/ F7 K& ^
D_fromROM<=SPI_Dout;1 ~2 Z" S4 p9 s) `
state<=JUDGE_1;9 S, R$ ~2 p. }: ]8 ]/ ?( S. p
end& _" J# C) d" S* j# `
else begin+ z2 X4 ?2 b1 c- F$ F t: o6 A
state<=CYC_2; v/ F" ^ h2 N9 W' F3 E$ K2 v6 N
end0 M/ S5 ~, m3 V/ N. e5 w( a
end
; {6 b. E$ W# R, i JUDGE_1:begin
- L/ b* R' m3 q" l0 ^9 h" Y3 r SPI_CS<=1’b1;. m2 E0 ?9 g; y U! ]% b7 n
if(op_code[23:16]==SPI_READ) begin* j" a& |0 K& g
D_fromROM_ready<=1’b1;
4 ~# Q2 h; `* T% c' g state<=SPI_rdBack;0 @9 v: \. r: k
end, E+ w! `% c0 [- b v' c5 n
else begin
: _! |; C' L( F M3 @ state<=IDLE;
; d. h; t1 n; e: S) H6 `: N end+ h: H; T0 [8 v& T* t) [3 c
end
9 H# \7 i7 {2 u5 d SPI_rdBack:begin
* J* X5 l( A. f0 F! B" q: l D_fromROM_ready<=1’b0;
! n( R" t/ w' ~- o# l state<=IDLE;
. M2 U9 ]1 A# i3 }) g end6 N% [7 E- k# i
default:begin) i& _) h# F4 K p/ e
state<=IDLE;
& y2 A3 J$ u. p" f# i: u9 [ end$ T$ F! f7 X5 Y( [+ X9 r2 z
endcase) ]4 j5 ~$ ^& j" O$ K2 t: N p
end# u: A# {6 [5 x) H6 T2 m, {* ?
else begin3 h/ v/ C& c9 X
SPI_SCLK<=1’b0;
6 K* I9 J$ m1 B, t9 R SPI_CS<=1’b1;, m G5 {9 m5 m7 I# w( X' W
op_code<=24’b0;
]4 ~0 m, _. i! m2 C" k+ ? D_fromROM<=8’b0;
) D! J- [0 r' f) U* C+ i D_fromROM_ready<=1’b0;
2 G: k ?. Z- E( g" D3 x SCLK_cnt<=8’d0;# `0 t1 k+ y9 W+ D% M
state<=IDLE;
T- v7 g5 F6 ~! l% p' B" J end
( f" t: I+ V3 T2 ]end |
|