V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!

ABEL-HDL

Z Multimediaexpo.cz

ABEL-HDL (neboli ABEL Hardware Description Language) je programovací jazyk pro programování logických polí používaný firmou Lattice Semiconductor Corporation. Zdrojové soubory jsou tvořeny textovými soubory kódovanými ve formátu ASCII.

Obsah

Základní popis jazyka ABEL-HDL

ABEL - HDL se používá stejně jako ostatní hdl jazyky k programování logických polí. Programování v hdl jazycích je mnohem rychlejší a jednodušší než programování v asembleru. Práce nimi se v mnoha aspektech zásadně liší od programovacích jazyků pro počítače. Tento jazyk umožňuje zapsání kódu pomocí pravdivostních tabulek, stavových diagramů nebo logických rovnic. Jazyk rozlišuje velká a malá písmena v proměnných, ale nikoliv u klíčových slov.

Základní syntaxe jazyka ABEL-HDL

Zdrojové kódy mohou být psány v libovolném editoru umožňující export do ASCII formátu. Každá řádka může mít max. 150 znaků. Na konec řádku se standardně umísťuje středník.

  • // – na začátku řádky označují komentář
  • ' – apostrofy uvozují řetězce string
  • ^b, ^o, ^d, ^h, – na začátku čísla označuje použitou soustavu (tj. binární, osmičková, desítková, šestnáctková); pokud není uvedeno nic, použije se desítková soustava
  • { } – začátek a konec bloku

Typy proměnných

Proměnné v makrech, modulech a příkazech jsou označovány jako argumenty konstrukcí, které je používají. V ABEL-HDL existují dva typy argumentů: Actual argument a Dummy argument.

  • Dummy argument: slouží k rezervaci paměti pro proměnné a všechny identifikátory těchto proměnných musí začínat otazníkem. Před kontrolou syntaxe a logiky jsou nahrazeny Actual argumenty.
  • Actual argument: je použitá proměnná. Jako Actual argument může být použit jakýkoli text včetně identifikátorů, čísel, operátorů nebo množin. Actual argumenty jsou nahrazeny přesně jak se objeví. To znamená, že jsou započítány do výrazu včetně mezer.

Typy operátorů

Operátory jsou rozděleny do čtyř základních tříd: logické, aritmetické, relační a přiřazovací.

Logické operátory
se používají zejména ve výrazech. Logické operace se provádějí bit po bitu.
Tabulka logických operátorů
Operátor Popis
 ! NOT, neboli jedničkový doplněk
& AND, logický součin
# OR, logický součet
$ XOR, exclusive OR
 !$ XNOR, exclusive NOR
Aritmetické operátory
řídí aritmetické vztahy mezi prvky ve výrazech. Jsou zde zastoupeny i bitové posuny, protože jsou ekvivalentní násobení popř. dělení 2.
Tabulka aritmetických operátorů
Operátor Popis Příklad
- Dvojkový doplněk, !A+1 -A
- Odčítání A-B
+ Sčítání A+B
Nedostupné pro množiny:
* Násobení A*B
/ Neznaménkové celočíselné dělení A/B
 % Zbytek po dělení A%B
<< Posun doleva o B bitů A<<B
>> Posun doprava o B bitů A>>B
Relační operátory
se používají k porovnávání dvou prvků ve výrazu. Výsledkem porovnávání je proměnná true nebo false typu boolean. Všechny relační operace jsou bez znaménka.
Tabulka relačních operátorů
Operátor Popis Operátor Popis
== Rovnost  != Nerovnost
< Menší než > Větší než
<=<code> Menší nebo rovno >= Větší nebo rovno
Operátory přiřazení
se používají zejména v rovnicích. Rovnice přiřazují hodnotu výrazu k signálu výstupu. Existují dva způsoby přiřazení, kombinační a registrový. Kombinační přiřazení způsobí zobrazení dat na výstupu okamžitě, jakmile je rovnice vyhodnocena. Registrové přiřazení se projeví až při následujícím hodinovém pulsu.
Tabulka operátorů přiřazení
Operátor Set Popis
= ON(1) Kombinační (okamžité) přiřazení
 := ON(1) Implicitní registrové přiřazení
 ?= DC(X) Kombinační (okamžité) přiřazení
 ?:= DC(X) Implicitní registrové přiřazení

Komunikace s ostatními logickými prvky

Pro komunikaci s ostatními logickými obvody existují speciální konstanty, jejich seznam je v Tabulce speciálních konstant.

