|
| 1 | +from functools import partial |
| 2 | + |
1 | 3 | from migen.fhdl.structure import *
|
2 |
| -from migen.bus import csr |
| 4 | +from migen.bank.description import * |
| 5 | +from migen.bank import csrgen |
3 | 6 |
|
4 | 7 | class Inst:
|
5 |
| - def __init__(self, csr_addr, clk_freq, baud=115200, break_en_default=Constant(0)): |
6 |
| - self.bus = csr.Slave("uart") |
7 |
| - declare_signal(self, "tx") |
8 |
| - declare_signal(self, "rx") |
9 |
| - declare_signal(self, "irq") |
10 |
| - declare_signal(self, "brk") |
11 |
| - self._inst = Instance("uart", |
12 |
| - [("csr_do", self.bus.d_o), |
13 |
| - ("uart_tx", self.tx), |
14 |
| - ("irq", self.irq), |
15 |
| - ("break", self.brk)], |
16 |
| - [("csr_a", self.bus.a_i), |
17 |
| - ("csr_we", self.bus.we_i), |
18 |
| - ("csr_di", self.bus.d_i), |
19 |
| - ("uart_rx", self.rx)], |
20 |
| - [("csr_addr", Constant(csr_addr, BV(5))), |
21 |
| - ("clk_freq", clk_freq), |
22 |
| - ("baud", baud), |
23 |
| - ("break_en_default", break_en_default)], |
24 |
| - "sys_clk", |
25 |
| - "sys_rst") |
| 8 | + def __init__(self, address, clk_freq, baud=115200): |
| 9 | + self._rxtx = rxtx = Register("rxtx", BV(8)) |
| 10 | + divisor = Register("divisor") |
| 11 | + self._f_divisor = Field(divisor, "divisor", 8) # TODO: 16 |
| 12 | + stat = Register("stat") # TODO: autogenerated event manager |
| 13 | + self._f_thre = Field(stat, "thre", access_bus=READ_ONLY, access_dev=WRITE_ONLY) |
| 14 | + |
| 15 | + self.bank = csrgen.Bank([rxtx, divisor, stat], address=address) |
| 16 | + d = partial(declare_signal, self) |
| 17 | + d("tx", reset=1) |
| 18 | + d("rx") |
| 19 | + |
| 20 | + d("_enable16") |
| 21 | + d("_enable16_counter", BV(16)) |
| 22 | + d("_tx_reg", BV(8)) |
| 23 | + d("_tx_bitcount", BV(4)) |
| 24 | + d("_tx_count16", BV(4)) |
| 25 | + d("_tx_busy") |
| 26 | + self.divisor = int(clk_freq/baud/16); # TODO |
26 | 27 |
|
27 | 28 | def get_fragment(self):
|
28 |
| - return Fragment(instances=[self._inst], pads={self.tx, self.rx}) |
| 29 | + comb = [self._enable16.eq(self._enable16_counter == Constant(0, BV(16)))] |
| 30 | + sync = [self._enable16_counter.eq(self._enable16_counter - 1), |
| 31 | + If(self._enable16, self._enable16_counter.eq(self.divisor - 1))] # TODO |
| 32 | + |
| 33 | + sync += [If(self._rxtx.dev_re, |
| 34 | + self._tx_reg.eq(self._rxtx.dev_r), |
| 35 | + self._tx_bitcount.eq(0), |
| 36 | + self._tx_count16.eq(1), |
| 37 | + self._tx_busy.eq(1), |
| 38 | + self.tx.eq(0) |
| 39 | + ).Elif(self._enable16 & self._tx_busy, |
| 40 | + self._tx_count16.eq(self._tx_count16 + 1), |
| 41 | + If(self._tx_count16 == Constant(0, BV(4)), |
| 42 | + self._tx_bitcount.eq(self._tx_bitcount + 1), |
| 43 | + If(self._tx_bitcount == 8, |
| 44 | + self.tx.eq(1) |
| 45 | + ).Elif(self._tx_bitcount == 9, |
| 46 | + self.tx.eq(1), |
| 47 | + self._tx_busy.eq(0) |
| 48 | + ).Else( |
| 49 | + self.tx.eq(self._tx_reg[0]), |
| 50 | + self._tx_reg.eq(Cat(self._tx_reg[1:], 0)) |
| 51 | + ) |
| 52 | + ) |
| 53 | + )] |
| 54 | + |
| 55 | + comb += [self._f_thre.dev_we.eq(1), self._f_thre.dev_w.eq(~self._tx_busy)] |
| 56 | + return self.bank.get_fragment() + Fragment(comb, sync, pads={self.tx, self.rx}) |
0 commit comments