|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点
5 n1 u$ r4 m9 b6 o3 N& L8 H* E' D控制外部SRAM需要注意什么?+ e* j, f# H& r* \& b. _
在代码风格上如何描述更稳定可靠呢?
' {! n2 {: {, }$ D2 L' {5 {. V7 W" X" w9 r+ `
module SRAM_TEST(
. a9 J* ]( r8 d4 ~ f5 ^( v4 s3 H i_Reset_n,
5 F+ W2 S7 Z6 k l/ W i_Clock,
; W( P8 F" m+ b5 n& Q* p* L i_EN,
9 T7 d; n( B- a i_StepByStep,, E0 v9 T# m& r0 U
i_WR_Control,
- l" k0 t) S* ~, L; C o_W_FullSign,) b6 U7 I9 t% H+ Y9 T
/* SRAM Interface */# L/ r, l$ i6 y5 a) P# d. d
o_Sram_add,; o6 D6 |, W8 [0 p9 Y- O
io_Sram_data,
6 g9 r2 k" L2 ]: a5 v' j o_Sram_CE_n,) Q# V) C2 G; }3 |
o_Sram_WE_n,! j9 r! G7 _: ^1 I0 ^. n1 u9 y
o_Sram_OE_n,
& a. J- I. u Q q; B, p o_Sram_UB_n,: o0 B4 f5 y/ @% m0 [! C
o_Sram_LB_n,9 E$ b: \7 S$ T, z4 Q1 L
/* Display */
7 {5 _' s1 a/ p8 F o_HEX,
& h8 M/ h5 o8 Y7 V# s N4 s7 A5 [ t_HEX);
5 X1 F9 Z/ m! Q 5 L" I* E# H9 c8 }& M7 I
input i_Reset_n;8 o( t$ M' X& w0 B0 k
input i_Clock; + E: E. `8 z0 |( o
input i_EN;
3 p# Q% F6 Z, V4 c3 H' o, ] input i_StepByStep;
$ Q( w# C0 t( Y8 w. [( \ input i_WR_Control;
/ o9 R2 U# N' C output o_W_FullSign;
8 D9 l, L6 s4 M9 L% c1 L /*SRAM Interface*/
& q9 Q' Q' ~" e7 S output [17:0] o_Sram_add;5 k& O, t! f! E7 S. L5 X6 B' d9 M
inout [15:0] io_Sram_data; * H G; r A; R1 i0 U2 U, i
output o_Sram_CE_n;4 m0 ?$ F0 f1 {9 f5 S$ Q6 e9 f6 y/ s$ V
output o_Sram_WE_n;/ V" h3 U) o" [- ^2 o& |0 c, R; k
output o_Sram_OE_n;
; W$ Q3 f& ]8 V& f a output o_Sram_UB_n; - y4 \) b, J, f* C8 X" ]( _6 s2 g( f
output o_Sram_LB_n;/ n/ K M6 }/ v* _
/* Display */ & A" q# l8 M$ z
output [6:0] o_HEX;
0 x, a' r, Q5 l6 |2 N output [6:0] t_HEX;- [6 |/ ?' R/ B! O! j
6 M- U- [9 h/ P
reg [6:0] o_HEX;: f1 Y9 C) s% V
reg [6:0] t_HEX;
: Y! L4 x% i: z. r- ?5 Y, Z8 q reg [17:0] o_Sram_add;
( m, W1 p0 g {- ~2 w4 H! p: Z reg [3:0] t_counter;
0 x$ D2 d5 ]* X! [! p8 Y" l$ Q reg o_Sram_CE_n;
, s/ H, m! ?' w reg o_Sram_WE_n;, }$ e5 }6 i, b+ q. T7 c% Q$ ^
reg o_Sram_OE_n;
& x$ s' v1 z2 q. U, x reg o_Sram_UB_n;
+ _3 `! t m/ o. U3 ` reg o_Sram_LB_n;
) p" f. [/ V2 V reg [15:0] Sram_data_in;
$ Z; F0 d. `- R5 L1 X5 N/ n2 }( `2 ^ reg [15:0] Sram_data_out;/ A7 o8 x( z8 e, O+ S3 Q" F
reg Counter_EN;2 D5 L p( {- x, M0 g8 H& l: {# [
reg [17:0] WADD_Counter;
7 c; C. V, p0 ~' ~2 u+ u$ C/ q# Z reg [17:0] RADD_Counter;
8 u) j+ C2 B- w( @& k reg [15:0] W_data;
P# l7 \1 y+ y3 l0 a ? reg o_W_FullSign;
5 }5 c' p) G& d7 N reg [2:0] Sram_State; % j( d. K- E% F; R3 m
reg i_StepByStep1;
% Q, m: L5 K1 W# n2 v. u reg i_StepByStep2;
# {( _) y& z$ J* | reg i_StepByStep3;* l* r6 n- ?( S, B
reg i_StepByStep4; c7 f9 x3 d. D1 w" F
reg i_WR_Control1;
- Q) x. ^) v% ^ reg i_WR_Control2;+ I/ ?( D% \! i! F; p9 B+ C
reg i_WR_Control3; & d o: }$ U5 D; L
- \; q/ W2 W# Y- Z9 g/ S always @(posedge i_Clock or negedge i_Reset_n)
: ?& K i, T0 L: ^& @$ @ if(~i_Reset_n)
?( d' c( @" P Counter_EN<=0;
4 v3 Q* h0 ]0 g* i) y8 _3 d- t else begin + q4 H4 j; B. \2 I# h4 D
if(i_EN)
7 Q6 t$ Y4 q. S/ P: v2 v Counter_EN<=0;
) b- D8 D: \9 l else K. ?- O/ j0 `) T' v* w n# `
Counter_EN<=~Counter_EN; 2 C# ]% C& B' f4 O7 c# O- e) C
end
9 h# a( @( |# b1 U( v- J( d( Q
; i5 f0 Z1 p, X7 y always @(posedge i_Clock or negedge i_Reset_n)begin
7 U2 @/ n7 L- n3 h P7 y2 a0 v9 D if(~i_Reset_n)begin
7 q6 L7 g6 V1 N8 I i_StepByStep1<=1; 3 e! z, I i- j% r9 B3 D0 ]4 t6 M% p( ~) M
i_StepByStep2<=1; F0 ?$ s( _$ ]! ^8 v: X3 @/ V
i_StepByStep3<=1;
8 g- o6 I) m+ [; v3 u7 ?! ^ i_StepByStep4<=0;
' F& L0 Y( y R# }- T% z$ A i_WR_Control1<=1; / C C2 L4 e4 u3 T. t2 Z5 T
i_WR_Control2<=1;
& e0 K/ E5 C7 \( \ i_WR_Control3<=1;
! V! y$ |) ^ r/ k7 a P8 k8 k end3 E( ^1 f, A( H8 ?' f6 u8 s
else begin
$ E6 o& J- V: w' v4 n) D; z i_StepByStep1<=i_StepByStep;8 _' |: M& n5 E2 L I0 j% U% U
i_StepByStep2<=i_StepByStep1;: t8 B; e" F: \9 r. H
i_StepByStep3<=i_StepByStep2;
' M7 U1 t/ G( E, @+ \' S7 @ i_StepByStep4<=(i_StepByStep2 ^ i_StepByStep3) & i_StepByStep3;
) L4 X: Y: h* ~- H i_WR_Control1<=i_WR_Control;
7 P! ^/ ?( ]' i i_WR_Control2<=i_WR_Control1;
. x+ y3 ^% ^& A5 v- A; V3 x: Y( \ i_WR_Control3<=i_WR_Control2;
- k, ~4 {$ l2 n% U# n; w end/ ?$ ^* |" y! t, r2 m
end
8 d; J$ I" F$ {& P b( Q' x# b; F
always @(posedge i_Clock or negedge i_Reset_n) 8 T) Y, l" F: h
if(~i_Reset_n)begin % r/ _8 S) g8 _ p
WADD_Counter<=0;
$ D+ S/ ~6 w, {1 z/ j0 H% ]# X o_W_FullSign<=1;; _+ o. {3 {+ g `7 d8 T$ x. k* M
end6 _) m: I, L: Y3 t% Z, ?. N0 s
else begin2 v2 S. D7 L5 s# ]: A
if(i_WR_Control3 &i_StepByStep4==1)
' N3 m9 @3 C5 Y if(WADD_Counter==15)begin % w: c; D; A. O" y Q, {' Y0 m9 P
WADD_Counter<=WADD_Counter;
( J* k8 U% R* K% L( t o_W_FullSign<=0;
* i3 v% ?3 Y/ d end7 G5 ^2 U, h9 Z1 z
else begin
6 Z2 i( n2 d+ ^/ {5 X e7 u WADD_Counter<=WADD_Counter+1;1 V }/ t! q u' ~/ P/ ^( K
o_W_FullSign<=o_W_FullSign;
' ~2 e1 m" c" o& ~4 L end
4 \4 r8 V% H5 @/ X( q. x h8 M else begin
, S, H: M9 I3 s6 r4 L# H* k WADD_Counter<=WADD_Counter;* s8 ~* {7 W3 G# y0 o8 ]
o_W_FullSign<=o_W_FullSign;: J+ v- d% o: g
end
! V k- Y2 ]3 H' A& x5 A' B end
& \) e0 \$ E7 B0 L$ R4 j
8 U0 G5 M0 z& j7 N; ` always @(posedge i_Clock or negedge i_Reset_n)
1 I( F3 L' n. C1 e6 h; a: ^ if(~i_Reset_n)begin
/ N7 r3 Z+ ~& {+ N. w" s+ H W_data<=0;; |2 N% H2 _" {% O
end
; V. X* @) }4 N$ G else begin
' `" U5 A6 D5 H; T( Z if(i_WR_Control3 &i_StepByStep4==1)
" T* \2 K# o, R3 _: f if(W_data==15) 6 O; L1 J. k6 a1 S: b* v
W_data<=W_data;
/ v+ ~# m4 ]4 D, J9 m else! @% ?8 _+ v- s
W_data<=W_data+1;
7 z) y, z6 Z; D: Q& p! m else
! X' f5 m& s7 S W_data<=W_data;
/ s1 k5 g* c V6 t. G7 l" t end
n) w1 Q K; Z* p# n' ?
( M# z& H& y8 i: L+ B always @(posedge i_Clock or negedge i_Reset_n)1 j& P, v/ T4 s* g
if(~i_Reset_n) $ T# E/ S3 Y# e
RADD_Counter<=15;( d1 ?! y: H2 N* H8 u4 Q
else begin
4 j Y& L1 D! X7 ~3 B, G. R if(i_StepByStep4==1 & ~i_WR_Control3)
, s" i: q) H4 B! R$ U if(RADD_Counter==0)) n# K3 ^8 T ~5 g. X
RADD_Counter<=15;
) y9 |$ D% a2 M0 Q) M9 _: [ else
0 @ g* v- h( A3 @! K, z, l; E RADD_Counter<=RADD_Counter-1;* q9 p; [* h8 v! f1 S
else : d- Q; n ~" ^4 C3 s
RADD_Counter<=RADD_Counter; $ J( T2 ]$ z( A3 A7 C
end
- x4 Y/ Q1 m- y9 _7 A: n
. e+ n0 F; K9 |( t4 S parameter IDLE =3'b000;& D2 v ? ^: x6 i( I6 a# v, P
parameter READ =3'b001;
4 `+ _6 S! x7 L/ @ parameter WRITE =3'b010; ; o" R3 K6 Q7 [+ M
' D3 h. \6 g! m; B$ b$ ~ always @(posedge i_Clock or negedge i_Reset_n)
. c9 k3 |0 U+ m if(~i_Reset_n)begin 6 j6 I% R( i/ H) Q$ c2 @/ F
Sram_State<=IDLE;
, ~* w2 S2 a' W4 T% ] o_Sram_add<={16{1'b0}};
# G1 ?& k! P+ B5 k Q9 ^2 v0 U& R5 I Sram_data_in<={16{1'b0}};
% _* L3 [: F3 o8 e7 n Sram_data_out<={16{1'b0}};* D( p/ Z) c: C; [$ }
o_Sram_CE_n<=1;; C+ n, P) j# y' e2 |) n
o_Sram_WE_n<=1;
# e, ~0 u+ t/ b3 _8 x o_Sram_OE_n<=1;% S! s; L. H9 Z% x3 M# u* d$ i
o_Sram_UB_n<=1;3 q+ K- Z( x e' \
o_Sram_LB_n<=1;
/ {+ X4 N7 t; o: |( R end
" o6 P! |1 r: R* A# U8 |( Q. r else begin / ?. ~) c2 ^/ L9 E
case(Sram_State) ; m3 Z% @: Q" y* `( N, u
IDLE:begin
& b/ E8 _& n+ E1 Y if(~i_EN)begin : m$ `5 ^) U: f5 t0 g& k- m% P
if(i_WR_Control3)begin 5 E0 a' V) Z. s( m+ `! H# u8 q
Sram_State<=WRITE;
i5 @% D E; J0 x, j' Y' @0 C o_Sram_add<=WADD_Counter;
9 |1 R, p: x' n: j5 _4 o5 Z# l4 Z; s- v Sram_data_in<={16{1'bz}};' v6 q5 s6 X, }( S3 Q( L
Sram_data_out<=Sram_data_out;
0 w8 e( |. @! T( U5 x o_Sram_CE_n<=0;5 v/ r( `2 m! D: P* `; t
o_Sram_WE_n<=0;
) _% r1 S5 j5 z9 m0 w o_Sram_OE_n<=1;2 G& r6 O2 g/ o N5 d% ~
o_Sram_UB_n<=0;% N& Z- ^9 {) J
o_Sram_LB_n<=0;
" W) x% S4 C. b, y+ D E end
7 {% r0 S) r! k1 C/ A$ t/ w" S else begin - K: o+ o7 h9 M* \) L
Sram_State<=READ;! U6 J, ~- @% T9 b8 r% t. L
o_Sram_add<=RADD_Counter;
- ]/ t7 u) k5 y Sram_data_in<=Sram_data_in;1 O; f+ }3 v) W0 D6 `
Sram_data_out<={16{1'bz}};
! T7 n1 Z$ `( |. v! B o_Sram_CE_n<=0;
- G W2 r2 Q2 ^+ V1 T2 B: b o_Sram_WE_n<=1;
) m( u( \* C4 X: c, v# \ o_Sram_OE_n<=0;9 Y* ~( K: P: `' ^5 f
o_Sram_UB_n<=0;! c- v3 V1 y7 D' T/ H9 n3 T
o_Sram_LB_n<=0;
2 ~. b$ D: _: z, K end
4 n5 X5 t# @. h0 j- Q& U* E/ k end+ K+ w2 g6 K, L! d, R
else begin " T3 j, J. k) v- y
Sram_State<=IDLE;
9 o3 w9 N0 a7 C$ v. { o_Sram_add<=0;/ v0 S2 j+ r; f; u
Sram_data_in<={16{1'b0}};
2 Y" t* s0 f+ f, M1 h Sram_data_out<={16{1'b0}};
) W: T5 H) L& Q, [ o_Sram_CE_n<=1;
: ^5 u3 J5 e) r1 i o_Sram_WE_n<=1;/ m8 R# i0 L5 d+ J
o_Sram_OE_n<=1;3 J0 ~$ u% ]2 q$ ]% s) W
o_Sram_UB_n<=1;9 F+ {6 v- j% M/ r# [
o_Sram_LB_n<=1;
: b/ M: A" b* v g* w end # h1 ]( w$ e6 ]4 |
end8 q% `! G' G, m, m. w7 m: N7 w
READ:begin
4 ]5 Q+ h5 M* V Sram_State<=IDLE;
; `0 c0 E0 P) z7 ^ o_Sram_add<=RADD_Counter; ; i( y$ ?$ t$ ~% O& ]# p7 F5 j
Sram_data_in<=io_Sram_data;
- G+ X& g" g: A6 Y! l8 h; P& k Sram_data_out<={16{1'bz}};9 A, p4 T" [1 q6 \( ~
o_Sram_CE_n<=0;
2 K7 _0 t! v! ^9 o$ Y1 { o_Sram_WE_n<=1;
, [0 y& C. F/ I8 u( X0 n- t o_Sram_OE_n<=0;8 ^$ B+ i5 G2 K$ `; M
o_Sram_UB_n<=0;
# X" ^% j* `9 A( U$ {) I o_Sram_LB_n<=0;
6 ]; }0 C' G$ r3 @ end ! {# }) w- z* a3 {( ^: @, z: z3 K3 V
WRITE:begin) c1 J% `1 b8 v: M0 Q2 x* X
Sram_State<=IDLE;
+ B% {1 Q4 V: c7 A o_Sram_add<=WADD_Counter;
e9 \3 i4 \, c' C Sram_data_in<={16{1'bz}}; P0 N0 g0 Y, ?& ]* l6 P% d* f* ~
Sram_data_out<=W_data;
* ~" y2 m1 }- V: {3 n! [& Z# l o_Sram_CE_n<=0;. e+ s8 Z& l4 b: l( Y' ~
o_Sram_WE_n<=0;
) A* P9 |$ v; _9 }0 e* M) _ o_Sram_OE_n<=1;8 }( ?% ^7 D1 T, ~+ A- u: A
o_Sram_UB_n<=0;" F/ o4 K5 }8 L! r8 l
o_Sram_LB_n<=0; % ?8 G% q2 z$ X* M9 A
end( ~* h. B4 `3 z! M' g1 \
default:begin
* I: e0 Y: p* |5 ^( E" _8 h Sram_State<=IDLE;& M0 D H- |8 u3 t# H
o_Sram_add<=0;: t+ {* p3 m0 H( T7 s
Sram_data_in<={16{1'bz}};
( E- F) G( c0 b! j7 f) R) R; @2 E1 G Sram_data_out<={16{1'bz}};
9 G( K" Y2 w& i/ P/ Q7 g8 w o_Sram_CE_n<=1;
/ f8 N) f, t6 f" b: ^' e o_Sram_WE_n<=1;: e) R f% h! v" a. R+ U# i# a
o_Sram_OE_n<=1;
8 W1 N$ X( d- z' o o_Sram_UB_n<=1;4 |7 G" K, @9 Z! K( h
o_Sram_LB_n<=1;
' b/ ?$ i6 j0 v8 \. U0 x end
# g: O @- y' u; i endcase
( i* ^/ c' j2 u end, V: I. c& F. x+ r6 Z1 @: L. ~
assign io_Sram_data=(i_WR_Control3)? Sram_data_out:{16{1'bz}}; * }* g O/ E) y' q1 D
, M8 E. k6 e) A& M& s- d
always @(posedge i_Clock or negedge i_Reset_n)7 j, r1 v% t& k$ f& u! m+ [9 v( D
if(~i_Reset_n)
# D) v4 u4 @# }9 }) f* O* j4 L o_HEX<=7'b1000000;
8 j( |- P( D I. [* Z$ H2 b4 { else begin . K, s. s4 k0 X! s
if(i_WR_Control3) V" w# F3 R( s4 ]# h6 `) O9 }
case(Sram_data_out[3:0])$ g+ I4 _! d: X* V
4'b0000 _HEX<=7'b1000000;
% h2 d2 O7 W* ?( s 4'b0001 _HEX<=7'b1111001;
0 e A& h0 Z) h1 c- \ 4'b0010 _HEX<=7'b0100100;
$ m' Z$ r( N$ K- f9 Y7 z 4'b0011:o_HEX<=7'b0110000;9 s0 }8 G3 Z0 Q( r2 A/ p
4'b0100:o_HEX<=7'b0011001;
( t3 L9 t9 l. V* Y4 z( [7 h$ a 4'b0101:o_HEX<=7'b0010010;. @5 D& ]% L2 W. a" m
4'b0110:o_HEX<=7'b0000010;
/ {2 o) o4 i& R3 w! h 4'b0111:o_HEX<=7'b1111000;
/ q7 {3 p+ j* `9 X& b2 R! z% V5 w 4'b1000:o_HEX<=7'b0000000;
7 C- y' F0 ?3 [ 4'b1001:o_HEX<=7'b0010000;
+ U, H' k: k9 D( o. t 4'b1010:o_HEX<=7'b0001000;- g( D" a4 Q; f# x% x
4'b1011:o_HEX<=7'b0000011;
9 {& V& ]5 d$ q 4'b1100:o_HEX<=7'b1000110;
; \- ?9 A6 P8 I2 y5 f4 r 4'b1101:o_HEX<=7'b0100001;; e6 P2 l( X& ?0 _% A! w4 Z! x
4'b1110:o_HEX<=7'b0000110;! ]2 M( r, {( ?3 H
4'b1111:o_HEX<=7'b0001110;: ?' |( ?# Y4 p+ D' y
default:o_HEX<=7'b1000000;
" n+ u- n0 a3 J Z8 M9 g: d endcase ' V7 O9 J9 _7 @, {" ?: J
else9 I( `' L, @& l8 ?3 x$ t: d5 ^
o_HEX<=7'b1000000;
' f* a- F, g& ?; f6 ] end
( c( Y" k( f( B! R* u
5 X7 r& O) ]5 U% }! Z; D1 c7 T$ Y always @(posedge i_Clock or negedge i_Reset_n)
$ j: Y4 D) P" t2 l$ C6 x if(~i_Reset_n)
& Q1 C6 ^" q" z! u' I t_HEX<=7'b1000000;
' h9 V9 g2 [5 m( b+ L: | else begin . Q3 _, \3 {1 k ~7 V2 `! g( `
case(Sram_data_in[3:0])5 m% j N" @3 } z" Q" l
4'b0000:t_HEX<=7'b1000000;% V( \/ e% ]5 A) @6 g4 q# \
4'b0001:t_HEX<=7'b1111001;& b- g! H$ M3 H, j: P/ N
4'b0010:t_HEX<=7'b0100100;
$ B/ y+ b8 u* X W* S* r% o 4'b0011:t_HEX<=7'b0110000;
/ }/ R2 i; U# x4 c4 [( i& O 4'b0100:t_HEX<=7'b0011001;, F0 F& ~# R2 F8 H# \ I4 y3 I b
4'b0101:t_HEX<=7'b0010010;
9 @6 A+ R: E! M7 h; k' _1 d 4'b0110:t_HEX<=7'b0000010;
3 Q3 y# ` h( g, l 4'b0111:t_HEX<=7'b1111000;
$ O0 g& E/ B: f 4'b1000:t_HEX<=7'b0000000;! T6 H) u8 @) x- \
4'b1001:t_HEX<=7'b0010000;+ n7 x3 z" p4 m. j& n$ r
4'b1010:t_HEX<=7'b0001000;; v+ W2 b9 G9 J% {( _
4'b1011:t_HEX<=7'b0000011;0 C. @6 B3 }0 \* p. P
4'b1100:t_HEX<=7'b1000110;
* j! Y9 I8 R% \& |: c 4'b1101:t_HEX<=7'b0100001;
L: O) b# f6 Z3 |/ `9 G$ q9 L; s 4'b1110:t_HEX<=7'b0000110;# t" `$ \. P6 Z, K7 A
4'b1111:t_HEX<=7'b0001110;
5 L5 Z7 Y9 i6 Y* J default:t_HEX<=7'b1000000;- G7 g+ `' A3 N2 J
endcase
- x& ?5 t6 M3 G' K end
2 ?' F, s; C7 a* X: I7 U+ Y+ ^3 [
! t9 g( |1 x: V9 b% L) L) _endmodule |
|