|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点
7 j/ a$ Y% E3 }/ f$ p控制外部SRAM需要注意什么?
3 q ^, I8 Z# V' z0 O3 E在代码风格上如何描述更稳定可靠呢?6 v- O) ]4 q- E/ V- T% e: L
8 _+ x; k2 Z5 B6 b
module SRAM_TEST(& y, M" J; b1 P. m
i_Reset_n,9 }# V) x6 w. e2 S
i_Clock,! h: e' g9 W+ F# A
i_EN,8 W" o% v' Z7 d# V! b6 h3 W
i_StepByStep,: l5 a, P$ i0 q+ V V
i_WR_Control,& C5 s4 b" n- _* f$ P$ N" n7 ]4 w
o_W_FullSign,
( Z% Q }+ V5 T /* SRAM Interface */
, R+ H! L3 ^6 b, b, n. Z- | o_Sram_add,2 W8 ]1 y3 _6 `2 p' N' l
io_Sram_data,# ^ q+ ^, d0 E- ^
o_Sram_CE_n,
3 ]- j$ n. g+ s5 D; p o_Sram_WE_n,
* Z+ Z) F7 U- S o_Sram_OE_n,! h5 _0 E8 h% G4 t: {
o_Sram_UB_n,! D9 h2 _ D% L* H
o_Sram_LB_n,4 v ?: m6 m! S2 E( j
/* Display */! [; D2 H, y" s' Y
o_HEX,
2 L7 `9 m0 \: U1 k2 X: b t_HEX);
; t' f, e, T% d' T' w" [ , x' e/ e. _0 u* v" u4 v" k
input i_Reset_n;8 i2 O6 u. y. T; o. e7 L4 M
input i_Clock;
! G' i7 X/ e# ?% j& l input i_EN;& g( J+ Z1 y# c: @ T- k* [) B
input i_StepByStep;
1 S4 \; P# w/ {+ M* i% r input i_WR_Control;7 }/ r( v5 H; j5 M- j' n) Z6 _" T( G
output o_W_FullSign;
& s% g6 @* ?) v% A7 [# s4 r6 D) g2 J /*SRAM Interface*/ _6 r' f7 n3 s& B
output [17:0] o_Sram_add;& p u% ]0 T, `; f. F: I1 |
inout [15:0] io_Sram_data;
9 d$ I9 [: _6 U' F T4 q: K. S output o_Sram_CE_n;
* m2 N1 W" I( C output o_Sram_WE_n;. V* z( L( C/ ~3 ]* A" x; e8 j$ i& @8 T
output o_Sram_OE_n;
' n, |1 g: a1 s2 ~( F6 K ]2 ~ output o_Sram_UB_n;
) Y3 u) W; i5 x5 x" @5 R output o_Sram_LB_n;
0 L, z( ~/ t7 ^% `9 V6 k0 g /* Display */
2 W3 h, Q3 N( S" f output [6:0] o_HEX;7 x. f* B" q7 o ?* {5 w8 ^" S
output [6:0] t_HEX;4 F( }+ s7 }4 m
|2 q4 |9 l' P
reg [6:0] o_HEX;7 r3 {7 Y& t2 J6 q5 y2 D' v
reg [6:0] t_HEX;
J/ b+ r& s9 |$ f, z5 | reg [17:0] o_Sram_add;
+ ^0 x8 R( { R- ^ reg [3:0] t_counter;
" l; s: X2 L, |5 B$ n# u reg o_Sram_CE_n;" @: `+ v; g9 I# v5 r
reg o_Sram_WE_n;
7 v% c1 q0 h9 K: u' r reg o_Sram_OE_n;
0 [/ h9 |: l1 H, D reg o_Sram_UB_n; ( k9 c5 e4 l8 S" X X @
reg o_Sram_LB_n;
( `% G$ E6 d- V6 |1 r$ {. }: ? reg [15:0] Sram_data_in;
4 P) L& H( s# }- O reg [15:0] Sram_data_out;' d# S' T: L1 r# t+ V5 l
reg Counter_EN;! Z% q' A ]1 l* S1 @: `
reg [17:0] WADD_Counter; 1 [6 ~/ _6 d$ s0 B/ T
reg [17:0] RADD_Counter; 6 u8 K1 W+ T7 L! d" W% e
reg [15:0] W_data;
7 p% T+ O" m9 o/ [5 y5 f, w; O- _5 ^ reg o_W_FullSign; 9 K% P! ?* E6 y: L( D. {5 q
reg [2:0] Sram_State; / s( w( [6 @5 ~+ m2 _
reg i_StepByStep1;. r- a5 R7 e0 F+ L/ Q/ T0 H
reg i_StepByStep2;
4 [0 q- t& J* g w reg i_StepByStep3;
$ ^9 R; X6 X: i0 K: c reg i_StepByStep4;' y' J5 Q. ?3 g/ R
reg i_WR_Control1;. f, X3 i3 b' }: P
reg i_WR_Control2;
0 ]4 E4 s: l9 s, } reg i_WR_Control3;
/ V) F( B( _$ p' t
& t2 X0 g' X- }8 _; `; |" y% e always @(posedge i_Clock or negedge i_Reset_n)
( E5 a8 k1 E) {' u! d' ~ W( c. ^6 H2 x if(~i_Reset_n)% T: M1 @) _/ `
Counter_EN<=0; 2 h( ?9 P7 X& ^1 Y: t2 I5 w! T& H
else begin
4 O5 R1 e' ?8 D if(i_EN)
% d1 l, |4 W; a Counter_EN<=0;
5 d( o# E" x+ K) C% S else3 |+ [6 A) C6 R, f5 r R* O
Counter_EN<=~Counter_EN; % b' w! t. x' j. P, c+ w4 O1 \
end
7 n4 [; u1 K: R8 x, L / [9 x/ N t/ ]' v& W
always @(posedge i_Clock or negedge i_Reset_n)begin 2 H3 |" q; T5 J
if(~i_Reset_n)begin ( G0 z, E/ T. c7 f. e% l5 ~
i_StepByStep1<=1; 0 ]/ ?$ Z( O/ U2 ]
i_StepByStep2<=1;+ x0 C3 r6 ~! Q$ a* F
i_StepByStep3<=1;, a1 S6 R1 R: y
i_StepByStep4<=0;& y4 U7 w% @3 C, [5 W' X+ r
i_WR_Control1<=1; & G2 V, a) i# z7 a7 \; l
i_WR_Control2<=1;
1 M8 Z3 j% n9 [% T1 M i_WR_Control3<=1;- Z* ]3 {. |9 P0 D
end
1 v1 h+ [( J- s5 ?% ~8 A9 e" i* x else begin
/ D7 A1 q& W. K4 f$ [- P# { i_StepByStep1<=i_StepByStep;; T) e2 B) d% f3 V _. M5 }
i_StepByStep2<=i_StepByStep1;2 U5 R' g- ~- }) Y3 j$ z- K
i_StepByStep3<=i_StepByStep2;
6 b6 I- u, ?8 } i_StepByStep4<=(i_StepByStep2 ^ i_StepByStep3) & i_StepByStep3;- }* P) j: a% k0 F
i_WR_Control1<=i_WR_Control;
! m7 X X) ^1 F$ [: e i_WR_Control2<=i_WR_Control1;: ]: O: |" x6 j9 J9 [' ]6 U# T
i_WR_Control3<=i_WR_Control2;5 J4 ~# i3 k( A% E
end: U' P; _8 N, U. L/ S6 i& k
end / w E2 t S' ^$ q/ T; y6 z3 ^7 B! n
; k0 u, a* b9 I1 d- T
always @(posedge i_Clock or negedge i_Reset_n)
! k/ b+ [: k2 b4 l/ w2 Y if(~i_Reset_n)begin
: s1 _0 i4 r- [% l WADD_Counter<=0;
! ~ B; f' Q6 ~6 ? ` o_W_FullSign<=1;
6 C3 `; W* K4 d: A4 C' z end" x+ Y; t- f7 r0 Z
else begin. Z6 I' e" n$ C* H
if(i_WR_Control3 &i_StepByStep4==1)
2 |2 g. s! a. n+ g+ T if(WADD_Counter==15)begin 1 \ T$ {' ]$ L. F
WADD_Counter<=WADD_Counter;
) ?0 s$ e, w7 X8 ]4 n" f o_W_FullSign<=0;
% y& A8 A7 U: L9 \; \- L. W end6 D z; \$ h. V# J8 V& C
else begin
$ C" C8 U# k+ h; J WADD_Counter<=WADD_Counter+1;0 P U# D% X3 b) v8 Z
o_W_FullSign<=o_W_FullSign;3 P: W2 \+ e6 O( [; n; t
end: A' ?7 C9 s3 {
else begin
9 M, t* t6 D' H3 R WADD_Counter<=WADD_Counter;$ R& g: Z2 H6 ^8 @5 F' J1 b
o_W_FullSign<=o_W_FullSign;0 f; S! a) @. E# w/ C- w: e
end $ I- `; n! u3 O4 G
end' V9 S, C. C* ]3 T' E' i
. N. B; v+ P: x always @(posedge i_Clock or negedge i_Reset_n)
( p" V8 l. O: U9 i2 J1 R: ~ if(~i_Reset_n)begin
. L' A3 r0 O: F- b W_data<=0;
/ F6 E/ G7 T0 q& k9 B) ~0 ?# J' R end : h6 V$ a; J$ O m. i8 m
else begin
5 G! K h5 @3 e7 n' }; Q" c1 L if(i_WR_Control3 &i_StepByStep4==1)5 L$ U' a0 ^7 W5 Y2 L' Y
if(W_data==15) & E# h7 D% x) S9 u4 O
W_data<=W_data;
$ H3 O0 |$ [. N3 [0 A0 k1 G else
- e# ?& n' {* F- Q% g# b: A W_data<=W_data+1;
( O1 K7 Q+ H3 u- J else
* i% \" s# N9 M, j0 c3 M1 i7 X W_data<=W_data;
7 L% q7 d( \' ?+ A end3 H/ H/ v/ j/ g+ X
3 g; \- o( n- _. V% }0 l. I
always @(posedge i_Clock or negedge i_Reset_n)
+ `, L- Y) L0 Y% J L3 P* |0 s if(~i_Reset_n) $ }' F2 B$ y' G5 q( Q; u) \# L/ l
RADD_Counter<=15;
5 f4 z) \ g( H: _, B! F5 L# U else begin, W! z+ O3 |# R$ E3 r' R' l7 \! d
if(i_StepByStep4==1 & ~i_WR_Control3)8 B9 R- K2 f. }3 g4 g
if(RADD_Counter==0)1 S' P- l8 ?& m# [7 K, }) {
RADD_Counter<=15;
9 i, }; {; C3 k! y" x4 _( L else- I" R* l4 n" |8 t* E2 A
RADD_Counter<=RADD_Counter-1; s+ k L) i. o6 E
else & h) Q2 d6 T5 f
RADD_Counter<=RADD_Counter;
( o- j# \ m+ N# d! j end, ^, B. B2 Z" J) ?
* B# x- u: j1 ? parameter IDLE =3'b000;
; z+ B& f: ^: q5 N. }0 Q: f9 W" @ parameter READ =3'b001; 8 E6 n. m* M! M- B/ s% W7 E
parameter WRITE =3'b010; 3 w$ n/ J+ \& @" G2 t( C8 T0 {
+ G; u% |0 B) D s: X8 p# U- I! C
always @(posedge i_Clock or negedge i_Reset_n)
" ?7 `' k$ m) I& K# O8 q8 U+ c+ U if(~i_Reset_n)begin 8 }$ O$ w4 `5 Q# g2 J4 M& j
Sram_State<=IDLE;
% E0 I9 x* }, \5 A2 }% q o_Sram_add<={16{1'b0}};. f( H- o R, a* ]1 `; T
Sram_data_in<={16{1'b0}};
4 z. @! P4 S; r; v Sram_data_out<={16{1'b0}};1 q* G# X( W8 L" ^4 F: ?: o2 L
o_Sram_CE_n<=1;
8 ^: A" t9 B% Q' T( F o_Sram_WE_n<=1;
2 F1 U% G- v( |9 { o_Sram_OE_n<=1;- v" B, y% c$ j* s* K% x/ E% P
o_Sram_UB_n<=1;# W r7 f+ z% E$ q0 [
o_Sram_LB_n<=1;( [2 r) B: D$ k. ~
end% B$ e; f, `4 b' l* j, k$ H
else begin . K; Q" y5 R- X9 W: S, B" W& o
case(Sram_State)
! I% G& d# @) y; \* T) X5 G% @ IDLE:begin ^6 n8 p+ t. j/ r; o5 ]: v
if(~i_EN)begin 9 `) U8 `% O2 k% N( d8 J
if(i_WR_Control3)begin , \' _0 y$ G3 A1 i |( M! E$ L9 c
Sram_State<=WRITE;4 ~2 T. L7 S* ^* p- J
o_Sram_add<=WADD_Counter;
% [% L; y/ Q. h. z, {$ q2 R2 d: R Sram_data_in<={16{1'bz}};2 Y; Z f6 M+ H& n" f
Sram_data_out<=Sram_data_out;
( h( [* @4 e/ V. [+ z o_Sram_CE_n<=0;
" u' u9 }- @% i# O# I: X% w o_Sram_WE_n<=0;! J1 Q! u, W1 |5 _5 l
o_Sram_OE_n<=1;
% |: a( i! E% _7 D: j o_Sram_UB_n<=0;
" P( ^9 l9 n# Y; J# t o_Sram_LB_n<=0;
* o/ G- L) Q9 S5 s9 } end
- o1 ?% i" Z2 ] else begin
* l" u5 Y5 A( H7 \+ F: P L v Sram_State<=READ;" Y, Y" z, x8 o& l0 F6 K
o_Sram_add<=RADD_Counter;
2 }3 D9 _- ?% x* M0 f8 g9 S6 s$ W' c Sram_data_in<=Sram_data_in;9 ?) v! R3 S) G% ^
Sram_data_out<={16{1'bz}};. d# Y( v0 O9 M1 v+ W# t% S1 l
o_Sram_CE_n<=0;
, V {5 W E j5 }+ B3 G3 M1 I o_Sram_WE_n<=1;
- ~& G/ {1 b' i x# C9 A o_Sram_OE_n<=0;
1 \; v( i8 e3 G o_Sram_UB_n<=0;& f8 T0 B8 }' X7 v
o_Sram_LB_n<=0;# F3 \/ D3 p& [1 M. D' Y
end
! D* l! @# z1 J end
* I+ e) s/ [5 k" v( l else begin
7 M: D) c4 E- ~( s1 k+ [9 h Sram_State<=IDLE;& \ f0 |& j; B! _8 u
o_Sram_add<=0;# b4 S) o+ B* y4 q: P
Sram_data_in<={16{1'b0}};5 o: C4 B; ~+ m- q, |
Sram_data_out<={16{1'b0}};2 v; e. O0 F6 n* G; U
o_Sram_CE_n<=1;0 e" _3 _5 N, ?- H8 ?5 I
o_Sram_WE_n<=1;; i9 t1 z. l: h" {
o_Sram_OE_n<=1;
# B! Q' g" s% w o_Sram_UB_n<=1;9 T5 |9 ^; F1 o% f0 F
o_Sram_LB_n<=1;
+ G7 L' B" F" T$ V6 e4 I end , U( [& ]( Z6 K' s8 ?
end
8 g: w5 Q) b/ j6 @, F/ z) Y READ:begin 1 Q: Q' G7 d$ U2 E% i6 _, }2 ?
Sram_State<=IDLE;
7 r w# F+ O! c% a1 { o_Sram_add<=RADD_Counter;
8 w6 h& z+ T; h7 T0 w& L" u Sram_data_in<=io_Sram_data; k3 J- U5 S) o% _) j4 S) g+ G
Sram_data_out<={16{1'bz}};
6 g) T Q5 F, {: a& u o_Sram_CE_n<=0;
% G! e; m3 z _ o_Sram_WE_n<=1;
- v: r8 c6 r5 H7 Q# Y. e o_Sram_OE_n<=0;
: m) C* [, S( Y! } o_Sram_UB_n<=0;) c9 K: O, g0 X2 S5 y! u2 v
o_Sram_LB_n<=0; " C/ d" `# y* ?; P: R
end ) |0 G& |: E/ ]4 e; o+ G, N
WRITE:begin
; Y4 }( X3 w' E. D1 W/ E Sram_State<=IDLE;
* i& p3 M H4 O1 g o_Sram_add<=WADD_Counter;
5 U, n H7 D2 b m1 g( I H Sram_data_in<={16{1'bz}};
/ R$ Y% Z, g* ?# I. L8 V+ u Sram_data_out<=W_data;0 h- G9 A# u+ b; m
o_Sram_CE_n<=0;: Q# \( r5 g5 u" p: K) M
o_Sram_WE_n<=0;4 W. l9 n* O3 R4 Z8 y) P/ N9 t
o_Sram_OE_n<=1;
3 v) F6 x" i' d o_Sram_UB_n<=0;
4 \; u4 W7 H! T* X% ^' {" w( o o_Sram_LB_n<=0;
4 N6 R( X# P z- ~. ~7 [1 V end4 i* H. n7 c9 X- L/ ~6 Z/ T
default:begin
( b; i! E! r) I Sram_State<=IDLE;$ m2 A6 i# A6 H
o_Sram_add<=0; b( O$ X. y- [" A+ q5 b
Sram_data_in<={16{1'bz}};! u: e$ }+ ]# N
Sram_data_out<={16{1'bz}};
! B( M% ?5 r* C" o o_Sram_CE_n<=1;
; N" {5 N# q0 L- j, }0 Y o_Sram_WE_n<=1;7 g. N4 d! Y8 a* P3 A
o_Sram_OE_n<=1;
4 a0 E- x. H4 H o_Sram_UB_n<=1;; G$ O4 F+ H0 t9 o
o_Sram_LB_n<=1;
1 C' T8 s1 L E) t end; }& c/ `/ s' C9 k/ s2 j& c) l
endcase
9 t7 C( z' L% }% P0 e end
- }7 _" o0 T* H5 G assign io_Sram_data=(i_WR_Control3)? Sram_data_out:{16{1'bz}}; % M1 L$ N9 _' f- ]( i
* D: w& r" g5 o3 _7 m7 T always @(posedge i_Clock or negedge i_Reset_n)
) }8 h4 U L7 N g if(~i_Reset_n) 4 N6 R; C+ g4 y0 B0 _
o_HEX<=7'b1000000;/ G7 @1 a A; j4 A1 y
else begin
7 f0 ]$ ^) K6 c+ A5 f% h+ p# r if(i_WR_Control3)
9 |7 v) E6 A( f l7 @ case(Sram_data_out[3:0])
2 ?7 c" Z" ~+ J$ s 4'b0000 _HEX<=7'b1000000;2 u$ z. ^; f# D# O, `7 ^3 L
4'b0001 _HEX<=7'b1111001;
3 b$ ?0 j F$ K5 R$ A 4'b0010 _HEX<=7'b0100100;* S" Z* u+ l5 D' c% Z) T
4'b0011:o_HEX<=7'b0110000;6 h' X6 K ^5 \' O+ O2 E; l; ^+ b
4'b0100:o_HEX<=7'b0011001;
; |0 B8 |5 _/ v 4'b0101:o_HEX<=7'b0010010;
9 Z" g7 I, E& |; ~ 4'b0110:o_HEX<=7'b0000010;9 H! v& n( C& A6 D
4'b0111:o_HEX<=7'b1111000;; a6 K" I+ L1 r+ F/ a7 z5 Z
4'b1000:o_HEX<=7'b0000000;
; E# t) F1 |1 f& X! U. T 4'b1001:o_HEX<=7'b0010000;
) h2 @# _" L: \6 y' r 4'b1010:o_HEX<=7'b0001000;
7 [- q& i# o8 H% ]" J1 F/ S 4'b1011:o_HEX<=7'b0000011;
) T' ~, n3 _+ ` 4'b1100:o_HEX<=7'b1000110;
4 M2 B& A7 D5 E$ p; j! ~; s/ o7 s 4'b1101:o_HEX<=7'b0100001;$ W7 T6 G; {- ?/ V' }( @
4'b1110:o_HEX<=7'b0000110;( `) |8 {0 _9 Y9 g A6 d$ X& U# \
4'b1111:o_HEX<=7'b0001110;
2 A" Y5 u, a7 D0 W* V$ T/ u; |3 o default:o_HEX<=7'b1000000;6 B* D3 j( g, T3 g, |
endcase + C5 F2 t# T8 S7 w) S6 @' c
else
+ s, \+ Q/ d6 v |' o o_HEX<=7'b1000000; 6 U- g! R* Q [" z) K3 u
end
& |, `7 U: @: }/ R) B
0 D8 `& Q. @, Y! M/ k8 ]2 h T" J always @(posedge i_Clock or negedge i_Reset_n)0 E: F* t5 R$ ^" W$ l* {
if(~i_Reset_n)% p* a2 z$ w& J9 z r8 L I
t_HEX<=7'b1000000; 9 _0 I, N$ D5 s: U
else begin
$ j; B2 C3 z; @" L case(Sram_data_in[3:0])6 ^1 J; j' N' [7 x" t4 f" i7 v& [
4'b0000:t_HEX<=7'b1000000;
. S( }8 W% `" c8 ^, P# T0 | 4'b0001:t_HEX<=7'b1111001;
2 O8 k- L5 f3 X1 P 4'b0010:t_HEX<=7'b0100100;. k" P' p6 h; ^
4'b0011:t_HEX<=7'b0110000;, G4 E! S" N+ p/ h
4'b0100:t_HEX<=7'b0011001;" j+ Y. \- E. \6 d' S
4'b0101:t_HEX<=7'b0010010;5 y( O. y! M/ b1 V9 r2 \4 T6 u
4'b0110:t_HEX<=7'b0000010;9 C$ v$ y* ^' K
4'b0111:t_HEX<=7'b1111000;3 Z- q6 ^; F [! J
4'b1000:t_HEX<=7'b0000000;- J& U6 j1 D1 h0 i. ]& V, z1 V
4'b1001:t_HEX<=7'b0010000;
) h2 B; F2 y# p2 {" n4 B 4'b1010:t_HEX<=7'b0001000;
' \( k" T6 y. A7 _* m) s! r) z 4'b1011:t_HEX<=7'b0000011;* M j6 |% R$ E0 O& Q
4'b1100:t_HEX<=7'b1000110;
4 ?4 F9 h% w1 @5 h7 |; H 4'b1101:t_HEX<=7'b0100001;7 D5 X0 B0 x; r# ~+ v
4'b1110:t_HEX<=7'b0000110; `3 I/ h C# z5 b- a A
4'b1111:t_HEX<=7'b0001110;
, e9 I0 m+ L- A# A' w. |- g default:t_HEX<=7'b1000000;
1 `" Q7 D& T4 J8 U, h4 T5 j endcase . h1 d0 Q& r% _! H4 l4 w
end3 M0 z4 T! G* G2 R- E7 M. _
8 _- X! S; z, j9 h5 Y% ^( zendmodule |
|