|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言' [; f) w+ T3 c& E
两年前,我写过一个简单的除法器,当时由于时间问题,只实现了一个简单的逻辑电路,但是实际中大多都是时序的,所以后面给出了修改意见,但是并没有进行进一步的测试,最近发现那个简单的除法器引起了很多讨论,本小节就做一个终结。6 f' a& [+ A" `# \: F' L7 A
3 R' k4 @" o' n- N, W& C c$ l6 A& k/ j/ t
& Y# Y, t- i* m4 o2 x8 b1,RTL编码
( ^5 T% j) t5 Q9 t6 M# ?" @9 Oa,div_rill.v
! x8 D% {( D; }4 |7 u% Q, J6 V( V/ H
3 @1 C1 y: \* S/ X/*
3 J+ D$ x! E% R" r( f1 Y Y" t* module:div_rill# X1 I3 U" o! c/ D4 D/ [
* file name:div_rill.v
* g% g7 ~ [- ?3 d; o6 W6 e! B* syn:yes
( @: Q8 Z( {4 _$ u5 }0 J6 Y* author:rill! `2 @$ T! b& r' M% m) ~% c2 C, f! D
* date:2014-04-10
: K4 m4 s* R5 [0 _8 W*/" f& u1 E% f( m
7 O9 k6 k5 f: T5 ^8 O2 X( c$ d$ E( m$ w
module div_rill
& X; y, x2 O! [ m: A(" z0 @4 ]4 b/ Z% t8 w
input clk,
0 o s1 ?7 k1 g2 z- minput rst,
! c; T' N1 Z* c3 Y4 h% p4 z: `
# P! d) e2 X$ Tinput enable,! j4 _6 `$ c4 p8 d8 X* }
input [31:0] a,
. X7 ]' D$ N9 M* Tinput [31:0] b,& U! W. y" ^: G+ w* ?
6 Y3 M- P/ @/ U/ ~: ]
output reg [31:0] yshang,
) D- A; S* x1 poutput reg [31:0] yyushu,
3 q8 S8 Q( X% l' R0 S: t7 L
$ r+ ^$ ^; p5 y0 |4 Q) o) L! t4 Xoutput reg done0 N/ p1 I$ n j, T9 F3 y
);" x# |) Y& _5 A! ~. w; Q5 u
5 v) \4 `6 ~) Z1 T' dreg[31:0] tempa;: z$ U- E' ~: T0 j" W: g
reg[31:0] tempb;2 I6 u8 m1 V! _: n/ L* f2 V
reg[63:0] temp_a;
# a& Q, _( z* j0 l9 y* Dreg[63:0] temp_b;
+ k1 c' Q. a3 v% G' Y
1 h; y& [. p' }2 S; ^: [( \6 E5 treg [5:0] status;
# H" y3 v; Z" R6 d) I; h# Oparameter s_idle = 6'b000000;! I* j2 O. n- ?
parameter s_init = 6'b000001;
; _+ f6 Z9 i. y. z8 Sparameter s_calc1 = 6'b000010;7 t x& W# x" X. H
parameter s_calc2 = 6'b000100;+ e" a! O; ]: f
parameter s_done = 6'b001000;, v# g: {2 Q3 L$ O/ _( G
9 \3 L- i" Q* V% D% h4 [; J n' H4 J
# V0 Y+ c7 b6 R: f: \% ]. v4 Oreg [31:0] i;; l1 b" m3 ~" Q* m+ Q; E4 g
9 v& q6 y' B) T% V M5 v+ Malways @(posedge clk)* p* U" E# h% w7 P
begin+ f) S( E2 u2 y7 A4 r' }) A4 w) E
if(rst)4 q) q- W2 z. F$ M$ U6 b' m; B5 A
begin) n' f7 E% N2 f5 R/ A1 O
i <= 32'h0;( H7 W: o7 e0 S+ D
tempa <= 32'h1;8 O+ d L9 T2 b* \7 h3 Z; h1 ^
tempb <= 32'h1;; a: r7 O. ^# {% p7 q! l3 ^0 O
yshang <= 32'h1;
* ]1 W) E4 f* b8 t( c0 t# y yyushu <= 32'h1;: K# k, u/ h& v" D% p4 _ E& b
done <= 1'b0;, w5 W: A W+ }
status <= s_idle;& N) _. @* R& Z" g5 ]. v# C! W
end
( Y" r: H9 E( S$ M# M! v T else
, t/ Q7 s5 p, y) H5 c3 I8 Q7 z begin$ k2 k9 s' p3 P/ C8 f( z! @* g" E2 W
case (status)
" V% e1 |# H. Z9 ^' W s_idle:" O$ K+ F1 C5 m, X8 L8 Z2 E
begin9 D2 w. j, `& K8 D+ t, z3 I
if(enable)
5 x, T* t! [+ }" O% j- \+ N' ? begin
0 t# Y0 H9 D' R5 r tempa <= a;
) N$ d. i) ]+ R7 H3 u tempb <= b;
7 f: [: N9 O8 \$ g# c: P* E K
5 T( q! n3 Y. B% P) w+ Y4 t8 z! X status <= s_init;' F$ m/ Z S% m- A) d2 o' _4 q$ E
end
/ J7 c; a$ U! ~" G: h5 z l- D else
+ d1 L; y4 F* c begin" v: ?4 v" T1 [9 E. ^$ p; Z
i <= 32'h0;' e: d4 ?0 @2 q$ b* w
tempa <= 32'h1;
7 C+ y Q E4 ~# J* d tempb <= 32'h1; A, a# J T- n- U
yshang <= 32'h1;
8 ]6 h' _" a0 a7 K$ a" V yyushu <= 32'h1;
# [/ L! F) Z6 M% J: Y done <= 1'b0;9 B6 F! T* [: L% R" u* _
9 g T, v) l C0 q( X) \' H' v0 ]
status <= s_idle;
1 j/ K( v, N0 I- ] end9 \# I6 a; F& f) |
end& L4 \) \% p, ^* I% i, [% `: R
6 r, g6 d. e5 R4 W4 i1 \ s_init:. a1 I# w8 `) X0 X% w# M
begin+ _9 J) ~+ W' y9 D9 R
temp_a = {32'h00000000,tempa};, r6 x4 {9 H1 ^4 H/ B
temp_b = {tempb,32'h00000000};
; X. ` V1 o# M! `' C' j: R 9 F4 ]0 ^& _& |4 X
status <= s_calc1;
8 r) G7 w0 z* [$ p- q$ Z end# L4 t; \' N5 k" s( j
4 Y; b/ _" \1 t) Z6 _- `: `5 V2 [ s_calc1:
) {4 y5 x$ r4 y# H8 X9 m$ L* x begin1 N. t; E8 d l. x) [+ ?
if(i < 32)2 C, M. ?# l [7 W3 _: }
begin
; m$ T; t& U" b. L temp_a = {temp_a[62:0],1'b0};% h' ?, T2 h7 S, P
8 ?) T9 f# L& ]. C) W
status <= s_calc2;0 ^) r7 T7 ~8 @) W( J5 U
end& E' p; J4 K# y% b8 j# I$ W8 Y
else. w# b- x: }( _9 b
begin
& |5 B' q! |& N status <= s_done;
' q& `: |$ m' g3 a( p# f3 F end* n2 `) t0 d4 Z( W2 e& Q
# R$ T7 X0 H" t/ W end% j0 [- B r2 |* w, ^- q
Q* Q) [+ T' E% H
s_calc2:
" h5 Q/ ?5 M& T begin
' J. c j p7 ~, q5 z if(temp_a[63:32] >= tempb)
# R% W" o8 K0 n- b) d begin
/ B F. E) q8 S2 z0 o/ | temp_a = temp_a - temp_b + 1'b1;
: `+ ~% r: ~1 g end, b" n- Y6 t: h
else
0 q! u( h. d" @: H6 Z5 e begin
0 j, j, Q, m) k3 |; n- |$ x temp_a = temp_a;
" R$ Y4 D( u$ F5 `( Y! }8 C! h2 Y end
9 h8 Y# n/ u" d0 w& W* f i <= i + 1'b1; t q, D% l* X; n$ R Q8 |
status <= s_calc1;
3 R, ]& Y* X0 n: S) H end
# o2 r' n9 v, q; J$ K5 J * \ D( Y; U: q5 _$ @( g8 K( c
s_done:1 ]) }3 v( N6 n8 G3 K2 G: A
begin
/ I7 q# k$ l4 v+ B+ ^% T' |1 } yshang <= temp_a[31:0];* q8 a- v: Y3 R3 R6 B0 l9 ?% W" l
yyushu <= temp_a[63:32];$ G( j* B6 W: C7 z
done <= 1'b1;
) B5 C! |% _4 w7 S* r
% H: | }. @2 v! g4 q- S status <= s_idle; n, |6 v7 X* ?. }5 e& w: ^ ]
end" p a- }, C c0 `- }; L- Z: ^+ y
& P) c- {- ~# O2 A
default:' g: s. |, W" p1 [6 }" ` J
begin
" P* ~2 w5 e& N" e1 n7 D status <= s_idle;# {, O) \* C3 G2 h* m& g& I
end& |" W% w/ Q: Q8 W
endcase
$ Q; _- r8 Q6 i- q3 L end2 k* @( m' k: M2 h5 c$ o7 V
) l2 @( r2 L3 b6 p
end1 H+ ]0 a. A" [% B
8 y0 ~/ r/ y- [) U2 l; C
% n# Q# b5 S& `9 Y
endmodule
* p1 ^2 B+ B, r M L
g2 U5 }, U3 {: q/ v3 o* Y w) i
) t2 J. d/ ?; X+ D* g/*************** EOF ******************/6 o7 @# A6 G9 ?3 c/ L5 d9 B" r
7 N# f9 y$ r. t
4 J/ _/ Y7 R8 l
7 }( k) E+ F% N) P+ ]! O2 S& T; @( B
+ p) t4 q' {+ b$ r- _b,div_rill_tb.v
# n% R- M# E, B5 A5 F; l1 M
: v- n0 `: ^% ~6 q' ~# Y
# m( t, I% @$ h' F) F; Z- U' f& ~/*
4 w1 }, J% E* Q+ b) K% B* module:div_rill_tb
: d& `) a3 Z; K5 J/ e( b( m* file name:div_rill_tb.v
0 K2 k1 J0 r$ k/ ^4 c* syn:no% K8 R( ^: c9 V; i3 f2 p
* author:rill
- g; _: F$ A( A& D2 V5 F4 s: a) b3 s: H/ x* date:2014-04-10! I( I6 E" F1 A# t+ ?2 o, k
*/* U6 T2 T3 o0 @9 I% d! A
* l" i. M0 s; z4 G, c& J0 A& i
% P! ^3 _1 U0 a2 C4 D( @: u0 {`timescale 1ns/1ns
' n, r v4 k0 G; C# B0 }& s: J: w, v$ Y7 o$ o6 k
module div_rill_tb;
# U1 x) D& ]0 ^5 x- n, ^" ^$ n" V* A+ \* m
reg clk;
8 w( W% u8 L* f: E# t a* z {5 u1 greg rst;
( f3 t+ d ~& R* m- jreg enable;$ u- K( L6 d. k! J V5 I
" i! x$ \4 \7 e0 \: i% A
reg [31:0] a;4 X6 s' Q" F5 M: ?
reg [31:0] b;
$ Q' n: j& E! b6 Ewire [31:0] yshang;
' K3 N* @! w- Z b+ N4 _( rwire [31:0] yyushu;: D( f% u+ ~" M1 @! w" ~ ~
3 \/ k* |1 Q# F! E/ P3 Nwire done;6 u6 d: d% F3 ~5 j
" ?8 c5 \: w" W
initial0 U+ N4 u1 ]1 {) Z
begin
2 t. g! p: ]- i* F/ S5 h clk = 0;
9 B5 I, G( E* Z E: Z" J k 2 k- A4 t/ v/ q% b
#10! v# U$ Q4 l1 _: v# U0 T
rst = 1;
% ~ E0 a0 z. `' r! s #20" n U, v: C2 X; y0 v
rst = 0;
4 f a* H _) |9 e! ?
" m' r: Y6 O) Y$ j) j4 F) V #15
- q3 c: z' w) v5 X enable =1;8 N, Y1 b/ f5 C
a = 2;//$random()%10000;
9 {+ G% [+ {0 t b = 7;//$random()%1000;# W6 k+ E! [2 `# z: M ^
#10- }, Q" \& R, b
enable =0;
% q0 n) u6 K- M
% Q( n( k0 z4 S# J# I #1000: l0 O; u6 }! y& q( c3 l ^
enable =1;% X2 W& {# p4 \/ Y
a = 7;//$random()%1000;$ @9 W! J" x4 l8 N9 @: V. s1 W
b = 2;//$random()%100;
$ s' i$ l! _4 @1 M #10" f9 u/ \9 \! u8 U+ n
enable =0;% d/ S8 v, t/ m" L6 B2 b/ K, V) x
) D9 q5 y1 ` F( F, B
#1000& a' |+ [* i0 U3 `! n3 H" ~
enable =1;. W) }# C) X( ?4 d$ |1 L
a = 7;//$random()%100;
$ t# p! p8 Q) T. L b = 7;//$random()%10; . L6 M7 X) y% ^3 m' W/ {- T; \
#10
" y9 b$ h# D/ u) C enable =0;
5 Y8 a/ O1 A9 Y% t
! z! \( ^0 V6 p0 p# s #1000 $stop;
/ q' K# q1 _1 A3 ~) ~, zend
1 w) N/ V% \6 ?; B1 |" \/ X! H0 m3 a* k6 u" O2 {1 u, c
always # 5 clk = ~clk;
5 x+ [5 Y, _5 M8 {. U' r, f
" u! }) m$ _* J/ D( jdiv_rill DIV_RILL/ M+ d$ I& r) U5 }0 m8 j/ G
(" C( p6 S& w9 w: K) i0 B' @) {
.clk (clk),9 B. z; i0 O* \* r- [6 K% C
.rst (rst),2 A/ n+ i0 m8 K" X2 ` }
8 x) W$ f2 @, u, J.enable (enable),
8 C* @7 M0 l2 i0 e6 q.a (a), 5 s5 a8 o! h/ G' [+ c h+ f
.b (b),
2 H, A2 \; n( [ [' C
" ?; }2 B; z& J% b6 E8 s8 e2 p.yshang (yshang),
4 n0 X$ ]" _" |% X.yyushu (yyushu),
p1 c# O0 ~5 m$ `% `1 ]) s
7 t9 B1 N8 e4 O0 \! z/ Q- e.done (done)
1 g) {' C4 b9 y" d T6 s6 @);
+ q7 P: f9 K+ c: b! a
5 _! L% H! c& ^endmodule
& t1 d- q9 c7 V0 S4 D/******** EOF ******************/$ z! C Q0 {8 \' l# H
1 C3 D0 b* P3 q. K
0 e' `2 ?8 b/ m1 d
* T% O. j/ P! a' i3 r' ^/ J! ]' U7 p: G1 O' x) p% n- B
2,,验证结果, H: ^* ` f/ O d
* v" X F" g, a7 c. Y
$ C7 g4 q6 v9 T) G7 d; r
9 q9 P- u, r/ v0 g: W! T+ Q! G0 H% h7 l K0 t) E
) d4 L# T) X1 I7 [- ~- ^* y
* J! N1 W6 T8 I6 D" N3 b* {+ l- v; z8 n
+ ? {& u/ @) |1 Q+ G. l K |
|