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

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=32, addr_width=3, granularity=8)
self.irq_b = Signal()
self.wb_b = WishboneInterface(data_width=8, addr_width=3, granularity=8)
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))