Skip to content

Commit 6664af7

Browse files
author
Sebastien Bourdeauducq
committedDec 17, 2011
uart: new design using FHDL and bank (TX only, incomplete)
1 parent bb21f75 commit 6664af7

File tree

5 files changed

+52
-332
lines changed

5 files changed

+52
-332
lines changed
 

‎build.py

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def add_core_files(d, files):
1717
"lm32_interrupt.v", "lm32_ram.v", "lm32_dp_ram.v", "lm32_icache.v",
1818
"lm32_dcache.v", "lm32_top.v", "lm32_debug.v", "lm32_jtag.v", "jtag_cores.v",
1919
"jtag_tap_spartan6.v"])
20-
add_core_dir("uart")
2120

2221
os.system("rm -rf build/*")
2322
os.chdir("build")

‎milkymist/uart/__init__.py

+51-23
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,56 @@
1+
from functools import partial
2+
13
from migen.fhdl.structure import *
2-
from migen.bus import csr
4+
from migen.bank.description import *
5+
from migen.bank import csrgen
36

47
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
2627

2728
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})

‎top.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def get():
2121
register=True,
2222
offset=1)
2323
uart0 = uart.Inst(0, clk_freq, baud=115200)
24-
csrcon0 = csr.Interconnect(wishbone2csr0.csr, [uart0.bus])
24+
csrcon0 = csr.Interconnect(wishbone2csr0.csr, [uart0.bank.interface])
2525

2626
frag = autofragment.from_local()
2727
vns = convtools.Namespace()

‎verilog/uart/uart.v

-142
This file was deleted.

‎verilog/uart/uart_transceiver.v

-165
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.