Sổ tay lập trình VHDL
[email protected]
Created by
[email protected]
Giíi thiÖu ng«n ng÷ VHDL
3.1. C¸c cÊu tróc c¬ b¶n cña ng«n ng÷ VHDL.
C¸c thµnh phÇn chÝnh x©y dùng trong ng«n ng÷ VHDL ®îc chia ra
thµnh n¨m nhãm c¬ b¶n nh sau:
- Entity
- Architecture
- Package
- Configuration.
- Library.
Entity: Trong mét hÖ thèng sè, th«ng thêng ®îc thiÕt kÕ theo mét sù
xÕp chång c¸c modul, mµ mçi Modul nµy t¬ng øng víi mét thùc thÓ thiÕt
kÕ ( §îc gäi lµ Entity ) trong VHDL. Mçi mét Entity bao gåm hai phÇn :
- Khai b¸o thùc thÓ ( Entity).
- Th©n kiÕn tróc ( Architecture Bodies )
Mét khai b¸o Entity ®îc dïng ®Ó m« t¶ giao tiÕp bªn ngoµi cña mét
phÇn tö (component), nã bao gåm c¸c khai b¸o c¸c cæng ®Çu vµo, c¸c cæng
®Çu ra cña phÇn tö ®ã. PhÇn th©n cña kiÕn tróc ®îc dïng ®Ó m« t¶ sù thùc
hiÖn bªn trong cña thùc thÓ ®ã.
Packages: C¸c ®ãng gãi chØ ra th«ng tin dïng chung, mµ c¸c th«ng tin
nµy ®îc sö dông bëi mét vµi Entity nµo ®ã.
Configuration: §Þnh cÊu h×nh, nã cho phÐp g¾n kÕt c¸c thÓ hiÖn cña
phÇn tö cÇn dïng nµo ®ã cña mét thiÕt kÕ nµo ®ã cã d¹ng mét cÊu tróc vµ
®a c¸c thÓ hiÖn nµy vµo trong cÆp Entity vµ Architecture.
Nã cho phÐp ngêi thiÕt kÕ cã thÓ thö nghiÖm ®Ó thay ®æi c¸c sù thùc
thi kh¸c nhau trong mét thiÕt kÕ. Mçi mét thiÕt kÕ d¹ng VHDL bao gåm mét
vµi ®¬n vÞ th viÖn, mµ mét trong c¸c th viÖn nµy ®îc dÞch s½n vµ cÊt trong
mét th viÖn thiÕt kÕ.
3.1.1 Khai b¸o Entity:
Nh trªn ®· ®Ò cËp, phÇn khai b¸o Entity chØ ®a ra mét c¸i nh×n phÝa
bªn ngoµi cu¶ mét phÇn tö mµ kh«ng cung cÊp th«ng tin vÒ sù thùc hiÖn cña
phÇn tö ®ã nh thÕ nµo. Có ph¸p khai b¸o cña mét Entity nh sau:
Entity entity_name is
[generic (generic_declaration);]
[port (port_declaration);]
{entity_declarative_item {constants, types, signals};}
end [entity_name];
[] : DÊu ngoÆc vu«ng chØ ra c¸c tham sè cã thÓ lùa chän.
| : DÊu g¹ch ®øng hiÓn thÞ mét sù lùa chän trong sè c¸c lùa chän kh¸c.
{} : Khai b¸o mét hoÆc nhiÒu c¸c ®èi tîng, mµ c¸c ®èi tîng nµy cã
thÓ ®îc ®Þnh nghÜa bëi ngêi dïng.
a. Khai b¸o Generic dïng ®Ó khai b¸o c¸c h»ng mµ chóng cã thÓ ®îc
dïng ®Ó ®iÒu khiÓn cÊu tróc vµ sù ho¹t ®éng cña Entity. Có ph¸p cña khai
b¸o nµy nh sau:
generic ( constant_name : type [:=init_value]
{;constant_name: type[:=init_value]});
ë ®©y tªn h»ng constant_name chØ ra tªn cña mét h»ng d¹ng generic
(h»ng dïng chung).
KiÓu (Type) ®îc dïng ®Ó chØ ra kiÓu d÷ liÖu cña h»ng.
init_value : chØ ra gi¸ trÞ khëi t¹o cho h»ng.
b. Khai b¸o cæng ( Port ): §îc dïng ®Ó khai b¸o c¸c cæng vµo, ra cña
Entity. Có ph¸p cña khai b¸o nµy nh sau:
Port ( port_name : [mode] type [:= init_value]
{; port_name:[mode] type [:=init_value]});
port_name ®îc dïng ®Ó chØ ra tªn cña mét cæng, mode chØ ra híng
vµo ra cña tÝn hiÖu t¹i cæng ®ã. Type chØ ra kiÓu d÷ liÖu cña mét cæng vµ
init_value chØ ra gi¸ trÞ khëi t¹o cho cæng ®ã.
Chó ý ! Víi VHDL kh«ng ph©n biÖt ch÷ hoa vµ ch÷ thêng, ch¼ng h¹n
nh : xyz = xYz = XYZ.
* Cã bèn mode ®îc sö dông trong khai b¸o cæng :
- in : chØ cã thÓ ®îc ®äc, nã chØ ®îc dïng cho c¸c tÝn hiÖu ®Çu vµo (
chØ ®îc phÐp n»m bªn ph¶i phÐp g¸n )
- out : ChØ ®îc dïng ®Ó g¸n gi¸ trÞ, nã chØ ®îc dïng cho c¸c cæng ®Çu
ra ( Nã chØ ®îc n»m bªn tr¸i cña phÐp g¸n ).
- inout : Cã thÓ ®îc dïng ®Ó ®äc vµ g¸n gi¸ trÞ. Nã cã thÓ cã nhiÒu h¬n
mét híng ®iÒu khiÓn ( Cã thÓ n»m ë bªn tr¸i hoÆc bªn ph¶i phÐp g¸n ).
- Buffer : Cã thÓ ®îc dïng ®Ó ®äc vµ g¸n gi¸ trÞ. ( Cã thÓ n»m ë bªn
tr¸i hoÆc bªn ph¶i phÐp g¸n ).
inout lµ mét cæng hai híng, cßn Buffer lµ mét cæng kh«ng cã híng.
c. entity_declarative_item : §îc dïng ®Ó khai b¸o c¸c h»ng, kiÓu d÷
liÖu, hoÆc tÝn hiÖu mµ nã cã thÓ ®îc sö dông trong khi thùc hiÖn cña mét
Entity.
d. VÝ dô :
* VÝ dô vÒ khai b¸o c¸c cæng vµo ra:
entity xxx is
port ( A : in integer ;
B : in integer ;
C : out integer ;
D : inout integer ;
E : buffer integer) ;
end xxx;
architecture bhv of xxx is
begin
process (A,B)
begin
C <= A ; -- ( C©u lÖnh ®óng: A ®îc g¸n cho C ).
A <= B ; -- ( C©u lÖnh sai: A lµ mét ®Çu vµo ).
E <= D + 1; -- ( C©u lÖnh ®óng: D ë mode inout v× vËy nã cã thÓ ®îc
g¸n vµ ®äc )
D <= C + 1; -- ( C©u lÖnh sai : C lµ cæng ®Çu ra nªn kh«ng thÓ ®îc
®äc cho ®Çu vµo ).
end process;
end bhv;
* VÝ dô vÒ khai b¸o Entity:
A
COUT
B
FULL_ADDER
CIN
SUM
H×nh trªn chØ ra mét giao diÖn cña mét bé céng mét bit. Tªn Entity cña
phÇn tö nµy lµ FULL_ADDER. Nã bao gåm c¸c cæng ®Çu vµo A, B vµ CIN.
C¸c cæng nµy cã kiÓu d÷ liÖu lµ kiÓu Bit, cßn c¸c cæng ®Çu ra SUM vµ
COUT còng mang kiÓu d÷ liÖu lµ kiÓu BIT. Ng«n ng÷ VHDL dïng ®Ó diÔn
t¶ giao diÖn nµy nh sau:
Entity FULL_ADDER is
port ( A, B, CIN : in BIT;
SUM, COUT : out BIT );
End FULL_ADDER ;
Chóng ta cã thÓ ®iÒu khiÓn cÊu tróc còng nh thêi gian cña mét Entity
bëi viÖc sö dông c¸c h»ng generic. VÝ dô sau sÏ chØ ra viÖc ®iÒu khiÓn nµy,
trong vÝ dô nµy h»ng N ®îc dïng ®Ó chØ ra sè bÝt cña mét bé céng. Trong
qu¸ tr×nh m« pháng hoÆc qu¸ tr×nh tæng hîp, gi¸ trÞ thùc tÕ cho mçi h»ng
dïng chung generic cã thÓ bÞ thay ®æi.
entity ADDER is
generic (N : INTEGER := 4);
M : TIME := 10ns);
port ( A, B : in BIT_VECTOR (N -1 downto 0 );
CIN :in BIT;
SUM : out BIT_VECTOR (N-1 downto 0);
COUT : out BIT );
end ADDER;
Giao diÖn m« t¶ bé céng nµy nh sau:
A (3)
B (3)
COUT
A (2)
B (2)
A (1)
B (1)
A (0)
B (0)
CIN
FULL _ ADDER
SUM (3)
SUM (2)
SUM (1)
SUM (0)
3.1.2. C¸c kiÓu kiÕn tróc ( ARCHITECTURES ):
Mét kiÕn tróc ®a ra kÕt cÊu bªn trong cña mét Entity. Mét Entity cã
thÓ cã nhiÒu h¬n mét kiÕn tróc, nã chØ ra quan hÖ gi÷a c¸c ®Çu vµo vµ ®Çu ra
cña mét Entity mµ quan hÖ nµy ®îc diÔn t¶ theo c¸c thuËt ng÷ sau :
- KiÓu hµnh vi ho¹t ®éng ( Behavioral ).
- KiÓu ho¹t ®éng cña c¸c luång d÷ liÖu ( Dataflow ).
- KiÓu cÊu tróc ( Structure ).
Mét kiÕn tróc x¸c ®Þnh chøc n¨ng cña mét Entity. Nã bao gåm phÇn
khai b¸o ( Khai b¸o c¸c c¸c tÝn hiÖu, h»ng, khai b¸o c¸c kiÓu, c¸c phÇn tö,
c¸c phÇn tö, tiÕp theo lµ c¸c ph¸t biÓu(lÖnh) ®ång thêi ).
Khai b¸o mét kiÕn tróc sö dông có ph¸p sau:
architecture architecture_name of entity_name is
{ architecture_declarative_part }
Begin
{concurrent_statement} --(lÖnh ®ång thêi)
end [ architecture_name ];
3.1.2.1. KiÕn tróc theo kiÓu hµnh vi ho¹t ®éng ( Behavioral ):
Mét kiÕn tróc kiÓu hµnh vi ho¹t ®éng chØ ra c¸c ho¹t ®éng mµ mét hÖ
thèng riªng biÖt nµo ®ã ph¶i thùc hiÖn trong mét ch¬ng tr×nh, nã gièng nh
viÖc diÔn t¶ c¸c qu¸ tr×nh ho¹t ®éng, nhng kh«ng cung cÊp chi tiÕt mµ thiÕt
kÕ ®îc thùc thi nh thÕ nµo. Thµnh phÇn chñ yÕu cña viÖc diÔn t¶ theo kiÓu
hµnh vi trong VHDL lµ process. Díi ®©y lµ vÝ dô chØ ra kiÓu diÔn t¶ theo
kiÓu hµnh vi cña mét bé céng víi tªn lµ FULL_ADDER.
architecture BEHAVIOUR of FULL_ADDER is
begin
process (A,B,CIN)
begin
if ( A ='0' and B ='0' and CIN='0' ) then
SUM <= '0';
COUT <= '0'
;
elsif
(A='0' and B='0' and CIN='1') or
(A='0' and B='1' and CIN='0') or
(A='1' and B='0' and CIN='1') then
SUM <= '1';
COUT <= '0'
;
elsif (A='0' and B='1' and CIN='1') or
(A='1' and B='0' and CIN='1') or
(A='1' and B='1' and CIN='0') then
SUM <= '0';
COUT <= '1';
elsif (A='1' and B='1' and CIN='1') then
SUM <='1';
COUT <='1';
end if;
end process;
end BEHAVIOURAL;
3.1.2.2. KiÕn tróc theo kiÓu ho¹t ®éng cña c¸c luång d÷ liÖu:
Mét kiÕn tróc kiÓu luång d÷ liÖu chØ ra mét hÖ thèng díi d¹ng m« t¶
®ång thêi cña c¸c luång ®iÒu khiÓn vµ dÞch chuyÓn cña d÷ liÖu. Nã sö dông
theo mÉu th«ng tin hoÆc mÉu ho¹t ®éng cña luång d÷ liÖu ®ã, hoÆc mÉu thêi
gian cña c¸c chøc n¨ng logic tæ hîp. Ch¼ng h¹n nh c¸c bé céng, bé so s¸nh,
bé gi¶i m·, vµ c¸c cæng logic nguyªn thuû.
VÝ dô :
architecture DATAFLOW of FULL_ADDER is
signal S : BIT;
begin
S <= A xor B ;
SUM <= S xor CIN after 10 ns;
COUT <= (A and B ) or (S and CIN) after 5ns;
end DATAFLOW;
3.1.2.3. KiÕn tróc kiÓu cÊu tróc:
Mét kiÕn tróc kiÓu cÊu tróc chØ ra sù thùc thi cÊu tróc theo d¹ng sö dông
c¸c khai b¸o phÇn tö vµ c¸c thÓ hiÖn cña phÇn tö ®ã. VÝ dô díi ®©y chØ ra
sù diÔn t¶ cÊu tróc cña mét bé céng FULL_ADDER nh trªn ®· giíi thiÖu.
Hai kiÓu phÇn tö ®îc sö dông trong vÝ dô nµy lµ HALF_ADDER vµ
OR_GATE.
architecture STRUCTURE of FULL_ADDER is
component HALF_ADDER
port (L1, L2 : in BIT;
CARRY, SUM : out BIT);
end component;
component OR_GATE
port (L1, L2 : in BIT;
O: out BIT);
end component;
begin
HA1: HALF_ADDER port map (A,B,N1,N2);
HA2: HALF_ADDER port map (N2,CIN,N3,SUM);
OR1 : OR_GATE port map (N1, N3,COUT);
end STRUCTURE;
ë vÝ dô nµy Entity ë møc cao nhÊt sÏ chøa hai thÓ hiÖn cña
HALF_ADDER vµ mét thÓ hiÖn cña OR_GATE. ThÓ hiÖn HALF_ADDER
cã thÓ bÞ r»ng buéc víi mét Entity kh¸c, mµ Entity nµy bao gåm mét cæng
XOR vµ mét cæng AND. Giao tiÕp cña mét bé céng HALF_ADDER cã
d¹ng nh sau:
L1
L2
X1
SUM
A1
CARRY
Bé céng nµy gåm cã hai ®Çu vµo L1 vµ L2 , ®Çu ra lµ SUM vµ CARRY.
KiÓu BIT lµ kiÓu tiÒn ®Þnh nghÜa cña ng«n ng÷ VHDL, nã cã kiÓu liÖt kª
d¹ng ch÷ ký tù nh '0' vµ '1'.
3.1.3. C¸c kiÓu ®ãng gãi ( Packages ):
Môc ®Ých chÝnh cña Package lµ tËp hîp c¸c phÇn tö cã thÓ bÞ chia sÎ bëi
hai hay nhiÒu ®¬n vÞ thiÕt kÕ ( Hay c¸c phÇn tö cã thÓ dïng chung ®îc). Nã
cã chøa c¸c kiÓu d÷ liÖu, c¸c h»ng, c¸c ch¬ng tr×nh con cã thÓ dïng chung
gi÷a c¸c thiÕt kÕ. Mét Package cã cha hai phÇn chÝnh:
- PhÇn khai b¸o Package.
- PhÇn th©n Package.
3.1.3.1. PhÇn khai b¸o Package.
Mét khai b¸o Package ®îc dïng ®Ó cÊt gi÷ hµng lo¹t c¸c khai b¸o
dïng chung, ch¼ng h¹n nh c¸c phÇn tö, c¸c kiÓu, c¸c thñ tôc, c¸c hµm. C¸c
khai b¸o nµy cã thÓ nhËp vµo c¸c ®¬n vÞ thiÕt kÕ kh¸c bëi viÖc sö dông mét
mÖnh ®Ò use.
VÝ dô :
package EXAMPLE_PACK is
type SUMMER is ( MAY, JUN, JUL, AUG, SEP);
component D_FLIP_FLOP
port (D, CK:in BIT;
Q, QBAR: out BIT)
end component;
constant PIN2PIN_DELAY:TIME:=125ns;
function IN2BIT_VEC(INT_VALUE:INTEGER)
return BIT_VECTOR;
end EXAMPLE_PACK;
ë vÝ dô nµy tªn cña package ®îc khai b¸o lµ EXAMPLE_PACK. Nã
cã chøa c¸c khai b¸o kiÓu, phÇn tö, h»ng, vµ hµm. Lu ý r»ng ho¹t ®éng cña
hµm INT2BIT_VEC kh«ng xuÊt hiÖn ë trong khai b¸o gãi, mµ chØ cã giao
tiÕp cña hµm xuÊt hiÖn. ViÖc ®Þnh nghÜa, hay th©n cña hµm chØ xuÊt hiÖn
trong th©n cña ®ãng gãi ( Body Package ).
Gi¶ sö r»ng ®ãng gãi nµy ®· ®îc dÞch vµ t¹o thµnh mét th viÖn thiÕt
kÕ vµ ®îc gäi lµ DESIGN _LIB . Xem xÐt viÖc dïng mÖnh ®Ò use ®Ó sö
dông chóng díi ®©y:
library DESIGN_LIB;
use DESIGN_LIB.EXAMPLE_PACK.all
Entity RX is.........
MÖnh ®Ò library DESIGN_LIB cho phÐp th viÖn thiÕt kÕ DESIGN_LIB
®îc phÐp dïng trong phÇn m« t¶ nµy, ®iÒu ®ã cã nghÜa lµ tªn DESIGN_LIB
cã thÓ ®îc sö dông. MÖnh ®Ò use tiÕp theo sÏ lÊy tÊt c¶ c¸c khai b¸o cã
trong Package EXAMPLE_PACK vµo trong khai b¸o Entity cña RX. Cã
nghÜa lµ ta cã thÓ chän lùa c¸c khai b¸o tõ trong mét c¸c khai b¸o cña mét
®ãng gãi vµo trong mét ®¬n vÞ thiÕt kÕ kh¸c. VÝ dô :
library DESIGN_LIB;
use DESIGN_LIB.EXAMPLE_PACK.D_FLIP_FLOP;
use DESIGN_LIB.EXAMPLE_PACK.PIN2PIN_DELAY;
architecture RX_STRUCTURE of RX is.........
Hai mÖnh ®Ò use ë vÝ dô nµy nh»m t¹o ra khai b¸o cho D_FLIP_FLOP
vµ khai b¸o h»ng cho PIN2PIN_DELAY ®îc phÐp sö dông trong th©n kiÕn
tróc.
3.1.3.2. PhÇn khai b¸o th©n Package.
Sù kh¸c biÖt gi÷a khai b¸o Package vµ th©n Package cã cïng môc ®Ých
nh khai b¸o cña mét Entity vµ phÇn th©n kiÕn tróc Architecture cña chóng.
Có ph¸p khai b¸o cña Package ®îc khai b¸o nh sau:
package package_name is
{package_declarative_item}
end [package_name ];
package body package_name is
{package_declarative_item}
end [package_name]
Mét th©n package ®îc dïng ®Ó lu c¸c ®Þnh nghÜa cña mét hµm vµ thñ
tôc, mµ c¸c hµm vµ thñ tôc nµy chóng ®· ®îc khai b¸o trong phÇn khai b¸o
package t¬ng øng. V× vËy phÇn th©n package lu«n ®îc kÕt hîp víi phÇn
khai b¸o cña chóng, h¬n n÷a mét phÇn khai b¸o package lu«n cã Ýt nhÊt mét
phÇn th©n package kÕt hîp víi chóng.
VÝ dô : package EX_PKG is
subtype INT8 is integer range 0 to 255;
constant zero : INT8:=0;
procedure Incrementer (variable Count : inout INT8);
end EX_PKG;
package body EX_PKG is
procedure Incrementer (variable Data : inout INT8) is
begin
if (Count >= MAX ) then
Count:=ZERO;
else Count:= Count +1;
end if;
end Incrementer;
end EX_PKG;
3.1.4. §Þnh cÊu h×nh ( Configurations ) :
Mçi mét Entity bao gåm nhiÒu kiÕn tróc kh¸c nhau. Trong qu¸ tr×nh
thiÕt kÕ, ngêi thiÕt kÕ cã thÓ muèn thö nghiÖm víi c¸c sù biÕn ®æi kh¸c
nhau cña thiÕt kÕ b»ng viÖc chän lùa c¸c kiÓu kiÕn tróc kh¸c nhau.
Configuration cã thÓ ®îc sö dông ®Ó cung cÊp mét sù thay thÕ nhanh c¸c
thÓ hiÖn cña c¸c phÇn tö ( Component ) trong mét thiÕt kÕ d¹ng cÊu tróc. Có
ph¸p khai b¸o cña Configuration nµy nh sau:
Configuration configuration_name of entity_name is
{configuration_decalarative_part}
For block_specification
{use_cluse}
{configuration_item}
end for;
Víi mét Entity cña bé céng FULL_ADDER nh ®· giíi thiÖu ë phÇn
trªn, ë vÝ dô nµy ta cã thÓ sö dông chóng trong phÐp ®Þnh cÊu h×nh nh sau:
configuration FADD_CONFIG of FULL_ADDER is
For STRUCTURE
for
HA1,
HA2
:
HALF_ADDER
use
entity
burcin.HALF_ADDER(structure);
for OR1: OR_GATE use Entity burcin.OR_GATE;
end for;
end FADD_CONFIG;
ë ®©y tªn cña phÐp ®Þnh cÊu h×nh lµ tuú ý, ë vÝ dô nµy ta lÊy tªn lµ
FADD_CONFIG, cßn víi dßng lÖnh For STRUCTURE chØ ra kiÕn tróc
®îc ®Þnh cÊu h×nh vµ ®îc sö dông víi thùc thÓ Entity FULL_ADDER. Gi¶
sö r»ng chóng ta ®· dÞch hai thùc thÓ HALF_ADDER vµ OR_GATE thµnh
th viÖn víi tªn lµ burcin vµ sö dông chóng trong vÝ dô trªn.
3.1.5. C¸c th viÖn thiÕt kÕ :
KÕt qu¶ cña viÖc biªn dÞch VHDL lµ chóng ®îc cÊt gi÷ bªn trong c¸c
th viÖn ®Ó dïng cho bíc m« pháng tiÕp theo, ®iÒu nµy gièng nh viÖc sö
dông mét phÇn tö ®· ®îc khai b¸o trong mét thiÕt kÕ kh¸c. Mét th viÖn
thiÕt kÕ cã thÓ chøa c¸c ®¬n vÞ th viÖn nh sau:
- C¸c ®ãng gãi (PACKAGES)
- C¸c thùc thÓ Entity
- C¸c kiÓu kiÕn tróc Architectures
- C¸c phÐp ®Þnh cÊu h×nh Configurations.
Chó ý! VHDL kh«ng hç trî c¸c th viÖn theo thø bËc. B¹n cã
thÓ cã nhiÒu th viÖn nh theo ý muèn nhng kh«ng ®îc khai b¸o
lång nhau!
§Ó më mét th viÖn vµ truy cËp chóng nh mét Entity ®· ®îc biªn
dÞch trong mét thiÕt kÕ VHDL míi, ®iÒu ®Çu tiªn cÇn lµm lµ ph¶i khai b¸o
tªn th viÖn. Có ph¸p cña chóng nh sau:
Library library_name : [path/directory_name];
B¹n cã thÓ truy cËp c¸c ®¬n vÞ ®· ®îc biªn dÞch tõ mét th viÖn VHDL
tíi ba møc nh sau:
library_name.Package_name.item_name
VÝ dô: Gi¶ sö chóng ta t¹o mét ®ãng gãi ®Ó cÊt mét h»ng mµ h»ng nµy
®îc sö dông trong nhiÒu thiÕt kÕ, sau ®ã dÞch nã vµ cÊt vµo trong th viÖn
víi tªn lµ burcin .
Package my_pkg is
constant delay: time:=10ns;
end my_pkg;
TiÕp ®Õn chóng ta gäi my_pkg ®Ó sö dông chóng trong thiÕt kÕ díi
®©y:
architecture DATAFLOW of FULL_ADDER is
signal S : BIT;
begin
S <= A xor B;
SUM <= S xor CIN after burcin.my_pkg.delay;
COUT <= (A and B ) or (S and CIN) after 5ns;
end DATAFLOW;
3.2. C¸c ®èi tîng d÷ liÖu :
Mét ®èi tîng d÷ liÖu gi÷ mét gi¸ trÞ cña mét kiÓu nhÊt ®Þnh. Trong
VHDL cã ba líp ®èi tîng d÷ liÖu :
- C¸c h»ng ( constants ).
- C¸c biÕn ( Variables ).
- C¸c tÝn hiÖu ( Signals ).
Líp cu¶ mét ®èi tîng ®îc chØ ra bëi mét tõ kho¸ vµ nã ®îc chØ ra ë
®iÓm b¾t ®Çu cña mét khai b¸o.
3.2.1. C¸c h»ng ( Constant ):
Mét h»ng nã lµ mét ®èi tîng mµ nã ®îc khëi t¹o ®Ó chØ ra mét gi¸ trÞ
cè ®Þnh vµ nã kh«ng bÞ thay ®æi. Khai b¸o h»ng ®îc phÐp khai b¸o trong
c¸c ®ãng gãi, c¸c Entity, c¸c kiÕn tróc, c¸c ch¬ng tr×nh con, c¸c khèi, vµ
trong ph¸t biÓu cña c¸c qu¸ tr×nh processes.
Có ph¸p khai b¸o chóng nh sau :
Constant constant_name {constant_name}: type [:= value];
VÝ dô :
constant YES : BOOLEAN:= TRUE;
constant CHAR7: BIT_VECTOR (4 downto 0 ):="00111";
constant MSB: INTEGER:=5;
3.2.2. C¸c biÕn :
C¸c biÕn ®îc dïng ®Ó lu d÷ liÖu t¹m thêi, chóng chØ ®îc phÐp khai
b¸o trong ph¸t biÓu Process hoÆc c¸c ch¬ng tr×nh con.
VÝ dô :
variable X,Y : BIT;
variable TEMP: BIT_VECTOR (8 downto 0) ;
variable DELAY : INTERGER range 0 to 15:=5;
3.2.3. C¸c kiÓu tÝn hiÖu ( Signal ):
TÝn hiÖu ®îc dïng ®Ó kÕt nèi c¸c Entity cña thiÕt kÕ l¹i víi nhau vµ
trao ®æi c¸c gi¸ trÞ biÕn ®æi ë trong ph¸t biÓu process. Chóng cã thÓ ®îc
xem nh c¸c d©y dÉn hay c¸c bus nèi ë trong m¹ch thùc tÕ. TÝn hiÖu cã thÓ
®îc khai b¸o trong c¸c ®ãng gãi ( Package ), trong c¸c khai b¸o Entity,
trong khai b¸o kiÕn tróc (Architecture), trong c¸c khèi ( Block ). Víi c¸c
tÝn hiÖu ®îc khai b¸o trong c¸c package th× tÝn hiÖu nµy ®îc gäi lµ tÝn hiÖu
toµn côc ( C¸c thiÕt kÕ cã thÓ sö dông chóng ), c¸c tÝn hiÖu ®îc khai b¸o
trong Entity lµ tÝn hiÖu toµn côc trong mét Entity, t¬ng tù víi tÝn hiÖu ®îc
khai b¸o trong mét kiÕn tróc, nã lµ tÝn hiÖu dïng chung trong mét kiÕn tróc
®ã.
Có ph¸p cña chóng cã d¹ng nh sau :
Signal Signal_name {,signal_name}: type [:=value];
VÝ dô :
signal BEEP : BIT:= '0';
signal TEMP: STD_LOGIC_VECTOR (8 downto 0);
signal COUNT: INTEGER range 0 to 100 :=5;
3.3. C¸c kiÓu d÷ liÖu:
TÊt c¶ c¸c ®èi tîng d÷ liÖu trong VHDL cÇn ph¶i ®îc ®Þnh nghÜa víi
mét kiÓu d÷ liÖu. Mét khai b¸o kiÓu ph¶i chØ ra tªn vµ d¶i cña kiÓu ®ã. Khai
b¸o kiÓu d÷ liÖu chóng ®îc phÐp khai b¸o trong phÇn khai b¸o c¸c ®ãng
gãi, trong phÇn khai b¸o Entity, trong phÇn khai b¸o kiÕn tróc, trong phÇn
khai b¸o c¸c ch¬ng tr×nh con vµ trong phÇn khai b¸o c¸c Process. C¸c kiÓu
d÷ liÖu bao gåm c¸c kiÓu sau:
- KiÓu liÖt kª
- KiÓu nguyªn.
- C¸c kiÓu d÷ liÖu tiÒn ®Þnh nghÜa.
- KiÓu m¶ng.
- KiÓu b¶n ghi.
- KiÓu d÷ liÖu chuÈn logic.
- KiÓu d÷ liÖu cã dÊu vµ kh«ng dÊu.
- C¸c kiÓu phô.
3.3.1. C¸c kiÓu liÖt kª ( ENUMERATION ).
Mét kiÓu liÖt kª ®îc chØ ra bëi viÖc liÖt kª c¸c gi¸ trÞ cho phÐp cña
kiÓu ®ã. TÊt c¶ c¸c gi¸ trÞ ®îc ®Þnh nghÜa bëi ngêi dïng cã thÓ lµ c¸c tªn
®Þnh danh, hoÆc c¸c c¸c kiÓu ch÷ ký tù . Tªn ®Þnh danh thùc chÊt lµ mét tªn
do ngêi dïng ®Æt ra, ch¼ng h¹n nh blue, ball, monday. KiÓu ch÷ ký tù lµ
kiÓu cña c¸c ký tù cã kÌm theo dÊu ngoÆc ®¬n, ch¼ng h¹n nh 'x', ' 0'...
Có ph¸p khai b¸o c¶u chóng nh sau:
Type type_name is (enumerattion_literal {, enumeration_literal});
Víi type_name lµ mét tªn ®Þnh danh vµ mçi enumerattion_literal hoÆc
lµ mét tªn ®Þnh danh hoÆc lµ mét ch÷ ký tù.
VÝ dô :
type COLOR is (RED, ORANGE, YELLOW, GREEN, BLUE,
PURPLE);
type
DAY
is
(MONDAY,
TUESDAY,WEDNESDAY,THURDAY,FRIDAY);
type STD_LOGIC is ('U','X','0','1','Z','W','L','H','_');
Mçi mét ®Þnh danh trong mét kiÓu ®Òu cã mét vÞ trÝ nhÊt ®Þnh trong
kiÓu, chóng ®îc x¸c ®Þnh bëi thø tù xuÊt hiÖn cu¶ chóng trong kiÓu ®ã.
Trong vÝ dô trªn, mÆc ®Þnh RED cã vÞ trÝ 0, ORANGE sÏ cã vÞ trÝ 1 ..... NÕu
chóng ta khai b¸o mét ®èi tîng d÷ liÖu víi kiÓu lµ COLOR vµ kh«ng ®Þnh
nghÜa gi¸ trÞ khëi t¹o th× ®èi tîng d÷ liÖu sÏ ®îc khëi t¹o mÆc ®Þnh ë vÞ trÝ
®Çu tiªn cña kiÓu liÖt kª ( VÞ trÝ kh«ng ), trong trêng hîp nµy COLOR sÏ
nhËn gi¸ trÞ RED.
3.3.2. KiÓu nguyªn :
KiÓu nguyªn lµ c¸c kiÓu sè nguyªn, chóng ®îc dïng cho c¸c phÐp
tÝnh, c¸c chØ sè, c¸c ®iÒu khiÓn sè vßng lÆp. Trong hÇu hÕt c¸c kiÓu thùc thi
trong VHDL cã d¶i tõ - 2,147,483,647 ®Õn + 2, 147, 483,647. Có ph¸p cña
chóng ®îc khai b¸o nh sau:
type type_name is range - 2,147,483,647 to + 2, 147, 483,647;
VÝ dô :
type INTEGER is range - 2,147,483,647 to + 2, 147, 483,647;
type COUNT is range 0 to 10;
3.3.3. C¸c kiÓu d÷ liÖu tiÒn ®Þnh nghÜa trong VHDL :
IEEE ®Þnh nghÜa hai gãi d÷ liÖu STANDART vµ TEXTIO trong th
viÖn STD. Mçi mét gãi d÷ liÖu nµy cã chøa mét lo¹t c¸c kiÓu vµ c¸c phÐp
tÝnh chuÈn . Díi ®©y lµ c¸c kiÓu d÷ liÖu ®îc ®Þnh nghÜa trong gãi
STANDARD:
- BOOLEAN: Mét kiÓu liÖt kª víi hai gi¸ trÞ true vµ False, c¸c thao t¸c
Logic vµ c¸c phÐp to¸n quan hÖ sÏ tr¶ vÒ gi¸ trÞ Boolean.
- BIT : Mét kiÓu liÖt kª víi hai gi¸ trÞ '0' vµ '1' , c¸c phÐp tÝnh logic cã
thÓ lÊy vµ tr¶ vÒ gi¸ trÞ kiÓu BIT.
- CHARACTER: KiÓu liÖt kª cña c¸c m· ASCII.
- INTEGER : §îc dïng ®Ó miªu t¶ c¸c sè ©m vµ d¬ng. D¶i ho¹t ®éng
cña chóng ®îc Ên ®Þnh tõ - 2.147.438.647 ®Õn 2.147.438.647. C¸c hµm
to¸n häc nh céng, trõ ,nh©n, chia ®îc hç trî kiÓu nguyªn.
- NATURE: C¸c kiÓu con cña kiÓu nguyªn ®ù¬c dïng ®Ó miªu t¶ c¸c sè
kiÓu tù nhiªn ( kh«ng ©m ).
- POSITIVE: c¸c kiÓu con cña kiÓu nguyªn ®îc dïng ®Ó miªu t¶ c¸c sè
d¬ng.
- BIT_VECTOR : §îc dïng ®Ó miªu t¶ mét m¶ng c¸c gi¸ trÞ kiÓu BIT.
- STRING : Mét m¶ng c¸c ký tù, mét gi¸ trÞ kiÓu chuçi ®îc ®i kÌm bëi
dÊu ngoÆc kÐp.
- REAL: §îc dïng ®Ó m« t¶ c¸c kiÓu sè thùc, d¶i ho¹t ®éng tõ1.0E+38 ®Õn +1.0E+38.
- KiÓu thêi gian vËt lý : M« t¶ c¸c gi¸ trÞ thêi gian ®îc dïng trong m«
pháng.
Cã mét vµi kiÓu d÷ liÖu ®îc ®Þnh nghÜa trong gãi STANDARD nh
sau:
Type BOOLEAN is ( fase, true);
Type BIT is ( '0', '1' );
Type SEVERITY_LEVEL is (note, warning, error, failure );
Type INTEGER is range -2147483648 to 2147483648;
Type REAL is Range -1.0E38 to 1.0E38;
Type CHARACTER
is (nul, soh, stx, eot, enq, ack,
bel,............);
3.3.4. KiÓu m¶ng :
KiÓu m¶ng lµ kiÓu cña nhãm c¸c phÇn tö cã cïng kiÓu gièng nhau. Cã
hai kiÓu m¶ng nh sau:
- KiÓu m¶ng ®îc g¸n kiÓu .
- KiÓu m¶ng kh«ng bÞ g¸n kiÓu.
KiÓu m¶ng bÞ g¸n kiÓu lµ kiÓu mµ c¸c chØ sè m¶ng cña chóng ®îc ®Þnh
nghÜa têng minh. Có ph¸p cña chóng nh sau:
type array_type_name is array (discrete_range) of subtype_indication;
ë ®©y array_type_name lµ tªn cña kiÓu m¶ng ®îc Ðp kiÓu,
discrete_range kiÓu phô cña kiÓu nguyªn kh¸c hoÆc kiÓu liÖt kª,
subtype_indication chÝnh lµ kiÓu cña mçi phÇn tö cña m¶ng.
KiÓu m¶ng kh«ng bÞ g¸n kiÓu lµ kiÓu mµ chØ sè m¶ng cña chóng kh«ng
bÞ chØ ra, nhng c¸c kiÓu chØ sè cña chóng ph¶i ®îc chØ ra. Có ph¸p cña
chóng ®îc chØ ra nh sau:
type array_type_name is array (type_name range <>) of
subtype_indication;
VÝ dô :
type A1 is array ( 0 to 31) of INTEGER;
type Bit_Vector is arrray (NATURAL range <>) of BIT;
type STRING is array (POSITIVE range <>) of CHARACTER;
A1 lµ mét m¶ng gåm ba hai phÇn tö mµ trong ®ã mçi phÇn tö lµ mét
kiÓu nguyªn. Mét vÝ dô kh¸c chØ ra kiÓu Bit_vector vµ kiÓu String ®îc t¹o ra
trong chuÈn c¸c gãi STANDARD.
VÝ dô : subtype B1 is BIT_VECTOR ( 3 downto 0);
variable B2 : BIT_VECTOR (0 to 10);
D¶i chØ sè x¸c ®Þnh sè phÇn tö trong m¶ng vµ híng cña chóng ( low to
high | high to low ).
VHDL cho phÐp khai b¸o c¸c m¶ng nhiÒu chiÒu ®Ó cã thÓ dïng ®Ó khai
b¸o c¸c mÉu RAM vµ ROM. Xem vÝ dô díi ®©y:
type Mat is array (0 to 7, 0 to 3) of BIT;
constant ROM : MAT : = (( '0', '1', '0', '1'),
('1', '1', '0', '1' ),
('0', '1', '1', '1' ),
('0', '1' , '0', '0' ),
('0', '0' ,'0' , '0'),
('1', '1' , '0', '0' ),
('1', '1' , '1', '1' ),
('1', '1' , '0', '0' );
X := ROM (4,3);
BiÕn X sÏ lÊy gi¸ trÞ '0' ®îc t« ®Ëm.
3.3.5. KiÓu Record :
KiÓu record lµ mét nhãm cã nhiÒu h¬n mét phÇn tö cã c¸c kiÓu kh¸c