P2-012
← Všetky témyLogika a obvody · 16 / 18

MyHDL – popis hardvéru v Pythone

Poznámka

MyHDL umožňuje popísať digitálny obvod priamo v Pythone – namiesto kreslenia schémy (Logisim, Logisim Evolution) píšeš kód, ktorý sa následne simuluje alebo prevedie do jazyka Verilog/VHDL pre reálny hardvér (FPGA).

Inštalácia

pip3 install myhdl

Prvý obvod – hradlo AND

from myhdl import block, always_comb, Signal, bool_type

@block
def hradlo_and(a, b, vystup):
    @always_comb
    def logika():
        vystup.next = a and b
    return logika

Tip

Dekorátor @always_comb označuje kombinačnú logiku – blok sa prepočíta vždy, keď sa zmení niektorý zo vstupných signálov (podobne ako kombinačný obvod v Kombinačné obvody).

Simulácia obvodu

from myhdl import Signal, bool_type, instance, delay, now

def test_hradlo_and():
    a, b, vystup = [Signal(bool(0)) for _ in range(3)]
    obvod = hradlo_and(a, b, vystup)

    @instance
    def stimul():
        for hodnota_a in (0, 1):
            for hodnota_b in (0, 1):
                a.next = hodnota_a
                b.next = hodnota_b
                yield delay(10)
                print(f"a={a}, b={b} -> vystup={vystup} (čas={now()})")

    return obvod, stimul
from myhdl import Simulation

Simulation(test_hradlo_and()).run()

Sekvenčný obvod – D flip-flop

from myhdl import block, always

@block
def d_flip_flop(d, q, clk):
    @always(clk.posedge)              # reaguj len na nábežnú hranu hodín
    def logika():
        q.next = d
    return logika

Tip

clk.posedge zodpovedá presne tomu, čo si videl v Logisim simulátore (Sekvenčné obvody – klopné obvody) – výstup sa zmení iba pri nábežnej hrane hodinového signálu, nie okamžite.

Prevod do Verilogu

from myhdl import Signal, bool_type, toVerilog

a, b, vystup = [Signal(bool(0)) for _ in range(3)]
toVerilog(hradlo_and, a, b, vystup)    # vygeneruje súbor hradlo_and.v

Poznámka

Vygenerovaný Verilog kód je možné ďalej použiť na nahranie do reálneho hardvéru (FPGA) – pre potreby STEMlabu nám však väčšinou stačí simulácia priamo v Pythone.

Mini-úlohy – MyHDL

  1. Naprogramuj a odsimuluj hradlo OR rovnakým spôsobom ako hradlo AND vyššie.
  2. Uprav testovací stimul tak, aby vyskúšal všetky 4 kombinácie vstupov a výsledky porovnal s pravdivostnou tabuľkou hradla.
  3. Naprogramuj a odsimuluj D flip-flop – over, že výstup sa zmení len pri nábežnej hrane hodín, nie pri zmene vstupu D mimo hrany.
  4. Porovnaj výsledok rovnakého obvodu (napr. AND) postaveného v Logisim a popísaného v MyHDL – mali by sa správať identicky.

Cheat sheet – rýchla referencia

from myhdl import block, always_comb, always, Signal, instance, delay, Simulation

@block
def obvod(vstupy..., vystup):
    @always_comb              # kombinačná logika (bez pamäte)
    def logika():
        vystup.next = ...
    return logika

@always(clk.posedge)           # sekvenčná logika (reakcia na hranu hodín)
def logika():
    ...

Simulation(testovaci_obvod()).run()   # spusti simuláciu
toVerilog(obvod, ...)                  # vygeneruj Verilog kód
Postup sa ukladá iba v tomto prehliadači.
18 kapitol · vyhľadávanie aj v texte