Tabulka speciálních konstant
Konstanta Význam
.C. Hodinový vstup; nízká-vysoká-nízká úroveň
.D. Sestupná hodinová hrana
.F. Plovoucí vstupní nebo výstupní signál
.K. Hodinový vstup; vysoká-nízká-vysoká úroveň
.P. Reset registrů
.SVn. kde n = (2 .. 9) Řízený vstup 2V až 9V
.U. Vzestupná hodinová hrana
.X. Don't care stav
.Z. Třístavová logika (vysoká impedance)

Speciální konstanty musí být použity, jak je uvedeno, včetně teček.

Pole prvků

Tento jazyk obsahuje obdobu pole prvků, která je nazývána set. Jedná se o uspořádanou množinu (tj. záleží na pořadí). Pokud jsou čísla použita v přiřazení nebo v porovnávání se sety (množinami), tak jsou převedena do binární reprezentace a dále je použita booleovská algebra. Pokud je bitů více než prvků v množině, je binární číslo zaokrouhleno doleva. Pokud je bitů méně, je binární číslo zleva doplněno nulami.

Tabulka množinových operací
Operátor Popis Příklad
= kombinační přiřazení A = 5
 := registrové přiřazení A:=[1,0,1]
 ! NOT, jedničkový doplněk  !A
& Logický součin, AND A & B
# Logický součet, OR A # B
$ Exclusive OR, XOR A $ B
 !$ Exclusive NOR, XNOR A !$ B
- Negace -A
- Odčítání A-B
+ Sčítání A+B
== Rovná se A==B
 != Nerovná se A!=B
< Menší než A<B
> Větší než A>B
<code><= Menší nebo rovno A <= B
>= Větší nebo rovno A >= B

Základní struktura

Zdrojové kódy se mohou skládat z nezávislých modulů. Každý z těchto modulů obsahuje kompletní logický popis obvodu. Do jednoho zdrojového kódu může být umístěn neomezený počet modulů. Každý modul může mít pouze jednu hlavičku, ostatní sekce zdrojového kódu se mohou libovolně opakovat. Deklarace musí následovat hned za označením deklarací. Všechny identifikátory musí být deklarovány dříve, než jsou uvedeny v kódu.

Hlavičky

Hlavičkou začíná každý modul. Obsahuje označení modulu (module), dané rozhraní (interface) a záhlaví (title).

Module je povinné a je párováno s klíčovým slovem End. Označení modulu začíná klíčovým slovem Module za kterým následuje jeho název. Za označení modulu se neumisťuje středník. Může být třeba toto:

Module nejaky_nazev

Rozhraní je volitelná položka. Slouží u nižších modulů k označení signálů, které jsou pak použity ve vyšších modulech. Klíčové slovo je Interface.

Záhlaví začíná klíčovým slovem Title a za ním následuje string uvozený apostrofy. Pro funkci obvodu nemá žádný význam, slouží jen k popisu funkce modulu pro lepší přehlednost.

Title 'Tento kod slouzi jako ukazka uzivatelum wiki'

Deklarace

Deklarace deklaruje moduly a přiřazuje jména instancím funkčních bloků, pinům, uzlům, konstantám, makrům a množinám. Každý modul musí mít nejméně jednu deklarační sekci. Všechny deklarace mají platnost pouze v modulu, ve kterém jsou uvedeny. Deklarace zařízení může být použita jen jedna v celém bloku.

Deklarace klíčových slov začíná klíčovým slovem declarations. Takto definovaná klíčová slova mohou být použita v celém zdrojovém kódu.

Deklarace zařízení je volitelná. Pro daný modul definuje device_id se specifickým programovatelným zařízením. Zapisuje se identifikátorem programovatelného pole, který je následován klíčovým slovem Device.

device_id Device real_device;

Deklarace Interface je, na rozdíl od uvedení interface v hlavičce, povinná ve všech zdrojových kódech, kde je mechanizmus interface použit (tj. je povinná nejen v lower-level ale i v top-level modulech). V této sekci není možné použít přípony (dot extension).

// pro top-level modul: (tri tecky znamenaji moznost vice parametru)
low-level nazev_modulu Interface (inputs[=hodnoty] -> outputs :> bidirs ...)
//tato deklarace se pouziva ve spojeni s deklarací FUNCTIONAL_BLOCK pro kazdy konkretni modul

// pro lower-level modul:
Module nazev_modulu
Interface (input/set=value... -> output/set :> bidir/set)

Deklarace signálů znamená přiřazení použitých signálů k číslům pinů a nodů, popř. přiřadit i typ signálu. Piny a nody nemusí být přiřazeny k žádnému signálu, dokud není konkrétní program nahrán do obvodu.

