UART 사용 (print 디버깅을 목표로)
고위 합성에서도 사용할 수 없습니까? Polyphony로 시도해 봅시다.
클럭 레벨이 필요한 실제 UART 전송 Transmitter는 Verilog에서 구현되며 Polyphony는 UART 모듈을 만듭니다. 이미지로서는 다음과 같은 그림이 된다.
Polyphony의 UART 모듈은 tx-que로 데이터를 수신하고 실제 UART의 처리는 Verilog-HDL로 작성한 UART Transmitter 모듈에 의뢰한다.
uart.py
import polyphony
from polyphony import is_worker_running
from polyphony.io import Port, Queue
from polyphony.typing import bit, uint8
from polyphony.timing import clksleep, clkfence, wait_value
@polyphony.module
class Transmitter:
def __init__(self):
self.tx_start = Port(bit, 'out', 0)
self.tx_data = Port(uint8, 'out', 0)
self.tx_busy = Port(bit, 'in')
self.tx_q = Queue(uint8, 'any')
self.append_worker(self.tx_worker)
#self.append_worker(self.func)
def tx_worker(self):
while is_worker_running():
data = self.tx_q.rd()
#for i in range(len(data)):
wait_value(0, self.tx_busy)
self.tx_start.wr(1)
self.tx_data.wr(data)
print(data)
clkfence()
self.tx_start.wr(0)
# def write(self, msg):
# for d in msg:
# self.tx_q.wr(d)
def write_hex16(self, v):
d = (v >> 8) & 0xff
self.tx_q.wr(d)
d = (v) & 0xff
self.tx_q.wr(d)
# def func(self):
# while is_worker_running():
# data = (0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x21)
# self.write(data)
@polyphony.testbench
def test(tx):
tx.tx_busy.wr(1)
tx.tx_busy.wr(0)
wait_value(1, tx.tx_start)
print(tx.tx_data.rd())
wait_value(1, tx.tx_start)
print(tx.tx_data.rd())
wait_value(1, tx.tx_start)
print(tx.tx_data.rd())
wait_value(1, tx.tx_start)
print(tx.tx_data.rd())
wait_value(1, tx.tx_start)
print(tx.tx_data.rd())
if __name__ == '__main__':
tx = Transmitter()
test(tx)
UART 소스는 fpga4fun.com에서 빌린다.
이것으로 어쨌든 UART 디버깅을 할 수 있게 된 것 같다. 이 소스에서는, 실제로 printf 적인 곳은 아직 어렵다. write_hex16 으로 16진수 숫자를 표시하기에 머무른다.
Reference
이 문제에 관하여(UART 사용 (print 디버깅을 목표로)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ryos36/items/e57b5fc1a7340c2a88fe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)