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 begin4 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:begin4 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
      end5 ~  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
   end4 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
    else6 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