UART 사용 (print 디버깅을 목표로)

9715 단어 FPGAPython3Polyphony
발이면 gdb 등의 디버거도 사용한다. 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진수 숫자를 표시하기에 머무른다.

좋은 웹페이지 즐겨찾기