Języki Opisu Sprzętu
Wykład 5
III rok kierunek Elektronika
J.Kasperek P.J.Rajda
Program wykładu
Kontakt z prowadzącymi:
C-3 p.502 tel. (617)3980
mgr inż. Jerzy Kasperek kasperek@uci.agh.edu.pl
mgr inż. Paweł J.Rajda pjrajda@uci.agh.edu.pl
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
• Typy rozszerzone (Extended Types)
– Typy wyliczeniowe (Enumerated Types)
– Podtypy (Subtypes)
• Typy złożone (Composite Types)
– Tablice (Arrays)
– Rekordy (Records)
• Inne typy predefiniowane (Other
Predefined Types)
– Pliki (Files)
– Linie (Lines)
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Predefiniowane typy danych
STANDARD Package definiuje typy:
• Boolean
• Bit
•Bit_vector
• Character
• String
• Text
STANDARD Package między innymi zawiera następujące
deklaracje:
type
boolean
is
(false, true);
-- initial value: FALSE
type
bit
is
(
‘0’
,
‘1’
);
type
std_logic
is
(
‘U’
,
‘X’
,
‘0’
,
‘1’
,
‘Z’
,
‘W’
,
‘L’
,
‘H’
,
‘-’
);
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Typy wyliczeniowe
W deklaracji występuje lista nazw lub wartości
definiujących nowy typ. Jest on dogodnym środkiem dla
symbolicznej reprezentacji kodów.
Składnia:
type
identifier
is
(item {, item});
item: {identifier | character_literal}
Przykłady:
identifiers:
type
tools
is
(hammer, saw, drill, wrench);
literals:
type
fiveval
is
(
‘?’
,
‘0’
,
‘1’
,
‘Z’
,
‘X’
);
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
architecture
behave
of
cpu
is
type
instr
is
(add, lda,
ldb);
begin
process
variable
a, b, data:
integer
;
variable
opcode: instr;
begin
..........
case
opcode
is
when
lda => a := data;
when
ldb => b := data;
when
add => a := a + b;
end case
;
wait on
data;
end process
;
end
behave;
Kodowanie elementów
listy dla syntezy:
00 add
01 lda
10 ldb
11 ---
type
instr
is
(add,lda,ldb,invalid);
Typy wyliczeniowe
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Wyrażenia kwalifikujące
Nie można rozróżnić typu literałów n.p.: char
‘1’
, bit
‘1’
czy std_logic
‘1’
. Są one niejednoznaczne. Stosuje się
więc narzucanie typów (typecasting).
Składnia:
type’(literal | expression);
Przykłady:
bit’(
‘1’
)
type
month
is
(April, May, June);
type
name
is
(April, June, Judy);
months’(June)
name’(June)
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Konwersje typów
Pytanie:
Jaka jest różnica między
zapisami:
• integer(
3.0
)
• integer’(
3.0
)
Odpowiedź:
integer(
3.0
) jest legalnym odwołaniem do wbudowanej
funkcji konwersji z typu real do typu integer.
integer’(
3.0
) jest błędnym wyrażeniem kwalifikującym. Nie
można narzucić typu integer typowi real.
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Funkcje konwersji typów mogą być przydatne przy
dopasowywaniu dwóch projektów, które używają
różnych typów.
Przykład:
process
..........;
variable
abc: fourval;
variable
xyz: value4;
begin
xyz := convert4val (abc);
-- wywołanie funkcji
end process
;
Konwersje typów
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Konwersje typów
type
fourval
is
(
‘X’
,
‘L’
,
‘H’
,
‘Z’
);
type
value4
is
(
‘X’
,
‘0’
,
‘1’
,
‘Z’
);
function
convert4val (s: fourval)
return
value4
is
begin
case
s
is
when
‘X’
=>
return
‘X’
;
when
‘L’
=>
return
‘0’
;
when
‘H’
=>
return
‘1’
;
when
‘Z’
=>
return
‘Z’
;
end case
;
end
convert4val;
Odpowiedź: Tak, wartość zwracana przez funkcję jest
zadeklarowana
jako typ value4.
Pytanie: Czy wyrażenie
return
‘X’
jest jednoznaczne?
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Podtypy skalarne
Są uściśleniem wcześniej zdefiniowanych typów przez
zawężenie ich zakresu.
Przykłady:
subtype
digit
is
integer
range
0
to
9
;
variable
msd, lsd: digit;
jest równoważny:
variable
msd, lsd: integer
range
0
to
9
;
type
instr
is
(add, sub, mul, div, sta, stb, outa,
xfr);
subtype
arith
is
instr
range
add
to
div;
subtype
pos
is
integer
range
1
to
2147483647
;
subtype
nano
is
time
range
0
ns
to
1
us;
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Tablice
• Tablice składają się z elementów tego
samego typu.
• Są one używane do opisu magistral,
rejestrów i innych
zbiorów elementów sprzętowych.
• Elementy tablic mogą być skalarami lub
elementami
złożonymi.
• Dostęp do poszczególnych elementów dzięki
użyciu
wskaźników.
Jedynymi predefiniowanymi typami
tablicowymi są
:
• bit_vector
• string
• std_logic_vector
Użytkownik musi sam deklarować nowe typy
tablic dla elementów real i integer.
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Tablice – deklaracja zakresu indeksów
Sposób dostępu zależy od sposobu
deklaracji.
Przykłady:
variable
c: bit_vector (
0
to
3
);
variable
d: bit_vector (
3
downto
0
);
c :=
“1010”
;
d := c;
1
0
1
0
c(
0
) c(
1
) c(
2
) c(
3
)
d(
3
) d(
2
) d(
1
)
d(
0
)
(
4
TO
7
)
dowolny sposób
c(
4
)
indeks poza
zakresem
c(
1.0
)
błędny typ
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Tablice - przypisania
Przykład: dla typu bit_vector:
c :=
“1010”
;
stała typu bit_vector
c := S & T & M & W;
4 połączone sygnały 1-
bitowe
c := (
‘1’
,
‘0’
,
‘1’
,
‘0’
);
4-bitowy agregat
c :=
3
;
niedozwolony
Fragment tablicy (slice)
Przykłady:
variable
a: bit_vector (
3
downto
0
);
variable
c: bit_vector (
8
downto
1
);
c(
6
downto
3
) := a;
c(
6
downto
3
) nie c(
3
to
6
)
-
kierunek indeksów
musi być
taki sam jak w deklaracji
!
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Agregaty
Literał tablicowy może zawierać listę elementów w
notacji
pozycyjnej i / lub specyfikacyjnej, tworząc agregat.
Składnia:
[type_name’] ([choice =>] expression1 {,[
others
=>]
expression2})
Przykłady:
variable
a,b: bit :=
‘1’
;
variable
x,y,z: bit_vector (
1
to
4
);
x := bit_vector’(
‘1’
,a
nand
b,
‘1’
,a
or
b);
y := (
1
=>
‘1’
,
4
=> a
or
b,
2
=> a
nand
b,
3
=>
‘1’
);
=> czytaj: “otrzymuje”
Pytanie:
Jakie będą wartości x, y ?
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Przy użyciu notacji specyfikacyjnej, [choice =>] wskazuje na
jeden lub kilka elementów.
[choice =>] może zawierać wyrażenie (n.p.: (i
mod
2
) =>),
wskazujące na jeden element lub zakres (n.p.:
3
to
5
=>
lub
7
downto
0
=>), wskazujące na sekwencję elementów.
Notacja pozycyjna musi być użyta przed notacją
specyfikacyjną.
Przykład:
variable
b: bit;
variable
c: bit_vector (
8
downto
1
);
c := bit_vector’(
‘1’
,b,
5
downto
2
=>
‘1’
,
others
=>
‘0’
);
Agregaty
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Deklaracja typu tablicowego
Aby zadeklarować typ tablicowy należy wyspecyfikować:
nazwę typu, typ elementów, liczbę zakresów indeksów, typ
indeksów oraz zakres indeksów (opcjonalnie).
Składnia:
type
name
is
array
[index_constraint]
of
element_type ;
index_constraint: [range_spec]
index_type
range
[range_spec]
index_type
range
<>
Przykłady:
type
word8
is array
(
1
to
8
)
of
bit;
type
word8
is array
(integer
range
1
to
8
)
of
bit;
type
word
is array
(integer
range
<>)
of
bit;
type
ram
is array
(
1
to
8
,
1
to
10
)
of
bit;
<> oznacza zakres nieograniczony
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Po deklaracji typu może on zostać użyty do deklaracji
zmiennej lub sygnału.
Przykład:
variable
mystuff: word8;
variable
yourstuff: word (
1
to
10
);
Typ wyliczeniowy albo podtyp może również być użyty do
oznaczenia zakresu zmienności indeksów.
Przykłady:
type
instruction
is
(add, sub, mul, div, lda, sta,
xfr);
subtype
arithmetic
is
instruction
range
add
to
div;
subtype
digit
is
integer
range
1
to
9
;
type
Ten_bit
is
array
(digit)
of
bit;
type
Inst_flag
is
array
(instruction)
of
digit;
Deklaracja typu tablicowego
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Szczególnie użyteczne przy symulacji pamięci RAM
lub ROM.
Przykład:
type
memory
is
array
(
0
to
7
,
0
to
3
)
of
bit;
constant
rom: memory := ((
‘0’
,
‘0’
,
‘0’
,
‘0’
),
(
‘0’
,
‘0’
,
‘0’
,
‘1’
),
(
‘0’
,
‘0’
,
‘1’
,
‘0’
),
(
‘0’
,
‘0’
,
‘1’
,
‘1’
),
(
‘0’
,
‘1’
,
‘0’
,
‘0’
),
(
‘0’
,
‘1’
,
‘0’
,
‘0’
),
(
‘0’
,
‘1’
,
‘1’
,
‘0’
),
(
‘0’
,
‘1’
,
‘0’
,
‘1’
));
data_bit := rom(
5
,
3
);
-- słowo 5, bit 3
Tablice wielowymiarowe
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Tablice tablic
Przykład:
type
word
is
array
(
0
to
3
)
of
bit;
type
memory
is
array
(
0
to
4
)
of
word;
variable
addr, index: integer;
variable
data: word;
constant
rom_data: memory := ((
‘0’
,
‘0’
,
‘0’
,
‘0’
),
(
‘0’
,
‘0’
,
‘0’
,
‘1’
),
(
‘0’
,
‘0’
,
‘1’
,
‘0’
),
(
‘0’
,
‘1’
,
‘1’
,
‘1’
),
(
‘0’
,
‘1’
,
‘1’
,
‘1’
));
data := rom_data(addr);
rom_data(addr)(index)
--dostęp do pojedynczego bitu
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Nieograniczony typ tablicowy
Możliwe jest zadeklarowanie typu tablicowego bez podania
zakresu zmienności indeksów. Pełna deklaracja następuje w
momencie deklarowania zmiennej lub sygnału tego typu.
Przykład:
STANDARD Package:
type
bit_vector
is
array
(natural
range
<>)
of
bit;
Pytanie:
Czy można zadeklarować typ nieograniczonej tablicy liczb
typu real? Jeśli tak, proszę to wykonać, nazywając nowy typ
real_array.
Odpowiedź:
type
real_array
is
array
(integer
range
<>)
of
real;
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Konwersje typów
type
int_1
is range
0
to
10
;
type
int_2
is range
0
to
20
;
type
array_1
is array
(
1
to
10
)
of
int_1;
type
array_2
is array
(
11
to
20
)
of
int_2;
subtype
my_bit_vector
is
bit_vector (
1
to
10
);
type
bit_array_10
is array
(
11
to
20
)
of
bit;
type
bit_array_20
is array
(
0
to
20
)
of
bit;
signal
s_int: int_1;
signal
s_array: array_1;
signal
s_bit_vec: my_bit_vector;
signal
s_bit: bit;
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Konwersje typów integer:
int_2’(s_int);
rozszerzenie zakresu
Konwersje podobnych typów:
bit_array_10’(s_bit_vec);
przesuniecie zakresu
Niedozwolone konwersje typów:
boolean’(s_bit);
pomiędzy dwoma typami
wyliczeniowymi
int_1’(s_bit);
wyliczeniowych na inne
bit_array_20’(s_bit vec);
różne długości tablic
array_1’(s_bit_vec);
typy elementów nie
poddają się
konwersji
Konwersje typów
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Grupują obiekty różnych typów. Elementy rekordów
mogą być skalarami lub typami złożonymi i są
dostępne przez nazwę.
Przykład:
type
two_digit
is record
sign: bit;
msd: integer
range
0
to
9
;
lsd: integer
range
0
to
9
;
end record
;
process
variable
acntr, bcntr: two_digit;
begin
acntr.sign :=
‘1’
;
acntr.msd :=
1
;
acntr.lsd := acntr.msd;
bcntr := two_digit’(
‘0’
,
3
,
6
);
end process
;
Rekordy
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Instrukcja alias
Umożliwia wprowadzenie alternatywnej nazwy dla
części obiektu, ułatwiającej dostęp.
Przykład:
signal
count: bit_vector (
1
to
9
);
alias
sign: bit
is
count (
1
);
alias
msd: bit_vector (
1
to
4
)
is
count (
2
to
5
);
alias
lsd: bit_vector (
1
to
4
)
is
count (
6
to
9
);
count :=
“1_1001_0000”
;
sign :=
‘1’
;
msd :=
“1001”
;
lsd := msd;
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Predefiniowane typy tekstowe
Należą do nich typy text oraz line. Używane są do
operacji wejścia
i wyjścia podczas symulacji. Występują w deklaracji
file
wraz
z funkcjami odczytu, zapisu i pomocniczymi.
STD library - TEXTIO Package:
readline
,
read
,
writeline
,
write
endfile
(filename),
endline
(linename)
readline
(F:
in
text; L:
out
line);
read
(L:
inout
line; ITEM: integer);
a:
process
...
file
testvectors: text
is
in
“test.vec”;
variable
L: line;
variable
sim: bit_vector (
3
downto
0
);
begin
readline
(testvectors, L);
read
(L, sim);
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
use
std.textio.all;
entity
copy4
is
end
copy4;
architecture
first
of
copy4
is
begin
process
(go)
file
instuff: text
is in
“/path/test.data”;
file
outfile:
text
is out
“/path/new.data”;
variable
L1, L2: line;
variable
av: bit_vector (
3
downto
0
);
begin
while
not
(
endfile
(instuff))
loop
readline
(instuff, L1);
read
(L1, av);
write
(L2, av);
writeline
(outfile, L2);
end loop
;
end process
;
end first
;
Predefiniowane typy tekstowe
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Typ access
Typ access
Nie jest dostępny w syntezie, ale może być użyty
podczas symulacji. Udostępnia wskaźniki dla
definiowania w pamięci symulatora struktur danych
(rekordów) o zmiennych rozmiarach.
new
,
deallocate
Przykład:
type
two_digit
is
record
...
type
pntr
is
access
two_digit;
variable
xptr: pntr;
xptr :=
new
two_digit;
alokacja
deallocate
(xptr);
dealokacja
xptr.msd :=
“1001”
;
dostęp
J.Kasperek P.J.Rajda © 2001 Katedra Elektroniki AGH
Kraków
Języki Opisu Sprzętu
Deklaracje typów
Deklaracja typu musi się pojawić się przed użyciem typu.
Typ zadeklarowany w
entity
nie może być użyty w
specyfikacji portów, ponieważ pojawia się ona przed
deklaracjami typów.
entity
E
is
type_declaration
begin
.....
end
E;
P:
process
type_declaration
begin
.....
end
process
P;
package
P
is
type_declaration
end
P;
B:
block
type_declaration
begin
.....
end
B;
function
F (...) is
type_declaration
begin
.....
end
F;
architecture
A
of
E
is
type_declaration
begin
.....
end
A;
Ciąg dalszy
nastąpi...