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 myhdlPrvý 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 logikaTip
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, stimulfrom 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 logikaTip
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.vPozná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
- Naprogramuj a odsimuluj hradlo OR rovnakým spôsobom ako hradlo AND vyššie.
- Uprav testovací stimul tak, aby vyskúšal všetky 4 kombinácie vstupov a výsledky porovnal s pravdivostnou tabuľkou hradla.
- 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.
- 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ódPostup sa ukladá iba v tomto prehliadači.