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 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, 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. 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ã 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ô : 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. 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ö 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 ®Ó 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 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 nh­ng 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 ®Ó 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. 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, 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 . ViÖc ®Þnh nghÜa cña c¸c kiÓu d÷ liÖu ®­îc chØ ra nh­ sau: type signed is array (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 d÷ kiÖu cã dÊu vµ kh«ng dÊu. Library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.NUMERIC_BIT.all; use IEEE.NUMERIC_STD.all; 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. VÝ dô : subtype INT4 is INTEGER range 0 to 15; subtype BIT_VECTOR6 is BIT_VECTOR (5 downto 0); 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 thÊp C¸c to¸n tö C¸c to¸n h¹ng nhÊt . . . and Logical_operator or nand . Cïng kiÓu Cïng kiÓu Cïng kiÓu . nor Cïng kiÓu . xor Cïng kiÓu . = Cïng kiÓu /= Cïng kiÓu < Cïng kiÓu <= Cïng kiÓu > Cïng kiÓu >= Cïng kiÓu . . . Relational _ operator concatenation_operator & arithmetic_operator + Cïng kiÓu - Cïng kiÓu arithmetic_operator arithmetic_operator Møc arithmetic_operator ­u tiªn cao Logical_operator + BÊt kú kiÓu sè nµo - BÊt kú kiÓu sè nµo * Cïng kiÓu / Cïng kiÓu mod integer rem integer ** KiÓu mò integer abs BÊt kú kiÓu sè nµo not Cïng kiÓu 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. VÝ dô : signal W: BIT_VECTOR (3 downto 0); signal X: INTEGER range 0 to15; signal Y,Z : UNSIGED (3 downto 0); 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; L­u ý 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Þ ®­îc tÝnh to¸n sÏ ®­îc g¸n cho biÕn mét c¸ch tøc thêi. 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. Xem thÝ dô vÒ ph¸t biÓu Process nh­ sau: VÝ dô 1 : process(A) variable EVENT_ON_A : INTEGER : = -1; begin EVENT_ON_A : = EVENT_ON_A +1; end process; VÝ dô 2: Subtype INT16 is INTEGER range 0 to 65536; Signal S1, S2 : INT16; Signal GT : BOOLEAN; process (S1, S2) variable A, B : INT6; constant C : INT16 : = 100; Begin A := S1 +1 ; B : = S2*2 - C; GT <= A > B; 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 : signal A, Z:INTEGER; ... PZ: process(A); -- PZ lµ nh·n cña qu¸ tr×nh variable V1,V2 : INTEGER; begin V1:=A-V2; -- statement 1 Z<= -V1; -- statement 2 V2:= Z+V1*2; -- statement 3 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): Khi mét ph¸t biÓu g¸n tÝn hiÖu ®­îc thùc thi, gi¸ trÞ cña biÓu thøc ®­îc tÝnh to¸n vµ gi¸ trÞ nµy ®­îc chuÈn bÞ ®Ó g¸n cho tÝn hiÖu sau khi delay. L­u ý r»ng biÓu thøc ®­îc ®Þnh l­îng t¹i thêi ®iÓm ph¸t biÓu vµ kh«ng thùc thi ngay mµ nã sÏ thùc thi sau mét thêi gian gi÷ chËm. Cã hai kiÓu Delay ®­îc cung cÊp ®Ó chuÈn bÞ cho viÖc thùc thi tÝn hiÖu: - Transport Delay. - Inertial Delay. a. Transport Delay. Nã t­¬ng tù nh­ sù gi÷ chËm bªn trong cña mét dßng ®iÖn ch¹y qua d©y dÉn. NÕu thêi gian gi÷ chËm nµy ®­îc xem nh­ tiªu tèn vµo thùc hiÖn c«ng viÖc nµo ®ã vµ tiÕp sau nã ( ®óng thêi ®iÓm cña mét c«ng viÖc tr­íc hoµn thµnh ) cÇn ph¶i thùc hiÖn mét c«ng viÖc kh¸c th× thêi gian thùc hiÖn c¸c c«ng viÖc tiÕp theo sÏ ®­îc thªm vµo cuèi cña c«ng viÖc tr­íc ®ã. Cßn nÕu kho¶ng thêi gian cÇn thùc hiÖn mét c«ng viÖc tiÒn ®Þnh ( Thêi gian thùc hiÖn cña mét c«ng viÖc tiÕp theo nµo ®ã ®øng tr­íc thêi ®iÓm thùc hiÖn mét c«ng viÖc tr­íc, th× c©u lÖnh Transport sÏ thùc hiÖn chÌn vµo vµ thùc hiÖn c«ng viÖc tiÒn ®Þnh nµy ). 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: 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; -- branch1 when MON | WED => POCKET_MONEY :=2; -- branch2 when FRI to SUN => POCKET_MONEY :=7; -- branch3 when others => POCKET_MONEY :=0; -- branch4 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. VÝ dô : Variable A, B : INTEGER range 0 to 31 ; Case A is when 0 to 12 => B:= A; 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µ: exit [loop-label][when condition] 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 hiÖn sÏ tiÕp tôc víi ph¸t biÓu kÕ tiÕp. VÝ dô : SUM :=1; J:=0 ; L3:loop J:=J+21; SUM:=SUM*10 if (SUM >100) then exit L3; -- Thùc hiÖn exit khái L3 nÕu Sum> 100 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 nh­ng 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 : process ( SEL, a, b, c ) case SEL is when 0 | 1 | 2| => Z <= a; when 3 to 10 => Z <= b; when others => Z <= C; end case; 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ô : architecture BHV of example is signal : out 1 : integer; signal : out 2 : bit; begin B1 : block signal S : bit; begin B1-1 : block signal S : integer; begin out 1 <= S ; end block B1-1; end block B1; B2: block begin out 2 <= S ; 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 tr­ng 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: function identifier interface_list return type_mark is {subprogram_declarative_item} Begin {sequential_statement} 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 : type OP_CODE is ( ADD, SUB, MUL, DIV, LT, LE, EQ); … procedure ARITH_UNIT (A, B : in INTEGER ; OP : in OP_CODE ; Z : out 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<B; when LE => 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. end process; 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 ). 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; Ng÷ nghÜa cña mét lêi gäi thñ tôc ®ång thêi dïng postponed lµ 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. 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ô: 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 variable V,V1, V2 : BCD5_TYPE; begin V1 : = L + BCD5_1; V2 : = L + BCD5_7; case V2(4) is when ' 0 ' => V : = V1; when ' 1 ' => V : = V2; 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: instantiation_label : component _name port map ( [ local_port_name =>] expression { [local_port_name =>] expression} ); 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 FULL_Adder B Cout Cin PhÇn giao diÖn component cña bé céng Full_adder. A Cin N1 SUM 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 (3) Y (3) X (2) Y (2) X (1) Y (1) X (0) Y (0) '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 ; begin 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 )); end generate ; Cout <= TMP (4); end IMP; b. Sö dông l­îc ®å if. X (3) Y (3) X (2) Y (2) X (1) Y (1) X (0) Y (0) 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 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 port ( A, B, Cin : in STD_LOGIC ; Sum, Cout : out STD_LOGIC ); end component ; component HALF_ADDER port ( A, B : in STD_LOGIC ; Sum, Cout : out STD_LOGIC ); 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. Signal S, Data_in, Data_out : bit; process (S, Data_in) Begin if ( S = '1' ) then Data_out <= Data_in; end if; end process ; Data_In D SET Data_out Q S CLR Q §Ó 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 hîp sÏ tæng hîp nh­ mét cæng AND. xem vÝ dô d­íi ®©y: Signal S, Data_in, Data_out : bit; process (S, Data_in) Begin if ( S = '1' ) then Data_out <= Data_in; else Data_out <= ' 0 '; end if; end process ; Data_In Data_out S Chóng ta cã thÓ chØ ra mét bé chèt víi ®­êng reset kh«ng ®ång bé hoÆc c¸c ®­êng preset kh«ng ®ång bé nh­ sau: Signal S, RST, Data_in, Data_out : bit; process (S, RST, Data_in) Begin if ( RST = '1' ) then Data_out <= ' 0 '; elsif ( S = ' 1 ' ) then Data_out <= Data_in; end if; end process ; Data_In S D SET en CLR Data_out Q Q 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_In process (CLK) Begin if ( CLK'event and CLK = '1' ) then Data_out <= Data_in; end if; end process ; D SET CLK CLR Data_out Q Q 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 tö nhí. Signal CLK, S_RST, Data_in, Data_out : bit; process (CLK) Begin if ( CLK'event and CLK='1' ) then if (S_RST ='1') then Data_out <= ' 0 '; else Data_out <=Data_in; end if; end if; end process ; Data_In ' 0' D MUX SET Data_out Q S_RST CLK CLR Q 3.11.4. C¸c ®­êng tÝn hiÖu SET vµ RESET kh«ng ®ång bé. Signal CLK, A_RST, Data_in, Data_out : bit; process (CLK, A_RST) Begin if ( A_RST = '0' ) then Data_out <= ' 0 '; elsif ( CLK'event and CLK = ' 1 ' ) then Data_out <= Data_in; end if; end process ; Data_In D SET Data_out Q CLK CLR Q 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 FF CLK FF Q2 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) Q S Dout (1) Q Dout (0) Q Q R S R D D D D Din (3) Din (2) Din (1) Din (0) CLK ASYNC 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 sang tr¸i ®­îc gäi lµ mét thanh ghi dÞch. CÊu h×nh logic cña thanh ghi bao gåm mét lo¹t c¸c Flip - Flop ®­îc nèi tÇng víi nhau, ®Çu ra cña Flip - Flop nµy ®­îc nèi vµo ®Çu vµo cña Flip - Flop kia. TÊt c¶ c¸c Flip - Flop ®Òu nhËn xung ®ång hå chung nªn nã cã thÓ lµm cho d÷ liÖu dÞch tõ tr¹ng th¸i nµy sang tr¹ng th¸i tiÕp theo. XÐt vÝ dô vÒ thanh ghi dÞch 4 bÝt sau: signal CLK, Din, Dout : Bit ; process (CLK) variable REG : bit_vector ( 3 down to 0 ); begin if ( CLK'event and CLK = '1' ) then REG : = Din & REG ( 3 downto 1); end if; Dout <= REG (0); end process ; CÊu h×nh cña chóng nh­ sau: Din D Q FF D Q D FF Q FF D Q Dout FF CLK 3.11.8. C¸c bé ®Õm kh«ng ®ång bé. Bé ®Õm kh«ng ®ång bé lµ bé ®Õm mµ tr¹ng th¸i cña nã thay ®æi kh«ng bÞ ®iÒu khiÓn bëi c¸c xung ®ång bé ®ång hå. C¸ch m« t¶ bé ®Õm nµy nh­ sau: Count (0) 1 CLK Q T FF 1 Count (1) T Q FF 1 Count (2) T Q 1 Count (3) T FF Q FF RESET signal CLK, RESET : Bit; signal COUNT : Bit_vector ( 3 downto 0 ); process ( CLK, COUNT, RESET ) begin if RESET = '1' then COUNT <= "0000"; else if (CLK' event and CLK = '1' ) then COUNT (0) <= not COUNT (0); end if; if (COUNT(0)' event and COUNT(0) = '1' ) then COUNT (1) <= not COUNT (1); end if; if (COUNT(1)' event and COUNT(1) = '1' ) then COUNT (2) <= not COUNT (2); end if; if (COUNT(2)' event and COUNT(2) = '1' ) then COUNT (3) <= not COUNT (3); end if; 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; 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 if ( Load = ' 1' ) then Reg <= Datain; else if (Cout = '1' ) then if Updown = '1' then Reg <= ( Reg +1) mod 16; else Reg <= ( Reg -1 ) mod 16; end if; end if; end if; 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. Library IEEE; use IEEE.STD_LOGIC_1164. all; 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 ; OE Din Dout 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) S (0) 2 to 4 OE (1) OE (2) OE (3) 0 1 Decoder S (1) 2 3 R0 R1 R2 R3 CÊu tróc ®­êng Bus t¸m bit