Sổ tay lập trình VHDL
ebooks@free4vn.org
Created by lythanhthuan@free4vn.org
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
B
COUT
CIN
FULL_ADDER
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.
generic (N : INTEGER := 4); M : TIME := 10ns); port ( A, B : in BIT_VECTOR (N -1 downto 0 ); CIN :in BIT;
COUT : out BIT ); end ADDER;
entity ADDER is SUM : out BIT_VECTOR (N-1 downto 0); Giao diÖn m« t¶ bé céng nµy nh sau:
A (3)
B (3)
A (2)
B (2)
A (1)
B (1)
A (0)
B (0)
COUT
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 ).
architecture architecture_name of entity_name is
Khai b¸o mét kiÕn tróc sö dông có ph¸p sau:
{ 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, nh ng 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.
SUM <= '0'; COUT <= '0'
;
architecture BEHAVIOUR of FULL_ADDER is begin
if ( A ='0' and B ='0' and CIN='0' ) then elsif
process (A,B,CIN) begin
(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'
SUM <='1'; COUT <='1';
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 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û.
signal S : BIT;
VÝ dô :
S <= A xor B ; SUM <= S xor CIN after 10 ns; COUT <= (A and B ) or (S and CIN) after 5ns;
architecture DATAFLOW of FULL_ADDER is begin 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.
port (L1, L2 : in BIT; O: out BIT);
architecture STRUCTURE of FULL_ADDER is
component HALF_ADDER port (L1, L2 : in BIT; CARRY, SUM : out BIT); end component; component OR_GATE end component;
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);
begin 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
SUM
X1
A1
CARRY
L2
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ã ch a 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ô :
port (D, CK:in BIT; Q, QBAR: out BIT)
return BIT_VECTOR;
type SUMMER is ( MAY, JUN, JUL, AUG, SEP); component D_FLIP_FLOP end component; constant PIN2PIN_DELAY:TIME:=125ns; function IN2BIT_VEC(INT_VALUE:INTEGER) end EXAMPLE_PACK;
package EXAMPLE_PACK is ë 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. L u ý 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ö
library DESIGN_LIB;
dông chóng díi ®©y:
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_declarative_item}
package package_name is end [package_name ]; package body package_name is
{package_declarative_item}
end [package_name]
Mét th©n package ® îc dïng ®Ó l u 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_decalarative_part}
Configuration configuration_name of entity_name is 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
architecture DATAFLOW of FULL_ADDER is
signal S : BIT;
begin
®©y:
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 ®Ó l u 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.
variable X,Y : BIT;
variable TEMP: BIT_VECTOR (8 downto 0) ;
variable DELAY : INTERGER range 0 to 15:=5;
VÝ dô :
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];
signal BEEP : BIT:= '0';
signal TEMP: STD_LOGIC_VECTOR (8 downto 0);
signal COUNT: INTEGER range 0 to 100 :=5;
VÝ dô :
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);
is type DAY (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
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,
sau:
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 îc Ðp kiÓu, array_type_name lµ tªn cña kiÓu m¶ng ®
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, nh ng 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
nhau. PhÇn tö cña Record bao gåm c¸c phÇn tö cña bÊt cø kiÓu nµo, nã cã
thÓ lµ c¸c kiÓu m¶ng hoÆc kiÓu Record.
VÝ dô :
type DATE_TYPE is ( SUN, MON, TUE , WED , THR , FRI , SAT) ;
type HOLIDAY is
record
YEAR : INTEGER range 1900 to 1999;
MONTH : INTEGER range 1 to 12 ;
DAY : INTEGER range 1 to 31;
DATE : DATE_TYPE;
end record ;
signal S : HOLIDAY;
variable T1: integer range 1900 to 1999;
variable T2 : DATE_TYPE;
T1: = S .YEAR;
T2:= S . DATE;
S . DAY <= 30;
3.3.6. C¸c kiÓu STD_LOGIC :
§Ó t¹o mÉu c¸c ® êng tÝn hiÖu cã nhiÒu h¬n hai gi¸ trÞ ( '0' , '1' ),
VHDL ®Þnh nghÜa chÝn kho¶ng trong gãi chuÈn. ChÝn gi¸ trÞ bao gåm :
type STD_LOGIC is ( 'U' -- kh«ng khëi t¹o gi¸ trÞ
'X' -- Kh«ng x¸c ®Þnh
'0' -- KiÓu møc thÊp
'1' -- KiÓu møc cao
'Z' -- KiÓu trë kh¸ng cao
'W' -- Kh«ng x¸c ®Þnh ë møc yÕu
'L' -- Møc thÊp yÕu
'H' -- Møc cao yÕu
'_' -- Kh«ng quan t©m ®Õn gi¸ trÞ .);
T¬ng tù nh kiÓu BIT vµ kiÓu BIT_VECTOR, VHDL cung cÊp mét
kiÓu kh¸c gäi lµ STD_LOGIC_VECTOR.
§Ó sö dông c¸c ®Þnh nghÜa vµ c¸c hµm trong gãi chuÈn logic, c¸c ph¸t
biÓu sau ®©y cÇn ® îc ph¶i khai b¸o ®Ýnh kÌm theo ch ¬ng tr×nh .
Library IEEE;
USE IEEE.STD_LOGIC_1164. all;
3.3.7. C¸c kiÓu d÷ liÖu kh«ng dÊu vµ cã dÊu .
C¸c kiÓu d÷ liÖu cã dÊu vµ kh«ng dÊu chóng ® îc chØ ra trong c¸c gãi
chuÈn NUMERIC_BIT vµ NUMERIC_STD. C¸c ®èi t îng víi kiÓu cã dÊu
vµ kh«ng dÊu chóng ® îc hiÓu nh lµ c¸c sè nguyªn binary kh«ng dÊu vµ
c¸c ®èi tîng víi kiÓu cã dÊu vµ chóng ® îc dÞch nh c¸c nguyªn bï
hai .
is array
type signed
ViÖc ®Þnh nghÜa cña c¸c kiÓu d÷ liÖu ® îc chØ ra nh sau:
(NATURAL
range <>)
of
BIT/STD_LOGIC;
C¸c ph¸t biÓu díi ®©y bao gåm c¸c khai b¸o viÖc sö dông cña c¸c kiÓu
Library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_BIT.all;
use IEEE.NUMERIC_STD.all;
d÷ kiÖu cã dÊu vµ kh«ng dÊu.
3.3.8. C¸c kiÓu con .
VHDL cung cÊp c¸c c¸c kiÓu con mµ c¸c kiÓu con nµy chóng ® îc ®Þnh
nghÜa trong c¸c nh c¸c tËp phô trong mét kiÓu kh¸c. BÊt cø ë ®©u cã mét
khai b¸o kiÓu th× ë ®ã cã thÓ xuÊt hiÖn mét ®Þnh nghÜa kiÓu con. KiÓu
NATURAL vµ kiÓu POSITIVE lµ mét kiÓu phô hay kiÓu con cña kiÓu
nguyªn vµ chóng cã thÓ ® îc dïng víi bÊt kú mét hµm nguyªn nµo.
subtype INT4 is INTEGER range 0 to 15;
subtype BIT_VECTOR6 is BIT_VECTOR (5 downto 0);
VÝ dô :
3.4. C¸c to¸n tö :
VHDL cung cÊp 6 líp to¸n tö , mçi mét to¸n tö cã mét møc u tiªn
nhÊt ®Þnh. TÊt c¶ c¸c to¸n tö trong cïng mét líp th× cã cïng mét møc u
tiªn.
Møc
u tiªn C¸c to¸n tö C¸c to¸n h¹ng thÊp
nhÊt
. and . Cïng kiÓu Logical_operator or . Cïng kiÓu nand . Cïng kiÓu
. nor Cïng kiÓu
. xor Cïng kiÓu
. = Cïng kiÓu
. /= Cïng kiÓu Relational _ operator . < Cïng kiÓu
. <= Cïng kiÓu
> Cïng kiÓu
>= Cïng kiÓu
concatenation_operator &
Cïng kiÓu arithmetic_operator +
Cïng kiÓu -
arithmetic_operator + BÊt kú kiÓu sè nµo
- BÊt kú kiÓu sè nµo
Cïng kiÓu arithmetic_operator *
Cïng kiÓu /
integer mod
integer rem
** KiÓu mò integer Møc arithmetic_operator
abs BÊt kú kiÓu sè nµo u tiªn
not Cïng kiÓu cao Logical_operator
nhÊt
3.4.1. C¸c to¸n tö logical .
KiÓu to¸n tö logic kh«ng chÊp nhËn c¸c to¸n h¹ng lµ c¸c kiÓu tiÒn ®Þnh
nghÜa nh kiÓu BIT, BOOLEAN vµ c¸c kiÓu m¶ng c¸c bit, c¸c to¸n h¹ng cÇn
ph¶i lµ cïng kiÓu vµ cïng ®é dµi.
VÝ dô :
signal A,B : BIT_VECTOR (6 downto 0);
signal C,D,E,F,G: BIT;
A<= B and C ; -- Kh«ng x¶y ra v× c¸c to¸n h¹ng kh«ng cïng
kiÓu.
D <= (E xor F) and (C xor G);
3.4.2. C¸c to¸n tö quan hÖ .
C¸c to¸n tö quan hÖ cho ta kÕt qu¶ cã kiÓu Boolean, c¸c to¸n h¹ng cÇn
ph¶i cã cïng kiÓu vµ cïng ®é dµi.
VÝ dô :
signal A,B : BIT_VECTOR (6 downto 0);
signal C: BOOLEAN;
C <= B <= A; ( T¬ng ®¬ng nh C <= (B<=A));
3.4.3. C¸c to¸n tö céng .
C¸c to¸n tö céng bao gåm "+", "-" , vµ "&" , trong ®ã to¸n tö "&" lµ
to¸n tö kÕt nèi chuçi vµ c¸c ®èi t îng lµ m¶ng c¸c thanh ghi. Víi sè cã dÊu
vµ kh«ng dÊu cã thÓ ® îc dïng víi c¸c sè nguyªn vµ c¸c kiÓu
BIT_VECTOR.
signal W: BIT_VECTOR (3 downto 0);
signal X: INTEGER range 0 to15;
signal Y,Z : UNSIGED (3 downto 0);
VÝ dô :
Z <= X + Y + Z;
Y <= Z (2 downto 0) & W(1);
"ABC" & "xyz" cho kÕt qu¶ lµ : "ABCxyz"
"1010" & "1" cho kÕt qu¶ lµ : "10101"
3.5. C¸c kiÓu to¸n h¹ng .
Trong mét biÓu thøc c¸c to¸n tö sö dông c¸c to¸n h¹ng ®Ó tÝnh to¸n c¸c
gi¸ trÞ cña chóng. C¸c to¸n h¹ng trong mét biÓu thøc bao gåm :
- KiÓu ch÷
- KiÓu ®Þnh danh
- C¸c tªn ®îc ®¸nh theo chØ sè
- Tªn c¸c Slice
- Tªn c¸c ®Æc tÝnh
- C¸c biÓu thøc ®iÒu kiÖn
- C¸c lêi gäi hµm
- C¸c biÓu thøc chuyÓn ®æi
3.5.1. KiÓu ch÷ .
C¸c kiÓu ch÷ cã thÓ chia ra thµnh hai nhãm chÝnh :
- KiÓu v« híng
. KiÓu ký tù
. KiÓu BIT
. KiÓu chuÈn STD_LOGIC
. KiÓu Boolean
. KiÓu sè thùc
. KiÓu nguyªn
. KiÓu thêi gian
- KiÓu m¶ng
. KiÓu chuçi
. KiÓu BIT_VECTOR
. STD_LOGIC_VECTOR
3.5.1.2. KiÓu ch÷ ký tù .
KiÓu ch÷ ký tù chØ ra mét gi¸ trÞ b»ng viÖc sö dông mét ký tù ®¬n vµ
kÌm theo mét dÊu ngoÆc ®¬n. Nh×n chung VHDL kh«ng quan t©m ®Õn c¸c
trêng hîp ch÷ th êng vµ ch÷ hoa, xong víi kiÓu ch÷ ký tù cÇn ph¶i ph©n
biÖt ch÷ thêng vµ ch÷ hoa. VÝ dô : 'a' hoµn toµn kh¸c víi kiÓu 'A' trong kiÓu
ch÷ ký tù. KiÓu ch÷ ký tù cã thÓ ® îc dïng ®Ó ®Þnh nghÜa bÊt cø kiÓu nµo
trong c¸c ®ãng gãi chuÈn và gi¸ trÞ mÆc ®Þnh cña chóng lµ Null.
VÝ dô : 'A' , 'a' , ......'1' .
KiÓu ch÷ ký tù kh«ng ph¶i lµ kiÓu bit ký tù nh '1' hoÆc kiÓu nguyªn 1,
v× vËy kiÓu ch÷ lý tù cÇn ph¶i ® îc cung cÊp mét tªn kiÓu nµo ®ã.
3.5.1.3. KiÓu chuçi .
Mét kiÓu chuçi ký tù thùc chÊt lµ mét m¶ng c¸c ký tù . Mét chuçi c¸c
ký tù ®îc ®Þnh nghÜa trong mét dÊu ngoÆc kÐp .
VÝ dô : "A" , " hold time error ", " x " ....
3.5.1.4. KiÓu BIT .
KiÓu bit lµ kiÓu m« t¶ hai gi¸ trÞ rêi r¹c b»ng viÖc sö dông c¸c ch÷ ký tù
'0' vµ '1'. §«i khi c¸c kiÓu Bit nµy ® îc dïng ®Ó t¹o ra kiÓu ch÷ bit mét c¸ch
têng minh dïng ®Ó ph©n biÖt chóng víi c¸c kiÓu ký tù.
VÝ dô : '1' , ' 0 ' , bit' ('1')
3.5.1.5. KiÓu BIT_VECTOR .
KiÓu bit_vector lµ mét m¶ng c¸c bit mµ chóng ® îc ®Æt trong dÊu
ngoÆc kÐp .
VÝ dô : "01001111000" , x"00FFF0" , b"100010101" , o"277756"...
Trong vÝ dô trªn ch÷ 'x' ® îc dïng ®Ó diÔn t¶ c¸c gi¸ trÞ sè hexa, cßn 'b'
®îc dïng ®Ó m« t¶ kiÓu binary, cßn 'o' ® îc dïng cho hÖ ®Õm c¬ sè 8.
3.5.1.6. KiÓu ch÷ trong ®ãng gãi chuÈn STD_LOGIC.
KiÓu ch÷ logic chuÈn lµ mét trong 9 gi¸ trÞ ® îc ®Þnh nghÜa trong ®ãng
gãi chuÈn vµ ® îc ®a ra d íi d¹ng c¸c ch÷ in hoa vµ ®Æt trong dÊu ngoÆc
®¬n .
VÝ dô : ' U ' kh«ng trïng víi ' u '
' X ' , ' 0 ' , ' 1 ' , ' Z ' , ' W ' , ' L ' , ' H ' , ' _ '
3.5.1.7. KiÓu ch÷ STD_LOGIC_VECTOR.
Mét kiÓu ch÷ STD_LOGIC_VECTOR thùc chÊt lµ mét m¶ng bao gåm
c¸c phÇn tö cña kiÓu std_logic vµ ® îc ®Æt trong dÊu ngoÆc kÐp.
VÝ dô : " 10_1Z" , " UUUUU " , signed("1011 ").....
3.5.1.8. KiÓu Boolean .
KiÓu Boolean ®îc dïng ®Ó m« t¶ hai gi¸ trÞ rêi r¹c, ®ã lµ kiÓu true vµ
false.
VÝ dô : true , false , True , TRUE, FALSE ...
3.5.1.9. KiÓu sè thùc .
KiÓu sè thùc lµ kiÓu ®îc dïng ®Ó diÔn t¶ c¸c sè thùc n»m trong kho¶ng
tõ -1.0E+38 ®Õn +1.0E+38.
Mét kiÓu sè häc cã thÓ lµ kiÓu d ¬ng hoÆc ©m nh ng chóng ph¶i cã dÊu
chÊm thËp ph©n .
VÝ dô : + 1.0 kh«ng ®îc viÕt '1' hoÆc 1 hoÆc ' 1.0 '
0.0 kh«ng ®îc viÕt 0
-1.0 , -1.0E+10.
3.5.1.10. KiÓu nguyªn .
Mét kiÓu nguyªn ® îc dïng ®Ó diÔn t¶ c¸c sè nguyªn n»m trong
kho¶ng tõ - 2,147,438,647 ®Õn + 2,147,438,647.
VÝ dô : +1 , 862 „ 862.0 , - 257 , + 123_456 , 16 # 00FF #.
Trong ®ã c¸c ký hiÖu ® îc dïng ®Ó ®Þnh nghÜa kiÓu nh sau: " C¬
sè_n # sè diÔn t¶ trong c¬ sè n ®ã", ë ®©y n n»m trong hÖ 2 ®Õn 16.
3.5.1.11. KiÓu TIME.
Mét kiÓu vËt lý duy nhÊt ® îc ®Þnh nghÜa tr íc trong ®ãng gãi chuÈn,
®ã lµ thêi gian time.
VÝ dô : 10 ns , 100 us , 6.3 ns ..... Chó ý phÇn sè ph¶i ® îc viÕt c¸ch
phÇn ®¬n vÞ ®o bëi mét kho¶ng trèng.
3.5.2. C¸c kiÓu ®Þnh danh:
KiÓu ®Þnh danh ®¬n thuÇn chØ lµ mét c¸i tªn do ng êi dïng ®Þnh nghÜa,
nã cã thÓ lµ tªn cña mét h»ng, mét biÕn hay mét tÝn hiÖu, mét Entity, mét
cæng, hay mét ch ¬ng tr×nh con, hay c¸c khai b¸o tham biÕn . Khi khai b¸o
mét tªn cÇn ph¶i khai b¸o ký tù ®Çu tiªn ph¶i kiÓu ch÷ ký tù, l u ý dÊu g¹ch
díi kh«ng ® îc phÐp ®øng sau cïng, c¸c tõ kho¸ cña VHDL kh«ng ® îc
dïng ®Ó lµm khai b¸o c¸c kiÓu ®Þnh danh, ch¼ng h¹n nh entity, port ....
VÝ dô : xyz = xYZ = XYZ = XyZ
S(3) phÇn tö thø ba cña m¶ng S
X3.
3.5.3.KiÓu INDEX.
KiÓu INDEX ® îc sö dông ®Ó chØ ra mét phÇn tö nµo ®ã trong mét
m¶ng. Có ph¸p sö dông cña khai b¸o nµy nh sau:
array_name (expression)
Víi array_name lµ mét tªn cña mét h»ng hay mét biÕn nµo ®ã n»m
trong mét m¶ng. Cßn expression ph¶i tr¶ vÒ gi¸ trÞ n»m trong d¶i chØ sè cña
m¶ng ®ã.
VÝ dô :
type memory is array ( 0 to 7 ) of INTEGER range 0 to 123;
variable DATA_ARRAY : memory;
variable ADDR : INTEGER range 0 to 7;
variable DATA: INTEGER range 0 to 123;
DATA:= DATA_ARRAY ( ADDR );
3.5.4. KiÓu Slice vµ ALIAS.
Mét khai b¸o Slice ® îc dïng ®Ó chØ ra mét sè phÇn tö cña m¶ng.
Híng cña nã cÇn ph¶i phï hîp víi h íng m¶ng. Alias ® îc dïng ®Ó t¹o ra
mét tªn míi cho tÊt c¶ c¸c hoÆc mét sè phÇn tö nµo ®ã n»m trong mét m¶ng.
VÝ dô : variable A1: BIT_VECTOR ( 7 downto 0 );
A2: = A1(5 downto 2) ;
Alias A3: BIT_VECTOR (0 to 3) is A1(7 downto 4);
( Cã nghÜa lµ A3(0) = A1(7), A3(1) = A1(6), A3(2) = A1(5), A3(3) = A1(4)
)
Alias A4: BIT is A1(3);
3.5.5. KiÓu thuéc tÝnh ATTRIBUTE:
LÊy c¸c thuéc tÝnh cu¶ mét biÕn hay mét tÝn hiÖu cña mét kiÓu cho
tríc nµo ®ã vµ tr¶ vÒ mét kiÓu gi¸ trÞ. D íi ®©y lµ c¸c kiÓu thuéc tÝnh
thêng dïng trong ng«n ng÷ VHDL:
- Left : Tr¶ vÒ chØ sè cña phÇn tö ë bªn tr¸i cïng cña mét kiÓu d÷ liÖu.
- Right : Tr¶ vÒ chØ sè cña phÇn tö ë bªn ph¶i cïng cña mét kiÓu d÷ liÖu.
- High : Tr¶ vÒ chØ sè cña phÇn tö cao nhÊt cña mét kiÓu d÷ liÖu.
- Low : Tr¶ vÒ chØ sè cña phÇn tö thÊp nhÊt cña mét kiÓu d÷ liÖu.
- Range : §îc dïng ®Ó lÊy vÒ d¶i cña chØ sè.
- Reverse_range : Dïng ®Ó x¸c ®Þnh d¶i chØ sè ng îc l¹i.
- Length : Tr¶ vÒ sè phÇn tö cña kiÓu BIT_VECTOR.
- Event : M« t¶ sù thay ®æi gi¸ trÞ cña tÝn hiÖu t¹i thêi ®iÓm m« pháng.
VÝ dô : variable A1 : BIT_VECTOR ( 10 downto 0 );
A1' left -- Tr¶ vÒ gi¸ trÞ lµ 10.
A1' right -- Tr¶ vÒ gi¸ trÞ 0.
A1' high -- Tr¶ vÒ gi¸ trÞ lµ 10.
A1' low -- Tr¶ vÒ gi¸ trÞ lµ 0.
A1' range -- Tr¶ vÒ lµ 10 downto 0.
A1' reverse_range -- Tr¶ vÒ gi¸ trÞ lµ 0 to 10.
A1' length -- Tr¶ vÒ gi¸ trÞ lµ 11.
3.5.6. KiÓu tËp hîp :
KiÓu tËp hîp cã thÓ ® îc dïng ®Ó g¸n gi¸ trÞ cho mét ®èi t îng thuéc
kiÓu m¶ng hoÆc kiÓu Record trong khi khëi t¹o khai b¸o hoÆc trong c¸c ph¸t
biÓu g¸n.
VÝ dô : type color_list ( red, orange, blue, white );
type color_array is array (color_list) of BIT_VECTOR ( 1 downto 0 );
variable X : color_array;
X := (" 00 " , " 01 " , " 10 " ," 11 " );
X := ( red => "00" , blue => "01" , orange => "10" , white => "11" );
Trong dßng thø hai, chóng ta ®Þnh nghÜa mét m¶ng mµ sè c¸c phÇn tö
cña chóng ( d¶i chØ sè ) ® îc ®a ra bëi color_list. Tõ color_list chóng ta cã
mét m¶ng gåm bèn phÇn tö vµ m¶ng color_array còng sÏ bao gåm bèn phÇn
tö, mµ mçi phÇn tö nµy l¹i ® îc ®Þnh nghÜa bëi kiÓu Bit_Vector. H¬n n÷a
chóng ta sö dông d¶i chØ sè cña m¶ng color_list sÏ cã d¶i tõ 0 ®Õn 3, v× viÖc
®Þnh nghÜa cña m¶ng nµy chØ chØ ra d¶i chØ sè chø kh«ng chØ ra kiÓu cña phÇn
tö trong m¶ng.
3.5.7. BiÓu thøc g¸n kiÓu :
BiÓu thøc g¸n kiÓu ® îc dïng ®Ó chØ ra kiÓu cña mét to¸n h¹ng nµo ®ã.
Có ph¸p cña chóng nh sau:
type_name' ( expression );
VÝ dô : type color1 is (red, orange, blue, white);
type color2 is (purple, green, red, black);
color2'(red);
Nh chóng ta thÊy to¸n h¹ng red cã c¶ trong hai kiÓu color1 vµ color2,
v× vËy nã cÇn ® îc ph¶i ®îc g¸n mét kiÓu d÷ liÖu râ rµng vµ ®iÒu nµy ® îc
thùc hiÖn bëi c©u lÖnh thø 3.
3.5.8. PhÐp chuyÓn ®æi kiÓu d÷ liÖu.
PhÐp chuyÓn ®æi kiÓu cho phÐp chuyÓn ®æi c¸c kiÓu cã kiÓu d÷ liÖu gÇn
gièng nhau.
VÝ dô : signal X : STD_LOGIC_VECTOR ( 3 downto 0 );
signal Y : STD_ULOGIC_VECTOR ( 3 downto 0 );
Y <= STD_ULOGIC_VECTOR (X);
Sau c©u lÖnh thø ba Y sÏ nhËn kiÓu STD_ULOGIC_VECTOR.
3.6. C¸c ph¸t biÓu tuÇn tù .
Ph¸t biÓu tuÇn tù chØ ra sù thùc hiÖn tõng b íc cña mét qu¸ tr×nh.
Chóng thùc hiÖn tõ c©u lÖnh ®Çu tiªn, c©u lÖnh thø hai, ... c©u lÖnh cuèi cïng.
C¸c ph¸t biÓu n»m trong mét ph¸t biÓu qu¸ tr×nh ( Ph¸t biÓu Process ) ®îc
gäi lµ ph¸t biÓu tuÇn tù . C¸c ph¸t biÓu sau ®©y lµ c¸c ph¸t biÓu tuÇn tù ® îc
®Þnh nghÜa trong VHDL:
- C¸c ph¸t biÓu g¸n biÕn Variable.
- C¸c ph¸t biÓu g¸n tÝn hiÖu Signal.
- C¸c ph¸t biÓu if.
- C¸c ph¸t biÓu Case.
- C¸c ph¸t biÓu Null.
- C¸c ph¸t biÓu x¸c nhËn ASSERTION.
- C¸c ph¸t biÓu vßng lÆp Loop.
- C¸c ph¸t biÓu NEXT.
- C¸c ph¸t biÓu EXIT.
- C¸c ph¸t biÓu WAIT.
- C¸c ph¸t biÓu Procedure.
- C¸c ph¸t biÓu RETURN.
3.6.1. Ph¸t biÓu g¸n biÕn .
Dïng ®Ó thay thÕ gi¸ trÞ hiÖn thêi cña biÕn víi mét gi¸ trÞ míi, gi¸ trÞ
míi nµy ®îc chØ ra bëi mét biÓu thøc. BiÕn cã thÓ ® îc khai b¸o vµ sö dông
bªn trong mét ph¸t biÓu qu¸ tr×nh hay cßn ® îc gäi lµ ph¸t biÓu Process. Mét
biÕn ®îc g¸n mét gi¸ trÞ sö dông th«ng qua ph¸t biÓu g¸n biÕn, mµ ph¸t
biÓu nµy cã h×nh thøc nh sau:
target_variable : = expression;
Lu ý c¸c biÕn ® îc khai b¸o trong mét Process kh«ng thÓ chuyÓn gi¸
trÞ ra ngoµi Process, ®iÒu ®ã cã nghÜa lµ chóng chØ ® îc cÊp ph¸t trong
Process hoÆc trong ch ¬ng tr×nh con.
VÝ dô vÒ phÐp g¸n biÕn trong mét Process.
BiÓu thøc ® îc x¸c ®Þnh gi¸ trÞ khi ph¸t biÓu ® îc thùc thi vµ gi¸ trÞ
BiÕn ®îc t¹o t¹i thêi ®iÓm s¶n sinh vµ duy tr× gi¸ trÞ cña nã
trong suèt thêi gian ch¹y ch ¬ng tr×nh. Do v× mét qu¸ tr×nh kh«ng bao
giê ®îc tho¸t ra trong mçi tr¹ng th¸i ho¹t ®éng cña nã, nghÜa lµ chóng
®îc thùc thi, hoÆc ë trong mét tr¹ng th¸i chê. NÕu ë tr¹ng th¸i chê th×
chóng ph¶i chê cho ®Õn khi mét sù kiÖn kh¸c ch¾c ch¾n x¶y ra. Mét
qu¸ tr×nh b¾t ®Çu thùc hiÖn t¹i ®iÓm khëi ®Çu cña mét qu¸ tr×nh m«
pháng, t¹i thêi ®iÓm nµy nã ®îc thùc thi cho ®Õn khi gÆp mét ph¸t biÓu
wait hoÆc gÆp c¸c thµnh phÇn ® îc khai b¸o trong danh môc cÇn ® îc
xö lý khai b¸o trong Process.
®îc tÝnh to¸n sÏ ®îc g¸n cho biÕn mét c¸ch tøc thêi.
Xem thÝ dô vÒ ph¸t biÓu Process nh sau:
VÝ dô 1 :
EVENT_ON_A : = EVENT_ON_A +1;
variable A, B : INT6; constant C : INT16 : = 100;
A := S1 +1 ; B : = S2*2 - C; GT <= A > B;
process(A) variable EVENT_ON_A : INTEGER : = -1; begin end process; VÝ dô 2: Subtype INT16 is INTEGER range 0 to 65536; Signal S1, S2 : INT16; Signal GT : BOOLEAN; process (S1, S2) Begin End Process; T¹i lóc b¾t ®Çu cña qu¸ tr×nh m« pháng. Qu¸ tr×nh ® îc thùc thi mét
lÇn. BiÕn EVENT_ON_A ® îc g¸n gi¸ trÞ -1 sau ®ã t¨ng lªn 1. Sau ®ã, thêi
®iÓm bÊt kú x¶y ra, sù kiÖn trªn tÝn hiÖu A, qu¸ tr×nh cã hiÖu lùc vµ ph¸t biÓu
g¸n biÕn ®¬n ® îc thùc thi. Nã lµm cho biÕn EVENT_ON_A t¨ng lªn mét.
T¹i thêi ®iÓm kÕt thóc cña qu¸ tr×nh m« pháng, biÕn EVENT_ON_A chøa
tæng sè sù kiÖn x¶y ra trªn tÝn hiÖu A.
Mét thÝ dô kh¸c cña ph¸t biÓu qu¸ tr×nh :
V1:=A-V2; -- statement 1 Z<= -V1; -- statement 2 V2:= Z+V1*2; -- statement 3
signal A, Z:INTEGER; . . . PZ: process(A); -- PZ lµ nh·n cña qu¸ tr×nh variable V1,V2 : INTEGER; begin end process PZ; Gi¶ sö mét sù kiÖn x¶y ra trªn tÝn hiÖu A t¹i thêi ®iÓm T1 vµ biÕn V2
®îc g¸n gi¸ trÞ lµ 10, trong ph¸t biÓu thø 3, sau ®ã mét sù kiÖn x¶y ra trªn
tÝn hiÖu A t¹i thêi ®iÓm T2, gi¸ trÞ cña V2 ® îc sö dông trong ph¸t biÓu 1 sÏ
còng lµ 10. Mét biÕn còng cã thÓ ® îc khai b¸o bªn ngoµi mét qu¸ tr×nh
hoÆc mét ch ¬ng tr×nh con. Mét biÕn cã thÓ ® îc ®äc vµ cËp nhËt bëi mét
hoÆc cã thÓ nhiÒu qu¸ tr×nh, nh÷ng biÕn nµy ® îc gäi lµ shared variable
(BiÕn chia sÎ).
3.6.2. Ph¸t biÓu g¸n tÝn hiÖu.
Ph¸t biÓu g¸n tÝn hiÖu sÏ thay thÕ gi¸ trÞ hiÖn t¹i cña tÝn hiÖu víi mét gi¸
trÞ míi bëi viÖc sö dông mét biÓu thøc.
TÝn hiÖu vµ kÕt qu¶ cña biÓu thøc cÇn cã cïng mét kiÓu d÷ liÖu. Có
ph¸p cña chóng nh sau:
target_signal <= [ Transport] expression [after time_expression]
Ph¸t biÓu g¸n tÝn hiÖu cã thÓ xuÊt hiÖn bªn trong hoÆc bªn ngoµi mét
qu¸ tr×nh. NÕu nã x¶y ra bªn ngoµi cña mét qu¸ tr×nh, nã ® îc xem lµ mét
ph¸t biÓu g¸n tÝn hiÖu ®ång thêi.
Khi ph¸t biÓu g¸n tÝn hiÖu xuÊt hiÖn bªn trong qu¸ tr×nh, nã ® îc xem
nh lµ mét ph¸t biÓu g¸n tÝn hiÖu cã thø tù vµ nã ® îc thùc thi tuÇn tù theo
thø tù cña nh÷ng ph¸t biÓu tuÇn tù kh¸c xuÊt hiÖn bªn trong qu¸ tr×nh.
VÝ dô phÐp g¸n tÝn hiÖu trong mét Process (Víi A,B,C,D lµ c¸c tÝn
hiÖu):
Xem vÝ dô sau : Gi¶ sö ta cã mét process vµ biÓu ®å nh sau
S
4
3
1
t
1 ns
3 ns
4 ns
5 ns
VÝ dô : .......... process (.....) Begin S <= transport 1 after 1 ns, 3 after 3 ns, 5 after 5 ns; S <= transport 4 after 4 ns; end process; Nh vÝ dô vµ biÓu ®å trªn ta thÊy c«ng viÖc thø t cÇn thùc hiÖn tr íc
c«ng viÖc thø 5, nh ng trong phÇn ch ¬ng tr×nh th× ph¸t biÓu cña c«ng viÖc
thø 5 l¹i ® îc thùc hiÖn tr íc c«ng viÖc thø t . H×nh vÏ d íi ®©y m« t¶ ph¸t
biÓu Transport, sau 3s ®Ìn sÏ ® îc bËt s¸ng vµ s¸ng trong kho¶ng thêi gian
®óng b»ng thêi gian bËt c«ng t¾c.
b.Inertial Delay.
Inertial Delay ( GÜ chËm do qu¸n tÝnh ), lµ gi¸ trÞ mÆc ®Þnh cña
VHDL. Nã ® îc dïng cho c¸c thiÕt bÞ mµ kh«ng cã ph¶n øng cho ®Õn khi
®Çu vµo ®îc phÐp trong mét kho¶ng thêi gian nhÊt ®Þnh. Th êng th× víi tÝn
hiÖu cã kho¶ng thêi gian t¸c ®éng kh«ng ®Òu vµ nhá h¬n thêi gian gi÷ chËm
cña c¸c cæng th× sÏ bÞ bá qua.
Víi vÝ dô trªn, m« t¶ ho¹t ®éng cña ®Ìn víi ®é gi÷ chËm do søc × qu¸n
tÝnh cña m¹ch. NÕu thêi gian t¸c ®éng cña c«ng t¾c nhá h¬n ®é gi÷ chËm cña
m¹ch th× ®Çu ra sÏ kh«ng cã t¸c ®éng hay ®Ìn sÏ kh«ng ® îc bËt s¸ng. Gi¶
sö ta cã c©u lÖnh ®Ìn sÏ ® îc bËt s¸ng sau 3 gi©y, nh ng c«ng t¾c chØ t¸c
®éng trong thêi gian hai gi©y th× ®Ìn sÏ kh«ng ® îc bËt s¸ng. Xem h×nh vÏ
díi ®©y:
Gi¶ sö ta cã c©u lÖnh bËt ®Ìn sau 3s. Khi bËt c«ng t¾c trong thêi gian 4s
sau ®ã t¾t c«ng t¾c, th× ®Ìn sÏ ® îc s¸ng sau khi c«ng t¾c bËt ® îc 3s vµ s¸ng
trong 4s ®óng b»ng thêi gian bËt c«ng t¾c.
Xem h×nh díi ®©y:
c. So s¸nh INERTIAL DELAY vµ TRANSPORT DELAY.
Inertial Delay
Transport Delay
S <= A after 20 ns
S <= Transport A after 20 ns
A
A
S
S
10ns
20ns
30ns
40ns
10ns
20ns
30ns
40ns
Nh trªn h×nh ta thÊy trong tr êng hîp Inertial Delay, tÝn hiÖu A cã t¸c
®éng trong kho¶ng 10ns, nh ng c©u lÖnh thùc hiÖn ®Çu ra S sau 20ns, v× vËy
®Çu ra S sÏ kh«ng cã t¸c ®éng. Cßn trong tr êng hîp Transport Delay tÝn
hiÖu ®Çu ra sÏ ® îc sao y tÝn hiÖu ®Çu vµo sau khi b¾t ®Çu s ên lªn cña tÝn
hiÖu vµo cã t¸c ®éng ( §óng b»ng kho¶ng 20 ns cña c©u lÖnh ).
3.6.3. C¸c ph¸t biÓu IF.
Mét ph¸t biÓu if ® îc dïng ®Ó chän lùa nh÷ng ph¸t biÓu tuÇn tù cho
viÖc thùc thi dùa trªn gi¸ trÞ cña biÓu thøc ®iÒu kiÖn. BiÓu thøc ®iÒu kiÖn ë
®©y cã thÓ lµ mét biÓu thøc bÊt kú mµ gi¸ trÞ cña chóng ph¶i lµ kiÓu luËn lý.
D¹ng th«ng thêng cña ph¸t biÓu if lµ:
if boolean-expression then
sequential-statements
{elsif boolean-expression then
sequential -statement }
{else
sequential-statement}
enf if;
VÝ dô1: if sum <=100 then --“<=” is less-than-or-equal-to operator. SUM:=SUM+10; end if; VÝ dô 2: signal IN1, IN2, OU : STD_LOGIC;
process (IN1, IN2)
begin
if IN1 = '0' or IN2 = '0' then
OU <= '0' ;
elsif IN1 = 'X' or IN2 = 'X' then
OU <= '1';
else
OU <= '1' ;
end if;
end process;
VÝ dô 3:
3.6.4. Ph¸t biÓu CASE.
D¹ng cña ph¸t biÓu case lµ:
case expression is
when choices => sequential -statement -- branch 1
when choices => sequential -statement -- branch 2
-- -- Cã thÓ cã nhiÒu nh¸nh
{when others => sequential-statement } -- last branch
end case;
Ph¸t biÓu case lùa chän mét trong nh÷ng nh¸nh cho viÖc thùc thi dùa
trªn gi¸ trÞ cña biÓu thøc. Gi¸ trÞ biÓu thøc ph¶i thuéc kiÓu rêi r¹c hoÆc kiÓu
m¶ng mét chiÒu. C¸c chän lùa ( Choices ) cã thÓ ® îc diÔn t¶ nh mét gi¸ trÞ
®¬n, hoÆc mét d¶i gi¸ trÞ b»ng viÖc sö dông dÊu " | " hoÆc sö dông mÖnh ®Ò
kh¸c. TÊt c¶ c¸c gi¸ trÞ cã thÓ cã cña biÓu thøc ph¶i ® îc thÓ hiÖn trong ph¸t
biÓu case ®óng mét lÇn. C¸c mÖnh ®Ò kh¸c cã thÓ ® îc sö dông ®Ó bao qu¸t
tÊt c¶ c¸c gi¸ trÞ, vµ nÕu cã, ph¶i lµ nh¸nh cuèi cïng trong ph¸t biÓu case.
Mçi mét chän lùa ph¶i cã cïng kiÓu víi kiÓu cña biÓu thøc. Mét thÝ dô cho
ph¸t biÓu case:
-- branch1
-- branch3 -- branch4
VÝ dô 1: type WEEK_DAY is (MON, TUE, WED, THU, FRI, SAT, SUN); type DOLLARS is range 0 to 10; variable DAY: WEEK_DAY; variable POCKET_MONEY: DOLLARS; case DAY is when TUE => POCKET_MONEY :=6; when MON | WED => POCKET_MONEY :=2; -- branch2 when FRI to SUN => POCKET_MONEY :=7; when others => POCKET_MONEY :=0; end case; Nh¸nh 2 ® îc chän nÕu DAY cã gi¸ trÞ lµ MON hoÆc WED. Nh¸nh 3
bao gåm c¸c gi¸ trÞ FRI, SAT vµ SUN. Trong khi nh¸nh 4 gåm c¸c gi¸ trÞ
cßn l¹i, THU. Ph¸t biÓu case còng lµ ph¸t biÓu tuÇn tù, tuy nhiªn nã còng cã
thÓ ®îc ph¸t biÓu xÕp lång nhau.
VÝ dô 2:
3.6.5. Ph¸t biÓu NULL.
Ph¸t biÓu null
Lµ mét ph¸t biÓu tuÇn tù kh«ng g©y ra bÊt kú hµnh ®éng nµo; HÖ thèng
sÏ bá qua ph¸t biÓu NULL vµ tiÕp tôc thùc thi víi ph¸t biÓu kÕ tiÕp. Mét thÝ
dô cho viÖc sö dông ph¸t biÓu nµy lµ trong ph¸t biÓu if hoÆc trong ph¸t biÓu
case.
B:= A;
VÝ dô : Variable A, B : INTEGER range 0 to 31 ; Case A is when 0 to 12 => when others => Null; End Case; 3.6.6. Ph¸t biÓu x¸c nhËn ASSERTION.
Ph¸t biÓu x¸c nhËn rÊt hay dïng cho viÖc kiÓm tra thêi gian vµ c¸c ®iÒu
kiÖn ngoµi d¶i.
VÝ dô : assert (X >3 ) report " Setup violation" severity warning; 3.6.7. Ph¸t biÓu Loop.
Mét ph¸t biÓu lÆp ® îc sö dông ®Ó lÆp l¹i mét lo¹t c¸c c©u lÖnh tuÇn tù.
Có ph¸p cña ph¸t biÓu lÆp lµ:
[loop-label:] iteration-scheme loop
sequential-statements
end loop [loop-lebel];
Cã 3 kiÓu s¬ ®å lÆp. §Çu tiªn lµ s¬ ®å lÆp cã d¹ng:
for identifier in range
VÝ dô 1: VÝ dô vÒ For ...Loop
FACTORAL:=1;
for NUMBER in 2 to N loop
FACTORAL :=FACTORAL*NUMBER;
enf loop;
Trong thÝ dô nµy, th©n cña vßng lÆp thùc thi N-1 lÇn, víi ®Þnh danh lÆp
lµ NUMBER vµ t¨ng lªn 1 sau mçi vßng lÆp. §èi t îng NUMBER ®îc khai
b¸o Èn trong vßng lÆp tïy thuéc vµo kiÓu integer, nã cã gi¸ trÞ tõ 2 ®Õn N. V×
vËy khai b¸o kh«ng râ rµng cho ®Þnh danh vßng lÆp lµ ®iÒu cÇn thiÕt, ®Þnh
danh vßng lÆp còng kh«ng thÓ ® îc g¸n cho bÊt kú gi¸ trÞ nµo trong vßng lÆp
for. NÕu mét biÕn kh¸c cã cïng tªn ® îc t¹o bªn ngoµi vßng lÆp for, ®ã lµ
hai lo¹i biÕn ® îc gi¶i quyÕt riªng rÏ vµ biÕn sö dông trong vßng lÆp for sÏ
chuyÓn giao cho ®Þnh danh vßng lÆp. Vïng cña vßng lÆp FOR còng cã thÓ lµ
vïng cña mét kiÓu liÖt kª.
VÝ dô 2: type HEXA is (‘0’,’1’,’2’,’3’,’A’,’B’,’C ’); . . . .
for NUM in HEXA’(‘2’) downto HEXA’(‘0’) loop
-- Num sÏ lÊy nh÷ng gi¸ trÞ trong kiÓu HEXA tõ 2 cho ®Õn 0. end loop; VÝ dô 3: VÝ dô vÒ While .... loop
3.6.8. Ph¸t biÓu Next.
Ph¸t biÓu next còng lµ ph¸t biÓu liªn tôc còng chØ cã thÓ sö dông bªn
trong vßng lÆp. Có ph¸p t¬ng tù nh ph¸t biÓu exit:
next [loop-label][when condition];
KÕt qu¶ cña ph¸t biÓu next sÏ bá qua nh÷ng ph¸t biÓu cßn l¹i trong lÇn
lÆp hiÖn t¹i cña vßng lÆp vµ tiÕp tôc thùc thi víi ph¸t biÓu ®Çu tiªn trong vßng
lÆp kÕ tiÕp. NÕu tån t¹i mét lÇn vµ nÕu nh·n vßng lÆp kh«ng râ rµng th× sÏ
x¶y ra hiÖn t îng lÆp ®Õn v« cïng. §èi lËp víi ph¸t biÓu exit, nã lµ nguyªn
nh©n cña vßng lÆp bÞ giíi h¹n.
VÝ dô 1:
for j in 10 downto 5 loop if SUM < TOTAL_SUM then SUM:=SUM +2; elsif SUM:= TOTAL_SUM then next; else
null; end if; K:=K+1; end loop; Khi ph¸t biÓu next ® îc thùc thi, qu¸ tr×nh thùc hiÖn sÏ nh¶y ®Õn phÇn
cuèi cña vßng lÆp (ph¸t biÓu cuèi cïng K: =K+1) sau ®ã gi¶m gi¸ trÞ cña
®Þnh danh vßng lÆp j, vµ thùc hiÖn l¹i tõ ®Çu.
VÝ dô 2:
3.6.9. Ph¸t biÓu EXIT.
Ph¸t biÓu exit lµ mét ph¸t biÓu tuÇn tù nã chØ cã thÓ sö dông bªn trong
vßng lÆp. Nã cã thÓ lµm cho qu¸ tr×nh thùc hiÖn nh¶y ®Õn vßng lÆp trong
cïng hoÆc ra khái vßng ®Õn vÞ trÝ cña nh·n x¸c ®Þnh nµo ®ã khi nã gÆp nh·n
nµy trong vßng lÆp. Có ph¸p cña mét ph¸t biÓu exit lµ:
NÕu nh·n vßng lÆp kh«ng ®îc chØ ra th× qu¸ tr×nh thùc hiÖn sÏ lÆp
®Õn vßng lÆp trong cïng. NÕu mÖnh ®Ò WHEN ® îc sö dông th× viÖc
tån t¹i vßng lÆp chØ x¶y ra nÕu ®iÒu kiÖn lµ ®óng. Ng îc l¹i, viÖc thùc
exit [loop-label][when condition]
hiÖn sÏ tiÕp tôc víi ph¸t biÓu kÕ tiÕp.
VÝ dô :
exit L3; -- Thùc hiÖn exit khái L3 nÕu Sum> 100
SUM :=1; J:=0 ; L3: loop J:=J+21; SUM:=SUM*10 if (SUM >100) then enf if; end loop L3; 3.6.10. Ph¸t biÓu WAIT.
Nh chóng ta ®· thÊy, mét qu¸ tr×nh m« pháng cã thÓ tr× ho·n (Hay treo
sù thùc hiÖn cña mét ph¸t biÓu Process hoÆc mét ch ¬ng tr×nh con ) cho ®Õn
khi gÆp mét ®iÒu kiÖn phï hîp. Cã 3 h×nh thøc c¬ b¶n cña ph¸t biÓu wait.
wait on sensitivity-list;
wait until boolean -expression ;
wait for time-expression;
VÝ dô 1: wait on A,B ; wait until A = B; wait for 10 ns; wait on CLOCK for 20 ns ; wait until SUM >100 for 50 ms;
Sù hiÖn diÖn cña sensitivity list trong mét qu¸ tr×nh trïng víi tr êng hîp mét
trong ba trêng hîp trªn cña ph¸t biÓu “ wait ”. Mét ph¸t biÓu qu¸ tr×nh cã
wait on ë cuèi cña Process t ¬ng ®¬ng víi mét ph¸t biÓu qu¸ tr×nh cã khai
b¸o sensitivity-list.
Xem h×nh díi ®©y: Hai process nµy lµ t ¬ng ®¬ng nhau.
VÝ dô 2 :
process -- Kh«ng sensitivity list variable TEMP1, TEMP2:BIT; begin TEMP1:=A and B; TEMP2:=C and D; TEMP1:=TEMP1 or TEMP2; Z<= not TEMP1; wait on A, B, C, D; -- Thay thÕ cho sensitivity-list ë®Çu Process . End process. VÝ dô 3: Hai Process trong vÝ dô d íi ®©y chØ ra hai process cã ph¸t
biÓu Wait on. Process bªn tr¸i sÏ lµm cho Process treo ngay sau khi Start vµ
chê cho ®Õn khi cã sù kiÖn xuÊt hiÖn trªn tÝn hiÖu SigA. Cßn Process bªn
ph¶i sÏ thùc hiÖn ba c©u lÖnh vµ sau ®ã r¬i vµo tr¹ng th¸i chê ®Õn khi xuÊt
hiÖn sù kiÖn trªn tÝn hiÖu SigB.
3.6.11. C¸c lêi gäi ch¬ng tr×nh con.
Khi m« t¶ thiÕt kÕ theo kiÓu ho¹t ®éng hµnh vi, c¸c ch ¬ng tr×nh con
thêng hay ®îc sö dông vµ ® a ra c¸ch thøc sö dông thuËn tiÖn. Cã hai lo¹i
ch¬ng tr×nh con hay ®îc sö dông lµ Hµm vµ Thñ tôc.
- Thñ tôc ( Procedure) tr¶ vÒ nhiÒu gi¸ trÞ.
- Hµm ( Function ) tr¶ vÒ mét gi¸ trÞ ®¬n.
C¸c lêi gäi thñ tôc sÏ gäi thñ tôc mµ nã cÇn ® îc thùc hiÖn trong mét
qu¸ tr×nh. Ph¸t biÓu tr¶ vÒ ( return ) sÏ lµ ®iÓm kÕt thóc mét ch ¬ng tr×nh
con, vµ nã chØ ® îc sö dông trong mét hµm hoÆc mét thñ tôc. §èi víi hµm
th× nã cã qui ®Þnh víi ph¸t biÓu tr¶ vÒ trong th©n hµm, nh ng víi thñ tôc th×
cã thÓ sö dông tuú ý trong th©n thñ tôc. Có ph¸p cña ph¸t biÓu tr¶ vÒ nh sau:
return [expression];
ë ®©y expression sÏ ® a ra c¸c gi¸ trÞ tr¶ vÒ cña hµm, ph¸t biÓu return
trong mét hµm cÇn ph¶i cã mét biÓu thøc vµ gi¸ trÞ tr¶ vÒ cña nã, nh ng ®èi
víi ph¸t biÓu tr¶ vÒ trong thñ tôc th× kh«ng cÇn ph¶i cã mÆt cña biÓu thøc.
Mét hµm cã thÓ cã nhiÒu h¬n mét ph¸t biÓu tr¶ vÒ, nh ng chØ cã mét ph¸t
biÓu tr¶ vÒ ®îc sö dông bëi mét lêi gäi hµm.
3.7. C¸c ph¸t biÓu ®ång thêi.
C¸c ph¸t biÓu ®ång thêi ® îc thùc hiÖn song song trong cïng thêi ®iÓm
m« pháng, chóng kh«ng thùc hiÖn theo thø tù mµ chóng ® îc viÕt ra trong
mét kiÕn tróc. C¸c ph¸t biÓu ®ång thêi chuyÓn th«ng tin th«ng qua c¸c
®êng tÝn hiÖu.
Díi ®©y lµ c¸c ph¸t biÓu ®ång thêi ® îc ®Þnh nghÜa trong VHDL:
- C¸c ph¸t biÓu g¸n cña mét qu¸ tr×nh (Process).
- C¸c ph¸t biÓu g¸n tÝn hiÖu ®ång thêi .
- C¸c ph¸t biÓu g¸n tÝn hiÖu ®iÒu kiÖn.
- C¸c ph¸t biÓu g¸n tÝn hiÖu ® îc chän lùa.
- C¸c ph¸t biÓu Block.
- C¸c lêi gäi thñ tôc ®ång thêi.
- C¸c ph¸t biÓu x¸c nhËn ®ång thêi.
3.7.1. Ph¸t biÓu Process .
Ph¸t biÓu process lµ ph¸t biÓu bao gåm mét tËp c¸c ph¸t biÓu tuÇn tù vµ
ph¸t biÓu process l¹i chÝnh lµ ph¸t biÓu ®ång thêi. Cã nghÜa lµ tÊt c¶ c¸c ph¸t
biÓu Process trong mét thiÕt kÕ ® îc thùc hiÖn mét c¸ch ®ång thêi. Tuy
nhiªn t¹i mét thêi ®iÓm nhÊt ®Þnh ® îc ®a ra chØ cã mét ph¸t biÓu tuÇn tù
®îc thùc hiÖn trong mçi process. Mét Process ® îc kÕt nèi víi phÇn cßn l¹i
cña thiÕt kÕ bëi viÖc ®äc hoÆc viÕt ra c¸c gi¸ trÞ tõ c¸c tÝn hiÖu vµ c¸c cæng
mµ chóng ®· ®îc khai b¸o phÝa ngoµi Process. Có ph¸p cña chóng ® îc viÕt
nh sau:
[label:] process [(sensitivity_list)]
{process_declaration_part }
begin
{sequential_statements }
end process [label];
PhÇn khai b¸o cña mét process chØ ra c¸c ®èi t îng mµ vïng ho¹t ®éng
cña nã chØ thuéc vïng cña mét process vµ chóng cã thÓ lµ c¸c ®èi t îng sau
®©y:
- Khai b¸o biÕn .
- Khai b¸o h»ng .
- Khai b¸o c¸c kiÓu.
- Khai b¸o c¸c kiÓu con.
- Khai b¸o c¸c bÝ danh Alias.
- C¸c mÖnh ®Ò USE.
Mét sensitivity list ( TËp c¸c sù kiÖn thay ®æi tr¹ng th¸i cÇn xö lý trong
mét qu¸ tr×nh ) cã cïng ý nghÜa víi mét Process cã chøa ph¸t biÓu wait, mµ
ph¸t biÓu wait nµy lµ ph¸t biÓu cuèi cïng trong mét process vµ chóng cã
d¹ng sau: Wait on sensitivity list ;
Mét process cã chøc n¨ng gièng nh mét vßng lÆp v« h¹n mµ trong nã
cã chøa toµn bé c¸c ph¸t biÓu tuÇn tù ® îc chØ ra trong vßng lÆp ®ã. V× vËy
mét ph¸t biÓu process cÇn ph¶i cã hoÆc mét sensitivity list hoÆc mét ph¸t
biÓu wait on hoÆc c¶ hai.
VÝ dô 1:
architecture A2 of example is
signal i1, i2, i3, i4, and_out, or_out : bit;
begin
pr1 : process (i1, i2, i3, i4)
begin
and_out <= i1 and i2 and i3 and i4;
end process pr1;
pr2 : process (i1, i2, i3, i4)
begin
or_out <= i1 or i2 or i3 or i4 ;
end process pr2;
end A2
VÝ dô 2:
3.7.2. C¸c phÐp g¸n tÝn hiÖu ®ång thêi.
Mét d¹ng kh¸c cña viÖc g¸n tÝn hiÖu ®ång thêi ®ã lµ c¸c phÐp g¸n tÝn
hiÖu ®ång thêi , c¸c phÐp g¸n nµy ® îc dïng ë bªn ngoµi cña mét process
nhng ph¶i n»m trong mét kiÕn tróc ( architecture ). Có ph¸p cña phÐp g¸n
nµy nh sau:
target_sinal <= expression [ after time_expression ];
T¬ng tù nh c¸c phÐp g¸n tÝn hiÖu tuÇn tù , mÖnh ®Ò after sÏ bÞ bá qua
bëi bé tæng hîp. Víi bÊt kú mét tÝn hiÖu nµo n»m bªn ph¶i cña mét phÐp g¸n
®Òu mang ý nghÜa t¬ng tù nh mét phÇn tö trong sensitivity list .
Mét th©n architecture cã thÓ chøa sè l îng bÊt kú cña nh÷ng ph¸t biÓu
g¸n tÝn hiÖu ®ång thêi. V× chóng lµ nh÷ng ph¸t biÓu ®ång thêi nªn thø tù cña
nh÷ng ph¸t biÓu lµ kh«ng quan träng. Nh÷ng ph¸t biÓu g¸n tÝn hiÖu ®ång
thêi ®îc thùc thi bÊt cø khi nµo cã sù kiÖn x¶y ra trong tÝn hiÖu ® îc sö
dông trong biÓu thøc.
VÝ dô1 :
architecture A1 of example is
signal i1, i2, i3, i4, and_out, or_out : bit;
begin
and_out <= i1 and i2 and i3 and i4;
or_out <= i1 or i2 or i3 or i4;
end A1;
VÝ dô 2:
architecture A2 of example is
signal i1, i2, i3, i4, and_out, or_out : bit;
begin
process (i1, i2, i3, i4)
begin
and_out <= i1 and i2 and i3 and i4;
end process ;
process (i1, i2, i3, i4)
begin
or_out <= i1 or i2 or i3 or i4 ;
end process ;
end A2
VÝ dô 3:
architecture A3 of example is
signal i1, i2, i3, i4, and_out, or_out : bit;
begin
process
begin
and_out <= i1 and i2 and i3 and i4;
or_out <= i1 or i2 or i3 or i4;
wait on i1, i2, i3, i4;
end A3;
Ba vÝ dô trªn ®©y lµ t¬ng ®¬ng nhau.
3.7.3. C¸c phÐp g¸n tÝn hiÖu cã ®iÒu kiÖn vµ c¸c phÐp g¸n tÝn
hiÖu ®îc chän lùa.
a. C¸c phÐp g¸n tÝn hiÖu cã ®iÒu kiÖn.
Mét phÐp g¸n tÝn hiÖu cã ®iÒu kiÖn chÝnh lµ mét ph¸t biÓu ®ång thêi vµ
cã mét ®Ých g¸n nhÊt ®Þnh, tuy nhiªn phÐp g¸n nµy cã thÓ cã nhiÒu h¬n mét
biÓu thøc cho mét ®Ých. Ngo¹i trõ biÓu thøc cuèi cïng, c¸c biÓu thøc cßn l¹i
ph¶i cã mét ®iÒu kiÖn ch¾c ch¾n, c¸c ®iÒu kiÖn nµy ® îc ®¸nh gi¸ theo thø
tù. NÕu mét ®iÒu kiÖn ® îc ®¸nh gi¸ lµ TRUE th× biÓu thøc t ¬ng øng ®îc
sö dông, ng îc l¹i c¸c biÓu thøc cßn l¹i sÏ ® îc sö dông. Nhí r»ng chØ mét
biÓu thøc ® îc sö dông t¹i mét thêi ®iÓm . Có ph¸p cña c©u lÖnh nµy nh
sau:
target <= {expression [ after time_expression ] when condition else}
expression [ after time_expression ];
Mét ph¸t biÓu g¸n tÝn hiÖu cã ®iÒu kiÖn cã thÓ ® îc m« t¶ bëi mét ph¸t
biÓu process mµ process cã chøa ph¸t biÓu IF. B¹n cã thÓ sö dông ph¸t biÓu
g¸n tÝn hiÖu cã ®iÒu kiÖn ë trong mét process .
VÝ dô 1:
architecture A1 of example is
signal a, b, c ,d : integer ;
begin
a <= b when ( d >10 ) else
c when ( d >5 ) else
d;
end A1;
VÝ dô 2:
architecture A2 of example is signal a, b, c ,d : integer ; begin
process (b, c, d)
begin
if ( d > 10) then
a <= b
elsif ( d >5 ) then
a <=c;
else
a <= d;
end if;
end process;
end A2;
VÝ dô 3: Sö dông c¸c ph¸t biÓu cã ®iÒu kiÖn.
b. C¸c phÐp g¸n tÝn hiÖu cã chän lùa.
PhÐp g¸n tÝn hiÖu cã chän lùa cã thÓ chØ mét ®Ých g¸n vµ còng chØ cã
mét biÓu thøc with. Gi¸ trÞ nµy ® îc kiÓm tra gièng nh ph¸t biÓu Case
th«ng thêng. Nã sÏ qu¶n lý bÊt cø sù thay ®æi nµo xuÊt hiÖn tíi c¸c tÝn hiÖu
®îc chän lùa. Có ph¸p cña chóng nh sau:
with choice_expression select
target <= {expression [after time_expression] when choices}
expression [ after time_expression] when choices;
BÊt kú phÐp g¸n tÝn hiÖu cã chän lùa nµo ®Òu cã thÓ ® îc m« t¶ t ¬ng
®¬ng bëi ph¸t biÓu process cã chøa ph¸t biÓu case. B¹n kh«ng ® îc sö dông
ph¸t biÓu g¸n tÝn cã chän lùa ë trong mét process .
VÝ dô 1:
with SEL select
Z <= a when 0 | 1 | 2, b when 3 to 10, c when others; VÝ dô 2 :
Z <= b;
when 0 | 1 | 2| => Z <= a; when 3 to 10 => when others => Z <= C;
case SEL is end case;
process ( SEL, a, b, c ) end process ; Hai vÝ dô trªn ®©y lµ hoµn toµn t ¬ng ®¬ng nhau.
3.7.4. C¸c ph¸t biÓu Block.
C¸c block cho phÐp ng êi thiÕt kÕ nhãm c¸c phÇn theo trËt tù logic cña
c¸c mÉu ®ång thêi, víi ®iÒu kiÖn lµ c¸c phÇn nµy kh«ng n»m trong l îc ®å
sö dông cña c¸c mÉu kh¸c ( c¸c mÉu mµ chóng ® îc sö dông ®Ó thay thÕ c¸c
thµnh phÇn kh¸c trong mét thiÕt kÕ ). C¸c block ® îc sö dông ®Ó tæ chøc c¸c
ph¸t biÓu g¸n ®ång thêi theo thø bËc. Có ph¸p cña chóng nh sau:
label : Block
{block_declarative_part}
begin
{concurrent_statement}
end block [label];
PhÇn khai b¸o block chØ ra c¸c ®èi t îng thuéc miÒn côc bé cña block
vµ cã thÓ lµ c¸c thµnh phÇn sau ®©y:
- Khai b¸o tÝn hiÖu.
- Khai b¸o h»ng.
- Khai b¸o kiÓu.
- Khai b¸o c¸c kiÓu con.
- Th©n c¸c ch¬ng tr×nh con
- Khai b¸o bÝ danh ALIAS
- C¸c mÖnh ®Ò use
- Khai b¸o c¸c thµnh phÇn ( Component).
C¸c ®èi tîng ®îc khai b¸o trong mét block chØ ® îc phÐp ho¹t ®éng
trong block ®ã vµ c¸c block vßng trong cña nã. Khi mét block con khai b¸o
mét ®èi t îng cã trïng tªn víi ®èi t îng trong block cha th× khai b¸o cña
block con sÏ ®Þnh nghÜa l¹i ®èi t îng trïng tªn víi block cha.
VÝ dô :
signal S : bit;
signal S : integer;
out 1 <= S ;
B1-1 : block begin end block B1-1;
out 2 <= S ;
architecture BHV of example is signal : out 1 : integer; signal : out 2 : bit; begin B1 : block begin end block B1; B2: block begin end block B2; end BHV;
Trong vÝ dô nµy ta thÊy block B1-1 lµ block con cña block B1. C¶ B1 vµ
B1-1 ®Òu khai b¸o tÝn hiÖu S. TÝn hiÖu S trong B1-1 sÏ lµ kiÓu integer vµ
truyÒn cho tÝn hiÖu out 1 còng lµ kiÓu integer, mÆc dï S ® îc khai b¸o trong
B1 lµ kiÓu Bit. TÝn hiÖu S trong B1 ® îc sö dông trong B2 lµ kiÓu Bit, trïng
víi kiÓu tÝn hiÖu out 2.
3.7.5. C¸c lêi gäi thñ tôc ®ång thêi.
Mét lêi gäi thñ tôc ®ång thêi chÝnh lµ mét lêi gäi thñ tôc mµ nã ® îc
thùc thi ë bªn ngoµi mét process, nã ®øng ®éc lËp trong mét kiÕn tróc
architecture. Lêi gäi thñ tôc ®ång thêi bao gåm :
- Cã c¸c tham sè IN, OUT, INOUT.
- Cã thÓ cã nhiÒu h¬n mét gi¸ trÞ tr¶ vÒ
- Nã ®îc xem nh mét ph¸t biÓu.
- Nã t¬ng ®¬ng víi mét process cã chøa mét lêi gäi thñ tôc ®¬n.
Hai vÝ dô díi ®ay lµ t¬ng ®¬ng nhau.
VÝ dô 1:
architecture .................
begin
procedure_any (a,b) ;
end..........;
VÝ dô 2:
architecture ................
Begin
process
begin
procedure_ any (a,b);
wait on a,b;
end process ;
end .............;
3.7.6. C¸c ch¬ng tr×nh con .
C¸c ch ¬ng tr×nh con bao gåm c¸c thñ tôc vµ c¸c hµm mµ nã cã thÓ
®îc gäi ®Ó thùc hiÖn c«ng viÖc nµo ®ã lÆp l¹i tõ c¸c vÞ trÝ gäi kh¸c nhau
trong VHDL. Trong VHDL cung cÊp hai kiÓu ch ¬ng tr×nh con kh¸c nhau
lµ:
- C¸c thñ tôc (Procedure).
- C¸c hµm ( Function ).
a. Hµm vµ c¸c ®Æc trng cña hµm.
- Chóng ®îc gäi vµ thùc hiÖn nh mét biÓu thøc.
- Lu«n tr¶ vÒ mét ®èi sè.
- TÊt c¶ c¸c tham sè cña hµm ®Òu ph¶i lµ chÕ ®é mode IN.
- TÊt c¶ c¸c tham sè cña hµm ph¶i thuéc líp c¸c tÝn hiÖu hoÆc c¸c h»ng.
- B¾t buéc ph¶i khai b¸o kiÓu cña gÝa trÞ tr¶ vÒ .
- Kh«ng ®îc chøa c¸c ph¸t biÓu Wait.
Có ph¸p cña hµm ®îc khai b¸o nh sau:
{subprogram_declarative_item}
{sequential_statement}
function identifier interface_list return type_mark is Begin end [identifier]; C¸c ®Þnh danh identifier chØ ra tªn cña mét hµm, cßn interface_list chØ
ra ®Þnh d¹ng tham sè cña mét hµm. Mçi mét tham sè ® îc ®Þnh nghi· theo
có ph¸p sau:
[class] name_list [mode] type_name [:=expression];
ë ®©y class cña tham sè ®èi t îng ph¶i ® îc chØ ra lµ tÝn hiÖu hoÆc
h»ng, cßn mode cña ®èi t îng cÇn ph¶i lµ mode in. NÕu kh«ng cã tham sè
mode ®îc chØ ra th× ® îc hiÓu nh lµ mode IN, cßn nÕu kh«ng cã tham sè
class ®îc chØ ra th× tham sè ®îc hiÓu nh lµ mét h»ng. Xem vÝ dô sau:
process
function c_to_f ( c : real ) return real is
variable f : real;
begin
f := c*9.0/5.0 + 32.0;
return (f);
end c_to_f;
variable temp : real;
begin
temp : = c_to_f (5.0) + 20.0; -- temp = 61
end process;
Tham sè chuyÓn vµo hµm ® îc hiÓu mÆc ®Þnh lµ mét h»ng sè, v× kh«ng
cã khai b¸o cña class.
b. Thñ tôc vµ c¸c ®Æc tr ng cña chóng.
- Chóng ®îc gäi nh mét lêi ph¸t biÓu.
- Cã thÓ tr¶ vÒ kh«ng hoÆc mét hoÆc nhiÒu ®èi sè.
- C¸c tham sè chuyÓn giao cho thñ tôc cã thÓ lµ mode in, out, vµ inout.
- C¸c tham sè chuyÓn giao cho thñ tôc cã thÓ lµ tÝn hiÖu, h»ng, biÕn.
- Cã thÓ cã chøa ph¸t biÓu Wait.
Có ph¸p khai b¸o thñ tôc nh sau:
procedure identifier interface_list is
{subprogram_declarative_item }
begin
{sequential_statement}
end [identifier];
Identifier ®îc sö dông ®Ó chØ ra tªn cña procedure vµ interface_list chØ
ra c¸c tham sè h×nh thøc cña procedure. Mçi tham sè ® îc sö dông theo ®Þnh
nghÜa sau:
[class] name_list [mode] type_name [:=expression];
Class cña ®èi t îng ®îc xem nh h»ng, biÕn , hoÆc lµ tÝn hiÖu vµ mode
cña ®èi t îng cã thÓ lµ in, out , inout. NÕu kh«ng cã mode ® îc chØ ra th×
tham sè ®îc hiÓu nh mode in, nÕu kh«ng cã class ® îc chØ ra th× c¸c tham
sè mode in ® îc hiÓu nh lµ c¸c h»ng, cßn tham sè mode out vµ inout ® îc
hiÓu nh lµ c¸c biÕn.
C¸c tham sè cã thÓ lµ c¸c h»ng, c¸c biÕn, hoÆc c¸c tÝn hiÖu vµ mode cña
chóng cã thÓ lµ in, out, hoÆc inout. NÕu líp cña c¸c tham sè kh«ng x¸c ®Þnh
râ rµng th× mÆc nhiªn nã lµ constant, nÕu nã lµ mode in, cßn nã lµ biÕn nÕu
mode cña tham sè ®ã lµ out hoÆc inout.
Mét vÝ dô th©n procedure m« t¶ hµnh vi ho¹t ®éng cña c¸c ®¬n vÞ logic
sè häc nh sau :
Z : out INTEGER; OP : in OP_CODE ;
type OP_CODE is ( ADD, SUB, MUL, DIV, LT, LE, EQ); … procedure ARITH_UNIT (A, B : in INTEGER ; ZCOMP : out BOOLEAN ) is begin case OP is when ADD => Z := A+B; when SUB => Z := A-B; when MUL => Z := A*B; when DIV => Z := A/B; when LT => ZCOMP := A ZCOMP := A<=B; when EQ => ZCOMP := A=B; end case ; end ARITH_UNIT; Ta xem mét vÝ dô kh¸c cña th©n mét procedure, procedure nµy quay vÐc
t¬ ®· ®îc x¸c ®Þnh víi tªn lµ ARRAY_NAME, b¾t ®Çu tõ bit START_BIT
tíi bit STOP_BIT, bëi mét gi¸ trÞ ROTATE_BY. Líp ®èi t îng cña tham sè
ARRAY_NAME ®îc x¸c ®Þnh mét c¸ch t êng minh. BiÕn FILL_VALUE
tù ®éng ®îc khëi t¹o vÒ ‘0’ mçi khi procedure ® îc gäi.
Procedure ROTATE_LEFT
(signal ARRAY_NAME : inout Bit_vector ;
START_BIT, STOP_BIT : in NATUAL;
ROTATE_BY : in POSITIVE ) is
Variable FILL_VALUE : BIT;
begin
assert STOP_BIT > START_BIT
report “STOP_BIT is not greater than START_BIT”
severity NOTE;
for MACVAR3 in 1 to ROTATE_BY loop
FILL_VALUE := ARRAY_NAME (STOP_BIT);
for MACVAR1 in STOP_BIT downto (START_BIT + 1) loop
ARRAY_NAME (MACVAR1) <= ARRAY_NAME (MACVAR1 –1);
end loop;
ARRAY_NAME (START_BIT) <= FILL_VALUE ;
end loop;
end procedure ROTATE_LEFT;
C¸c procedure ® îc gäi bëi lêi gäi procedure. Mét lêi gäi Procedure cã
thÓ lµ mét ph¸t biÓu tuÇn tù hoÆc mét ph¸t biÓu ®ång thêi, ph¸t biÓu nµy phô
thuéc vµo n¬i xuÊt hiÖn lêi gäi thñ tôc hiÖn t¹i. NÕu lêi gäi nµy n»m bªn
trong mét ph¸t biÓu process hoÆc mét ch ¬ng tr×nh con kh¸c th× nã ® îc gäi
lµ ph¸t biÓu gäi procedure tuÇn tù, ng îc l¹i nã ® îc gäi lµ ph¸t biÓu gäi
procedure gäi ®ång thêi. Có ph¸p cña ph¸t biÓu gäi procedure nh sau :
[ label : ] procedure_name ( list_of_actual );
Thùc tÕ c¸c biÓu thøc, c¸c biÕn, c¸c tÝn hiÖu hoÆc c¸c file, ® îc chuyÓn
vµo trong thñ tôc vµ c¸c tªn cu¶ ®èi t îng vµ c¸c tªn nµy sÏ ® îc dïng ®Ó lÊy
c¸c gi¸ trÞ tÝnh to¸n tõ trong thñ tôc. Chóng ® îc chØ ra mét c¸ch râ rµng bëi
viÖc sö dông sù kÕt hîp theo tªn vµ kÕt hîp theo vÞ trÝ .
VÝ dô:
ARITH_UNIT (D1, D2, ADD, SUM, COMP ); -- Sù kÕt hîp theo vÞ trÝ.
ARITH_UNIT ( Z => SUM, B=> D2, A=>D1,
OP=>ADD, ZCOMP => COMP); -- Sù kÕt hîp theo tªn.
Mét ph¸t biÓu gäi thñ tôc tuÇn tù ® îc thùc thi tuÇn tù cïng víi c¸c
ph¸t biÓu tuÇn tù chung quanh nã. Mét ph¸t biÓu gäi thñ tôc ®ång thêi ® îc
thùc thi bÊt cø lóc nµo khi cã mét sù kiÖn x¶y ra trªn mét trong c¸c tham sè,
mµ c¸c tham sè nµy lµ mét tÝn hiÖu ë chÕ ®é in hoÆc inout. Mét lêi gäi thñ
tôc ®ång thêi cã nghÜa t ¬ng ®¬ng víi mét process cã chøa mét lêi gäi thñ
tôc tuÇn tù vµ mét ph¸t biÓu wait. Ph¸t biÓu wait nµy sÏ lµm cho qu¸ tr×nh
chê cho ®Õn khi cã mét sù kiÖn xuÊt hiÖn trªn c¸c tham sè tÝn hiÖu cña mode
in hoÆc inout.
Sau ®©y lµ mét vÝ dô cña lêi gäi thñ tôc ®ång thêi vµ ph¸t biÓu process
t¬ng ®¬ng víi nã:
architecture DUMMY_ARCH of DUMMY is
-- TiÕp ®Õn lµ th©n cña thñ tôc
procedure INT_2_VEC ( signal D : out BIT_VECTOR ;
START_BIT, STOP_BIT : in NATUAL ;
signal VALUE : in INTEGER ) is
begin
-- M« t¶ ho¹t ®éng hµnh vi cña thñ tôc
end INT_2_VEC;
begin
-- §©y lµ vÝ dô cña mét lêi gäi thñ tôc ®ång thêi.
INT_2_VEC (D_ARRAY, START, STOP, SIGNAL_VALUE);
end DUMMY_ARCH;
Ph¸t biÓu process t ¬ng ®¬ng víi lêi gäi mét thñ tôc ®ång thêi nh sau:
process
begin
INT_2_VEC (D_ARRAY,START,STOP,SIGNAL_VALUE);
-- PhÇn thÓ hiÖn cña c¸c lêi gäi thñ tôc tuÇn tù
wait on SIGNAL_VALUE;
-- Chê sù kiÖn trªn SIGNAL_VALUE vµ xem chóng nh mét tÝn hiÖu
vµo.
Mét procedure cã thÓ sö dông hoÆc lµ mét ph¸t biÓu ®ång thêi
hoÆc lµ ph¸t biÓu tuÇn tù. C¸c lêi gäi ®ång thêi th
êng xuyªn ® îc
dïng ®Ó m« t¶ chÝnh lµ c¸c process.
VÝ dô cña thñ tôc dïng cã khai b¸o postpone ( Tr× ho·n ).
end process;
postponend procedure INT_2_VEC ( signal D:out BIT_VECTOR ;
START_BIT,STOP_BIT : in
NATUAL;
signal VALUE :in INTEGER) is
begin
-- PhÇn khai b¸o ho¹t ®éng cña thñ tôc
end INT_2_VEC;
t¬ng ®¬ng víi nh÷ nghÜa cña ph¸t biÓu process t ¬ng øng víi nã vµ
®îc gäi lµ ph¸t biÓu process bÞ tr× ho·n.
Ng÷ nghÜa cña mét lêi gäi thñ tôc ®ång thêi dïng postponed lµ
Mét th©n process cã thÓ cã ph¸t biÓu wait, trong khi mét function th×
kh«ng ®îc phÐp cã. C¸c function ® îc sö dông ®Ó tÝnh to¸n c¸c gi¸ trÞ mét
c¸ch tøc th×. V× vËy mét function kh«ng cÇn cã ph¸t biÓu wait trong ®ã. Mét
function kh«ng thÓ gäi mét procedure cã ph¸t biÓu wait trong thñ tôc ®ã.
Mét process mµ cã chøa lêi gäi mét thñ tôc mµ trong thñ tôc nµy cã chøa
ph¸t biÓu wait, th× process nµy kh«ng ® îc khai b¸o sensitivity list. H¬n n÷a
tõ thùc tÕ chóng ta thÊy mét process kh«ng thÓ nhËn biÕt c¸c tÝn hiÖu thuéc
sensitivity list v× nÕu cã process nµy sÏ r¬i vµo trang th¸i chê ngay lËp tøc.
Víi mét thñ tôc cã chøa ph¸t biÓu wait th× bÊt cø biÕn hay h»ng nµo ® îc
khai b¸o trong thñ tôc ®ã sÏ gi÷ nguyªn gi¸ trÞ cña chóng trong suèt thêi gian
thùc hiÖn ph¸t biÓu wait vµ tån t¹i chØ khi thñ tôc ® îc kÕt thóc.
3.8. C¸c ®ãng gãi ( Packages ).
B¹n cã thÓ ®ãng gãi ®Ó cÊt c¸c ch ¬ng tr×nh con, c¸c kiÓu d÷ liÖu, c¸c
h»ng ...thêng dïng ®Ó sö dông chóng trong c¸c thiÕt kÕ kh¸c. Mét package
bao gåm hai phÇn chÝnh: PhÇn khai b¸o vµ phÇn th©n package, phÇn khai b¸o
chØ ra giao tiÕp cho package . Có ph¸p cña khai b¸o package nh sau:
package package _name is
{package _declarative_item }
end [package _name];
PhÇn package _declarative_item cã thÓ lµ bÊt kú kiÓu nµo sau ®©y:
- Khai b¸o kiÓu.
- Khai b¸o c¸c kiÓu con.
- Khai b¸o tÝn hiÖu.
- Khai b¸o c¸c h»ng.
- Khai b¸o bÝ danh ALIAS.
- Khai b¸o c¸c thµnh phÇn.
- Khai b¸o c¸c ch¬ng tr×nh con.
- C¸c mÖnh ®Ò USE.
Chó ý ! khai b¸o tÝn hiÖu trong package cã mét sè vÊn ®Ò cÇn l u ý
trong khi tæng hîp, bëi v× mét tÝn hiÖu kh«ng thÓ ® îc chia sÎ bëi hai Entity.
V× vËy nÕu muèn dïng chung khai b¸o tÝn hiÖu b¹n ph¶i khai b¸o tÝn hiÖu
nµy lµ tÝn hiÖu toµn côc.
PhÇn th©n cña package chØ ra ho¹t ®éng thùc tÕ cña mét package. PhÇn
th©n cña package ph¶i lu«n cã tªn trïng víi phÇn khai b¸o. Có ph¸p cña khai
b¸o nµy nh sau:
package body package _name is
{package _body_declarative-item }
end [package _name] ;
PhÇn package _body_declarative-item cã thÓ bao gåm:
- Khai b¸o kiÓu.
- Khai b¸o c¸c kiÓu con.
- Khai b¸o c¸c h»ng
- MÖnh ®Ò use.
- Th©n c¸c ch¬ng tr×nh con.
VÝ dô:
variable V,V1, V2 : BCD5_TYPE;
when ' 0 ' => V : = V1; when ' 1 ' => V : = V2;
library IEEE; use IEEE.NUMERIC_BIT. all; package PKG is subtype MONTH_TYPE is integer range 0 to 12; subtype DAY_TYPE is integer range 0 to 31; subtype BCD4_TYPE is unsigned ( 3 downto 0); subtype BCD5_TYPE is unsigned ( 4 downto 0) ; constant BCD5_1: BCD5_TYPE : = b"0_0001" ; constant BCD5_7: BCD5_TYPE : = b"0_0111" ; function BCD_INC (L : in BCD4_TYPE) return BCD5_TYPE; end PKG; package body PKG is function BCD_INC (L :in BCD4_TYPE) return BCD5_TYPE is begin V1 : = L + BCD5_1; V2 : = L + BCD5_7; case V2(4) is end case;
return (V);
end BCD_INC; end PKG; 3.9. M« h×nh cÊu tróc .
Th«ng thêng mét hÖ thèng sè ® îc m« t¶ theo tËp hîp cã thø bËc cña
c¸c thµnh phÇn . Mçi thµnh phÇn bao gåm mét tËp c¸c cæng ®Ó cã thÓ giao
tiÕp ®îc víi c¸c thµnh phÇn kh¸c. Khi m« t¶ mét thiÕt kÕ trong VHDL vµ
mét thiÕt kÕ cã thø bËc chÝnh lµ mét thiÕt kÕ ® a ra c¸c khai b¸o cña c¸c
thµnh phÇn vµ c¸c ph¸t biÓu thÓ hiÖn thµnh phÇn ®ã.
Mét ®¬n vÞ c¬ së ®Ó diÔn t¶ hµnh vi ho¹t ®éng chÝnh lµ c¸c ph¸t biÓu
process, cßn ®¬n vÞ c¬ së ®Ó diÔn t¶ theo kiÓu cÊu tróc chÝnh lµ c¸c ph¸t biÓu
thÓ hiÖn cña c¸c ®¬n vÞ thµnh phÇn. C¶ hai lo¹i nµy ®Òu cã thÓ cã mÆt trong
mét th©n cña mét kiÕn tróc ( architecture ).
3.9.1. C¸c khai b¸o thµnh phÇn .
Mét th©n kiÕn tróc cã thÓ sö dông c¸c Entity kh¸c (kh«ng trong cïng
khai b¸o cña architecture ), c¸c Entity nµy ® îc m« t¶ t¸ch biÖt vµ ® îc ®Æt
trong th viÖn thiÕt kÕ. §Ó sö dông chóng, ng êi ta dïng c¸c khai b¸o thµnh
phÇn vµ c¸c ph¸t biÓu thÓ hiÖn cña chóng .Trong m« t¶ thiÕt kÕ, mçi ph¸t
biÓu khai b¸o thµnh phÇn ph¶i t ¬ng øng víi mét Entity . C¸c ph¸t biÓu khai
b¸o thµnh phÇn ph¶i gièng víi c¸c ph¸t biÓu ® îc chØ ra trong Entity (c¸c
ph¸t biÓu giao tiÕp vµo ra cña thµnh phÇn ®ã ). Có ph¸p khai b¸o cña chóng
nh sau:
component component _name
[ port ( local_port_declaration ) ]
end component ;
Trong ®ã component _name m« t¶ tªn cña Entity vµ port_declaration lµ
khai b¸o c¸c cæng cña component vµ ph¶i trïng víi phÇn khai b¸o ®· chØ ra
c¶u component n»m trong phÇn khai b¸o cña Entity.
3.9.2. C¸c thÓ hiÖn cña component.
Mét component ®îc ®Þnh nghÜa trong mét architecture cã thÓ ® îc thÓ
hiÖn th«ng qua viÖc sö dông c¸c ph¸t biÓu thÓ hiÖn cña chóng. Khi thÓ hiÖn
chØ ®îc phÐp thÓ hiÖn phÇn giao tiÕp cña component ( Bao gåm tªn, kiÓu ,
híng cña c¸c cæng vµo ra cña chóng ), c¸c tÝn hiÖu bªn trong chóng kh«ng
®îc thÓ hiÖn. Có ph¸p thÓ hiÖn component nh sau:
[ local_port_name =>] expression { [local_port_name =>] expression} ); instantiation_label : component _name port map ( Mét ph¸t biÓu thÓ hiÖn component cÇn ph¶i khai b¸o phÇn nh·n cña thÓ
hiÖn tr íc instantiation_label. H×nh vÏ d íi ®©y m« t¶ phÇn giao diÖn vµ
phÇn thùc thi bªn trong cña mét bé céng full_Adder.
A
Sum
B
FULL_Adder
Cout
Cin
PhÇn giao diÖn component cña bé céng Full_adder.
Cin
A
SUM
N1
B
N3
Cout
N2
PhÇn thùc thi bªn trong cña component Full_Adder.
Nh trªn h×nh vÏ chóng ta thÊy phÇn thùc thi cã ba lo¹i cæng kh¸c nhau
vµ chóng ® îc mang tªn nh sau: OR2_gate, AND2_gate, XOR_gate,
chóng ®îc dïng ®Ó x©y dùng nªn bé céng. §Ó m« t¶ vµ thÓ hiÖn chóng
trong thiÕt kÕ, ta cã thÓ viÕt ch ¬ng tr×nh ®Ó thùc thi tõng thµnh phÇn cña
chóng nh sau:
library IEEE; use IEEE.STD_LOGIC_1164.all; Entity AND2_gate is port ( I0, I1 : in STD_LOGIC ; O : out STD_LOGIC ); End AND2_gate; Architecture BHV of AND2_gate is Begin O <= I0 and I1; End BHV; library IEEE; use IEEE.STD_LOGIC_1164.all; Entity XOR_gate is port ( I0, I1 : in STD_LOGIC ; O : out STD_LOGIC ); End XOR_gate; Architecture BHV of XOR_gate is Begin O <= I0 xor I1; End BHV; library IEEE; use IEEE.STD_LOGIC_1164.all; Entity OR2_gate is port ( I0, I1 : in STD_LOGIC ; O : out STD_LOGIC ); End OR2_gate; Architecture BHV of OR2_gate is Begin O <= I0 xor I1; End BHV; §Ó thÓ hiÖn c¸c component nµy trong mét thiÕt kÕ, ta khai b¸o chóng nh sau:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
Entity FULL_ADDER is
port (A, B, Cin : in STD_LOGIC;
Sum, Cout : out STD_LOGIC);
End FULL_ADDER;
Architecture IMP of FULL_ADDER is
component XOR_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component ;
component AND2_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component;
component OR2_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component;
signal N1, N2, N3: STD_LOGIC;
begin
U1 : XOR_gate port map (I0 => A, I1=> B, O=>N1);
U2 :AND2_gate port map ( A, B, N2);
U3 :AND2_gate port map ( Cin, N1, N3);
U4 :XOR_gate port map ( Cin, N1, Sum);
U5 :OR2_gate port map ( N3, N2, Cout);
end IMP;
3.9.3. C¸c ph¸t biÓu Generate.
Ph¸t biÓu generate lµ mét ph¸t biÓu ®ång thêi vµ nã ® îc ®Þnh nghÜa
trong phÇn architecture. Nã ® îc dïng ®Ó m« t¶ c¸c cÊu tróc gièng nhau, hay
t¸i t¹o l¹i c¸c cÊu tróc kh¸c gièng nh b¶n gèc. Có ph¸p cña chóng nh sau:
instantiation _label : generation_scheme generate
{concurrent_statement }
end generate [instantiation _label];
Cã hai lo¹i l îc ®å generation : Lîc ®å for vµ lîc ®å if. Lîc ®å for
®îc dïng ®Ó diÔn t¶ cÊu tróc th«ng th êng, nã ® îc dïng ®Ó khai b¸o mét
tham sè generate vµ mét d¶i rêi r¹c cña l îc ®å for ( chØ ra tham sè vßng lÆp
vµ d¶i rêi r¹c trong c¸c ph¸t biÓu lÆp tuÇn tù ). C¸c gi¸ trÞ tham sè cña
generate cã thÓ ® îc ®äc nh ng kh«ng ® îc g¸n hay chuyÓn ra ngoµi ph¸t
biÓu generate.
a. Sö dông lîc ®å for:
VÝ dô : Gi¶ sö ta cã bé céng 4 bit mµ trong ®ã bao gåm bèn bé c«ng
Full_adder nh ®· ®îc m« t¶ ë trªn. Xem h×nh d íi ®©y:
X (1)
X (0)
X (2)
Y (1)
Y (0)
X (3)
Y (3)
Y (2)
' 0 '
Cout
FA (3)
FA (2)
FA (1)
FA (0)
Z (3)
Z (2)
Z (1)
Z (0)
§Ó m« t¶ bé céng 4 bit nµy vµ sö dông ph¸t biÓu generate, sö dông m«
t¶ bé céng Full_Adder nh trªn ta ®· m« t¶. Ta cã thÓ viÕt chóng nh sau:
architecture IMP of FULL_ADDER4 is
signal X, Y, Z : STD_LOGIC_VECTOR ( 3 downto 0 ) ;
signal Cout : STD_LOGIC ;
signal TMP : STD_LOGIC_VECTOR ( 4 downto 0 ) ;
component FULL_ADDER
port ( A, B, Cin : in STD_LOGIC ;
Sum, Cout : out STD_LOGIC );
end component ;
TMP (0) <= ' 0 '; G : for I in 0 to 3 generate FA: FULL_ADDER port map ( X (I), Y(I), TMP (I), Z (I),TMP (
I+1 ));
begin
end generate ;
Cout <= TMP (4);
end IMP;
b. Sö dông lîc ®å if.
X (1)
X (0)
X (2)
Y (1)
Y (0)
X (3)
Y (3)
Y (2)
Cout
FA (3)
FA (2)
FA (1)
HA (0)
Z (3)
Z (2)
Z (1)
Z (0)
S¬ ®å bé céng bèn bit sö dông mét bé céng
Half_ADDER vµ ba bé céng FULL_ADDER
Mét sè cÊu tróc cã d¹ng kh«ng theo qui luËt chuÈn nµo, víi tr êng hîp
nµy ta cã thÓ sö dông l îc ®å if. Gi¶ sö ta m« t¶ bé céng bèn bit nh trªn
h×nh trªn vµ sö dông lù¬c ®å IF generate ®Ó m« t¶ bé céng nµy. Ch ¬ng
tr×nh ®îc viÕt nh sau:
architecture IMP of FULL_ADDER4 is
port ( A, B, Cin : in STD_LOGIC ; Sum, Cout : out STD_LOGIC );
port ( A, B : in STD_LOGIC ; Sum, Cout : out STD_LOGIC );
signal X, Y, Z : STD_LOGIC_VECTOR ( 3 downto 0 ) ; signal Cout : STD_LOGIC ; signal TMP : STD_LOGIC_VECTOR ( 4 downto 1) ; component FULL_ADDER end component ; component HALF_ADDER end component ;
begin G0 : for I in 0 to 3 generate
G1: if I = 0 generate HA: HALF_ADDER port map ( X (I), Y(I), Z (I), TMP ( I+1 )); end generate ; G2: if I >= 1 and I <= 3 generate
FA: FULL_ADDER port map ( X (I), Y(I), TMP (I), Z (I),TMP ( I+1
end generate ;
)); end generate ; Cout <= TMP ( 4 ); end IMP;
3.9.4. C¸c th«ng sè cña viÖc ®Þnh cÊu h×nh.
Trong mét Entity cã thÓ cã mét vµi cÊu tróc, v× vËy c¸c chi tiÕt cu¶ viÖc
®Þnh cÊu h×nh cho phÐp ng êi thiÕt kÕ chän c¸c Entity vµ kiÕn tróc cña nã.
Có ph¸p khai b¸o cña chóng nh sau:
for instantiation _list : component _name
use Entity library_name. Entity _name [( architecture _name)] ;
NÕu chØ cã mét kiÕn tróc architecture th× tªn architecture cã thÓ bÞ bá
qua. Xem thªm mét vÝ dô d íi ®©y:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
Entity FULL_ADDER is
port (A, B, Cin : in STD_LOGIC;
Sum, Cout : out STD_LOGIC);
End FULL_ADDER;
Architecture IMP of FULL_ADDER is
component XOR_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component ;
component AND2_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component;
component OR2_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component;
signal N1, N2, N3: STD_LOGIC;
for U1 : XOR_gate use entity work.XOR_gate (BHV);
for others : XOR_gate use entity work.XOR_gate (BHV);
for all : AND2_gate use entity work.AND2_gate (BHV);
for U5 : OR2_gate use entity work.OR2_gate (BHV);
begin
U1 : XOR_gate port map (I0 => A, I1=> B, O=>N1);
U2 :AND2_gate port map ( A, B, N2);
U3 :AND2_gate port map ( Cin, N1, N3);
U4 :XOR_gate port map ( Cin, N1, Sum);
U5 :OR2_gate port map ( N3, N2, Cout);
end IMP;
3.10. M« h×nh møc RT (Register Tranfer) vµ c¸c m¹ch logic tæ
hîp.
DIN
DOUT
Combinational Logic
register
clock
Mét thiÕt kÕ møc chuyÓn ®æi thanh ghi bao gåm mét tËp c¸c thanh ghi
®îc kÕt nèi víi m¹ch logic tæ hîp nh ®îc chØ ra trªn h×nh vÏ. Mét process
kh«ng cã chøa c¸c ph¸t biÓu if trªn c¸c s ên chuyÓn ®æi tÝn hiÖu hoÆc c¸c
ph¸t biÓu wait trªn c¸c sù kiÖn cña tÝn hiÖu th× ® îc gäi lµ c¸c process tæ
hîp.
TÊt c¶ c¸c ph¸t biÓu tuÇn tù ngo¹i trõ ph¸t biÓu wait , ph¸t biÓu lÆp, ph¸t
biÓu if trªn sên chuyÓn ®æi tÝn hiÖu cã thÓ ® îc sö dông ®Ó m« t¶ c¸c m¹ch
logic tæ hîp .
C¸c m¹ch logc tæ hîp kh«ng cã bé nhí ®Ó nhí c¸c gi¸ trÞ. V× vËy mét
biÕn hoÆc mét tÝn hiÖu cÇn ph¶i ® îc g¸n mét gi¸ trÞ tr íc khi ® îc tham
chiÕu. §©y lµ mét vÝ dô m« t¶ m¹ch logic tæ hîp :
process (A, B, Cin)
begin
Cout <= ( A and B ) or (( A or B) and Cin );
end process ;
Chó ý ! V× kh«ng cã c¸c ph¸t biÓu if, wait, loop nªn c¸c tÝn hiÖu vµo
ph¶i thuéc danh s¸ch sensitivity list .
3.11. C¸c thiÕt bÞ logic c¬ b¶n.
3.11.1. C¸c bé chèt.
C¸c flip - flop vµ c¸c bé chèt lµ hai thiÕt bÞ nhí mét bit th êng hay ®îc
sñ dông nhÊt trong c¸c m¹ch sè. Mét Flip - Flop chÝnh lµ mét thiÕt bÞ nhí
®îc khëi t¹o bëi kÝch thÝch cña s ên tÝn hiÖu, cßn bé chèt lµ mét thiÕt bÞ
nhí c¶m nhËn chuyÓn møc cña tÝn hiÖu. Nãi chung c¸c bé chèt chóng ® îc
tæng hîp tõ c¸c biÓu thøc ®iÒu kiÖn kh«ng hoµn toµn râ rµng trong viÖc m« t¶
m¹ch logic tæ hîp. TÊt c¶ c¸c tÝn hiÖu hoÆc c¸c biÕn mµ kh«ng ® îc ®iÒu
khiÓn díi tÊt c¶ c¸c ®iÒu kiÖn ®Òu trë thµnh phÇn tö chèt.
C¸c ph¸t biÓu if and case ® îc chØ ra kh«ng hoµn toµn râ rµng ®Òu t¹o
ra c¸c bé chèt.
VÝ dô díi ®©y ph¸t biÓu IF kh«ng g¸n mét gi¸ trÞ cho tÝn hiÖu Data_out
khi S kh«ng b»ng ' 1', v× vËy khi tæng hîp bé tæng hîp sÏ t¹o ra mét bé chèt.
Data_out
SET
Data_In
D
Q
Signal S, Data_in, Data_out : bit; process (S, Data_in) Begin
if ( S = '1' ) then
S
Data_out <= Data_in;
end if;
end process ;
Q
CLR
§Ó tr¸nh bÞ chèt nhÇm ta ph¶i g¸n tÊt c¶ c¸c gi¸ trÞ tíi tÊt c¶ c¸c tÝn hiÖu
díi tÊt c¶ c¸c ®iÒu kiÖn, thªm vµo ph¸t biÓu else cña vÝ dô tr íc th× bé tæng
Signal S, Data_in, Data_out : bit;
hîp sÏ tæng hîp nh mét cæng AND. xem vÝ dô d íi ®©y:
Data_In
Data_out
process (S, Data_in) Begin
if ( S = '1' ) then
Data_out <= Data_in;
S
else
Data_out <= ' 0 ';
end if; end process ;
Chóng ta cã thÓ chØ ra mét bé chèt víi ® êng reset kh«ng ®ång bé hoÆc
Signal S, RST, Data_in, Data_out : bit;
c¸c ®êng preset kh«ng ®ång bé nh sau:
Data_out
SET
Data_In
D
Q
process (S, RST, Data_in) Begin
if ( RST = '1' ) then
Data_out <= ' 0 ';
S
elsif ( S = ' 1 ' ) then
en
Q
Data_out <= Data_in;
CLR
end if; end process ;
RST
Thay v× ®êng Data_out ® îc g¸n b»ng ' 0 ', chóng ta cã thÓ g¸n '1' cho
®êng Preset kh«ng ®ång bé.
3.11.2. C¸c FLIP - FLOP.
Mét process víi c¸c ph¸t biÓu if trªn s ên chuyÓn tÝn hiÖu hoÆc c¸c ph¸t
biÓu wait trªn sù kiÖn cña tÝn hiÖu ® îc gäi lµ mét qu¸ tr×nh thùc hiÖn theo
nhÞp ®ång hå. Mét Flip - Flop sÏ ®ùoc t¹o ra nÕu cã ® îc mét kÝch thÝch bëi
mét sên tÝn hiÖu, h¬n n÷a nÕu phÐp g¸n tÝn hiÖu ® îc thùc hiÖn trªn viÖc
kÝch thÝch chuyÓn møc cña mét tÝn hiÖu kh¸c.
VÝ dô :
Signal CLK, Data_in, Data_out : bit;
Data_out
SET
Data_In
Q
D
process (CLK) Begin
if ( CLK'event and CLK = '1' ) then Data_out <= Data_in;
CLK
end if;
Q
end process ;
CLR
3.11.3. C¸c ®êng tÝn hiÖu SET vµ RESET ®ång bé.
ViÖc thiÕt lËp c¸c ®Çu vµo (SET) vµ reset c¸c ®Çu ra ®ång bé cña Flip -
Flop cïng víi ho¹t ®éng cña hÖ thèng ®ång hå, ngoµi c¸c kho¶ng thêi gian
kh¸c c¸c tÝn hiÖu nµy kh«ng ® îc xem xÐt, ®iÒu nµy ® îc thùc hiÖn bëi phÇn
Signal CLK, S_RST, Data_in, Data_out : bit;
tö nhí.
Data_In
Data_out
process (CLK) Begin
SET
MUX
Q
D
' 0 '
if ( CLK'event and CLK = '1' ) then if (S_RST = '1') then Data_out <= ' 0 ';
S_RST
else
CLK
Data_out <= Data_in;
end if;
Q
CLR
end if;
end process ;
Signal CLK, A_RST, Data_in, Data_out : bit;
3.11.4. C¸c ®êng tÝn hiÖu SET vµ RESET kh«ng ®ång bé.
Data_out
SET
Data_In
D
Q
process (CLK, A_RST) Begin
if ( A_RST = '0' ) then
CLK
Data_out <= ' 0 ';
elsif ( CLK'event and CLK = ' 1 ' ) then
Q
CLR
Data_out <= Data_in;
end if; end process ;
A_RST
C¸c ®êng SET vµ RESET cña Flip - Flop ho¹t ®éng ®éc lËp víi ® êng
Clock.
3.11.5. C¸c m¹ch RTL tæ hîp vµ ®ång bé.
Chóng ta cã thÓ chia c¸c ph¸t biÓu cña mét process RTL thµnh vµi m¹ch
tæ hîp vµ vµi m¹ch ®ång bé.
PhÇn m¹ch ®ång bé dïng ®Ó m« t¶ c¸c m¹ch con mµ c¸c ho¹t ®éng
hµnh vi cña chóng chØ ®îc ®îc ®Þnh lîng khi cã chuyÓn møc cña tÝn hiÖu.
PhÇn m¹ch tæ hîp dïng ®Ó m« t¶ c¸c m¹ch con mµ ho¹t ®éng hµnh vi
cña chóng sÏ ® îc ®Þnh l îng bÊt cø khi nµo cã sù thay ®æi cña tÝn hiÖu
thuéc sensitivity list . TÊt c¶ c¸c tÝn hiÖu ® îc tham chiÕu trong phÇn m¹ch
tæ hîp cÇn ph¶i thuéc trong danh s¸ch sensitivity list . Xem vÝ dô sau:
Q1
PB
Q2
FF
FF
CLK
PB.Pulse
Entity PULSER is
port ( CLK, PB : in bit;
PB_PULSER : out bit );
end PULSER;
architecture BHV of PULSER is
signal Q1, Q2 : bit;
begin
process ( CLK, Q1, Q2 )
begin
if ( CLK'event and CLK = ' 1' ) then
Q1 <= PB;
Q2 <= Q1;
end if;
PB_PULSE <= ( not Q1 ) nor Q2;
end process ;
end BHV;
3.11.6. C¸c thanh ghi.
Cã rÊt nhiÒu kiÓu thanh ghi mµ chóng ® îc sö dông trong mét m¹ch.
VÝ dô sau ®©y sÏ chØ ra mét thanh ghi bèn bit mµ chóng ® îc ®Æt tr íc
kh«ng ®ång bé ë vÞ trÝ " 1100 ".
Dout (3)
Dout (2)
Dout (1)
Dout (0)
Q
Q
Q
Q
R
R
S
S
D
D
D
D
CLK
ASYNC
Din (3)
Din (1)
Din (0)
Din (2)
signal CLK, ASYNC : Bit;
signal Din, Dout : Bit_vector ( 3 downto 0 );
process ( CLK, ASYNC )
begin
if (ASYNC = '1' ) then
Dout <= " 1100 ";
elsif ( CLK'event and CLK = '1' ) then
Dout <= Din;
end if;
end process ;
3.11.7. Thanh ghi dÞch.
Mét thanh ghi cã kh¶ n¨ng dÞch c¸c bit th«ng tin hoÆc sang ph¶i hoÆc
Count (2)
Count (3)
Count (0)
Count (1)
1
1
1
1
Q
Q
Q
Q
T
T
T
T
CLK
FF
FF
FF
FF
RESET
signal CLK, RESET : Bit;
signal COUNT : Bit_vector ( 3 downto 0 );
process ( CLK, COUNT, RESET )
COUNT (0) <= not COUNT (0);
COUNT (1) <= not COUNT (1);
if (CLK' event and CLK = '1' ) then end if; if (COUNT(0)' event and COUNT(0) = '1' ) then end if;
COUNT (2) <= not COUNT (2);
if (COUNT(1)' event and COUNT(1) = '1' ) then end if;
COUNT (3) <= not COUNT (3);
if (COUNT(2)' event and COUNT(2) = '1' ) then end if;
begin if RESET = '1' then COUNT <= "0000"; else end if; end process ; 3.11.9. C¸c bé ®Õm ®ång bé.
NÕu tÊt c¶ c¸c Flip - Flop cña bé ®Õm ® îc ®iÒu khiÓn bëi tÝn hiÖu
clock chung th× chóng ® îc gäi lµ bé ®Õm ®ång bé.
C¸ch viÕt chóng nh sau:
signal CLK, RESET, load, Count, Updown : Bit; signal Datain : integer range 0 to 15;
if ( Load = ' 1' ) then Reg <= Datain; else
Reg <= ( Reg +1) mod 16;
Reg <= ( Reg -1 ) mod 16;
if Updown = '1' then else end if;
if (Cout = '1' ) then end if;
end if;
signal Reg : integer range 0 to 15: = 0; process ( CLK, RESET ) begin if RESET = '1' then Reg <= 0; elsif ( CLK'event and CLK = '1' ) then end if; end process ; 3.11.20. C¸c bé ®Öm ba tr¹ng th¸i.
Bªn c¹nh c¸c sè 0 vµ 1, cßn mét tÝn hiÖu thø ba trong hÖ thèng sè : ®ã lµ
tr¹ng th¸i trë kh¸ng cao ( Z ).
Trong c¸c kiÓu tiÒn ®Þnh nghÜa cña c¸c ®ãng gãi chuÈn kh«ng cã kiÓu
nµo m« t¶ gi¸ trÞ cña trë kh¸ng cao, v× vËy ta cÇn sö dông kiÓu STD_LOGIC
®Ó m« t¶ bé ®Öm nµy.
OE
Library IEEE; use IEEE.STD_LOGIC_1164. all;
Dout
Din
architecture IMP of TRI_STATE is Signal Din, Dout, OE : STD_LOGIC; Begin process (OE, Din) Begin
if ( OE = '0' ) then Dout <= ' Z ';
else
Dout <= Din;
end if; end process ;
3.11.21.M« t¶ Bus.
Mét hÖ thèng Bus cã thÓ ® îc x©y dùng víi c¸c cæng ba tr¹ng th¸i thay
v× c¸c cæng multiplexers.
Ngêi thiÕt kÕ ph¶i ®¶m b¶o kh«ng cã nhiÒu h¬n mét bé ®Öm ë tr¹ng
th¸i kÝch ho¹t t¹i bÊt kú thêi ®iÓm nµo. C¸c bé ®Öm kÕt nèi cÇn ph¶i ® îc
®iÒu khiÓn v× vËy chØ cã bé ®Öm ba tr¹ng th¸i truy cËp ® êng Bus trong khi
c¸c bé ®Öm kh¸c duy tr× ë tr¹ng th¸i trë kh¸ng cao.
Th«ng th êng c¸c phÐp g¸n tÝn hiÖu tøc th×, ch¼ng h¹n nh c¸c ® êng
Bus trong vÝ dô d íi ®©y ®· kh«ng ® îc phÐp ë møc mét kiÕn tróc. Tuy
nhiªn c¸c kiÓu d÷ liÖu STD_LOGIC vµ STD_LOGIC_VECTOR cã thÓ cã
nhiÒu ®êng ®iÒu khiÓn.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
Entity BUS is
port (S : in STD_LOGIC_VECTOR ( 1 downto 0 );
OE : buffer STD_LOGIC_VECTOR ( 3 downto 0 );
R0, R1, R2, R3 : in STD_LOGIC_VECTOR ( 7 downto 0 );
BusLine : out STD_LOGIC_VECTOR ( 7 downto 0 ) );
end BUS ;
architecture IMP of BUS is
Begin
Process (S)
Begin
Case (S) is
when " 00 " => OE <= "0001";
when " 01 " => OE <= "0010";
when " 10 " => OE <= "0100";
when " 11 " => OE <= "1000";
when others => null;
end Case;
end Process ;
BusLine <= R0 when OE (0) = ' 1' else "ZZZZZZZZ";
BusLine <= R0 when OE (1) = ' 1' else "ZZZZZZZZ";
BusLine <= R0 when OE (2) = ' 1' else "ZZZZZZZZ";
BusLine <= R0 when OE (3) = ' 1' else "ZZZZZZZZ";
end IMP;
Bus Line
OE (0)
OE (1)
OE (2)
OE (3)
0
S (0)
2 to 4
1 Decoder
S (1)
2
3
R 0
R 1
R 2
R 3
CÊu tróc ®êng Bus t¸m bit