AHDL
AHDL (ang. Altera Hardware Description Language) to język opisu sprzętu (HDL), który został stworzony z myślą o programowaniu układów FPGA i CPLD produkcji firmy Altera.
Zastosowanie
Jest to język o niskim poziomie abstrakcji, który charakteryzuje się prostotą i jest głównie używany do projektowania niewielkich układów. AHDL jest również nauczany na wielu uczelniach wyższych jako wprowadzenie do bardziej zaawansowanych języków opisu sprzętu, takich jak VHDL i Verilog.
Charakterystyka języka
Język AHDL pozwala na podział projektu na mniejsze jednostki (subdesign), przy czym jedna z jednostek pełni funkcję nadrzędną, wykorzystując inne jednostki. Wejścia i wyjścia jednostki nadrzędnej są podłączane do pinów układu programowalnego. Każda jednostka może zawierać bramki logiczne, przerzutniki oraz inne mniejsze komponenty. Do budowy bloków kombinacyjnych zazwyczaj stosuje się instrukcje if, else, elsif, case, a także funkcje logiczne and, or, not; istnieje również możliwość korzystania z tablic funkcji. Aby stworzyć przerzutnik, konieczne jest ręczne zdefiniowanie elementu (najczęściej DFF lub DFFE) w bloku zmiennych jednostki oraz podłączenie sygnałów zegara i resetu. AHDL ułatwia tworzenie automatów dzięki strukturze machine of bits with states oraz tabelom przejść i wyjść.
Przykład
Poniżej przedstawiono kod prostego licznika rewersyjnego, który obsługuje synchroniczne, równoległe ładowanie oraz asynchroniczne zerowanie. Gdy sygnały clear i load są nieaktywne (wynoszą 1), a enable jest aktywne (wynosi 1), licznik zmienia swoją wartość o 1 w zależności od stanu sygnału updown.
title „counter”;
— definicja stałych
constant COUNT_UP=0;
constant COUNT_DOWN=1;
— definicja nazwy oraz opis wejść i wyjść licznika
subdesign counter
(
— aktualna wartość licznika
q[15..0]:output;
— wartość do załadowania do licznika
data[15..0]:input;
— sygnał ładowania (aktywny stanem niskim)
load:input;
— reset asynchroniczny (aktywny stanem niskim)
clear:input;
— sygnał zezwolenia na zliczanie (aktywny stanem wysokim)
enable:input;
— kierunek zliczania (stan niski dla zliczania w górę, stan wysoki dla zliczania w dół)
updown:input;
— zegar synchronizujący operacje (aktywny narastającym zboczem)
clock:input;
)
variable
— 16 przerzutników reprezentujących bieżący stan licznika
q[15..0]:DFF;
begin
— podłączenie zegara i resetu
q[].clk=clock;
q[].clrn=clear;
— operacja ładowania ma wyższy priorytet niż operacja zliczania
— dlatego sprawdzamy bit load przed innymi
if load==0 then
— załaduj wartość licznika wartością z wejścia data
q[]=data[];
elsif enable==1 then
— sprawdzamy, w którą stronę należy zliczać
if updown==COUNT_UP then
— zwiększ wartość licznika o 1
q[]=q[]+1;
else
— zmniejsz wartość licznika o 1
q[]=q[]-1;
end if;
else
— podtrzymaj wartość licznika (pozostawia go bez zmian)
— brak przypisania w tym miejscu skutkowałby wyzerowaniem licznika
q[]=q[];
end if;
end;