|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言8 W& h: J9 S% w! _7 i
两年前,我写过一个简单的除法器,当时由于时间问题,只实现了一个简单的逻辑电路,但是实际中大多都是时序的,所以后面给出了修改意见,但是并没有进行进一步的测试,最近发现那个简单的除法器引起了很多讨论,本小节就做一个终结。. A$ h+ A( R; W9 u/ i+ }. G
5 P$ ]9 i+ J- t" n0 Z
( t) C+ V i" z/ \' H
; Y* k+ s. O* {4 m. {3 u) q
1,RTL编码
: n$ z$ B" B4 ~" A2 H) Pa,div_rill.v6 x! |5 H9 g9 x. `& W$ Q" J
0 I: A7 F i& n" J" K) M" H; \0 p9 P. H
/*
' Z4 c/ R& g: b* module:div_rill
( X' f4 A, d; ?2 p) G* file name:div_rill.v
1 K; V; d6 X b1 W# b7 @* M& {+ V* syn:yes( _& T' C t. \9 y' `, F6 U
* author:rill
# y+ q+ G- x' ?+ u. l$ l% [2 h& V* date:2014-04-10! d- |8 @8 P; E: V, ]% i
*/2 `5 n V& e! J5 \; ?' y2 f
8 r2 q4 V% \# G: q+ r$ i z! Y% w% P7 Z$ F- G F
module div_rill3 Q5 F9 M2 R6 Y) c' {* M6 ?
(
6 C p. A% b% d }7 S' V6 n! Minput clk,1 j( s& G+ V) g( J7 E7 |6 I# k7 S @
input rst,
. L4 P2 C7 t0 }" `# @1 v/ S/ B: j
input enable,
& W5 ?; ~5 y, u" D: I! vinput [31:0] a, ; q% d! I$ U* p9 o- K
input [31:0] b,! a+ X9 ^4 R/ [
( u: H4 a+ o* }1 U8 a
output reg [31:0] yshang,
; y6 p/ F6 S& v# L. I8 L5 S2 r5 Doutput reg [31:0] yyushu,
5 o: P K. x" w x' X* l! z* B
4 p$ E. E; Y( n: c; f& uoutput reg done% Y9 ]' [) }% E6 w3 D6 S% C
);* p3 C( t5 G4 t4 Z4 n
) P7 D# s( j0 p6 j! c" ]reg[31:0] tempa;+ {. d2 B5 C) T# f
reg[31:0] tempb; c' K0 l3 t- l" X' O0 J/ p
reg[63:0] temp_a;
' U- r v, I' r9 X. x$ N: u! v% V5 _) Treg[63:0] temp_b;
6 n' ^: ?0 @2 q
& [1 Q8 [0 a2 f; t9 m& D5 d0 l: Breg [5:0] status;5 }! y: d- f2 k9 {; {+ x/ E
parameter s_idle = 6'b000000;
5 `, z9 Z0 h: p8 e7 T2 {parameter s_init = 6'b000001;4 E6 g! A3 c2 x/ \! y
parameter s_calc1 = 6'b000010;( y: ?4 ~$ u g. c, p, C2 u2 ^
parameter s_calc2 = 6'b000100;
. h% p3 S; S3 v5 D O- vparameter s_done = 6'b001000;& f/ a6 y# r, G j" u& C0 ~
# v8 Z0 z4 m) h) \4 G7 I
# {5 A$ z2 c7 h7 U. G
reg [31:0] i;! y j# Y( m! s3 q
4 M- y$ j- i w. Z* O
always @(posedge clk)
4 B0 P3 }+ N; W+ { L7 zbegin
& a9 m/ F4 B; w! B" Q- @ if(rst)
+ D- }; r K i% l begin6 K9 J0 @+ T B a" s
i <= 32'h0;
$ i K; y* j3 e1 c% |6 F& B tempa <= 32'h1;
\5 q. W3 O" p tempb <= 32'h1;
8 J2 L' i) u& T( `4 r yshang <= 32'h1;3 C+ u# u$ E6 Q1 q: d7 ]7 M2 {
yyushu <= 32'h1;
6 b0 p% H5 ]- A. ]# b( P& E9 c; N6 ] done <= 1'b0;
* C9 f- Y! S$ p! l status <= s_idle;2 B* R4 }* u) s7 S5 P1 |$ G* `- b+ I
end* w- k' m3 {4 v- W2 J
else- U2 A- I5 ?. U
begin
9 n" ~ w: O: z4 e case (status), H5 c1 h& h! Z9 @3 {; X6 f
s_idle:5 s/ X0 J+ h9 y$ B0 A& V
begin
: @! D: ~& x0 x if(enable)
& {4 e8 V) K6 f- u1 i; O2 {& C0 H* H begin
4 |( p4 r* S0 J9 U! K+ i/ C, B* @) s6 R. Q tempa <= a;% Y" ]: C/ p* e6 W( O! l
tempb <= b;' \. A" l8 K) A
: i, z9 n* C! N% j: S: V8 [ status <= s_init;/ I# r/ [ O3 e# Z% U
end
) ^. ?2 A5 f# N- _ else5 b5 H7 E" ]; S+ B7 | c
begin- p0 g8 G1 J4 ^' |
i <= 32'h0;) v8 [2 w$ B! w) ^# o
tempa <= 32'h1;, Y, G1 @* O* k! j
tempb <= 32'h1;1 v% f, ]( M1 }* ~9 ]! p6 S0 c; |
yshang <= 32'h1;& Z2 z+ y! j. Z+ ?
yyushu <= 32'h1;* K3 n! z8 g8 Y
done <= 1'b0;2 `3 B8 }, ]/ T Y$ _0 P. ]4 O
( O0 C: Y) K& Z4 }3 @9 w status <= s_idle;3 u( _/ z) y+ f7 f5 K
end
* O- {6 v& H8 ` end/ j3 I0 I- K6 l2 b$ l3 y) h* i
3 k0 m; v6 _; C% m! N s_init:
- f# f& @. g8 r V3 I L9 ?1 [ begin
" _, f- Q: t+ R- x( t; |3 ^ temp_a = {32'h00000000,tempa};! v+ C( p, O: |7 k/ ]
temp_b = {tempb,32'h00000000};5 W7 t& D4 h* j7 A
2 G$ b( H" y0 z) T' R2 ^0 m
status <= s_calc1;
9 C- q Z1 j5 `+ l e end
6 b8 `% `0 C4 Q
$ A9 l1 C' G7 I. K s_calc1:; z+ g' R6 j0 j/ v% n
begin
% B0 |$ c; k4 O \" b if(i < 32): ?7 u! l- A3 H% `' ?/ @
begin
3 N5 ]+ N) |& q8 k temp_a = {temp_a[62:0],1'b0};
" P' T9 Q: k7 n) c! K
4 u: [7 w3 K9 n' s3 _ status <= s_calc2;4 C7 P" _! s( J1 E' K
end
0 c2 B- `8 P! W! }0 ]- ` else8 C! M' \% h* J* a" J5 a; f
begin- y* M* I' V' ?- s4 t! F. [& s
status <= s_done;
0 h n* w& S7 V5 [, t$ ^ H end% K5 o& X: Z; Q6 D1 T
: A. w, |! _ y end L3 J, l9 m+ I
& @9 e" s" x; `. d) Q s_calc2:
& B! v N" O. L. |. H begin
" ]0 r2 `# g+ G: C# A if(temp_a[63:32] >= tempb)& ?, I( j5 _' w3 s$ }
begin
4 g l+ A I' C6 h$ q temp_a = temp_a - temp_b + 1'b1;; |. z R5 X; `' Q3 l3 C% s; C
end; I- d: b. I' C( B
else
7 t( P5 w1 _( @# k begin7 a+ X, Q& n8 g' A5 q# s
temp_a = temp_a;; I I; G' E5 C' ?
end
6 ?. M2 ?6 _1 c, e0 |5 H i <= i + 1'b1; ! `% t4 t* Z6 c! n1 o2 P- k
status <= s_calc1;
5 Y- v/ K* n" V* o/ R end- ]2 l0 [$ V) S/ N+ S. Z
! e; N# j1 V8 \ s_done:
+ I, t! K+ x% }* A3 `7 o; T1 B3 u begin4 o( q6 R4 D, [* C9 [
yshang <= temp_a[31:0];
3 B0 K7 n: T0 b yyushu <= temp_a[63:32];$ C/ i) O& E/ y. O: H L
done <= 1'b1;! i4 b& `% F# M
+ D9 {% w/ ]# w$ G/ U, r
status <= s_idle;
0 L+ \5 [, I* R; e0 `& C end
$ U1 h, t( i( ~2 E. J& C& j
+ c5 y5 Z2 j+ f; F. V default:
0 _$ r( N0 t2 {# s9 k+ ~ begin; m" t& w* f/ t1 K* @" p' z
status <= s_idle;5 }% |( N5 h: [& v6 x( v
end
+ F- ?, B" m5 ?8 j) m8 l/ J endcase
7 C. W5 K: A5 ?' i6 U' r end3 M1 c I0 y1 a) z: K" T
! Z0 M9 h6 K: D8 z. d
end5 E* i; @; |; b( |, w! O9 v+ p
2 x' r. ^# |' i9 J" D+ n2 ]
6 g( J. @: B# h
endmodule
! k' w b% f& j0 X9 ?9 l( d# m
2 ~( z& q$ d+ r7 x* S
, Z2 {( s3 ?3 N2 j6 J) K& C/*************** EOF ******************/0 X. s5 t7 f- B
$ w+ K0 I( v7 \
" d" i: \, b7 `) f6 P# S4 s% J+ G) _$ Z6 m; d* Y; p
u" k6 |! X0 X- ]' N
b,div_rill_tb.v
3 @9 H' J, Q$ C5 c+ m
& U- _$ v4 u4 ]$ ?3 G7 n! g
3 c+ j8 v9 J u/*
# n! q! r0 a2 Z* module:div_rill_tb
5 @. r! A: w8 `9 T, p* file name:div_rill_tb.v* d; L! L2 x$ w4 C6 G5 ~
* syn:no
; K- S& }+ ~8 B* author:rill5 w& G, J0 Y0 ^7 S- s6 K
* date:2014-04-10 r7 x: m: a: g9 W: L+ w
*/
|0 r2 F9 l9 l9 x+ r6 Q) {) C/ o% z j* Q- Y
4 L+ p* L( L# d# j`timescale 1ns/1ns
6 Z' A Q& Y# `$ y8 N" ^
6 p2 m( D! A# a8 amodule div_rill_tb;7 K- U2 m$ h; ?1 w6 }& \7 [
/ q# T% X% O; ^2 b4 o
reg clk;
/ R9 b9 [; K6 G, w8 X! b5 Sreg rst;
% X2 z9 Z" j6 x; u1 b1 K4 X& sreg enable;; c# L0 b7 O9 ]
, z" {3 t' H) Q+ X
reg [31:0] a;
9 j, R2 e/ ^' H7 kreg [31:0] b;
( K% ?/ w/ p1 v7 }+ awire [31:0] yshang;2 r9 o Q6 Q' g# ^% C) D6 A Q6 D
wire [31:0] yyushu;
% ^6 l" f6 U2 H' w- Z1 B& L0 ], S6 J9 o( F$ ^# J. I% l! ^
wire done;% l. U6 ?8 B: l. [8 a& j
P3 [, W$ E- a( ~
initial
: O3 u9 Z" {2 z3 abegin
2 }4 O! U! Z4 j E$ _% Z: j0 `# _ clk = 0;
$ R8 G* A( `3 C * s1 ~, {: g; Y7 d- P0 X
#10# @6 A) }8 l1 E2 q/ r8 M9 V3 d5 y
rst = 1;
8 d @* D: Q, O #20# W0 c% C O7 W( D7 Y: i
rst = 0;1 E [0 i2 l M4 Z. ~; k% j
. I# ?7 U) `3 Z6 J6 @4 Y
#15
" y7 V; J4 e2 ~4 d" ^$ f3 l9 m3 D enable =1;2 n+ b' d% r/ c H7 q' X, B
a = 2;//$random()%10000;; } N$ f8 `) V7 Z) S0 ?
b = 7;//$random()%1000;
- R" g. \( d. L! o7 W #10$ J1 P4 U) u* s9 P3 C
enable =0;
( J' N: G6 W& g
- }1 b: r% q/ i, u: y( `0 R #1000" D* t. Y# I! J5 o7 q& n
enable =1;+ s, ~# u% N4 ~9 m
a = 7;//$random()%1000;9 n- I& n- w; R! X
b = 2;//$random()%100;
8 S9 T* z5 a2 S #10" t) Y# }3 g/ V; P7 T7 n
enable =0;
5 {- J/ b; R! q. C 6 W+ {' ~* d4 N1 B( h
#1000' h1 _! a0 ]# v5 ~1 O3 ?" f
enable =1;$ ]& s2 G) O, E c
a = 7;//$random()%100;
: n5 P: k( ?* Z( u$ R9 n b = 7;//$random()%10; / c8 L2 n1 f# A' j' A# b
#106 I- ~5 `# z9 S8 ~; x3 v
enable =0;0 `( p! Z; Q* ~& s/ \5 b
) D& [8 j2 z+ f #1000 $stop;- R: `7 t6 A" r. W' ~2 C
end
8 T2 q; _ {% q9 j; Q
: \# @: v7 @( [" Xalways # 5 clk = ~clk;
* ?$ F, U9 j( z3 x1 P7 O
5 I! d. Y( Y( {* j) _, Pdiv_rill DIV_RILL
) {& F' H, B0 q" w, Z5 l(( I6 J4 r1 Y5 j3 J$ O# K% k7 S/ k
.clk (clk),
- x+ D4 S4 J. c6 p5 c# H.rst (rst),
- g/ h2 e& `, O) i- v; i* H) t' h. ^! @; J: f
.enable (enable),
* W8 g% E {+ M; G. T6 ~.a (a), % |* q8 A. c: V C J- F$ m, p
.b (b),
0 N! E ^; ]/ T8 y0 _$ G* f; {$ b, G( P
.yshang (yshang),
# y6 K0 f, K- t: o2 U0 N" T.yyushu (yyushu),$ z: q9 @) c& T! {' J4 N- Y8 s
& _0 p+ o0 Q! G4 s _$ a
.done (done)
+ A1 s+ E4 Y) m. m5 X);; d/ K2 |* C4 T0 b$ U$ H7 R
* P2 U9 |1 I* F) z
endmodule
. y i* A. G8 L. S5 H. ~1 u$ y' V/******** EOF ******************/( d( c# u. U( [/ w: T$ a
% b5 f% L: B+ ? Y" Z2 V5 y) o
5 T4 k: q- t. N3 M4 `* ~/ U0 d
' A8 P3 c# ~- Z$ d2 X( c2 v: }7 t$ v
2,,验证结果
; D, |4 n6 ]# p- u) ^% d# g7 V7 a( F: x/ A9 z+ q; V c
! j% z5 k! K: o) F5 g
0 q6 m1 Y3 _, B* \6 u3 ^7 u( B1 ?2 ]" L2 m# y0 P
0 j5 m+ {$ N' _/ f7 L4 m D5 P
& H3 m& S7 d1 M& t1 ~% [
8 t) a8 d: q5 Y8 V5 p4 |# W/ I: m7 E$ E: H' f3 R
|
|