|
3 | 3 | from migen.bank.eventmanager import *
|
4 | 4 | from migen.genlib.record import Record
|
5 | 5 | from migen.flow.actor import Sink, Source
|
| 6 | +from migen.actorlib.fifo import SyncFIFO |
6 | 7 |
|
7 | 8 |
|
8 | 9 | class UART(Module, AutoCSR):
|
9 |
| - def __init__(self, phy): |
| 10 | + def __init__(self, phy, |
| 11 | + tx_fifo_depth=16, |
| 12 | + rx_fifo_depth=16): |
10 | 13 | self._rxtx = CSR(8)
|
| 14 | + self._txfull = CSRStatus() |
| 15 | + self._rxempty = CSRStatus() |
11 | 16 |
|
12 | 17 | self.submodules.ev = EventManager()
|
13 |
| - self.ev.tx = EventSourcePulse() |
14 |
| - self.ev.rx = EventSourcePulse() |
| 18 | + self.ev.tx = EventSourceProcess() |
| 19 | + self.ev.rx = EventSourceProcess() |
15 | 20 | self.ev.finalize()
|
16 |
| - ### |
17 |
| - self.sync += [ |
18 |
| - If(self._rxtx.re, |
19 |
| - phy.sink.stb.eq(1), |
20 |
| - phy.sink.data.eq(self._rxtx.r), |
21 |
| - ).Elif(phy.sink.ack, |
22 |
| - phy.sink.stb.eq(0) |
23 |
| - ), |
24 |
| - If(phy.source.stb, |
25 |
| - self._rxtx.w.eq(phy.source.data) |
26 |
| - ) |
| 21 | + |
| 22 | + # # # |
| 23 | + |
| 24 | + tx_fifo = SyncFIFO([("data", 8)], tx_fifo_depth) |
| 25 | + self.submodules += tx_fifo |
| 26 | + self.comb += [ |
| 27 | + tx_fifo.sink.stb.eq(self._rxtx.re), |
| 28 | + tx_fifo.sink.data.eq(self._rxtx.r), |
| 29 | + self._txfull.status.eq(~tx_fifo.sink.ack), |
| 30 | + Record.connect(tx_fifo.source, phy.sink) |
27 | 31 | ]
|
| 32 | + |
| 33 | + rx_fifo = SyncFIFO([("data", 8)], rx_fifo_depth) |
| 34 | + self.submodules += rx_fifo |
| 35 | + self.comb += [ |
| 36 | + Record.connect(phy.source, rx_fifo.sink), |
| 37 | + self._rxempty.status.eq(~rx_fifo.source.stb), |
| 38 | + self._rxtx.w.eq(rx_fifo.source.data), |
| 39 | + rx_fifo.source.ack.eq(self.ev.rx.clear) |
| 40 | + ] |
| 41 | + |
28 | 42 | self.comb += [
|
29 |
| - self.ev.tx.trigger.eq(phy.sink.stb & phy.sink.ack), |
30 |
| - self.ev.rx.trigger.eq(phy.source.stb & phy.source.ack), |
31 |
| - phy.source.ack.eq(~self.ev.rx.pending) |
| 43 | + # Generate TX IRQ when tx_fifo becomes empty |
| 44 | + self.ev.tx.trigger.eq(tx_fifo.source.stb), |
| 45 | + # Generate RX IRQ when rx_fifo becomes non-empty |
| 46 | + self.ev.rx.trigger.eq(~rx_fifo.source.stb), |
32 | 47 | ]
|
0 commit comments