|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言+ `1 w6 h, k1 l
两年前,我写过一个简单的除法器,当时由于时间问题,只实现了一个简单的逻辑电路,但是实际中大多都是时序的,所以后面给出了修改意见,但是并没有进行进一步的测试,最近发现那个简单的除法器引起了很多讨论,本小节就做一个终结。/ S N' P( J+ P2 E; A! i
7 d/ {! y3 N" @" W) p
$ M! q* Y: S' b: a) E9 f' W* C
5 `4 S' R9 L a1,RTL编码
K7 h* ?* U3 q" q! Va,div_rill.v4 T( w( O3 v2 F$ T: K& X9 } g4 s% E7 L
0 B2 h( g$ s4 p
/ D4 X0 W5 U. _8 n3 o" N" J; m7 [$ v/*
, ^4 b' V2 A- _# j* module:div_rill
- E& q) v9 F& }2 ^9 I. U* file name:div_rill.v
5 s" K( Q. g/ g# @5 p0 l b, Z1 d* syn:yes N. f* D! H7 p! W
* author:rill* X$ \+ k* c- o9 w# l
* date:2014-04-104 Q* p) d5 J, t K- y
*/
& D4 h: p; i5 \
# |) \( t& D( U D5 s5 a2 J( X4 I! F5 Y/ _- w& W
module div_rill
1 d4 Y: e! Y& T1 T2 d/ M8 p7 ]3 r(
! v0 p) t0 z' Z/ i* M1 cinput clk,
3 N! M% _2 w7 b0 U7 w3 `/ binput rst,
8 t! d" ]* i8 k8 O' ]' v' @$ z0 j& S. }4 I
input enable,) N& z$ f6 d7 W n3 G
input [31:0] a,
* S4 d$ y" M& X# A7 a8 [input [31:0] b, l; f' M! z1 D* |3 B8 v4 _+ Q
9 d: ~) E. s# c& X( }. e* poutput reg [31:0] yshang,
; _$ v$ L1 E; ?% c) ?+ @; Xoutput reg [31:0] yyushu,
# e' R- K' }0 _# e4 s5 @" z7 i& L: L/ f+ y+ w
output reg done! Z/ A9 f1 b7 L# Z# h9 Q
);- q5 E0 w4 e- t' ^+ a( f8 C# o
) \; ]1 W" q% U7 U) h2 j# Q, @4 Y5 p" Hreg[31:0] tempa;, V5 e3 b+ b% m! G
reg[31:0] tempb;
' }; Y! k% d' H- x1 ~9 ~3 ureg[63:0] temp_a;
# Q% A. Z; e: N8 freg[63:0] temp_b;& @0 r# ^2 ^ T/ J8 l
% Q% S, T( \& l' E6 n+ Zreg [5:0] status;
- K7 o& R9 l: ^# r' K3 oparameter s_idle = 6'b000000;
' s0 H, W9 E8 Y, n% a% L- W8 @parameter s_init = 6'b000001;
( j- `) {* n2 @/ q+ C9 p* Z0 aparameter s_calc1 = 6'b000010;+ R0 e- B6 h: ?! [+ w4 r0 n
parameter s_calc2 = 6'b000100;
7 x) X, j$ N* H" x# Dparameter s_done = 6'b001000;5 n) w) u Y2 q$ A' D* k* l+ l
! e7 q+ S+ I; m: Z
# D, a8 h9 K9 q
reg [31:0] i;- t7 i, G) t, c+ m+ m" O
' w7 v$ P$ X, _- [: L- U9 o9 q" ealways @(posedge clk)
/ g+ W1 B3 l0 y6 C/ ~& Z. Fbegin2 Y1 |' y- M# k8 `
if(rst)
8 V7 W6 L1 B6 h$ L8 _ begin
3 V# g S1 I+ y# D, \% M i <= 32'h0;1 `1 D4 J9 K) t$ ^7 Y" V4 h
tempa <= 32'h1;
* ]2 V* O l) f tempb <= 32'h1;4 A0 d) t% W/ A& `6 m! R& X1 \
yshang <= 32'h1;: P; m5 S8 F; P* t
yyushu <= 32'h1;
7 H& Y3 Y: O8 O5 `. R+ r done <= 1'b0;- L1 H! f7 E1 W& J
status <= s_idle;
2 O" C' R+ R2 ^) n' ~( B+ | end
& u* U1 J$ L4 [ else
1 i. C, }6 m4 j# k) ^ begin
' {) m" U) p+ Y* ] case (status)9 O+ s, y8 o5 w: w0 l d- c5 D( J
s_idle:
, r7 F, b/ D8 J) P begin7 H+ i/ r, a/ _$ ]. U% e4 {
if(enable)4 U' @3 \5 t" g! s( Y7 D1 J5 A7 N
begin9 A' m) J( I( w! G3 R
tempa <= a;
# I2 T1 v |9 U$ j; U! i7 v; Z% B2 C5 V tempb <= b;* b4 U& s x- C1 b
I5 R ^3 ~* z! B status <= s_init;6 m }0 d7 f* d$ h0 U, I
end
6 J# v4 ]! M2 Y1 r% |) {; I6 ~1 t" v else0 M; b" e$ n# H. k+ X8 n
begin
2 T! b- s: a5 v- t7 @- b i <= 32'h0;! u% u, N( L4 I1 u& |0 z3 G/ n
tempa <= 32'h1;
8 f y2 b# x( _ M5 \0 d tempb <= 32'h1;
" l3 O2 @+ a/ ? yshang <= 32'h1;- U( D+ Y1 G1 \
yyushu <= 32'h1;
; I/ n5 w1 K8 D8 |7 { done <= 1'b0;9 W$ N# y: |, T& s4 A
" G" C5 l. p: b9 Z) ]) x
status <= s_idle;: c* S* A2 s" P/ V1 f; f( g
end
8 T g' d8 H9 ?$ X# |# X4 i' | end
7 M- K" p3 `; Z! n8 Q% d( M
! E; h$ p; D: D2 ]4 E s_init:& B }3 w+ I" j. M+ k
begin
& |; e. f' L& F+ L temp_a = {32'h00000000,tempa};$ ~0 s2 i; r- y5 @4 d3 l
temp_b = {tempb,32'h00000000};
7 N9 o A; |+ b! Z# d2 l $ n- U$ Z$ q- Y
status <= s_calc1;
+ X x" b7 H% C3 I' p end
" O7 E+ p# D) N7 g
# f0 r# `7 @: F' s/ h9 T7 ?2 s6 ` s_calc1:
; [; @* k2 I2 ^ k7 p! q* Z begin5 j( t: {# k; f" G" ?& I
if(i < 32)
) I! g$ G& m! X3 _- l begin/ S9 R( Q; D% X. C, l- O
temp_a = {temp_a[62:0],1'b0};
6 `3 q: S% Y' u- J( ] 7 c! E# s1 y( P3 _5 b& Y: _
status <= s_calc2;
8 q. \) n X7 `& m end9 H! x' q- h; a5 [% q
else$ d8 `+ K! l* ]9 F* n4 z! Y3 Y, S* o+ l
begin- C1 Q4 F3 p% l' P9 h+ w+ T
status <= s_done;
6 I+ p' `1 D) T: x' U end
: E9 ?2 H, B- t1 N7 o ^2 E0 k# u : W+ C( D& E+ @" \$ I* p
end; {# z/ ~) q; f$ ]5 P: t( k9 P: |
9 q( |' g, D) [4 F+ m s_calc2:8 t: `; ?0 P2 \3 y
begin
# e, `; S# m% K3 ?4 ]8 H if(temp_a[63:32] >= tempb)
9 ]- F# x& \" R( H* C begin
1 J5 v0 Q4 A1 U temp_a = temp_a - temp_b + 1'b1;2 m. {& |( E8 ~- M. m
end* Z' O" p( c; L4 c$ ]
else8 E& z$ m" w# P H7 I2 P- M( @
begin. l5 O' f! B6 t3 s3 L
temp_a = temp_a;+ {( {+ E, N4 L' g6 J" B5 z
end t1 O T. Y( F8 l6 d
i <= i + 1'b1;
6 |- Q( g d# C/ w% o) l status <= s_calc1;
; l0 _* _/ \6 Y( D$ x8 i) i end9 \) X) A; F( \& B
" u2 @ ^2 b7 w: y+ `& t5 a s_done:
* y* o; A O0 T) p# O- O begin) _! z) i; M9 \1 _- ?
yshang <= temp_a[31:0];4 v: N6 s' r( W& E$ y
yyushu <= temp_a[63:32];" i) R, K B/ x, U7 q: s" W
done <= 1'b1;0 \$ U/ Y! t% I0 ~* {
' D7 D4 P3 K+ v4 m, `. ? status <= s_idle;: {4 t6 p7 R3 o: f: l: g
end
0 L! ^( \3 a9 |2 {5 q4 K
' ~6 x: h% Y* E* k* ~ default:6 G4 I+ j4 ~$ l9 S7 l* c
begin
, ^ S9 c; Z+ r% s% f9 Y p' v status <= s_idle;# f/ t/ }0 K" B5 e
end
5 W, Z$ G9 } P! Z- L* M! @+ H$ A# W8 ] endcase1 \1 Q) a+ f* Q0 z! N# R
end
3 P- }$ W! X" K( I# P. G
' C) Q# I0 O0 c. f1 G/ {+ Dend
5 X) W) h' P# e: D9 d& {/ v. D
+ N- }8 d3 s3 o" G2 |" B( |4 f2 N, q& e$ \1 U3 Z
endmodule; \; F& W& \' @/ ~ u/ H
( {" Q. g* n4 P" u/ h
9 v: @- d, K4 j1 T
/*************** EOF ******************/
A. w& S4 ^9 n, T
@9 w/ ]6 g0 H4 P5 _$ e! q6 |+ Y2 N8 k7 _* l& F
1 |+ u( m" c2 | s
8 ], \; B4 o4 K. M" M$ o* Cb,div_rill_tb.v4 v5 P( P) X/ j0 ]6 p3 E
0 x) a. k: K8 Z% W h
9 _. U7 s. Q6 t5 o* h1 I/*
~, V; i* F& [9 ~* module:div_rill_tb
: W3 Q% `$ [* a3 W* file name:div_rill_tb.v
$ T' B2 x8 E2 C' K* syn:no! f2 D. l" G9 z( Q& c( b% a
* author:rill( t9 V5 K* R- D; f
* date:2014-04-10
( w9 X& W, {" q+ }# O. d# r*/
; a1 ~ Y" ?( s% h9 \2 j! t6 o* S: R
/ @( Z8 a" O3 r, u+ t# u
`timescale 1ns/1ns
3 t5 E7 Q9 x, ~+ l! p
' ^: s# l. Y R) O" }/ h! b' P% {+ umodule div_rill_tb;) w/ s' F; x' |6 D
/ k( K$ S+ x* U' H. U
reg clk;3 z2 N5 ]* Y. C
reg rst;
3 v4 t; X* O+ I5 mreg enable;% ]0 `6 I- l6 V$ K0 r# x# V1 r9 v! r
4 s! F$ L4 j6 l( greg [31:0] a;
- A. B3 x# U* S* yreg [31:0] b;( E; e2 f, E0 ^, C Q' p
wire [31:0] yshang;4 y6 |8 J3 o% `
wire [31:0] yyushu;
6 F$ D/ I \& L) p% ]! o
+ A) C6 \5 ?( g# z/ Bwire done;
( w: l/ b9 i2 d" i/ M. K. L4 Z& G4 A3 c& n
initial
. W# i l" @1 V# F9 Ibegin! G$ q' c8 }) h" v6 r( R
clk = 0;
; L& D' |) u D% _( k. Q) b 5 r1 B# H; m' o1 u
#10
) G# Q1 y* i1 J rst = 1;
+ O: X6 d [* j) L #20
5 e- T; s; |1 J rst = 0;. e9 @0 W' E6 a9 d- N
6 ~2 N$ }/ [* V& q
#15
$ D- Z( ~( u3 e6 O2 @/ B5 I* m enable =1;
& I. z: s& D: V& A# J# r) K a = 2;//$random()%10000;% {# B% {# w- ^9 @# k+ }9 N0 H; R
b = 7;//$random()%1000;
9 b2 V7 C& U1 D* l# ^6 F #10
0 k2 J) O6 [; s; w; U- z( d5 {- | enable =0;
# P# x1 i- W) d% E2 T - C" M: I) @7 Q2 N5 z) x
#1000
) ]) _, x7 L$ K4 K! k5 `& q/ O enable =1;9 M; A7 H3 N) |
a = 7;//$random()%1000;
6 ?. Q9 Z' f) o1 ]$ d b = 2;//$random()%100;; o! G% }2 s2 e" @- o% T
#10( C* s& U# P1 q- r$ n- [
enable =0;
5 `- v* ?$ M* s- F2 r, p 1 m9 `5 t. |. K( F+ p: P
#1000
$ U1 B& c3 `" L, B2 L5 H enable =1;
. \; _; G7 f x4 k1 ~. Z; e8 E( Q a = 7;//$random()%100;" n! }$ T/ Y& j1 h5 X7 q6 F- Q' E
b = 7;//$random()%10; ; _) u. [0 V2 Y2 ]3 u y/ }
#10; W6 N% J! ?; s$ J7 B3 S. l; k
enable =0;8 m& \ c( H* E3 ~' ~
3 Y6 q$ ~3 k$ j u" H3 z
#1000 $stop;
" x5 ~) \3 g [& z2 gend
. p/ w/ Q7 @% u5 y0 T9 h" M, m! D8 `# {" j8 A* o& }4 ^; h. Q; W
always # 5 clk = ~clk;
- \% o: b' u. r2 c* ]4 [
# t; s( \" _+ i2 K" X7 Fdiv_rill DIV_RILL
* B9 T8 r: Y$ z! }(# I$ I2 G3 U! E: S: U# r
.clk (clk),3 ~8 }0 k/ {$ `$ ?0 j# t
.rst (rst),
* |* i r! g$ {7 @# U5 s* b- `" B: ?7 _. k9 _' \" k& _
.enable (enable),
8 a+ o+ d! g/ I2 H1 d.a (a), * K' Q" r$ {4 j' E6 r% ]% J
.b (b),/ r) }* H' y# a9 z; ~
" Q8 n5 z0 g9 b4 J# b.yshang (yshang),
/ t5 `3 B6 l. U9 y" Z9 d; q4 d.yyushu (yyushu),
8 X4 g; ]. T4 ~2 z# X; B6 s% I& @
.done (done)2 U0 K. B3 d7 c9 s
);
* t6 z- ^. N7 u+ L) X: w; i! [) U% r# S. ~
endmodule
9 u+ s' R9 g$ G! p7 ^/******** EOF ******************/
1 O, W, n% Y% u. U' L* Z! O
7 b V9 Y3 v) k" i- H
- _( f) G# o% f) `2 U* p& z* R9 U0 L3 t6 Q2 O8 e2 ] N5 A6 y
9 K0 I& r; Y5 ^. e2,,验证结果
1 t( d* ]0 p$ n: F7 V3 L) K/ q" V9 d, g; ]3 W" T
/ U! y. ]- M1 U9 h3 B& \
! z* ~7 _+ _& q8 h! d# D: A- {' j* F+ Y5 V# ~4 ^4 y% I
$ Z Z* ^. T+ a1 q7 `" `" n
6 t0 e6 u0 d, T0 ]
4 K+ R- x5 B! \& Q6 S. @- O
3 j( }! D3 ^* e9 V& ?- u. j/ I/ z |
|