|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点
' A T3 ]3 ]- R, q) m& C9 M控制外部SRAM需要注意什么?
; `; p* l& O: f在代码风格上如何描述更稳定可靠呢?, l, O/ o) D2 H/ U0 b& w9 n
' p$ e. ^ t+ [
module SRAM_TEST(! O9 n, T# ? @# O
i_Reset_n,3 ^* N* S0 |1 r( `
i_Clock,: Z- `8 e0 D9 L$ a, K
i_EN,) {5 K; S" O1 R# |+ e( J# A8 P& Y
i_StepByStep,& s8 i0 j3 K$ ?, g" O) ^
i_WR_Control,
9 D3 o3 D9 t3 M) d# M6 j& K o_W_FullSign,+ z2 f1 d/ Y: M0 |' ?
/* SRAM Interface */$ d- x, U: Q! C& z" X; u$ K
o_Sram_add,# R# l5 g: I- Q) f* H; h
io_Sram_data,: u u' i8 L* P% }1 A J/ |7 E
o_Sram_CE_n,
) K6 z9 x8 v. G G' F! y3 a/ K o_Sram_WE_n,
& Y- T& S- D& E& h, X o_Sram_OE_n,
6 D; Q' P+ J) |) [. j o_Sram_UB_n,
; @* t& D) m. h! L: d1 P o_Sram_LB_n,
& D6 m( H1 c( R" U/ v& \ /* Display */+ r6 m6 {: ?! ] p
o_HEX,
! i- T- O% a3 E7 L; }& H7 k' k t_HEX);
) T7 L/ z$ y! e) G' m 8 }% e% l& c9 I0 z3 R2 E. ^& F( ~
input i_Reset_n;
* ?8 |$ x; g" H" b input i_Clock;
8 ?6 h4 d# T! J( T input i_EN;
$ w4 M4 f9 r) D input i_StepByStep;
/ T+ U D0 j1 s! X# G input i_WR_Control;& i8 E1 a j* [2 |: F1 S! e
output o_W_FullSign;5 u) o9 k0 N* P, u7 F- x& q7 `
/*SRAM Interface*/2 r) b( l3 k8 V% A6 W
output [17:0] o_Sram_add;
- ]/ {) ?, K5 Y$ X% |$ W inout [15:0] io_Sram_data;
& H' H, e5 o* z% P6 d output o_Sram_CE_n;, h' ?1 r; K) X7 V( o& n3 M* M
output o_Sram_WE_n;
2 O+ O1 q G! u! o( b0 _( e) h' L$ q output o_Sram_OE_n;! D( s9 q0 b- p/ b/ ^
output o_Sram_UB_n; $ A' t9 ?& c5 r, p- X
output o_Sram_LB_n;
* e6 X! p, {2 A4 ?5 ~ /* Display */
1 L4 D; n+ N. z7 J output [6:0] o_HEX;
/ [8 f6 n5 E' X output [6:0] t_HEX;
, P9 m3 w& A$ G- D9 U+ f9 C. [6 K 6 z! q0 [* m3 t# f' v$ h- y
reg [6:0] o_HEX;. S! O7 \* `6 ^* {" F+ K8 _9 [6 r
reg [6:0] t_HEX;
2 x; \3 ]; s' s reg [17:0] o_Sram_add;
0 {3 f Y/ F) l/ v- A" i reg [3:0] t_counter;
5 t1 o, a- C% I. W9 q3 f+ T1 l reg o_Sram_CE_n;
/ H$ u0 A# l. w7 Q' H. V reg o_Sram_WE_n;% A; M3 q* j }+ K* J
reg o_Sram_OE_n;
/ T2 ~* A9 [/ C" J/ V% ? reg o_Sram_UB_n; 5 e' C0 Y& j" ^+ E& R% K
reg o_Sram_LB_n;+ E5 K+ y1 ~8 |+ M
reg [15:0] Sram_data_in;1 w2 z! s% a8 E8 ]! h
reg [15:0] Sram_data_out;
7 v* m! F3 b8 }+ e* D reg Counter_EN;
6 B' z7 p9 ^4 p$ D% H+ ] reg [17:0] WADD_Counter;
4 Z, |" E1 l! Y3 J$ q4 E reg [17:0] RADD_Counter;
; V+ T" n. Z8 t& H reg [15:0] W_data;4 k) x5 U; L- L9 O
reg o_W_FullSign; " y2 T. p# H( z( H0 s! L5 J
reg [2:0] Sram_State; 5 a7 L1 h% S" W' A" b; y2 q- m
reg i_StepByStep1;* E4 v7 _9 D1 K) P
reg i_StepByStep2;' M* v" e, O7 u! Z m
reg i_StepByStep3;
7 e, e* F! ~& g Y9 j reg i_StepByStep4;, N1 m; @& c9 B' n8 B0 m7 ?
reg i_WR_Control1;
* w- F- i8 Y9 \$ ^+ u8 p' s: _ reg i_WR_Control2;/ F- a& x: k, |
reg i_WR_Control3; 0 K7 x }% I1 i9 j
% w" d4 l; r9 R( | always @(posedge i_Clock or negedge i_Reset_n)0 s- Y9 I, S) L! Z6 s- e2 U! ~3 V
if(~i_Reset_n)
3 D& A" t+ W. }( s" t Counter_EN<=0;
# O0 _0 ~2 `# D' r else begin
4 z* r Y) R+ {/ Q" l6 p+ F6 J if(i_EN) # @- l7 a# o; V' R% }. @* Y, g3 x
Counter_EN<=0;
% z- G: v" x% d4 Y3 ^ else4 a' L/ M" H# b: D# n+ ?
Counter_EN<=~Counter_EN;
! G* ~7 W7 _4 e9 d: v6 |6 m end1 {# V+ Y3 X( F
4 D+ B! @) W) {8 p2 B- o always @(posedge i_Clock or negedge i_Reset_n)begin % z. D; l% j* U' g4 a$ {8 o
if(~i_Reset_n)begin 6 p0 q/ Y/ @: Q8 q2 H; o2 |# p
i_StepByStep1<=1;
8 h% Q. d: l6 f+ V6 M8 p7 J i_StepByStep2<=1;
* [% _9 P& J" c. S5 q2 D1 o i_StepByStep3<=1;; i3 o" p9 s1 K- K! f8 G
i_StepByStep4<=0;
% M8 r" I; z3 Q. a, I i_WR_Control1<=1; 7 a8 Z3 Z5 F, N/ [
i_WR_Control2<=1;
7 D3 z6 {4 n- X i_WR_Control3<=1;, V" }. O* c8 P0 a2 U" j. O: h
end' r% W( H3 y ?' w
else begin $ t: y% C5 n' M5 T: p) v4 i
i_StepByStep1<=i_StepByStep;. D3 d5 |5 F. j- ^
i_StepByStep2<=i_StepByStep1;3 H# _1 {+ \2 E* m
i_StepByStep3<=i_StepByStep2;
; V1 l: t, O# q' X9 ^- k; d6 z- Y i_StepByStep4<=(i_StepByStep2 ^ i_StepByStep3) & i_StepByStep3;
+ A# L; F6 C5 m; U m" P' M9 f9 ^ i_WR_Control1<=i_WR_Control;0 {4 o( a6 f; c4 \
i_WR_Control2<=i_WR_Control1;. ?5 g- m9 i; u8 i$ c2 x
i_WR_Control3<=i_WR_Control2;
0 ~1 S# x4 v8 u end8 [% O$ _" e2 J6 p; b
end
( N7 R% |* a9 V) V 3 y' a L! e) L- T; C/ t
always @(posedge i_Clock or negedge i_Reset_n) : N3 f1 L; h- s' g+ a) o" w
if(~i_Reset_n)begin
& y& x$ V) h7 r; b+ J/ T2 P" @ WADD_Counter<=0; 8 a. a* p& r+ z3 Z+ f
o_W_FullSign<=1;$ @' b5 x/ ^6 ~- z/ G$ [, m$ r
end
3 Y: l+ d9 u, s- g0 l7 O2 Q else begin1 Y7 Z& X+ D& Q( j
if(i_WR_Control3 &i_StepByStep4==1)$ m& f& f8 [0 X( t8 K9 L
if(WADD_Counter==15)begin
' X6 A" F' q( P% ^" |. F WADD_Counter<=WADD_Counter;
% Y" B+ d) ~3 ~7 q6 A2 j o_W_FullSign<=0;
6 ^: Z8 K) p8 e end; |! d- _+ f% q8 r2 b$ J
else begin 5 L4 I# D5 E8 D
WADD_Counter<=WADD_Counter+1;
4 I/ u; i ^4 E$ g5 m! X+ K, [$ p! H o_W_FullSign<=o_W_FullSign;
! s1 U2 i. e2 ` end& b P- R5 W/ r j) v
else begin & G) {4 }& ?5 P+ |4 G, ^8 T
WADD_Counter<=WADD_Counter;# G: [$ D3 k" G/ ?9 B, W
o_W_FullSign<=o_W_FullSign;
l% }* {1 ?4 X& \ end - {+ w" r5 q' F& G
end* {. I7 ^" K6 L, y, ?( z) C. j& M
K4 i: R, T& T1 Q* o always @(posedge i_Clock or negedge i_Reset_n)
1 P& u0 |& F) u0 S% K5 J. j if(~i_Reset_n)begin
: ^7 ]+ d( h! M5 J1 c S8 d+ x) w W_data<=0;& F+ W. Y$ i. z" p: H6 C: {
end 2 r! D# e$ _5 d
else begin& {3 A% d* K7 R3 \0 m
if(i_WR_Control3 &i_StepByStep4==1)% |) |8 \: `& ?4 M" |& c
if(W_data==15) : e4 v* U; }1 U1 _: G. W8 {
W_data<=W_data;
' F6 q8 B) k x0 n else
F& [" Q) j( P& | M% w$ Q! P W_data<=W_data+1;1 a9 h) z9 V9 j1 @
else
2 R. R' {( i0 }1 R W_data<=W_data;
6 t% ?2 x. \( W2 q- C& L end" P4 L% ]0 \! ~ m$ F5 g
7 F2 m- U& F, N; k always @(posedge i_Clock or negedge i_Reset_n)
2 P( o1 n$ g& h4 V9 q0 s H if(~i_Reset_n) % B1 U: k* j+ r& q5 l
RADD_Counter<=15;
- F. D+ O, M- _ else begin. g' j! M- Z! D& V
if(i_StepByStep4==1 & ~i_WR_Control3)9 c U, @, a/ M$ b8 p" P
if(RADD_Counter==0)
4 d+ z6 Z" A% b; i b! l% {# Z RADD_Counter<=15;
* ~# [; R" r3 }0 d# H else
. ?& S) h. k3 d# F, x& @: r RADD_Counter<=RADD_Counter-1;9 ]3 @ C: j- c9 m7 N
else $ T' p) Z; r$ t5 U7 u" n
RADD_Counter<=RADD_Counter; ( r& X6 d& q/ l3 G% T$ }
end5 R. r' @) N4 e9 O
: @% S& A" t. c# K parameter IDLE =3'b000;
4 H5 C4 W5 G& `$ ? parameter READ =3'b001; . v! c, u8 n/ t& r) I
parameter WRITE =3'b010; ! N# X$ u( U: Z" M& x) H
; y0 L7 ?4 h+ i5 q* E. i% l% N always @(posedge i_Clock or negedge i_Reset_n), y) M1 _& X! ?$ G
if(~i_Reset_n)begin & J% [) X3 ]4 i; y4 R
Sram_State<=IDLE;
/ g! |- v, _4 W" ~. t n+ v9 X o_Sram_add<={16{1'b0}};" u O/ @" [& }2 W+ s8 ?3 j
Sram_data_in<={16{1'b0}};
6 U: b1 Y4 g% B& e Sram_data_out<={16{1'b0}};- ~! K3 D( r4 S" M& S: W. I2 x; x
o_Sram_CE_n<=1;9 {, z$ R& w- ^; P' l2 J4 e
o_Sram_WE_n<=1;
0 O7 n3 o9 }0 F o_Sram_OE_n<=1;& D: y) k0 Z7 ]
o_Sram_UB_n<=1;
; w3 J* W: }. Q* O) W. u5 S' x o_Sram_LB_n<=1;( w! `$ Y+ @( {1 |" X# v2 I+ p
end: ?/ h9 a- H5 l M1 z* F3 D
else begin " H- ?* i' A! T* y
case(Sram_State)
! _6 ^6 C2 v/ N, p: W! s- ? IDLE:begin
, b5 O3 i6 I) A: y if(~i_EN)begin * e5 D0 D8 w* h5 s
if(i_WR_Control3)begin A) S+ G* _& C5 I9 y% |
Sram_State<=WRITE;. z6 y7 R. ^/ _1 f
o_Sram_add<=WADD_Counter; 2 c- O5 {5 r. R: f, p% ?
Sram_data_in<={16{1'bz}};' S$ i$ K. Z3 R( }" X5 w& e
Sram_data_out<=Sram_data_out;* b/ `6 x$ j3 M
o_Sram_CE_n<=0;# Y9 m1 N7 K7 V) o" C/ l
o_Sram_WE_n<=0;
) d) j5 n6 M: [. m& { o_Sram_OE_n<=1;0 t5 Q# m" I3 @/ y. C( l R
o_Sram_UB_n<=0;+ n! \' q$ Q9 |4 y* @: F
o_Sram_LB_n<=0;
f! O1 t6 o4 b/ v" \# }8 `: W) K end $ G5 W/ I0 X6 ~
else begin
! R r; `# h" K! u1 Z Sram_State<=READ;
, t7 n7 X" j% {& Q o_Sram_add<=RADD_Counter;
' t' f: ~/ G3 T Sram_data_in<=Sram_data_in;/ S9 P) ?: g( }+ {1 F4 J# L
Sram_data_out<={16{1'bz}};* t& v) s9 Y; g# I9 P
o_Sram_CE_n<=0;) \6 T: r1 d F( R$ E+ u
o_Sram_WE_n<=1;
: b& e1 W) L7 w7 z- s2 g* J& N1 p o_Sram_OE_n<=0;
7 Z4 H2 u/ }7 b: h3 Q o_Sram_UB_n<=0;
5 |) h- j3 P2 ~1 ^+ y5 H7 ` o_Sram_LB_n<=0;8 F! h; c4 L8 s$ [8 l( a! h
end 2 W9 E6 Z8 A) g; I& f4 j2 c# d
end
1 q' ]" g" W$ P) g. G" d0 F7 t else begin : }1 {! c) O3 l% N. W4 ], T$ M
Sram_State<=IDLE;
) ]1 W+ T9 h' u/ y# k o_Sram_add<=0; U2 L X1 d( R
Sram_data_in<={16{1'b0}};
`/ F' x- }' j7 l8 D Sram_data_out<={16{1'b0}};
7 a' |* P1 u9 d- H" H o_Sram_CE_n<=1;
$ s. F/ k+ P- R: e! T o_Sram_WE_n<=1;1 f5 B1 n9 P0 U6 }1 q' { p
o_Sram_OE_n<=1;$ J% z. |# E1 x& F' J3 |% z
o_Sram_UB_n<=1;
2 O5 m2 d" Q" B8 v9 D) j, K0 g+ ` o_Sram_LB_n<=1;, ~3 A. D7 K1 K0 X5 s" E, ~+ p
end
. K* ~0 a9 Y0 O# [0 w2 r4 Y end
Y0 \2 u. }: O$ ~; J2 z READ:begin , E+ f' N& e9 z1 Z/ P
Sram_State<=IDLE;( g1 d: g: ~5 J: d
o_Sram_add<=RADD_Counter; - L0 e5 F, x8 B; J! t! H
Sram_data_in<=io_Sram_data;
, [3 B7 g, z1 } Sram_data_out<={16{1'bz}};
; }) j+ y' b3 h5 Q o_Sram_CE_n<=0;
9 r; Z, {2 |4 I, K* }- O o_Sram_WE_n<=1;6 G1 V+ x. ]/ ?2 X2 g% W8 K2 ?3 T
o_Sram_OE_n<=0;2 h: d" P" H( j2 U! T
o_Sram_UB_n<=0;
3 y; k" x8 a" x! U o_Sram_LB_n<=0;
; K% v0 X/ c/ f2 K7 g end 2 w: Y+ }/ P$ z) u# D! R
WRITE:begin
1 c* G% H* N0 r1 \5 B) s! e, o Sram_State<=IDLE;- a o9 A8 U" p N% W1 i6 ]
o_Sram_add<=WADD_Counter; : ?/ Q1 t& l2 M3 A* p6 B0 h
Sram_data_in<={16{1'bz}};8 j& `# Q! U# R2 f8 _
Sram_data_out<=W_data;
& n* a; ]) ]' t S4 M; E: ~ o_Sram_CE_n<=0;
* ~4 K8 T$ Q4 ~: X* N2 q* _ o_Sram_WE_n<=0;7 D7 h( n0 q$ t) D. q2 j( d
o_Sram_OE_n<=1;
! Q+ i8 c# D8 C o_Sram_UB_n<=0;: ^7 W' P* r& k8 D4 ~5 d0 D
o_Sram_LB_n<=0;
7 v0 i# `7 [5 A ?7 e1 D end2 h) V/ j" L& d) z' G/ W$ j
default:begin 2 k/ x" B2 R/ O5 D1 W) p
Sram_State<=IDLE;
, [* A" B- v: D7 @: a5 ^ o_Sram_add<=0;- H+ u) c1 b8 |3 |9 j! B* s
Sram_data_in<={16{1'bz}};, x+ }9 @/ ]! f" o. h ~
Sram_data_out<={16{1'bz}};0 `& _3 B, z" P' r" z- ]; r
o_Sram_CE_n<=1;
' t$ c2 m0 P, @0 w4 M& P3 o o_Sram_WE_n<=1;/ v) j0 U* }* S9 _% N3 M F- u
o_Sram_OE_n<=1;
% l! o7 Z9 M7 g1 m o_Sram_UB_n<=1;
! c a& P4 g" O* M4 Z+ D4 O9 p o_Sram_LB_n<=1;) Y$ C% K$ x) z) h
end
5 E+ Y3 ?* H m8 n endcase
8 P& l/ k3 }0 e# \7 a, \ end
- M9 u) I7 P! k( `6 r: \ assign io_Sram_data=(i_WR_Control3)? Sram_data_out:{16{1'bz}}; ( Q0 j Q3 H) C* q# t M1 ~
: A6 X9 F0 |9 }: j, | always @(posedge i_Clock or negedge i_Reset_n)4 k9 {* \' o" B& w* N& V! i1 W
if(~i_Reset_n)
( w% n% n8 ~' e2 j o_HEX<=7'b1000000;% a6 s7 n" f4 R" d# s/ i
else begin ' o: C5 U2 n$ P6 }/ o- k
if(i_WR_Control3)
& G& n* c( O1 u7 m0 X case(Sram_data_out[3:0])2 t7 {4 [' G; {- Z
4'b0000 _HEX<=7'b1000000;
' |& W5 K ]) q. d+ M) ?" [ 4'b0001 _HEX<=7'b1111001;+ w/ w9 ~/ v; V* } {4 f4 _6 m; V
4'b0010 _HEX<=7'b0100100;
5 F( b! H! x/ C/ _9 K 4'b0011:o_HEX<=7'b0110000;
t& z: j! m6 O' a# a) r+ L7 O9 o9 p 4'b0100:o_HEX<=7'b0011001;. T* T t; m5 s U' w) g3 a
4'b0101:o_HEX<=7'b0010010;
! L! w8 m- \5 s o+ t. c' I# \ 4'b0110:o_HEX<=7'b0000010;: z) ^. @1 ^" Z; \+ o! A0 z+ A
4'b0111:o_HEX<=7'b1111000;
9 p2 X/ {" [: [! a9 a 4'b1000:o_HEX<=7'b0000000;
# a$ J& A, ?, a9 i0 O* Y. w' H' S 4'b1001:o_HEX<=7'b0010000;
8 N" j$ t, v" D+ w 4'b1010:o_HEX<=7'b0001000;
! [/ k! ?' d/ q7 \6 F" u: q+ u; ~ 4'b1011:o_HEX<=7'b0000011;
2 U" ~2 l6 e, @ k0 Q, {$ N3 Y4 G 4'b1100:o_HEX<=7'b1000110; n8 E9 T7 p( m9 `8 G& z' Y6 n% r
4'b1101:o_HEX<=7'b0100001;. R$ p2 S% D# \2 S
4'b1110:o_HEX<=7'b0000110;
& q% [1 u' x* Y0 r* d" W0 f3 ^ 4'b1111:o_HEX<=7'b0001110;
2 l# |3 X7 s6 i* U& i+ [ default:o_HEX<=7'b1000000;$ y# m; K! h; [
endcase ( u. |& R# A5 S3 I: Z
else$ V7 Z- t# w. b$ b; A; z
o_HEX<=7'b1000000; 4 u2 a# }% I; n+ Q% o" |) K
end " c- p0 E- W0 a" A) T
+ e/ D4 ~# t) n0 ^/ l4 H9 Q7 W( e
always @(posedge i_Clock or negedge i_Reset_n)" ?) w g& ^' k) w3 d( B. r
if(~i_Reset_n); M+ T. q: A R( x% i: }
t_HEX<=7'b1000000; 4 _- x k! n* d3 b2 u
else begin
) j4 F: v6 |& X2 N" g- Z case(Sram_data_in[3:0])0 l# | H* u# t
4'b0000:t_HEX<=7'b1000000;: [: k, G& m; z, D1 q/ ], x) H6 D
4'b0001:t_HEX<=7'b1111001;9 z! d q5 L9 D k! c
4'b0010:t_HEX<=7'b0100100;) g& q/ J4 K. T
4'b0011:t_HEX<=7'b0110000;2 f1 ~2 ^! ^3 D1 l" m% C
4'b0100:t_HEX<=7'b0011001;
* I$ ~1 k$ ?9 i/ x 4'b0101:t_HEX<=7'b0010010;
8 F2 D8 V' h8 J1 T. f 4'b0110:t_HEX<=7'b0000010;9 u1 y+ c$ e' ^% J7 s
4'b0111:t_HEX<=7'b1111000;
( Z- r! ]. ]) T6 Z2 V6 z9 O% c 4'b1000:t_HEX<=7'b0000000;
% T- i4 t6 M/ F7 O9 `3 W 4'b1001:t_HEX<=7'b0010000;! m$ S0 z$ J' |& d6 y; g! R: G' Y4 ]
4'b1010:t_HEX<=7'b0001000;8 T8 u: w1 Y* ]; n! |* \
4'b1011:t_HEX<=7'b0000011;" M7 n3 D0 R$ b2 y( z
4'b1100:t_HEX<=7'b1000110;, p% x3 u& ?' k R
4'b1101:t_HEX<=7'b0100001;/ }3 U6 u% H3 H7 b2 r
4'b1110:t_HEX<=7'b0000110;* W( X i/ N6 U
4'b1111:t_HEX<=7'b0001110;, J/ P! k6 p' Y; K6 p9 A' l# |
default:t_HEX<=7'b1000000;
5 N1 l. v3 c5 s6 d endcase & |9 C8 V- g: m* @5 T( H& a
end6 F6 Y) S- B$ u" w6 u
( d7 h. F8 h* y0 s3 A" qendmodule |
|