EDA365电子工程师网
标题:
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点
[打印本页]
作者:
mengzhuhao
时间:
2008-11-10 20:34
标题:
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点
0 N s) `- T, I
控制外部SRAM需要注意什么?
. f# O5 F( m& B% e0 K& a- p; `
在代码风格上如何描述更稳定可靠呢?
( X# @( \* y* W
* N$ P* M) n+ {# _
module SRAM_TEST(
! ?5 N0 `, O/ h# e" @
i_Reset_n,
- o5 `- G% E4 {) V
i_Clock,
k8 B- ~$ s4 @( h; t
i_EN,
( S6 c; Y" m# V, r' q
i_StepByStep,
3 c$ u' D6 u7 h
i_WR_Control,
6 t, f C9 [. i/ c
o_W_FullSign,
- W/ S. Q) Q+ P$ d3 {+ N
/* SRAM Interface */
4 E: F* R& p$ [! q" j
o_Sram_add,
5 E1 W2 @* j# I% v& N) B% t, y! {# E
io_Sram_data,
' `( Y0 `0 l( L/ }" y" S" Q
o_Sram_CE_n,
2 o2 x+ d7 G8 D9 E
o_Sram_WE_n,
/ T* \& J) ~7 _
o_Sram_OE_n,
! b' g: j9 T' H6 |! A
o_Sram_UB_n,
% g( n* b5 G2 b
o_Sram_LB_n,
3 e/ J% x* D$ D, {' s' ]4 {
/* Display */
* Q& V. I0 C6 [: m7 a
o_HEX,
0 @! R. O* a& D1 W
t_HEX);
0 P' U3 {' e$ q8 Z8 Q1 N
1 h+ G: W9 s$ u. ^) E; B8 g+ X+ F) j
input i_Reset_n;
% e* @5 f2 w* i1 c
input i_Clock;
% e. i7 S6 J& y# z; [- H4 E/ h9 t
input i_EN;
6 W B% v/ B% X0 m$ D7 ]
input i_StepByStep;
1 A8 j& c) T$ A& ^5 Y5 P, |5 k
input i_WR_Control;
@8 ^2 Q3 W- r8 |) \. W" {
output o_W_FullSign;
: P2 e% j9 { E
/*SRAM Interface*/
" X+ w* C5 Z7 X5 Y$ K3 ]
output [17:0] o_Sram_add;
$ ^% Y+ g, ]5 k; O
inout [15:0] io_Sram_data;
( H7 E" }' Z% i$ E. m
output o_Sram_CE_n;
9 T+ W# O+ G1 A/ T( {
output o_Sram_WE_n;
, l, d4 ?" ?; N( x8 @/ @
output o_Sram_OE_n;
- j4 m$ ?8 B( \# l/ T
output o_Sram_UB_n;
7 c0 L0 T- H t& N3 S! \
output o_Sram_LB_n;
) I. B; @$ g+ L: O
/* Display */
$ K" J, @" P4 K
output [6:0] o_HEX;
' f' ~8 _; T' \, {6 J! S
output [6:0] t_HEX;
7 |( S& a- B8 r, G+ C
, M& u& a* k7 e1 \0 T
reg [6:0] o_HEX;
* H) a' [1 E- t1 \# n! N
reg [6:0] t_HEX;
* ]* v4 B& l, R# W0 j. B
reg [17:0] o_Sram_add;
U" j6 C4 C4 Y% o: ?
reg [3:0] t_counter;
5 |+ g" w- _3 ]' M( f
reg o_Sram_CE_n;
% J$ W- ~& L0 k8 H, x
reg o_Sram_WE_n;
- C m2 I, s7 j( \( |+ ?
reg o_Sram_OE_n;
' K8 Z0 [5 m4 v2 r
reg o_Sram_UB_n;
! j) Y: a, ]& N0 e. a
reg o_Sram_LB_n;
; ~/ B7 ?( N3 V! N4 n- D
reg [15:0] Sram_data_in;
+ S( O. W% i [& {9 i- U" y
reg [15:0] Sram_data_out;
4 V1 v3 Q0 f: B0 l+ f1 O8 d
reg Counter_EN;
0 z7 A5 F+ B) E. x
reg [17:0] WADD_Counter;
' |. \; N: L: E4 g
reg [17:0] RADD_Counter;
3 k ~0 `/ e8 l. P) G
reg [15:0] W_data;
: O$ C) x5 P" B$ ~! C: D1 T
reg o_W_FullSign;
e0 Y) \6 f4 Z$ H
reg [2:0] Sram_State;
6 K0 M5 t. A& w Q2 T: B
reg i_StepByStep1;
0 f, {' M0 v( u/ R) z/ I, ]% t% _
reg i_StepByStep2;
5 R7 u1 q7 M$ b @
reg i_StepByStep3;
9 T2 \6 X5 g8 Y7 l
reg i_StepByStep4;
- m9 \$ _5 j2 @* d( F& ?" q! f
reg i_WR_Control1;
: b, |1 I; x6 V3 \
reg i_WR_Control2;
1 X9 e! r- @" p) M
reg i_WR_Control3;
& V1 Y/ c5 d& W5 p! `4 V
7 p( t0 A7 b+ C, |, N1 n1 j( i. Y
always @(posedge i_Clock or negedge i_Reset_n)
% W1 K3 I T8 Y1 o$ \; Y N
if(~i_Reset_n)
9 R5 |* V* r4 z; \# o1 w
Counter_EN<=0;
" z) A9 A1 f1 H B
else begin
M) C7 }, ]1 j- u/ K7 L
if(i_EN)
% I4 m# e9 `2 r0 P
Counter_EN<=0;
2 P6 v n. N- y; r8 ?1 j
else
- O' q+ P8 N0 ~2 X& @" J" `: h# d
Counter_EN<=~Counter_EN;
L1 i9 k3 Y& c; Y& x
end
& x; T2 K( r" w$ g; X" x
6 y3 d/ p6 K! z' D2 Z+ j' l. [
always @(posedge i_Clock or negedge i_Reset_n)begin
( N0 n" Q7 @( v/ D
if(~i_Reset_n)begin
, M3 B+ C. I; W9 P1 F* b
i_StepByStep1<=1;
6 E1 Q" C; s, F6 _: \. d
i_StepByStep2<=1;
( v2 J% ^' b, d1 e
i_StepByStep3<=1;
' H5 c! Y$ u; E( q+ W" f
i_StepByStep4<=0;
: d4 }! ^3 b$ Q1 D) V
i_WR_Control1<=1;
' I, ~# O: v" Z- \+ k/ z# |' Z- C3 F
i_WR_Control2<=1;
8 ^8 G8 {( L$ S/ o
i_WR_Control3<=1;
8 }, c$ m8 p3 _1 r5 \3 ^2 _
end
" ^# T* I- {$ `4 Y* ]4 C
else begin
" g7 p# @5 _0 ~3 c; ]
i_StepByStep1<=i_StepByStep;
" \, G4 K6 J2 i! w8 s1 o
i_StepByStep2<=i_StepByStep1;
! J5 h. F$ U# g; o9 G
i_StepByStep3<=i_StepByStep2;
3 [( |( R9 U2 V5 F; R
i_StepByStep4<=(i_StepByStep2 ^ i_StepByStep3) & i_StepByStep3;
, F# g; Z M# c, S
i_WR_Control1<=i_WR_Control;
( f6 C8 l# Q# T
i_WR_Control2<=i_WR_Control1;
0 v( y$ L7 `- {
i_WR_Control3<=i_WR_Control2;
- D9 d. b# W. W; Z
end
. T& M! W, w8 `1 L- m
end
/ v9 _7 y. G, f9 V, m6 _
/ C- A6 d1 O0 Y
always @(posedge i_Clock or negedge i_Reset_n)
- I1 K% U" B1 H& g. z$ M5 R* v
if(~i_Reset_n)begin
1 | @$ p0 ~& c8 U6 t: R$ c6 U
WADD_Counter<=0;
+ }+ t7 B1 P5 L
o_W_FullSign<=1;
. X, F6 q# u( Z- O( J2 M5 i) c% L
end
' g) X# l& Y3 A( E8 M
else begin
4 R3 b$ F# f* W1 {3 H
if(i_WR_Control3 &i_StepByStep4==1)
. v- A0 q9 L( y+ l/ D* Z
if(WADD_Counter==15)begin
) Y2 X9 r2 E. ?0 N
WADD_Counter<=WADD_Counter;
$ m% K# J2 ^" g
o_W_FullSign<=0;
" Y) X0 E5 _! F) C+ G" m" E1 {7 W, K
end
& i$ l" ?" z$ h& E, x: x8 t
else begin
% |/ v5 z: n/ s
WADD_Counter<=WADD_Counter+1;
1 ~ b; {5 Q2 ], E5 T6 ^' }9 m8 n
o_W_FullSign<=o_W_FullSign;
8 |% P2 F8 J+ G0 }5 T7 v8 ?
end
) X8 D8 ^+ a i/ L3 \) `# F: B: j
else begin
0 O3 \8 @4 e4 [ S2 \6 @
WADD_Counter<=WADD_Counter;
9 s4 A( }5 \- b
o_W_FullSign<=o_W_FullSign;
/ W1 k. ` s. T) f! X
end
% H5 {+ M w7 w; ^5 q* B+ q
end
, ?+ }$ e# o8 u* j
* ]7 \3 l2 f4 C) Y6 {* z
always @(posedge i_Clock or negedge i_Reset_n)
) P" q- p$ m" Q/ k# P" ~
if(~i_Reset_n)begin
1 I b+ Z- E6 q3 \! y
W_data<=0;
4 s* J* `: F4 p8 h' M1 c
end
: t$ p$ @1 @0 y
else begin
& ~$ F* T; i- |# w% @+ r. n
if(i_WR_Control3 &i_StepByStep4==1)
0 ?$ m- j2 U4 w
if(W_data==15)
; A0 H$ j6 V' A. l& W m
W_data<=W_data;
! P7 |# r; p; t9 ]/ ]& m
else
! T( A' R5 P( o) k* P
W_data<=W_data+1;
( q" S/ u2 Q( \8 x5 v' y
else
# N, `( j( W. _+ o B
W_data<=W_data;
0 ?9 C+ U( P) c* s
end
. w/ `4 r# x4 L/ h& l* }- v( M
4 R' N, J! o% G( Q1 L3 b
always @(posedge i_Clock or negedge i_Reset_n)
7 `% n; O1 s3 z; H9 _" q: j8 { T
if(~i_Reset_n)
0 ]% N. ^% K( ~; u4 h9 w/ R' k( m ~
RADD_Counter<=15;
6 A+ I$ P( i8 C r3 r
else begin
! u; Z' A& ^; u
if(i_StepByStep4==1 & ~i_WR_Control3)
+ |: ~* G+ n) [' b4 L0 f
if(RADD_Counter==0)
! h' W; O& c9 a
RADD_Counter<=15;
t& B+ j( E0 L j% L
else
/ \& R/ Y E- L! H8 u! @0 L* \# `
RADD_Counter<=RADD_Counter-1;
6 [( @1 b" N, p) f) L% O# W
else
8 Y. E1 h. K+ f2 i; z) ?8 V
RADD_Counter<=RADD_Counter;
4 m( y% I7 i; D* {) a: a
end
* E" Y3 C3 b9 P& y
2 G2 y K- H; p5 v' u! Q- C. C) S
parameter IDLE =3'b000;
) v7 P9 ]: X8 M6 n
parameter READ =3'b001;
. v& A8 \/ i+ Z! `) P, O% o' W3 o
parameter WRITE =3'b010;
8 P9 ?+ n2 n1 m5 f# A
3 |, J- l' j: U
always @(posedge i_Clock or negedge i_Reset_n)
0 v# ~2 I5 B1 N! d& Y$ G
if(~i_Reset_n)begin
1 X$ Z9 l6 F9 p' M, j, j" d E' Z
Sram_State<=IDLE;
- k0 v3 g t6 @0 a2 f2 A* [7 F
o_Sram_add<={16{1'b0}};
' w9 z; w+ F" h; a
Sram_data_in<={16{1'b0}};
1 |* w) r9 n( ^+ P) h" F& C& v" b
Sram_data_out<={16{1'b0}};
* U, p' U5 n9 }8 @. W. u: Y
o_Sram_CE_n<=1;
- i( n7 h8 U) w( j/ a/ K. i
o_Sram_WE_n<=1;
9 W- c; s8 a( E1 d% l7 z
o_Sram_OE_n<=1;
) A% K$ o L6 j( B% \
o_Sram_UB_n<=1;
6 F5 F! v. i e) X& f. `
o_Sram_LB_n<=1;
/ Y( ]: A: R& u
end
, [1 `! u7 A) U
else begin
/ @! Z& l. _ o' z$ L, Q
case(Sram_State)
" C) ?" r/ @5 A7 p" b
IDLE:begin
K* i9 E5 T0 b+ R
if(~i_EN)begin
/ Q* o0 }& g# U# O
if(i_WR_Control3)begin
; p8 e$ n5 Y, {
Sram_State<=WRITE;
/ a' q' N* M K/ ?
o_Sram_add<=WADD_Counter;
+ k% t. f* @9 E3 D( g8 I# u1 y
Sram_data_in<={16{1'bz}};
0 i1 g+ F' M a5 `; D$ A* [) g# o
Sram_data_out<=Sram_data_out;
# r. F ^6 |$ @$ \" ?( Y
o_Sram_CE_n<=0;
7 F& e5 r# T- p) d% V: l
o_Sram_WE_n<=0;
7 z- f0 r" G4 i' S! x/ S+ W; L9 X1 k
o_Sram_OE_n<=1;
0 ]) Z; Z% z1 `" S$ B# f
o_Sram_UB_n<=0;
1 E' n" W' z) J: v- B& P1 J9 n
o_Sram_LB_n<=0;
( v, Y5 d8 L; C; T. ]) R: S
end
7 S I, [( T7 K/ h1 Z& x/ d7 U
else begin
, `0 i! h# _# ^. ~8 S+ l
Sram_State<=READ;
+ U! V' D* X f2 p+ O. q
o_Sram_add<=RADD_Counter;
6 i/ L: P+ T3 T" M4 J
Sram_data_in<=Sram_data_in;
+ b" x$ u" Z# W) w: z
Sram_data_out<={16{1'bz}};
! ?9 s: |1 N. k
o_Sram_CE_n<=0;
4 l( q! ~& {. T4 e5 `
o_Sram_WE_n<=1;
# B0 U5 j4 X: g( A0 i* s: _$ Z, ?
o_Sram_OE_n<=0;
6 Y1 G K. w4 ]- K! O2 v$ T
o_Sram_UB_n<=0;
$ f ^2 M3 \0 M% H4 {
o_Sram_LB_n<=0;
' f) p0 L8 ^" X1 P
end
3 r8 l# c1 R/ h
end
0 b' |1 [7 T8 ]
else begin
( B; ^0 m7 b0 T: l8 ]
Sram_State<=IDLE;
8 D; y+ r z" c! U$ ^+ V5 O
o_Sram_add<=0;
X! |9 E$ A9 }) ^
Sram_data_in<={16{1'b0}};
9 F! n1 R& b. A$ i; L- b4 P
Sram_data_out<={16{1'b0}};
5 y- K, q. Y4 B; ]
o_Sram_CE_n<=1;
5 N- E1 [! E* O* [+ H5 s$ M
o_Sram_WE_n<=1;
. w' {; K2 V n
o_Sram_OE_n<=1;
+ L+ ?3 @0 w7 H
o_Sram_UB_n<=1;
5 U0 C$ Z* n" T3 Q. w
o_Sram_LB_n<=1;
) y K, C* j3 W* g( L
end
( k7 e% i5 D" T# b3 l
end
9 W+ f/ \6 W$ |/ A5 U1 t
READ:begin
8 Q/ a1 h4 ^# h+ _
Sram_State<=IDLE;
2 N& A6 _1 f) e
o_Sram_add<=RADD_Counter;
: j$ Z& |0 V6 g+ H" Z5 Z
Sram_data_in<=io_Sram_data;
$ k0 {7 P8 R# m5 c& B3 Z! M
Sram_data_out<={16{1'bz}};
% i7 T h5 A8 d. ~. T- u, b# N
o_Sram_CE_n<=0;
/ m2 a: t" d" e
o_Sram_WE_n<=1;
# `8 K8 A+ _" r7 }
o_Sram_OE_n<=0;
% o! F+ y" ~# W: s& r3 i7 c
o_Sram_UB_n<=0;
2 b7 _0 j' `9 ~, A
o_Sram_LB_n<=0;
. e1 V( t- x+ H* o
end
. K! c6 e" M& m. {
WRITE:begin
4 I0 b4 w( a0 l3 i( A6 O. L I8 g
Sram_State<=IDLE;
z: t# U& m" h) z# y+ g* F
o_Sram_add<=WADD_Counter;
! v; N! Z8 u, h" B, f+ O% ~1 T
Sram_data_in<={16{1'bz}};
% I; ^2 r' L. P4 z/ ?6 c& h
Sram_data_out<=W_data;
9 n) w! l/ a; ~2 t
o_Sram_CE_n<=0;
I6 R* m/ x4 C$ m5 @) ^
o_Sram_WE_n<=0;
1 i% V p" u8 n. G0 c7 E8 a
o_Sram_OE_n<=1;
! q, _8 P. e# S6 E3 c8 M- _
o_Sram_UB_n<=0;
9 y# k. D- i& e' s
o_Sram_LB_n<=0;
- z0 s: v3 q( w3 i4 i
end
5 ~ U7 W+ r! E4 w8 ?5 R! L# o
default:begin
) D! [ `7 u- f
Sram_State<=IDLE;
1 m, @4 B- t8 ~: J3 Q, \
o_Sram_add<=0;
: D6 c0 d9 }- d
Sram_data_in<={16{1'bz}};
" i& J5 i X8 ~
Sram_data_out<={16{1'bz}};
0 V7 c5 l% P- B. A) q+ m" {9 E
o_Sram_CE_n<=1;
/ S) M8 \) |& j- c4 u! J) E* K9 a: ^
o_Sram_WE_n<=1;
, S- M8 M) k+ U+ g- w& m7 R: |
o_Sram_OE_n<=1;
5 V( L0 z3 R- f* C
o_Sram_UB_n<=1;
" S$ f$ r" O" P: m
o_Sram_LB_n<=1;
6 f# m0 a, K5 b7 M: |
end
! L c' o& i" u" z0 A9 h
endcase
; K4 _* x- }. q& U# y" f7 o
end
4 A4 c( b. u+ M, s9 a0 v
assign io_Sram_data=(i_WR_Control3)? Sram_data_out:{16{1'bz}};
, }4 M5 c: `$ Y$ t+ Y4 P( c
" E$ s, W- K. {1 L3 a0 U; t. E' T2 }
always @(posedge i_Clock or negedge i_Reset_n)
- o( h# Q1 B2 ^2 L* ~6 R
if(~i_Reset_n)
) r) o/ E1 C6 P. e0 \- z( m
o_HEX<=7'b1000000;
* g0 d; A6 e8 ~( D8 g
else begin
8 k7 O6 K1 L: p; q/ U9 i$ K
if(i_WR_Control3)
* k8 R& ?1 _ ?
case(Sram_data_out[3:0])
* {; r2 Z) f$ L9 k
4'b0000
_HEX<=7'b1000000;
1 P# \' D' ~& _0 K; h# z
4'b0001
_HEX<=7'b1111001;
1 K6 E# \% H5 Z; i# }' ]2 E
4'b0010
_HEX<=7'b0100100;
; b( Q; g- k8 s* g
4'b0011:o_HEX<=7'b0110000;
2 z& v! G4 i1 t3 P
4'b0100:o_HEX<=7'b0011001;
+ [3 h: B: ?) {) l* P$ M
4'b0101:o_HEX<=7'b0010010;
( f9 O' k- k- z+ l% ^! n
4'b0110:o_HEX<=7'b0000010;
9 P/ W7 m) P3 b$ u; ]
4'b0111:o_HEX<=7'b1111000;
8 U! I$ _1 b% O) [; }8 ]1 l
4'b1000:o_HEX<=7'b0000000;
" C5 [0 R0 [/ K. t# v0 O- r
4'b1001:o_HEX<=7'b0010000;
: E5 z/ j7 ? F* y* X. Q5 \% E% {
4'b1010:o_HEX<=7'b0001000;
5 Y, U/ s. g6 b; J8 j
4'b1011:o_HEX<=7'b0000011;
# ]* ^5 }+ K ?
4'b1100:o_HEX<=7'b1000110;
% w! d4 r0 Y8 ?4 |
4'b1101:o_HEX<=7'b0100001;
9 m6 |0 t: G' {* R
4'b1110:o_HEX<=7'b0000110;
5 h, p. |5 e- d8 |
4'b1111:o_HEX<=7'b0001110;
, M$ o+ a$ F9 Q/ B O4 S; l
default:o_HEX<=7'b1000000;
, }1 e" c9 T. U/ q$ p
endcase
$ I) ~: E2 I0 y
else
6 o% \- W0 |( ]2 T0 v, x! b
o_HEX<=7'b1000000;
3 Q$ [$ W( B- ^+ C8 p5 M7 U+ l
end
" I2 |1 K' T/ T$ a" K
9 T1 J T; I% b
always @(posedge i_Clock or negedge i_Reset_n)
( F3 Y) W5 l; G: |: E6 q3 Q" g
if(~i_Reset_n)
* \3 d& D. [; U! W
t_HEX<=7'b1000000;
& L! l* Q* _5 F2 S: Z- a2 z/ e
else begin
8 L& N! t( p9 b) ]
case(Sram_data_in[3:0])
) N$ I) a& A/ F2 o2 i+ y; F! r
4'b0000:t_HEX<=7'b1000000;
9 a% x6 u3 f3 X/ D6 W! ~
4'b0001:t_HEX<=7'b1111001;
- j5 n% k( b) B' M: A) X" E
4'b0010:t_HEX<=7'b0100100;
% G5 X; p ~, R k. z$ j. |
4'b0011:t_HEX<=7'b0110000;
5 ?& c& q/ U$ s2 K, D# J
4'b0100:t_HEX<=7'b0011001;
2 X9 p4 U# R# Q# ^5 Z; N! t( H
4'b0101:t_HEX<=7'b0010010;
1 D& N3 |& y, j; J9 q( I4 ^9 F
4'b0110:t_HEX<=7'b0000010;
& b1 m- F- e* b& `8 G8 u
4'b0111:t_HEX<=7'b1111000;
: g. n1 ?9 r1 j4 N; w
4'b1000:t_HEX<=7'b0000000;
0 i9 Q' i7 f! h
4'b1001:t_HEX<=7'b0010000;
( `* m1 w; G" a" {" N A# Z0 ^
4'b1010:t_HEX<=7'b0001000;
5 ^, l9 `3 t( T- `5 u H D
4'b1011:t_HEX<=7'b0000011;
- H' m0 F1 r9 B
4'b1100:t_HEX<=7'b1000110;
4 v5 A! T. X+ v' Q% Y
4'b1101:t_HEX<=7'b0100001;
2 { i/ P! G4 K! V1 C2 R" i
4'b1110:t_HEX<=7'b0000110;
7 J3 k4 \$ t" k7 l
4'b1111:t_HEX<=7'b0001110;
0 d5 ~' B3 @8 z8 R5 x) y* }1 T, n
default:t_HEX<=7'b1000000;
* H' w3 a2 [: @% c
endcase
/ z& u0 A2 E2 L) g0 x, Q9 C$ p
end
S9 K5 o) I; K( d" C% o
5 A- w8 X$ D3 ^ P' G6 X. h4 U# D, u
endmodule
作者:
zlfxia
时间:
2009-3-8 21:37
这里好像比较冷清
作者:
marshal_li
时间:
2009-3-10 11:31
看看,谢谢
作者:
lihongfei_sky
时间:
2009-3-10 11:47
建议最好不要用异步复位
作者:
ljb_s1
时间:
2009-3-26 12:11
让人看的话,能不能写点注释
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2