w03
Transkrypt
w03
Elementy języka VHDL
obiekty
typy danych
atrybuty
pakiety i biblioteki
instrukcje współbieżne
instrukcje sekwencyjne
PUE-w3
1
Obiekty (sygnały, zmienne, stałe, pliki)
Obiekty służą do zapisu i pamiętania danych
Sygnały (wejściowe, wejściowe i wewnętrzne) - są funkcjami czasu
-- przykłady deklaracji sygnałów:
signal zegar : bit; -- domyslna wartosc pocz. '0'
signal reset : bit := '1';
-- inicjalizacja '1'
signal x : integer; -- domyslna w.p. -2147483647
signal alfa : integer range 0 to 255;
signal mi : bit_vector(9 downto 0):= (others => '1')
-- operator => oznacza przyporzadkowanie
-- (w.pocz. wszystkich elem. wektora bedzie '1')
PUE-w3
2
Obiekty (sygnały, zmienne, stałe, pliki)
Zmienne • nie są funkcjami czasu
• stosuje się tylko w obrębie procesu lub podprogramu
• wartość uzyskują w wyniku przypisania := (natychmiastowo)
variable u :
integer range 0 to 127 := 5;
variable xx:
integer range 500 downto 5 := 100;
PUE-w3
3
Obiekty (sygnały, zmienne, stałe, pliki)
constant Ucc
:
bit
:= '1';
constant tuzin
:
integer
:= 12;
constant Vec : bit_vector(7 downto 0) := "10101001";
file mplik : text [open write_mode] is "dane.dat"
-- nawiasy [
] oznaczają opcjonalność
-- tryby: read_mode, write_mode, append_mode
PUE-w3
4
Typy danych: skalarne, złożone, wektorowo-skalarne
Podstawowe typy danych są zdefiniowane w tzw. pakietach
standardowych (plikach), objętych normą IEEE Std 1164-1993
i dalszych (IEEE Std 1076-2001, ...)
Dla każdego typu istnieją ściśle określone operatory (...)
Są trzy rodzaje typów skalarnych: numeryczne (integer,
std_logic,...) wyliczeniowe i fizyczne (time)
Można tworzyć podtypy zawężając zakres wartości typu bazowego.
Istnieją również podtypy standardowe, np.:
subtype natural is integer range 0 to 2147483647
PUE-w3
5
Typy danych: skalarne, złożone, wektorowo-skalarne
Liczby całkowite:
integer
(-231-1 to 231-1)
(liczby rzeczywiste):
real
( -1.0E+38 to 1.0E+38)
Typ bitowy :
bit
('0', '1')
Typ boolowski:
boolean
Typ znakowy:
character
(false, true)
(..,'0','1',..'A','B',..'a','b',...)
Typ fizyczny czasowy:
time
(0 to 2147483647) jednostek (fs,ps,ns,us,ms,sec,min,hr)
Typy wyliczeniowe, np.:
type kolory is (niebieski, zielony, czerwony);
PUE-w3
6
Tworzenie własnych podtypów (zalecane!)
subtype bajtowy is integer range 0 to 255;
subtype mlitery is character range 'a' to 'z';
subtype cyfry is character range '0' to '9';
type zakres256 is range 0 to 255; -- typ liczbowy
type dekada is
range 0 to 9; -- inny typ liczbowy
subtype dekada is zakres256 range 0 to 9;
• zawężanie zakresu zwiększa efektywność obliczeń i redukuje
złożoność logiczną projektu
• operacje można przeprowadzać tylko na danych tego samego typu !
PUE-w3
7
Wielowartościowy, niejednoznaczny typ std_ulogic
type std_ulogic is (
'U', -- stan niezainicjowany
'X', -- wymusza stan nieznany
'0', -- wymusza stan 0
'1', -- wymusza stan 1
'Z', -- stan wysokiej impedancji
'W', -- słaby stan nieznany (odczyt)
'L', -- słabe 0 (odczyt z R do masy)
'H', -- słabe 1 (odczyt Ucc przez R)
'-'); -- stan dowolny (don't care)
•"metalogiczne" wartości 'U','X','W','-' służą do opisu modelu
podczas symulacji, a nie realnego układu
• gdy przewód jest sterowany różnymi wartościami to wynik nie jest
określony (unresolved)
PUE-w3
8
Funkcja rozdzielcza resolved i typ std_logic
funkcja resolved posługuje się poniższą tablicą "rozstrzygajacą":
constant resolution_table : stdlogic_table := (
-- U
X
0
1
Z
W
L
H
| |
---------------------------------------------------( 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'),--|U|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'),--|X|
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X'),--|0|
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X'),--|1|
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X'),--|Z|
( 'U', 'X', '0', '1', 'W', 'W', 'W', 'w', 'X'),--|W|
( 'U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X'),--|L|
( 'U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X'),--|H|
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'),--|-|
);
PUE-w3
9
Typy danych: skalarne, złożone, wektorowo-skalarne
Są to indeksowane zbiory elementów jednego typu (array) lub
różnych typów (record)
type slowo16 is array(0 to 15) of bit;
type memory16 is array(natural range <>) of slowo16;
-- typ o nieokreslonej pojemnosci (range <>);
-- zmienne tego typu musza ukonkretnic pojemnosc:
variable mem : memory16(0 to 2**n-1);
typy predefiniowane: string, bit_vector
signal a : bit_vector(0 to 3);
-- nie zalecane
signal b : bit_vector(3 downto 0); -- zalecane
PUE-w3
10
Typy danych: skalarne, złożone, wektorowo-skalarne
Aby umożliwić operacje arytmetyczne na wektorach o elementach typu
bit lub std_logic zdefiniowano typy signed oraz unsigned:
type signed is array (natural range <>) of std_logic;
--........
use ieee.numeric_std.all; -- klauzula odn. do pakietu
-- ....
variable s : unsigned(7 downto 0);
-- s moze miec wartosci od 255 do 0
PUE-w3
11
Atrybuty typów i obiektów
• atrybut związany jest z typem lub obiektem przez apostrof '
• 'event zwraca true gdy zmienił się związany sygnał
• 'right, 'left , 'high, 'low zwr. granice typu
type zakres is range 15 downto -5;
variable P : integer := zakres'left;
--P:=15
variable R : integer := zakres'right;
--R:=-5
variable S : integer := zakres'high;
--S:=15
variable T : integer := zakres'low;
--T:=-5
PUE-w3
12
Pakiety i biblioteki (1)
• Obiekty, podprogramy i modele do wielokrotnego wykorzystywania
umieszcza się w zbiorach zwanych pakietami (package). Są pakiety
standardowe (ujęte w normach IEEE) i tworzone indywidualnie
package moj_pakiet is
-- deklaracje stalych, typow, funkcji
end moj_pakiet
package body moj_pakiet is
-- cialo pakietu
end moj_pakiet
• Skompilowane pakiety i projekty są umieszczane w zbiorach
zwanych bibliotekami (library) . Biblioteki std, work są domyślnie
dostępne w każdym projekcie, korzystanie z innych wymaga klauzuli:
PUE-w3
13
Pakiety i biblioteki (2)
library nazwa_biblioteki;
use nazwa_biblioteki.nazwa_pakietu.nazwa_elementu;
-- lub:
use nazwa_biblioteki.nazwa_pakietu.all;
-- aby uzyc wielowartosciowych typow std_logic
-- nalezy na poczatku projektu dopisac:
library ieee;
use ieee.std_logic_1164.all;
PUE-w3
14
Instrukcje współbieżne
Instrukcje współbieżne w VHDL to:
• przypisanie do sygnału (<=)
• instrukcja procesu process
• instrukcja łączenia komponentów port map
• instrukcja powielania generate
• instrukcja blokowa block
• instrukcja współbieżnego wykonania procedury
Instrukcje współbieżne są wykonywane równocześnie (nie ma
znaczenia kolejność ich wypisania); odwzorowują działanie układów
cyfrowych o strukturze równoległej
PUE-w3
15
Przypisanie warunkowe współbieżne
entity mux2_1 is
port( a,b,s : in std_logic;
y : out std_logic);
end entity mux2_1;
when-else
a
b
s
mux2_1
y
architecture a1 of mux2_1 is
y <= a when s = '0' else b;
end architecture a1;
architecture a2 of mux2_1 is
y <= a when s = '0' else
b when s = '1' else 'X';
end architecture a2;
PUE-w3
16
Przypisanie współbieżne selektywne: with-select
entity mux8_4_1 is
port (a,b,c,d : in std_logic_vector(7 downto 0);
adr : in std_logic_vector(1 downto 0);
y : in std_logic_vector(7 downto 0));
end entity mux8_4_1;
architecture a1 of mux8_4_1 is
begin
with adr select
y <= a when "00",
b when "01",
c when "10",
d when "11",
"XXXXXXXX" when others;
end architecture a1;
PUE-w3
17
Instrukcje sekwencyjne
• odwzorowują działanie sekwencyjnych układów cyfrowych
• stosuje się do opisu procesów oraz procedur i funkcji
Lista instrukcji sekwencyjnych:
• przypisanie do zmiennej (:=)
• instrukcja warunkowa if-then-else,
• instrukcja wyboru case,
• instrukcja czekania wait
• instrukcja pętli loop, (oraz exit, next)
• instrukcja pusta null,
• instrukcja testowa assert
PUE-w3
18
Instrukcja czekania na zdarzenie: wait on
entity ffd is
D Q
port (D,C,R : in bit; Q : out bit);
C
R
end entity ffd;
architecture a2 of ffd is
begin
process
-- nie ma listy wrazliwosci !
begin
wait on (R,C); --czekaj na zmiane R,C
if R = '1' then Q <= '0';
elsif (C'event and C='1')
then Q <=D;
end if;
end process;
end architecture a2;
PUE-w3
19
Instrukcja czekania wait for
wait for 25 ns ;
-- czekaj przez 25ns
wait on a for 250 ns ;
-- czekaj na zmiane a przez 250 ns
wait on b = '0' for 150 ns;
-- czekaj na spełnienie war. B = '0' przez 150 ns
wait on a until d = '1' for 66 ns;
-- czekaj na a dopóki nie spełni się
-- d = '1' , przez 66 ns
warunek
Proces bez listy wrażliwości wykonuje się od początku (begin)
do instrukcji wait , zatrzymuje do spełnienia warunku, po czym
wykonuje do end process a następnie rozpoczyna od nowa.
PUE-w3
20
Instrukcja warunkowa (sekwencyjna): if-then-else
entity ffT is
port (T,C,R : in bit; Q out bit);
T Q
end entity ffT;
C
R
architecture a1 of ffT is
begin
process (C,R);
-- lista wrazliwosci
variable tq; -- zmienna lokalna
begin
-- poczatek procesu
if R = '1' then tq := '0'; -- zerowanie
elsif C'event and C = '1' and T = '1'
then tq := not tq;
-- zmiana stanu
Q <= tq;
-- przypisanie do sygn. wyj.
end process;
end architecture a1;
( w procesie nie można stosować when - else !)
PUE-w3
21
Instrukcja pętli: loop
-- petla wykonujaca sie okreslona ilosc razy:
petla1: for i in 0 to A'length -1 loop
B(i) <= not A(i);
end loop petla1;
-- wykonanie zalezne od warunku (flaga)
process
begin
while flaga loop
zegar <= not zegar;
-- zegar dziala
wait for okres_zegara/2; -- typ time
end loop;
end process;
PUE-w3
22
Instrukcje sekwencyjne: exit, next, null, assert
exit [etykieta_petli] [when warunek];
if warunek then exit;
end if;
-- wyjscie z petli
next [etykieta_petli][when warunek];
-- przejscie do nastepnej iteracji w petli
null; -- nie wykonuje sie zadne dzialanie
-- poza przejsciem do nastepnej instrukcji
-- do sprawdzania poprawnosci i alarmowania
assert (t_setup < 2 ns)
report "Za krotki czas ustalania !"
severity Warning; --lub: Failure, Error, Note
PUE-w3
23