litex/migen/corelogic/divider.py

45 lines
1.0 KiB
Python
Raw Normal View History

2011-12-08 15:25:05 -05:00
from functools import partial
2011-12-08 15:19:40 -05:00
2011-12-16 15:30:14 -05:00
from migen.fhdl.structure import *
2011-12-16 10:02:55 -05:00
2011-12-08 15:19:40 -05:00
class Inst:
def __init__(self, w):
self.w = w
2011-12-16 15:30:14 -05:00
d = partial(declare_signal, self)
2011-12-08 15:19:40 -05:00
d("start_i")
2011-12-16 15:30:14 -05:00
d("dividend_i", BV(w))
d("divisor_i", BV(w))
2011-12-08 15:19:40 -05:00
d("ready_o")
2011-12-16 15:30:14 -05:00
d("quotient_o", BV(w))
d("remainder_o", BV(w))
2011-12-08 15:19:40 -05:00
2011-12-16 15:30:14 -05:00
d("_qr", BV(2*w))
d("_counter", BV(bits_for(w)))
d("_divisor_r", BV(w))
d("_diff", BV(w+1))
2011-12-08 15:19:40 -05:00
2011-12-16 10:02:55 -05:00
def get_fragment(self):
2011-12-08 15:19:40 -05:00
comb = [
2011-12-16 15:30:14 -05:00
self.quotient_o.eq(self._qr[:self.w]),
self.remainder_o.eq(self._qr[self.w:]),
self.ready_o.eq(self._counter == Constant(0, self._counter.bv)),
self._diff.eq(self.remainder_o - self._divisor_r)
2011-12-08 15:19:40 -05:00
]
sync = [
2011-12-16 15:30:14 -05:00
If(self.start_i,
self._counter.eq(self.w),
self._qr.eq(self.dividend_i),
self._divisor_r.eq(self.divisor_i)
).Elif(~self.ready_o,
If(self._diff[self.w],
self._qr.eq(Cat(0, self._qr[:2*self.w-1]))
).Else(
self._qr.eq(Cat(1, self._qr[:self.w-1], self._diff[:self.w]))
),
self._counter.eq(self._counter - Constant(1, self._counter.bv))
)
2011-12-08 15:19:40 -05:00
]
2011-12-16 15:30:14 -05:00
return Fragment(comb, sync)