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