|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言0 n' T7 K1 E9 v5 U- ]% ?6 M& E( v
两年前,我写过一个简单的除法器,当时由于时间问题,只实现了一个简单的逻辑电路,但是实际中大多都是时序的,所以后面给出了修改意见,但是并没有进行进一步的测试,最近发现那个简单的除法器引起了很多讨论,本小节就做一个终结。
! R, o* o/ d9 t% a, O/ n* l1 H8 j8 V! T4 w) e4 R' K: q( i+ @2 s
6 y7 e7 e) ]7 s7 [4 f) p! S
# t, {/ {8 z3 U1 C5 H* x1,RTL编码
- ]5 O: J: O5 n, xa,div_rill.v: M$ f( i4 u' U% q
# U. s: ~) N3 v/ v/ G, J# I' z
5 @: F6 t- A5 `4 t0 r/*" z# c1 O2 V6 I, S# Z$ T3 t
* module:div_rill
$ W& |* [3 y M+ W9 X' w3 A( T1 I* file name:div_rill.v1 T3 g8 J" M2 v- A& p
* syn:yes, C0 c* K# _9 i
* author:rill
( P0 |& K! ^- G; c* date:2014-04-10
+ k9 t6 v" V1 Y' ?& m*/
9 F( p; B, l7 L: Y) D; ?+ a+ c0 e$ l3 ]7 G. d% f" K- L, X' ^
c( g( h$ P) g0 n' nmodule div_rill
. F8 u- @* w/ n1 f9 p(6 W- r! N7 d2 D
input clk,' ]; x3 C( D8 t2 {" C3 c& [8 p( _
input rst,, X& b& |0 i' v
/ H d* j4 a' |- \8 D. iinput enable,
6 A6 K0 T* @# d" hinput [31:0] a,
% H( X9 C* z+ `input [31:0] b,
* \+ x& g: t: Y! ^ _
, `& T) R: m6 Zoutput reg [31:0] yshang,( m+ j. S. Q- D, z3 Y, f* ~
output reg [31:0] yyushu,7 j* }" W7 C/ w1 `/ ?9 Z: P0 S
- @4 i2 E1 a# K9 y$ U; ^) H1 L
output reg done
: _$ s8 A( F3 K# y);2 l( b5 O8 D& Z: L5 E e4 t
" t$ P' c3 J: r& B4 R+ Creg[31:0] tempa;/ I7 R, y3 ?4 L, q+ ^) \
reg[31:0] tempb;! i/ `; d: J B/ c1 G: x4 \
reg[63:0] temp_a;9 |9 X. \4 i1 `0 A$ Y/ H5 t
reg[63:0] temp_b;2 X) N6 F( O/ P+ S( [
$ W( L. K, H6 D% F" s8 _7 m( O
reg [5:0] status;2 e2 B8 U3 D6 M
parameter s_idle = 6'b000000;
Y U* j( a* u8 g/ p- H5 N$ qparameter s_init = 6'b000001;
1 x$ e* q) E) K1 D5 @7 P+ Fparameter s_calc1 = 6'b000010;! m* v) R! D0 O/ v4 T0 y# P
parameter s_calc2 = 6'b000100;' A- c3 C* E: W( `5 h' f" V
parameter s_done = 6'b001000;8 G7 a. N' H# {8 C3 X
$ Z3 v( C1 z. R
1 n' }: R0 t2 f# r3 A
reg [31:0] i;
2 L6 I- M. y5 i8 u7 Y: R u: S. n/ u1 s8 T* ^: N
always @(posedge clk)% q& o$ P X5 G$ a. i! V
begin5 n- P- T; }1 @9 Q, O+ x
if(rst), Y7 ]9 c( O x% Q
begin
0 ^$ x3 I9 f; v' V8 ?6 m; ] i <= 32'h0;
$ {" Q( t4 q' c2 [! W8 a8 Q tempa <= 32'h1;7 f. T5 B; Y9 i* w6 q: X" B; A% u
tempb <= 32'h1;
U4 k- `6 d8 |. b9 [' t yshang <= 32'h1;
' W5 d" \: [( c1 v) k yyushu <= 32'h1;' k5 z) \# C) j5 T! q
done <= 1'b0;
$ u! T5 ^ [( p status <= s_idle;
' j H, V2 E7 }& D- ?% v$ { end T& T5 i1 z5 O* Z! A, `
else% K) N1 f& }0 `+ E6 q: W
begin
. X. }% f& c% d case (status)
* `2 e7 N; ~' A2 X S7 T s_idle:& y* t* f7 l& r; x
begin: r- @0 _8 C( ^( M+ p' P% R8 ^$ i
if(enable)6 _ B* c5 @6 B$ S
begin1 Y0 o7 }$ s' S$ j6 x j" w- D
tempa <= a;
8 v5 G/ x0 G* S3 Y! ] tempb <= b;
- b2 v8 K4 f5 t6 q" D: ? 9 f% B5 X6 d! {0 o/ W" k3 E5 x- _- F
status <= s_init;
* r3 Z. x1 X9 J P% M end
! ? a9 L: ]; g else) Z2 |* E+ {# K
begin; @0 \9 ^/ n6 ^- u- w/ z
i <= 32'h0;
3 P( X, Y% J; N c tempa <= 32'h1;+ [ X4 F @2 P+ P2 D, {! d- B
tempb <= 32'h1;
- ]1 @; a9 F* y3 f1 g( L+ n yshang <= 32'h1;" \8 u0 I; `) G
yyushu <= 32'h1;5 Y, L! U( \$ t, o
done <= 1'b0;7 u, ?% G* z, t- [9 {* J
! O5 h2 I& J- |) b, K' }6 E. A: t' n$ \ status <= s_idle;7 h2 s9 X. G$ Y. P5 c
end8 m9 R q* i, M& n8 }! X) ~
end
4 S8 N% a6 l i3 C9 j7 A
, Q* l" ~0 Q& k s_init:
5 X0 u v; s9 i% Q$ F# o/ U5 T7 | begin
2 N! n1 [3 }, \) @% N; D temp_a = {32'h00000000,tempa};
+ I2 N* ]; G' \& G1 e% {& D) A temp_b = {tempb,32'h00000000};
4 T+ V0 w% s$ u& W" G: t& L ; c9 r8 l0 [1 J$ f1 E$ D0 n
status <= s_calc1;
& r3 ^$ G- X7 W, i- w1 k end9 i4 b. t" ^8 ~0 n* Z
% \0 R4 ~5 w; N% K- Q* J
s_calc1:! y& y# @5 o3 c; T$ e6 {7 F, ?
begin* L" R6 ~5 ] Z
if(i < 32)) ` _0 _4 T+ U( ]# i
begin
* K/ ?& d! t& d8 P temp_a = {temp_a[62:0],1'b0};
3 q5 d0 u0 ]: E4 [
) h. j6 |9 n7 F ] status <= s_calc2;# Q5 I( _3 C& ~+ f
end( G; ~0 B& e% i: }7 i: E
else
* h+ U7 h& s6 [# z/ W5 V/ |9 r begin
3 s' _* h+ D% [ status <= s_done; ^& `; N4 a& \9 v- Q
end9 `- r* {# q8 e: d& l1 D
$ a) D+ d4 \$ @* L# l$ h; c7 K end p6 b. C2 A2 o/ a, M! E
9 m X! j& K7 H
s_calc2:
) a. D( X: h- C. b% D/ z0 Y5 ` begin
: V2 h* H' G5 k, g- Z* Y% } if(temp_a[63:32] >= tempb)
0 e$ X# b2 U5 p' L) Y3 K; \/ E begin
4 f( F8 [7 N. @- M+ F! i7 y4 b temp_a = temp_a - temp_b + 1'b1;
5 h1 m! r7 N3 s6 |* |0 } end1 I8 ~2 t5 u; ?. V% R4 J- _1 v
else' _# u: O3 ]1 m
begin
0 b; j# N( M w. [* u- B$ r temp_a = temp_a;& }& W8 {7 h* _8 Q4 d+ b" e+ _
end5 @+ v* p) {6 P4 }3 k! ^3 T
i <= i + 1'b1; . [1 Y: `) W' V8 u. a8 C
status <= s_calc1;
4 h& H. V/ ~1 C a7 r5 h- d end! c- F4 d8 h5 h
; C- m9 j r/ D; Z" X1 Z s_done:
2 m, M, X- t" R begin
; x$ E) j0 t& H& Y yshang <= temp_a[31:0];% h2 D. Q0 ?2 x( p+ Z6 N
yyushu <= temp_a[63:32];
& I% Q, w6 F- E ^: B0 d done <= 1'b1;2 i% I# F+ u% M
0 k3 Z. E# T P) K* o) h
status <= s_idle;" W5 {, r; `3 e
end( ^% h8 g0 j7 M' ~+ X
% H/ P5 }) Y+ f2 n
default:# c- S2 V! N! E" C
begin
# |: o+ n5 n( s7 s# z+ s- @4 S; h0 y status <= s_idle;0 e+ s5 J3 q: S* E3 K/ ~
end
: ^2 z" ^5 _* L9 S endcase0 A9 j6 K+ i X; f& R
end/ q# p, l, l- L5 T
& \7 p4 E5 v" q/ \end
% ?5 S% |1 r" p6 r' P% ` w* B; o
$ ]" w( T9 p; `2 y/ h) Yendmodule* T- I- L( ^+ l( I) b6 v- Y
: B7 v- t9 s% Q. _1 f
+ I6 `* k" I0 ]$ n& F1 `( Z) n P/*************** EOF ******************/
' T( V; z: G) Q5 P1 N# a- ^& H, d0 z
( B$ B: S E7 o8 x/ l* P6 M/ \: A) Y, X
; F( x; P2 P( y7 J
b,div_rill_tb.v
( G/ ~3 X4 ?' C, j
6 Q8 ]3 g& W' f( _
9 x2 o% o3 Q; a1 Q8 }$ F/*
$ ?' V( f- [% M5 F. V. o: p; @; m* module:div_rill_tb
$ I- P" ` a/ B% z: x g* file name:div_rill_tb.v
) j' l* c# v+ g: A' K* syn:no. {1 r0 S- v: x9 f1 T* R
* author:rill
* {% l3 z; D1 ]. ^. X( q* date:2014-04-106 }% H( m6 P9 A; p+ h
*/+ E. W% g$ s9 O5 T0 \
5 C; @) `! D: n' f
5 z$ h- H3 ]: d& [% ?; Q8 _7 {' u/ i`timescale 1ns/1ns
! G% ]* E9 k6 m' ]6 U8 A, W
( Q9 Z! Z0 Q; V0 ]6 B% A) _( M$ }module div_rill_tb;
, l5 k7 D3 U6 {+ K
, P5 ?9 B3 B; N8 P! ureg clk;
9 {( z& d) W* qreg rst;
3 Z) c' K' [) z: f( ireg enable;
; O+ j* a$ v# x* B3 A7 A8 ^5 A5 M
7 H( V4 Z: O4 q7 @reg [31:0] a;: I. I8 x. B' _ B
reg [31:0] b;$ Y9 C1 c) z x( B
wire [31:0] yshang;2 W+ @; d0 P6 ?; e0 j, e
wire [31:0] yyushu;
# ~( V* _: W* B% W
. p x* @4 [8 L* m4 ^7 N0 }! O* [wire done;8 t; o3 o; U+ u$ p- A7 ~% V/ L& `
) a* g6 r9 _4 L; v( b
initial
3 d: X7 i( U% I+ W0 K; pbegin2 \. `' y, o0 b' x
clk = 0;+ D R% v" E! y' B& k' k5 ]
9 X& i; K/ N" l, H0 l! l
#10
3 Z2 u2 n8 B- j* i rst = 1;4 b+ e) u% `* A8 @
#20! i5 n$ _& p2 n- Q
rst = 0;
- D( ?$ y2 N$ t9 v4 o 6 T! y5 [, S. v& \
#15+ I2 p2 T. y6 y* ?2 B) v, s
enable =1;
; i k# j' a8 W( F( P! n$ G a = 2;//$random()%10000;4 K$ u% b' w* ^2 j0 D
b = 7;//$random()%1000; [$ c1 N1 S) {( [$ @8 h/ W# T4 ?
#10
) u% U7 g6 _. C. v. y$ j' r enable =0;
+ @# s$ y7 Z8 Q; L& o
4 a- R1 W4 Y3 ~/ J #1000+ C% a% K# r! ?! ?
enable =1;7 c; B5 Z: S: U# \" S
a = 7;//$random()%1000;( X1 b* Q' ?5 o+ N8 J: g
b = 2;//$random()%100;
8 T, q5 u0 N0 ]. D #10
& ~- _7 R% D. `& T enable =0;0 y0 J9 @ E! y2 ]2 B0 f) B# {
- |; M; x/ E6 g; p* S+ f #1000: S- a' I# ~- d3 d- D" ]( O/ v
enable =1;
$ Y, l! v; L/ [/ S q a = 7;//$random()%100;
8 P' ]# w) L4 j5 ~" e' ~3 { b = 7;//$random()%10; 8 [2 K& J& P3 ^6 ^
#10
w2 O( Y8 x& x) N) K# o B9 U enable =0;" z6 n. g& q2 Z& A6 i: n
0 o# C. @: g2 d6 z/ {0 @
#1000 $stop;
7 s0 M7 `# q; r0 S. Y* `2 zend
' Q- q7 v1 k( m4 ]
. ]' Z* r4 N& c- Y. S: Z# r$ calways # 5 clk = ~clk;
& t8 }& U: q! C8 M; |4 D" v
: u6 q& a9 g" udiv_rill DIV_RILL8 X+ k8 f; u$ s7 f) m% k
(
$ n, M* w4 |! c/ S- _.clk (clk),6 a. y$ w( d6 z
.rst (rst),& z# @$ ?4 q6 v+ b" n" P+ l& x% l! l
) Y- J5 C: s- ^, n" v
.enable (enable),
+ j' E1 e& N) Q$ W2 p2 P! H. a.a (a), ' k% c! r" Z$ ^, K
.b (b),; `/ z: Z6 P6 q1 l; u- P
: a; P8 y& Z$ N) ~6 h; [.yshang (yshang),0 G/ h9 p* d. s/ ?% ^2 z
.yyushu (yyushu),
: ^4 N' A/ ~2 ^' B1 U/ {
* Y# o: p4 Q. x! ^; s3 _/ Z1 C.done (done)/ K0 u! I D4 n6 v e
);
2 S: U2 g% l. _2 ]6 M0 S' u) u# f+ m, ? ?5 w8 A7 v
endmodule
$ T0 R) w5 b$ ~" [; c4 |7 P/******** EOF ******************/8 C! `+ ?/ b9 b+ w. h9 F6 W) n
7 ?# v! S+ ?" n6 t, z: a# P
/ y- h- \/ Y/ U* }
% ?9 e6 D/ K p, V1 Y8 n7 @/ {6 f, {4 F) |! N- m2 y+ a: P/ Z
2,,验证结果0 F& v \" Y1 }" G, Z! ^7 U [
4 R0 F F$ i/ E% n/ {
3 n! d2 D9 c. g
# t+ N3 U! c9 m, E- `
; {3 g7 u3 _/ `, c; x5 w9 x# c
+ p$ T6 h, M! v- x8 f( V
\; ^3 a; K" f2 t
7 w/ r h% K7 Y# x* o6 @9 e9 P) u' ?) D
|
|