Skip to content

Commit 3fdf0dd

Browse files
committed
Uart Library is added in both types and thread.
1 parent 0318d5e commit 3fdf0dd

File tree

4 files changed

+266
-183
lines changed

4 files changed

+266
-183
lines changed

examples/thread_uart_nexys4/thread_uart_nexys4.py

Lines changed: 8 additions & 181 deletions
Original file line numberDiff line numberDiff line change
@@ -12,179 +12,6 @@
1212
import veriloggen.thread as vthread
1313

1414

15-
class UartTx(Submodule):
16-
__intrinsics__ = ('send', )
17-
18-
def __init__(self, m, name, prefix, clk, rst, txd=None,
19-
arg_params=None, arg_ports=None,
20-
as_io=None, as_wire=None,
21-
baudrate=19200, clockfreq=100 * 1000 * 1000):
22-
23-
if arg_ports is None:
24-
arg_ports = []
25-
26-
arg_ports.insert(0, ('CLK', clk))
27-
arg_ports.insert(1, ('RST', rst))
28-
29-
if txd is not None:
30-
arg_ports.insert(2, ('txd', txd))
31-
32-
moddef = mkUartTx(baudrate, clockfreq)
33-
34-
Submodule.__init__(self, m, moddef, name, prefix,
35-
arg_params=arg_params, arg_ports=arg_ports,
36-
as_io=as_io, as_wire=as_wire)
37-
38-
self.tx_din = self['din']
39-
self.tx_enable = self['enable']
40-
self.tx_enable.initval = 0
41-
self.tx_ready = self['ready']
42-
43-
def send(self, fsm, value):
44-
fsm(
45-
self.tx_din(value),
46-
self.tx_enable(1)
47-
)
48-
fsm.goto_next()
49-
fsm(
50-
self.tx_enable(0)
51-
)
52-
fsm.goto_next()
53-
fsm.If(self.tx_ready).goto_next()
54-
55-
56-
def mkUartTx(baudrate=19200, clockfreq=100 * 1000 * 1000):
57-
m = Module("UartTx")
58-
waitnum = int(clockfreq / baudrate)
59-
60-
clk = m.Input('CLK')
61-
rst = m.Input('RST')
62-
63-
din = m.Input('din', 8)
64-
enable = m.Input('enable')
65-
ready = m.OutputReg('ready', initval=1)
66-
txd = m.OutputReg('txd', initval=1)
67-
68-
fsm = FSM(m, 'fsm', clk, rst)
69-
70-
mem = m.TmpReg(9, initval=0)
71-
waitcount = m.TmpReg(int(math.log(waitnum, 2)) + 1, initval=0)
72-
73-
fsm(
74-
waitcount(waitnum - 1),
75-
txd(1),
76-
mem(Cat(din, Int(0, 1)))
77-
)
78-
79-
fsm.If(enable)(
80-
ready(0)
81-
)
82-
83-
fsm.Then().goto_next()
84-
85-
for i in range(10):
86-
fsm.If(waitcount > 0)(
87-
waitcount.dec()
88-
).Else(
89-
txd(mem[0]),
90-
mem(Cat(Int(1, 1), mem[1:9])),
91-
waitcount(waitnum - 1)
92-
)
93-
fsm.Then().goto_next()
94-
95-
fsm(
96-
ready(1)
97-
)
98-
99-
fsm.goto_init()
100-
101-
fsm.make_always()
102-
103-
return m
104-
105-
106-
class UartRx(Submodule):
107-
__intrinsics__ = ('recv', )
108-
109-
def __init__(self, m, name, prefix, clk, rst, rxd=None,
110-
arg_params=None, arg_ports=None,
111-
as_io=None, as_wire=None,
112-
baudrate=19200, clockfreq=100 * 1000 * 1000):
113-
114-
if arg_ports is None:
115-
arg_ports = []
116-
117-
arg_ports.insert(0, ('CLK', clk))
118-
arg_ports.insert(1, ('RST', rst))
119-
120-
if rxd is not None:
121-
arg_ports.insert(2, ('rxd', rxd))
122-
123-
moddef = mkUartRx(baudrate, clockfreq)
124-
Submodule.__init__(self, m, moddef, name, prefix,
125-
arg_params=arg_params, arg_ports=arg_ports,
126-
as_io=as_io, as_wire=as_wire)
127-
128-
self.rx_dout = self['dout']
129-
self.rx_valid = self['valid']
130-
131-
def recv(self, fsm):
132-
ret = fsm.m.TmpReg(self.rx_dout.width)
133-
fsm.If(self.rx_valid)(
134-
ret(self.rx_dout)
135-
)
136-
fsm.Then().goto_next()
137-
return ret
138-
139-
140-
def mkUartRx(baudrate=19200, clockfreq=100 * 1000 * 1000):
141-
m = Module("UartRx")
142-
waitnum = int(clockfreq / baudrate)
143-
144-
clk = m.Input('CLK')
145-
rst = m.Input('RST')
146-
147-
rxd = m.Input('rxd')
148-
dout = m.OutputReg('dout', 8, initval=0)
149-
valid = m.OutputReg('valid', initval=0)
150-
151-
fsm = FSM(m, 'fsm', clk, rst)
152-
153-
mem = m.TmpReg(9, initval=0)
154-
waitcount = m.TmpReg(int(math.log(waitnum, 2)) + 1, initval=0)
155-
156-
fsm(
157-
valid(0),
158-
waitcount(int(waitnum / 2) - 1),
159-
mem(Cat(rxd, mem[1:9]))
160-
)
161-
162-
fsm.If(rxd == 0).goto_next()
163-
164-
for i in range(10):
165-
if i == 0: # check the start bit again
166-
fsm.If(Ands(waitcount == 1, rxd != 0)).goto_init()
167-
168-
fsm.If(waitcount > 0)(
169-
waitcount.dec()
170-
).Else(
171-
mem(Cat(rxd, mem[1:9])),
172-
waitcount(waitnum - 1)
173-
)
174-
fsm.Then().goto_next()
175-
176-
fsm(
177-
valid(1),
178-
dout(mem[0:9])
179-
)
180-
181-
fsm.goto_init()
182-
183-
fsm.make_always()
184-
185-
return m
186-
187-
18815
def mkTop(clk_name='clk', rst_name='btnCpuReset'):
18916
m = Module('top')
19017
clk = m.Input(clk_name)
@@ -227,10 +54,10 @@ def mkLed(baudrate=19200, clockfreq=100 * 1000 * 1000):
22754
led = m.OutputReg('led', 16, initval=0)
22855
tx = m.Output('utx')
22956
rx = m.Input('urx')
230-
uart_tx = UartTx(m, 'inst_tx', 'tx_', clk, rst, tx,
231-
baudrate=baudrate, clockfreq=clockfreq)
232-
uart_rx = UartRx(m, 'inst_rx', 'rx_', clk, rst, rx,
233-
baudrate=baudrate, clockfreq=clockfreq)
57+
uart_tx = vthread.UartTx(m, 'inst_tx', 'tx_', clk, rst, tx,
58+
baudrate=baudrate, clockfreq=clockfreq)
59+
uart_rx = vthread.UartRx(m, 'inst_rx', 'rx_', clk, rst, rx,
60+
baudrate=baudrate, clockfreq=clockfreq)
23461

