TA的每日心情 | 擦汗 2020-1-14 15:59 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近写的一个SRAM控制器verilog格式 不对的地方高人多指点
. h# i- F0 d f+ Y控制外部SRAM需要注意什么?3 B; \- ~9 @# L' k* L! S/ w" n
在代码风格上如何描述更稳定可靠呢?( P- i# b; k. {1 [) D5 H; t
# p/ w. q) {* _( v9 ]
module SRAM_TEST(
5 l% `9 K% J+ D+ ] i_Reset_n,
8 l8 ]2 E4 j+ M/ x i_Clock,( c) p3 @; X [6 v9 E
i_EN,
4 u! V. O" x! l, G i_StepByStep,
) j; @/ y5 v( v i_WR_Control,& B/ R* Y% F, p, e n4 J d
o_W_FullSign,
% F' m5 `& j+ R3 C, j /* SRAM InteRFace */
0 O; d7 [* u: s+ S/ X+ f: X6 ?% g o_Sram_add,3 n8 O5 r7 r$ q1 p
io_Sram_data,
3 Q2 ] X0 r, m7 ^/ D, g4 Q) |# w5 } o_Sram_CE_n,
+ }( e0 j( J' Q o_Sram_WE_n,
% X' B1 A1 q* o' y- D5 ^& k% s o_Sram_OE_n,# y( L9 I0 i2 @& o2 Q, i$ j7 A
o_Sram_UB_n,( j: X0 v( M" `3 ~- H" z& T
o_Sram_LB_n,1 S# V: \% p7 y. b H8 E" u& Z
/* Display */
# ~) O. o# K4 d3 W7 |! q o_HEX,
5 q. g- V, B; D3 Y* y t_HEX); ) l# _* h* u# L# M) S
. Y$ t4 o" y F. v. D- |$ m; ] input i_Reset_n;! r* ]5 E7 i5 D; C8 E- A
input i_Clock;
# E; s# w9 K @( h# A input i_EN;( D+ k+ T4 n6 b+ Z
input i_StepByStep;5 X, ^1 ?& Y3 Q0 {( W
input i_WR_Control;0 k1 }: o0 B: e1 i) M3 e
output o_W_FullSign;
$ Z9 W" \8 Z) U1 f2 e, i /*SRAM Interface*/
E2 c7 N& H3 s% k' T9 w output [17:0] o_Sram_add;
. G6 E7 T: x# V' q' R' h; a inout [15:0] io_Sram_data; 9 q9 D" d! n9 S
output o_Sram_CE_n;, e! Z1 r( f) V7 P1 T8 g' r
output o_Sram_WE_n;9 }+ {5 H0 q6 s5 g V1 v
output o_Sram_OE_n;
; {# S" @" r2 e) ` output o_Sram_UB_n;
+ {# ^) N5 C ?: C, P& c3 } output o_Sram_LB_n;
; @% G; J- S9 { /* Display */ % @& c# m3 d+ ?1 ^$ E( R2 d
output [6:0] o_HEX;0 o; d( G' C6 b3 |& T
output [6:0] t_HEX;8 {3 _+ V# r/ _5 O& I
`1 d/ W! [8 T! X
reg [6:0] o_HEX; L# s# |- q2 V3 Q% i
reg [6:0] t_HEX;
4 j B A# X2 v2 Q2 m3 s W reg [17:0] o_Sram_add;5 n7 k7 f$ R. M. P/ U
reg [3:0] t_counter;
* p& l: {( q, B& K ^* d/ Y reg o_Sram_CE_n;
8 Q) _4 B, U8 o& A8 `1 g% @ reg o_Sram_WE_n;
# m* d. L q. c, |. e Q* A reg o_Sram_OE_n;( r" K0 M' x* z' H
reg o_Sram_UB_n; # Q5 C- }: Z: f
reg o_Sram_LB_n;4 G: n/ |2 z( K; [
reg [15:0] Sram_data_in;' J' V9 ?4 A1 ~0 F3 h
reg [15:0] Sram_data_out;
! B6 {. O" Z0 j% w& u reg Counter_EN;2 W; l) }2 q8 {' C# s
reg [17:0] WADD_Counter; 4 ]3 o. o. n1 B, h- S) i
reg [17:0] RADD_Counter;
7 U% m2 R* p0 k2 D/ C$ t reg [15:0] W_data;
2 f% X* ~' |. l4 j reg o_W_FullSign;
: l- e9 l% n7 z, F- K" q* p; v+ e reg [2:0] Sram_State; . U% Q" r2 a& c2 m3 {5 W7 Q! _
reg i_StepByStep1;
, G% k1 M+ z% X1 ` reg i_StepByStep2;
# ^; o: V' v5 o6 r2 q reg i_StepByStep3;
9 K5 o: p4 O- t' x reg i_StepByStep4;
/ @' Z! a. H' O reg i_WR_Control1;
, D, \* E% y8 o2 n6 M reg i_WR_Control2;
4 r" ~: q( g4 F7 X reg i_WR_Control3; % H0 Q4 f3 p: i) |
7 n9 l: X* n2 W6 R always @(posedge i_Clock or negedge i_Reset_n)
# F! }8 I* o$ F: O, A& ~ if(~i_Reset_n): K2 e7 g& y& A6 I! T, B% o
Counter_EN<=0;
2 D4 ~7 m9 r6 q, B5 w# T else begin " T2 w1 @ q& W) A& C
if(i_EN) : J( ?+ d6 o3 d; n$ T( Y
Counter_EN<=0;
5 R _, u( C6 U6 T else! U" E l9 S0 h* }
Counter_EN<=~Counter_EN; % @) d" j) U+ u
end
1 F8 e9 f, R/ O3 w; O2 |
7 H- c2 s# a( @+ A" J f always @(posedge i_Clock or negedge i_Reset_n)begin - u6 P9 R1 G/ \4 {. m% _. {
if(~i_Reset_n)begin 0 o9 J3 d6 U% N, @, l* f
i_StepByStep1<=1; ) Y( D* _* ~ w
i_StepByStep2<=1;
# A$ D, O g8 o8 j9 i9 r i_StepByStep3<=1;
$ l: u a f# w1 @ i_StepByStep4<=0;
0 I( U4 M( \6 C/ H6 n i_WR_Control1<=1;
$ i$ y: \9 v) O i_WR_Control2<=1;
% E; @7 `7 K' R6 p0 d i_WR_Control3<=1;
, D0 M8 V1 H, Y4 m' z end
1 F8 `' o+ h; ^% Z' Y else begin
5 b# j8 I. c2 g0 }+ A& b i_StepByStep1<=i_StepByStep;+ I4 O: o" j7 }, ^# s
i_StepByStep2<=i_StepByStep1;
: x- \6 w7 T. z2 j- f i_StepByStep3<=i_StepByStep2;
5 o( n/ k* k, k2 r5 R5 }' b. |. f i_StepByStep4<=(i_StepByStep2 ^ i_StepByStep3) & i_StepByStep3;' I6 N2 I5 C7 ]* p. y( `7 A) Q# f
i_WR_Control1<=i_WR_Control;: v. j6 S7 X5 D
i_WR_Control2<=i_WR_Control1;3 o# c9 |! R7 M% a. d( k5 D
i_WR_Control3<=i_WR_Control2;
# C1 z1 B6 Z, {) `+ H7 u end" g& V: V( \* K# j
end $ T* j$ O0 G- O% E7 j4 Y
2 |) s( Q! k) N& R9 F7 V0 g
always @(posedge i_Clock or negedge i_Reset_n) " R% c* u2 J. _9 b- o' v
if(~i_Reset_n)begin
8 j/ i9 o# G3 E3 n3 B# R WADD_Counter<=0; # O4 g. K% ~- ]1 Q
o_W_FullSign<=1;
/ e5 q$ ]2 D+ n- L8 W N end
7 k; ]+ a8 ^4 _7 F9 n0 z7 o( | else begin
2 [, c/ I7 @% V# G. g if(i_WR_Control3 &i_StepByStep4==1)
% P6 ]( q- x* h, B8 l if(WADD_Counter==15)begin * m6 Y# ^8 N! {+ x
WADD_Counter<=WADD_Counter;
; C- P0 M6 ^8 B7 M o_W_FullSign<=0;
* j7 ~" F9 x* v% ]2 c" s2 P$ U end
0 b1 @2 n8 R+ x6 ?) |0 ^- F: _ else begin $ A4 u6 a' P, y _$ P0 U
WADD_Counter<=WADD_Counter+1;
: ]4 {. M/ s, [- v8 Q2 p3 J o_W_FullSign<=o_W_FullSign;9 W! n9 b$ W% k7 o% q3 [
end
! |4 X* k6 b; Y1 K else begin & ^+ t; i& Z* O. }) V6 t; e0 {
WADD_Counter<=WADD_Counter;
* K2 S! C$ `+ z8 G o_W_FullSign<=o_W_FullSign;- Q5 j7 C& {8 E$ r$ _
end " r1 p$ _! o( [# }
end
2 V8 Q& i( v* z4 |" C
3 B* p+ x* M$ I8 f) s always @(posedge i_Clock or negedge i_Reset_n)
1 Z5 P; o X% }2 t! {3 {, D S if(~i_Reset_n)begin ) h, E5 O* }4 j4 ?
W_data<=0;
* o5 ^9 G5 g7 S) h# W" K" V% p end
$ o+ {; n" Y4 w, Y& m else begin, d! W$ r; W! ]1 d0 P: V0 O
if(i_WR_Control3 &i_StepByStep4==1)
% y" s7 o! R; P' t3 G/ v8 Q if(W_data==15)
" o6 Z& ]- c* q W_data<=W_data;
" G" K" h; U0 X. e, n8 x* J else* }; x2 [3 T6 n9 [% M
W_data<=W_data+1;
! n, s$ W# {8 C, u else
( i$ V* x5 y; [; L/ _; a W_data<=W_data; * x0 }4 d* w0 |* C, o
end
! |2 j7 S" [- i# }- | ) k+ \( c) j C2 N4 a
always @(posedge i_Clock or negedge i_Reset_n)
' H& y) r- _' G R0 J' a if(~i_Reset_n)
3 ~8 F2 Q- B" [' {( S RADD_Counter<=15;
) D- I& ~% G; P. W) y/ F else begin0 `+ i/ a5 w9 c: ]5 y% J9 I
if(i_StepByStep4==1 & ~i_WR_Control3), s$ W9 n1 [) B& R
if(RADD_Counter==0)
U4 s" {; m7 t* D9 r3 v' Y RADD_Counter<=15;1 p' _% `1 X8 b9 E7 }& f! b1 O
else) ? k3 o3 f4 e3 r2 y0 c
RADD_Counter<=RADD_Counter-1;
! w$ o9 i" y% G" F8 h else 2 z) ~% X8 o- b# l* [/ n
RADD_Counter<=RADD_Counter; & W4 n" ]! y a) I; I
end
% t% ]& \9 a" S/ Q- c 8 v- R, j. x4 f$ D3 \
parameter IDLE =3'b000;" c. [$ I0 k2 g1 P
parameter READ =3'b001;
: {- _/ n0 u( V- `9 h( J parameter WRITE =3'b010;
/ q' ^$ B0 ~! l2 }- O
9 G+ V. M. N% L% u* w2 z always @(posedge i_Clock or negedge i_Reset_n)/ Y2 U" w! Z2 ^3 g3 d( v
if(~i_Reset_n)begin " n5 _) C5 R3 [. }$ W# e9 ?
Sram_State<=IDLE;
, q4 U( Z( U) W# o0 U0 L' i o_Sram_add<={16{1'b0}};
+ b% r2 c5 V% [$ M/ ?6 I Sram_data_in<={16{1'b0}};& p, j2 S0 i5 r4 x: Y
Sram_data_out<={16{1'b0}};8 ^4 v1 M$ ?& `
o_Sram_CE_n<=1;
3 e! l5 O4 k# C! } o_Sram_WE_n<=1; k! A! E) w# X4 g1 V
o_Sram_OE_n<=1;
. ]( O4 z6 A' d# O o_Sram_UB_n<=1;, D3 y8 N6 y& R5 |
o_Sram_LB_n<=1;
7 z% ?9 }# O8 F end
4 i' {! y0 U' j8 q+ ^6 ~/ i6 I i else begin
6 l+ O+ q; p- i/ E! a+ ?* t8 t case(Sram_State)
& g5 \ ?8 _5 r IDLE:begin
5 X6 B2 Q. T+ U; ]' G/ Z if(~i_EN)begin 6 P X. {' K" ~! j
if(i_WR_Control3)begin
# Q+ p% E! D9 s/ ]4 p0 X4 a Sram_State<=WRITE;3 i, l' n- Z6 H7 G0 b9 A
o_Sram_add<=WADD_Counter; - v% z* O/ Z- K5 b8 k# x
Sram_data_in<={16{1'bz}};
+ R3 Q" T1 f( }) z2 i8 T8 E2 K Z: B4 r Sram_data_out<=Sram_data_out;' H: n& L6 N0 w; f+ I$ u1 E3 d ^* S
o_Sram_CE_n<=0;
; r# Y' q, R c o_Sram_WE_n<=0;! G( d$ Z5 Z8 J( p- \* O
o_Sram_OE_n<=1;: V5 J M( o* t9 P
o_Sram_UB_n<=0;
8 d, K- n9 d& r# c* f4 C( m o_Sram_LB_n<=0; ; E, T- s! q$ o
end 9 y$ v# Z) c2 b& q+ H; I
else begin ) F/ b1 i: R j; m4 u
Sram_State<=READ;
) i- |7 T. P0 T o_Sram_add<=RADD_Counter;
) v- h H8 w1 T$ @$ ^! } B Sram_data_in<=Sram_data_in;
: ~0 V' N: N M, O& y Sram_data_out<={16{1'bz}};
! P& Q6 {; f9 R; t0 r; W o_Sram_CE_n<=0;! I% Y$ L# j- r; b
o_Sram_WE_n<=1;4 Z$ X, |; s& Z! ?( K$ M' U
o_Sram_OE_n<=0;8 g! P$ ?& u" }# H1 u6 l
o_Sram_UB_n<=0;
4 ]' S/ I* @% U* V o_Sram_LB_n<=0;0 U& o% s7 ^, p4 P8 @( x+ A5 c
end
: f+ M: b3 t# `9 I3 R6 y% F end! @5 ]0 q+ S* \/ M @
else begin 8 i {# y9 m* s, g; j1 S+ G
Sram_State<=IDLE;2 `& U2 z2 \' p1 x+ p8 {9 Q
o_Sram_add<=0;6 h1 p0 D; o( n }( ~' ^ G& U
Sram_data_in<={16{1'b0}};, ~5 ?: {; C; y6 `1 {
Sram_data_out<={16{1'b0}};7 G9 b; H! G+ m
o_Sram_CE_n<=1;
( ?" ]2 R, M1 W o_Sram_WE_n<=1;9 V& a$ A) M# n. K* b4 `
o_Sram_OE_n<=1;, r. q0 C$ Z4 S) o- {8 _
o_Sram_UB_n<=1;
$ x6 [0 n8 [; ~( Z- K7 Q: D o_Sram_LB_n<=1;; C/ k& _2 t1 V3 r9 m# I# E6 P
end " @& v9 F, }5 m; u4 _# e3 Z$ G2 H
end: H" C: A M0 H
READ:begin 9 A' {* |7 l F5 b" |) h
Sram_State<=IDLE;
+ `- A. l+ U9 d8 n7 A5 ]2 t! [- X o_Sram_add<=RADD_Counter; ; {' ]" O; z: G
Sram_data_in<=io_Sram_data; v# d5 _( [! I/ x1 \! E
Sram_data_out<={16{1'bz}};/ ?9 c; @/ {4 X* |7 k v% d, i
o_Sram_CE_n<=0;
" Z8 n# x' L, { n. Y o_Sram_WE_n<=1;
. t9 U6 r( Y0 n& e6 x3 b o_Sram_OE_n<=0;2 d9 O7 K% K( O7 Y, r3 |5 V3 D
o_Sram_UB_n<=0;0 W) m2 _! n' D; h0 L* F! F
o_Sram_LB_n<=0;
4 D ~6 }, r6 D end & v9 k0 T: x+ A
WRITE:begin
/ P& w7 O% x% v7 n# [ Sram_State<=IDLE;% v r/ ^2 \& u# ^6 V5 n
o_Sram_add<=WADD_Counter; + K7 [* |) Y. K- Z0 t% [, B
Sram_data_in<={16{1'bz}};
9 L6 _6 F+ }7 q: K9 Q/ O+ h7 u) S Sram_data_out<=W_data;6 F" b! ~- M1 [. B
o_Sram_CE_n<=0;6 Y' D: \; m' L# p+ u, j
o_Sram_WE_n<=0;
. C. B# p0 q! s% g3 j; r2 L) x o_Sram_OE_n<=1;
) i9 j) q7 h/ B o_Sram_UB_n<=0;5 w. U' o# @9 A; ]" I
o_Sram_LB_n<=0;
9 l) E2 o4 [4 {) h y5 h end
- W' `3 I8 q2 f1 {' y: P default:begin $ u( d" s2 p6 }) m& ^
Sram_State<=IDLE;
! N1 B& u6 p% t9 v! u o_Sram_add<=0;( V8 j) g- h# ~% v6 j
Sram_data_in<={16{1'bz}};
2 n$ O* ?3 _3 @) i9 n Sram_data_out<={16{1'bz}};
1 p3 p3 w! e% f5 J. B/ v U o_Sram_CE_n<=1;
* w3 E0 h7 Q5 i( f o_Sram_WE_n<=1;
; Z' ^( A2 i, Z( D3 j/ O o_Sram_OE_n<=1;! t1 E! }+ g9 y
o_Sram_UB_n<=1;
8 E) S+ B5 K b q: F3 k8 { o_Sram_LB_n<=1;" Q4 L8 E) A: s; M
end
) |$ C: e0 |- f( d2 W endcase
x n4 m9 G# A5 N8 t; P, m end( R) ? E! f. n9 j$ y, x" A* \6 v7 x
assign io_Sram_data=(i_WR_Control3)? Sram_data_out:{16{1'bz}};
, @$ a' k0 C5 d. E- q% D. \ b" T# ~ ) c7 ?. a7 O' G6 m
always @(posedge i_Clock or negedge i_Reset_n)& y" x# f6 {+ K! D B. B. H7 E
if(~i_Reset_n) 8 G9 d; u+ p# V, c, ~
o_HEX<=7'b1000000;
8 Q. b: A1 Y3 H) O else begin 2 i: U3 {8 _7 N: x8 }' y, ^/ K- N
if(i_WR_Control3)& U% o. w4 l' |- c4 Q
case(Sram_data_out[3:0])% K' T: B) X* |* w3 D
4'b0000 _HEX<=7'b1000000; p/ L; X3 a; u9 w) g. G
4'b0001 _HEX<=7'b1111001;1 M5 [- x5 r) U- W9 ^
4'b0010 _HEX<=7'b0100100;' \9 o- p" w! k/ S
4'b0011:o_HEX<=7'b0110000;
b7 g- i0 S( _+ k a4 q 4'b0100:o_HEX<=7'b0011001;
7 z3 B, p) b4 i5 E 4'b0101:o_HEX<=7'b0010010;
; B0 _, n, R. k* x0 W# T 4'b0110:o_HEX<=7'b0000010;
+ H" U; ~; }3 Q/ }% Q% @- v 4'b0111:o_HEX<=7'b1111000;) u6 p0 `1 i1 b: @2 `+ }
4'b1000:o_HEX<=7'b0000000;
6 f; u; }2 G8 O. X# F+ Z 4'b1001:o_HEX<=7'b0010000;; u$ e! V3 K+ I& I$ L' R
4'b1010:o_HEX<=7'b0001000;' Y: ]! A( a, K; G
4'b1011:o_HEX<=7'b0000011;
4 a' Q" s1 a3 i 4'b1100:o_HEX<=7'b1000110;
9 j5 h# X! X: A: x8 c2 K 4'b1101:o_HEX<=7'b0100001;
4 k% h6 D& x- \) S$ ^3 v 4'b1110:o_HEX<=7'b0000110;( P8 [, R! z; `- L. n: r
4'b1111:o_HEX<=7'b0001110;
3 k) d, s- o7 e' T( _ default:o_HEX<=7'b1000000;
( R' w( X; g5 a& s% d endcase
0 u: M B4 O. z9 S. d7 w7 \) D else# T% t, E: `4 C y) S
o_HEX<=7'b1000000;
1 T$ y; k, K, w- {8 i- Y" O end ' }( E% G# p( s1 E0 o6 W
5 b- Z$ g1 Q1 ]! r' B
always @(posedge i_Clock or negedge i_Reset_n)* @0 {1 s7 M& {( X. b
if(~i_Reset_n)
8 h; f) S4 A; j1 W% `8 P: \ t_HEX<=7'b1000000;
% {9 w+ f( a* x* ?& [' d else begin
7 L6 \& U7 N# Z0 j, {2 u# e case(Sram_data_in[3:0])9 S4 q% U2 v, V2 _/ L4 s
4'b0000:t_HEX<=7'b1000000;
5 A& k& N1 r& S# s$ i$ b) y4 X; e 4'b0001:t_HEX<=7'b1111001;" `1 [) ?6 f Z/ Q
4'b0010:t_HEX<=7'b0100100;
% f2 e- y _" A( z 4'b0011:t_HEX<=7'b0110000;; \1 l" T+ M( y9 v9 L
4'b0100:t_HEX<=7'b0011001; m% ^, z. o$ ]* a: ^6 P
4'b0101:t_HEX<=7'b0010010;# t4 c' s* _! k3 d1 W
4'b0110:t_HEX<=7'b0000010;+ j8 X, o9 `- B# S0 D# ^
4'b0111:t_HEX<=7'b1111000;
. d C4 H" Y; ?' J6 }+ D: t5 }* o 4'b1000:t_HEX<=7'b0000000;
2 S# s; @1 e( q* Z 4'b1001:t_HEX<=7'b0010000;
! w: O! q4 t7 t" z( w9 _* ~ 4'b1010:t_HEX<=7'b0001000;
% X3 y1 L" B; Z6 o2 @) ~) ~ 4'b1011:t_HEX<=7'b0000011;4 ^& x, W# k# g- K6 {( \
4'b1100:t_HEX<=7'b1000110;6 u. X& K& S; w4 R
4'b1101:t_HEX<=7'b0100001;+ \) E2 Z) O1 ?9 Y! u) t6 |
4'b1110:t_HEX<=7'b0000110;
2 S! R+ b: C9 o 4'b1111:t_HEX<=7'b0001110;
# O" @) k. \ ]' g/ w# _/ w, s default:t_HEX<=7'b1000000;
. X% e2 }* h" \, s& A* H endcase ' v# A9 P: r$ L$ R
end
2 g) I3 Q$ X' Z0 } d( \
5 A; z7 w3 l; L! n, m) @% Nendmodule |
|