Přiřazení pinů a nodů se provádí pomocí klíčových slov Pin a Node, detailněji je ukázano na příkladu.

Typ signálu se přiřazuje pomocí klíčového slova Istype, za kterým následují atributy pro ISTYPE.

V této sekci je možné použít přípony (dot extension).

//deklarace pinu, (zavorky [ a ] ohranicuji volitelne parametry)
[ ! ] oznaceni_pinu [, [ ! ] oznaceni_pinu...] Pin [pin# [, pin# ] ] [ISTYPE 'atributy']

//deklarace nodu
[ ! ] oznaceni_nodu [, [ ! ] oznaceni_nodu...] Node [node# [, node#] ] [ISTYPE 'atributy']

//prirazeni atributu
signal [, signal]... Istype 'atributy';

Deklarace konstant se provádí pomocí klíčového slova =. Za konstantu je považován identifikátor, který má konstantní hodnotu v modulu, kde je jako konstanta deklarován. Deklarace konstant musí být v sekci deklarací nebo za příkazem @Const.

//deklarace konstant
identifikator [, identifikator]... = vyraz [, vyraz]...;

Deklarace maker se provádí pomocí klíčového slova Macro. Používání maker umožňuje opakovaně používat již hotové bloky kódu.

//deklarace makra
oznaceni_makra Macro [(dummy_argument [, dummy_argument]...)] {blok_kodu};

Logický popis

Logický popis obsahuje vlastní funkci jednotlivých prvků. K popisu mohou být použity rovnice, pravdivostní tabulky, stavové diagramy, tavné pojistky (fuses) nebo XOR. V této sekci mohou být použity i tečkové přípony (dot extension). Funkční syntaxe je jméno signálu následováno tečkou a konkrétní příponou. Přípony jsou rozdělené do dvou hlavních skupin, na přípony nezávislé na použité architektuře a na přípony závislé na použítém zařízení.

// pouziti pripon (dot extension), za teckou nasleduje pozadovana pripona
muj_signal.ext

Popis pomocí rovnic se zapisuje užitím klíčového slova Equations, které definuje začátek bloku logických rovnic.

// zapis bloku rovnic
// prvni moznost:
Equations
[WHEN podminka THEN] [ ! ] prvek = vyraz;
[ELSE rovnice];

// druha moznost:
[WHEN podminka THEN] rovnice; [ELSE rovnice];
jmeno_instance LSC_jmeno_makra (definice_portu);

Pravdivostni tabulky se definují za klíčovým slovem Truth_table.

// pravdivostni tabulka
// prvni moznost:
Truth_table (vstupy -> vystupy)
vstupy -> vystupy;
...atd...

// druha moznost:
Truth_table (vstupy [:> registrove vystupy ][-> vystupy])

Stavové diagramy se zapisují pomocí klíčového slova State_diagram. Následuje přiřazení rovnic k výrazům.

// stavove diagramy:
State_diagram stavovy_registr
   [-> stavovy_vystup]
[STATE stavovy_vyraz: [rovnice]
                      [rovnice]
                      ...atd...
trans_stmt ...]

Deklarace pojistek (fuses) se provede pomocí klíčového slova Fuses.

// fuses:
Fuses
cislo_fuse = fuse value;

set_cisel_fuse = fuse value;

XOR faktory umožňují specifikovat přímo proměnné typu boolean a vkládat je jako argumenty do funkce XOR.

// XOR
XOR_factors
jmeno_signalu = xor_factors

Testovací vektory

Testovací vektory slouží k testování funkce a časování obvodu. Ke spolehlivému ověření, by měly pokrýt celý rozsah očekáváných operací. Kromě testovacích vektorů může tato sekce obsahovat ještě testovací skripty a sledovací příkazy (trace statement).

Testovací vektory definují výstupy jako funkci vstupů. Začínají klíčovým slovem Test_vectors, může následovat poznámka.

Test_vectors [konkretni_priklad]
  (inputs -> outputs)
  [invalues -> outvalues ;]

Sledovací příkazy definují, které vstupy a výstupy budou zobrazeny ve výstupu simulace. Začínají klíčovým slovem Trace za kterým následují definované vstupy a výstupy.

Trace (inputs -> outputs);

Ukončení

Každý modul musí být ukončen ukončovacím příkazem. Klíčové slovo End je následováno názvem modulu, který byl definován v hlavičce.

End nejaky_nazev

Literatura

  • ABEL-HDL Reference Manual, Version 8.0, Lattice Semiconductor Corporation

Související články