23562
def blink():
23663
while True:
@@ -258,10 +85,10 @@ def mkTest(baudrate=19200, clockfreq=19200 * 10):
25885
rx = uut['urx']
25986
sw = uut['sw']
26087

261-
uart_tx = UartTx(m, 'inst_tx', 'tx_', clk, rst, as_wire='txd',
262-
baudrate=baudrate, clockfreq=clockfreq)
263-
uart_rx = UartRx(m, 'inst_rx', 'rx_', clk, rst, as_wire='rxd',
264-
baudrate=baudrate, clockfreq=clockfreq)
88+
uart_tx = vthread.UartTx(m, 'inst_tx', 'tx_', clk, rst, as_wire='txd',
89+
baudrate=baudrate, clockfreq=clockfreq)
90+
uart_rx = vthread.UartRx(m, 'inst_rx', 'rx_', clk, rst, as_wire='rxd',
91+
baudrate=baudrate, clockfreq=clockfreq)
26592

26693
txd = uart_tx['txd']
26794
rxd = uart_rx['rxd']

veriloggen/thread/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import absolute_import
22
from __future__ import print_function
33

4-
from .thread import Thread, reset
4+
from .thread import reset, Thread
55
from .pool import ThreadPool
6-
from .ttypes import Mutex, Lock, Barrier, Shared, RAM, FIFO, AXIM, AXIS, AXIMLite, AXISLite, AXISLiteRegister, AXISRegister
76
from .stream import Stream
7+
from .ttypes import *

