Professional Documents
Culture Documents
bo co n mn hc
Thit k mch nh my tnh
ti:
Lp:
ktmt - K46
H Ni, 10/2005
Mc lc
Trang
Danh mc hnh:
Trang
Danh mc bng:
Trang
VHDL c pht trin di s bo tr ca chnh ph M v hin nay l mt tiu chun ca IEEE. VHDL c s h tr ca nhiu nh sn xut thit b cng nh nhiu nh cung cp cng c thit k m phng h thng.
-
VHDL cho php thit k bng nhiu phng php v d phng php thit k t trn xung, hay t di ln da vo cc th vin sn c. VHDL cng h tr cho nhiu loi cng c xy dng mch nh s dng cng ngh ng b hay khng ng b, s dng ma trn lp trnh c hay s dng mng ngu nhin. Th ba l tnh c lp vi cng ngh:
VHDL hon ton c lp vi cng ngh ch to phn cng. Mt m t h thng dng VHDL thit k mc cng c th c chuyn thnh cc bn tng hp mch khc nhau tu thuc cng ngh ch to phn cng mi ra i n c th c p dng ngay cho cc h thng thit k. Th t l kh nng m t m rng:
VHDL cho php m t hot ng ca phn cng t mc h thng s cho n mc cng. VHDL c kh nng m t hot ng ca h thng trn nhiu
V VHDL l mt tiu chun c chp nhn, nn mt m hnh VHDL c th chy trn mi b m t p ng c tiu chun VHDL. Cc kt qu m t h thng c th c trao i gia cc nh thit k s dng cng c thit k khc nhau nhng cng tun theo tiu chun VHDL. Cng nh mt nhm thit k c th trao i m t mc cao ca cc h thng con trong mt h thng ln (trong cc h con c thit k c lp). Th su l kh nng h tr thit k mc ln v kh nng s dng li cc thit k:
VHDL c pht trin nh mt ngn ng lp trnh bc cao, v vy n c th c s dng thit k mt h thng ln vi s tham gia ca mt nhm nhiu ngi. Bn trong ngn ng VHDL c nhiu tnh nng h tr vic qun l, th nghim v chia s thit k. V n cng cho php dng li cc phn c sn. 1.2. Gii thiu cng ngh (v ng dng) thit k mch bng VHDL.
1.2.1 ng dng ca cng ngh thit k mch bng VHDL Hin nay 2 ng dng chnh v trc tip ca VHDL l cc ng dng trong cc thit b logic c th lp trnh c (Programmable Logic Devices PLD) (bao gm cc thit b logic phc tp c th lp trnh c v cc FPGA Field Programmable Gate Arrays) v ng dng trong ASICs(Application Specific Integrated Circuits). Khi chng ta lp trnh cho cc thit b th chng ta ch cn vit m VHDL mt ln, sau ta c th p dng cho cc thit b khc nhau (nh Altera, Xilinx, Atmel,) hoc c th ch to mt con chip ASIC. Hin nay, c nhiu thng mi phc tp (nh cc vi iu khin) c thit k theo da trn ngn ng VHDL. 1.2.2 Quy trinh thit k mch bng VHDL. Nh cp trn, mt trong s ln cc ng dng ca VHDL l ch to cc mch hoc h thng trong thit b c th lp trnh c (PLD hoc FPGA) hoc trong ASIC. Vic ch tao ra vi mch s c chia thnh 3 giai on nh sau: Giai on 1:
Bc u tin trong qu trnh ch to l bin dich. Qu trnh bin dch s chuyn m VHDL vo mt netlist tng cng. Bc th 2 ca qu trnh ch to l ti u. Qu trnh ti u c thc hin trn netlist tng cng v tc v phm vi. Trong giai on ny, thit k c th c m phng kim tra pht hin nhng li xy ra trong qu trnh ch to. Giai on 3:
L giai on ghp ni ng gi phn mm. giai on ny s to ra s sp xp vt l cho chip PLD/FPGA hoc to ra mt n cho ASIC. 1.2.3. Cng c EDA. Cc cng c phc v cho qu trnh thit k vi mch s l: Cng c Active HDL: To m VHDL v m phng
Hinh 1.2.a. S tng qut v b cng y Trong , a , b l cc bit vo cho b cng, cin l bit nh. u ra s l bit tng, cout l bit nh ra. Hot ng ca mch c ch ra di dng bng chn l:
Hnh 1.2.b. Bng chn l ca b cng y Bit s v cout c tnh nh sau: v T cng thc tnh s v cout ta vit on m VHDL nh di y:
Hnh 1.3. M thit k b cng T m VHDL ny, mch vt l c to ra. Tuy nhin c nhiu cch thc hin phng trnh c miu t trong ARCHITECTURE OF, v vy mch thc t s ph thuc vo b bin dch/b ti u ang c s dng v c bit ph thuc mc ch cng ngh. Hnh v sau y th hin mt s dng kin trc ca mch cng:
Chng 2. Cu trc m
Trong chng ny, chng ta m t cc phn c bn c cha c cc on Code nh ca VHDL: cc khai bo LIBRARY, ENTITY v ARCHITECTURE. 2.1.
Cc n v VHDL c bn.
Mt an Code chun ca VHDL gm ti thiu 3 mc sau: Khai bo LIBRARY: cha mt danh sch ca tt c cc th vin c s dng trong thit k. V d: ieee, std, work, ENTITY: M t cc chn vo ra (I/O pins) ca mch ARCHITECTURE: cha m VHDL, m t mch s hat ng nh th no. Mt LIBRARY l mt tp cc an Code thng c s dng. Vic c mt th vin nh vy cho php chng c ti s dng v c chia s cho cc ng dng khc. M thng c vit theo cc nh dng ca FUNCTIONS, PROCEDURES, hoc COMPONENTS, c thay th bn trong PACKAGES v sau c dch thnh th vin ch. 2.2. Khai bo Library.
- khai bo Library, chng ta cn hai dng m sau, dng th nht cha tn th vin, dng tip theo cha mt mnh cn s dng: LIBRARY library_name; USE library_name.package_name.package_parts; Thng thng c 3 gi, t 3 th vin khc nhau thng c s dng trong thit k: ieee.std_logic_1164 (from the ieee library), standard (from the std library), and work (work library).
Cc th vin std v work thng l mc nh, v th khng cn khai bo chng, ch c th vin ieee l cn phi c vit r ra. Mc ch ca 3 gi/th vin c k trn l nh sau: gi std_logic_1164 ca th vin ieee cho bit mt h logic a mc; std l mt th vin ti nguyn (kiu d kiu, i/o text..) cho mi trng thit k VHDL v th vin work c s dng khi chng ta lu thit k ( file .vhd, cc file c top bi chng trnh dch v chng trnh m phng). Thc ra, th vin ieee cha nhiu gi nh sau:
10
2.3.
Mt ENTITY l mt danh sch m t cc chn vo/ra ( cc PORT) ca mch in. C php nh sau:
ENTITY entity_name IS PORT ( port_name : signal_mode signal_type; port_name : signal_mode signal_type; ...); END entity_name;
Ch ca tn hiu ( mode of the signal) c th l IN, OUT, INOUT hoc BUFFER. V d trong hnh 2.3 ta c th thy r cc chn IN, OUT ch c mt chiu (vo hoc ra) trong khi INOUT l 2 chiu v BUFFER li khc, tn hiu ra phi c s dng t d liu bn trong. Kiu ca tn hiu ( type of the signal) c th l BIT, STD_LOGIC, INTEGER, Tn ca thc th ( name of the entity) c th ly mt tn bt k, ngai tr cc t kha ca VHDL. V d: Xt cng NAND hnh 2.4, khai bo ENTITY nh sau:
ENTITY nand_gate IS PORT (a, b : IN BIT; x : OUT BIT); END nand_gate;
ARCHITECTURE l mt m t mch dng quyt mch s lm vic nh th no ( c chc nng g). C php nh sau:
ARCHITECTURE architecture_name OF entity_name IS [declarations] BEGIN (code) END architecture_name;
Nh thy trn, mt cu trc c 2 phn: phn khai bo ( chc nng), ni cc tn hiu v cc hng c khai bo, v phn m (code - t BEGIN tr xung). V d: Xt tr li cng NAND ca hnh 2.4
ARCHITECTURE myarch OF nand_gate IS BEGIN x <= a NAND b; END myarch;
ngha ca ARCHITECTURE trn l nh sau: mch phi thc hin cng vic NAND 2 tn hiu vo (a,b) v gn (<=) kt qu cho chn ra x. Mi mt khai bo thc th u phi i km vi t nht mt kin trc tng ng. VHDL cho php to ra hn mt kin trc cho mt thc th. Phn khai bo kin trc c th bao gm cc khai bo v cc tn hiu bn trong, cc phn t bn trong h thng, hay cc hm v th tc m t hot ng ca h thng. Tn ca kin trc l nhn c t tu theo ngi x dng. C hai cch m t kin trc ca mt phn t ( hoc h thng) l m hnh hot ng (Behaviour) hay m t theo m hnh cu trc (Structure). Tuy nhin mt h thng c th bao gm c m t theo m hnh hot ng v m t theo m hnh cu trc. + M t kin trc theo m hnh hot ng:
M hnh hot ng m t cc hot ng ca h thng (h thng p ng vi cc tn hiu vo nh th no v a ra kt qu g ra u ra) di dng cc cu trc ngn ng lp trnh bc cao. Cu trc c th l PROCESS , WAIT, IF, CASE, FOR-LOOP V d:
ARCHITECTURE behavior OF nand IS -- Khai bo cc tn hiu bn trong v cc b danh BEGIN c <= NOT(a AND b); END behavior;
V d2:
ARCHITECTURE behavioral of decode2x4 is BEGIN
12
M hnh cu trc ca mt phn t (hoc h thng) c th bao gm nhiu cp cu trc bt u t mt cng logic n gin n xy dng m t cho mt h thng hon thin. Thc cht ca vic m t theo m hnh cu trc l m t cc phn t con bn trong h thng v s kt ni ca cc phn t con . M t c php:
architecture identifier of entity_name is Architecture_declarative_part begin all_concurrent_statements end [architecture][architecture_simple_name];
Nh vi v d m t m hnh cu trc mt flip-flop RS gm hai cng NAND c th m t cng NAND c nh ngha tng t nh v d vi cng NOT, sau m t s mc ni cc phn t NAND to thnh trig RS V d1:
13
V d2:
Architecture arc_mach_cong of mach_cong is Component Xor Port( X,Y : in bit ; Z, T : out bit); End component; Component And Port(L,M :input ;N,P : out bit ); End component; Begin G1 : Xor port map (A,B,Sum); G2 : And port map (A, B, C); End arc_mach_cong;
14
2.5.
Cc v d m u.
Trong mc ny, chng ta s trnh by 2 v d u tin v m VHDL. Mi v d u c theo km bi cc ch thch din gii v cc kt qu m phng. V d 2.1: DFF vi Reset khng ng b:
Hnh 2.5.b. S ca DFF khng ng b Hnh 2.5.b cho thy s ca mt flip-flop loi D (DFF), xung c kch theo sn ca tn hiu ng h (clk), v vi mt tn hiu u vo reset khng ng b (rst). Khi rst = 1, u ra lun mc thp bt k clk. Ngc li, u ra s copy u vo ( q<=d) ti thi im khi clk chuyn t 0 ln 1. C nhiu cch thc hin DFF ca hnh 2.5, mt gii php s c trnh by di y. S dng mt PROCESS cho an m sau y:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 --------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------ENTITY dff IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; --------------------------------------ARCHITECTURE behavior OF dff IS BEGIN PROCESS (rst, clk) BEGIN IF (rst='1') THEN q <= '0'; ELSIF (clk'EVENT AND clk='1') THEN q <= d; END IF; END PROCESS; END behavior;
15
Hnh 2.6: Kt qu m phng ca v d 2.1 Hnh 2.6 m phng kt qu t v d 2.1, th c th c gii thch d dng. Ct u tin cho bit tn ca tn hiu, nh c inh ngha trong ENTITY. N cng cho bit ch ( hng) ca tn hiu, lu rng cc mi tn ng vi rst, d v clk hng vo trong, y l pha input, cn q hng ra ngoi tng ng vi pha output. Ct th hai cha gi tr ca mi tn hiu v tr tng ng vi ni con tr tr ti. Trong trng hp hin ti, con tr 0ns v tn hiu nhn gi tr (1,0,0,0). Ct th 3 cho thy s m phng ca ton b qu trnh. Cc tn hiu vo (rst, d, clk) c th c chn mt cch t do v b m phng s xc nh tn hiu ng ra tng ng. V d 2.2: DFF kt hp vi cng NAND Mch in hnh 2.7 l s kt hp ca 2 hnh 2.4 v 2.5. Trong li gii sau y, chng ta gii thiu mt cch c ch nh mt tn hiu khng cn thit (temp), ch minh ha mt tn hiu s c khai bo nh th no.
16
VHDL bao gm mt nhm cc kiu d liu tin nh ngha, c nh r thng qua cc chun IEEE 1076 v IEEE 1164. C th hn, vic nh ngha kiu d liu nh th c th tm thy trong cc gi/ th vin sau:
Gi standard ca th vin std: nh ngha cc kiu d liu BIT, BOOLEAN, INTEGER v REAL. Gi std_logic_1164 ca th vin ieee: nh ngha kiu d liu STD_LOGIC v STD_ULOGIC. Gi std_logic_arith ca th vin ieee: nh ngha SIGNED v UNSIGNED, cng thm nhiu hm chuyn i d liu v d: conv_integer(p), conv_unsigned(p, b), conv_signed(p, b), v conv_std_logic_vector(p, b). Gi std_logic_signed v std_logic_unsigned ca th vin ieee: Cha cc hm cho php hat ng vi d liu STD_LOGIC_VECTOR c thc hin khi m kiu d liu l SIGNED hc UNSIGNED.
Tt c cc kiu d liu tin nh ngha nu trn c m t nh sau: + BIT v BIT_VECTOR: 2 mc logic (0, 1). V d: SIGNAL x: BIT;
17
18
Bng 3.1. H thng logic gii c + STD_ULOGIC( STD_ULOGIC_VECTOR): h thng logic 9 mc trong chun IEEE 1164: (U, X, 0, 1, Z, W, L, H, ). Tht vy, h STD_LOGIC m t trn l mt tp con ca STD_ULOGIC. H thng th 2 ny thm gi tr logic U. BOOLEAN: ng/sai INTEGER: s nguyn 32 bits ( t -2.147.483.647 n +2.147.483.647) NATURAL: ms nguyn khng m ( t 0 n +2.147.483.647) REAL: s thc nm trong khong ( t -1.0E38 n +1.0E38). Physic literals: s dng i vi cc i lng vt l, nh thi gian, in p,Hu ch trong m phng Character literals: k t ASCII n hoc mt chui cc k t nh th SIGNED v UNSIGNED: cc kiu d liu c nh ngha trong gi std_logic_arith ca th vin ieee. Chng c hnh thc ging nh STD_LOGIC_VECTOR, nhng ngai tr cc ton t s hc, m tiu biu l kiu d liu INTEGER Cc v d: x0 <= '0'; -- bit, std_logic, or std_ulogic value '0' x1 <= "00011111"; -- bit_vector, std_logic_vector, -- std_ulogic_vector, signed, or unsigned x2 <= "0001_1111"; -- ng gch di cho php d hnh dung hn x3 <= "101111" -- biu din nh phn ca s thp phn 47 x4 <= B"101111" -- nh trn x5 <= O"57" -- biu din bt phn ca s thp phn 47 x6 <= X"2F" -- biu din s thp lc phn ca s thp phn 47 n <= 1200; -- s nguyn m <= 1_200; -- s nguyn, cho php gch di IF ready THEN... -- Logic, thc hin nu ready=TRUE y <= 1.2E-5; -- real, not synthesizable q <= d after 10 ns; -- physical, not synthesizable
19
3.2.
VHDL cng cho php ngi dng t nh ngha cc kiu d liu. Hai loi kiu d liu ngi dng nh ngha c ch ra di y bao gm integer v enumerated. Kiu integer ngi dng nh ngha: TYPE integer IS RANGE -2147483647 TO +2147483647; -- Thc ra kiu ny c nh ngha trc bi kiu INTEGER. TYPE natural IS RANGE 0 TO +2147483647; -- Thc ra kiu ny c nh ngha trc bi kiu NATURAL. TYPE my_integer IS RANGE -32 TO 32; -- Mt tp con cc s integer m ngi dng nh ngha. TYPE student_grade IS RANGE 0 TO 100; -- Mt tp con cc s nguyn hoc s t nhin ngi dng nh ngha. _ Cc kiu m ngi dng inh ngha: TYPE bit IS ('0', '1'); -- c nh ngha trc bi kiu BIT TYPE my_logic IS ('0', '1', 'Z');
20
Kiu d liu con l mt kiu d liu i km theo iu kin rng buc. L do chnh cho vic s dng kiu d liu con sau nh ra mt kiu d liu mi l, cc thao tc gia cc kiu d liu khc nhau khng c cho php, chng ch c cho php trong trng hp gia mt kiu con v kiu c s tng ng vi n. V d: kiu d liu sau y nhn c cc kiu d liu c gii thiu trong cc v d phn trc. SUBTYPE natural IS INTEGER RANGE 0 TO INTEGER'HIGH; -- NATURAL is a kiu con (tp con) of INTEGER. SUBTYPE my_logic IS STD_LOGIC RANGE '0' TO 'Z'; -- Gi li STD_LOGIC=('X','0','1','Z','W','L','H','-'). -- Do , my_logic=('0','1','Z'). SUBTYPE my_color IS color RANGE red TO blue; -- khi color=(red, green, blue, white), th -- my_color=(red, green, blue). SUBTYPE small_integer IS INTEGER RANGE -32 TO 32; -- Mt tp con ca INTEGER. Example: Cc php ton hp l v khng hp l gia cc kiu d liu v cc kiu d liu con. SUBTYPE my_logic IS STD_LOGIC RANGE '0' TO '1'; SIGNAL a: BIT; SIGNAL b: STD_LOGIC; SIGNAL c: my_logic;
21
Mng l mt tp hp cc i tng c cng kiu. Chng c th l mt chiu (1D), 2 chiu (2D) hc mt chiu ca mt chiu (1D x 1D) v cng c th c nhng kch thc cao hn. Hnh 3.1 minh ha vic xy dng mt mng d liu. Mt gi tr n ( v hng c ch ra (a), mt vector ( mng 1D) (b) v mt mng cc vector ( mng 1Dx1D) (c) v mng ca mng 2D nh trong (d) Tht vy, cc kiu d liu VHDL c nh ngha trc (mc 3.1) ch bao gm cc i lng v hng-scalar ( bit n) v vector ( mng mt chiu cc bit). Cc kiu d liu c th kt hp trong mi loi ny l nh di y: _ Scalars: BIT, STD_LOGIC, STD_ULOGIC, and BOOLEAN. _ Vectors: BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, INTEGER, SIGNED, and UNSIGNED.
Hnh 3.1: Minh ha scalar (a), 1D (b), 1Dx1D (c), v 2D (d) Nh c th thy, khng h c nh ngha trc mng 2D hoc 1Dx1D, m khi cn thit, cn phi c ch nh bi ngi dng. lm nh vy, mt kiu mi (new TYPE) cn phi c nh ngha u tin, sau l tn hiu mi (new SIGNAL), new VARIABLE hc CONSTANT c th c khai bo s dng kiu d liu . C php di y s c dng: ch nh mt kiu mng mi: TYPE type_name IS ARRAY (specification) OF data_type; to s dng kiu mng mi: SIGNAL signal_name: type_name [:= initial_value]; Trong c php trn, mt SIGNAL c khai bo. Tuy nhin n cng c th l mt CONSTANT hoc mt VARIABLE. Gia tr khi to ty chn. * V d mng 1Dx1D: Chng ta mun xy dng mt mng cha 4 vector, mi vector c kch thc l 8 bit, l mt mng 1Dx1D ( hnh 3.1). Ta gi mi vector l hng (row) v mng hon chnh l ma trn (matrix). Hn na, chng ta mun bit bn
22
23
--------- Gn vector: --------------------x <= y(0); -- hp l (cng kiu: ROW) x <= v(1); -- khng hp l (khng ph hp kiu: ROW v -- STD_LOGIC_VECTOR) x <= w(2); -- khng hp l (w phi l 2D) x <= w(2,2 DOWNTO 0);--khng hp l (khng ph hp kiu: ROW x -- STD_LOGIC) v(0)<=w(2,2 DOWNTO 0);--illegal(mismatch: STD_LOGIC_VECTOR -- x STD_LOGIC) v(0) <= w(2); -- illegal (w must have 2D index) y(1) <= v(3); -- illegal (type mismatch: ROW x -- STD_LOGIC_VECTOR) y(1)(7 DOWNTO 3) <= x(4 DOWNTO 0); -- legal (same type, -- same size) v(1)(7 DOWNTO 3) <= v(2)(4 DOWNTO 0); -- legal (same type, -- same size) w(1,5 DOWNTO 1)<=v(2)(4 DOWNTO 0);-- illegal (type mismatch) 3.5. Mng cng ( Port Array).
Nh chng ta bit, khng c kiu d liu c nh ngha trc no c hn mt chiu. Tuy nhin, trong cc c im ca cc chn vo hoc ra (cc PORT) ca mt mch in ( m c xy dng thnh ENTITY), chng ta c th phi cn nh r cc PORT nh l mng cc VECTOR Khi cc khai bo TYPE khng c cho php trong mt ENTITY, gii php khai bo kiu d liu ngi dng nh ngha trong mt PACKAGE, m c th nhn bit ton b thit k. Mt v d nh sau:
------- Package: -------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------PACKAGE my_data_types IS TYPE vector_array IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
24
C th thy trong v d trn, mt kiu d liu ngi dng nh ngha c gi l vector_array, c to ra, m n c th cha mt s khng xc nh cc vector, mi vector cha 8 bit. Kiu d liu c lu gi trong mt PACKAGE gi l my_data_types, v sau c s dng trong mt ENTITY xc nh mt PORT c gi. Ch trong on m chnh bao gm thm c mt mnh USE thc hin gi ngi dng nh ngha my_data_types c th thy trong thit k. Chc nng khc cho PACKAGE trn s c trnh by di y, ni m c khai bo CONSTANT:
------Package: ------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------PACKAGE my_data_types IS CONSTANT b: INTEGER := 7; TYPE vector_array IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(b DOWNTO 0); END my_data_types; ----------------------------------------------
3.6.
Bn ghi tng t nh mng, vi im khc rng chng cha cc i tng c kiu d liu khc nhau. V d:
TYPE birthday IS RECORD day: INTEGER RANGE 1 TO 31; month: month_name; END RECORD;
3.7.
25
Lu rng c php ca chng tng t vi STD_LOGIC_VECTOR, khng ging nh INTEGER. Mt gi tr UNSIGNED l mt s khng bao gi nh hn zero. V d, 0101 biu din s thp phn 5, trong khi 1101 l 13. Nhng nu kiu SIGNED c s dng thay vo, gi tr c th l dng hoc m ( theo nh dng b 2). Do , 0101 vn biu din s 5, trong khi 1101 s biu din s -3 s dng kiu d liu SIGNED hoc UNSIGNED, gi std_logic_arith ca th vin ieee, phi c khai bo. Bt chp c php ca chng, kiu d liu SIGNED v UNSIGNED c hiu qu ch yu i vi cc php ton s hc, ngha l, ngc vi STD_LOGIC_VECTOR, chng chp nhn cc php ton s hc. mt kha cnh khc, cc php ton logic th khng c php. * V d: Cc php ton hp l v khng hp l i vi kiu d liu signed/unsigned:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; -- gi cn thit thm vo ... SIGNAL a: IN SIGNED (7 DOWNTO 0); SIGNAL b: IN SIGNED (7 DOWNTO 0); SIGNAL x: OUT SIGNED (7 DOWNTO 0); ... v <= a + b; -- hp l (php ton s hc OK) w <= a AND b; -- khng hp l (php ton logic khng OK)
26
3.8.
Chuyn i d liu.
VHDL khng cho php cc php ton trc tip ( s hc, logic, ) tc ng ln cc d liu khc kiu nhau. Do , thng l rt cn thit i vi vic chuyn i d liu t mt kiu ny sang mt kiu khc. iu ny c th c thc hin trong hai cch c bn: hoc chng ta vit mt t code cho iu , hoc chng ta gi mt FUNCTION t mt gi c nh ngha trc m n cho php thc hin cc php bin i cho ta. Nu d liu c quan h ng ( ngha l 2 ton hng c cng kiu c s, bt chp ang c khai bo thuc v hai kiu lp khc nhau), th std_logic_1164 ca th vin ieee cung cp cc hm chuyn i d thc hin. * V d: cc php ton hp l v khng hp l i vi cc tp con
TYPE long IS INTEGER RANGE -100 TO 100; TYPE short IS INTEGER RANGE -10 TO 10; SIGNAL x : short; SIGNAL y : long; ... y <= 2*x + 5; -- li, khng ph hp kiu y <= long(2*x + 5); -- OK, kt qu c chuyn i thnh kiu long
27
UNSIGNED, SIGNED, hoc STD_ULOGIC thnh mt gi tr UNSIGNED vi kch c l b bit. o conv_signed(p, b): chuyn i mt tham s p ca kiu INTEGER, UNSIGNED, SIGNED, hoc STD_ULOGIC thnh mt gi tr SIGNED vi kch c l b bits. o conv_std_logic_vector(p, b): chuyn i mt tham s p thuc kiu d liu INTEGER, UNSIGNED, SIGNED, hoc STD_LOGIC thnh mt gi tr STD_LOGIC_VECTOR vi kch thc b bits. * V d: chuyn i d liu:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ... SIGNAL a: IN UNSIGNED (7 DOWNTO 0); SIGNAL b: IN UNSIGNED (7 DOWNTO 0); SIGNAL y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0); ... y <= CONV_STD_LOGIC_VECTOR ((a+b), 8); -- Php ton hp l: a+b c chuyn i t UNSIGNED thnh mt -- gi tr 8-bit STD_LOGIC_VECTOR, sau gn cho y.
Mt cch khc c th chn c cp n trong mc trc y. N bao gm vic s dng cc gi std_logic_signed v std_logic_unsigned t th vin ieee. Cc gi ny cho php cc php ton vi d liu STD_LOGIC_VECTOR c thc hin nu d liu l kiu SIGNED hoc UNSIGNED, mt cch ln lt.
28
Bng 3.2. Tng hp cc kiu d liu. 3.10. Cc v d. * V d 3.1: S phn chia i vi cc kiu d liu Cc php gn hp l v khng hp l c trnh by k tip c da trn cc nh ngha kiu v cc khai bo tn hiu sau y:
TYPE byte IS ARRAY (7 DOWNTO 0) OF STD_LOGIC; -- 1D -- array TYPE mem1 IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC; -- 2D -- array TYPE mem2 IS ARRAY (0 TO 3) OF byte; -- 1Dx1D -- array TYPE mem3 IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(0 TO 7); -- 1Dx1D -- array SIGNAL a: STD_LOGIC; -- scalar signal SIGNAL b: BIT; -- scalar signal SIGNAL x: byte; -- 1D signal SIGNAL y: STD_LOGIC_VECTOR (7 DOWNTO 0); -- 1D signal SIGNAL v: BIT_VECTOR (3 DOWNTO 0); -- 1D signal SIGNAL z: STD_LOGIC_VECTOR (x'HIGH DOWNTO 0); -- 1D signal SIGNAL w1: mem1; -- 2D signal SIGNAL w2: mem2; -- 1Dx1D signal SIGNAL w3: mem3; -- 1Dx1D signal -------- Legal scalar assignments: --------------------x(2) <= a; -- same types (STD_LOGIC), correct indexing y(0) <= x(0); -- same types (STD_LOGIC), correct indexing z(7) <= x(5); -- same types (STD_LOGIC), correct indexing b <= v(3); -- same types (BIT), correct indexing w1(0,0) <= x(3); -- same types (STD_LOGIC), correct indexing Table 3.2 Synthesizable data types. Data types Synthesizable values BIT, BIT_VECTOR 0, 1
29
30
* V d 3.2: Bit n v bit vector V d ny minh ha s khc nhau gia php gn mt bit n v php gn mt bit vector (ngha l, BIT vi BIT_VECTOR, STD_LOGIC vi STD_LOGIC_VECTOR, hoc STD_ULOGIC vi STD_ULOGIC_VECTOR). Hai on m VHDL c gii thiu pha di. C hai thc hin php ton AND gia cc tn hiu vo v gn kt qu n tn hiu ra. Ch c mt s khc bit gia chng l s lng bit cng vo v cng ra ( mt bit trong v d u tin, 4 bits trong v d th hai). Mch in suy ra t cc on m ny c biu din trn hnh 3.2: -- code 1---------------------------------------------------------------------------ENTITY and2 IS PORT (a, b: IN BIT; x: OUT BIT); END and2; -------------------------------------------------------ARCHITECTURE and2 OF and2 IS BEGIN x <= a AND b; END and2; -----------------------------------------------------------code 2--------------ENTITY and2 IS PORT (a, b: IN BIT_VECTOR (0 TO 3); x: OUT BIT_VECTOR (0 TO 3)); END and2; --------------------------------------------------------------ARCHITECTURE and2 OF and2 IS BEGIN x <= a AND b; END and2
31
Hnh 3.2. M ch c suy ra t m ca v d 3.2 Kt qu m phng trn Active HDL 6.1: Code 1:
Hnh 3.3. B cng 4 bit cho v d 3.3 Hnh 3.3 cho thy gin mc nh ca mt b cng 4 bit, mch in c 2 u vo (a,b) v mt u ra (sum). C 2 gii php c cp. Th nht, tt c cc tn hiu c kiu d liu SIGNED, trong khi gii php th hai u ra c kiu INTEGER. Lu trong gii php th hai c mt hm chuyn i
32
33
4.1.2Ton t Logic. VHDL nh ngha cc ton t logic sau: NOT, AND, OR, NAND, NOR, XOR, XNOR D liu cho cc ton t ny phi l kiu: BIT, STD_LOGIC, STD_ULIGIC, BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR. V d:
y <= NOT a AND b; y <= NOT (a AND b); y <= a NAND b;
4.1.3Ton t ton hc. Cc ton t ny dng cho cc kiu d liu s nh l:INTEGER, SIGNED, UNSIGNED, REAL. Cc ton t bao gm: + Ton t cng.
34
4.1.4Ton t so snh. C cc ton t so snh sau: = So snh bng /= So snh khng bng. < So snh nh hn. > So snh ln hn. <= So snh nh hn hoc bng. >= So snh ln hn hoc bng. 4.1.5Ton t dch. C php s dng ton t dch l: <left operand> <shift operation> <right operand> Trong <left operand> c kiu l BIT_VECTOR, cn <right operand> c kiu l INTEGER. C hai ton t dch: Sll Ton t dch tri. in 0 vo pha phi. Rll Ton t dch phi. in 0 vo pha tri. 4.2. Thuc tnh.
4.1.1.Thuc tnh d liu. VHDL cung cp cc thuc tnh sau. dLOW Tr v gi tr nh nht ca ch s mng. dHIGH Tr v ch s ln nht ca mng. dLEFT Tr v ch s bn tri nht ca mng. dRIGHT Tr v ch s bn phi nht ca mng. dLENGTH Tr v kch thc ca mng. dRANGE Tr v mng cha ch s. dREVERSE_RANGE Tr v mng cha ch s c o ngc. V d: Nu d l mt vector c khai bo nh sau:
SIGNAL d : STD_LOGIC_VECTOR(0 TO 7)
Ta s c:
d'LOW = 0, d'HIGH = 7, d'LEFT = 7, d'RIGHT = 0, d'LENGTH = 8, d'RANGE = (7 downto 0), d'REVERSE_RANGE = (0 to 7).
35
Nu tn hiu c kiu lit k th: dVAL(pos) Tr v gi tr ti pos. dPOS(val) Tr v v tr c gi tr l val. dLEFTOF(value) Tr v gi tr v tr bn tri ca value. dVAL(row,colum) Tr v gi tr mt v tr c bit. 4.1.2.Thuc tnh tn hiu. Cc thuc tnh loi ny ch c p dng i vi d liu SIGNAL. Nu s l mt SIGNAL th ta c : sEVENT : Tr v true khi mt s kin xy ra i vi s. sSTABLE: Tr v true nu khng c s kin no xy ra i vi s. sACTIVE: Tr v true khi s = 1. sQUIET<time>: Tr v true khi trong khong thi gian time khong c s kin no xy ra. sLAST_EVENT: Tr v thi gian tri qua k t s kin cui cng sLAST_ACTIVE: Tr v thi gian k t ln cui cng s = 1 sLAST_VALUE: Tr v gi tr ca s trc s kin trc . Trong cc thuc tnh trn th thuc tnh sEVENT l hay c dng nht. Vi d: y l v d vi tn hiu ng h.
IF (clk'EVENT AND clk='1')... IF (NOT clk'STABLE AND clk='1')... WAIT UNTIL (clk'EVENT AND clk='1'); IF RISING_EDGE(clk)...
4.3.
VHDL, ngoi vic cung cp cc thuc tnh c sn n cn cho php ngi dng t nh ngha cc thuc tnh. Cc thuc tnh ny mun s dng cn phi khai bo v m t r rng theo cu trc sau:
ATTRIBUTE <attribute_name>:< attribute_type>; ATTRIBUTE <attribute_name> OF< target_name>: <class> IS <value>;
36
Cng ging nh cc thuc tnh c nh ngha bi ngi dng. Trong VHDL ta cng c th xy dng chng cc ton t ton hc. xy dng chng cc ton t ny ta cn phi ch r loi d liu tham gia. V d nh ton t + trn ch p dng cho cc loi d liu cng kiu s.By gi ta xy dng ton t + dng cng mt s INTEGER vi mt BIT.
FUNCTION "+" (a: INTEGER, b: BIT) RETURN INTEGER IS BEGIN IF (b='1') THEN RETURN a+1; ELSE RETURN a; END IF; END "+";
4.5.
GENERIC.
GENERIC l mt cch to cc tham s dng chung (ging nh cc bin static trong cc ngn ng lp trnh). Mc ch l cho cc on code mm do v d s dng li hn. Mt on GENERIC khi c s dng cn phi c m t trong ENTITY. Cc tham s phi c ch r. Cu trc nh sau: GENERIC (parameter_name : parameter_type := parameter_value); V d: V d sau s nh ngha bin n c kiu INTEGER v l GENERIC n c gi tr mc nh l 8. Khi khi n c gi bt k u, trong mt ENTITY hay mt ARCHITECTURE theo sau gi tr ca n lun l 8.
ENTITY my_entity IS GENERIC (n : INTEGER := 8); PORT (...); END my_entity; ARCHITECTURE my_architecture OF my_entity IS ... END my_architecture;
37
Hnh 4.1. B m ho cho v d 4.1 Khi tn hiu ena = 0 th tt c cc bt u ra x = 1. u ra c chn theo u vo sel. Chng trnh sau y m t v i tng ny vi 3 u vo sel v pha u ra c 8 ng x.
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY decoder IS PORT ( ena : IN STD_LOGIC; sel : IN STD_LOGIC_VECTOR (2 DOWNTO 0); x : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END decoder; ARCHITECTURE generic_decoder OF decoder IS BEGIN PROCESS (ena, sel) VARIABLE temp1 : STD_LOGIC_VECTOR (x'HIGH DOWNTO 0); VARIABLE temp2 : INTEGER RANGE 0 TO x'HIGH; BEGIN temp1 := (OTHERS => '1'); temp2 := 0; IF (ena='1') THEN FOR i IN sel'RANGE LOOP IF (sel(i)='1') THEN temp2:=2*temp2+1; ELSE temp2 := 2*temp2; END IF; END LOOP; temp1(temp2):='0'; END IF; x <= temp1; END PROCESS;
38
Hnh 4.2 M phng kt qu ca b m ho Nh chng ta thy khi ena =0 th tt c cc bt pha u ra u bng 1. Khi ena = 1 th ch mt bt pha u ra c chn tc l bng 0. V d nh khi sel=000 th u ra x = 11111110, sel = 001 x = 11111101. Trong v d trn ta s dng cc ton t +, * , cc ton t gn v thuc tnh RANGE. V d 2 : Generic parity detector. V d sau y m phng mt mch pht hin tnh parity. N bao gm mt u vo n bt v mt u ra. u ra s c gi tr bng 0 khi s u vo c gi tr l mt l mt s chn v bng 1 trong cc trng hp cn li.
39
Trong on m trn chng ta s dng mt mnh GENERIC nh ngha n =7. Khi tt c cc ln n xut hin n u c gi tr l 7. Kt qu ca mch c biu din bi hnh sau. Khi u vo input =00000000 th u ra output =0. Khi input =00000001 th u ra output = 1 v s u vo l 1 l mt s l.
Hnh 4.4. M phng kt qu ca hnh 4.2 V d 3: Parity Generator Mch sau s thm mt bt parity vo tn hiu input. Bt ny l 0 khi s u vo =1 ca input l mt s chn v bng 0 trong trng hp ngc li. Nh vy mch s gm n-1 u vo d liu v n u ra, trong n-1 u ra bn phi ging nh n-1 u vo, u ra cn li l gi tr kim tra parity.
40
Kt qu:
50 1 00 01 81 1 50 200 02 82 250 300 03 03 350 400 04 84 450 500 05 05 ns
input output
00 00
Hnh 4.6. M phng kt qu ca v d 4.3 Nh ta thy khi u vo input =0000000 th u ra output = 00000000. Khi u vo input =0000001 th u ra output = 10000001.
41
u tin chng ta s xem xt s khc bit gia mch t hp v mch dy sau s xem st s khc bit gia m ngun tun t v m song song. 5.1.1.Mch t hp v mch dy. Mch t hp l mch m u ra ca mch ch ph thuc vo u vo ca h ti thi im hin ti. T ta thy, h ny khng cn yu cu b nh v chng c to thnh ch t cc cng logic c bn. Mch dy l mch m u ra ca mch cn ph thuc vo c u vo trong qu kh ca mch. T ta thy i vi h ny cn phi c b nh v mt vng phn hi tn hiu. Hnh sau y m t hai loi mch ny.
Hnh 5.1. Mch t hp v mch dy 5.1.2.M song song v m tun t. M ngun VHDL l song song. Ch cc on m trong mt PROCESS, FUNCTION, PROCEDURE l tun t. Cc khi ny c thc hin mt cch tun t. M song song c gi l m lung d liu ( dataflow code). V d. Mt on m gm ba khi lnh song song ( stat1, stat 2, stat3). Khi cc on sau s thc hin cng mt lc trong mch vt l.
42
y l cch c bn nht dng to cc on m song song. Cc ton t (AND, OR, ..) c tm hiu trn s c lit k bng di y. Cc ton t c th c s dng nh l mt thnh phn ca mch t hp. Tuy nhin r rng. Cc mch hon chnh s s dng cch vit tun t mc d cc mch khng cha cc phn t tun t. Cc v d sau y c thit k ch s dng cc thnh phn logic c bn.
Hnh 5.2. B dn knh B dn knh 4-1 c 4 u vo d liu, hai u vo iu khin v mt u ra. Tn hiu u ra s l tn hiu ca mt trong 4 u vo tu theo gi tr ca hai u vo iu khin s0,s1. Sau y l chng trnh m phng.
43
Kt qa m phng.
50 1 00 1 50 200 250 300 350 400 450 500 ns
a b c d s0 s1 y
WHEN l mt thnh phn ca cc khi ln song song. N xut hin trong hai trng hp. WHEN / ELSE v WITH / SELECT / WHEN. C php c trnh by nh sau.
V d:
44
Sau y ta s xem xt cc v d dng mnh WHEN. V d 1: B dn knh 4 -1. Nguyn tc hot ng ca mch ny ta ni trn. y chng ta s dng mnh WHEN thay cho c ton t. Chng ta c th dng theo c hai cch. d hiu chng ta s xem xt c hai cch s dng mnh WHEN.
45
V d 2: B m 3 trng thi.
Hnh 5.5. B m 3 trng thi Mch b m 3 trng thi cho u ra output = input khi ena = 0 v tr khng cao khi ena = 1.
LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------------ENTITY tri_state IS PORT ( ena: IN STD_LOGIC; input: IN STD_LOGIC_VECTOR (7 DOWNTO 0); output: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END tri_state; ---------------------------------------------ARCHITECTURE tri_state OF tri_state IS BEGIN output <= input WHEN (ena='0') ELSE (OTHERS => 'Z'); END tri_state; ----------------------------------------------
Kt qu m phng
46
V d 3: Encoder.
Hnh 5.7. B m ho cho v d 5.4 Mt b ENCODER c n u vo, m u ra vi m = log2 (n). Ti mt thi im ch c mt bt u vo bng 1. Sau y l chng trnh m phng s dng WHEN theo c hai cch dng WHEN / ELSE,v WITH / SELECT / WHEN. ---- s dng WHEN/ELSE ------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY encoder IS PORT ( x: IN STD_LOGIC_VECTOR (7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); END encoder; --------------------------------------------ARCHITECTURE encoder1 OF encoder IS BEGIN y <= "000" WHEN x="00000001" ELSE "001" WHEN x="00000010" ELSE "010" WHEN x="00000100" ELSE "011" WHEN x="00001000" ELSE "100" WHEN x="00010000" ELSE "101" WHEN x="00100000" ELSE "110" WHEN x="01000000" ELSE "111" WHEN x="10000000" ELSE "ZZZ"; END encoder1; ---------------------------------------------
47
Kt qu m phng:
1 00 200 02 1 300 03 Z 400 04 2 500 05 Z 600 06 700 07 800 08 3 900 09 Z 1 000 0A ns 0B
x y
00 Z
01 0
Hnh 5.9. ALU Mch ALU thc hin cc php ton logic v ton hc i vi hai u vo a v b. Chng c iu khin bi 4 bt sel(3:0). Tu thuc vo gi tr ca sel m khi s thc hin thao tc no vi d liu. Bng di y m t cc thao tc ca ALU.
48
---------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ---------------------------------------------ENTITY ALU IS PORT (a, b: IN STD_LOGIC_VECTOR (7 DOWNTO 0); sel: IN STD_LOGIC_VECTOR (3 DOWNTO 0); cin: IN STD_LOGIC; y: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END ALU; ---------------------------------------------ARCHITECTURE dataflow OF ALU IS SIGNAL arith, logic: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN ----- Arithmetic unit: -----WITH sel(2 DOWNTO 0) SELECT arith <= a WHEN "000", a+1 WHEN "001", a-1 WHEN "010", b WHEN "011", b+1 WHEN "100", b-1 WHEN "101", a+b WHEN "110", a+b+cin WHEN OTHERS; ----- Logic unit: ----------WITH sel(2 DOWNTO 0) SELECT logic <= NOT a WHEN "000", NOT b WHEN "001", a AND b WHEN "010", a OR b WHEN "011", a NAND b WHEN "100", a NOR b WHEN "101",
49
Kt qu m phng.
50 1 00 01 02 01 1 50 200 02 02 02 250 300 03 04 03 350 400 04 03 04 450 500 05 05 05 ns
00 00 00
FF 0 00
FE 1 02
FD 0 02
FC 1 04
04 2 03
05 3 05
5.4.
GENERATE l mt khi lnh song song khc. N tng ng vi khi lnh tun t LOOP trong vic cho php cc on lnh c thc hin lp li mt s ln no . Mu dng ca n l FOR / GENERATE.
label: FOR identifier IN range GENERATE (concurrent assignments) END GENERATE;
Mt cch khc s dng GENERATE l dng IF. y mnh ELSE khng c s dng. Mt cch hay c s dng l dng IF trong FOR/GENERATE. Mu s dng nh sau.
label1: FOR identifier IN range GENERATE ... label2: IF condition GENERATE (concurrent assignments) END GENERATE; ... END GENERATE;
V d:
SIGNAL x: BIT_VECTOR (7 DOWNTO 0); SIGNAL y: BIT_VECTOR (15 DOWNTO 0); SIGNAL z: BIT_VECTOR (7 DOWNTO 0); ... G1: FOR i IN x'RANGE GENERATE z(i) <= x(i) AND y(i+8); END GENERATE;
Mt iu cn phi ch l gii hn ca dy phi c khai bo l static nu khng s khng hp l. Trong v d sau choice khng c khai bo l static nn khng hp l:
NotOK: FOR i IN 0 TO choice GENERATE (concurrent statements)
50
hiu r hn v khi lnh GENERATE chng ta s xt v d sau: V d: Vector shifter. V d sau minh ho cho vic s dng GENERATE. Trong u vo s c dch i mt bt v to thnh u ra. V d u vo c 4 ng v gi tr ban u l 1111 th u ra s c m t nh sau: row(0): 0 0 0 0 1 1 1 1 row(1): 0 0 0 1 1 1 1 0 row(2): 0 0 1 1 1 1 0 0 row(3): 0 1 1 1 1 0 0 0 row(4): 1 1 1 1 0 0 0 0 Chng trnh m phng.
-----------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -----------------------------------------------ENTITY shifter IS PORT ( inp: IN STD_LOGIC_VECTOR (3 DOWNTO 0); sel: IN INTEGER RANGE 0 TO 4; outp: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END shifter; -----------------------------------------------ARCHITECTURE shifter OF shifter IS SUBTYPE vector IS STD_LOGIC_VECTOR (7 DOWNTO 0); TYPE matrix IS ARRAY (4 DOWNTO 0) OF vector; SIGNAL row: matrix; BEGIN row(0) <= "0000" & inp; G1: FOR i IN 1 TO 4 GENERATE row(i) <= row(i-1)(6 DOWNTO 0) & '0'; END GENERATE; outp <= row(sel); END shifter;
Kt qu m phng:
50 1 00 1 01 1 1 50 200 0 02 2 250 300 0 03 3 04 4 350 400 450 500 ns
0 00 0
Hnh 5.11. Kt qu m phng ca v d 5.6 Nh hnh ta thy, nu input = 0011th u ra output =00000011 khi sel = 0. output = 00000110 khi sel = 1. output = 00001100 nu sel = 2. 5.5. BLOCK.
51
V d:
b1: BLOCK SIGNAL a: STD_ BEGIN a <= input_sig END BLOCK b1;
5.5.2.Guarded BLOCK
52
unguarded
tm hiu r hn v khi BLOCK ta i xt v d sau: Vd 1: Cht s dng Guarded BLOCK. Trong v d ny khi no clk = 1 th khi c hot ng khi khi lnh s c thc hin.
------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------ENTITY latch IS PORT (d, clk: IN STD_LOGIC; q: OUT STD_LOGIC); END latch; ------------------------------ARCHITECTURE latch OF latch IS BEGIN b1: BLOCK (clk='1') BEGIN q <= GUARDED d; END BLOCK b1; END latch; -------------------------------
Kt qu m phng
1 00 200 300 400 500 600 700 800 900 1 000 ns
clk d q
Hnh 5.12. Kt qu m phng cho v d 5.7 V d 2: DFF dng Guarded BLOCK.Trong v d ny chng ta s xem xt hot ng ca mt TrigerT hot ng ng b sn dng.
------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------ENTITY dff IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ------------------------------ARCHITECTURE dff OF dff IS
53
Kt qu m phng:
1 00 200 300 400 500 600 700 800 900 1 000 ns
clk d q rst
Chng 6: M tun t
6.1. PROCESS
PROCESS l phn tun t ca m VHDL. N c m t bi cc cu lnh IF, WAIT, CASE, hoc LOOP, v bi danh sch nhy (ngoi tr WAIT c s dng). PROCESS phi c ci t trong m chnh, v c thc thi mi thi im mt tn hiu trong danh sch nhy thay i.
C php: [label:] PROCESS (sensitivity list) [VARIABLE name type [range] [:= initial_value;]] BEGIN (sequential code) END PROCESS [label];
VARIABLES l tu chn. Nu s dng, chng phi c khai bo trong phn khai bo ca PROCESS (trc t kho BEGIN). Gi tr khi to khng th kt hp, ch ly i din khi m phng. Nhn cng c s dng tu chn, mc ch l nng cao kh nng c c ca m. Nhn c th l bt k t no, ngoi tr t kho. V d 6.1a:
54
rst d clk q
6.2.
Signals v Variables.
VHDL c hai cch nh ngha cc gi tr khng tnh: bng SIGNAL hoc bng VARIABLE. SIGNAL c th c khai bo trong PACKAGE, ENTITY hoc ARCHITECTURE (trong phn khai bo ca n), trong khi VARIABLE c th c m t bn trong mt phn ca m tun t (trong PROCESS). Do , trong khi gi tr ca phn trc c th l ton cc, phn sau lun l cc b. Gi tr ca VARIABLE c th khng bao gi nh ngha ngoi PROCESS mt cch trc tip, nu cn, th n phi c gn thnh SIGNAL.
55
IF, WAIT, CASE, v LOOP l cc cu lnh i vi m tun t. Do , chng ch c th c s dng bn trong PROCESS, FUNCTION hoc PROCEDURE. V nguyn tc, c mt kt qu ph nh, tng hp s ti u ho cu trc v trnh i su vo phn cng. C php:
IF conditions THEN assignments; ELSIF conditions THEN assignments; ... ELSE assignments;
END IF; V d:
IF (x<y) THEN temp:="11111111"; ELSIF (x=y AND w='0') THEN temp:="11110000"; ELSE temp:=(OTHERS =>'0');
V d 6.3a:
clk digit
0 1 2 3 4 5 6 7 8 9
V d 6.3b:
57
6.4.
WAIT.
Php ton WAIT i khi tng t nh IF. Tuy nhin, nhiu hn mt nh dng c th dng c. Hn na, khi IF, CASE, hoc LOOP c s dng, PROCESS khng th c mt danh sch nhy khi WAIT c s dng. C php:
WAIT UNTIL signal_condition; WAIT ON signal1 [, signal2, ... ]; WAIT FOR time;
Cu lnh WAIT UNTIL nhn ch mt tn hiu, do thch hp cho m ng b hn l m khng ng b. Khi PROCESS khng c danh sch nhy trong trng hp ny, WAIT phi l cu lnh u tin trong PROCESS. PROCESS c thc hin mi thi im khi gp iu kin. V d: Thanh ghi 8 bit vi tn hiu reset ng b
PROCESS -- no sensitivity list BEGIN WAIT UNTIL (clk'EVENT AND clk='1'); IF (rst='1') THEN output <= "00000000"; ELSIF (clk'EVENT AND clk='1') THEN output <= input; END IF;
58
WAIT ON, trong cch x l khc, nhn nhiu tn hiu. PROCESS c t gi cho n khi bt k tn hiu no thay i. PROCESS s tip tc thc hin bt k khi no mt thay i trong rst hoc clk xut hin. V d: Thanh ghi 8 bit vi tn hiu reset khng ng b
PROCESS BEGIN WAIT ON clk, rst; IF (rst='1') THEN output <= "00000000"; ELSIF (clk'EVENT AND clk='1') THEN output <= input; END IF; END PROCESS;
rst d clk q
59
clk digit
0 1 2 3 4 5 6 7 8 9
6.5.
CASE. CASE l lnh duy nht cho m tun t (i km vi IF, LOOP, v WAIT).
C php:
CASE identifier IS WHEN value => assignments; WHEN value => assignments; ... END CASE;
60
Lnh CASE (tun t) tng t vi WHEN (kt hp). Tt c s hon v u phi c kim tra, v vy t kho OTHERS rt hu ch. T kho quan trng khc l NULL (bn sao ca UNAFFECTED), nn c s dng khi khng c hot ng no thay th. V d: WHEN OTHERS => NULL;. Tuy nhin, CASE cho php nhiu php gn vi mi iu kin kim tra, trong khi WHEN ch cho php mt. Ging nh trong trng hp ca WHEN, y WHEN value c th c 3 dng: WHEN value -- single value WHEN value1 to value2 -- range, for enumerated data types -- only WHEN value1 | value2 |... -- value1 or value2 or ... WHEN CASE Kiu lnh ng thi Tun t S dng Ch ngoi PROCESS, Ch trong PROCESS, FUNCTION, hoc FUNCTION, hoc PROCEDURE PROCEDURE Tt c s hon v phi C vi C c kim tra WITH/SELECT/WHEN S php gn ln nht 1 Bt k cho mi kim tra T kho khng kch UNAFFECTED NULL hot Bng 6.1. So snh gia WHEN v CASE V d: Vi WHEN:
WITH sel SELECT x <= a WHEN "000", b WHEN "001", c WHEN "010", UNAFFECTED WHEN OTHERS;
Vi CASE:
CASE sel IS
61
Vi CASE:
CASE sel IS WHEN "00" => x<=a; WHEN "01" => x<=b; WHEN "10" => x<=c; WHEN OTHERS => x<=d; END CASE;
rst d clk q
62
63
6.6.
LOOP.
LOOP hu ch khi mt phn ca m phi c th hin nhiu ln. Ging nh IF, WAIT, v CASE, LOOP l duy nht i vi m tun t, v vy n cng c th c s dng bn trong PROCESS, FUNCTION, hay PROCEDURE.
64
V d: Vi FOR/LOOP:
FOR i IN 0 TO 5 LOOP x(i) <= enable AND w(i+2); y(0, i) <= w(i); END LOOP;
Mt c im quan trng ca FOR/LOOP (tng t to vi GENERATE) l gii hn ti thiu phi l tnh. Do , mt khai bo kiu FOR i IN 0 TO choice LOOP, vi choice l mt tham s u vo (khng tnh), khng kt hp tng qut c. V d: Vi WHILE/LOOP
WHILE (i < 10) LOOP WAIT UNTIL clk'EVENT AND clk='1'; (other statements) END LOOP;
V d: Vi EXIT
FOR i IN data'RANGE LOOP CASE data(i) IS WHEN '0' => count:=count+1;
65
V d:
FOR i IN 0 TO 15 LOOP NEXT WHEN i=skip; -- jumps to next iteration (...) END LOOP;
Vi NEXT
cin a b s cout
92 24 B7 40 81 C2 04 09 0D 31 63 94 86 0D 93 C6 8D 53 32 65 97
Cch 1: Dng Generic vi cc VECTOR ----- Solution 1: Generic, with VECTORS -------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY adder IS GENERIC (length : INTEGER := 8); PORT ( a, b: IN STD_LOGIC_VECTOR (length-1 DOWNTO 0); cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR (length-1 DOWNTO 0); cout: OUT STD_LOGIC);
66
Cch 2: Dng non-generic vi cc INTEGER ---- Solution 2: non-generic, with INTEGERS ---LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY adder IS PORT ( a, b: IN INTEGER RANGE 0 TO 255; c0: IN STD_LOGIC; s: OUT INTEGER RANGE 0 TO 255; c8: OUT STD_LOGIC); END adder; ARCHITECTURE adder OF adder IS BEGIN PROCESS (a, b, c0) VARIABLE temp : INTEGER RANGE 0 TO 511; BEGIN IF (c0='1') THEN temp:=1; ELSE temp:=0; END IF; temp := a + b + temp; IF (temp > 255) THEN c8 <= '1'; temp := temp; ---256 ELSE c8 <= '0'; END IF; s <= temp; END PROCESS; END adder;
V d 6.6b:
67
00 0 00
68
data zeros
00 8
01 7
6.7.
Bad Clocking.
Trnh bin dch ni chung khng c kh nng tng hp cc m cha cc php gn cho tn hiu ging nhau ti c chuyn tip ca tn hiu ng h (clock) tham chiu (ti sn dng cng ti sn m). Trong trng hp ny, trnh bin dch c th thng bo mt thng ip signal does not hold value after clock edge hoc tng t.
69
Trnh bin dch c th cn thng bo rng tn hiu counter b nhn dn. Trong trng hp ny, vic bin dch s b treo. Kha cnh quan trng khc l thuc tnh EVENT phi c lin quan ti iu kin kim tra. V d: lnh IF (clkEVENT and clk=1) l ng, nhng ch s dng IF (clkEVENT) c th trnh bin dch gi s mt gi tr kim tra mc nh (and clk=1) hoc thng bo mt thng ip clock not locally stable.
PROCESS (clk) BEGIN IF (clk'EVENT) THEN counter := counter + 1; END IF; ... END PROCESS;
Khi PROCESS c chy mi thi im clk thay i, b m c th c tng hai trn mi chu k clock. Tuy nhin, iu ny khng xy ra. Nu trnh bin dch gi thit mt gi tr mc nh, mt mch li s c tng hp, bi v ch mt sn ca clk s c quan tm; nu khng c gi tr mc nh gi thit, th mt thng ip li v khng c s bin dch c mong mun. Nu mt tn hiu xut hin trong danh sch nhy, nhng khng xut hin trong bt k php gn no ca PROCESS, th xem nh trnh bin dch s b qua. Tuy nhin, mt thng ip ignored unnecessary pin clk c th c thng bo.
PROCESS (clk) BEGIN counter := counter + 1; ... END PROCESS;
Hai on m PROCESS sau s c tng hp chnh xc bi bt k trnh bin dch no. Tuy nhin, ch rng s dng mt tn hiu khc nhau trong mi PROCESS.
70
Hnh 6.7a.2. Kt qu m phng Mch c bus d liu vo (data_in), bus d liu ra (data_out), bus a ch (addr), cng tn hiu clock (clk) v cc chn cho php ghi (wr_ena). Khi wr_ena c xc nhn, ti sn dng tip theo ca clk, vector c mt ti data_in phi c lu tr ti a ch c m t bi addr. u ra, data_out, bng cch x l khc, phi hin th lin tc d liu chn bi addr. Khi wr_ena mc thp, q c ni vi u vo ca flip-flop, v d c m, v vy khng c d liu mi s c ghi vo b nh. Khi wr_ena tr v mc cao, d c ni vi u vo ca thanh ghi, v vy ti sn dng tip theo ca clk, d s ghi gi tr lin trc.
LIBRARY ieee; USE ieee.std_logic_1164.all;
71
6.8.
M tun t c th c s dng thc hin cc h dy hay t hp. Trong trng hp h dy, cc thanh ghi l cn thit, v vy s c suy ra bi trnh bin dch. Tuy nhin, iu ny s khng xy ra trong trng hp h t hp. Hn na, nu m c dng cho h t hp, th bng tht y nn c mt t r rng trong m. tho mn cc tiu chun trn c cc lut c xt: - Lut 1: m bo tt c tn hiu u vo s dng trong PROCESS xut hin trong danh sch nhy ca n. Trnh bin dch a ra cnh bo nu mt tn hiu u vo cho khng c cha trong danh sch nhy, v sau x l nu tn hiu c cha. - Lut 2: m bo tt c t hp cc tn hiu u vo/u ra c bao gm trong m, bng tht y ca mch c th c cha (iu ny ng vi c m tun t v m ng thi). Cc c t khng y ca cc tn hiu u ra c th gy cho vic tng hp suy ra cc cht gi cc gi tr lin trc. V d 6.8a: Thit k mch t hp sai
72
a b c d sel x y
0 3 1
Hnh 6.8a.2. Kt qu m phng x hot ng nh mt b dn knh, y = 0 khi sel = 00, hoc = 1 nu sel = 01. Tuy nhin cc c t c cung cp cho y khng dy .
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY example IS PORT (a, b, c, d: IN STD_LOGIC; sel: IN INTEGER RANGE 0 TO 3; x, y: OUT STD_LOGIC); END example; ARCHITECTURE example OF example IS BEGIN PROCESS (a, b, c, d, sel) BEGIN IF (sel=0) THEN x<=a; y<='0'; ELSIF (sel=1) THEN x<=b; y<='1'; ELSIF (sel=2) THEN x<=c; ELSE x<=d; END IF; END PROCESS; END example;
73
V d:
CONSTANT set_bit : BIT := '1'; CONSTANT datamemory : memory := (('0','0','0','0'), ('0','0','0','1'), ('0','0','1','1'));
CONSTANT c th c khai bo trong PACKAGE, ENTITY v ARCHITECTURE. Khi khai bo trong gi (package), n l ton cc, gi c th c s dng bi nhiu thc th (entity). Khi khai bo trong thc th (sau PORT), n l ton cc vi tt c cc kin trc (architecture) theo thc th. Khi khai bo trong kin trc (trong phn khai bo ca n), n ch ton cc vi m ca kin trc . 7.2. SIGNAL.
SIGNAL phc v gii quyt cc gi tr vo v ra ca mch, cng nh l gia cc n v bn trong ca n. Tn hiu biu din cho vic kt ni mch (cc dy). Th hin l, tt c cc PORT ca ENTITY l cc tn hiu mc nh. C php:
SIGNAL name : type [range] [:= initial_value];
V d:
SIGNAL control: BIT := '0'; SIGNAL count: INTEGER RANGE 0 TO 100; SIGNAL y: STD_LOGIC_VECTOR (7 DOWNTO 0);
75
00 0 0
76
Ngc li vi CONSTANT v SIGNAL, VARIABLE ch biu din thng tin cc b. N ch c th c s dng bn trong PROCESS, FUNCTION, hay PROCEDURE (trong m tun t). Vic cp nht gi tr ca n l tc th, v vy gi tr mi c th c lp tc s dng trong dng lnh tip theo ca m. C php:
VARIABLE name : type [range] [:= init_value];
V d:
VARIABLE control: BIT := '0'; VARIABLE count: INTEGER RANGE 0 TO 100; VARIABLE y: STD_LOGIC_VECTOR (7 DOWNTO 0) := "10001000";
Khi VARIABLE ch c th c s dng trong m tun t, khai bo ca n ch c th c thc hin trong phn khai bo ca PROCESS, FUNCTION, hay PROCEDURE. Php ton gn ca VARIABLE l := (count:=35;). Cng ging nh trng hp ca SIGNAl, gi tr khi to khng th tng hp c, ch c xt khi m phng. V d 7.3a: B m s s 1 ca mt vector nh phn Khi cp nht bin l tc th, gi tr khi to c thit lp chnh xc v khng c thng bo no v nhiu php gn do trnh bin dch.
50 1 00 02 1 50 03 2 200 04 1 250 05 2 300 06 350 07 3 400 08 1 450 09 2 500 0A 550 0B 3 600 0C 2 ns 0D 3
din ones
00 0
01 1
ENTITY count_ones IS PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0); ones: OUT INTEGER RANGE 0 TO 8); END count_ones; ARCHITECTURE ok OF count_ones IS BEGIN PROCESS (din) VARIABLE temp: INTEGER RANGE 0 TO 8;
77
SIGNAL <= Biu din s kt ni cc mch (cc dy) C th l ton cc (trn ton b m)
Hot ng
S dng
Cp nht khng tc th trong m tun t (gi tr mi ch c th dng lc kt thc PROCESS, FUNCTION, hay PROCEDURE) Trong PACKAGE, ENTITY, hay ARCHITECTURE. Trong ENTITY, tt c cc PORT l cc SIGNAL mc nh
VARIABLE := Biu din thng tin cc b Cc b (ch trong PROCESS, FUNCTION, hay PROCEDURE tng ng) Cp nht tc th (gi tr mi c th c s dng trong dng lnh tip theo ca m) Ch trong m tun t, trong PROCESS, FUNCTION, hay PROCEDURE
78
Cch 1: S dng SIGNAL (khng ng) -- Solution 1: using a SIGNAL (not ok) -LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY mux IS PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; y: OUT STD_LOGIC); END mux; ARCHITECTURE not_ok OF mux IS SIGNAL sel : INTEGER RANGE 0 TO 3; BEGIN PROCESS (a, b, c, d, s0, s1) BEGIN sel <= 0; IF (s0='1') THEN sel <= sel + 1; END IF; IF (s1='1') THEN sel <= sel + 2; END IF; CASE sel IS WHEN 0 => y<=a; WHEN 1 => y<=b; WHEN 2 => y<=c; WHEN 3 => y<=d; END CASE; END PROCESS; END not_ok;
Cch 2: S dng VARIABLE (ng) -- Solution 2: using a VARIABLE (ok) ---LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux IS PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; y: OUT STD_LOGIC); END mux; ARCHITECTURE ok OF mux IS BEGIN PROCESS (a, b, c, d, s0, s1) VARIABLE sel : INTEGER RANGE 0 TO 3; BEGIN sel := 0; IF (s0='1') THEN sel := sel + 1;
79
Mt li thng xuyn khi s dng SIGNAL l khng nh n c th yu cu mt khong thi gian cp nht. Do , php gn sel <= sel + 1 (dng 16) trong cch 1, kt qu cng thm 1 bt k gi tr va c to lin trc cho sel, vi php gn sel <= 0 (dng 15) c th khng c thi gian to. iu ny ng vi vi sel <= sel +2 (dng 18). y khng l vn khi s dng VARIABLE, php gn ca n lun tc th. Kha cnh th 2 c th l mt vn trong cch 1 l hn mt php ton ang c to cho cng SIGNAL (sel, dng 15, 16, v 18), c th khng c chp nhn. Tm li, ch mt php gn vi SIGNAL c php bn trong PROCESS, v vy phn mm ch xt php gn cui cng (sel <= sel +2) hoc n gin l a ra thng bo li v kt thc vic bin dch. y cng khng bao gi l vn khi s dng VARIABLE.
20 40 60 80 1 00 1 20 1 40 1 60 1 80 200 220 240 260 280 300 ns
s0 s1 a b c d y
50
1 00
1 50
200
250
300
350
400
450
500
550
600
ns
s0 s1 a b c d y
80
Hnh 7.3c.1. DFF Cch 1: Khng ng ---- Solution 1: not OK --------------LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE not_ok OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q <= d; qbar <= NOT q; END IF; END PROCESS; END not_ok;
ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE ok OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q <= d; END IF; END PROCESS;
81
Trong cch 1, cc php gn q<=d (dng 16) v qbar<=NOT q (dng 17) u ng b, v vy cc gi tr mi ca chng s ch c dng lc kt thc PROCESS. y l vn i vi qbar, bi v gi tr mi ca q khng va mi to ra. Do , qbar s nhn gi tr o gi tr c ca q. Gi tr ng ca qbar s b tr mt chu k ng h, gy cho mch lm vic khng chnh xc. Trong cch 2, thay qbar<=NOT q (dng 30) bn ngoi PROCESS, do php tnh nh mt biu thc ng thi ng.
50 1 00 1 50 200 250 300 350 400 450 500 550 600 ns
d clk q qbar
50
1 00
1 50
200
250
300
350
400
450
500
550
600
ns
d clk q qbar
Hnh 7.3d.1. B chia tn Thc hin hai u ra, mt l da trn SIGNAL (count1), v mt da trn VARIABLE (count2).
20 40 60 80 1 00 1 20 1 40 1 60 1 80 200 220 240 260 280 300 ns
82
7.4.
S thanh ghi.
S flip-flop c suy ra t m bi trnh bin dch. Mc ch l khng ch hiu tip cn yu cu s thanh ghi ti thiu, m cn m bo on m thc hin mch mong mun. Mt SIGNAL sinh mt flip-flop bt c khi no mt php gn c to ra ti s chuyn tip ca tn hiu khc, khi mt php gn ng b xy ra. Php gn ng b, c th ch xy ra bn trong PROCESS, FUNCTION, hay PROCEDURE (thng l mt khai bo kiu IF signalEVENT hoc WAIT UNTIL ). Mt VARIABLE s khng sinh cc flip-flop cn thit nu gi tr ca n khng bao gi ri PROCESS (hoc FUNCTION, hoc PROCEDURE). Tuy nhin, nu mt gi tr c gn cho mt bin ti s chuyn tip ca tn hiu khc, v gi tr thm ch c a ti mt tn hiu (ri PROCESS), th cc flipflop s c suy ra. Mt VARIABLE cn sinh mt thanh ghi khi n c s dng trc mt gi tr va c gn cho n. V d: Trong PROCESS, output1 v output2 u s c lu tr (suy ra cc flip-flop), bi v c hai u c gn ti s chuyn tip ca tn hiu khc (clk).
PROCESS (clk)
83
Trong PROCESS tip theo, ch output1 c lu tr (output2 s to cch s dng cc cng logic).
PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN output1 <= temp; -- output1 stored END IF; output2 <= a; -- output2 not stored END PROCESS; Trong PROCESS, bin temp s gy ra tn hiu x lu tr PROCESS (clk) VARIABLE temp: BIT; BEGIN IF (clk'EVENT AND clk='1') THEN temp <= a; END IF; x <= temp; -- temp causes x to be stored END PROCESS;
V d 7.4a: DFF vi q v qbar Cch 1 c 2 php gn SIGNAL ng b (dng 16-17), v vy 2 flip-flop s c sinh. Cch 2 c mt trong cc php gn l ng b, vic tng hp s lun suy ra ch mt flip-flop
84
d clk q qbar
50
1 00
1 50
200
250
300
350
400
450
500
550
600
ns
d clk q qbar
Hnh 7.4a.2. Kt qu m phng cch 1 v 2 Cch 1: Sinh hai DFF ---- Solution 1: Two DFFs --------------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE two_dff OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q <= d; -- generates a register qbar <= NOT d; -- generates a register END IF; END PROCESS; END two_dff;
Cch 2: Sinh mt DFF ---- Solution 2: One DFF ---------------LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff IS PORT ( d, clk: IN STD_LOGIC; q: BUFFER STD_LOGIC; qbar: OUT STD_LOGIC); END dff; ARCHITECTURE one_dff OF dff IS BEGIN
85
V d 7.4b: B m 0 - 7
Hnh 7.4b.1. B m 0 7 Cch 1: Mt php gn VARIABLE ng b c tao ra (dng 14-15). Mt VARIABLE c th sinh cc thanh ghi bi v php gn ca n (dng 15) ti s chuyn tip ca tn hiu khc (clk, dng 14) v gi tr ca n khng ri PROCESS (dng 17). ------ Solution 1: With a VARIABLE -------ENTITY counter IS PORT ( clk, rst: IN BIT; count: OUT INTEGER RANGE 0 TO 7); END counter;
ARCHITECTURE counter OF counter IS BEGIN PROCESS (clk, rst) VARIABLE temp: INTEGER RANGE 0 TO 7; BEGIN IF (rst='1') THEN temp:=0; ELSIF (clk'EVENT AND clk='1') THEN temp := temp+1; END IF; count <= temp;
86
Cch 2: Mt php gn SIGNAL ng b xy ra (dng 13-14). Ch s dng cc SIGNAL. Ch , khi khng c tn hiu ph c s dng, count cn c khai bo nh kiu BUFFER (dng 14), bi v n c gn mt gi tr v cng c c (s dng) ni ti (dng 14). Mt SIGNAL, ging nh mt VARIABLE, c th cng c tng khi s dng trong m tun t. ------ Solution 2: With SIGNALS only ------ENTITY counter IS PORT ( clk, rst: IN BIT; count: BUFFER INTEGER RANGE 0 TO 7); END counter; ARCHITECTURE counter OF counter IS BEGIN PROCESS (clk, rst) BEGIN IF (rst='1') THEN count <= 0; ELSIF (clk'EVENT AND clk='1') THEN count <= count + 1; END IF; END PROCESS; END counter;
50
1 00
1 50
200
250
300
350
400
450
500
550
600
ns
87
Hnh 7.4c.1. Thanh ghi dch 4 cp Cch 1: 3 VARIABLE c s dng (a, b, v c, dng 10). Tuy nhin cc bin c s dng trc cc gi tr c gn cho chng (o ngc th t, bt u vi dout, dng 13, v kt thc vi din, dng 16). Kt qu l, cc flip-flop s c suy ra, lu tr cc gi tr t php chy lin trc ca PROCESS. -------- Solution 1: ----------------ENTITY shift IS PORT ( din, clk: IN BIT; dout: OUT BIT); END shift;
ARCHITECTURE shift OF shift IS BEGIN PROCESS (clk) VARIABLE a, b, c: BIT; BEGIN IF (clk'EVENT AND clk='1') THEN dout <= c; c := b; b := a; a := din; END IF; END PROCESS; END shift;
Cch 2: Cc bin c thay th bi cc SIGNAL (dng 8), v cc php gn c to ra trong th t trc tip (t din-dout, dng 13-16). Khi cc php gn tn hiu ti s chuyn tip tn hiu khc sinh cc thanh ghi, mch ng s c suy ra. -------- Solution 2: ----------------ENTITY shift IS PORT ( din, clk: IN BIT; dout: OUT BIT); END shift; ARCHITECTURE shift OF shift IS SIGNAL a, b, c: BIT; BEGIN PROCESS (clk)
88
Cch 3: Cc bin ging nhau ca cch 1 b chim, nhng trong th t trc tip (t din-dout, dng 13-16). Tuy nhin, mt php gn cho mt bin l tc th, v khi cc bin ang c s dng trong th t trc tip (sau khi cc gi tr va c gn cho chng), dng 13-15 thnh 1 dng, tng ng vi c:=din. Gi tr ca c ri PROCESS trong dng tip theo (dng 16), khi mt php gn tn hiu (dout <= c) xy ra ti s chuyn tip ca clk. Do , mt thanh ghi s c suy ra t cch 3, nn khng to kt qu mch chnh xc. -------- Solution 3: ----------------ENTITY shift IS PORT ( din, clk: IN BIT; dout: OUT BIT); END shift; ARCHITECTURE shift OF shift IS BEGIN PROCESS (clk) VARIABLE a, b, c: BIT; BEGIN IF (clk'EVENT AND clk='1') THEN a := din; b := a; c := b; dout <= c; END IF; END PROCESS; END shift;
u ra dout l bn sn clock dng sau u vo din cch 1, nhng ch mt sn dng sau u vo cch 2.
50 1 00 1 50 200 250 300 350 400 450 500 550 600 ns
50
1 00
1 50
200
250
300
350
400
450
500
550
600
ns
89
Hnh 7.4d.1. Thanh ghi dch 4 bit Bit ra (q) phi l 4 sn clock dng sau bit vo (d). Reset phi l khng ng b, xo tt c cc u ra flip-flop v 0 khi kch hot. Cch 1: S dng mt SIGNAL sinh cc flip-flop. Cc thanh ghi c to bi v mt php gn cho mt tn hiu c to ra ti s chuyn tip ca tn hiu khc (dng 17-18). ---- Solution 1: With an internal SIGNAL --LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY shiftreg IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END shiftreg; ARCHITECTURE behavior OF shiftreg IS SIGNAL internal: STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN PROCESS (clk, rst) BEGIN IF (rst='1') THEN internal <= (OTHERS => '0'); ELSIF (clk'EVENT AND clk='1') THEN internal <= d & internal(3 DOWNTO 1); END IF; END PROCESS; q <= internal(0);
90
Cch 2: S dng mt VARIABLE. Php gn ti s chuyn tip ca tn hiu khc c to ra cho mt bin (dng 17-18), nhng khi gi tr ca n ri PROCESS (n c chuyn n mt port trong dng 20), n cng suy ra cc thanh ghi. -- Solution 2: With an internal VARIABLE --LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY shiftreg IS PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END shiftreg; ARCHITECTURE behavior OF shiftreg IS BEGIN PROCESS (clk, rst) VARIABLE internal: STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN IF (rst='1') THEN internal := (OTHERS => '0'); ELSIF (clk'EVENT AND clk='1') THEN internal := d & internal(3 DOWNTO 1); END IF; q <= internal(0); END PROCESS; END behavior;
91
Hnh sau y ch ra s khi ca mt my trng thi mt pha. Trong hnh ny, phn mch dy cha cc mch dy (flip-flops), phn cao cha mch logic t hp.
92
Hnh 8.1 S my trng thi Phn mch t hp c 2 u vo v 2 u ra: + u vo th nht: l u vo trng thi hin ti ca my. + u vo th 2: l u vo t bn ngoi. + u ra th nht: l u ra pha ngoi + u ra th 2: l trng thi tip theo ca my. Phn mch dy c: + 3 u vo: clock, reset, v trng thi tip theo + 1 u ra: trng thi hin ti. Tt c cc flip-flop u nm trong phn ny, cc tn hiu clock v reset phi c kt ni vi cc flip flop thc hin vic iu khin. Nh vy, mt my tmt hu hn l mt b 6 thng s <X, Y, S, s 0, , >, trong :
X - Tp hp cc tn hiu vo ca tmat: X = { x1(t),,xn(t)} Tp cc tn hiu ra ca tmat: Y = {y1(t),,ym(t)} Tp hp cc trng thi ca tmat: S = {s1(t),,ss(t)} Hm (s, x) hm chuyn trng thi ca tmat Hm (s,x) hm u ra ca tmat.
Tng ng vi cc phng php tnh ton hm chuyn trng thi v hm ra, chng ta c cc loi tmat khc nhau. Hai dng tmat hu hn chuyn dng l: tmat Moore v tmat Mealy. Quay li vi hnh v trn, mch cn thit k c chia lm hai on. Vic chia on nh th ny s gip chng ta thit k tt hn. Chng ta s thit k 2 phn theo nhng cch khc nhau. C th trong mi trng VHDL, phn mch dy chng ta s thc hin trong PROCESS v phn mch t hp chng ta
93
C vi phng php c th c hnh thnh thit k mt FSM. Chng ta s m t chi tit mt v d mu m mch hon ton c cu trc v d dng p dng. Trong phn mch dy ca my trng thi s tch bit vi phn mch t hpca n (hnh v trn). Tt c cc trng thi ca my lun lun c khai bo r rng bng cch s dng kiu d liu lit k.
Thit k phn mch dy: Trn hnh trn, cc flip-flop nm phn mch dy. Cc u vo t bn ngoi ca phn ny l cc tn hiu clock v reset. Cc tn hiu ny c ni vi cc Flip-flop. Mt u vo khc (bn trong) l trng thi tip theo. u ra duy nht ca phn ny l trang thi hin ti. xy dng cho phn mch dy ny, ta cn s dng cu trc PROCESS. Trong cu trc ca PROCESS chng ta co th s s dng cc cu lnh tun t nh lnh IF, WAIT, CASE, LOOP. Khun mu thit k ca phn mch dy s nh sau:
PROCESS (reset, clock) BEGIN IF reset = 1 THEN Trang_thai_hien_tai <= Trang_thai_0 ; ELSIF (clock EVENT and clock = ) THEN Trang_thai_hien_tai 94 Trang_thai_tiep_theo; END IF ; END PROCESS ;
<=
M ch ra y l rt n gin. N ch cha mt tn hiu reset ng b. Tn hiu reset ny s xc nh trng thi khi u ca h thng, sau l lu tr ng b trng thi tip theo (ti sn dng ng h),v a ra u ra ca phn mch dy trng thi hin ti. Vic thit k cho phn mch dy ny th n gin v n l mt chun c bn, v s lng cc thanh ghi l ti thiu. phn 7.5, chng ta bit rng s lng cc flip flop s tnh da vo s bits cn thit m ho tt c cc trng thi ca FSM. Bi vy nu mu c m ho theo cch mc nh (m ho nh phn) th, chng ta s cn log2n Flip-flop, vi n l s trng thi. Thit k phn mch t hp: hnh 1, th phn mch t hp l y , v vy m ca n s khng cn thit theo tun t. Tt nht, chng ta nn s dng m ng thi. Song trong v d mu di y chng ta s s dng m tun t vi cu lnh CASE ng vai tr trung tm.
PROCESS (input, pr_state) BEGIN CASE pr_state IS WHEN state0 => IF (input = ...) THEN output <= <value>; nx_state <= state1; ELSE ... END IF; WHEN state1 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; WHEN state2 => IF (input = ...) THEN output <= <value>; nx_state <= state2; ELSE ... END IF; ... END CASE; END PROCESS;
95
96
V d 8.1: B m BCD Mt b m l mt v d ca my Moore, u ra ch ph thuc vo kt qu ca trng thi hin ti. Ging nh mt mch thanh ghi v mt mch dy n gin. thit k mch ny, chng ta c th dng phng php thng thng nh nhng phn mch mch t hp, nhng y ta s dng phng php FSM. Gi s ta cn thit k b m modul 10. Nh vy chng ta s cn c mt may c 10 trang thi. Cc trng thi y c gi l zero, one,,nine. hnh trng thi ca my c cho nh sau:
Hnh 8.2. S trng thi ca b m BCD M VHDL cng ging nh khun mu ca thit k mu 1. Trong : kiu d liu lit k s xut hin dng 11 12, thit k ca phn mch dy s t dng 16 n dong 23, thit k ca phn mch t hp(mch t hp) s xut hin t dng 25 29. Do c 10 trang thi nn s lng cac thanh ghi bng l [log210 ]= 4. M thit k s nh sau: ------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------ENTITY counterBCD IS PORT ( clk, rst: IN STD_LOGIC; count: OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END counterBCD; ------------------------------------------------ARCHITECTURE state_machine OF counterBCD IS
97
M phng kt qu:
98
Hnh 8.3. Kt qu m phng ca b m BCD V d 8.2: My trng thi kt thc kiu 1 Hnh 4 l s khi ca 1 FSM n gin. H thng c 2 trng thi: trng thi A v trng thi B. My phi chuyn trng thi khi nhn c d = 1 v u ra mong mun l x = a khi my trng thi A hoc x = b khi my trng thi B.
99
Kt qu m phng:
Nh chng ta thy trong kiu thit k 1 th ch c trng thi hin ti c lu tr. Tt c cc mch nh vy s c tm tt nh trong hnh 8.6.1. Trong trng hp ny nu mch l my Mealy (u ra ca n ph thuc vo u vo hin ti), u ra c th thay i khi u vo thay i (u ra khng ng b). Trong nhiu ng dng, tn hiu c yu cu l ng b, th u ra s ch cp nht khi thay i sn clock. to ra my ng b Mealy, u ra phi c lu tr tt, nh trong hnh 8.6.2
100
Cu trc nh trong hnh 8.6.2 s l i tng ca thit k kiu 2. thc hin cu trc mi ny, chng ta cn c vi s thay i so vi thit k kiu 1. V d, chng ta c th s dng mt tn hiu thm (nh tn hiu trung gian) tnh ton gi tr u ra (on trn), nhng ch chuyn cc gi tr ca n thnh tn hiu u ra khi s kin clock thay i (phn mch dy). S thay i ny chng ta s thy trong khun mu ch ra di y: Khun mu my trng thi ca thit k 2
LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------------ENTITY <ent_name> IS PORT (input: IN <data_type>; reset, clock: IN STD_LOGIC; output: OUT <data_type>); END <ent_name>; ------------------------------------------------------ARCHITECTURE <arch_name> OF <ent_name> IS TYPE states IS (state0, state1, state2, state3, ...); SIGNAL pr_state, nx_state: states; SIGNAL temp: <data_type>; BEGIN ---------- Phan mach to hop: ----------------------------------- Phan mach day: -------------------------PROCESS (pr_state) PROCESS (reset, clock) BEGIN BEGIN CASE pr_state IS IF (reset='1') THEN pr_state <= state0; WHEN state0 => ELSIF (clock'EVENT AND clock='1') THEN temp <= <value>; output <= temp; IF (condition) THEN nx_state <= state1; pr_state <= nx_state; ... END IF; END IF; END PROCESS; WHEN state1 => temp <= <value>; IF (condition) THEN nx_state <= state2; ... END IF; WHEN state2 => temp <= <value>; IF (condition) THEN nx_state <= state3; ... END IF; ... END CASE; 101 END PROCESS;
END <arch_name>;
So snh khun mu ca thit k kiu 2 vi thit k kiu 1, chng ta thy ch c mt s khc nhau duy nht, l xut hin tn hiu trung gian temp. Tn hiu ny s c tc dng lu tr u ra ca my. Ch cho cc gi tr chuyn thnh u ra khi khi c s thay i s kin clock. V d 8.3: Chng ta s nhn li thit k ca v d 8.2. Tuy nhin y chng ta mun u ra l ng b (ch thay i khi c s kin thay i clock). V vy trong v d ny chng ta s thit k theo kiu 2. ---------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.all; ---------------------------------------------ENTITY VD_FSM2 IS PORT ( a, b, d, clk, rst: IN BIT; x: OUT BIT); END VD_FSM2; ---------------------------------------------ARCHITECTURE VD_FSM2 OF VD_FSM2 IS TYPE state IS (stateA, stateB); SIGNAL pr_state, nx_state: state; SIGNAL temp: BIT; BEGIN ----- Phan mach day: ---------------------PROCESS (rst, clk) BEGIN IF (rst='1') THEN pr_state <= stateA; ELSIF (clk'EVENT AND clk='1') THEN
102
y chng ta thy c 2 flip flop c s dng, mt ci m ho trng thi ca my, mt ci lu tr u ra. B m phng kt qu c ch ra trong hnh di y:
Hnh 8.7.Kt qu m phng cho v d 8.3 V d 8.4. B pht hin chui Chng ta mun thit k mt mch m u vo l lung bit ni tip v u ra l 1 khi u c xut hin chui 111, l 0 trong cc trng hp cn li hnh trng thi ca my c ch ra trong hnh 8. y chng ta c 4 trng thi v chng ta quy c l trng thi zero, one, tow, three. + Trang thi 0 l trng thi ch 1 u tin. + Trang thai 1 l trang thi c 1 v ch 1 th 2 + Trng thi 2 l trng thi c 11 v ang ch 1 th 3. + Trng thi 3 l trng thi thu c xu 111.
103
104
Kt qu m phng s nh sau:
Hnh 8.9.Kt qu m phng cho b on nhn xu. V d 8.5: B iu khin n giao thng (TLC) Nh gii thiu phn mch mch t hp, b iu khin s l mch v d tt c th thc hin hiu qu khi m hnh ho my trng thi. Trong v d ny, chng ta s thit k mt TLC vi nhng c im c tm lc nh trong hnh 8.10:
105
Hnh 8.10.b. hnh trng thi ca TLC y chng ta thy c 3 ch thao tc: + Ch bnh thng: ch ny, mch c 4 trng thi, mi trng thi l c lp, thi gian lp trnh .? + Ch kim tra: Cho php tt c thi gian c lp trnh trc c vit ln vi 1 gi tr nh, do vy h thng c th d dng c kim tra trong sut qu trnh ba dng. + Ch Standby: Nu thit lp h thng s kch hot n vng trong khi tn hiu standby c kch hot. ng thi 1 ng h tn s 60 HZ lun hot ng. M thit k:
-----------------------------------------------------------library IEEE; use IEEE.STD_LOGIC_1164.all; ENTITY Bodk_den_giao_thong IS PORT ( clk, stby, test: IN STD_LOGIC; r1, r2, y1, y2, g1, g2: OUT STD_LOGIC); END Bodk_den_giao_thong; ------------------------------------------------ARCHITECTURE state_machine_be OF Bodk_den_giao_thong IS CONSTANT timeMAX : INTEGER := 2700; CONSTANT timeRG : INTEGER := 1800; CONSTANT timeRY : INTEGER := 300; CONSTANT timeGR : INTEGER := 2700; CONSTANT timeYR : INTEGER := 300; CONSTANT timeTEST : INTEGER := 60; TYPE state IS (RG, RY, GR, YR, YY); SIGNAL pr_state, nx_state: state; SIGNAL time : INTEGER RANGE 0 TO timeMAX; BEGIN -------------Phan mach day: ---PROCESS (clk, stby) VARIABLE count : INTEGER RANGE 0 TO timeMAX; BEGIN IF (stby='1') THEN pr_state <= YY;
106
Nh ta thy, s lng Flip-flop dng thc hin mch l 15 ci: 3 ci cho lu tr trng thi hin ti, 12 ci cn li cho b m. c th d dng thy kt qu m phng, y ta thc hin gim thi gian thc t i 100 ln. Kt qu m phng c ch ra trong hnh di y: + ch hot ng bnh thng (stby = 0, test = 0):
107
Hnh 8.11.b. Kt qu m phng TLC ch kim tra V d 8.6: B pht tn hiu: Chng ta mun thit k mt mch m t tn hiu clock clk a ra tn hiu nh trong hnh di y:
108
109
END CASE; END PROCESS; outp <= out1 AND out2; END state_machine; ------------------------------------------
Kt qu m phng:
Hnh 8.13.Kt qu m phng cho v d 8.6 8.4. Kiu m ho: t nh phn sang Onehot.
m ho trng thi ca my trng thi, chng ta c th chn mt trong vi kiu c sn. Kiu m ho mc nh l nh phn. u im ca kiu m ho ny l n yu cu s lng flip-flop t nht. Trong trng hp ny, vi n mch flip-flop th c th chng ta c th m ho c 2n trng thi. Nhc im ca kiu m ho ny l n yu cu v logic nhiu hn v n chm hn so vi nhng kiu khc. Ci cui cng l kiu m ho onehot, vi kiu m ho ny, chng ta cn s dng 1 flip-flop cho 1 trng thi. V vy, n i hi s lng flip-flop ln nht. Trong trng hp ny, vi n flip-flop (n bit) ch c th m ho c n trng thi. Nhng b li, phng php ny li yu cu tnh ton logic it nht, v tc nhanh nht Mt kiu nm gia 2 kiu trn l kiu m ho twohot (trong mt trng thi ch c 2 bit 1). V vy vi n flip-flop (n bit), th chng ta c th m ho c n(n-1)/2 trng thi. Kiu m ho onehot c gii thiu trong cc ng dng m s lng cc flip-flop nhiu nh trong cc chip FPGA. Nhng trong cc mch ASIC th m nh phn li c u tin hn. V d: Gi s chng ta c mt my trng thi c 8 trang thi nh trong bng di y:
110
111
S ca mch ca b dch barrel c ch ra trong hnh 9.1. u vo l vector 8 bit. u ra l phin bn dch ca u vo, vi lng dch c nh ngha bi 8 u vo shift (t o n 7). Mch gm c 3 b dch barrel ring l, mi mt ci ging nh trong v d 6.9. Nhng chng ta phi chu rng, barrel u tin c ch c 1 u 0 c kt ni vi mt b dn knh, trong khi barrel th 2 c 2 u vo 0 v barrel cui cng c ti 4 u vo 0. vector ln hn th chng ta phi d 2 u vo l 0. V d nu shift = 001 th ch barrel u tin gy ra dch, cn nu shift = 111 th tt cc u gy ra dch.
112
113
Kt qu m phng:
Hnh 9.2.Kt qu m phng cho b dch barrel 9.2. B so snh khng du v c du.
Hnh 9.3 hin ln s ca b so snh. Kch thc ca vector c so snh l generic (n+1). 3 u ra phi c cung cp l: 1 u ra l a>b, 1 u ra l a = b, u ra cn li l a < b. 3 gii php c gii thiu : u tin xt a v b l cc s c du, trong khi 2 gii php cn li l cc s khng du. Kt qu m phng s cho chng ta thy r hn.
114
Kt qu m phng:
Hnh 9.4. Kt qu m phng b so snh c du B so snh khng du 1: Phn m VHDL sau y l bn sao ca phn m c trnh by ( b so snh khng du). ---- Bo so sanh khong dau 1: ----------LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; --rat can thiet! ----------------------------------------
115
Kt qu:
Hnh 9.5.1.Kt qu b so snh khng du 1 B so snh khng du 2: B so snh khng du c th cng c thc hin vi STD_LOGIC_VECTORS, trong trng hp ny khng cn thit phi khai bo std_logic_arith. M thit k s nh sau: ---- Bo so sanh khong dau: ----------LIBRARY ieee; USE ieee.std_logic_1164.all; ---------------------------------------ENTITY comparator IS GENERIC (n: INTEGER := 7); PORT (a, b: IN STD_LOGIC_VECTOR (n DOWNTO 0); x1, x2, x3: OUT STD_LOGIC); END comparator; ---------------------------------------ARCHITECTURE unsigned OF comparator IS BEGIN x1 <= '1' WHEN a > b ELSE '0'; x2 <= '1' WHEN a = b ELSE '0'; x3 <= '1' WHEN a < b ELSE '0'; END unsigned;
116
Hnh 9.5.2. Kt qu ca b so snh khng du2 9.3. B cng Carry Ripple v b cng Carry Look Ahead.
Carry ripple v carry look ahead l 2 phng php c in thit k ccc b cng. Phng php u tin c thun li l yu cu phn cng t, trong khi ci th hai li nhanh hn. + B cng carry ripple: Hnhd 9.6 ch ra 1 b cng ripple cary 4 bit khng du:
Hnh 9.6. S b cng ripple carry Trn s ta c th thy, vi mi bit, mt n v b cng y s c thc hin. Bng tht ca b cng y c ch ra bn cnh s , trong a, b l cc bt u vo, cin l bit nh vo, s l bit tng, cout l bit nh ra. T bng tht ta d dng tnh c: s = a xor b xor cin cout = (a and b) xor (a and cin) xor (b xor cin) T cng thc trn ta xy dng chng trnh VHDL nh sau ( y chng ta c th p dng cho bt k s lng u vo no):
LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY Bo_cong_carry_ripple IS GENERIC (n: INTEGER := 4); PORT ( a, b: IN STD_LOGIC_VECTOR (n-1 DOWNTO 0); cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0); cout: OUT STD_LOGIC); END Bo_cong_carry_ripple; ---------------------------------------------
117
Kt qu m phng:
Hnh 9.7. Kt qu m phng cho b cng ripple carry + B cng carry look ahead: S b cng carry look ahead 4 bit c ch ra trong hnh 9.8.1 di y:
Hnh 9.8.1. S b cng carry look ahead Mch c hot ng da trn cc khi nim generate v propagate. Chnh c im ny lm cho b cng ny thc hin vi tc nhanh hn so vi b cng trc. Gi s 2 u vo l 2 bit a,b th 2 tn hiu p(propagate) v g(generate) c tnh nh sau: g = a and b
118
OF
119
Kt qu m phng:
9.4.
B chia du chm tnh. Trc khi i vo thit k, chng ta cn phi nhc li thut ton chia: Thut ton chia:
Mc ch ca thut ton l chng ta cn tnh y = a/b trong a, b l nhng s cng c (n+1) bit. Thut ton c th hin trong bng 9.9, trong a = 1011 ( = (11)10) v b = 0011 (=(3)10). Kt qu s thu c: thng y = 0011 (=(3)10) v s d r = 0010 (=(2)10). Ch s 3 2 1 0 u vo a 1011 1011 1011 0101 0010 So snh < < > > u vo b 0011000 0001100 0000110 0000011 y 0 0 1 1 Thao tc cho ct a Khng lm g Khng lm g Tr ct a cho ct b Tr ct a cho ct b
120
Hnh 9.9. Thut ton chia Gii thch thut ton: + u tin chuyn s chia thnh s 2n+1 bit bng cch thm vo sau n -1 bit 0 , s b chia vn gi nguyn. + So snh s b chia vi s chia . Nu s b chia ln hn hoc bng s chia th gn y =1 v thay s b chia bng hiu ca s b chia vi s chia. Ngc li th y =0 + Qu trnh thc hin lin tc cho n khi ht n ln. + Thng l dy bit ca y, s d l s b chia cui cng. thit k b chia ny th chng ta c 2 phng php: C 2 phng php u thc hin theo m tun t: Phng php th nht ch thc hin bng cu ln if, phng php th 2 thc hin bng c cu ln if v loop. M thit k b chia s nh sau: Thit k theo phng php 1: ----- Phuong phap 1: step-by-step ------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------ENTITY Bo_chia IS PORT ( a, b: IN INTEGER RANGE 0 TO 15; y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC); END Bo_chia; -------------------------------------------------ARCHITECTURE arc OF Bo_chia IS BEGIN PROCESS (a, b) VARIABLE temp1: INTEGER RANGE 0 TO 15; VARIABLE temp2: INTEGER RANGE 0 TO 15; BEGIN ----- Khoi tao va bat loi: ------temp1 := a; temp2 := b; IF (b=0) THEN err <= '1'; ELSE err <= '0'; END IF; ----- y(3): --------------------------IF (temp1 >= temp2 * 8) THEN y(3) <= '1'; temp1 := temp1 - temp2*8; ELSE y(3) <= '0';
121
Kt qu m phng:
Hnh 9.10.1. Kt qu m phng b chia Thit k theo phng php 2: ------ Phuong phap 2:----------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------ENTITY Bo_chia2 IS GENERIC(n: INTEGER := 3); PORT ( a, b: IN INTEGER RANGE 0 TO 15; y: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); rest: OUT INTEGER RANGE 0 TO 15; err : OUT STD_LOGIC); END Bo_chia2; -------------------------------------------------ARCHITECTURE arc OF Bo_chia2 IS BEGIN
122
Kt qu m phng:
9.5.
B iu khin my bn hng.
Trong v d ny, chng ta s thit k b iu khin my bn hng, my bn hng s bn cc thanh ko vi gi 25 xu. Chng ta s thit k theo m hnh my FSM. u ra v u vo ca b iu khin c th hin trong hnh 9.11. Tn hiu vo l nickel_in, dime_in, v quarter_in thng bo rng mt ng tin tng ng c gi vo ti khon. Ngoi ra cn c 2 u vo iu khin: u vo reset (rst) v u vo clock (clk). B iu khin tr li bng 3 tn hiu u ra: candy_out ( phn pht thanh ko), nickel_out v dime_out(cp nht li thay i). Trn hnh 9.11 cng ch ra hnh trng thi ca my FSM. Cc s bn trong cc vng trn biu din tng ti khon ca khch hng (ch c cc nickel, dime v quarter l c chp nhn).
123
Hnh 9.11. hnh trng thi ca b iu khin my bn hng Trng thi 0 l trng thi l trng thi khng lm g c. T nu 1 ng nickel c gi vo ti khon, my s chuyn trng thi n trng thi 5, nu 1 ng dime c gi vo ti khon th my chuyn ti trng thi 10 hoc nu 1 ng quarter th my s chuyn n trng thi 25. Tnh hung tng t s c lp li cho tt c cc trng thi, cho ti trng thai 20. Nu trng thi 25 c xc nhn, th thanh ko c phn pht v khng chuyn i. Tuy nhin nu trng thi 40 c xc nhn th a nickel c tr li, bi vy trng thi s chuyn ti trng thi 35, l 1 trng thi m 1 dime c tr li v 1 candy bar c phn pht. C 3 trng thi to ra chu trnh kp, l t 1 thanh ko c phn pht v my tr li trng thi 0. Bi ton ny s c chia thnh 2 phn: + Trong phn u: din mo c bn lin quan n thit k b iu khin my bn hng (nh trong hnh 9.11) . + Trong phn 2: Cc chc nng m rng c thm vo. y chng ta ch nghin cu phn mt ca bi ton: Nhn vo hnh trng thi ca my hnh 9.11, chng ta thy c 10 trng thi, nh vy cn c 4 bit m ho cc trng thi, tc l cn s dng 4 flip-flop. M thit k s nh sau:
124
125
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
Kt qu m phng:
126
S khi ca b nhn d liu ni tip c ch ra trong hnh 9.13. N bao gm mt u vo d liu ni tip (din) v mt u ra d liu song song (data(6:0)). Ngoi ra cn c tn hiu iu khin clk (tn hiu clock). Hai tn hiu gim st c to ra bi mch l: tn hiu err (error) v tn hiu data_valid. u vo x l cha 10 bt. Bit u tin l bit bt u, nu bit l 1 th mch bt u nhn d liu. 7 bit tip theo l cc bit d liu hot ng. Bit th 9 l bit chn l: bit ny = 0 nu s lng cc bit 1 trong d liu la chn v bng 1 trong trng h cn li. Bit 10 l bit stop: bit ny s mang gi tr l 1 nu qu trnh chuyn i l ng. Mt li c pht hin khi bit chn l khng c kim tra hoc bit stop khng phi la 1. Khi qu trnh nhn kt thc m khng c li no c pht hin th d liu c lu tr trong cc thanh ghi bn trong s chuyn vo data(6:0) v u ra data_valid c xc nhn.
Hnh 9.13. S b nhn d liu ni tip thit k mch ny chng ta s s dng mt vi bin lm cc bin m, bin xc nhn s bit nhn c, bin lu tr d liu, bin tnh ton li v bin trung gian. M thit k b nhn d liu ni tip s nh sau:
--------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------------ENTITY Bo_nhan_du_lieu_nt IS PORT ( din, clk, rst: IN BIT; data: OUT BIT_VECTOR (6 DOWNTO 0); err, data_valid: OUT BIT); END Bo_nhan_du_lieu_nt; --------------------------------------------ARCHITECTURE arc OF Bo_nhan_du_lieu_nt IS BEGIN PROCESS (rst, clk) VARIABLE count: INTEGER RANGE 0 TO 10; VARIABLE reg: BIT_VECTOR (10 DOWNTO 0); VARIABLE temp : BIT; BEGIN IF (rst='1') THEN count:=0; reg := (reg'RANGE => '0');
127
Kt qu m phng:
Hnh 9.14.Kt qu m phng b nhn d liu 9.7. B chuyn song song thnh ni tip.
B chuyn song song thnh ni tip l mt loi ng dng ca thanh ghi dch. B chuyn i ny s thc hin vic gi i mt khi d liu ni tip. Vic s dng b chuyn i ny l rt cn thit v d: Trong cc con chip ASIC, khi
128
Hnh 9.15.B chuyn song song thnh ni tip Trong : + d(7:0) l vector d liu gi i + dout l u ra thc t. + clk: u vo ca xung clock + load: u vo xc nhn Vector d c lu tr ng b trong thanh ghi dch reg. Khi load trng thi cao th d liu c np vo thanh ghi dch theo th t bit MSB l bt gn u ra nht, v u ra l d(7). Mi khi load tr li 0 th bit tip theo c xut hin ti u ra ca mi sn dng ca xung ng h. Sau khi tt c 8 bit c gi i, u ra tr li mc thp cho n ln chuyn i tip theo.
M thit k nh sau:
LIBRARY ieee; USE ieee.std_logic_1164.all; ------------------------------------------------ENTITY Bo_chuyen_dl_ss_nt IS PORT ( d: IN STD_LOGIC_VECTOR (7 DOWNTO 0); clk, load: IN STD_LOGIC; dout: OUT STD_LOGIC); END Bo_chuyen_dl_ss_nt; ------------------------------------------------ARCHITECTURE Bo_chuyen_dl_ss_nt OF Bo_chuyen_dl_ss_nt IS SIGNAL reg: STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN IF (load='1') THEN reg <= d; ELSE reg <= reg(6 DOWNTO 0) & '0'; END IF; END IF; END PROCESS; dout <= reg(7); END Bo_chuyen_dl_ss_nt;
129
Kt qu m phng:
Hnh 9.16. Kt qu m phng cho b chuyn song song thnh ni tip 9.8. Tr chi trn led 7 thanh.
Chng ta thit k tr chi vi SSD (seven segment display). S ca mch c ch ra trong hnh 9.17. N bao gm 2 u vo l clk v stop, v mt u ra l dout(6:0), u ra ny s c hin th trn SSD. Chng ta phi m bo rng fdk = 1khz
Hnh 9.17. S ca SSD Mch ca chng ta s to ra mt s chuyn ng lin tc theo chiu kim ng h ca cc on SSD. ng thi n cn to ra s dch chuyn chng lp gia cc thanh k nhau. Chng ta c th biu din quy trnh ca n nh sau: a->ab->b->bc->c->cd->d->de->e->ef->f->fa->a.
130
Hnh 9.18. hnh trng thi Qu trnh s dng li khi c tn hiu Stop, v khi mch s tr li trng thi a v ch cho n khi stop xung thp tr li. H thng ca chng ta s gi li cc trng thi a, b, c, d , e, f trong khong thi gian time1 = 80ms v cc trng thi ab, bc, cd, de, ef, fa l time2 = 30ms. M chng trnh ca chng ta s nh sau:
-------------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; -------------------------------------------------------ENTITY Trochoiled7thanh IS PORT ( clk, stop: IN BIT; dout: OUT BIT_VECTOR (6 DOWNTO 0)); END Trochoiled7thanh; -------------------------------------------------------ARCHITECTURE arc OF Trochoiled7thanh IS CONSTANT time1: INTEGER := 4; -- Gia tri thuc te hien thi la 80 CONSTANT time2: INTEGER := 2; -- Gia tri thuc te hien thi is 30 TYPE states IS (a, ab, b, bc, c, cd, d, de, e, ef, f, fa); SIGNAL present_state, next_state: STATES; SIGNAL count: INTEGER RANGE 0 TO 5; SIGNAL flip: BIT; BEGIN ------- Phan mach day cua arc : -----------PROCESS (clk, stop) BEGIN IF (stop='1') THEN present_state <= a; ELSIF (clk'EVENT AND clk='1') THEN IF ((flip='1' AND count=time1) OR (flip='0' AND count=time2)) THEN count <= 0; present_state <= next_state;
131
64
96
32
48
16
24
12
66
132
Kt qu m phng:
Hnh 9.19. Kt qu m phng cho tr chi trn SSD 9.9. B pht tn hiu.
T mt tn hiu clock, chng ta mong mun thu c mt tn hiu c dang sng nh trong hnh 9.20. Vi bi ton loi ny, chng ta c th s dng phng php FSM hoc phng php truyn thng. C 2 phng php u c chng ta trnh by di y: Phng php FSM:
Hnh 9.20 Hnh dng sng cn pht Tn hiu ca hnh 9.20 c th c m hnh nh mt FSM 8 trng thi. S dng b m t 0 n 7. Chng ta c th thit lp mt sng bng 0 khi bin m = 0 ( xung th nht) v bng 1 khi bin m = 1 (xung th hai),vvnh trong hnh 9.20. thc thi c b to sng ny th yu cu 4 flip-flop: trong c 3 ci lu tr s m (3 bit), mt ci lu tr sng (1 bit ). thit k b to sng ny, chng ta thit k theo kiu 2, c th s nh sau:
----------------------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; ----------------------------------------------------ENTITY Bo_phat_tin_hieu IS PORT (clk: IN STD_LOGIC; wave: OUT STD_LOGIC); END Bo_phat_tin_hieu;
133
six,
Kt qu m phng:
Hnh 9.2.1. Kt qu m phng to sng Phng php truyn thng: Chng ta thit k b pht tn hiu theo phng php truyn thng vi cu lnh IF nh sau:
--------------------------------------LIBRARY ieee; USE ieee.std_logic_1164.all; --------------------------------------ENTITY Bo_phat_tin_hieu2 IS PORT (clk: IN BIT; wave: OUT BIT); END Bo_phat_tin_hieu2; --------------------------------------ARCHITECTURE arc OF Bo_phat_tin_hieu2 IS BEGIN PROCESS
134
Kt qu m phng:
Hnh 9.22. Kt qu m phng to sng theo phng php truyn thng 9.10. Thit k b nh. Trong on ny, chng ta s thit k cc mch b nh sau: + ROM + RAM vi bus d liu vo ra tch ri. + ROM vi bus d liu vo ra hai chiu ROM (Read Only Memory): B nh ch c v ghi: S ca ROM c ch ra trong hnh 9.23. V ROM l b nh ch c, khng c tn hiu clock, chn cho php ghi, n ch c tn hiu vo bus a ch v tn hiu ra l bus d liu.
135
Kt qu m phng:
Hnh 9.24. Kt qu m phng thit k ROM RAM vi ng bus vo ra ring bit: S ca RAM vi ng bus vo ra ring bit c th hin trong hnh 9.25
136
Kt qu m phng:
Hnh 9.26. Kt qu m phng RAM c ng d liu vo ra khc nhau. RAM vi ng bus song song:
137
138
Kt lun
Ngy ny vic ng dng VHDL trong vic thit k mch v chp ngy cang nhiu. Cng ngh ny ang l xu hng ca thi i, n gin v n khng ch tiu tn t v tin bc m n cn gip cho chng ta n gin trong vic thit k phn cng. Trn y, chng ta trnh by mt cch khi qut v phng php thit k cc mch. Nhng mch c bn nht c chng ta thit k mt cch chi tit, hon thin. y l c s cho nhng thit k ln hn v phn cng, thit k cc ng dng cho cc FPGA, ASIC.
139
Ti liu tham kho: - Circuit design with VHDL , Voilnei A.Pedroni - VHDL language. - The vhdl cookbook , Peter J.Ashedo - Thit k mch bng my tnh, Nguyn Linh Giang .. Phn cng cng vic: Nguyn Ngc Linh: Chng 2,3 Nguyn Quc Vit: Chng 4,5
140
141