corelogic -> genlib
[litex.git] / migen / genlib / divider.py
1 from migen.fhdl.structure import *
2
3 class Divider:
4 def __init__(self, w):
5 self.w = w
6
7 self.start_i = Signal()
8 self.dividend_i = Signal(w)
9 self.divisor_i = Signal(w)
10 self.ready_o = Signal()
11 self.quotient_o = Signal(w)
12 self.remainder_o = Signal(w)
13
14 def get_fragment(self):
15 w = self.w
16
17 qr = Signal(2*w)
18 counter = Signal(max=w+1)
19 divisor_r = Signal(w)
20 diff = Signal(w+1)
21
22 comb = [
23 self.quotient_o.eq(qr[:w]),
24 self.remainder_o.eq(qr[w:]),
25 self.ready_o.eq(counter == 0),
26 diff.eq(self.remainder_o - divisor_r)
27 ]
28 sync = [
29 If(self.start_i,
30 counter.eq(w),
31 qr.eq(self.dividend_i),
32 divisor_r.eq(self.divisor_i)
33 ).Elif(~self.ready_o,
34 If(diff[w],
35 qr.eq(Cat(0, qr[:2*w-1]))
36 ).Else(
37 qr.eq(Cat(1, qr[:w-1], diff[:w]))
38 ),
39 counter.eq(counter - 1)
40 )
41 ]
42 return Fragment(comb, sync)