veriloggen/thread/ttypes.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import veriloggen.types.ram as ram
88
import veriloggen.types.fifo as fifo
99
import veriloggen.types.axi as axi
10+
import veriloggen.types.uart as uart
1011
import veriloggen.types.util as util
1112
from veriloggen.seq.seq import Seq
1213
from veriloggen.fsm.fsm import FSM
@@ -928,3 +929,79 @@ def AXISLiteRegister(m, name, clk, rst, datawidth=32, addrwidth=32,
928929

929930
return AXISRegister(m, name, clk, rst, datawidth=datawidth, addrwidth=addrwidth,
930931
lite=True, noio=noio, length=length)
932+
933+
934+
class UartTx(uart.UartTx):
935+
__intrinsics__ = ('send',
936+
'lock', 'try_lock', 'unlock')
937+
938+
def __init__(self, m, name, prefix, clk, rst, txd=None,
939+
arg_params=None, arg_ports=None,
940+
as_io=None, as_wire=None,
941+
baudrate=19200, clockfreq=100 * 1000 * 1000):
942+
943+
uart.UartTx.__init__(self, m, name, prefix, clk, rst, txd=txd,
944+
arg_params=arg_params, arg_ports=arg_ports,
945+
as_io=as_io, as_wire=as_wire,
946+
baudrate=baudrate, clockfreq=clockfreq)
947+
948+
self.mutex = None
949+
950+
def lock(self, fsm):
951+
if self.mutex is None:
952+
self.mutex = Mutex(self.m, '_'.join(
953+
['', self.name, 'mutex']), self.clk, self.rst)
954+
955+
return self.mutex.lock(fsm)
956+
957+
def try_lock(self, fsm):
958+
if self.mutex is None:
959+
self.mutex = Mutex(self.m, '_'.join(
960+
['', self.name, 'mutex']), self.clk, self.rst)
961+
962+
return self.mutex.try_lock(fsm)
963+
964+
def unlock(self, fsm):
965+
if self.mutex is None:
966+
self.mutex = Mutex(self.m, '_'.join(
967+
['', self.name, 'mutex']), self.clk, self.rst)
968+
969+
return self.mutex.unlock(fsm)
970+
971+
972+
class UartRx(uart.UartRx):
973+
__intrinsics__ = ('recv',
974+
'lock', 'try_lock', 'unlock')
975+
976+
def __init__(self, m, name, prefix, clk, rst, rxd=None,
977+
arg_params=None, arg_ports=None,
978+
as_io=None, as_wire=None,
979+
baudrate=19200, clockfreq=100 * 1000 * 1000):
980+
981+
uart.UartRx.__init__(self, m, name, prefix, clk, rst, rxd=rxd,
982+
arg_params=arg_params, arg_ports=arg_ports,
983+
as_io=as_io, as_wire=as_wire,
984+
baudrate=baudrate, clockfreq=clockfreq)
985+
986+
self.mutex = None
987+
988+
def lock(self, fsm):
989+
if self.mutex is None:
990+
self.mutex = Mutex(self.m, '_'.join(
991+
['', self.name, 'mutex']), self.clk, self.rst)
992+
993+
return self.mutex.lock(fsm)
994+
995+
def try_lock(self, fsm):
996+
if self.mutex is None:
997+
self.mutex = Mutex(self.m, '_'.join(
998+
['', self.name, 'mutex']), self.clk, self.rst)
999+
1000+
return self.mutex.try_lock(fsm)
1001+
1002+
def unlock(self, fsm):
1003+
if self.mutex is None:
1004+
self.mutex = Mutex(self.m, '_'.join(
1005+
['', self.name, 'mutex']), self.clk, self.rst)
1006+
1007+
return self.mutex.unlock(fsm)

0 commit comments

Comments
 (0)