|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言3 d, l8 @* K8 m) m! Z$ g
两年前,我写过一个简单的除法器,当时由于时间问题,只实现了一个简单的逻辑电路,但是实际中大多都是时序的,所以后面给出了修改意见,但是并没有进行进一步的测试,最近发现那个简单的除法器引起了很多讨论,本小节就做一个终结。
# C- }" C$ }! {& a0 M/ H0 T6 w& a
% K' O- j) d) X* W. d- i
" e! g/ |3 Q7 V6 Z; \# y1,RTL编码- v9 |: Y- ]5 e5 R2 ~$ i7 Z
a,div_rill.v0 R/ P$ B" H& e& p0 v/ T7 j
! f7 ~! n! g! s" \! o1 m- u7 I
# q. H/ n$ |6 Q% Y3 _2 M2 S/*( b* }; ]9 K5 J" M0 U. D
* module:div_rill
& B* w& c r$ v; h% o" e* file name:div_rill.v
& c2 b% U* h* e( e( c7 `* syn:yes
% e! i# i* _/ W) E* author:rill0 r0 b r! G N4 O! ?- q' y# l1 }
* date:2014-04-10
* [ S4 u/ s. P, F5 q; _*/4 }& |' ]/ @8 x# `5 a
- F7 e% ^ h" m" H9 w+ a. c+ u) D; [3 t6 ~0 i0 {. a h
module div_rill( ?" h5 ?' s5 K" f- r& w
(/ y9 v" Y1 l4 b2 D5 m
input clk,
! W. m( @. {$ z: Einput rst,
. d c- @# L7 g. u& A9 p% j1 i8 A- p; w$ l* Z9 @
input enable,+ ]0 g* [0 K9 ]) x3 M C) P
input [31:0] a, 2 b- {1 g% f3 l- N$ y! A8 n
input [31:0] b,. ?, u6 Q/ d6 Q/ m- L
2 u& S/ U6 M' y% g3 Woutput reg [31:0] yshang,/ Q5 J4 C- B5 ]
output reg [31:0] yyushu,
3 ]4 ^8 D% D A8 [8 O1 f' U! f7 o S' w' f
output reg done
8 |9 T5 @8 V* q1 V' x1 m);
3 [7 `. ]9 P5 f! N' V. f( T/ K- Z( }# h; x" z
reg[31:0] tempa;) g1 |6 N- v! V( ?4 P
reg[31:0] tempb;% N0 k. a. }, G- L
reg[63:0] temp_a;
h- U2 `9 b; X" S6 |reg[63:0] temp_b;7 A! {: F/ H% A! P* p% u
3 H% ~. {6 b0 q2 ]6 M% Hreg [5:0] status;+ G1 Z& O; d- I( B/ e" Q" S0 i
parameter s_idle = 6'b000000;
7 k! o. B' V( _6 `parameter s_init = 6'b000001;5 I- ~# X9 d+ @9 w& G
parameter s_calc1 = 6'b000010;# n3 l3 V0 F9 i1 G1 |" r5 B
parameter s_calc2 = 6'b000100;$ l6 ^: c% y' o" W4 g
parameter s_done = 6'b001000;
6 O1 m" P4 _2 m4 p& M( E5 c2 j* Z
! n2 j5 \' u! L6 ]7 D: A5 @9 l) j8 M' `/ h! H
reg [31:0] i;
8 R. y- q/ s8 t/ W
7 Z0 ]( m! N( C& P, w$ |always @(posedge clk)* D0 a& f; ~- f( ~
begin% T, O& y9 v9 H" ^6 _' x; z. }* _
if(rst)
: ~: P3 K: f* T+ p B0 K begin4 A' n1 J. e: u" D$ r
i <= 32'h0;. D% u1 |; e( ?* z! H1 R$ \+ r
tempa <= 32'h1;) E! A7 H* D) G5 _" r
tempb <= 32'h1;
1 n3 h% a& u b9 z2 j a. I yshang <= 32'h1;
, M% F' ?+ k# \4 D) M yyushu <= 32'h1; S7 a: m9 v: u
done <= 1'b0;
: A) t: w) r; x6 j0 T. b+ Y status <= s_idle;: C- C$ |1 S1 j1 B0 O+ _8 [7 N
end, M1 X' Z3 I5 a
else
7 X( _* i, ]9 `( t' y" D, {8 e. Q begin
: Z4 n9 N5 q& Q$ l& \0 _ case (status)
; U! @: A! J! i# C s_idle:9 }( U8 h) j+ p+ g' p, J
begin
Q+ ]2 x9 q2 c5 M O3 Q" m* X if(enable)
! C% r9 \ V# w9 ?3 W/ q# [1 _ begin
+ i+ u2 x4 m: u tempa <= a;
3 L2 _5 T# t1 b6 a( r/ C tempb <= b;7 `& C! r, k1 b# m7 k1 ~0 M
! t" {' ~# W% o* O) ~* t9 K
status <= s_init;* w2 N+ c0 e# ~
end( c( E9 d& z7 Y% o9 Z3 X- V8 f
else
% Q. d- L* U" @ Q0 d, ~0 i4 z begin
2 X' Z: R- f- B. n+ i$ Q i <= 32'h0;
5 k5 Q) i* j( G$ ?+ P2 r# H tempa <= 32'h1;$ B; v) a B9 S
tempb <= 32'h1;& V4 f Z- z) z& w5 Z* t6 m
yshang <= 32'h1;
. w+ f+ H5 }* f7 _( y% u( r yyushu <= 32'h1;" k9 I, \6 z; r' m2 n3 Y
done <= 1'b0;8 K8 q# _5 r: E! |7 @1 h& o
5 ~4 |8 m$ q( r* s& _
status <= s_idle;$ S$ ]( F* {' Q, K8 `9 z
end
3 Y- z7 k% I) P* Y$ o' v end
+ r6 ^8 k8 o9 Y, w 0 R9 ^$ |/ }9 G6 L( u& C
s_init:
1 {3 _4 d( V& [1 b1 y/ ?7 {) Z begin; i- y; a* p! k, Y. `4 E* P
temp_a = {32'h00000000,tempa};
# l0 u _6 K- {7 \ temp_b = {tempb,32'h00000000};* @# W1 _7 W9 j
" P) Q; A7 q3 }8 D7 P; H
status <= s_calc1;
! p8 d5 A: n% U s( d. z5 `. E3 M end
% o) W8 Q8 s* G
; {& L& I! Q+ b4 b% J s_calc1:
# ]* N# v4 a( ?0 X) [6 b$ T begin, T7 o8 L- ]; g" D; U
if(i < 32)5 ]+ Y! ~8 `& {, A1 k7 c
begin. `! ?) V+ ~: ^! _% C1 F
temp_a = {temp_a[62:0],1'b0};7 X N+ S2 E3 [$ I) N, l
3 Q1 _" x8 G0 j/ B# S4 }. b/ ^ status <= s_calc2;! ^: s) S3 Q' W* X
end; F2 e3 @% N9 b5 c& R2 t
else
8 G# J' B5 j( l2 x2 X# ~ begin
6 N* ?7 P( W7 G5 L W8 j status <= s_done;
6 u+ P) U0 R8 S% L6 Y. R8 C2 k" U) ? end
. D2 p/ T+ N' L" {) o5 p3 C
# P% m3 L/ k9 D/ I' L- B end: C: l" s+ C6 F% |- k, w. d3 d3 n
+ n" {. I' a9 f# q7 J- [ s_calc2:
2 v1 k! z1 ~. R* {" O) w1 I begin$ ^! T& `: u* y U* I) K7 c% r
if(temp_a[63:32] >= tempb) C7 N- l! J. @% u) f" N+ d
begin( m" ]0 w4 I7 M8 N p4 I! q M
temp_a = temp_a - temp_b + 1'b1;
7 r- m {- R' e8 f, _# E end
. w1 q; P) {' A) _4 ?2 c else( {2 {* E( A* }4 _5 |
begin
" ` A; k, v: { temp_a = temp_a;
, V; \& ^6 a3 \9 ]# _- } end, ~, l7 ^8 r7 K7 t0 u U
i <= i + 1'b1;
9 U8 X* H0 z y status <= s_calc1;
: @, P& s/ v0 U5 ^) v end
, {+ {) {3 ?% D) R8 o' \5 x8 o% p
2 L7 k; s9 B' J( |+ B s_done:/ E& ~7 {( O- X& u1 j3 U2 w
begin
& }; o1 _: @4 [5 \" _1 Y: G yshang <= temp_a[31:0];
; m" j2 o7 k7 W5 `; G$ v yyushu <= temp_a[63:32];
7 H5 I2 Q- N' Y. w. j* e7 S done <= 1'b1;
6 I. \' b, g9 A4 k4 I ! o" ~5 |0 Y# O& n
status <= s_idle;9 P% W% V7 h7 B! b
end
/ {" s0 `. H2 n' h& V
& J. J H& S f3 [# J/ ]0 O default:, j& ~2 i# I6 r( t- W
begin* n! b' d8 d. u8 `- Z0 S+ R
status <= s_idle;( F* z+ T3 z: k/ W
end
( y! c6 a! x% s6 \# b0 P7 B: j endcase
" f4 U! }; v1 x end2 {3 k: f( f [/ [+ h4 N0 {
$ k/ u( L& `7 e
end
/ ^1 Q8 Q3 { d$ ]5 M
- v4 ^- q9 y9 B2 B: x0 J# x
9 _3 o9 G& i/ o |: k$ X" A+ |endmodule9 G/ P' W! t9 \ ~2 j
! N/ B9 N: z2 l9 c' o$ g; G8 v( g
$ c3 s* M( e; x# F2 Y0 A _) s/*************** EOF ******************/
4 b6 z3 o3 ] M" D( X
" L' U0 ?. j- |- R* L+ _! J" Q$ P+ T$ b6 W7 h. [) ^
+ z% \) I i6 y* b [, L1 p9 q3 h% k. }3 c* A# r
b,div_rill_tb.v
, M* ^( k% a) j% q8 j7 Z* d" \8 x8 c! `& y/ e: v
9 ^6 J) H& }3 |5 q6 p/*: B8 l1 W4 f/ l; j# Z* V) x7 Z
* module:div_rill_tb
0 L$ L. ]. w( g2 F" }* file name:div_rill_tb.v% a; f5 ~* ?& \
* syn:no" ~: Z5 O. F5 |0 k( m: X7 u5 g& f9 R
* author:rill( r3 Y% k) Y! z" ]/ R9 m$ H
* date:2014-04-10
) y: R$ }' S5 T- U+ o/ U) H( p7 H*/+ O1 V) m5 q6 Z$ I6 o. n) R( |
, L0 A! l9 q( y; w; K ?; N
; B4 e- x$ ^" |7 M' u2 b4 h" ``timescale 1ns/1ns5 K+ u; \3 D& U! A
7 S3 ~) p8 ~/ T, L
module div_rill_tb;
) f% T( _' J+ E! n U& f4 A. E! @- I. v0 U2 W [3 c
reg clk; R8 F, \0 \' q5 ^$ k3 b8 W0 |3 e
reg rst;
* l6 q' _4 \+ }reg enable;) N, C! Q& c' N" R% ^
- g. o: [* O5 [6 W* u+ ]2 Mreg [31:0] a;
7 v) m) Z/ J1 X: h* _ `reg [31:0] b;
' E( O& m3 t- u) w. `. D+ Ewire [31:0] yshang;' F8 v% }, q5 t
wire [31:0] yyushu;3 d0 |7 I' ?# _* O, }" a
- Z& b6 {8 `9 w& Y h0 `$ r& G8 z
wire done;
6 f" I# g6 @) S7 ?5 H) O
, N' Z& z! o0 X6 [initial
* p6 }* h2 _( }5 e6 Bbegin
0 W/ _, T7 b& W9 M- S! t. w+ D/ g clk = 0;4 g+ A4 E6 z3 ?* e9 I3 ?6 b. U
- s# ^$ \9 W# p% L9 ], t #10: R# S) t( T& C3 i
rst = 1;. E9 ~: W, Z9 H% S
#20
- b6 y3 e4 U7 w2 s0 r rst = 0;
( {, g1 f+ p8 F! \$ |- \& o
% D+ V7 d" r$ W+ U' N8 ], \ #15
% z' k2 O4 L! F p) s, Q enable =1;
" n) c0 [+ E+ _& E& @ a = 2;//$random()%10000;$ v; T4 A ~3 C: {& c3 Y# o
b = 7;//$random()%1000;7 _1 h8 R. g1 \8 L+ x
#104 z' S' x9 K' ~/ k* a0 K' n! S
enable =0;4 I1 i4 w v& A6 e
5 O) v8 A1 e! B* [- L7 W
#1000) d9 x0 Y% F- f$ T. _3 T, z g
enable =1;0 T5 T# c: v7 v [! n
a = 7;//$random()%1000;
& s) A- P9 |) e0 B: m3 e- Q b = 2;//$random()%100;) o9 L% k1 K H m
#10& H" {! m8 s1 {/ K& O
enable =0;
& o! |- a" z8 h : x% ^# `" t3 k1 F& [' N
#1000. U2 Y1 s- c4 `
enable =1;
# l# R$ W# C+ `( ]8 l a = 7;//$random()%100;
& J. m0 J2 Z, v& }, I8 {5 u b = 7;//$random()%10; " j3 l; u4 a* {# ^( ?
#105 e% o; q) j# I' K! x/ U
enable =0;
& N# I' f7 N# ?3 U8 r- }3 Y
, K' w" ?: g9 V! t7 E6 i #1000 $stop;
0 l; h5 i* B: V3 Dend
3 s% u. C1 r. Y+ \" Y/ O% N& ]- A g" {- a
always # 5 clk = ~clk;. f1 F, y9 Y2 b9 h9 t# A
0 Z; o+ f w7 O, z. r/ {$ k7 H, K
div_rill DIV_RILL
% T9 j2 a( {! Z( p6 U(
, e1 g4 \/ J6 a V2 r6 _.clk (clk),
1 W! d! _$ L& C; h3 S" }.rst (rst),
; k# T: B! v, L( R. c/ q1 t
, u% a7 o: T0 c5 O" b.enable (enable),; ?7 }' c% C3 S/ c2 e% n
.a (a), ; |! u/ y b/ p
.b (b),* H" I& X2 |5 I$ i2 v8 F. v- ^6 ]& x8 n
d+ w+ l( x* i9 J3 d.yshang (yshang)," W% h! O, e4 u6 r
.yyushu (yyushu),
3 q) s( B$ l- _6 p; k( {/ w L' c- u
.done (done)/ r$ Y9 ?% v6 E
);' Y5 \3 d& C; S' f: p
& r! e# ~# j5 Q# }' C" \/ N7 t
endmodule. X& r o. @/ G0 y$ O& \! n
/******** EOF ******************/
# X7 S- p+ S- m1 w2 a2 q4 ^+ {+ W4 e8 V7 Y2 Y: R1 T
2 G$ ~% Y. Z( _( K, L8 j/ i
* f% _6 \8 z( h' u& v1 m0 C
8 u+ M2 T$ `+ {; }, f% s2,,验证结果
3 v5 c- L/ T# x D
. \4 w. c" V& ]! Y8 e
' b& d( m* @5 C: c7 Q+ J- Z2 I6 M5 A: G$ O+ C. B' m
7 O0 s. q. ]1 {! o; a" E1 A
/ ?5 M. p2 r; H
3 _! m: D- D7 v- I- z" |
: d7 f% t& b1 f/ ^
: t& E0 K, [; W, X* c; N. ` |
|