TA的每日心情 | 擦汗 2020-1-14 15:59 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点# r" q; ^! V3 z& W' {( K
控制外部SRAM需要注意什么?9 R' ?! D* d" V* l& R
在代码风格上如何描述更稳定可靠呢?: J. B) a) N8 v" d6 A" r4 N) N
+ A+ s. e6 ?8 l# X' m0 N) v: Z+ N; s
module SRAM_TEST(1 m6 b5 F7 f4 k. ?& s
i_Reset_n,
0 I9 N" k% N6 z+ Z; E# i; h8 ] i_Clock,. M) U( E5 F' V, H6 }3 R
i_EN,1 @) F* X: I1 U
i_StepByStep,8 k% c w, f2 R# L
i_WR_Control,+ I1 w* e: J! w% Q, g
o_W_FullSign,: \, R& b7 B, l% b3 x b
/* SRAM InteRFace */
1 m6 S" R! u* L& N# o0 ~& j* ]3 q o_Sram_add,7 U1 K8 C& `: ^8 |. ]: X
io_Sram_data,5 M* }9 c+ v( [6 f8 e7 O
o_Sram_CE_n,# Z3 [) `5 ?# k' U/ D1 y* l' b
o_Sram_WE_n,3 ~! j/ ^5 ~2 G: z" m1 ~! `( @
o_Sram_OE_n,9 i# x7 F O6 j4 q
o_Sram_UB_n,
3 M, }) K( W" E o_Sram_LB_n,: m( T" ^1 R6 R/ @" W
/* Display */" R6 D/ A5 A" a5 t; H4 j
o_HEX,- V& i. F+ A2 W
t_HEX); ! @6 S/ b6 P/ C; c$ X, ]
\; M# @) U6 |+ v
input i_Reset_n;' ^& @- @+ y* s$ F+ [2 ^/ [, _& m
input i_Clock;
* I7 e8 b0 l% U+ h' } input i_EN;3 O$ V' I& w: C6 H4 n7 q1 J% c# `: c
input i_StepByStep;) |1 W! t7 b _' n$ M) A; E
input i_WR_Control;8 `5 Y- W1 a1 |$ j
output o_W_FullSign;' I m4 g4 i: y
/*SRAM Interface*/
( m q& m5 a& S output [17:0] o_Sram_add;' b0 k/ e4 D, u; e+ `) {/ j
inout [15:0] io_Sram_data;
: \) { h6 ]: F0 o+ w( g d output o_Sram_CE_n;
; Q5 Z! q0 f) c9 b8 S6 {7 E" g output o_Sram_WE_n;
# @; ~# O; c( p# l+ v* ` output o_Sram_OE_n;
Y0 ^: Q6 F/ t! ^$ f" }2 h1 K output o_Sram_UB_n; ' o& {8 F6 b( I# I; V+ Z$ x* o
output o_Sram_LB_n;
: I% f; V" D/ ?, w4 J7 C /* Display */
5 Y& {8 v/ w+ f! W+ o$ G output [6:0] o_HEX;: u7 P& D& r0 g1 L1 j5 s
output [6:0] t_HEX;8 L' t( R/ c0 C N
5 M* O+ X4 K) q, V) q3 a2 p reg [6:0] o_HEX;
" a( C1 o5 |( D% a' [ s! y) M reg [6:0] t_HEX;' x+ B! o3 a$ ^8 H7 s& S L1 n: W
reg [17:0] o_Sram_add;
3 ]. Y1 p7 x' B2 k reg [3:0] t_counter;
5 V( M3 h4 w/ o) d. J& Z, { reg o_Sram_CE_n;( ?7 ^7 s- C# {3 b
reg o_Sram_WE_n;
1 x) C3 @& W2 e, B# g t; s reg o_Sram_OE_n;- J* c' J$ L) ?
reg o_Sram_UB_n;
3 A$ h& @" Y$ K+ L4 `( t% U reg o_Sram_LB_n; ]& _, J6 p3 S# ]; K
reg [15:0] Sram_data_in;
) T3 O/ ^# K- K/ a! d! W( } reg [15:0] Sram_data_out;
0 Q. I; D6 w! x3 Q3 _ reg Counter_EN;
" u7 I+ j, N% m3 t reg [17:0] WADD_Counter; 1 v# {6 |" D6 U5 C. Q: m; J5 t8 o
reg [17:0] RADD_Counter; 0 t2 _% }, U, g
reg [15:0] W_data;
1 ?1 D v/ M1 ]: V% A" @- {1 G reg o_W_FullSign; / _# K* C7 A: Z7 F7 n6 M2 c5 N) u
reg [2:0] Sram_State; - g# A" C4 k5 k8 a! X0 l( [" i
reg i_StepByStep1;, }! u6 q/ y6 K% ~, D
reg i_StepByStep2;1 h, k; V% z# f; X9 Z! S: t! H
reg i_StepByStep3;
% j; {# x8 M3 X/ S- ^ reg i_StepByStep4;% [! T' t' T; A0 S: c: s' q
reg i_WR_Control1;& D- g4 p0 J# v
reg i_WR_Control2;
$ G% C p& a/ }) X reg i_WR_Control3;
, Z! b# \6 A% y" u+ N
S- K5 h+ R9 V0 v always @(posedge i_Clock or negedge i_Reset_n)
f4 w( }! c* N0 y( r if(~i_Reset_n)1 X- N# f* ]9 q# D4 }/ q% {
Counter_EN<=0;
* `. V7 C* I9 J+ u$ e- t! s else begin
2 c5 a& x: p$ F* e3 b, K% W: d5 c if(i_EN)
/ O+ q8 z# S% B% B) V Counter_EN<=0;
" @ m& p/ |, t- T' O. v else
- v. p/ e. K9 } Counter_EN<=~Counter_EN;
: E7 |4 e; e4 f- i2 ~8 L( x6 g end; O$ X; \; o) P) U, C4 P
, a1 k( g' p' I6 ] always @(posedge i_Clock or negedge i_Reset_n)begin
5 ] R; V0 d/ ^' F% r if(~i_Reset_n)begin : R; q' d2 Y' Y$ g0 q( A6 j5 x* Q
i_StepByStep1<=1;
: J' x9 I, M& X; W! a) M i_StepByStep2<=1;
, x p! t* G* w( U9 C i_StepByStep3<=1;4 ]2 S: `; J# Y
i_StepByStep4<=0;3 C9 X/ I' B3 g8 o( e8 T! _% n
i_WR_Control1<=1; , J& W/ F" `+ `$ ^
i_WR_Control2<=1;
0 Z( A& x) [5 u4 v: s5 I i_WR_Control3<=1;
) ?! }3 f, X2 c& w3 [5 T5 N' T end& {! M4 d3 P: @* z4 s4 j
else begin
4 l8 H; u+ q- [( Y& s i_StepByStep1<=i_StepByStep;, ]1 G; r) s! ?9 b( {
i_StepByStep2<=i_StepByStep1;
" i9 `* W/ B4 u0 u* m: N# @ i_StepByStep3<=i_StepByStep2;
3 E/ [9 |) ^. S6 w9 e1 A i_StepByStep4<=(i_StepByStep2 ^ i_StepByStep3) & i_StepByStep3;. i+ }+ n. u8 G" A
i_WR_Control1<=i_WR_Control;
5 H& L9 ]1 `' l4 E: ~ i_WR_Control2<=i_WR_Control1;
$ P+ ~% v3 a3 W( [! T! X) v i_WR_Control3<=i_WR_Control2;, |% L9 V) P5 l0 W4 d+ `
end) [4 O7 k5 Z2 D
end
5 w2 G% R8 t# f: x
$ n3 ]% B- t* U always @(posedge i_Clock or negedge i_Reset_n) . G* n; i! X2 Y/ q- f" H
if(~i_Reset_n)begin
( _- |/ r" D; [# N, ? WADD_Counter<=0; , j; z2 t4 c/ r. u
o_W_FullSign<=1;4 _) g% C; d1 G9 z
end
' v0 V+ i; v0 y% z: u% W9 H else begin m" F( \/ e$ @2 d- b) u
if(i_WR_Control3 &i_StepByStep4==1)
. I1 v5 f" z) w1 ~! y) K if(WADD_Counter==15)begin \) u& ?7 ~8 f u4 C& U
WADD_Counter<=WADD_Counter; r1 \- w2 T7 k' W- }/ g. G
o_W_FullSign<=0;. O0 t# A( F8 c* J8 h P8 [) ?
end: {3 k( @. @! k
else begin
! _3 b6 G4 ]. _7 g/ S; H3 P2 Q WADD_Counter<=WADD_Counter+1;
; |* C3 `" Y- R- i$ x1 r o_W_FullSign<=o_W_FullSign;1 w* J3 `2 J+ _8 m6 O( y8 g Q% I
end
+ D) J1 w; y9 A: d9 \8 T' j else begin 8 X. L! N& u- z0 r) E/ M# Z, ^2 D- {
WADD_Counter<=WADD_Counter;8 V$ r/ y" ^% E
o_W_FullSign<=o_W_FullSign;
9 t8 D( m7 ]; U5 w7 i# e! G- ? end
4 w) F' n1 z) k- e end
" ]( h) k5 e2 u
) P5 T( d1 Q5 q* J* y, q' n always @(posedge i_Clock or negedge i_Reset_n)
( M- q# y7 ?! a# b8 x7 j if(~i_Reset_n)begin
4 l, K0 V0 Y0 {% K* s( m4 G7 `& J' D, | W_data<=0;
8 F! n8 L/ H3 b+ X7 m/ k B! R end
+ [. t9 M" X0 b: \$ h- X( ` else begin
5 G" \0 a& W; {2 Z if(i_WR_Control3 &i_StepByStep4==1)
3 m5 l2 E# t* c- j if(W_data==15) ; H% Z6 ~( Z2 R" _/ S
W_data<=W_data;
; c3 U+ z8 L: ^ else
6 @' ?: v7 A" Q( c' X5 a; v' u% B9 }1 M W_data<=W_data+1;
7 F" ^' V9 S5 q" T F else8 }8 Y, `2 a L- p$ Q! l7 B. n
W_data<=W_data; ) r3 k: G ~2 H
end5 `; x: J8 U8 g. s8 c: F. _. [' }
: |) E6 o+ _! n* u. w
always @(posedge i_Clock or negedge i_Reset_n)+ p7 n* X; a; F4 O
if(~i_Reset_n)
' p* P' n& E e% S1 K RADD_Counter<=15;
$ q6 r3 `1 b2 ^) L% J) X& c# w4 W else begin3 T# s2 b8 Y& B8 Z
if(i_StepByStep4==1 & ~i_WR_Control3): T W1 Z9 U2 r3 Y
if(RADD_Counter==0)3 |2 A5 d3 b6 z5 K' E6 s5 x$ Q' n
RADD_Counter<=15;
8 m5 g1 b- F8 b9 \* c/ j else9 e: m8 g, Y( _% _
RADD_Counter<=RADD_Counter-1;
/ C7 ?+ \4 W( P9 N else
! c! n0 v* m( A4 A2 @3 s RADD_Counter<=RADD_Counter; . ~) L+ m% l. {( k5 Q
end
( O: P1 R0 I6 \8 |% E1 @; N" A) A 6 t9 C4 h" N! a. O$ y& V. }8 u
parameter IDLE =3'b000;
6 D2 T/ h6 @1 Z9 n/ Y3 I parameter READ =3'b001; ) o3 ?, F" S. u) j$ g# P- o
parameter WRITE =3'b010;
) a+ O" [5 ~* I* M8 N W: k6 h. Z% a4 H$ Q/ M8 R
always @(posedge i_Clock or negedge i_Reset_n)+ a- \7 n- f$ M$ Q4 B
if(~i_Reset_n)begin
0 M2 @1 I, l- ]' y Sram_State<=IDLE;' C% x \: o) l, v" {! c
o_Sram_add<={16{1'b0}};
5 ~: |5 Q0 q \' A- `# ]; J0 c Sram_data_in<={16{1'b0}};' B( c- n% d. r" I+ j
Sram_data_out<={16{1'b0}};; u& `! G$ Z, N( M( _
o_Sram_CE_n<=1;. u! z6 }% C5 E+ h4 }4 {
o_Sram_WE_n<=1;
2 {& ~! N/ U7 I' G. |- b o_Sram_OE_n<=1;* D3 _' g% h8 u0 E
o_Sram_UB_n<=1;3 z8 y; {- H3 \3 o0 ^
o_Sram_LB_n<=1;
$ M2 H0 s; A+ w, e# E8 s7 I end
+ d4 d8 Z: @- X3 \( J else begin
5 F$ ^- B* V$ Y2 m* e4 I case(Sram_State) 1 q) e$ ]. Z# I& S) v4 g
IDLE:begin $ n. d6 o) N! z7 W1 h Z5 ~
if(~i_EN)begin 8 Q9 r5 N/ j8 L+ b$ K# P6 X
if(i_WR_Control3)begin " O5 o: z; I, g9 }
Sram_State<=WRITE;/ u: I9 F, `; T2 f X
o_Sram_add<=WADD_Counter;
: ^' m3 X) s7 t Sram_data_in<={16{1'bz}};
( o2 G$ i- F' x ~3 r# v6 ?2 | } Sram_data_out<=Sram_data_out;: H" J; {8 a! d+ i0 K* j2 f
o_Sram_CE_n<=0;
8 k! [; b/ \0 _! R7 u o_Sram_WE_n<=0;
9 ?# l3 d( Y8 A. J) B: U: ?& s+ _, s o_Sram_OE_n<=1;5 T% E$ {* j$ B
o_Sram_UB_n<=0;+ i$ g, p- U( R' o# B0 P6 `+ u
o_Sram_LB_n<=0; ; e N5 s/ Y7 x/ i1 ?& h7 l
end
% d X# }% g0 Y else begin
& ]; C8 `% a: P5 W' D- D' { Sram_State<=READ;
) k$ F0 h* V) w7 B o_Sram_add<=RADD_Counter; . N' I" r- j/ \3 s" ^
Sram_data_in<=Sram_data_in;& R0 w' N. T0 l- [4 q
Sram_data_out<={16{1'bz}};
1 v s- p' ~ J) h$ Y; Y, [ o_Sram_CE_n<=0;& J! c5 s- k8 E0 \4 S8 V1 |9 C0 _2 E
o_Sram_WE_n<=1; O0 {1 i) n4 p
o_Sram_OE_n<=0;7 W+ j2 W T5 [9 A5 o0 c' e- Q
o_Sram_UB_n<=0;
+ L4 w W8 b' q! y# G o_Sram_LB_n<=0;1 ]/ }% ]5 N: e, _9 o7 e: F
end ; w3 L3 J, ]! g2 `; X+ ~' K
end" E+ ]- L2 A! u# G% h
else begin ; z5 n* I; l2 N
Sram_State<=IDLE;( O; Y/ Q; ~ p7 U4 e
o_Sram_add<=0;3 N/ u5 W6 |3 p1 f: M
Sram_data_in<={16{1'b0}};0 I& Q% {" |# Y4 T
Sram_data_out<={16{1'b0}};, ?( u7 v9 D# r _3 \" U% _' B
o_Sram_CE_n<=1;6 c1 l5 x% ]: K. b; b
o_Sram_WE_n<=1;. ]! A* }9 P$ M1 G- W1 ~9 t% ]
o_Sram_OE_n<=1;
* m: E6 u; |( G& M o_Sram_UB_n<=1;
2 ?8 O' E; F3 N/ ?8 d# n2 C o_Sram_LB_n<=1;
! h6 s e$ _- p" | end # q, L5 C1 a0 f& L$ E9 W9 s" [
end; Q; z, k+ i9 p% [& K
READ:begin 0 v! z A& p, \8 x+ F
Sram_State<=IDLE;
+ Z$ ^3 s4 p- r5 w5 w o_Sram_add<=RADD_Counter;
8 O* f# ?1 @! _! ~ Sram_data_in<=io_Sram_data;* H* R9 n' z6 t; H9 t9 ]
Sram_data_out<={16{1'bz}};
6 ?+ w$ T) k/ f3 | o_Sram_CE_n<=0;# q/ U7 G0 z# h) c" R5 E
o_Sram_WE_n<=1;
1 z. A. C* g+ j3 O) O- S4 I. H2 I o_Sram_OE_n<=0;, K0 h/ B: n2 T0 z; U
o_Sram_UB_n<=0;( R, n$ O! I c, `+ K/ V8 O
o_Sram_LB_n<=0; 4 P' N% y4 K+ m
end / ^' c! |& s8 Q4 q5 l
WRITE:begin
4 f3 ?8 K8 [% N, y" }/ G) k+ F Sram_State<=IDLE;
0 E: `0 W y' [3 z9 M! F o_Sram_add<=WADD_Counter; ' |3 W: N# i$ T+ |, W# a
Sram_data_in<={16{1'bz}};% I1 i/ f+ _2 o- d, z- b
Sram_data_out<=W_data;2 A* f) B2 f6 o
o_Sram_CE_n<=0;
9 W5 `6 T; E! k$ p o_Sram_WE_n<=0;
1 @- a3 \! u" H" @. p. g) F# ~ o_Sram_OE_n<=1;9 c9 M) v( j: o/ x. o- s
o_Sram_UB_n<=0;3 I/ N: N* q$ }# r
o_Sram_LB_n<=0;
0 \( ~, m" e% f end
& i9 N0 h. X8 C- U2 Q3 M6 f default:begin 4 V( c N: }% M' n9 @1 ~. _
Sram_State<=IDLE;
. Z8 g; M, z: c; q o_Sram_add<=0;
; |1 P! Q; p: w, D1 N Sram_data_in<={16{1'bz}};. H& a& k3 m5 m9 B2 E! l( T
Sram_data_out<={16{1'bz}};
8 J/ m! A; {9 \( ^' s+ Z3 g$ Y o_Sram_CE_n<=1;
P2 O; n3 ?9 l6 j8 b$ n. L o_Sram_WE_n<=1;/ w0 ~: M4 e# {
o_Sram_OE_n<=1;! Z: }6 I3 x0 U+ k; i
o_Sram_UB_n<=1;
: [) Z8 k0 u4 _7 j o_Sram_LB_n<=1;7 t; C- n* j7 Y0 C1 t U
end
5 Q6 F" F; }" _, v4 @" M endcase
* S; e' u2 F) B9 Z3 i end
- E' I& u" C) \4 g9 m, k4 o, B1 \ assign io_Sram_data=(i_WR_Control3)? Sram_data_out:{16{1'bz}};
, A3 I0 H) G0 B & c; N. s5 f% z5 K3 k( M% `
always @(posedge i_Clock or negedge i_Reset_n)' ]2 I! p) D: s# Q- e5 `& i
if(~i_Reset_n) 9 N# t, o" F- V, z7 }% H! w1 T6 i
o_HEX<=7'b1000000;
! F: R, I& P+ G g* Q else begin
3 v8 Z8 L1 N) J3 p) E% | if(i_WR_Control3)
; b( @% k* |6 k' _6 G# p case(Sram_data_out[3:0])
' R! x* | _6 Q 4'b0000 _HEX<=7'b1000000;
- ~4 {3 `: \ I( Y& N 4'b0001 _HEX<=7'b1111001;
8 b9 |) `0 E; @3 e 4'b0010 _HEX<=7'b0100100;
# r! e% w5 v6 u 4'b0011:o_HEX<=7'b0110000;7 `8 B% S' K8 b" n# Y9 q& x" j5 W
4'b0100:o_HEX<=7'b0011001;7 w: Y1 ~# _# t5 |
4'b0101:o_HEX<=7'b0010010;
j, H: k O; T" \% M 4'b0110:o_HEX<=7'b0000010;$ Y) N* R* }5 J* t& c! M
4'b0111:o_HEX<=7'b1111000;3 b: M) M1 N0 l$ T, r
4'b1000:o_HEX<=7'b0000000;
0 i) u! [" |3 x 4'b1001:o_HEX<=7'b0010000;
4 m' e1 |0 G1 m# @ n 4'b1010:o_HEX<=7'b0001000;; u3 ]: b6 H$ f/ Q5 ]! B
4'b1011:o_HEX<=7'b0000011;
" ~2 _: g" M- |/ h" R9 l 4'b1100:o_HEX<=7'b1000110;
) `/ ?2 |. R7 ~4 w; Y( K/ Z 4'b1101:o_HEX<=7'b0100001;
( c3 k7 S& n' v" ?+ r0 W 4'b1110:o_HEX<=7'b0000110;/ @" x& h; I, K; n+ c
4'b1111:o_HEX<=7'b0001110;* Q" i; h* N% Y# F/ c( Z. c6 O/ R+ _
default:o_HEX<=7'b1000000;2 x* U+ l( D+ F* v. ?# o
endcase 1 e5 h% s! O: Y6 x# C4 ^$ T
else
. b( j' Z4 F3 J) X1 V: L o_HEX<=7'b1000000; : S+ x: q2 R9 y- t
end " G5 C3 h$ y5 p, d$ ?4 q
" S: u: E( u1 e' \0 ]4 s always @(posedge i_Clock or negedge i_Reset_n)$ u$ \7 ~# h8 G- I7 a# C7 s- W
if(~i_Reset_n)
, B# _: g7 V( @3 o t_HEX<=7'b1000000;
! H' |, g; Q; Q' h/ u else begin
$ }# g" r1 v9 F# Z' N case(Sram_data_in[3:0])2 [8 B' w: C/ d' ]
4'b0000:t_HEX<=7'b1000000;
( n7 l. m O' B3 k y+ F' _! H7 f$ H 4'b0001:t_HEX<=7'b1111001;! Y: ^( \( \1 r, o
4'b0010:t_HEX<=7'b0100100;
1 b( D6 U5 V' h0 o% m+ u- N 4'b0011:t_HEX<=7'b0110000;
7 u" l- e4 a- [7 E3 h 4'b0100:t_HEX<=7'b0011001;7 p) \" J# j9 g9 L
4'b0101:t_HEX<=7'b0010010;4 T8 A: x6 F, J9 A1 c8 `
4'b0110:t_HEX<=7'b0000010;
. ?7 L* P& K3 ~; R 4'b0111:t_HEX<=7'b1111000;$ u5 I1 V* J6 C' J. x) o, m
4'b1000:t_HEX<=7'b0000000;) j' |2 }, X7 t) e$ h( M
4'b1001:t_HEX<=7'b0010000;2 M2 e$ r8 g, _9 i6 G# ?
4'b1010:t_HEX<=7'b0001000;9 k9 v3 D0 d1 q" V/ Y5 p
4'b1011:t_HEX<=7'b0000011;
4 d# b2 q; r n: W } 4'b1100:t_HEX<=7'b1000110;
" K- c2 N& |8 v$ W( {* \) E2 ` 4'b1101:t_HEX<=7'b0100001;7 q q" X; Z6 ^1 L3 V, _; r
4'b1110:t_HEX<=7'b0000110;, Q, G9 V, O8 b( H; s) m0 ? u
4'b1111:t_HEX<=7'b0001110;7 X0 f2 M& C/ @0 K# {7 S. e; _
default:t_HEX<=7'b1000000;0 f/ u* X7 O% o. i
endcase
% u. g" s% S M$ k; ?. g: H end
1 z( U# J/ p Q
/ g6 L+ E4 p. f0 N4 w8 C% L9 G! nendmodule |
|