|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言0 D. {' @9 G5 q
两年前,我写过一个简单的除法器,当时由于时间问题,只实现了一个简单的逻辑电路,但是实际中大多都是时序的,所以后面给出了修改意见,但是并没有进行进一步的测试,最近发现那个简单的除法器引起了很多讨论,本小节就做一个终结。# S4 v& L8 W N: U
2 u; g9 w9 ~1 {5 B4 w" F6 t6 V/ @, X2 ?3 [( ~- \
" l |4 V1 ^4 C4 r
1,RTL编码" A4 Q1 [, j# C% h
a,div_rill.v
% h d7 y9 k/ p# o4 B" E5 L5 T* Z2 x6 _+ A; z! X k' G
8 V5 ] `3 I; l" G- z- ^+ ?
/*( A0 O9 P' K& Z+ p) v5 d
* module:div_rill
2 A" O1 p- T( L. }1 B; l" c* file name:div_rill.v1 u/ d0 E6 S: n" k
* syn:yes
% o4 }! Z4 V$ L n& T) M2 o- ~, x* author:rill0 a" y0 F8 @& n/ V _
* date:2014-04-10& K2 K) j" @( W7 J1 ~3 g9 [" F- h
*/# y7 l8 v( M4 H) N& S% g
+ h# ?; e) M. [' r6 K
+ T3 i r3 t6 U' Tmodule div_rill
% U! S7 S5 J6 y/ _# |* G8 M(
+ r0 J* {4 J' \3 K( |input clk,' _1 a9 B# M7 B$ X- F& B
input rst,% T" ~8 @: z3 |: p' E6 d" p9 o
i$ v% O8 o' X+ M% E6 V+ U) k1 Qinput enable,* t- R1 u& E3 m8 A) d% q
input [31:0] a,
2 f/ w1 d: }3 ], ainput [31:0] b,
+ \8 }8 _* p) f4 Q2 D
2 @& R3 K" y0 S. c, F4 Q% F8 y) X2 Loutput reg [31:0] yshang,- x/ ?( W) m- D; c* d" b+ _
output reg [31:0] yyushu,1 G$ O3 r B/ M* R4 D
9 ?1 R ?- T y% [
output reg done# c+ ^/ ?% d ^; H
);
4 n& a6 l0 b/ l% g
: G+ ]( b8 M# }: |* K) R8 i2 [reg[31:0] tempa;# m+ T/ H4 O$ C3 J1 \
reg[31:0] tempb;
+ l! ?, e6 Q% |! ^+ j `reg[63:0] temp_a;5 x, s+ u2 ]+ J& y4 l- w# T
reg[63:0] temp_b;) ~: Z- d% p$ C) `: `/ E$ ^7 {
; Q, z* m- v; g7 Lreg [5:0] status;/ _2 ?! c& Z$ [' x, [3 U
parameter s_idle = 6'b000000;
3 p- {( q- q8 z9 R' vparameter s_init = 6'b000001;/ p* B1 ?1 I5 N; _/ C
parameter s_calc1 = 6'b000010;
' R# D/ i9 b" T- uparameter s_calc2 = 6'b000100;
3 c3 K; F. l! a3 |. h& H9 Z7 ?! oparameter s_done = 6'b001000;6 _8 w* k3 [8 X# Z6 b7 A. j* U* G
# r# e! A1 g- O1 t% z3 l+ A3 S$ W2 \
7 a8 s" m; j; |reg [31:0] i;
; _8 k2 I2 C7 n3 ?% w, `# D# a, k" s, B* W
always @(posedge clk)
2 o5 P- i/ P" a2 tbegin
5 N2 z# K8 _0 q8 u4 M P if(rst), y: a+ `0 X; C: C$ j( Q+ L
begin
6 @: n$ O, ^4 @% G1 ~- c& M i <= 32'h0;7 v9 f, P# X/ f) k- K5 ]$ i
tempa <= 32'h1;
9 N$ I, [$ w5 p; e/ T tempb <= 32'h1;
6 r* S# V( `7 G5 O) \ yshang <= 32'h1;
, {' D3 T$ J0 s" q1 R yyushu <= 32'h1;" [: \4 F4 k% k3 b- f) m* q
done <= 1'b0;: {* h( V; ~1 f1 q" p
status <= s_idle;
$ Z/ G& {. K+ u' K( I2 [ end6 G: m) t4 Z: p. s6 B- L. @
else
, s* ^( F J6 q' [ begin
3 L3 w3 [! J7 G# ` case (status)
' X5 O, ? w, _ s_idle:# N% L1 t+ z% I" N
begin: T8 m' a3 }9 P# P! R; [
if(enable)
3 j. p) m* {0 u5 k begin
* C9 r! g& a3 k7 V) P$ J tempa <= a;
' l% }5 ]4 q" A, i" Y tempb <= b;
) O8 u3 ^/ w' _* C) K* @
1 t% m6 A- c1 n' l: X0 m) j status <= s_init;" N3 b2 L# Q: M, ~$ H
end
2 g) w2 Y0 N: Q* B/ t) w7 B else- K5 Y# B1 \! X+ o' Q# N3 Q
begin
. I/ A: S4 n' O9 B6 y: n i <= 32'h0;% H7 Y3 I, h. D$ X
tempa <= 32'h1;5 N4 M' V0 f, @7 ?; n3 N
tempb <= 32'h1;2 u& N9 z0 P" [) g* J) Q& k
yshang <= 32'h1;
& r/ `8 l/ R6 K# c5 u5 P yyushu <= 32'h1;! w l2 ?0 k$ D4 r& [. k. H4 r7 G
done <= 1'b0;
) J# g3 O/ y) O6 S
. Y( a' J6 X: q9 F% h status <= s_idle;
4 J: `3 l. t, e" O end
" F" y4 z7 Q8 G$ T, i end: e& v) {, I' d4 b
+ \0 M1 h" C/ g u6 c s_init:
+ u+ h- p8 O, L1 c5 R begin
. r2 N m% t( L- v temp_a = {32'h00000000,tempa};
0 Y- z3 \5 e4 `- [' s* j* l2 j$ A temp_b = {tempb,32'h00000000};: D" y: f2 C% A' y- O2 |
: I' o9 j& ?8 j2 Z: h& F
status <= s_calc1;
" @1 J; B; j A- k$ p" v end' [+ b# b; }4 x8 ]: C! Z
) k5 W( W' E$ {4 b- u7 R' K s_calc1:, ?' m6 s, o3 {
begin+ K# U/ w$ H0 s) X7 Z
if(i < 32)0 B0 @, H4 m) ^% o0 X3 l: q# u
begin6 E$ [$ ^: Q" z9 t# C
temp_a = {temp_a[62:0],1'b0};
; j# {, G; d" V# `
5 ]0 @3 \, K" U6 b5 V status <= s_calc2;
( M4 l' u. \! }' d( M end
4 ~ Z2 g7 G6 ?$ Y' M* W else; @7 E5 U0 y w2 m+ l
begin
1 t# p4 b g7 R& E! E/ g! Z status <= s_done;1 f0 n$ f1 U+ W5 j" X
end( F3 C% X |8 @# v1 a
% Y2 `; V- @* B
end
|) B Z5 j- J
( O6 o& B, {" X' f7 B- a' m3 q s_calc2:
7 T2 B2 k. l" X5 _- t* a6 g2 p begin: \: q8 w# n g5 ]% l
if(temp_a[63:32] >= tempb)
" L2 Q3 B: z3 C9 I begin; H- L' ]- n1 @4 m/ }
temp_a = temp_a - temp_b + 1'b1;$ a! e$ n3 V( J; F/ J, [3 }- y, u
end" T9 n+ o$ K9 {" Q
else. N- j& [! Z4 p3 o) w' A6 F
begin& U- X; P# y w- T, ~. N3 S( A
temp_a = temp_a;
$ R* ~1 Q3 H/ r; s2 z end
4 ~4 @' K2 o) T2 A7 [! h7 j i <= i + 1'b1;
* V( Z# Z0 Z" X4 u) y. g6 C: X9 k status <= s_calc1;
$ R' H" S7 z+ G' R6 |2 \ end3 X; v9 ?7 o& O! }1 `
3 X7 _4 L- ?. P0 i s_done:
' Z( P1 }% _( c5 [0 S7 g" \+ A begin
+ d/ l% t! R- G# z' k2 a ^ yshang <= temp_a[31:0];
! B: Z/ ]% T8 \& Z' N yyushu <= temp_a[63:32];
6 U+ J5 w6 u* C/ a$ `/ j done <= 1'b1;. c: n6 e1 _$ f4 j
+ [9 Z0 l8 \6 M6 J: X: c6 \+ b
status <= s_idle;: p& G9 P* l8 j1 F, O1 b
end
+ I- [" X8 |# C
7 l1 O& o5 k! t0 G; F+ X( R default:
- L) V# J8 I* U9 U' Y& p begin9 O) {/ N X* m8 X6 s, l' u. }1 V
status <= s_idle;
/ v2 D J" V7 h8 Y end
! l+ t2 w$ H* u2 P& D, {9 M endcase& z9 h; y4 W- p/ |2 }
end. D+ R1 C$ h$ d7 F
7 n8 O6 _* |: S* Hend; n* ]1 G. [6 @! M
" ]- N4 {" O$ d2 o W4 d! Z( C
, ]2 |8 k8 c! T+ c! qendmodule
/ U: w4 v- [4 }! ?+ P
4 ~; k' D0 ^3 u4 x1 q6 h0 D
" t; X, l! P. B8 F4 Z) K: s; c7 @: w# |/*************** EOF ******************/
! f$ P9 [: ?( w- H) M6 v% D" l1 O
2 {# S( ]& E+ b" q8 ]
7 c. j; }0 l: ~* p
7 g5 o8 F6 B3 A, gb,div_rill_tb.v
, m& O E1 O0 A' p; B x
& C( L3 q1 `: Q8 |" Q& k4 ]9 i+ I# n# r( C% M( b) {& g- Z; K
/*: ?5 v! J1 P/ c* @, R
* module:div_rill_tb" _& [9 p2 D; m) O" f
* file name:div_rill_tb.v/ y" z, N: |5 D1 l/ K8 C
* syn:no6 K% ]" ^% T- r7 ~
* author:rill" }" H# f' k4 a J1 d) h
* date:2014-04-10* t3 F G* B' Z. Q
*/
; A( Q9 i; B. X# B& t" _0 ~; S# R3 r# C6 x9 J
5 ~5 j+ U; t. s/ ~4 N
`timescale 1ns/1ns N+ t& H, y! w! O1 L4 X+ a
5 @2 y( ^ a$ @
module div_rill_tb;
+ n8 F) j- E m" I& j- b- m( A! m- _
7 Y2 @. J% P( D& v" I8 H5 Preg clk; u6 {' w+ `0 A+ x, i+ ~' i4 { R
reg rst;; R$ w' d% g; I% f& j. @
reg enable;& z& k$ ~6 I1 z d; ?5 ?% w5 q
8 D& T7 o6 h: J1 s0 t. K
reg [31:0] a;
( W. K& A, k) ?& b4 u" hreg [31:0] b;
& Y+ v, e/ j+ g- F4 ?3 j, Y2 h! K9 Swire [31:0] yshang;: c+ s7 p2 F% [0 G' Y7 T3 \+ P
wire [31:0] yyushu;
0 ^, h# r) `5 X$ R/ a% R1 j; O0 K! w Z. V& k
wire done;
# l0 f( z: a9 N- | s. H! E& ]# B! t# X7 o. F; \
initial
) N8 i3 K" m6 k1 Hbegin
G- _% H2 r$ ]6 H7 r3 ^3 D7 ^ clk = 0;
; t: W T) X5 x0 |* X' i ! o* J! Y5 p D- ^* M
#10) a5 b& b4 K2 X: p9 r
rst = 1;
' D2 S" Q) ^$ s. Z; j) P9 |, c #20
- I; |# L6 t8 P$ t; o% }+ w0 u; U; D rst = 0;
; ]9 q$ ?! @9 A, X+ w: N& z ; M$ s, G9 [9 M& ^+ r) J& @
#15
! D& Z3 [5 p% E4 _ enable =1;
1 n8 T* A2 l7 U% } a = 2;//$random()%10000;
, P, h2 r: C0 P0 [ n2 ~2 Z, R b = 7;//$random()%1000;6 H* N' v2 ~: T% _4 ~. F7 [
#101 E7 s% }. @8 h# D4 q
enable =0;3 s4 N2 x3 H9 U, `/ @; P
% C$ X& @4 M* f/ u: {7 r7 B: v S
#1000* A+ S2 I/ t1 S! j
enable =1;
6 h _2 b2 |2 o& g3 q: H; M a = 7;//$random()%1000;
2 o8 [! r. o# n6 h b = 2;//$random()%100;
u- L. e6 [. R! b8 w' h0 b2 v/ F #109 [ ?1 E" w7 B1 v
enable =0;
9 O9 H0 k) p H3 H' f3 e! U ; f' [* N+ ?3 u* v/ y
#1000; C5 ?6 B+ q8 C
enable =1;
( }6 l9 X( ^9 n' S1 l3 ?& n, d a = 7;//$random()%100;
) {1 {+ ?% A( j9 t, K b = 7;//$random()%10; 0 T& l( ^. @0 ~
#10
2 ^; Q9 g& f) `2 W# w6 D enable =0;# ^* ]0 K8 f+ y$ z5 i) `8 w
9 y& W/ F& h8 C3 { #1000 $stop;
Q' A" b4 v2 uend( `/ v4 Y7 F5 E' {6 ]& [
0 [& I0 a# |6 o% c4 K+ {+ U
always # 5 clk = ~clk; ]" d( y, X6 ^7 h$ G% w2 @2 X
7 h3 b& P3 i! o. d0 y" Rdiv_rill DIV_RILL. P b( N4 R: B) O
(, p$ A/ V/ ` O. h& E q) V
.clk (clk),7 ?( R: d( u2 [( a
.rst (rst),4 `* c- d t( @4 T! v3 K- ~
5 x: F4 Y9 X6 N8 N2 X.enable (enable),
) r( S0 y+ y0 h9 h/ S$ R.a (a),
7 V; Q3 W( j% k6 r.b (b),
: Y$ n1 m2 m/ Y
2 ?& p- u7 l- d* ^' h.yshang (yshang),
8 t* K9 V: D. T0 Y7 b- P2 j& d.yyushu (yyushu),
! K S7 A& O8 `2 H; o6 ^: `+ z% p3 ?8 F9 Y% C3 D4 U8 w r
.done (done)
! d$ V9 l, C# Z2 r. K);3 K1 j3 `2 P' P
; b0 ~% j& x; b' [4 H- Z( Yendmodule
5 G/ z! u2 d6 v+ l( \/******** EOF ******************/3 [2 b# U8 }7 T' S% r$ r- ?
3 V" ?- J, N0 @$ |5 i+ q
8 P- t2 n7 D6 Q0 P- ~. d2 W4 q! ^
$ ]7 g! A4 U" }, h, y
2,,验证结果7 k" \; F5 ~$ g8 A1 N) K- d; n
, M) Z: r. o6 n
" C& U) c# D/ o1 i L. d
6 u5 [) @8 j. \5 N* x6 D
& U. E+ W& o3 c5 l# ^5 {2 O/ y
% q# A6 `2 D$ L2 d7 A5 g. u3 j0 w$ b/ {4 u$ k
' [2 K* \+ t' r2 B7 B# @2 R
1 R7 A. j# x* P% t, [ |
|