You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
from nmigen import Signal, Elaboratable, Module
|
|
from nmigen.back import verilog
|
|
from nmigen.lib.fifo import SyncFIFOBuffered
|
|
from nmigen_soc.wishbone import Interface as WishboneInterface
|
|
|
|
from .vuart import VUart
|
|
|
|
|
|
class VUartJoined(Elaboratable):
|
|
"""
|
|
Two Virtual UARTs connected together via a FIFO. Presents two 16550
|
|
style interfaces over two wishbone slaves
|
|
|
|
Parameters
|
|
----------
|
|
|
|
Attributes
|
|
----------
|
|
"""
|
|
def __init__(self, depth=8):
|
|
self.depth = depth
|
|
|
|
self.irq_a = Signal()
|
|
self.wb_a = WishboneInterface(data_width=8, addr_width=3)
|
|
|
|
self.irq_b = Signal()
|
|
self.wb_b = WishboneInterface(data_width=8, addr_width=3)
|
|
|
|
def elaborate(self, platform):
|
|
m = Module()
|
|
|
|
m.submodules.fifo_a = fifo_a = SyncFIFOBuffered(width=8, depth=self.depth)
|
|
m.submodules.fifo_b = fifo_b = SyncFIFOBuffered(width=8, depth=self.depth)
|
|
m.submodules.vuart_a = vuart_a = VUart()
|
|
m.submodules.vuart_b = vuart_b = VUart()
|
|
|
|
m.d.comb += [
|
|
fifo_a.w_data.eq(vuart_a.w_data),
|
|
vuart_a.w_rdy.eq(fifo_a.w_rdy),
|
|
fifo_a.w_en.eq(vuart_a.w_en),
|
|
vuart_a.r_data.eq(fifo_b.r_data),
|
|
vuart_a.r_rdy.eq(fifo_b.r_rdy),
|
|
fifo_b.r_en.eq(vuart_a.r_en),
|
|
|
|
fifo_b.w_data.eq(vuart_b.w_data),
|
|
vuart_b.w_rdy.eq(fifo_b.w_rdy),
|
|
fifo_b.w_en.eq(vuart_b.w_en),
|
|
vuart_b.r_data.eq(fifo_a.r_data),
|
|
vuart_b.r_rdy.eq(fifo_a.r_rdy),
|
|
fifo_a.r_en.eq(vuart_b.r_en),
|
|
|
|
self.irq_a.eq(vuart_a.irq),
|
|
self.irq_b.eq(vuart_b.irq),
|
|
|
|
self.wb_a.connect(vuart_a.wb),
|
|
self.wb_b.connect(vuart_b.wb),
|
|
]
|
|
|
|
return m
|
|
|
|
|
|
if __name__ == "__main__":
|
|
top = VUartJoined()
|
|
with open("vuart_joined.v", "w") as f:
|
|
f.write(verilog.convert(top))
|