272
1 Lêi giíi thiÖu Khai th¸c, nghiªn cøu c¬ b¶n c«ng nghÖ míi lμ bíc kh«ng thÓ thiÕu trong viÖc c¶i tiÕn, n©ng cao, còng nhchÕ t¹o míi c¸c trang thiÕt bÞ qu©n sù vμ d©n sù nh»m ®¸p øng viÖc hiÖn ®¹i ho¸ c«ng nghiÖp ho¸ cña ®Êt níc. Cïng víi sù ph¸t triÓn vît bËc cña nghμnh c«ng nghÖ th«ng tin, c¸c c«ng nghÖ míi vÒ c¸c m¹ch tÝch hîp vi ®iÖn tö, c¸c m¹ch tæ hîp logic lËp tr×nh ®îc ra ®êi ®· lμm cho c¸c s¶n phÈm qu©n sù còng nhd©n sù ngμy cμng hoμn thiÖn vμ u viÖt h¬n. §Ó tiÕn mét bíc xa h¬n trong viÖc c¶i tiÕn, chÕ t¹o khÝ tμi qu©n sù nh»m ®¸p øng chiÕn tranh ®iÖn tö hiÖn ®¹i víi tèc ®é xö lý cùc kú cao, ®ßi hái ph¶i cã c«ng nghÖ tiªn tiÕn phï hîp víi t×nh h×nh chung cña thÕ giíi. Trªn c¬ së ph¸t triÓn tõ c¸c chÝp PLA, hiÖn nay c«ng nghÖ na n« ®· ®îc ®a vμo ®Ó chÕ t¹o c¸c m¹ch tÝch hîp lËp tr×nh ®îc FPGA vμ CPLD, nã ®· lμm cho m¹ch tÝch hîp logic lªn ®Õn hμng chôc triÖu cæng, tèc ®é ®ång hå lªn ®Õn 500 MHz. øng dông c«ng nghÖ míi vμo trong thiÕt kÕ chÕ t¹o c¸c thiÕt bÞ ®iÖn tö lËp tr×nh PLIC lμ mét bíc cÇn thiÕt cho t¬ng lai víi mét níc ®ang ph¸t triÓn nhViÖt Nam. §Ó ®¸p øng ®îc tÝnh b¶o mËt trong qu©n sù còng nhtÝnh ph¶n øng nhanh trong chiÕn tranh hiÖn ®¹i cïng víi nhu cÇu chuyªn dông ho¸, tèi u ho¸ (thêi gian, kh«ng gian, gi¸ thμnh…), tÝnh chñ ®éng trong c«ng viÖc... ngμy cμng ®ßi hái kh¾t khe. ViÖc ®a ra c«ng nghÖ míi trong lÜnh vùc chÕ t¹o m¹ch ®iÖn tö ®Ó ®¸p øng nh÷ng yªu cÇu trªn lμ hoμn toμn cÊp thiÕt mang tÝnh thùc tÕ cao.

Giao trinh fpga

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Giao trinh fpga

1

Lêi giíi thiÖu

Khai th¸c, nghiªn cøu c¬ b¶n c«ng nghÖ míi lµ b−íc kh«ng thÓ

thiÕu trong viÖc c¶i tiÕn, n©ng cao, còng nh− chÕ t¹o míi c¸c trang

thiÕt bÞ qu©n sù vµ d©n sù nh»m ®¸p øng viÖc hiÖn ®¹i ho¸ c«ng

nghiÖp ho¸ cña ®Êt n−íc. Cïng víi sù ph¸t triÓn v−ît bËc cña

nghµnh c«ng nghÖ th«ng tin, c¸c c«ng nghÖ míi vÒ c¸c m¹ch tÝch

hîp vi ®iÖn tö, c¸c m¹ch tæ hîp logic lËp tr×nh ®−îc ra ®êi ®· lµm

cho c¸c s¶n phÈm qu©n sù còng nh− d©n sù ngµy cµng hoµn thiÖn vµ

−u viÖt h¬n. §Ó tiÕn mét b−íc xa h¬n trong viÖc c¶i tiÕn, chÕ t¹o khÝ

tµi qu©n sù nh»m ®¸p øng chiÕn tranh ®iÖn tö hiÖn ®¹i víi tèc ®é xö

lý cùc kú cao, ®ßi hái ph¶i cã c«ng nghÖ tiªn tiÕn phï hîp víi t×nh

h×nh chung cña thÕ giíi.

Trªn c¬ së ph¸t triÓn tõ c¸c chÝp PLA, hiÖn nay c«ng nghÖ na n«

®· ®−îc ®−a vµo ®Ó chÕ t¹o c¸c m¹ch tÝch hîp lËp tr×nh ®−îc FPGA

vµ CPLD, nã ®· lµm cho m¹ch tÝch hîp logic lªn ®Õn hµng chôc

triÖu cæng, tèc ®é ®ång hå lªn ®Õn 500 MHz. øng dông c«ng nghÖ

míi vµo trong thiÕt kÕ chÕ t¹o c¸c thiÕt bÞ ®iÖn tö lËp tr×nh PLIC lµ

mét b−íc cÇn thiÕt cho t−¬ng lai víi mét n−íc ®ang ph¸t triÓn nh−

ViÖt Nam. §Ó ®¸p øng ®−îc tÝnh b¶o mËt trong qu©n sù còng nh−

tÝnh ph¶n øng nhanh trong chiÕn tranh hiÖn ®¹i cïng víi nhu cÇu

chuyªn dông ho¸, tèi −u ho¸ (thêi gian, kh«ng gian, gi¸ thµnh…),

tÝnh chñ ®éng trong c«ng viÖc... ngµy cµng ®ßi hái kh¾t khe. ViÖc

®−a ra c«ng nghÖ míi trong lÜnh vùc chÕ t¹o m¹ch ®iÖn tö ®Ó ®¸p

øng nh÷ng yªu cÇu trªn lµ hoµn toµn cÊp thiÕt mang tÝnh thùc tÕ cao.

Page 2: Giao trinh fpga

2

C«ng nghÖ FPGA (Field Programmable Gate Array) vµ CPLD

(Complex Programmable Logic Device) ®· ®−îc c¸c h·ng lín tËp

trung nghiªn cøu vµ chÕ t¹o, ®iÓn h×nh lµ Xilinx vµ Altera. §Ó lµm

chñ c«ng nghÖ míi vµ tæ chøc thiÕt kÕ s¶n xuÊt c«ng nghÖ FPGA

cña Xilinx cho phÐp chóng ta tù thiÕt kÕ nh÷ng vi m¹ch riªng, nh÷ng

bé xö lý sè riªng dµnh cho øng dông cña chóng ta. §Æc biÖt trong

lÜnh vùc xö lý tÝn hiÖu sè, c¸c m¹ch tÝch hîp dïng ®Ó nhËn d¹ng ©m

thanh, h×nh ¶nh, c¶m biÕn ... víi tÝnh mÒm dÎo cao vµ gi¸ thµnh

thÊp.

MÆc dï c«ng nghÖ FPGA ®· xuÊt hiÖn tõ n¨m 1985, xong ®èi

víi n−íc ta th× nã vÉn cßn rÊt míi. Do vËy t×m hiÓu, lµm chñ vÒ c«ng

nghÖ FPGA lµ viÖc lµm hoµn toµn cÇn thiÕt. Nã kh«ng chØ cã ý

nghÜa ®èi víi c¸c lÜnh vùc §iÖn tö - ViÔn th«ng, c«ng nghÖ th«ng

tin... mµ nã cã ý nghÜa ®Æc biÖt quan träng trong lÜnh vùc an ninh

quèc phßng.

XuÊt ph¸t tõ thùc tÕ ®ßi hái cÊp b¸ch ®ã, bé m«n Tù ®éng vµ

Kü thuËt tÝnh – Khoa Kü thuËt ®iÒu khiÓn – Häc ViÖn Kü thuËt qu©n

sù ®· cho xuÊt b¶n cuèn s¸ch “ThiÕt kÕ thiÕt bÞ ®iÖn tö lËp tr×nh sö

dông c«ng nghÖ FPGA vµ CPLD”, tµi liÖu nµy n»m trong lo¹t c¸c tµi

liÖu ®· ®−îc bé m«n Ên hµnh, bao gåm CÊu tróc m¸y tÝnh, Cêu tróc

vµ lËp tr×nh cho c¸c hÖ xö lý tÝn hiÖu sè, cÊu tróc vµ lËp tr×nh hÖ vi

®iÒu khiÓn.

Tµi liÖu giíi thiÖu ph−¬ng ph¸p thiÕt kÕ CPLD, FPGA còng nh−

ng«n ng÷ lËp tr×nh, tõ ®ã ®i s©u nghiªn cøu c¸c gi¶i ph¸p cã liªn

quan còng nh− c¸c c«ng cô hç trî thiÕt kÕ, sau ®ã ¸p dông ®Ó thiÕt

Page 3: Giao trinh fpga

3

kÕ, tÝch hîp vµo lo¹i CPLD vµ FPGA cô thÓ . Tµi liÖu ®−îc chia

thµnh 4 ch−¬ng:

- Ch−¬ng 1: Giíi thiÖu tæng quan tæ chøc phÇn cøng cña

ASIC. Giíi thiÖu tæng quan tæ chøc c¸c hä thiÕt bÞ còng nh− cÊu

tróc cña chóng (tµi liÖu giíi thiÖu cÊu tróc ASIC cña h·ng Xilinx).

- Ch−¬ng 2: Gi¶i ph¸p vµ tæ chøc phÇn mÒm ®¶m b¶o. Giíi

thiÖu c¸c phÇn mÒm hç trî thiÕt kÕ, ng«n ng÷ lËp tr×nh.

- Ch−¬ng 3: Ng«n ng÷ lËp tr×nh VHDL

- Ch−¬ng 4: ThiÕt kÕ øng dông c¬ b¶n. Ch−¬ng nµy ®−îc thùc

hiÖn víi viÖc tÝch hîp c¸c m¹ch ®iÖn tö trªn c¬ së sö dông ng«n ng÷

VHDL, ®Ó thiÕt kÕ bé ®iÒu khiÓn ®éng c¬ b−íc trªn hai hä thiÕt bÞ

CPLD vµ FPGA.

Cuèn s¸ch ®−îc dïng lµm gi¸o tr×nh gi¶ng d¹y bËc ®¹i häc vµ sau ®¹i häc chuyªn ngµnh ®iÖn, ®iÖn tö hoÆc lµm tµi liÖu tham kh¶o cho c¸c nghiªn cøu sinh vµ cho nh÷ng ai quan t©m ®Õn cÊu tróc vµ lËp tr×nh ASIC.

Cuèn s¸ch ®−îc biªn so¹n bëi PGS. TS. NguyÔn T¨ng C−êng vµ TS. Phan Quèc Th¾ng, ThS. Ph¹m TuÊn H¶i, KS Lª Träng NghÜa, do PGS. TS. NguyÔn T¨ng C−êng chñ biªn.

Nh©n dÞp nµy, tËp thÓ t¸c gi¶ xin bµy tá lêi c¸m ¬n ch©n thµnh nhÊt ®Õn nh÷ng ng−êi ®· cã nhiÒu ®ãng gãp trong qu¸ tr×nh hoµn thµnh tµi liÖu, ®Õn c¸c anh chÞ em Bé m«n Tù ®éng vµ Kü thuËt tÝnh thuéc Khoa Kü thuËt §iÒu khiÓn, Häc viÖn Kü thuËt Qu©n sù, ®Æc biÖt ph¶i kÓ ®Õn sù hç trî hiÖu qu¶ cña TS. §ç §×nh NghÜa.

Do kinh nghiÖm vµ thêi gian h¹n chÕ, tµi liÖu nµy ch¾c ch¾n

kh«ng thÓ tr¸nh khái nh÷ng thiÕu sãt. RÊt mong nhËn ®−îc c¸c ý

kiÕn ®ãng gãp vµ x©y dùng cña b¹n ®äc gÇn xa. ý kiÕn ®ãng gãp xin

Page 4: Giao trinh fpga

4

göi vÒ ®Þa chØ: Bé m«n Tù ®éng vµ Kü thuËt tÝnh, Khoa Kü thuËt

§iÒu khiÓn, Häc viÖn Kü thuËt Qu©n sù, 100 Hoµng Quèc ViÖt, Hµ

néi; §iÖn tho¹i (04)7542281, email: [email protected].

Hµ Néi, Ngµy 1 th¸ng 10 n¨m

2005

TËp thÓ t¸c gi¶

Page 5: Giao trinh fpga

5

Ch−¬ng 1 : Giíi thiÖu tæng quan

tæ chøc phÇn cøng cña FPGA vμ CPLD

1.1 Giíi thiÖu c«ng nghÖ vµ gi¶i ph¸p cña Xilinx

Vµo cuèi nh÷ng n¨m 70, c¸c b¶ng m¹ch ®−îc thiÕt kÕ s½n cïng

víi c¸c thiÕt bÞ chuÈn logic ®−îc −a chuéng vµ thÞnh hµnh . Sau ®ã

mét sè c©u hái ®−îc ®−a ra r»ng " §iÒu g× sÏ x¶y ra nÕu chóng ta

®−a cho nh÷ng ng−êi thiÕt kÕ kh¶ n¨ng thùc hiÖn kÕt nèi gi÷a c¸c

thiÕt bÞ chuÈn logic kh¸c nhau trong mét thiÕt bÞ lín h¬n ? ". §iÒu

nµy cho phÐp nh÷ng ng−êi thiÕt kÕ tÝch hîp ®−îc nhiÒu thiÕt bÞ

chuÈn logic h¬n vµo trong mét thiÕt bÞ. §Ó cã ®−îc sù linh ho¹t

trong thiÕt kÕ, Ron Cline ng−êi cña h·ng SigneticsTM ®· ®−a ra ý

t−ëng bao gåm hai s¬ ®å cho phÐp ng−êi thiÕt kÕ cã thÓ lËp tr×nh

®−îc.

Hai s¬ ®å nµy cung cÊp bÊt kú tæ hîp logic nµo cña c¸c cæng

"AND" vµ "OR" mµ chóng cã thÓ ®−îc dïng chung víi mét sè giíi

h¹n cæng "AND " th«ng qua c¸c cæng "OR". CÊu tróc nµy ®· trë nªn

rÊt mÒm dÎo, nh−ng t¹i thêi ®iÓm ®ã líp ®Öm h×nh häc 10 µm ®· t¹o

ra sù gi÷ chËm gi÷a ®Çu vµo vµ ®Çu ra rÊt lín, chÝnh ®iÒu nµy ®· lµm

Page 6: Giao trinh fpga

6

cho thiÕt bÞ ho¹t ®éng t−¬ng ®èi chËm. Vµ cÊu tróc nµy ®−îc gäi lµ

cÊu tróc cña PLA (Programmable Logic Array).

H×nh 1.1. CÊu tróc cña PLA (Programmable Logic Array)

H·ng MMI (Sau ®ã bÞ mua bëi h·ng AMD TM) ®· hîp t¸c víi

h·ng SigneticsTM vµ lµ n¬i cung cÊp nguån tµi liÖu thø hai cho hÖ

thèng m¶ng logic lËp tr×nh PLA (Programmable Logic Array).

Nh−ng sau khi s¶n xuÊt, cÊu tróc nµy ®· bÞ thay ®æi vµ trë thµnh cÊu

tróc logic m¶ng lËp tr×nh ®−îc PAL (Programmable Array Logic),

bëi viÖc cè ®Þnh mét m¶ng vµ chØ cho phÐp lËp tr×nh trªn mét m¶ng

cßn l¹i. CÊu tróc PAL míi nµy rÊt kh¸c víi cÊu tróc cña PLA ë chç

lµ mét m¶ng lËp tr×nh ®−îc bÞ g¾n cè ®Þnh - m¶ng c¸c cæng OR .

Tuy nhiªn, cÊu tróc PAL (Programmable Array Logic) nµy còng cã

lîi lµ thêi gian gi÷ chËm ®−êng truyÒn tõ ®Çu vµo ®Õn ®Çu ra ng¾n

h¬n vµ phÇn mÒm Ýt phøc t¹p h¬n. Tuy nhiªn chóng kh«ng mÒm dÎo

b»ng cÊu tróc PLA (Programmable Logic Array) . C¸c cÊu tróc kh¸c

còng ®−îc ®−a ra, ch¼ng h¹n nh− PLD (Programmable Logic

Device) - thiÕt bÞ logic lËp tr×nh ®−îc. Lo¹i thiÕt bÞ nµy th−êng ®−îc

gäi lµ thiÕt bÞ logic lËp tr×nh ®−îc ®¬n gi¶n SPLD ( Simple

Page 7: Giao trinh fpga

7

Programmable Logic Device) vµ tªn nµy ®−îc gäi chung cho tÊt c¶

c¸c thiÕt bÞ logic lËp tr×nh ®−îc nh− : PALs, CPLDs, FPGAs. CÊu

tróc cña PAL (Programmable Array Logic) .

H×nh 1.2. CÊu tróc cña PAL (Programmable Array Logic)

CÊu tróc nµy cã c¸c m¾t l−íi cña c¸c ®−êng nèi theo chiÒu

ngang vµ chiÒu ®øng. T¹i mçi ®iÓm giao nhau, chóng ®−îc nèi víi

nhau b»ng mét cÇu tr×. Víi sù trî gióp cña c¸c c«ng cô phÇn mÒm,

ng−êi thiÕt kÕ cã thÓ lùa chän mèi nèi, mèi nµo kh«ng ®−îc nèi th×

cÇu tr× t¹i ®iÓm ®ã sÏ bÞ huû ®i (BÞ nung nãng vµ thæi ®øt). §iÒu nµy

®−îc thùc hiÖn bëi mét bé n¹p ch−¬ng tr×nh.

Theo h×nh 1.2 c¸c ch©n ®Çu vµo ®−îc nèi vµo c¸c ®−êng theo

chiÒu ®øng, c¸c ®−êng n»m ngang ®−îc nèi víi c¸c cæng AND -

OR, lÇn l−ît c¸c ®−êng nµy ®−îc nèi víi c¸c Flip-Flop chuyªn dông

(Ch¼ng h¹n nh− Flip-Flop lo¹i D, T, RS). C¸c PLDs (Programmable

Logic Device) trong mét IC ®ãng gãi ®¬n cã sè cæng nhiÒu h¬n 50

lÇn c¸c thiÕt bÞ logic chuyªn biÖt. §iÒu nµy nã ®· thÓ hiÖn mét sù

tiÕn bé râ rÖt, ®Êy lµ ch−a ®Ò cËp ®Õn mét sè thiÕt bÞ cÇn ph¶i ®−îc

gi¶n l−îc ho¸ ®Ó cã ®é tin cËy cao h¬n c¸c thiÕt bÞ chuÈn logic .

C«ng nghÖ PLD ®· ph¸t triÓn tõ nh÷ng ngµy cßn rÊt sím, ch¼ng

Page 8: Giao trinh fpga

8

h¹n nh− c«ng ty Xilinx, hä ®· ®−a ra s¶n phÈm CMOS víi nguån

tiªu thô siªu thÊp dùa trªn c«ng nghÖ bé nhí flash. C¸c PLD flash

cho phÐp kh¶ n¨ng lËp tr×nh vµ xo¸ b»ng ®iÖn cho thiÕt bÞ nhiÒu lÇn

®· trë nªn thÝch hîp h¬n so víi c¸c chÝp thÕ hÖ cò, c¸c lo¹i chip mµ

víi thêi gian xo¸ ch−¬ng tr×nh h¬n 20 phót b»ng tia cùc tÝm .

1.1.1. Complex Programmable Logic Devices (CPLDs)

T¹m dÞch lµ c¸c thiÕt bÞ logic cho phÐp lËp tr×nh phøc hîp, hä

thiÕt bÞ nµy lµ kÕt qu¶ cña viÖc t¨ng mËt ®é cña hä SPLDs

(Programmable Logic Device) lªn nhiÒu lÇn. Kh¸i niÖm nµy ®−îc

hiÓu nh− sau : t¨ng mét sè khèi PLD hoÆc c¸c macrocell (xin ®−îc

®Ó nguyªn nghÜa vµ gi¶i thÝch ë phÇn cÊu tróc cña CPLD) ë trong

mét thiÕt bÞ ®¬n cïng víi c¸c ®−êng nèi liÒn ®a n¨ng gi÷a chóng.

C¸c ®−êng nèi cña c¸c ®¬n vÞ logic ®¬n cã thÓ ®−îc thùc thi ë trong

mét khèi ®¬n ( a single block ). NhiÒu logic phøc t¹p yªu cÇu cÇn

nhiÒu khèi vµ sö dông c¸c ®−êng nèi ®a n¨ng gi÷a chóng ®Ó t¹o nªn

c¸c kÕt nèi phøc t¹p h¬n.

H×nh 1.3. CÊu tróc cña CPLD

Page 9: Giao trinh fpga

9

C¸c CPLDs rÊt thÝch hîp trong viÖc diÔn t¶ c¸c cæng logic phøc

t¹p víi tèc ®é lµm viÖc lín h¬n 200 Mhz ( t−¬ng ®−¬ng 5 ns ).

Khu«n mÉu thêi gian cho CPLD rÊt dÔ tÝnh to¸n, bëi thÕ tr−íc khi

b¾t ®Çu thiÕt kÕ b¹n cã thÓ tÝnh to¸n c¸c tèc ®é tõ ®Çu vµo ®Õn ®Çu ra

cña m×nh dùa trªn khu«n mÉu nµy. CPLDs ®−a ra c¸ch ®¬n gi¶n

nhÊt ®Ó thùc hiÖn mét thiÕt kÕ, mét thiÕt kÕ cã thÓ ®−îc m« t¶ bëi

c¸c s¬ ®å nguyªn lý hoÆc nhËp vµo mét HDL ( Hardware

Description Language - Ng«n ng÷ m« t¶ phÇn cøng). §¬n gi¶n khi

sö dông c¸c c«ng cô ph¸t triÓn ®Ó tèi −u ho¸, n¹p vµ m« pháng thiÕt

kÕ. C¸c c«ng cô thiÕt kÕ sÏ t¹o ra mét file mµ file nµy (chÝnh lµ mét

file ch−¬ng tr×nh) ®−îc dïng ®Ó ®−a thªm c¸c chuÈn logic vµo trong

mét chip CPLD cïng víi chøc n¨ng mong muèn. ChÝnh v× vËy nã

cung cÊp mét chuÈn phÇn cøng mµ cho phÐp c¸c qu¸ tr×nh xö lý, gì

rèi cã thÓ thùc hiÖn ngay tõ khi b¾t ®Çu c«ng viÖc thiÕt kÕ. Gi¶ sö

nÕu b¹n cÇn cã mét mét sù thay ®æi vÒ thiÕt kÕ, b¹n cã thÓ ®−a sù

thay ®æi thiÕt kÕ ®ã vµo trong c«ng cô ph¸t triÓn CPLD vµ thùc thi

trªn nã, sau ®ã b¹n cã thÓ kiÓm tra ®−îc tøc th× ngay sau ®ã b»ng

mét phÇn mÒm m« pháng. CPLD cã møc tÝch hîp rÊt cao (cã nghÜa

lµ mét sè l−îng lín c¸c cæng trªn mét diÖn tÝch) vµ ®−îc ®ãng gãi

trong mét khu«n d¹ng rÊt nhá. §iÒu nµy ®· ®−a ra mét gi¶i ph¸p

tuyÖt vêi cho nh÷ng ng−êi thiÕt kÕ cÇn s¶n phÈm cña m×nh ®−îc

®ãng gãi nhá gän víi diÖn tÝch bo m¹ch bÞ giíi h¹n vÒ kh«ng gian.

Hä Xilinx CoolRunner CPLDs lu«n cã mÆt trong c¸c ®ãng gãi cïng

víi c¸c chip ®êi míi. Ch¼ng h¹n nh− chip CP56 CPLD cã kho¶ng

c¸ch c¸c ch©n lµ 0,5 mm vµ víi kÝch th−íc bao nhá kh«ng ®¸ng kÓ

Page 10: Giao trinh fpga

10

6x6mm vµ ®iÒu nµy cho phÐp ®−a ra mét s¶n phÈm nhá gän cïng

víi møc ®é tiªu thô nguån thÊp .

1.1.2. Field Programmable Gate Arrays ( FPGAs)

M¶ng cæng cho phÐp lËp tr×nh ®−îc. N¨m 1985, c«ng ty Xilinx

®· ®−a ra mét ý t−ëng míi : §ã lµ sù kÕt hîp gi÷a nh÷ng ®iÒu khiÓn

ng−êi dïng, thêi gian ®−a s¶n phÈm PLD (Programmable Logic

Device) ra thÞ tr−êng cïng víi mËt ®é tÝch hîp, gi¸ cña c¸c ma trËn

cæng. §iÒu nµy ®· cho ra ®êi thiÕt bÞ FPGA vµ cho ®Õn nay Xilinx

vÉn lµ nhµ ph©n phèi sè 1 trªn toµn thÕ giíi vÒ hä thiÕt bÞ nµy. Mét

FPGA cã cÊu tróc cña c¸c Logic Cell hoÆc c¸c Module vµ c¸c

®−êng nèi (Xem h×nh 1.4), c¸c ®−êng nèi nµy n»m d−íi sù ®iÒu

khiÓn cña ng−êi thiÕt kÕ. Cã nghÜa lµ b¹n cã thÓ thiÕt kÕ, lËp tr×nh vµ

thay ®æi m¹ch cña b¹n bÊt cø khi nµo b¹n muèn . Víi hä FPGA

ngµy nay kh¶ n¨ng tÝch hîp cña nã ®· v−ît qua giíi h¹n 10 triÖu

cæng ( Hä Xilinx VirtexTM- II vµ VirtexTM- 4 FPGA hiÖn ®ang gi÷ kû

lôc).Víi sù giíi thiÖu cña hä s¶n phÈm Spartan FPGA hiÖn nay,

Xilinx cã thÓ c¹nh tranh vÒ ma trËn cæng ë mäi khÝa c¹nh nh− gi¸

c¶, sè l−îng cæng, sè l−îng vµo ra còng nh− hiÖu qu¶ vÒ gi¸ thµnh.

Gi¶ sö lÊy Spartan - IIE FPGA víi sè l−îng 300.000 cæng lµm chuÈn

cña gi¸ thµnh, nã cã thÓ cho phÐp thay thÕ c¸c s¶n phÈm øng dông

theo chuÈn chuyªn dông.

Cã hai lo¹i FPGA c¬ b¶n : Lo¹i SRAM (Static Random Access

Memory) cã thÓ lËp tr×nh l¹i nhiÒu lÇn vµ lo¹i OTP (One - Time

Programmable) lËp tr×nh mét lÇn.

Page 11: Giao trinh fpga

11

H×nh 1.4. CÊu tróc cña FPGA

Hai lo¹i nµy kh¸c nhau ë chç thùc hiÖn cña c¸c logic cell vµ kü

thuËt t¹o sù kÕt nèi gi÷a chóng trong thiÕt bÞ. Lo¹i hay ®−îc dïng

h¬n c¶ lµ lo¹i SRAM, v× nã cã thÓ lËp tr×nh ®−îc nhiÒu lÇn. Thùc tÕ

th× SRAM FPGA ®−îc n¹p cÊu h×nh l¹i mçi khi bËt nguån, bëi v×

FPGA lo¹i nµy thùc chÊt lµ mét chÝp nhí theo ý muèn. Cã mét c©u

hái ®Æt ra lµ " T¹i sao l¹i cÇn mét chip PROM nèi tiÕp hoÆc bé nhí

hÖ thèng? " cïng víi mçi SRAM FPGA . Xem cÊu tróc cña hai lo¹i

víi h×nh vÏ 1.5 vµ 1.6:

Page 12: Giao trinh fpga

12

H×nh 1.5. CÊu tróc SRAM FPGA ( SRAM Logic Cell)

- Lo¹i SRAM cã thÓ lËp tr×nh l¹i :

+ SRAM x¸c ®Þnh c¸c ®−êng kÕt nèi.

+ SRAM x¸c ®Þnh ®¬n vÞ logic trong b¶ng LUT ( Look Up

Table )

( Mçi mét LUT lµ mét bé t¹o chøc n¨ng hay bé t¹o hµm víi N

®Çu vµo vµ mét ®Çu ra, cã thÓ thùc hiÖn bÊt cø chøc n¨ng logic nµo

víi N ®Çu vµo cña nã. N th−êng n»m gi÷a 2 vµ 6, th«ng th−êng c¸c

LUT cã 4 ®Çu vµo ).

H×nh 1.6 . CÊu tróc cña OTP FPGA (OTP Logic Cell)

- Lo¹i OTP cho phÐp lËp tr×nh mét lÇn :

+ C¸c ®−êng nèi kh«ng ®−îc phÐp nèi nh− d¹ng cÇu ch× ( Nèi

cè ®Þnh ).

+ Logic lµ c¸c cæng truyÒn thèng .

Trong SRAM Logic Cell, thay v× c¸c cæng th«ng th−êng, mét

LUT ( bé t¹o hµm ) sÏ x¸c ®Þnh c¸c ®Çu ra dùa vµo gi¸ trÞ cu¶ c¸c

®Çu vµo. Nh− h×nh 1.5 ta thÊy s¸u tæ hîp kh¸c nhau cña bèn bÝt vµo

Page 13: Giao trinh fpga

13

x¸c ®Þnh c¸c gi¸ trÞ cña ®Çu ra, c¸c bit nµy còng ®−îc dïng ®Ó thùc

thi c¸c kÕt nèi. Trong OTP FPGAs sö dông kÕt nèi

gi÷a c¸c ®−êng theo d¹ng nèi ng−îc ( Cã nghÜa ng−îc víi cÇu tr×, sù

kÕt nèi ®−îc t¹o ra vµ kh«ng bÞ nãng ch¶y trong suèt thêi gian n¹p

ch−¬ng tr×nh), nh»m t¹o ra c¸c kÕt nèi cè ®Þnh trong chip. H¬n n÷a,

OTP FPGA kh«ng cÇn SPROM nµo kh¸c, ®iÒu ®ã cã nghÜa lµ n¹p

cÊu h×nh vµo th¼ng FPGA. Tuy nhiªn mçi lÇn thay ®æi mét thiÕt kÕ

b¹n ph¶i vøt bá ®i mét chip. Lo¹i OTP Logic Cell cã cÊu tróc t−¬ng

tù nh− hä PLD (Programmable Logic Device), bao gåm c¸c cæng vµ

flip - flop chuyªn dông nh− Flip-Flop lo¹i D , T , hay RS .

1.2. Giíi thiÖu c¸c hä thiÕt bÞ cña Xilinx

Xilinx chia s¶n phÈm cña m×nh ra rÊt nhiÒu hä nh−ng tµi liÖu sÏ

tËp trung chÝnh vµo viÖc giíi thiÖu hai lo¹i FPGA vµ CPLD c¬ b¶n,

xem h×nh vÏ (H×nh2.1). §ã lµ läai thiÕt bÞ CoolRunner - XPLA3

CPLD, vµ Spartan 3 FPGA.

Page 14: Giao trinh fpga

14

H×nh1.7. S¬ l−îc c¸c hä thiÕt bÞ cña Xilinx

1.2.1. Hä Platform FPGAs

H×nh 1.7 cho ta thÊy ®−îc tæng quan c¸c hä s¶n phÈm chÝnh cu¶

Xilinx. ë ®©y xin chØ giíi thiÖu tæng quan vµ ®−a ra c¸c ®Þa chØ cÇn

tra cøu vÒ chi tiÕt kü thuËt cña chóng trªn trang Web cña h·ng

Xilinx.

Hä Virtex FPGAs : S¶n phÈm Virtex-II lµ hiÖn th©n ®Çu tiªn

cña Platform FPGA. Nã ®· t¹o ra mét ®iÓm dÊu míi trong sù thùc

thi, céng thªm hµng lo¹t c¸c tÝnh n¨ng míi cña thiÕt bÞ mµ tõ tr−íc

ch−a cã. §©y lµ thêi kú mµ Xilinx më réng tÇm chiÕn l−îc cña m×nh

b»ng viÖc kÕt hîp víi c¸c h·ng IBM, Wind River, Conexant,

Page 15: Giao trinh fpga

15

RocketChipsTM, The MathWorks, vµ c¸c nhµ ®øng ®Çu c«ng nghÖ

kh¸c trªn thÕ giíi. Platform FPGA ®−a ra c¸c ®Æc tÝnh sau :

- C¸c giao tiÕp vµo ra hÖ thèng lµm gi¶m nhÑ bít c¸c tiªu chuÈn

kh«ng cÇn thiÕt kh¸c.

- XtremeDSPTM dùa trªn FPGA, gi¶i ph¸p cho sù thùc hiÖn DSP

ch−a tõng cã (Nhanh gÊp 100 lÇn bé xö lý DSP hµng ®Çu).

- Empower ! Kü thuËt xö lý dµnh cho xö lý hÖ thèng ®ßi hái sù

thùc hiÖn cao vµ mÒm dÎo.

Víi d¶i mËt ®é tõ 40.000 ®Õn 10 triÖu cæng hÖ thèng , Virtex-II

®−a ra bé nhí hÖ thèng ®−îc më réng vµ bé DSP flash th«ng qua kÕt

cÊu nhóng IP (Lâi së h÷u trÝ tuÖ). Hä Xilinx Virtex lµ hä ®Çu tiªn

cña FPGA mµ nã ®−a ra mét triÖu cæng hÖ thèng vµ ®−îc giíi thiÖu

vµo n¨m 1998. Dßng s¶n phÈm Virtex vÒ c¬ b¶n ®· ®−îc ®Þnh nghÜa

l¹i tÊt c¶ c¸c ®¬n vÞ logic lËp tr×nh bëi viÖc më réng c¸c kh¶ n¨ng

cña FPGA truyÒn thèng ®Ó cã ®Æc tÝnh m¹nh h¬n, nã ®−îc dïng cho

c¸c thiÕt kÕ hÖ thèng thùc thi cao. C¸c thiÕt bÞ míi nhÊt ®−îc ®−a ra

víi hä s¶n phÈm Virtex-E vµ ®−îc c«ng bè n¨m 1999 víi h¬n ba

triÖu cæng hÖ thèng. Virtex-EM giíi thiÖu n¨m 2000 vµ lµ hä FPGA

®Çu tiªn ®−îc s¶n xuÊt víi qui tr×nh m¹ ®ång ®· ®−îc c¶i tiÕn vµ

thªm vµo bé nhí trong chip ®Ó dïng trong c¸c øng dông chuyÓn

m¹ch m¹ng.

Hä Spartan FPGAs :

Hä Spartan FPGA lµ ý t−ëng dïng cho c¸c øng dông víi sè

l−îng lín, gi¸ thµnh thÊp, chóng ®−îc ®−a vµo c¸c thiÕt bÞ ®Ých

nh»m thay thÕ c¸c chip logic cè ®Þnh vµ c¸c s¶n phÈm chuyªn dông,

Page 16: Giao trinh fpga

16

ch¼ng h¹n nh− c¸c chip giao tiÕp bus. N¨m thµnh viªn cña hä nµy lµ

Spartan-3 (1.2v), Spartan-IIE (1.8 v), Spartan-II (2.5 v) vµ SpartanXL

(3.3v), Spartan(5v). ë tµi liÖu nµy xin giíi thiÖu hä s¶n phÈm

Spartan-3.

- Spartan-3 FPGAs (1.2v, 90nm) : Víi hä nµy, nã kh«ng chØ cã

gi¸ thµnh thÊp mµ cßn ®ùoc tÝch hîp víi mét sè tÝnh chÊt míi vÒ cÊu

tróc, c¸c tÝnh chÊt nµy ®−îc kÕt hîp víi c¸c ®¬n vÞ logic cho phÐp

lËp tr×nh. Sù kÕt hîp gi÷a gi¸ thµnh thÊp víi c¸c tÝnh chÊt míi ®· t¹o

ra sù thay thÕ c¸c chip ASIC vµ c¸c thiÕt bÞ chuyªn dïng kh¸c. VÝ dô

mét chip Spartan-3 FPGA trong hÖ thèng ®a ph−¬ng tiÖn truyÒn

th«ng trong xe h¬i cã thÓ tËp hîp ®−îc rÊt nhiÒu chøc n¨ng cña hÖ

thèng, bao gåm c¸c lâi IP nhóng, giao tiÕp hÖ thèng kh¸ch hµng,

DSP vµ c¸c ®¬n vÞ logic kh¸c. Nã bao gåm c¸c thµnh phÇn chÝnh

sau:

+/ C¸c khèi SRL16 ( thanhghi dÞch 16 bit) :

* Mçi khèi Logic ®Þnh cÊu h×nh ®−îc (CLB LUT- Configurable

Logic Block LookUp Table) lµm viÖc nh− mét thanh ghi dÞch nhanh

16 bit. (Mçi CLB cã chøa 2 hoÆc 4 LUT vµ 2 hoÆc 4 Flip Flop ).

* Nèi tÇng c¸c LUT ( Bé t¹o chøc n¨ng ) ®Ó t¹o nªn thanh ghi dÞch

dµi h¬n .

* Sö dông c¸c thanh ghi ®−êng èng cho c¸c bé ®Öm dµnh cho Video

vµ c¸c kÕt nèi kh«ng d©y.

+/ Bé nhí RAM chän cã thÓ ®−îc cÊp tíi 520Kb

* Mçi LUT lµm viÖc nh− bé RAM/ROM ®¬n cæng hoÆc l−ìng cæng.

Page 17: Giao trinh fpga

17

* Nèi tÇng c¸c LUT ®Ó t¹o bé nhí lín h¬n .

* C¸c øng dông cã thÓ thay ®æi kÝch th−íc bé nhí mét c¸ch mÒm

dÎo, FIFO, vµ c¸c bé ®Öm.

+/ Khèi RAM nhóng tíi 1.87Mb

* Nhóng tíi 104 khèi RAM ®ång bé b»ng viÖc nèi tÇng c¸c khèi

RAM 18Kb.

* Mçi khèi RAM 18Kb coi nh− mét RAM ®¬n cæng hoÆc l−ìng

cæng .

* Cung cÊp c¸c béi sè cña tû sè t−¬ng quan, chuyÓn ®æi ®é réng d÷

liÖu, tÝnh ch½n lÎ.

* Cung cÊp cho c¸c øng dông gåm: bé ®Öm d÷ liÖu, FIFO, vµ c¸c bé

®Öm kh¸c.

+/ Giao tiÕp bé nhí

* Cho phÐp giao tiÕp ®iÖn víi c¸c chuÈn nh− HSTL, SSTL, cho phÐp

thùc hiÖn kÕt nèi víi bé nhí th«ng th−êng.

+/ C¸c bé nh©n

* Cho phÐp c¸c phÐp tÝnh to¸n häc vµ sè häc ®¬n gi¶n còng nh− c¸c

chøc n¨ng n©ng cao cña DSP.

* Cung cÊp 104 bé nh©n 18x18 víi c¸c phÐp nh©n18 bit dÊu hoÆc 17

bit kh«ng dÊu, cho phÐp nèi tÇng ®Ó t¨ng ®é réng sè bit.

* C¸c bé nh©n hÖ sè h»ng : Bé nhí on - Chip vµ c¸c Logic Cell lµm

viÖc chÆt chÏ víi nhau ®Ó x©y dùng c¸c bé nh©n víi c¸c to¸n h¹ng lµ

h»ng sè.

* Bé nh©n Logic cell : Thùc hiÖn thuËt to¸n th«ng th−êng ch¼ng h¹n

Page 18: Giao trinh fpga

18

nh− Baugh Wooly, Booth, c©y Wallance ...

* C¸c bé DCM (Digital Clock Manager - Bé qu¶n lý ®ång hå sè)

thùc hiÖn viÖc qu¶n lý ®ång hå sè phøc t¹p mµ kh«ng bÞ ¶nh h−ëng

cña c¸c t¸c nh©n kÝch thÝch mang tÝnh hÖ thèng nh−, nhiÖt ®é, sù

biÕn thiªn ®iÖn ¸p, vµ c¸c vÊn ®Ò kh¸c mµ vÝ dô ®iÓn h×nh lµ th−êng

x¶y ra víi c¸c bé PLL (Phase Lock Loop - c¸c vßng kho¸ pha) ®−îc

tÝch hîp trong FPGA.

* Bé t¹o tÇn sè mÒm dÎo tõ 25 MHz ®Õn 325 MHz.

* §iÒu khiÓn dÞch pha c¸c gãc 1/4.

*T¹o c¸c chu kú chÝnh x¸c 50/50.

* Bï nhiÖt.

+/ Kü thu©t trë kh¸ng ®iÒu khiÓn ®−îc XCITE

(Xilinx Controlled Impedance Technology)

*C¸c ®Çu cuèi I/O cÇn b¶o toµn tÝnh nguyªn d¹ng cu¶ tÝn hiÖu, víi

hµng tr¨m ®Çu I/O vµ víi c¸c kü thuËt ®ãng gãi c¶i tiÕn, c¸c ®iÖn trë

®Çu cuèi më réng kh«ng cßn bÞ biÕn ®æi.

* C¸c ®Çu cuèi I/O bÞ lo¹i trõ sù thay ®æi theo qu¸ tr×nh nh− nhiÖt

®é, dao ®éng cña ®iÖn ¸p .

B¶ng 1.1. Tæng quan hä Spartan-3 FPGA

Page 19: Giao trinh fpga

19

C¸c ®Æc tÝnh vµ c«ng dông cña chóng ®−îc nªu trong b¶ng 1.2 :

B¶ng 1.2. C¸c ®Æc tÝnh chÝnh cña Spartan-3

C¸c ®Æc tÝnh cña Spartan -3 C«ng dông

KÕt cÊu vµ ®Þnh tuyÕn FPGA lªn

tíi 5.000.000 cæng hÖ thèng.

- Cho phÐp thùc hiÖn c¸c khèi

chøc n¨ng møc hÖ thèng, kÕt nèi

on - chip cao, ®−a vµo c¸c cÊu

h×nh hÖ thèng cao .

Khèi RAM - cã c¸c Block 18K - Cho phÐp thùc hiÖn c¸c bé ®Öm

lín, c¸c FIFO, c¸c bé ®Öm kÕt

nèi.

ChÕ ®é thanh ghi dÞch ( SRL 16 ) - ý t−ëng thanh ghi dÞch 16 bit

dµnh cho c¸c øng dông tèc ®é

cao, hoÆc d÷ liÖu cã d¹ng th«

®−îc l−u tr÷ trong DSP vµ c¸c

Page 20: Giao trinh fpga

20

øng dông m· ho¸, xö lý ®−êng

èng nhanh .

C¸c khèi nh©n 18x18 . - Dïng cho viÖc xö lý DSP tèc ®é

cao; Sù sö dông c¸c bé nh©n kÕt

hîp víi kÕt cÊu khung d÷ liÖu

cho phÐp thùc hiÖn DSP song

song siªu nhanh.

TÝn hiÖu ®Çu cuèi (lªn tíi 622

Mbps) ®Þnh d¹ng theo c¸c chuÈn

LVTTL, LVCMOS, GTL, GTL+,

PCI, HSTL-I, II, III, SSTL- I, II .

- Cho phÐp kÕt nèi c¸c chÝp ®ang

dïng víi c¸c chip, bé nhí kh¸c,

vµ tõ c¸c chip ®ang dïng tíi c¸c

chuÈn tÝn hiÖu ë m¹ch ph¶n håi,

lo¹i bít sù cÇn nhiÒu IC chuyÓn

®æi .

Bé qu¶n lý ®ång hå sè ( DCM ) - Lo¹i trõ sù gi÷ chËm ®ång hå

møc board vµ on-chip, nh©n chia

tøc th×, cã thÓ gi¶m ®−îc tèc ®é

®ång hå phï hîp ë møc board,

gi¶m sè bé ®ång hå trªn bo

m¹ch. Cã thÓ ®iÒu chØnh pha

®ång hå ®¶m b¶o ®é chÝnh x¸c

cao .

Cã c¸c tµi nguyªn ®−îc ®Þnh

tuyÕn toµn côc.

- Sù ph©n phèi c¸c clock vµ c¸c

tÝn hiÖu kh¸c cïng víi c¸c hÖ sè

ph©n chia ®Çu ra cao trªn toµn

Page 21: Giao trinh fpga

21

thiÕt bÞ.

§iÒu khiÓn ®Çu ra cho phÐp lËp

tr×nh .

- N©ng cao tÝnh toµn vÑn cña

thiÕt bÞ

1.2.2. Hä Xilinx CPLDs

HiÖn nay Xilinx ®−a ra c¸c s¶n phÈm CPLD ë hai lo¹i thiÕt bÞ :

XC9500 vµ CoolRunner. §Ó chän CPLD phï hîp, b¹n cÇn xem qua

c¸c ®Æc tÝnh cu¶ nã ®Ó nhËn d¹ng hä s¶n phÈm mµ nã phï hîp víi

øng dông cña b¹n.

- Víi hä XC9500 : lµ hä c¸c thiÕt bÞ cho phÐp lËp tr×nh phøc t¹p

víi sù thùc thi cao, c¸c ®Æc tÝnh míi, linh ho¹t. Hä thiÕt bÞ nµy ®−a

ra tèc ®é dÉn ®Çu trong nÒn c«ng nghiÖp, nã cung cÊp sù linh ho¹t

trong cÊu tróc kho¸ ch©n víi ng−êi dïng. Hä s¶n phÈm nµy ®−îc

dïng cho c¸c thiÕt kÕ cÇn tèc ®é cao, gi¸ thµnh thÊp.

- Hä CoolRunner : Hä thiÕt bÞ tiªu thô nguån cùc kú thÊp, t¹o ra

sù dÉn ®Çu trong thÞ tr−êng c¸c thiÕt bÞ x¸ch tay. Ho¹t ®éng trong

chÕ ®é chê ë møc Micro ampe, tiªu thô nguån nhá nhÊt khi lµm

viÖc, v× vËy nã phï hîp víi c¸c øng dông mµ cÇn quan t©m nguån,

Page 22: Giao trinh fpga

22

ch¼ng h¹n nh− nguån ¾c qui, c¸c øng dông x¸ch tay. §Ó quyÕt ®Þnh

chän läai thiÕt bÞ nµo phï hîp víi tiªu chuÈn thiÕt kÕ, cÇn ph¶i xem

thªm c¸c th«ng tin chi tiÕt vÒ lo¹i thiÕt bÞ mµ b¹n cÇn, ch¼ng h¹n

nh− : MËt ®é cæng, sè thanh ghi, sè ch©n vµo ra, tèc ®é yªu cÇu,

®ãng gãi ch©n, tiªu thô nguån, chøc n¨ng møc hÖ thèng...

Hä XC9500 ISP ( Hä nµy cho phÐp lËp tr×nh møc hÖ thèng )

Hä XC9500 víi sù thùc thi cao, gi¸ thµnh thÊp lµ môc tiªu cho

c¸c øng dông cã nhu cÇu ph¸t triÓn, n©ng cÊp thiÕt kÕ. Hä XC9500

cã d¶i mËt ®é tõ 36 ®Õn 288 Macrocell (Xin gi¶i thÝch ë phÇn cÊu

tróc CPLD vµ FPGA môc 1.3 ch−¬ng I), lµm viÖc ë ®iÖn ¸p 2.5 Volt

(XC9500 XV), 3.3 Volt (XC9500 XL), 5 Volt (XC9500 ).

C¸c thiÕt bÞ nµy cho phÐp lËp tr×nh ë møc hÖ thèng ISP, ®iÒu

nµy cho phÐp sö dông l¹i c¸c thiÕt kÕ trong suèt thêi gian thö mÉu,

gì rèi hÖ thèng, n©ng cÊp, test tr−íc khi xuÊt x−ëng.

Dùa vµo c¸c kü thuËt xö lý tiªn tiÕn, hä XC9500 ®−a ra sù b¶o

hµnh nhanh (ChØ cÇn file ch−¬ng tr×nh ®−îc ®ãng gãi vµ n¹p l¹i),

cho phÐp kho¸ ch©n ng−êi dïng, giao tiÕp ®−îc víi chuÈn JTAG. TÊt

c¶ c¸c hä XC9500 cã ®Æc tÝnh tin cËy tuyÖt vêi víi 10.000 lÇn n¹p

xo¸ vµ l−u tr÷ d÷ liÖu trong vßng 20 n¨m.

- Hä XC9500 5 V : Lµ mét trong sè 6 thiÕt bÞ d¶i tõ 36 ®Õn 288

Macrocell víi c¸c kiÓu ®ãng gãi ch©n ®a d¹ng. C¸c ch©n vµo ra cho

phÐp giao tiÕp trùc tiÕp víi hÖ thèng 3V vµ 5 V (VccIO - ch©n giao

tiÕp ng−êi dïng), víi c¸c phiªn b¶n míi nã trë nªn rÊt dÔ sö dông

víi c¸c ®ãng gãi theo kiÓu CSP (Chip Scale Package), BGA (Ball

Grid Array) vµ cho phÐp truy cËp ®Õn 192 tÝn hiÖu.

Page 23: Giao trinh fpga

23

* CÊu tróc kho¸ ch©n linh ho¹t :

Cïng víi phÇn mÒm fitter ®· ®−a ra kh¶ n¨ng ®Þnh tuyÕn lín

nhÊt, mÒm dÎo trong thùc thi. Víi cÊu tróc cã giÇu ®Æc tÝnh, cho

phÐp ®−a ra nhiÒu tÝch sè nh©n riªng biÖt, cã ba bé ®ång hå toµn

côc, cã nhiÒu tÝch sè nh©n trªn ®Çu ra h¬n c¸c lo¹i CPLD kh¸c.

C¸c tÝnh n¨ng vÒ cÊu tróc cña lo¹i nµy rÊt thÝch nghi víi viÖc

söa ®æi thiÕt kÕ trong qu¸ tr×nh thiÕt kÕ.

* Trî gióp gì rèi vµ ph¸t triÓn giao tiÕp víi JTAG IEEE 1149.1:

Giao tiÕp JTAG cña hä XC9500 th«ng minh h¬n bÊt cø hä CPLD

nµo cã mÆt trªn thÞ tr−êng. Nã cã c¸c ®Æc tÝnh chuÈn hç trî kü thuËt

hái vßng, lÊy mÉu, kiÓm tra më réng.

H¬n n÷a nã gåm cã c¸c chØ dÉn quÐt biªn mµ c¸c lo¹i CPLD

kh¸c kh«ng cã, nã bao gåm INTEST (dïng cho kiÓm tra chøc n¨ng

cña thiÕt bÞ ), HIGHZ ( dïng cho kü thuËt hái vßng ).

Hä XC9500 5V nµy ®−a ra nhiÒu chuÈn c«ng nghiÖp ph¸t triÓn

ë thÕ hÖ thø ba, c¸c c«ng cô gì rèi nh− Corelis , JTAG, Assert

Intertech.

C¸c c«ng cô nµy cho phÐp b¹n ph¸t triÓn c¸c vÐc t¬ test vïng

biªn ®Ó ph©n tÝch sù ¶nh h−ëng lÉn nhau, test, gì rèi lçi hÖ thèng.

B¶ng 1.3. Tæng quan hä XC9500 5V

Page 24: Giao trinh fpga

24

- Hä XC9500XL 3.3 V: Hä XC9500 XL ®−îc óng dông trong

c¸c hÖ thèng mòi nhän cÇn sù ph¸t triÓn tiÕp theo vµ kh¶ n¨ng n©ng

cÊp thiÕt kÕ. Hä nµy ®−a ra sù thùc thi ch−a tõng cã víi ®é tin cËy

lËp tr×nh cao nhÊt, gi¸ thµnh thÊp nhÊt. Hä XC9500 XL bæ sung mËt

®é cao h¬n Xilinx FPGA ®Ó ®−a ra gi¶i ph¸p logic tæng thÓ trong

m«i tr−êng ph¸t triÓn tÝch hîp . C¸c ®Æc tÝnh chÝnh cña hä nµy nh−

sau :

* §iÓm m¹nh chÝnh :

+/ Gi¸ thµnh thÊp nhÊt trªn mçi Macrocell.

+/ CÊu tróc kho¸ ch©n tiªn tiÕn nhÊt hiÖn cã .

+/ Kh¶ n¨ng lËp tr×nh cao nhÊt, gi¶m sù rñi ro hÖ thèng

+/ Bæ sung cho hä Xilinx 3.3 V FPGA.

* Sù thùc thi :

+/ Tèc ®é truyÒn tÝn hiÖu gi÷a ch©n tíi ch©n 5ns .

+/ TÇn sè hÖ thèng 222 MHz .

* TÝnh n¨ng cÊu tróc m¹nh:

Page 25: Giao trinh fpga

25

+/ Cã c¸c khèi chøc n¨ng lªn tíi 54 ®Çu vµo .

+/ Cã tíi 90 tÝch sè nh©n trªn mçi Macrocell.

+/ Cho phÐp ®Þnh tuyÕn nhanh th«ng qua ma trËn chuyÓn

m¹ch CONNECTTM II.

+/ Cã ba bé ®ång hå toµn côc vµ cho phÐp chuyÓn ®æi vÞ trÝ

gi÷a chóng.

+/ Cã ®−êng OE (Output Enable) trªn mçi ®Çu ra riªng biÖt,

cho phÐp chuyÓn ®æi vÞ trÝ .

* §é tin cËy cao nhÊt

+/ Kh¶ n¨ng chÞu ®−îc 10.000 chu kú n¹p xo¸

+/ L−u d÷ liÖu ®−îc 20 n¨m

+/ Cho phÐp bá qua chÕ ®é lçi më kho¸ ISP .

B¶ng 1.4. C¸c hä XC9500 XV vµ XC9500 XL:

Page 26: Giao trinh fpga

26

Hä CoolRunner Low - Power CPLD:

Cã hai thµnh viªn chÝnh trong hä CoolRunner lµ CoolRunner

XPLA3(3.3v) vµ CoolRunner II (1.8V). ë tµi liÖu nµy giíi thiÖu

CoolRunner XPLA (3.3 v).

Hä CoolRunner CPLD lµ sù kÕt hîp cña sù tiªu thô nguån thÊp

vµ tèc ®é cao, mËt ®é cao, sè ®−êng vµo ra cao trong mét chip ®¬n.

Hä CoolRunner 3.3v cã mËt ®é tõ 32 ®Õn 512 Macrocell.

CoolRunner CPLD cã nÐt ®Æc biÖt cña kü thuËt nguån kh«ng, cho

phÐp thiÕt bÞ kh«ng tiªu thô nguån ë chÕ ®é Standby. §Æc tÝnh nµy

rÊt phï hîp víi c¸c thiÕt bÞ ®iÖn tö x¸ch tay, nh− Laptop PCs, ®iÖn

tho¹i di ®éng, c¸c thiÕt bÞ c¸ nh©n sè ... Hä CPLD nµy sö dông

nguån ®éng Ýt h¬n nhiÒu khi ho¹t ®éng so víi CPLD truyÒn thèng.

Mét ®iÒu quan träng h¬n c¶ lµ chóng dïng cho øng dông cÇn sù thùc

thi víi tèc ®é cao, nhËy c¶m vÒ nhiÖt, ch¼ng h¹n nh− chuyÓn m¹ch

cña tæng ®µi, hÖ thèng m« pháng ....

Page 27: Giao trinh fpga

27

Mçi thµnh viªn cña hä CoolRunner XPLA3 cã chøa kü thuËt

thiÕt kÕ nguån kh«ng mµ nã lµ sù kÕt hîp nguån n¨ng l−îng thÊp vµ

tèc ®é cao. Víi kü thuËt thiÕt kÕ nµy hä CoolRunner XPLA3 ®−a ra

tèc ®é truyÒn tõ ch©n tíi ch©n lµ 5ns. Khi ®−îc cÊp nguån víi dßng

nhá h¬n 100 µA (ë chÕ ®é standby) kh«ng cÇn bit "Powerdown" v×

bit nµy cã thÓ ¶nh h−ëng xÊu ®Õn sù thùc hiÖn cña thiÕt bÞ. B»ng

viÖc thay thÕ c¸c ph−¬ng ph¸p khuyÕch ®¹i truyÒn thèng, ph−¬ng

ph¸p c¸c tÝch sè nh©n víi mét lo¹t sù nèi tÇng cña c¸c cæng CMOS

thuÇn tuý. Nguån ®éng còng ®−îc thay thÕ b»ng nguån thÊp h¬n bÊt

kú lo¹i CPLD nµo kh¸c. Hä CoolRunner hoµn toµn lµ lo¹i PLD

CMOS, v× vËy chóng sö dông kü thuËt xö lý CMOS vµ kü thuËt thiÕt

kÕ nguån kh«ng CMOS .

B¶ng 1.5. C¸c ®Æc tÝnh cña hä CoolRunner:

§Æc tÝnh C«ng dông

CÊu tróc hoµn toµn CMOS cïng

víi kü thuËt thiÕt kÕ nguån

kh«ng FZP

- Dßng tiªu thô tæng vµ dßng ë

chÕ ®é STANBY thÊp nhÊt trong

sè hä CPLD, v× vËy tuæi thä cña

¾c qui sÏ cao h¬n, ®é tin cËy

t¨ng, to¶ nhiÖt Ýt h¬n.

Cã thÓ chän thiÕt bÞ cã chøa 32

®Õn 512 Macrocell.

- Phï hîp víi nhiÒu thiÕt kÕ vµ

c¸c øng dông, cã thÓ chuyÓn mËt

®é lªn hoÆc xuèng tuú thuéc vµo

ph¸t triÓn thiÕt kÕ lªn hay rót

bít.

Page 28: Giao trinh fpga

28

ChuÈn vµo ra thay ®æi ( Cã thÓ

dao déng tõ 3.3 ®Õn 5V).

- §¬n gi¶n trong thiÕt kÕ, cã

nhiÒu møc ®iÖn ¸p vµ dÔ chuyÓn

®æi møc.

HÖ thèng Bus vµo ra thuËn tiÖn. - Cã ®iÖn trë treo ë ®Çu cuèi .

Sù chän lùa clock ®a n¨ng. - MÒm dÎo trong thiÕt kÕ .

Cã c¸c thanh ghi ®Çu vµo t¸c

®éng nhanh

- Giao tiÕp trùc tiÕp víi bus tèc

®é cao ®−îc.

VFM (Variable Function Mux)

bé chän kªnh chøc n¨ng cho

phÐp thay ®æi.

- Qu¸ tr×nh tèi −u ho¸ m¹nh h¬n

vµ dÔ ®iÒu chØnh thiÕt kÕ, chi phÝ

thÊp h¬n khi dïng vµo c¸c øng

dông nhá.

§ãng gãi nhá gän víi c¸c

kho¶ng c¸ch ch©n lµ 0,8 mm vµ

0,5 mm.

- C¸c ch©n nhá nhÊt, tiÕt kiÖm

kho¶ng m¹ch in, phï hîp víi c¸c

thiÕt bÞ cÇm tay.

D¶i nhiÖt ®é chuÈn theo c«ng

nghiÖp vµ th−¬ng m¹i .

- Cã thÓ sö dông trong c¸c øng

dông ë c¸c lÜnh vùc kh¸c nhau,

nh− y häc...

B¶ng 1.6. Tæng quan hä CoolRunner :

Page 29: Giao trinh fpga

29

Gi¶i thÝch ký hiÖu CoolRunner CPLD:

1.2.3. Hä Xilinx øng dông trong hµng kh«ng vµ vò trô

Xilinx lµ nhµ cung cÊp hµng ®Çu c¸c hä PLD víi ®é tin cËy cao

cho thÞ tr−êng hµng kh«ng vò trô vµ qu©n sù . C¸c thiÕt bÞ nµy,

chóng ®−îc sö dông réng r·i trong c¸c øng dông nh− chiÕn tranh

Page 30: Giao trinh fpga

30

®iÖn tö, tªn löa dÉn ®−êng, tªn löa hµnh tr×nh, Radar, truyÒn th«ng

siªu ©m, xö lý tÝn hiÖu, khoa häc ®iÖn tö hµng kh«ng vµ vÖ tinh. Hä

QproTM víi c¸c s¶n phÈm QML gèm, plastic ®−a ra c¸c gi¶i ph¸p lËp

tr×nh logic n©ng cao cho c¸c thiÕt kÕ thÕ hÖ tiÕp theo. Hä QproTM

còng cã c¸c s¶n phÈm chän, chÞu nhiÖt ®Ó sö dông trong vÖ tinh vµ

c¸c øng dông kh«ng gian kh¸c. Ch¼ng h¹n nh− hä XQ4000E/EX

thuéc hä FPGA, QPro - XC1700D - PROM , XQ17V6 - PROM,

XQ18V04 - Flash PROM ®−îc sö dông trong lÜnh vùc qu©n sù .

§Þa chØ tham kh¶o : (

http://www.dscc.dla.mis/v/va/smd/smdsrch.html ).

1.3. CÊu tróc cña FPGA vµ CPLD Xilinx

Víi mçi hä kh¸c nhau cÊu tróc cu¶ chóng kh¸c nhau, tuy nhiªn

chóng vÉn cã nh÷ng ®iÓm chung, ë tµi liÖu nµy xin giíi thiÖu mét hä

cô thÓ. Víi hä cña FPGA t¸c gi¶ xin giíi thiÖu cÊu tróc cña Spartan-

IIE FPGA, víi hä CPLD xin gíi thiÖu hä CoolRunner XPLA3.

1.3.1. CÊu tróc cña Spartan-IIE ( 1.8V) FPGA

Hä Spartan-IIE (Lâi 1.8V) cña FPGA ®−a ra c¸c kü thuËt FPGA

ph¸t triÓn nhÊt ngµy nay, bao gåm cho phÐp lËp tr×nh víi nhiÒu

chuÈn vµo ra nh− LVDS, LVPECL, HSTL, c¸c khèi RAM on-chip,

c¸c vßng kho¸ ®é gi÷ chËm cho phÐp qu¶n lý clock ë møc board vµ

møc chip. H¬n n÷a hä Spartan-IIE cã mét ý nghÜa gi¸ trÞ kh¸c ®ã lµ

nã lo¹i bá sù cÇn thiÕt c¸c s¶n phÈm tiªu chuÈn chuyªn dông ( ASSP

) víi c¸c øng dông ®¬n gi¶n, ch¼ng h¹n nh− vßng kho¸ pha, FIFO,

c¸c bé chuyÓn ®æi vµo ra, ®iÒu khiÓn Bus hÖ thèng, c¸c thµnh phÇn

Page 31: Giao trinh fpga

31

nµy ®· kh«ng thÓ thiÕu ®Ó hoµn thiÖn mét thiÕt kÕ mµ nã ®· ®−îc

dïng tr−íc ®©y.

- Hä Spartan-IIE lµ ®ßn bÈy c¬ b¶n cho c¸c tÝnh n¨ng vÒ cÊu

tróc cña Virtex-E ®Ó ®−a ra nh÷ng tÝnh n¨ng næi tréi h¬n. CÊu tróc

CLB (Configurable Logic Block - Khèi logic cho phÐp ®Þnh cÊu

h×nh) cã chøa RAM ®−îc ph©n phèi ®Ó thùc hiÖn c¸c chøc n¨ng

logic c¬ b¶n.

- Bèn DLL ( Delay Locked Loop ) vßng kho¸ ®é gi÷ chËm ®−îc

sö dông cho bé qu¶n lý ®ång hå vµ cã thÓ thùc hiÖn clock ®èi xøng

lÖch vµ c¸c phÐp nh©n clock, chia clock. Clock ®èi xøng lÖch cã thÓ

®−îc thùc hiÖn bªn ngoµi (Møc board) hoÆc ë bªn trong chip ( Møc

c¬ b¶n ).

- C¸c khèi Block RAM gåm 4Kb cho mçi khèi cã thÓ ®−îc s¾p

xÕp ®é réng tõ 1 ®Õn 16 bit.

- §Æc tÝnh Select I/O cho phÐp giao tiÕp víi nhiÒu chuÈn kh¸c

nhau ®Ó thùc thi trong c¸c vïng kÕt nèi víi c¸c chip cã chuÈn IO

kh¸c nhau, kÕt nèi chip víi bé nhí, kÕt nèi chip víi c¸c giao tiÕp

Èn.

Page 32: Giao trinh fpga

32

H×nh 1.8. CÊu tróc cña Spartan - IIE

- Hä Spartan-IIE FPGA ®−îc thùc thi víi cÊu tróc CLB cho

phÐp lËp tr×nh linh ho¹t, th«ng dông, mµ c¸c CLB nµy ®−îc bao bëi

mét vßng c¸c khèi I/O lËp tr×nh ®−îc, c¸c ®−êng nèi ®−îc kÕt nèi

bëi c¸c nguån tµi nguyªn ®Þnh tuyÕn ®a n¨ng. CÊu tróc nµy còng ®−a

ra c¸c chøc n¨ng ®−îc n©ng cao ch¼ng h¹n nh− khèi RAM vµ c¸c

khèi ®iÒu khiÓn clock.

Page 33: Giao trinh fpga

33

H×nh 1.9. S¬ ®å khèi cña Spartan -IIE

H×nh 1.10. Khèi Input/Output Spartan -IIE (I/OB)

I/O Block:

- C¸c ®Æc tÝnh I/OB cña c¸c ®Çu vµo vµ ®Çu ra ®−îc hç trî tíi 19

c¸c chuÈn tÝn hiÖu kh¸c nhau, bao gåm LVDS, BLVDS, LVPECL,

Page 34: Giao trinh fpga

34

LVCMOS, HSTL, SSTL vµ GTL .

- C¸c ®Çu vµo ra tèc ®é cao nµy cã kh¶ n¨ng hç trî víi tÊt c¶

c¸c bé nhí hiÖn ®¹i vµ giao tiÕp bus kh¸c. Chóng gåm ba thanh ghi

chøc n¨ng hoÆc lµ c¸c flip - flop lo¹i D ®−îc kÝch ho¹t b»ng s−ên

hoÆc lµ c¸c bé chèt nh¹y møc H×nh 1.10.

- Mçi mét IOB cã mét ®−êng CLK ®−îc ®−a tíi ba thanh ghi

theo mét ®−êng dïng chung vµ c¸c ®−êng CE cho mçi thanh ghi

hoµn toµn ®éc lËp xem H×nh 1.10.

Ngoµi c¸c ®−êng CLK, CE, mçi thanh ghi ®Òu cã chung mét

®−êng SET/RESET. Víi mçi thanh ghi b¹n cã thÓ ®Æt tÝn hiÖu

Set/Reset nµy nh− tÝn hiÖu Set ®ång bé, Reset ®ång bé, Preset kh«ng

®ång bé hoÆc mét tÝn hiÖu xo¸ (Clear) kh«ng ®ång bé.

- Trong mét sè c¸c chuÈn I/O yªu cÇu ®iÖn ¸p Vcco hoÆc Vref,

c¸c ®iÖn ¸p nµy chóng ®−îc nèi tíi c¸c ch©n cña thiÕt bÞ khi thiÕt kÕ,

c¸c ch©n nµy chóng t¹o thµnh tõng nhãm cña c¸c khèi vµo ra vµ

chóng ®−îc gäi lµ Bank.

- ChÝnh v× vËy, sù h¹n chÕ vÒ c¸c chuÈn vµo cña mét thiÕt bÞ sÏ

do c¸c Bank quyÕt ®Þnh. T¸m Bank vµo ra ®−îc t¸ch theo mçi c¹nh

cña FPGA vµ ®−îc chia thµnh hai Bank chÝnh (h×nh 1.11). Mçi Bank

cã nhiÒu ch©n ®iªn ¸p Vcco vµ tÊt c¶ chóng ®Òu ®−îc nèi tíi cïng

mét ®−êng ®iÖn ¸p. §iÖn ¸p nµy ®−îc x¸c ®Þnh bëi c¸c chuÈn ®Çu ra

ng−êi dïng.

Page 35: Giao trinh fpga

35

H×nh 1.11. C¸c Bank chuÈn vµo ra I/O cña Spartan -IIE

- Mét sè chuÈn ®Çu vµo mong muèn mét ®iÖn ¸p ng−ìng nµo ®ã

mµ nã ®−îc cung cÊp bëi ng−êi dïng ch¼ng h¹n nh− Vref. Tr−êng

hîp nµy, c¸c ch©n I/O ng−êi dïng ®−îc x¾p ®Æt tù ®éng nh− c¸c ®Çu

vµo cho ®iÖn ¸p lÊy mÉu Vref. Kho¶ng mét trong 6 c¸c ch©n vµo ra

cña c¸c Bank ®ãng vai trß nµy.

- C¸c ch©n Vref trong mét bank ®−îc nèi bªn trong vµ v× vËy

chØ mét ®iÖn ¸p Vref cã thÓ ®−îc sö dông trong mçi bank .TÊt c¶ c¸c

ch©n Vref trong c¸c bank cÇn ph¶i ®−îc nèi víi nguån ®iÖn ¸p bªn

ngoµi ®Ó chóng ho¹t ®éng ®óng.

§Ó cã sù trao ®æi nhanh gi÷a c¸c tÝn hiÖu, c¸c ch©n tÝn hiÖu ®Çu

vµo cÇn ph¶i ®−îc cung cÊp tr−íc khi nguån cÊp vµo ch©n Vccint vµ

ch©n Vcco vµ ph¶i ®¶m b¶o kh«ng cã ®−êng dÉn dßng ng−îc tõ c¸c

ch©n I/O quay vÒ ®iÖn ¸p nguån cung cÊp Vccint vµ Vcco (Cã nghÜa

lµ ®¶m b¶o cho thiÕt bÞ cã thÓ ho¹t ®éng ë mét ®iÖn ¸p vµ giao tiÕp ë

mét ®iÖn ¸p, hai ®iÖn ¸p nµy cã thÓ kh¸c nhau ).

Configurable Logic Blok vµ Logic Cell:

Page 36: Giao trinh fpga

36

- C¸c ®¬n vÞ c¬ b¶n cña CLB (Khèi logÝc cho phÐp ®Þnh cÊu

h×nh) thuéc hä thiÕt bÞ Spartan-IIE chÝnh lµ c¸c Logic Cell ( LC -

Xem h×nh 1.5 vµ h×nh 1.6 môc 1.1 ch−¬ng I ). Mçi mét Logic Cell

bao gåm mét bé t¹o chøc n¨ng (Hay bé t¹o hµm) gåm 4 ®Çu vµo,

phÇn tö logic nhí vµ phÇn tö l−u tr÷ (Flip-Flop lo¹i D).

- §Çu ra cña bé t¹o chøc n¨ng cña mçi Logic Cell ®iÒu khiÓn c¶

®Çu ra CLB hoÆc ®Çu vµo D cña Flip-Flop.

- Mçi mét CLB cã chøa bèn Logic Cell vµ ®−îc tæ chøc thµnh

hai Slice t−¬ng tù nhau, mét slice ®¬n cã d¹ng nh− (h×nh 1.12).

- Thªm vµo bèn bé LC c¬ b¶n, c¸c CLB cña Spartan-IIE cã chøa

phÇn tö logic mµ nã kÕt hîp víi c¸c bé t¹o chøc n¨ng ®Ó ®−a ra c¸c

chøc n¨ng 5 hoÆc 6 ®Çu vµo .

Look-Up tables (LUT):

- C¸c bé t¹o chøc n¨ng cña Spartan -IIE thùc hiÖn nh− LUT cã

bèn ®Çu vµo. §Ó ho¹t ®éng nh− mét bé t¹o chøc n¨ng, mçi mét LUT

cã thÓ cung cÊp mét RAM 16x1bit ®ång bé.

- H¬n n÷a hai LUT trong mét Slice cã thÓ ®−îc kÕt hîp ®Ó t¹o

mét RAM 16x2 bit hoÆc 32x1 bit ®ång bé .

Storage Element:

Page 37: Giao trinh fpga

37

H×nh 1.12 .CÊu tróc Logic Cell hay mét Slice ®¬n trong Spartan

-IIE

- C¸c phÇn tö l−u tr÷ trong slice cña Spartan-IIE cã thÓ ®−îc

xem nh− mét Flip-Flop lo¹i D kÝch ho¹t b»ng s−ên, hoÆc nh− mét bé

chèt nh¹y møc. C¸c ®Çu vµo D cã thÓ ®−îc ®iÒu khiÓn hoÆc bëi bé

t¹o chøc n¨ng trong slice hoÆc trùc tiÕp tõ ®Çu vµo c¸c slice (bá qua

bé t¹o chøc n¨ng). Thªm vµo c¸c ®−êng Clock (CLK) vµ Clock

Enable (CE) (h×nh 1.12), mçi Slice cã c¸c tÝn hiÖu set vµ reset ®ång

bé (SR vµ BY). §−êng SR Ðp c¸c phÇn tö l−u tr÷ vÒ tr¹ng th¸i khëi

t¹o, ®Æc biÖt trong tr−êng hîp nhåi cÊu h×nh. §−êng BY Ðp phÇn tö

Page 38: Giao trinh fpga

38

l−u tr÷ vÒ tr¹ng th¸i ng−îc l¹i. Cã thÓ lùa chän hai ®−êng nµy ®Ó

chóng ho¹t ®éng kh«ng ®ång bé.

TÊt c¶ c¸c tÝn hiÖu ®iÒu khiÓn cã thÓ ®¶o ng−îc mét c¸ch hoµn

toµn ®éc lËp vµ chóng ®−îc chia sÎ bëi hai Flip-Flop trong mét

Slice.

Arithmetic Logic: Bé dån kªnh F5IN ë trong mçi Slice ®−îc

kÕt hîp víi c¸c ®Çu ra bé t¹o chøc n¨ng ®−îc chØ ra ë h×nh 1.13.

H×nh 1.13. Bé dån kªnh F5 vµ F6

Sù kÕt hîp nµy sÏ ®−a ra hoÆc mét bé t¹o hµm mµ nã cã thÓ thùc

thi bÊt kú 5 ®Çu vµo chøc n¨ng nµo, hoÆc mét bé dån kªnh 4:1 hoÆc

c¸c chøc n¨ng ®−îc chän lùa cña chÝn ®Çu vµo. T−¬ng tù, bé dån

kªnh F6 kÕt hîp c¸c ®Çu ra cña bèn bé t¹o chøc n¨ng trong CLB

b»ng viÖc chän mét trong hai ®Çu ra cña bé dån kªnh F5. §iÒu nµy

cho phÐp thùc thi bÊt kú mét hµm 6 ®Çu vµo nµo, mét bé dån kªnh

8:1, hoÆc chøc n¨ng ®−îc chän lùa lªn ®Õn 19 ®Çu vµo.

Block RAM: Hä Spartan-IIE FPGA hîp nhÊt mét vµi bé nhí

Page 39: Giao trinh fpga

39

RAM theo khèi thµnh khèi lín h¬n (gäi lµ SelectRAM +), cã nghÜa

lµ cÇn ph¶i bæ xung thªm c¸c LUT RAM ®· ®−îc dïng. KiÕn tróc

bé nhí kh«ng bÒn v÷ng nµy ®−îc thùc hiÖn trong c¸c CLB. C¸c khèi

bé nhí RAM Block chóng ®−îc tæ chøc theo c¸c cét . HÇu hÕt hä

Spartan -IIE cã chøa hai cét nh− nhau, mçi mét cét ®−îc bè trÝ däc

theo chiÒu ®øng . Hä XC2S400E cã bèn cét RAM khèi, mçi cét nµy

®−îc kÐo dµi hÕt chiÒu cao cña chip. Mçi mét khèi nhí chÝnh gåm

bèn CLB cao vµ v× vËy mçi Spartan-IIE cã 8 CLB cao sÏ chøa hai

khèi nhí trªn mçi cét vµ tæng céng cã bèn khèi .

Delay - locked loop (DLL): §−îc kÕt hîp víi mçi bé ®Öm ®Çu

vµo clock toµn côc vµ lµ mét vßng kho¸ ®é gi÷ chËm sè DLL mµ nã

lo¹i trõ ®−îc sù lÖch gi÷a bé ®Öm ®Çu vµo clock vµ c¸c ch©n ®Çu vµo

clock bªn trong thiÕt bÞ. Bé DLL gi¸m s¸t toµn bé clock ®Çu vµo vµ

clock ®−îc ph©n phèi, tù ®éng ®iÒu chØnh phÇn tö gi÷ chËm clock.

H¬n n÷a ®é gi÷ chËm ®−îc hiÓu lµ s−ên cña clock ®−a tíi Flip-Flop

bªn trong, víi ®é chÝnh x¸c trong mét chu kú ®ång hå sau khi chóng

®−îc ®−a ®Õn ®Çu vµo. Chu tr×nh kÝn nµy lo¹i trõ ¶nh h−ëng ®é gi÷

chËm do ph©n phèi clock b»ng viÖc ®¶m b¶o c¸c s−ên cña clock ®−a

®Õn c¸c flip-flop bªn trong ®ång bé víi c¸c s−ên clock ®Õn t¹i c¸c

ch©n vµo. §Ó lo¹i trõ sù gi÷ chËm do ph©n chia clock, DLL ®−a ra

tÝn hiÖu ®iÒu khiÓn hiÖu chØnh c¸c kho¶ng clock kh¸c nhau. DLL

cung cÊp c¸c pha vu«ng 900 cña clock nguån mµ cã thÓ nh©n ®«i,

hoÆc chia bëi c¸c hÖ sè 1.5 , 2, 2.5 , 3, 4 , 5 , 8 hoÆc 16 ( Xem h×nh

d−íi ).

Page 40: Giao trinh fpga

40

H×nh 1.14. Vßng gi÷ chËm DLL

H×nh 1.15. C¸c ®Æc tÝnh ®Çu ra cña DLL

1.3.2. CÊu tróc cña CoolRunner -XPLA3 CPLD

CÊu tróc cña XPLA3 mang nÐt ®Æc tr−ng cña mét thanh ghi ë

®Çu vµo, nhiÒu thµnh phÇn clock, lËp tr×nh qua JTAG, c¸c ®−êng vµo

ra dao ®éng 5V vµ bao gåm mét cÊu tróc PLA (Programmable Logic

Array) ®Çy ®ñ. Víi sù ph©n phèi logic linh ho¹t cïng víi c¸c ®Æc

Page 41: Giao trinh fpga

41

tÝnh më réng nµy ®· ®−a ra tèc ®é cao gÊp ®«i, kÕt qu¶ lµ nã t¹o ra

kh¶ n¨ng thay ®æi thiÕt kÕ mµ kh«ng cÇn thay ®æi c¸c ch©n ®Çu ra.

CÊu tróc cña nã bao gåm mét tËp hîp 48 tÝch sè nh©n mµ cã thÓ

ph©n phèi tíi bÊt kú Macrocell nµo trong khèi logic. Sù kÕt hîp nµy

cho phÐp c¸c phÐp tÝnh logic ®−îc ph©n phèi hiÖu qu¶ trªn toµn khèi

logic vµ hç trî nhiÒu tÝch sè nh©n cÇn thiÕt trªn mçi Macrocell. CÊu

tróc tæng qu¸t cña mét CPLD ®−îc ®−a ra h×nh 1.16,1.17.

H×nh 1.16. CÊu tróc tæng qu¸t møc cao cña XPLA3 - CPLD

H×nh 1.17 CÊu tróc khèi cña CoolRunner XPLA3 CPLD

Page 42: Giao trinh fpga

42

H×nh 1.18. CÊu tróc chøc n¨ng cña CoolRunner XPLA3

H×nh 1.16 chØ ra s¬ ®å khèi ë møc cao cña mét thiÕt bÞ 128

macrocell thùc hiÖn cÊu tróc XPLA3. CÊu tróc XPLA3 bao gåm c¸c

khèi chøc n¨ng (Function Block) hay khèi logic ®−îc nèi liÒn víi

nhau th«ng qua ma trËn nèi nguån kh«ng (ZIA). Thùc chÊt ZIA lµ

mét chuyÓn m¹ch ®iÓm ®−îc ®Þnh tuyÕn. Mçi khèi chøc n¨ng cã 36

®Çu vµo tõ khèi ZIA vµ 16 Macrocell (MC). Víi hä XPLA3 duy

nhÊt chØ lµ sù ph©n chia logic n»m bªn trong mçi khèi chøc n¨ng vµ

kü thuËt thiÕt kÕ ®−îc sö dông ®Ó thùc hiÖn c¸c khèi chøc n¨ng nµy.

Theo h×nh 1.18 ta thÊy mçi khèi chøc n¨ng cã chøa mét ma

trËn PLA, mµ nã t¹o ra c¸c ®−êng ®iÒu khiÓn, ®−êng clock vµ c¸c

logic cell dïng cho viÖc sö dông c¸c clock kh«ng ®ång bé, reset,

preset vµ Output Enable (Cho phÐp ®Çu ra). Mét PLA rÊt kh¸c mét

PAL (Programmable Array Logic), v× vËy mµ PLA cã mét ma trËn

Page 43: Giao trinh fpga

43

c¸c cæng AND cho phÐp lËp tr×nh hoµn toµn th«ng qua lËp tr×nh c¸c

cæng OR . Mét ma trËn PAL bÞ cè ®Þnh bëi ma trËn c¸c cæng OR (

xem h×nh 1.1 vµ 1.2 Môc 1.1), ma trËn PLA nhËn c¸c ®Çu vµo cña

nã trùc tiÕp tõ ZIA. Cã 36 cÆp ®Çu vµo vµ c¸c ®Çu vµo bæ xung tõ

ZIA, c¸c ®Çu vµo nµy ®−îc cung cÊp tíi 48 tÝch sè nh©n trong ma

trËn. Bèn t¸m ®−êng tÝch sè nh©n nµy, th× trong ®ã cã 8 ®−êng ®iÒu

khiÓn côc bé (LCT [0:7]) ®−îc phÐp sö dông nh− c¸c tÝn hiÖu ®iÒu

khiÓn tíi mçi Macrocell (MC) dïng khi sö dông c¸c clock kh«ng

®ång bé, reset, preset vµ cho phÐp ®Çu ra (OE) Output Enable.

NÕu kh«ng dïng 8 ®−êng ®iÒu khiÓn nµy th× chóng ®−îc nhËp

víi 40 tÝch sè nh©n cßn l¹i ®Ó t¹o nguån logic. Trong mçi khèi chøc

n¨ng cã 8 ®−êng ph¶n håi NAND ®−îc dïng ®Ó tæng hîp vµ t¨ng

mËt ®é logic, hç trî c¸c hµm logic lín h¬n.

§Æc tÝnh nµy cã thÓ ®−îc phÐp hoÆc kh«ng cã thÓ do phÇn mÒm

ng−êi sö dông qui ®Þnh. Cïng víi c¸c tÝch sè nh©n, ®−êng ®iÒu

khiÓn vµ c¸c ®−êng ph¶n håi kh«ng ®−îc sö dông ®Õn, c¸c ®−êng

nµy chóng l¹i cã thÓ gép l¹i vµ ®−îc dïng nh− mét nguån tµi nguyªn

logic. NÕu cã lín h¬n mét phÐp tÝnh logic nh©n, hÖ sè ®¬n t¹i mçi

MC th× 47 tÝch sè nh©n n÷a sÏ ®−îc gép l¹i tr−íc ®Ó t¹o ra VFM (

Variable Function Multiplexer - Bé chän kªnh chøc n¨ng biÕn ®æi ).

Bé VFM t¨ng sù tèi −u ho¸ logic b»ng viÖc thùc hiÖn mét vµi

chøc n¨ng logic ®Çu vµo tr−íc khi ®i vµo Macrocell xem h×nh 1.19.

Page 44: Giao trinh fpga

44

H×nh 1.19 CÊu tróc cña mét MacroCell

H×nh 1.20. Bé dån kªnh chøc n¨ng VFM

CÊu tróc MacroCell:

H×nh 1.20 chØ ra cÊu tróc cña MacroCell (MC) ®−îc sö dông

trong CoolRunner XPLA3, bÊt cø mét MC nµo ®Òu cã thÓ reset hoÆc

Page 45: Giao trinh fpga

45

preset khi bËt nguån.

Mçi thanh ghi cña MC cã thÓ ®−îc xem nh− mét flip-flop kiÓu

D, T hoÆc kiÓu chèt hoÆc bá qua nÕu MC ®−îc coi lµ mét hµm logic

tæ hîp. Mçi flip - flop nµy cã thÓ nhËn ®−êng Clk tõ bÊt kú mét

trong 8 nguån clock hoÆc phÇn bæ xung cña chóng (h×nh 1.20).

Cã hai ®−êng Clk ®ång bé toµn côc mµ chóng ®−îc lÊy tõ 4

ch©n clk bªn ngoµi. T¹i ®©y cã mét ®−êng CLK chung vµ c¸c tÝn

hiÖu ®Çu vµo CT [4:7] (Local Control Terms). Cã hai ®−êng ph¶n

håi tíi khèi ZIA th«ng qua bé Mux, mét bé Mux sÏ chän hoÆc ®Çu

ra cña VFM hoÆc tõ ®Çu ra cña thanh ghi, mét bé Mux cßn l¹i sÏ

chän hoÆc lµ tõ ®Çu ra cña thanh ghi hoÆc tõ ®−êng dÉn I/O cña MC.

Khi c¸c ch©n I/O ®−îc sö dông nh− mét ®Çu ra, bé ®Öm ®Çu ra

®−îc phÐp chän vµ ®−êng ph¶n håi MC cã thÓ ®−îc sö dông lµm

®−êng bæ xung logic trong MC. Khi ch©n I/O ®−îc sö dông lµm ®Çu

vµo th× c¸c ch©n ®Çu ra sÏ lµ ba tr¹ng th¸i vµ tÝn hiÖu ®Çu vµo sÏ

®−îc ®−a ®Õn ZIA th«ng qua ®−êng ph¶n håi I/O. C¸c phÐp Logic

bï mµ ®−îc thùc hiÖn trong MC cã thÓ ®−a ®Õn ZIA th«ng qua

®−êng ph¶n håi cña MC. NÕu mét ch©n cña MC ®−îc ®Æt nh− mét

®Çu vµo, th× t¹i ®ã cã mét ®−êng dÉn trùc tiÕp tíi thanh ghi ®Ó t¹o

thêi gian thiÕt lËp ®Çu vµo nhanh. NÕu MC ®−îc x¾p ®Æt lµ mét bé

chèt th× ®Çu vµo clock cña thanh ghi sÏ t¹o chøc n¨ng cho phÐp chèt

vµ chèt ch¾c ch¾n nhÊt khi tÝn hiÖu nµy lµ cao. §−êng Clock ®−îc

nèi cøng sÏ kh«ng ®−îc sö dông khi mµ MC ®−îc thùc hiÖn nh− mét

bé chèt .

I/O Cell :

Page 46: Giao trinh fpga

46

H×nh 1.21. CÊu tróc I/O Cell

§−êng OE cña bé chän kªnh cã t¸m kh¶ n¨ng x¶y ra ( Xem

b¶ng gi¶i m· ®−îc chØ ra trong h×nh trªn ). Khi c¸c I/O cell ®−îc ®Æt

nh− mét ®Çu vµo (hoÆc ®Çu ra ba tr¹ng th¸i), ®−êng OE nµy kÐo ®Çu

vµo lªn cao (th«ng qua mét bé treo ë møc yÕu) nÕu ®Çu vµo bÞ th¶

næi vµ v−ît ng−ìng. §iÒu nµy nh»m t¹o ra sù b¶o vÖ ®Çu vµo v−ît

khái vïng mµ vïng nµy chÝnh lµ nguyªn nh©n g©y ra viÖc tiªu thô

nguån lín. Chøc n¨ng nh− cña bé treo ë møc yÕu cã thÓ thùc hiÖn

b»ng phÇn mÒm, ch¼ng h¹n nh− nã sÏ lu«n lu«n ®−îc bËt khi I/O

cell ®−îc xem nh− mét ®Çu vµo. §iÒu nµy sÏ lµm bé treo tù ®éng bËt

khi mét ch©n kh«ng ®−îc sö dông trong thiÕt kÕ. C¸c I/O cell lµ 5v

(hoÆc 3.3 V) khi mµ thiÕt bÞ ®−îc cÊp nguån . Mçi ®Çu ra cã mét bé

®iÒu khiÓn tèc ®é ®éc lËp ( Nhanh hoÆc chËm - cho phÐp ®Æt trong

phÇn mÒm), ®iÒu nµy sÏ gióp lµm gi¶m sù ph¸t ra nhiÔu ®iÖn tõ

tr−êng. L−u ý r»ng mét I/O cña MC khi ®· sö dông mét phÐp logÝc

®−îc thùc hiÖn bªn trong nã th× nã kh«ng cã ch©n I/O ®−îc sö dông

Page 47: Giao trinh fpga

47

cho ®Çu vµo mµ nã coi ch©n ®ã kh«ng ®−îc sö dông vµ c¸c ®iÖn trë

treo sÏ ®−îc nèi. Cã thÓ nãi r»ng, tÊt c¶ c¸c ch©n cña XPLA3 kh«ng

®−îc sö dông th× kh«ng ®−îc nèi. C¸c ch©n ®Çu vµo mµ ®−îc sö

dông cho mét môc ®Ých riªng nµo ®ã (CLKx/INx) th× kh«ng cã ®iÖn

trë treo, v× vËy c¸c ch©n ®Çu vµo nµy cÇn cã ®Çu cuèi ë phÝa ngoµi .

Nh− tÊt c¶ hä CMOS kh«ng cho phÐp c¸c ch©n ®Çu vµo th¶ næi .

Timing Model : " Khu«n mÉu x¸c ®Þnh thêi gian ", cÊu tróc nµy

cho phÐp khu«n mÉu thêi gian tiÒn ®Þnh trong thiÕt kÕ vµ thiÕt kÕ l¹i

.

H×nh 1.22. C¸c khu«n mÉu thêi gian trong CoolRunner XPLA3

Cã ba khu«n mÉu thêi gian chÝnh lµ TPD, TSU, TCO. Trong c¸c cÊu

tróc kh¸c ta cã thÓ ®−a thiÕt kÕ vµo trong CPLD nh−ng kh«ng ®¶m

b¶o ®−îc yªu cÇu vÒ thêi gian cña hÖ thèng cã ®¹t ®−îc hay kh«ng

vµ cã tho¶ m·n hay kh«ng cho ®Õn khi thiÕt kÕ ®ã ®−îc dÞch vµ n¹p

vµo trong thiÕt bÞ . ChÝnh v× vËy khu«n mÉu x¸c ®Þnh thêi gian cña

c¸c cÊu tróc kh¸c rÊt phøc t¹p vµ rÊt nhiÒu thø cÇn quan t©m, ch¼ng

h¹n nh− sù phô thuéc cña thêi gian vµo sè bé më réng song song

Page 48: Giao trinh fpga

48

m−în, sè bé më réng chia sÎ, sù thay ®æi sè kªnh ®Þnh tuyÕn X , Y...

Trong XPLA3 cã thÓ biÕt tr−íc thiÕt kÕ cã phï hîp víi yªu cÇu

thêi gian cña hÖ thèng hay kh«ng v× nã cã khu«n mÉu x¾p xÕp thêi

gian chuÈn.

1.4. Quy tr×nh thiÕt kÕ c¬ b¶n

* C¸c b−íc thiÕt kÕ:

Víi tÝnh n¨ng cña c¸c s¶n phÈm ®−a ra cu¶ Xilinx, phÇn mÒm

ISE (Integrated software Environment) ®· lµm cho viÖc thiÕt kÕ dÔ

dµng h¬n víi logic lËp tr×nh ®−îc. C¸c thiÕt kÕ cã thÓ ®−îc m« t¶

mét c¸ch dÔ dµng vµ nhanh chãng b»ng viÖc sö dông ng«n ng÷ m«

t¶ ALBEL, VHDL, VerilogTM, hoÆc víi mét ®ãng gãi tõ c¸c s¬ ®å

nguyªn lý. ViÖc lÊy thiÕt kÕ tõ s¬ ®å nguyªn lý chÝnh lµ ph−¬ng

ph¸p truyÒn thèng mµ nh÷ng ng−êi thiÕt kÕ sö dông ®Ó Ên ®Þnh

m¶ng c¸c cæng vµ c¸c thiÕt bÞ logic lËp tr×nh ®−îc. Nã lµ c«ng cô ®å

ho¹ vµ cho phÐp Ên ®Þnh chÝnh x¸c c¸c cæng ®−îc yªu cÇu vµ c¸ch

nèi chóng nh− thÕ nµo.

D−íi ®©y lµ bèn b−íc c¬ b¶n cña mét thiÕt kÕ sö dông tõ s¬ ®å

nguyªn lý :

1. Sau khi lùa chän c«ng cô ®Ó t¹o s¬ ®å nguyªn lý vµ th− viÖn

c¸c thiÕt bÞ, b¾t ®Çu x©y dùng m¹ch b»ng viÖc t¶i c¸c cæng mong

muèn tõ th− viÖn ®· ®−îc chän. Cã thÓ sö dông bÊt kú mét tæ hîp

cæng cÇn thiÕt nµo. Lóc nµy cÇn ph¶i chän mét th− viÖn hä c¸c thiÕt

bÞ ph©n phèi râ rµng, nh−ng cã thÓ kh«ng cÇn ph¶i biÕt thiÕt bÞ nµo

trong hä ®ã. VÒ c¬ b¶n, chØ sö dông víi sù quan t©m vÒ ®ãng gãi vµ

Page 49: Giao trinh fpga

49

tèc ®é cña chóng lµ ®ñ.

2. Nèi c¸c cæng l¹i víi nhau b»ng viÖc sö dông c¸c m¹ng vµ d©y

nèi. Hoµn tÊt viÖc ®iÒu khiÓn nèi c¸c cæng theo bÊt cø cÊu h×nh nµo

mµ cÇn cho øng dông .

3. §−a thªm vµ ®Æt tªn cho c¸c bé ®Öm ®Çu vµo vµ ®Çu ra , c¸c

nh·n nµy sÏ chØ râ c¸c ch©n trong ®ãng gãi vµo ra cña thiÕt bÞ .

4. T¹o danh s¸ch c¸c m¹ng c¸c ®−êng nèi cña m¹ch.

H×nh 1.23 d−íi ®©y m« t¶ luång thiÕt kÕ víi c¸c PLDs .

H×nh 1.23. C¸c b−íc thiÕt kÕ mét PLD theo s¬ ®å nguyªn lý

Mét danh s¸ch m¹ng kÕt nèi ( Netlist ) lµ mét file d¹ng text m«

t¶ kÕt nèi cña mét m¹ch. Nã ®−îc t¹o ra bëi c¸c c«ng cô thiÕt kÕ,

ch¼ng h¹n nh− ch−¬ng tr×nh lÊy s¬ ®å nguyªn lý ECS. Netslist lµ

mét file c« ®äng, ng¾n gän ®Ó c¸c ch−¬ng tr×nh kh¸c cã thÓ hiÓu

®−îc cæng nµo ®−îc nèi trong m¹ch vµ chóng ®−îc nèi víi nhau nh−

thÕ nµo, c¸c tªn cña ch©n vµo ra lµ g×. Trong mét vÝ dô d−íi ®©y,

Page 50: Giao trinh fpga

50

Netlist ph¶n ¸nh mét có ph¸p thùc tÕ cña mét m¹ch theo d¹ng s¬ ®å.

§ã lµ mét ®−êng nèi cho mçi linh kiÖn vµ mét ®−êng cho mét trong

c¸c m¹ng d©y nèi. L−u ý r»ng ch−¬ng tr×nh m¸y tÝnh sÏ g¸n c¸c tªn

cho mçi linh kiÖn ( G1 ®Õn G4 ) vµ c¸c ®−êng nèi N1 ®Õn N8, h×nh

1.24 . Khi thùc thi thiÕt kÕ nµy, nã sÏ ®ãng gãi c¸c ch©n ®Çu vµo lµ

A, B, C, D vµ c¸c ch©n ®Çu ra lµ Q, R, S. EDIF ( Electronic Data

Interchange Format-§Þnh d¹ng trao ®æi d÷ liÖu ®iÖn tö ) theo chuÈn

c«ng nghiÖp cho viÖc Ên ®Þnh c¸c thiÕt kÕ logic ë d¹ng text vµ mét

d¹ng kh¸c n÷a lµ XNF ( Xilinx Netlist Format - §Þnh d¹ng Netlist

cña Xilinx). Gi¶ sö b¹n cã trong tay mét Netlist, nh− vËy b¹n ®· cã

tÊt c¶ nh÷ng g× b¹n cÇn ®Ó x¸c ®Þnh c¸i mµ m¹ch cña b¹n ®Þnh thiÕt

kÕ.

H×nh 1.24. Netlist cña mét thiÕt kÕ

VÝ dô trªn ®©y lµ mét vÝ dô ®¬n gi¶n vµ râ rµng. Nh− chóng ta

®· thÊy, thö m« t¶ mét thiÕt kÕ thùc tÕ víi 10.000 cæng. Mét trang

s¬ ®å nguyªn lý cã chøa kho¶ng 200 cæng, v× vËy nã sÏ cÇn 50 trang

Page 51: Giao trinh fpga

51

s¬ ®å ®Ó t¹o ra mét thiÕt kÕ 10.000 cæng. Mçi mét trang cÇn thùc

hiÖn theo tÊt c¶ c¸c b−íc kÓ trªn. §iÒu nµy sÏ tiªu tèn rÊt nhiÒu thêi

gian, ®Æc biÖt nÕu muèn t¹o mét thiÕt kÕ cã 20.000 hoÆc 50.000 vµ

cã thÓ c¸c thiÕt kÕ lín h¬n n÷a. B¹n thö h×nh dung sÏ tiªu tèn bao

nhiªu thêi gian nÕu b¹n t¹o mét th− viÖn ph©n phèi linh kiÖn vµ nÕu

cÇn söa ®æi chóng. Cã mét c¸ch tèt h¬n ®Ó thùc hiÖn ®iÒu nµy vµ nã

®−îc gäi lµ thiÕt kÕ ë møc cao (HLD-High Level Design), ho¹t ®éng

(Behavioral) cña thiÕt kÕ, hoÆc lµ ng«n ng÷ m« t¶ phÇn cøng

(HDL).ý t−ëng dïng ng«n ng÷ bËc cao ®Ó m« t¶ m¹ch ë d¹ng file

v¨n b¶n nµy hay h¬n viÖc m« t¶ c¸c cæng ë d¹ng ®å ho¹ rÊt nhiÒu.

ThuËt ng÷ ho¹t ®éng (Behavioral) ë ®©y ®−îc dïng bëi v× ë trong

ng«n ng÷ bËc cao chóng ta cã thÓ m« t¶ hµm hoÆc ph¶n øng cña

m¹ch b»ng lêi h¬n lµ ®−a ra h×nh vÏ cña c¸c cæng t−¬ng øng mµ nã

cÇn ®−îc t¹o trong øng dông. Cã hai ng«n ng÷ chÝnh trong ng«n ng÷

HDL ®ã lµ : VHDL vµ Verilog. XÐt mét vÝ dô kh¸c, h·y thiÕt kÕ mét

bé nh©n 16x16 víi m« t¶ b»ng file HDL vµ ch−¬ng tr×nh t¹o tõ s¬ ®å

nguyªn lý ECS. Víi mét bé nh©n, th«ng th−êng lµ mét sù x¾p ®Æt rÊt

phøc t¹p cña c¸c bé céng, c¸c thanh ghi vµ mét sè c¸c cæng. VÝ dô

cña chóng ta cÇn hai ®Çu vµo 16 bit ( §Çu vµo A vµ B ) vµ mét ®Çu

ra bé nh©n 32 bit ( Y= AxB ) nh− vËy tæng céng cã 64 ®−êng vµo ra

vµ t−¬ng ®−¬ng víi kho¶ng gÇn 6000 cæng.Trong viÖc thùc hiÖn

b»ng s¬ ®å nguyªn lý, sè cæng yªu cÇu cÇn ph¶i ®−îc t¶i vµo, ®Æt

trong trang thiÕt kÕ m¹ch vµ cÇn ph¶i ®−îc nèi víi nhau, céng thªm

c¸c bé ®Öm vµo ra. C«ng viÖc nµy chiÕm mÊt kho¶ng ba ngµy. Khi

Page 52: Giao trinh fpga

52

thùc hiÖn b»ng HDL, mÊt kho¶ng 8 dßng text vµ cã thÓ hoµn thµnh

trong ba phót. File Netlist ®−îc t¹o ra vµ nã cã chøa tÊt c¶ c¸c th«ng

tin cÇn thiÕt cña mét bé nh©n 16x16.

H×nh 1.25. C¸c th«ng sè cña mét thiÕt kÕ bé nh©n

* KiÓm tra thiÕt kÕ : C¸c thiÕt kÕ logic lËp tr×nh, ®−îc kiÓm tra

b»ng viÖc sö dông mét bé m« pháng mµ thùc chÊt nã lµ mét ch−¬ng

tr×nh phÇn mÒm, ch−¬ng tr×nh nµy x¸c nhËn tÊt c¶ c¸c chøc n¨ng

hoÆc thêi gian ho¹t ®éng cu¶ mét m¹ch. C¸c ®Þnh d¹ng c«ng nghiÖp

tiªu chuÈn ®−îc sö dông ®Ó ®¶m b¶o mét ®iÒu r»ng c¸c thiÕt kÕ cã

thÓ ®−îc t¸i sö dông. NÕu nh− cã sù thay ®æi th− viÖn cña nhµ ph©n

phèi th× thiÕt kÕ ®ã chØ cÇn biªn dÞch l¹i qu¸ tr×nh tæng hîp nÕu lµ

cÇn thiÕt. Lâi IP (Lâi së h÷u trÝ tuÖ ) th−êng cho phÐp ë khu«n d¹ng

HDL, chóng rÊt dÔ thay ®æi vµ sö dông víi nhµ ph©n phèi thiÕt bÞ

kh¸c nhau. Sau khi hoµn tÊt c¸c chi tiÕt cña mét thiÕt kÕ, ®iÒu cÇn

ph¶i biÕt lµ liÖu m¹ch thùc tÕ cã ho¹t ®éng ®óng nh− môc ®Ých cña

thiÕt kÕ kh«ng. ChÝnh c©u hái nµy ®· tr¶ lêi cho môc ®Ých cña viÖc

Page 53: Giao trinh fpga

53

kiÓm tra thiÕt kÕ.

Bé m« pháng sÏ m« pháng thiÕt kÕ, v× vËy cÇn ph¶i cung cÊp

®Çy ®ñ th«ng tin cña thiÕt kÕ (Th«ng qua file Netlist sau khi sö dông

ch−¬ng tr×nh ECS hoÆc th«ng qua qu¸ tr×nh tæng hîp b»ng phÇn

mÒm ) vµ c¸c mÉu ®Çu vµo cô thÓ, hoÆc th«ng qua c¸c vÐc t¬ kiÓm

tra. Bé m« pháng sÏ lÊy th«ng tin tõ ®ã ®Ó x¸c ®Þnh c¸c ®Çu ra cña

m¹ch. Xem h×nh sau:

H×nh 1.26. Qu¸ tr×nh thiÕt kÕ mét PLD

M« t¶ tãm t¾t:

Page 54: Giao trinh fpga

54

- M« pháng chøc n¨ng : T¹i giai ®o¹n nµy, sù pháng chøc n¨ng

chØ kiÓm tra nh÷ng tæ hîp ®óng cña kh«ng vµ mét mµ m¹ch nguyªn

lý ®−a ra. Ng−êi thiÕt kÕ sÏ ®−a ra chØ dÉn sù m« pháng vÒ thêi gian

ngay sau ®ã theo c¸c b−íc trong luång thiÕt kÕ nµy. NÕu nh− cã

chøc n¨ng nµo kh«ng ®óng, cÇn ph¶i quay l¹i s¬ ®å nguyªn lý hoÆc

file HDL (Xem h×nh 1.26) vµ söa ®æi l¹i, t¹o l¹i file Netlist vµ sau

®ã cho ch¹y l¹i bé m« pháng. Nh÷ng ng−êi thiÕt kÕ th−êng mÊt

kho¶ng 50% thêi gian vµo viÖc söa ®æi ®Ó ®i qua b−íc nµy cho ®Õn

khi thiÕt kÕ ®¹t theo yªu cÇu mong muèn . ViÖc sö dông file HDL cã

rÊt nhiÒu thuËn lîi khi kiÓm tra thiÕt kÕ : Ng−êi thiÕt kÕ cã thÓ m«

pháng trùc tiÕp tõ file nguån HDL, ®iÒu nµy cho phÐp bá qua thêi

gian tiªu tèn trong qu¸ tr×nh tæng hîp mµ thêi gian nµy th−êng ®−îc

yªu cÇu mçi khi thay ®æi thiÕt kÕ. Mét thiÕt kÕ khi ®· lµm viÖc ®óng,

ch¹y c«ng cô tæng hîp ®Ó t¹o ra file Netlist cho c¸c b−íc tiÕp theo

trong qu¸ tr×nh thiÕt kÕ .

- Thùc thi trªn thiÕt bÞ : Mét file Netlist cu¶ thiÕt kÕ m« t¶ hoµn

toµn ®Çy ®ñ mét thiÕt kÕ mµ thiÕt kÕ nµy sö dông th− viÖn c¸c cæng

cña nhµ ph©n phèi cña mét hä thiÕt bÞ nµo ®ã vµ Ýt nhÊt nã còng ®·

®i qua b−íc kiÓm tra. §· ®Õn lóc ®−a file nµy vµo trong mét chip vµ

®iÒu nµy ®−îc xem nh− sù thùc hiÖn trªn thiÕt bÞ.

Biªn dÞch bao sÏ gåm nhiÒu ch−¬ng tr×nh sÏ ®−îc sñ dông, c¸c

ch−¬ng tr×nh nµy nhËp file Netlist cña thiÕt kÕ ®· ®−îc dÞch vµ dïng

nã ®Ó bè trÝ, x¾p xÕp c¸c cæng logic. C¸c ch−¬ng tr×nh nµy sÏ kh¸c

nhau víi c¸c nhµ ph©n phèi th− viÖn kh¸c nhau.

C¸c ch−¬ng tr×nh tham gia vµo qu¸ tr×nh biªn dÞch bao gåm:

Page 55: Giao trinh fpga

55

Ch−¬ng tr×nh tèi −u ho¸, dÞch c¸c phÇn tö cña thiÕt bÞ vËt lý, kiÓm

tra c¸c qui luËt thiÕt kÕ víi thiÕt bÞ cô thÓ nµo (xem nã cã v−ît qua

sè bé ®Öm Clock cho phÐp ë trong thiÕt bÞ nµy kh«ng ?... ).

Trong suèt giai ®o¹n thiÕt kÕ, ng−êi thiÕt kÕ sÏ ®−îc hái ®Ó chän

thiÕt bÞ ®Ých, ®ãng gãi, cÊp ®é vµ c¸c chän lùa kh¸c ®èi víi thiÕt bÞ

®−îc Ên ®Þnh . Th«ng th−êng qu¸ tr×nh biªn dÞch kÕt thóc víi mét

b¸o c¸o kÕt qu¶ bao hµm toµn bé c¸c ch−¬ng tr×nh ®· ®−îc thùc

hiÖn. Thªm vµo c¸c c¶nh b¸o lçi, ë d¹ng b¶n kª cña thiÕt bÞ vµ viÖc

sö sông c¸c ®−êng vµo ra. ChÝnh ®iÒu nµy gióp ng−êi thiÕt kÕ lùa

chän ®−îc thiÕt bÞ ®Ých tèt nhÊt.

- L¾p ®Æt trªn thiÕt bÞ: §èi víi hä CPLD th× b−íc nµy ®−îc gäi

lµ l¾p ®Æt, cã nghÜa lµ ®−a thiÕt kÕ vµo trong thiÕt bÞ ®Ých (§iÒu

chØnh cho phï hîp víi nguån tµi nguyªn cña thiÕt bÞ ®Ých). Trong

h×nh vÏ 1.26 ë trªn, cã mét phÇn cña thiÕt kÕ ®−îc gäi lµ l¾p ®Æt vµo

trong CPLD. C¸c CPLD cã cÊu tróc cè ®Þnh , v× thÕ nªn phÇn mÒm

cÇn lÊy c¸c cæng vµ c¸c ®−êng nèi phï hîp víi m¹ch thiÕt kÕ. C«ng

viÖc nµy th−êng ®−îc phÇn mÒm xö lý rÊt nhanh b»ng phÇn mÒm.

Mét vÊn ®Ò kh¸c n÷a cã kh¶ n¨ng x¶y ra lµ viÖc g¸n vÞ trÝ cña c¸c

ch©n vµo ra (Th−êng ®−îc gäi lµ sù kho¸ ch©n I/O) cã thÓ ®· bÞ thùc

hiÖn tr−íc. Th−êng th× ®iÒu nµy hay x¶y ra khi dïng l¹i mét thiÕt kÕ

mµ thiÕt kÕ nµy ®−îc thõa h−ëng, hoÆc thiÕt kÕ nµy ®· ®−îc n¹p vµo

board m¹ch in cña thiÕt kÕ nµo ®ã.

C¸c cÊu tróc mµ nã cung cÊp viÖc kho¸ c¸c ch©n vµo ra (ch¼ng

h¹n nh− XC 9500, CoolRunner CPLDs ) cã sù thuËn tiÖn rÊt lín .

Chóng cho phÐp gi÷ l¹i c¸c ch©n vµo ra gèc, bÊt kÓ thiÕt kÕ thay ®æi

Page 56: Giao trinh fpga

56

hay cã sù tËn dông nµo ®ã, hoÆc cã sù thùc hiÖn theo yªu cÇu nµo

®ã. Sù kho¸ ch©n rÊt quan träng khi sö dông ISP (In system

Programmable Device - Cho phÐp lËp tr×nh trong hÖ thèng), nÕu

m¹ch in ®· vÏ vµ nèi víi c¸c ch©n vµo ra, sau ®ã thiÕt kÕ bÞ thay ®æi

vµ n¹p l¹i ch−¬ng tr×nh, b¹n h·y yªn t©m lµ c¸c ch©n nµy vÉn ®−îc

gi÷ nguyªn .

- S¾p ®Æt vµ ®Þnh tuyÕn :

Víi hä FPGA, ch−¬ng tr×nh x¾p ®Æt vµ ®Þnh tuyÕn ®−îc ch¹y

sau khi biªn dÞch. X¾p ®Æt chÝnh lµ qu¸ tr×nh chän lùa c¸c module cô

thÓ hoÆc c¸c khèi logic ë trong FPGA n¬i mµ c¸c cæng cña thiÕt kÕ

sÏ n»m trong ®ã.

§Þnh tuyÕn nã mang ®óng ý nghÜa cña nã, chÝnh lµ viÖc nèi vËt

lý c¸c ®−êng nèi gi÷a c¸c khèi logic. HÇu hÕt c¸c nhµ ph©n phèi

cung cÊp c«ng cô tù ®éng s¾p ®Æt vµ ®Þnh tuyÕn, v× thÕ b¹n kh«ng

ph¶i lo l¾ng vÒ c¸c chi tiÕt khã hiÓu phøc t¹p cña cÊu tróc thiÕt bÞ.

Mét sè nhµ ph©n phèi ®−a ra c«ng cô cho phÐp b¹n s¾p ®Æt vµ

®Þnh tuyÕn b»ng tay nh÷ng phÇn then chèt nhÊt cña thiÕt kÕ, ®Ó cã

thÓ thu ®−îc sù thùc hiÖn tèt h¬n c«ng cô tù ®éng.

Bé t¹o s¬ ®å mÆt b»ng bè trÝ c¸c phÇn tö logic lµ mét kiÓu cña

c«ng cô sö dông b»ng tay.

Ch−¬ng tr×nh s¾p ®Æt vµ ®Þnh tuyÕn cÇn nhiÒu thêi gian nhÊt ®Ó

hoµn thiÖn thµnh c«ng mét thiÕt kÕ, bëi v× nã lµ c«ng viÖc rÊt phøc

t¹p ®Ó x¸c ®Þnh n¬i ®Æt nh÷ng thiÕt kÕ lín vµ ®¶m b¶o r»ng chóng

®−îc nèi víi nhau chÝnh x¸c vµ ®¸p øng ®−îc sù thùc hiÖn nh− mong

muèn.

Page 57: Giao trinh fpga

57

Tuy nhiªn c¸c ch−¬ng tr×nh nµy chØ cã thÓ lµm viÖc tèt nÕu cÊu

tróc cña thiÕt bÞ ®Ých cã sù ®Þnh tuyÕn phï hîp víi thiÕt kÕ.

B¹n kh«ng thÓ söa m· ch−¬ng tr×nh ®Ó bï mét cÊu tróc ®−îc

h×nh thµnh sai lÖch, ®Æc biÖt nÕu cÊu tróc cña thiÕt bÞ kh«ng ®ñ ®Ó

®Þnh tuyÕn c¸c ®−êng nèi. NÕu nh− gÆp ph¶i vÊn ®Ò nµy, th× gi¶i

ph¸p chung nhÊt lµ chän mét thiÕt bÞ ®Ých lín h¬n. Mét bé ph©n

tÝch thêi gian tÜnh th«ng th−êng lµ mét phÇn cña phÇn mÒm thùc thi

cña nhµ ph©n phèi. Nã cung cÊp th«ng tin vÒ thêi gian cña c¸c

®−êng dÉn trong thiÕt kÕ, th«ng tin nµy rÊt chÝnh x¸c vµ cã thÓ hiÓn

thÞ theo nhiÒu c¸ch kh¸c nhau. Ch¼ng h¹n nh− hiÓn thÞ tÊt c¶ c¸c

®−êng nèi vµ xÕp lo¹i chóng tõ ®é gi÷ chËm dµi nhÊt ®Õn ®é gi÷

chËm ng¾n nhÊt.

H¬n n÷a khi nµy b¹n cã thÓ sö dông th«ng tin x¾p ®Æt ®· ®−îc

chi tiÕt ho¸ sau khi ®Þnh d¹ng vµ quay trë vÒ bé m« pháng ®· ®−îc

chän víi c¸c th«ng tin chi tiÕt vÒ thêi gian.

Qóa tr×nh nµy ®−îc gäi lµ chó thÝch ng−îc (hay th«ng tin ph¶n

håi), nã cã sù thuËn lîi trong viÖc cung cÊp chÝnh x¸c thêi gian cña

sù thùc hiÖn c¸c sè kh«ng vµ c¸c sè mét trong thiÕt kÕ cu¶ b¹n.

Trong c¶ hai tr−êng hîp, thêi gian ph¶n ¸nh sù gi÷ chËm cña c¸c

khèi logic còng nh− c¸c ®−êng nèi.

B−íc thùc hiÖn cuèi cuèi cïng lµ t¶i hay n¹p cÊu h×nh xuèng

thiÕt bÞ.

- T¶i hay n¹p ch−¬ng tr×nh:

T¶i ch−¬ng tr×nh nh×n chung ®−îc xem nh− lµ t¶i th«ng tin

xuèng thiÕt bÞ dÔ biÕn ®æi nh− SRAM FPGA . §óng víi tªn gäi cña

Page 58: Giao trinh fpga

58

nã, b¹n t¶i th«ng tin cÊu h×nh thiÕt bÞ vµo trong bé nhí cña thiÕt bÞ.

Luång c¸c bit mµ nã ®−îc truyÒn ®i cã chøa tÊt c¶ c¸c th«ng tin

®Þnh nghÜa logic vµ c¸c ®−êng nèi cu¶ thiÕt kÕ, th«ng tin nµy sÏ lµ

kh¸c nhau ®èi víi thiÕt kÕ kh¸c nhau. Xem h×nh 1.27.

H×nh 1.27. Gi¶i thÝch ph©n biÖt n¹p ch−¬ng tr×nh vµ t¶i cÊu h×nh

Do v× c¸c thiÕt bÞ SRAM mÊt ®i cÊu h×nh khi mÊt nguån, v× thÕ

luång c¸c bit cÇn ph¶i cÊt ë ®©u ®ã ®Ó gi¶i quyÕt vÊn ®Ò nµy.

Mét n¬i th−êng ®−îc dïng ®Ó cÊt th«ng tin cÊu h×nh thiÕt bÞ, ®ã

lµ PROM nèi tiÕp. §©y lµ thµnh phÇn kÕt hîp víi phÇn cøng mµ nã

nèi tõ m¸y tÝnh tíi bo m¹ch mµ bo m¹ch nµy cã chøa thiÕt bÞ ®Ých.

N¹p ch−¬ng tr×nh ®−îc dïng cho ®Ó lËp ch−¬ng tr×nh cho tÊt c¶

c¸c thiÕt bÞ logic cã thÓ lËp tr×nh ®−îc kh«ng bÞ thay ®æi, ch¼ng h¹n

nh− PROM nèi tiÕp.

ViÖc n¹p ch−¬ng tr×nh thùc hiÖn chøc n¨ng gièng nh− t¶i

ch−¬ng tr×nh, riªng c¸c th«ng tin vÒ cÊu h×nh vÉn cßn sau khi mÊt

®iÖn.

Víi c¸c thiÕt bÞ mµ cã kiÓu kÕt nèi ng−îc víi mét cÇu tr× (kÕt

Page 59: Giao trinh fpga

59

nèi mét lÇn), th× viÖc n¹p ch−¬ng tr×nh chØ cã thÓ thùc hiÖn ®−îc mét

lÇn trªn thiÕt bÞ hay cã thÓ gäi theo thuËt ng÷ kh¸c : "Cho phÐp lËp

tr×nh mét lÇn ".

ViÖc n¹p ch−¬ng tr×nh ®èi víi c¸c CPLD cña Xilinx cã thÓ thùc

hiÖn trªn hÖ thèng th«ng qua c¸p JTAG hoÆc cïng víi bé n¹p

ch−¬ng tr×nh truyÒn thèng.

QuÐt biªn JTAG ®−îc hiÓu th«ng th−êng nh− mét chuÈn

IEEE/ANSI 1149.1-1190, nã lµ mét d·y c¸c qui luËt thiÕt kÕ mµ c¸c

qui luËt nµy dÔ kiÓm tra, dÔ n¹p ch−¬ng tr×nh cho thiÕt bÞ vµ gì rèi

trªn chip, trªn bo m¹ch ë møc hÖ thèng.

N¹p ch−¬ng tr×nh trªn hÖ thèng cã rÊt nhiÒu thuËn lîi, v× vËy

thiÕt bÞ cã thÓ ®−îc hµn trùc tiÕp trªn bo m¹ch in, vµ nÕu cã thay ®æi

thiÕt kÕ th× thiÕt bÞ kh«ng cÇn ph¶i th¸o khái m¹ch mµ vÉn lËp tr×nh

l¹i trªn hÖ thèng mét c¸ch ®¬n gi¶n .

Ch−¬ng II

Gi¶i ph¸p vμ tæ chøc phÇn mÒm ®¶m b¶o

2.1. Giíi thiÖu s¬ l−îc

ThiÕt kÕ logic lËp tr×nh ®−îc ®· ®−a ra kû nguyªn mµ trong ®ã

mËt ®é cña thiÕt bÞ ë ®¬n vÞ hµng triÖu cæng, sù thùc hiÖn cña hÖ

thèng ë tèc ®é hµng tr¨m MHz.

Xilinx ®· ®−a ra c¸c c«ng cô thiÕt kÕ ®iÖn tö hoµn toµn ®Çy ®ñ

mµ nã cho phÐp thùc hiÖn c¸c thiÕt kÕ trong hä PLD cña Xilinx.

C¸c gi¶i ph¸p ph¸t triÓn kÕt hîp víi c¸c kü thuËt m¹nh t¹o ra mét sù

linh ho¹t, mÒm dÎo, giao tiÕp ®å ho¹ dÔ sö dông gióp b¹n cã ®−îc

Page 60: Giao trinh fpga

60

c¸c thiÕt kÕ tèt nhÊt cã thÓ trong mét dù ¸n lín - mµ kh«ng cÇn quan

t©m ®Õn kinh nghiÖm cña b¹n. C«ng cô phÇn mÒm thiÕt kÕ ISE

(Integrated Sofware Enviroment- M«i tr−êng phÇn mÒm tÝch hîp) lµ

c«ng cô thiÕt kÕ tæng thÓ, bao hµm c¸c c«ng cô phÇn mÒm thiÕt kÕ

chuyªn dông kh¸c nhau vµ ®©y còng lµ c«ng cô ®−îc sö dông nhiÒu

nhÊt trong thiÕt kÕ c¸c PLD (Programmable Logic Device) cña

Xilinx.

2.2. C¸c c«ng cô thiÕt kÕ

PhÇn mÒm ISE c¶i thiÖn ®¸ng kÓ thêi gian ®−a mét s¶n phÈm ra

thÞ tr−êng bëi viÖc t¨ng tèc qu¸ tr×nh nhËp thiÕt kÕ. C¸c b−íc thùc

hiÖn mét thiÕt kÕ ®−îc cung cÊp trong phÇn mÒm ISE, ngoµi ra

chóng cßn ®−îc hç trî thªm bëi c¸c phÇn mÒm bæ sung kh¸c. §Ó

tiÖn cho viÖc n¾m b¾t vµ ph©n lo¹i c¸c lo¹i phÇn mÒm chóng ta sÏ ®i

m« t¶ phÇn nµy theo thø tù thùc hiÖn cña mét thiÕt kÕ .

2.2.1 NhËp thiÕt kÕ

C¸c c«ng cô hç trî c¸c ph−¬ng ph¸p phæ biÕn nhÊt ngµy nay ®Ó

viÖc t¹o ra mét thiÕt kÕ bao gåm : NhËp thiÕt kÕ b»ng s¬ ®å, b»ng

ng«n ng÷ HDL, b»ng viÖc tÝch hîp c¸c lâi IP, hç trî m¹nh mÏ viÖc

t¸i sö dông c¸c lâi IP. Sù ®a d¹ng cña viÖc nhËp mét thiÕt kÕ ®· ®−a

ra mét m«i tr−êng thiÕt kÕ dÔ sö dông nhÊt vµ cho phÐp víi tÊt c¶

c¸c thiÕt kÕ logic. Nã bao gåm c¸c c«ng cô thiÕt kÕ sau: Schematic

Editor, HDL Editor, State Diagram Editor, Core Generator ™

System, PACE (Pinout and Area Constraint Editor), Architecture

Wizard (DCM-Digital Clock Management, MGT- Multi_Gigabit

Page 61: Giao trinh fpga

61

Transceiver), Xilinx System Generator for DSP.

2.2.2. Tæng hîp thiÕt kÕ . ISE c¶i tiÕn bé m¸y tæng hîp HDL

®Ó ®−a ra kÕt qu¶ tèi −u ho¸ cho viÖc tæng hîp trªn c¸c PLD, ®©y lµ

mét trong c¸c b−íc c¬ b¶n nhÊt trong ph−¬ng ph¸p thiÕt kÕ. Nã lÊy

c¸c ®Þnh nghÜa cña thiÕt kÕ trªn HDL vµ t¹o ra sù m« t¶ vËt lý hoÆc

logic cho thiÕt bÞ silicon ®Ých.

Bé m¸y tæng hîp tiªn tiÕn ®−a ra mét kÕt qu¶ tèi −u ho¸ cao víi

mét thêi gian ®iÒu chØnh vµ thêi gian dÞch nhanh. §Ó phï hîp víi

yªu cÇu nµy, bé m¸y tæng hîp cÇn ph¶i ®−îc tÝch hîp chÆt chÏ víi

c«ng cô thùc hiÖn vËt lý, h¬n n÷a sù bá qua viÖc th¨m dß gi÷a th«ng

tin thiÕt kÕ vËt lý vµ m· thiÕt kÕ HDL ®· c¶i thiÖn ®−îc thêi gian

biÕn ®æi thiÕt kÕ.

PhÇn mÒm ISE ®−a ra mét sù tÝch hîp g¾n liÒn víi c¸c bé m¸y

tæng hîp chñ ®¹o nh− : Mentor Graphics Leonardo Spectrum,

Exempla, Synopsys vµ Synplicity Synplify/Pro, ABEL, XST ( Xilinx

Synthesis Technology ) .

2.2.3. Thùc thi vµ n¹p cÊu h×nh

ViÖc thùc hiÖn thiÕt kÕ logic lËp tr×nh ®−îc lµ g¸n c¸c chøc

n¨ng logic ®−îc t¹o trong suèt qu¸ tr×nh nhËp thiÕt kÕ vµ tæng hîp

chóng vµo trong tµi nguyªn vËt lý cô thÓ. ThuËt ng÷ " X¾p ®Æt vµ

®Þnh tuyÕn " ®−îc sö dông ®Ó m« t¶ qu¸ tr×nh thùc hiÖn cho FPGA,

cßn " L¾p ®Æt " ®−îc sö dông cho CPLD. Thùc thi chÝnh lµ n¹p cÊu

h×nh cho thiÕt bÞ, mµ sù thùc thi nµy chÝnh lµ t¹o vµ t¶i mét luång

c¸c bit ®−îc t¹o ra tõ th«ng tin x¾p ®Æt vµ ®Þnh tuyÕn vµo trong c¸c

Page 62: Giao trinh fpga

62

thiÕt bÞ ®Ých PLD. §Ó thùc hiÖn phÇn nµy cã c¸c c«ng cô hç trî sau:

FloorPlanner, Constraints Editor, Timing Driven Place & Route,

Modular Design, Timing Improvent Wizard .

2.2.4. TÝch hîp møc Board. PhÇn mÒm ISE ®−a ra sù hç trî

m¹nh mÏ ®Ó gióp ng−êi thiÕt kÕ ®¶m b¶o thiÕt kÕ logic lËp tr×nh lµm

viÖc trong mét hÖ thèng. Xilinx dù b¸o tr−íc ®−îc c¸c kÕt qu¶

chÝnh, ch¼ng h¹n nh− viÖc x¾p ®Æt mét board m¹ch phøc t¹p, tÝch

hîp c¸c tÝn hiÖu, giao tiÕp Bus tèc ®é cao, ®é réng d¶i th«ng vµo ra,

c¸c nhiÔu ®iÖn tõ cho ng−êi thiÕt kÕ møc hÖ thèng. §Ó cã thÓ dÔ

dµng thùc hiÖn c¸c b−íc nµy Xilinx ®· cung cÊp c¸c kü thuËt chñ

®¹o cho FPGA:

- XCITE ( Trë kh¸ng ®iÒu khiÓn ®−îc sè ).

- DCM Bé qu¶n lý ®ång hå sè cho thêi gian cña hÖ thèng .

- EMI Bé qu¶n lý nhiÔu ®iÖn tõ tr−êng .

- Th«ng tin ®ãng gãi cho sù tÝch hîp ë møc Board .

- KiÓm tra ë møc Board ISE.

Nã bao gåm c¸c phÇn mÒm sau:

- IBIS Models.

- STAMP Models.

- LMG Models.

- ChipScope™ ILA

2.2.5. C¸c kü thuËt kiÓm tra

PhÇn mÒm ISE ®−a ra viÖc kiÓm tra mµ nã hç trî trong tÊt c¶

c¸c giai ®o¹n cña thiÕt kÕ, tõ khi vµo thiÕt kÕ cho ®Õn khi tÝch hîp

Page 63: Giao trinh fpga

63

chóng trªn board.

* KiÓm tra tÜnh : C«ng cô kiÓm tra tÜnh cho phÐp ng−êi thiÕt kÕ

kiÓm tra thiÕt kÕ ngoµi yªu cÇu. ViÖc kiÓm tra cã thÓ thùc hiÖn ë mäi

khÝa c¹nh hoÆc kiÓm tra theo sù chän lùa, cho phÐp t×m lçi trong qu¸

tr×nh thùc thi. C«ng cô kiÓm tra tÜnh còng ®−a ra c¸c kh¶ n¨ng gì rèi

vµ ph©n tÝch m¹nh mÏ. C¸c c«ng cô kiÓm tra tÜnh :

- Constraint Editor

- Delay Calculator

- Trace

- Timing Analyzer

- Prime Time

- XPower

- Formality

- Conformal™ LEC

- DRC

- Chip Viewer

* KiÓm tra ®éng : Bao gåm c¸c c«ng cô sau

- HDL Bencher™

- ModelSim XE

- State Bench

- HDL Simulation Libraries

* KiÓm tra møc Board :

ViÖc sö dông c«ng cô kiÓm tra t¹i møc board nh»m ®Ó ®¶m b¶o

r»ng thiÕt kÕ thùc hiÖn ®óng theo dù ®Þnh vµ chóng ®−îc tÝch hîp

Page 64: Giao trinh fpga

64

víi phÇn cßn l¹i cña hÖ thèng. C¸c c«ng cô nµy bao gåm :

- IBIS Models

- Tau

- BLAST

- Stamp Models

- Impact

2.2.6 C«ng cô phÇn mÒm nhóng cho Virtex-II Pro FPGAs

C¸c tuú chän víi thiÕt kÕ n©ng cao cña phÇn mÒm ISE chÝnh lµ

nh»m t¹o ra c¸c thiÕt kÕ víi mËt ®é cao, dÔ dµng ®−îc g¾n kÕt c¸c

phÇn tö logic nhá nhÊt.

ThuËt ng÷ " C«ng cô phÇn mÒm nhóng " th«ng th−êng ®−îc øng

dông cho c¸c c«ng cô ®−îc yªu cÇu dïng ®Ó t¹o, so¹n th¶o, dÞch, t¶i

vµ gì rèi c¸c m· ng«n ng÷ bËc cao nh− C, C++ , ®−îc dïng ®Ó thùc

hiÖn trong mét bé m¸y xö lý nµo ®ã. Cã thÓ lÊy môc ®Ých cho c¸c

modul thiÕt kÕ víi Virtex-II Pro Platform FPGA, cã thÓ hoÆc lµ mét

chip phÇn cøng silicon hoÆc lµ c¸c øng dông phÇn mÒm, b¹n cã thÓ

ch¹y bé xö lý mét lâi cøng PowerPC ®−îc nhóng trong ®ã.

Khi nãi ®Õn sù ph¸t triÓn phÇn mÒm nhóng, Xilinx ®−a ra sù hç

trî ë rÊt nhiÒu møc. Xilinx hç trî c¸c bé vi xö lý nhóng trong

Virtex-II Pro Platform FPGA víi c¸c phiªn b¶n cña Xilinx, c¸c c«ng

cô nµy ®−îc dïng lµm mÉu cho c¸c øng dông thùc hiÖn cao vµ gi¸

thµnh thÊp.

Víi c¸c kü s− phÇn cøng, hä muèn ph¸t triÓn c¸c modul thiÕt kÕ

vµo trong phÇn mÒm vµ ch¹y trong lâi PowerPC, th× Virtex-II Pro lµ

Page 65: Giao trinh fpga

65

mét gi¶i ph¸p rÊt ®¬n gi¶n vµ chi phÝ thÊp cña Xilinx.

Víi c¸c kü s− phÇn mÒm, hä muèn cã m«i tr−êng víi c¸c ®Æc

tÝnh phong phó ®Ó cã thÓ ph¸t triÓn c¸c øng dông phøc t¹p h¬n,

Xilinx cung cÊp kh¶ n¨ng truy cËp c¸c c«ng cô tèt nhÊt dïng cho

môc ®Ých chuyªn dông ho¸ tõ c¸c nhµ dÉn ®Çu c«ng nghiÖp nhóng.

B¹n cã thÓ ®−a c¸c thiÕt kÕ mµ b¹n ®−îc thõa h−ëng (TËn dông l¹i)

mét c¸ch dÔ dµng vµo trong Virtex-II Pro Platform FPGA.

2.3. Lâi së h÷u trÝ tuÖ cña Xilinx ( IP_Core )

C¸c Website cña Xilinx cã mét c¬ së d÷ liÖu tæng hîp cña tÊt c¶

c¸c lâi logic (LogicCore) mµ c¸c lâi nµy ®· ®−îc kiÓm tra vµ ch¹y

thö . B¹n cã thÓ tham kh¶o t¹i trang Web cña trung t©m IP (

Intellectual Property ) www.Xilinx.com/ipcenter.

C«ng cô CORE Generator tõ Xilinx ®−a ra c¸c lâi logic ®−îc

tèi −u ho¸ cao, t−¬ng thÝch víi c¸c ph−¬ng ph¸p thiÕt kÕ tiªu chuÈn

cho Xilinx FPGA. C«ng cô nµy rÊt dÔ sö dông ®Ó t¹o ra c¸c lâi linh

ho¹t, thùc hiÖn cao víi mét møc ®é cho phÐp ®Þnh tr−íc.

2.4. Giíi thiÖu vμ lËp tr×nh øng dông trªn

phÇn mÒm WebPack ISE 6.2

2.4.1. Tæng quan ISE vµ c¸c c«ng cô tæng hîp

PhÇn mÒm thiÕt kÕ ISE cã kh¶ n¨ng ®−a thiÕt kÕ vµo trong c¸c

PLD (Programmable Logic Device) ®−îc chän lùa còng nh− c¸c

b−íc thùc hiÖn thiÕt kÕ −a dïng. Nh×n chung c¸c b−íc tiÕn hµnh

thiÕt kÕ cho FPGA vµ CPLD lµ gièng nhau, ng−êi thiÕt kÕ cã thÓ

nhËp vµo mét thiÕt kÕ d−íi d¹ng mét s¬ ®å hoÆc d¹ng HDL (VHDL,

Page 66: Giao trinh fpga

66

Verilog, hoÆc ABEL).

Mét thiÕt kÕ cã thÓ bao gåm c¶ d−íi d¹ng s¬ ®å vµ HDL. PhÇn

mÒm ISE ®−îc kÕt hîp víi bé m« pháng MXE ®−a ra kh¶ n¨ng m«

pháng vµ kiÓm tra chøc n¨ng cña VHDL. Bé m« pháng MXE ®−a ra

mét biÓu ®å kiÓm tra, nã cho phÐp ng−êi dïng ®−a ra c¸c mÉu thö

®Ó test c¸c chøc n¨ng trong qu¸ tr×nh tæng hîp (®−îc gäi lµ

TestBencher). Qu¸ tr×nh tæng hîp mét thiÕt kÕ ®−îc thùc hiÖn theo

luång c¸c b−íc nh− h×nh 2.1 d−íi ®©y.

H×nh 2.1. Luång thiÕt kÕ c¬ b¶n cña CPLD vµ FPGA

BiÓu ®å trªn chØ ra sù gièng nhau vµ kh¸c nhau cña c¸c b−íc

thùc hiÖn thiÕt kÕ mét FPGA vµ mét CPLD. Khi mét thiÕt kÕ hoµn

thµnh, kÕt qu¶ cã thÓ ®−îc m« pháng vµ t¶i xuèng thiÕt bÞ. §Ó cã

Page 67: Giao trinh fpga

67

mét c¸ch nh×n tæng quan vµ thùc hiÖn tiÕp cËn c¸c b−íc thiÕt kÕ mét

c¸ch nhanh nhÊt, trong môc nµy chØ ®−a ra mét kh¸i qu¸t s¬ l−îc c¬

b¶n nhÊt vµ c¸c môc tiÕp theo xin ®−îc tr×nh bµy mét vÝ dô cô thÓ vµ

c¸c b−íc tiÕn hµnh thiÕt kÕ trªn FPGA vµ CPLD.

Víi FPGA : Qu¸ tr×nh thùc hiÖn bao gåm bèn b−íc c¬ b¶n sau:

1. Translate - DÞch thiÕt kÕ vµ cho ch¹y kiÓm tra theo qui luËt

thiÕt kÕ .

2. Map - TÝnh to¸n vµ cÊp ph¸t tµi nguyªn trong thiÕt bÞ ®Ých.

3. Place and Route - X¾p ®Æt c¸c khèi logic, ®Þnh cÊu h×nh phï

hîp víi c¸c vÞ trÝ logic vµ sö dông c¸c tµi nguyªn ®Þnh tuyÕn .

4. Generate Programming File - t¹o ra dßng c¸c bit ch−¬ng tr×nh

(T¹o file.Bit).

Víi CPLD: Qu¸ tr×nh thùc hiÖn bao gåm ba b−íc c¬ b¶n sau :

1. Translate - DÞch thiÕt kÕ vµ cho ch¹y kiÓm tra theo qui luËt

thiÕt kÕ

2. Fit - CÊp ph¸t tµi nguyªn vµ kÕt nèi .

3. Generate Programming File : T¹o file JED cho ch−¬ng tr×nh .

C¸c c«ng cô phÇn mÒm tæng hîp thiÕt kÕ cña ISE :

* ViÖc nhËp thiÕt kÕ cã vµi c¸ch kh¸c nhau vµ c«ng cô ®Ó tæng

hîp thiÕt kÕ chÝnh lµ tæng hîp m· nguån ®−îc viÕt d−íi d¹ng

VHDL, Verilog, ABEL sang d¹ng file netlist. C¸c thiÕt kÕ d−íi d¹ng

s¬ ®å ®−îc chuyÓn ®æi sang m· nguån VHDL hoÆc Verilog mµ c¸c

m· nguån nµy ®−îc tæng hîp b»ng XST theo d¹ng th«ng th−êng.

* StateCAD lµ mét c«ng cô phÇn mÒm cho phÐp nhËp thiÕt kÕ

d−íi d¹ng ®å ho¹ theo nhãm c¸c tr¹ng th¸i, nhãm c¸c tr¹ng th¸i nµy

Page 68: Giao trinh fpga

68

sÏ ®−îc dÞch ra HDL vµ ®−îc ®Ýnh vµo trong phÇn mÒm ISE.

* Bé m« pháng MXE cã thÓ ®−îc sö dông cho viÖc m« pháng

c¶ vÒ thêi gian vµ chøc n¨ng .

* HDL Bencher : T¹o ra c¸c biÓu ®å kiÓm tra cho phÐp m«

pháng thiÕt kÕ ë d¹ng test.

* Implemention : C«ng cô thùc thi nµy cã mét vµi b−íc vµ sÏ

®−îc giíi thiÖu kü h¬n trong c¸c phÇn sau th«ng qua vÝ dô cô thÓ .

* iMPACT Programmer : Modul nµy cho phÐp n¹p ch−¬ng tr×nh

vµo thiÕt bÞ ®Ých ( Lóc nµy c¸p JTAG cÇn ph¶i ®−îc nèi víi cæng

song song cña m¸y tÝnh. )

* CHIP VIEWER : C«ng cô nµy ®−îc sö dông ®Ó kiÓm tra thiÕt

kÕ sau khi ®· thùc thi cÊu h×nh, chØ ra viÖc kÕt nèi gi÷a c¸c ch©n cña

thiÕt bÞ .

* Xpower : Cho phÐp tÝnh to¸n kh¶ n¨ng tiªu thô nguån cña

thiÕt kÕ khi ch¹y trong thiÕt bÞ ®Ých .

2.4.2 . ThiÕt kÕ vµ thùc hiÖn thiÕt kÕ trªn CPLD vµ FPGA

§Ó tiÕp cËn nhanh h¬n c¸c c«ng cô phÇn mÒm tæng hîp thiÕt kÕ,

ë ®©y chóng ta sÏ tiÕn hµnh thiÕt kÕ trªn mét vÝ dô cô thÓ. Trong

môc nµy xin giíi thiÖu mét vÝ dô chÝnh :

"ThiÕt kÕ bé ®iÒu khiÓn ®Ìn tÝn hiÖu giao th«ng thùc hiÖn trªn

CoolRunner-II CPLD vµ Spartan-3 FPGA"

2.4.2.1 ThiÕt kÕ trªn VHDL vµ StateCAD

1. NhËp thiÕt kÕ: Chän Start-> Program-> Xilinx ISE 6->

Project Navigator. Chän New Project trong menu File, ®Æt project lµ

Page 69: Giao trinh fpga

69

Traffic vµ ®Æt trong th− môc Traffic.

H×nh 2.2. Cöa sæ nhËp tªn Project

NhÊn nót Next cöa sæ sau sÏ xuÊt hiÖn, chän thiÕt bÞ vµ c¸c

property nh− h×nh d−íi . ë ®©y ta chän CoolRunner II CPLD -

xc2c256.

H×nh 2.3 Cöa sæ nhËp New Project

NhÊp next vµ chän New Source nh− cöa sæ sau. Chän VHDL

Page 70: Giao trinh fpga

70

modul vµ ®Æt tªn file lµ Counter .

H×nh 2.4. Cöa sæ chän m· so¹n th¶o ch−¬ng tr×nh

NhÊp chuét vµo nót Next vµ ®Æt c¸c cæng vµo ra nh− sau:

- clock : in

- reset : in

- count : inout [3 down to 0] -- Bé ®Õm 4 bit.

Sau ®ã nhÊp nót Next , Next , Finish .

Page 71: Giao trinh fpga

71

H×nh 2.5. Cöa sæ nhËp ®Çu vµo ra

Cöa sæ Project Navigator sÏ hiÖn ra nh− sau:

H×nh 2.6. Cöa sæ so¹n th¶o m· ch−¬ng tr×nh

NhÊp ®óp chuét vµo Counter.vhd trong cña sæ Sources in

Project b¹n sÏ ®−îc ch−¬ng tr×nh t¹o ra mét khung gåm c¸c tõ kho¸

trong cöa sæ Editor. B¹n cã thÓ sö dông c¸c mÉu ch−¬ng tr×nh cã s½n

trong th− viÖn cña Xilinx. MÉu nµy ®−îc gäi lµ " Language

Template". MÉu nµy lµ c«ng cô h÷u dông, nã trî gióp cho b¹n

trong khi viÕt code ch−¬ng tr×nh. Nã bao gåm c¸c modul chøc n¨ng

th«ng dông nh− bé ®Õm , bé chän kªnh, bé gi¶i m·, thanh ghi dÞch

... §Ó më c¸c modul mÉu b¹n kÝch chuét vµo menu Edit chän

Language Template, cöa sæ sau xuÊt hiÖn.

Page 72: Giao trinh fpga

72

H×nh 2.7. Cöa sæ lÊy c¸c mÉu modul chuÈn

Chän VHDL vµ kÝch chuét vµo dÊu céng cña dßng Synthesis

Template, chän modul counter, kÐo vµ th¶ chóng vµo gi÷a Begin vµ

End cña khung ch−¬ng tr×nh, sau ®ã tho¸t Language Template. Vµo

Edit chän Replate vµ thay clk b»ng clock . Xo¸ phÇn sau ®©y vµ chØ

®Ó l¹i ®o¹n code nh− h×nh 3.8.

if CE='1' then

if LOAD='1' then

COUNT <= DIN;

else

if DIR='1' then

COUNT <= COUNT + 1;

else

COUNT <= COUNT - 1;

end if;

Page 73: Giao trinh fpga

73

end if;

end if;

H×nh 2.8. Cöa sæ m· ch−¬ng tr×nh bé Counter

Nh− vËy trong ch−¬ng tr×nh sÏ gåm hai ®−êng vµo lµ clock vµ

reset, mét bus ®Çu ra count ra 4 bit (3 downto 0). Chøc n¨ng cña bé

®Õm nµy lµ ®Õm tiÕn khi cã mçi xung Clock ®Çu vµo d−¬ng. TÝn hiÖu

reset kh«ng ®ång bé vµ nã ®−îc xem xÐt tr−íc khi xung clock ho¹t

®éng. NhÊn nót save ®Ó ghi l¹i Project.

2. M« pháng chøc n¨ng cña bé ®Õm:

Tõ Project Menu chän New Source, chän Test Bench

Waveform vµ ®Æt tªn cho file nµy lµ counter_tb nh− h×nh d−íi.

Page 74: Giao trinh fpga

74

H×nh 2.9 Cöa sæ chän m· nguån so¹n th¶o

NhÊp nót Next, cöa sæ khëi t¹o timer hiÖn ra vµ chän nh− cöa sæ

d−íi ®©y, nhÊn ok, biÓu ®å kÝch thÝch hiÖn ra ®Ó chuÈn bÞ cho m«

pháng chøc n¨ng cña bé ®Õm.

H×nh 2.10. Cöa sæ khëi t¹o Clock

Page 75: Giao trinh fpga

75

H×nh 2.11. Cöa sæ khëi t¹o kÝch thÝch ®Çu vµo ra cho TestBench

ThiÕt lËp c¸c kÝch thÝch vµo ra nh− sau:

- §Æt ®−êng Reset ë chu kú thø nhÊt lªn 1

- §Æt ®−êng Reset ë chu kú thø hai xuèng 0

- KÝch chuét vµo « mÇu vµng cña COUNT[3:0] t¹i chu kú thø

nhÊt vµ kÝch vµo nót Pattern cöa sæ Pattern Wizard hiÖn ra nh−

sau :

Page 76: Giao trinh fpga

76

H×nh 2.12. Cöa sæ thiÕt lËp bé ®Õm

NhÊn nót OK , lóc nµy biÓu ®å sãng kÝch thÝch sÏ hiÖn ra :

H×nh 2.13. Cöa sæ khëi t¹o kÝch thÝch vµo ra cho TestBench

KÝch vµo Save ®Ó ghi l¹i biÓu ®å sãng. NÕu muèn thay ®æi b¹n

cã thÓ kÝch ®óp chuét vµo file counter_tb.tbw khi ®ã biÓu ®å sãng

sÏ hiÖn ra cho b¹n söa ®æi. B©y giê b¹n cho ch¹y thö biÓu ®å sãng

Page 77: Giao trinh fpga

77

cña bé ®Õm . Chän file counter_tb.tbw trong cña sæ Sources in

Project cña m«i tr−êng ISE, kÝch chuét ph¶i vµo Simulate

Behavioral VHDL Model chän Properties, trong tr−êng

Simulation Run Time gâ "-all" bÊm OK. Trong cöa sæ Processes

for Source kÝch ®óp chuét vµo dßng Simulate Behavioral VHDL

Model, d¹ng sãng cña bé ®Õm sÏ ®−îc hiÖn ra nh− sau:

H×nh 2.14. BiÓu ®å sãng ®Çu ra cña bé ®Õm

KÝch vµo nót Save ®Ó ghi l¹i d¹ng sãng d−íi d¹ng file ".do" kÝch

vµo nót Close ®Ó tho¸t ch−¬ng tr×nh.

3. Bé so¹n th¶o m¸y tr¹ng th¸i ( StateCAD )

Víi thiÕt kÕ bé ®iÒu khiÓn ®Ìn tÝn hiÖu giao th«ng, bé ®Õm ®ãng

vai trß nh− mét timer ®Ó x¸c ®Þnh thêi gian chuyÓn tr¹ng th¸i . M¸y

tr¹ng th¸i bao gåm bèn tr¹ng th¸i nh− sau:

- Tr¹ng th¸i mét : §Ìn ®á s¸ng (Red Light)

Page 78: Giao trinh fpga

78

- Tr¹ng th¸i hai : §Ìn ®á vµ ®Ìn vµng s¸ng ( Red and Amber

light )

- Tr¹ng th¸i ba : §Ìn xanh s¸ng ( Green Light )

- Tr¹ng th¸i thø t− : §Ìn vµng s¸ng ( Amber Light )

§Ó gäi bé so¹n th¶o nhãm tr¹ng th¸i, chän New Source tõ

Project Menu. Chän Modul State Diagram vµ ®Æt tªn file lµ

stat_mac.dia, kÝch nót Next sau ®ã nhÊn finish. Cöa sæ New Source

hiÖn ra nh− sau:

H×nh 2.15. Cöa sæ chän m· nguån so¹n th¶o

M«i tr−êng so¹n th¶o nhãm tr¹ng th¸i hiÖn ra nh− h×nh vÏ:

Page 79: Giao trinh fpga

79

H×nh 2.16. Cöa sæ so¹n th¶o m¸y tr¹ng th¸i

KÝch chuét vµo biÓu t−îng d−íi cã nh·n Draw State Machines,

sau ®ã cöa sæ State Machine Wizard hiÖn ra nh− h×nh 3.17.

H×nh 2.17. Cöa sæ t¹o nhãm c¸c tr¹ng th¸i m¸y

Page 80: Giao trinh fpga

80

Chän sè tr¹ng th¸i lµ 4, nhÊp nót Next sau ®ã chän chÕ ®é reset

lµ synchronous, nhÊp nót Next ®Ó vµo cöa sæ chuyÓn tr¹ng th¸i, ë

®©y trong hép chuyÓn tr¹ng th¸i ta gâ TIMER .

H×nh 2.18. Cöa sæ thiÕt lËp c¸c kÝch thÝch chuyÓn tr¹ng th¸i

KÝch chuét vµo nót Finish vµ vÏ c¸c nhãm tr¹ng th¸i trong trang

so¹n th¶o. Khi nhÊn nót finish mét khung vu«ng xuÊt hiÖn cïng víi

mòi tªn cña con chuét vµ b¹n chØ viÖc vÏ mét khung trªn nÒn so¹n

th¶o. Lóc nµy bèn tr¹ng th¸i xuÊt hiÖn vµ b©y giê ta ®i so¹n c¸c

tr¹ng th¸i . KÝch ®óp chuét vµo « Reset State 0 mÇu vµng vµ thay

®æi tªn cña tr¹ng th¸i nµy thµnh "RED", sau ®ã nhÊn vµo nót

"output Wizard".

Page 81: Giao trinh fpga

81

H×nh 2.19 Cöa sæ so¹n th¶o tr¹ng th¸i ®¬n

ThiÕt kÕ sÏ bao gåm ba ®Çu ra ®−îc ®Æt tªn lµ RD, AMB, GRN.

Trong tr−êng DOUT cña hép tho¹i d−íi ®©y ta gâ vµo RD ®Ó khai

b¸o ®Çu ra, ®Æt ®Çu ra nµy víi h»ng lµ "1" vµ chän lµ ®Çu ra cña

thanh ghi .

KÝch chuét vµo nót OK ®Ó quay vÒ hép tho¹i Edit State, lµm

t−¬ng tù víi ba tr¹ng th¸i cßn l¹i .

- §æi tªn State1 thµnh "REDAMB" vµ sö dông "Output

Wizard" thiÕt lËp RD =1 vµ mét ®Çu ra míi víi tªn lµ AMB =1 vµ

®Çu ra lµ mét thanh ghi.

- §æi tªn State 2 thµnh "GREEN" vµ sö dông "Output

Wizard" ®Ó thiÕt lËp mét ®Çu ra míi víi tªn lµ GRN =1 vµ ®Çu ra

còng chän lµ thanh ghi.

- §æi tªn State 3 thµnh "AMBER" vµ sö dông "Output

Wizard" ®Ó thiÕt lËp mét ®Çu ra AMBER =1, ®Çu ra còng chän lµ

thanh ghi.. Khi nµy nhãm tr¹ng th¸i ph¶i cã nh− h×nh 3.20:

Page 82: Giao trinh fpga

82

TIMER

TIMER

TIMERTIMER

RESET

GREEN

GRN = '1';

REDAMB

RD = '1';AMB = '1';

RED

RD = '1';

AMBER

AMB = '1';

H×nh 2.20. C¸c nhãm tr¹ng th¸i trong bé so¹n th¶o

StateMachine

KÝch ®óp chuét vµo ®−êng chuyÓn tr¹ng th¸i gi÷a tr¹ng th¸i

"RED" vµ "REDAMB", lóc nµy b¹n ph¶i thiÕt lËp bé Timer hiÖn ra

nh− cöa sæ h×nh 3.21, sau ®ã nhÊn OK .

Lµm t−¬ng tù nh− trªn víi ba ®−êng cßn l¹i:

- §−êng gi÷a REDAMB vµ GREEN , TIMER = "0100"

- §−êng gi÷a GREEN vµ AMBER , TIMER = "0011"

- §−êng gi÷a AMBER vµ RED , TIMER = "0000"

Page 83: Giao trinh fpga

83

H×nh 2.21. T¹o ®iÒu kiÖn kÝch thÝch ®Çu ra

Cuèi cïng b¹n ph¶i khai b¸o mét vector Timer bëi viÖc kÝch vµo

nót ë bªn tr¸i cña cöa sæ s¹n th¶o nhãm tr¹ng th¸i cã biÓu t−îng

.KÐo vµ th¶ vµo cöa sæ so¹n th¶o, kÝch ®óp vµo chóng vµ ®æi

tªn vector thµnh TIMER nh− cöa sæ sau.

H×nh 2.22. Cöa sæ t¹o vÐc t¬ chuyÓn tr¹ng th¸i

KÝch nót OK , khi nµy cöa sæ so¹n th¶o cña b¹n ph¶i cã h×nh

3.23.

Page 84: Giao trinh fpga

84

TIMER="0011" TIMER="0100"

TIMER="1111"TIMER="0000"

RESET

TIMER[3:0]

GREEN

GRN = '1';

REDAMB

RD = '1';AMB = '1';

RED

RD = '1';

AMBER

AMB = '1';

H×nh 2.23. C¸c nhãm tr¹ng th¸i sau khi so¹n th¶o xong

KÝch chuét vµo nót Generate HDL cã biÓu t−îng . Hép

tho¹i th«ng b¸o kÕt qu¶ sÏ xuÊt hiÖn, chó ý dßng ch÷ "Compiled

Perfectly" ®ãng hép tho¹i nµy, ghi vµ ®ãng ch−¬ng tr×nh so¹n th¶o

nhãm tr¹ng th¸i l¹i. Nhãm c¸c tr¹ng th¸i nµy b©y giê ®· ®−îc ®Ýnh

vµo ch−¬ng tr×nh ISE cña chóng ta. Quay l¹i ISE ta thÊy ch−¬ng

tr×nh ®Ìn giao th«ng bao gåm hai modul chÝnh lµ Counter.vhd vµ

Stat_mac.vhd .

Page 85: Giao trinh fpga

85

4. ThiÕt kÕ VHDL møc cao: Nh− vËy trong ch−¬ng tr×nh cña

chóng ta gåm hai modul chÝnh, b©y giê chóng ta ph¶i thÓ hiÖn hai

modul nµy trong mét líp trªn cïng mµ cã chøa hai modul nµy, hay

cßn ®−îc gäi lµ thÓ hiÖn chóng trong líp chÝnh-líp Top. Tõ Project

Menu chän New Source vµ ®Æt tªn cho chóng lµ top.vhd

Trong cöa sæ Source chän file counter.vhd, trong cöa sæ

Process nhÊp ®óp chuét vµo dßng View VHDL Instantiation

Template trong phÇn Design Entry Utilities. Copy phÇn sau vµ d¸n

vµo phÇn khai b¸o component vµ phÇn Instantiation cña file

top.vhd.

COMPONENT counter

PORT ( clock : IN std_logic;

reset : IN std_logic;

count : INOUT std_logic_vector(3 downto 0));

END COMPONENT;

Inst_counter: counter PORT MAP (clock => ,

Page 86: Giao trinh fpga

86

reset => ,

count => );

TiÕp tôc, thùc hiÖn t−¬ng tù trong cöa sæ Sources in Project

chän file stat_mac.vhd, trong cöa sæ Source nh¸y ®óp vµo View

VHDL Instantiation Template. Copy phÇn khai b¸o Component

vµ phÇn Instantiation d¸n vµo file top.vhd. Khai b¸o mét Signal

timer : std_logic_vector (3 downto 0) ë d−íi khai b¸o cÊu tróc . Sau

khi thùc hiÖn c¸c b−íc ta sÏ cã ch−¬ng tr×nh cña líp top nh− sau.

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity top is

Port ( clock : in std_logic;

reset : in std_logic;

red_light : out std_logic;

amber_light : out std_logic;

green_light : out std_logic);

end top;

architecture Behavioral of top is

signal timer : std_logic_vector (3 downto 0);

COMPONENT counter

PORT ( clock : IN std_logic;

reset : IN std_logic;

Page 87: Giao trinh fpga

87

count : INOUT std_logic_vector(3 downto 0));

END COMPONENT;

COMPONENT stat_mac

PORT (TIMER : IN std_logic_vector(3 downto 0);

CLK : IN std_logic;

RESET : IN std_logic;

AMB : OUT std_logic;

GRN : OUT std_logic;

RD : OUT std_logic);

END COMPONENT;

begin

Inst_counter: counter PORT MAP (

clock => clock,

reset => reset,

count => timer);

Inst_stat_mac: stat_mac PORT MAP (

TIMER => timer,

CLK => clock,

RESET => reset,

AMB => amber_light,

GRN => green_light,

RD => red_light);

end Behavioral;

Sau khi cã ®−îc ch−¬ng tr×nh nh− trªn b¹n nhÊp nót Save, lóc

Page 88: Giao trinh fpga

88

nµy trong cöa sæ Sources in Project sÏ tù ®éng x¾p xÕp theo thø tù.

Líp top.vhd lµ líp trªn cïng cã chøa hai modul con.

H×nh 2.24. Cöa sæ Source cña Project Traffic

B©y giê ta cã thÓ ®i m« pháng toµn bé thiÕt kÕ, chän file

top.vhd vµ trong menu Project chän New Source, ®Æt file m« pháng

lµ top_tb.tbw. Lóc nµy cÇn ph¶i cho c¸c kÝch thÝch ®Çu vµo cña

thiÕt kÕ. Víi ®−êng tÝn hiÖu vµo Reset, trong chu kú mét ®Æt lµ High,

tõ chu kú thø hai lµ low . KÐo ®−êng säc ®øng mµu xanh ®Õn chu kú

thø 64, hoÆc bÊm chuét ph¶i vµo ®−êng säc xanh ®ã vµ chän Set

End of Testbench. Ghi l¹i file testbench nµy víi tªn file lµ

top_tb.tbw, ®ãng cöa sæ so¹n th¶o biÓu ®å kiÓm tra l¹i. Trong cöa

sæ Sources in Project chän file top_tb.tbw. Trong cöa sæ

Processes for Source nh¸y ®óp vµo dßng Simulate Behavioral

VHDL Model lóc nµy ta thu ®−îc gi¶n ®å sãng cña thiÕt kÕ nh−

h×nh 3.25.

Page 89: Giao trinh fpga

89

H×nh 2.25. D¹ng sãng ®Çu ra cña Project Traffic

§Õn ®©y chóng ta cã thÓ b−íc sang phÇn thùc thi trªn thiÕt bÞ ,

xong ë ®©y xin giíi thiÖu mét ph−¬ng ph¸p kh¸c ®Ó cã thÓ thùc hiÖn

®−îc thiÕt kÕ nµy.

3.2.2 ThiÕt kÕ trªn S¬ ®å ( Schematic Design )

§«i khi ®Ó cho dÔ h×nh dung ®−îc thiÕt kÕ, ng−êi ta dïng

ph−¬ng ph¸p thiÕt kÕ trªn s¬ ®å. ë ®©y chóng ta x©y dùng thiÕt kÕ

theo s¬ ®å ë møc top, kÕt nèi c¸c khèi trong chóng vµ sö dông c«ng

cô ECS Schematic.

Gi¶ sö ta ®· x©y dùng ®−îc hai modul lµ counter.vhd vµ

stat_mac.vhd nh− h×nh 3.26.

Trong m«i tr−êng ISE chän menu Project, chän New Source vµ

®Æt tªn cho thiÕt kÕ líp ®Ønh lµ Top_SCH.

Page 90: Giao trinh fpga

90

H×nh 2.26. T¹o Project Traffic bëi Schematic

NhÊp nót NEXT , lóc nµy bé so¹n th¶o ECS xuÊt hiÖn nh− sau:

H×nh 2.27. Cöa sæ so¹n th¶o ECS

Quay trë l¹i víi m«i tr−êng ISE Project Navigator trong cöa sæ

Source chän file counter.vhd, trong cöa sæ Process, kÝch ®óp vµo

dßng Creat Schematic Symbol. Thùc hiÖn t−¬ng tù víi file

stat_mac.vhd, quay trë l¹i víi m«i tr−êng ECS ta sÏ thÊy hai biÓu

t−îng counter vµ stat_mac trong th− viÖn symbol.

Page 91: Giao trinh fpga

91

Trong cöa sæ th− viÖn nh¸y ®óp vµo counter vµ ®Æt trá chuét vµo

trong m«i tr−êng so¹n th¶o, lµm t−¬ng tù víi stat_mac ta sÏ thÊy hai

symbol thÓ hiÖn trong file top_sch nh− sau.

Chän c«ng cô Add Wire b»ng viÖc kÝch vµo biÓu t−îng ,

sau ®ã nèi hai ®−êng clock vµ reset cña hai khèi l¹i, ®−êng count nèi

víi ®−êng timer. Sau ®ã chän Add Net Name cã biÓu t−îng ch÷ abc

, lóc nµy « nhËp Net xuÊt hiÖn, ta gâ clock sau ®ã Ên Enter, ®Æt

vµo net clock, lµm t−¬ng tù víi c¸c net cßn l¹i .

H×nh 2.28. Project Traffic trong ECS

TiÕp theo ph¶i ®i ®Æt c¸c ®iÓm dÊu vµo ra. Tõ menu thanh c«ng

Page 92: Giao trinh fpga

92

cô chän Add I/O Marker, lóc nµy trong Tab Option sÏ hiÖn Add

an input, Add an output. NÕu Marker lµ ®Çu vµo th× ph¶i chän ë ®©y

lµ Add an input sau ®ã ®Æt vµo ®−êng clock vµ reset. Ghi l¹i vµ tho¸t

khái bé so¹n th¶o ECS. Quay trë l¹i Project Navigator ta thÊy

top_sch ®· ®−îc x¾p xÕp lªn trªn cïng. B©y giê b¹n cã thÓ nh×n thÊy

sù thÓ hiÖn cña top_sch d−íi d¹ng VHDL b»ng c¸ch chän file

top_sch trong cöa sæ Source sau ®ã chØ viÖc nh¸y ®óp vµo dßng

View VHDL Functional Model trong th− môc Design Entry

Utilities cña cöa sæ Processes. TiÕp tôc ®i m« pháng top_sch, lµm

t−¬ng tù nh− phÇn tr−íc ta còng thu ®−îc biÓu ®å xung nh− h×nh

3.25 .

2.4.3. Thùc thi trªn CPLD

2.4.3.1. Tæng hîp vµ thùc thi trªn CPLD

Sau khi ®· m« pháng thµnh c«ng thiÕt kÕ, qu¸ tr×nh tæng hîp sÏ

chuyÓn c¸c thiÕt kÕ d¹ng text sang file nestlist cã ®u«i ".NGC". File

nµy b¹n kh«ng thÓ ®äc ®−îc, v× ®©y lµ file m« t¶ m¹ch thùc tÕ vµ nã

®−îc thùc thi ë møc thÊp. Thêi ®iÓm thùc thi sÏ sö dông file Nestlist

vµ file r»ng buéc ng−êi dïng cã ®u«i ".ucf". B−íc ®Çu tiªn chóng ta

cÇn thùc hiÖn lµ dÞch thiÕt kÕ. B−íc nµy sÏ kiÓm tra thiÕt kÕ vµ ®¶m

b¶o r»ng Nestlist phï hîp víi cÊu tróc ®−îc chän, viÖc biªn dÞch

còng kiÓm tra file UCF xem cã chç nµo kh«ng phï hîp víi cÊu tróc

cña CPLD. Sau ®ã viÖc ghÐp nèi vµo thiÕt bÞ ®Ých ( Fitter) sÏ t¹o ra

file Jedec vµ n¹p ch−¬ng tr×nh vµo thiÕt bÞ ®Ých hoÆc board m¹ch

th«ng qua c¸p song song JTAG.Trong cöa sæ Source chän file

Page 93: Giao trinh fpga

93

top.vhd hoÆc chän top_sch, cßn trong cöa sæ Processes nh¸y ®óp

vµo Check Syntax. Qu¸ tr×nh tæng hîp sÏ tù nã nhËn ra hai modul

cã thø tù thÊp h¬n lµ file Counter.vhd vµ stat_mac.vhd .Sau khi thùc

hiÖn Check Syntax xong ph¶i ®¶m b¶o kh«ng cã lçi nµo xuÊt hiÖn

vµ ph¶i cã ch÷ V mÇu xanh bªn tr¸i dßng Synthesize-XST trong th−

môc cña Implement Design. Trong môc Synthesize-XST bÊm

chuét ph¶i vµ chän Properties, kiÓm tra môc Add I/O Buffer trong

tab Xilinx Specific Options cã ®−îc chän hay kh«ng, sau ®ã bÊm

OK. §Ó t¹o file ".UCF", cÇn ph¶i cã sù r»ng buéc vÒ ch©n vµ vÒ thêi

gian cña thiÕt bÞ ®Ých. Gi¶ sö clock dïng cho thiÕt bÞ ®Ých dïng trong

vÝ dô cña chóng ta lµ 100 MHz vµ c¸c ch©n ra ®−îc x¸c ®Þnh tr−íc

trong CoolRunner-II. Trong cöa sæ Source chän file top.vhd , trong

project chän New Source vµ ®Æt tªn file nµy lµ top_cosntraints.

Chän file nµy trong cöa sæ Source vµ trong cöa sæ Processes chän

Assign Package Pins.

H×nh 2.29 Chän vµ t¹o file .UCF

NhÊp ®óp dßng Assign Package Pins, lóc nµy cöa sæ g¸n ch©n

PACE sÏ hiÖn ra nh− sau. Ghi l¹i c«ng viÖc thùc hiÖn trªn PACE vµ

Page 94: Giao trinh fpga

94

EXIT.

H×nh 2.30 ThiÕt lËp c¸c ch©n vµo ra trong PACE

B©y giê ta cã thÓ xem l¹i viÖc g¸n ch©n d−íi d¹ng file text,

trong cöa sæ Source chän file top_cosntraints.ucf, trong cöa sæ

Processes kÝch ®óp chuét vµo dßng Edit Constraints sÏ thÊy cöa sæ

file nµy d−íi d¹ng text.

H×nh 2.31 T¹o file .UCF b»ng text

Tuy nhiªn cÇn ph¶i bæ xung thªm ®−êng tÝn hiÖu vµo tµi nguyªn

toµn côc. V× vËy bæ xung mét bé ®Öm clock BUFG . Gâ vµo cöa sæ

Page 95: Giao trinh fpga

95

text ë trªn dßng khai b¸o sau:

NET "clock" BUFG=CLK;

Ghi l¹i vµ tho¸t khái cöa sæ so¹n th¶o nµy. B−íc tiÕp theo lµ g¸n

sù r»ng buéc vÒ thêi gian. Chän file UCF trong cöa sæ Source, kÝch

®óp vµo dßng Create Timing Constraint trong cöa sæ Processes .

Cöa sæ so¹n th¶o g¸n sÏ hiÖn ra nh− h×nh 3.32.

H×nh 2.32 Cöa sæ g¸n r»ng buéc thêi gian vµ g¸n ch©n thiÕt bÞ

Nh− chóng ta thÊy ®−êng clock ®−îc bé so¹n th¶o g¸n nhËn ra

trong tr−êng Clock Net Name, bÊm chuét ph¶i vµo ch÷ clock trong

tr−êng nµy vµ chän Period, cöa sæ Clock Period xuÊt hiÖn. ThiÕt lËp

gi¸ trÞ thêi gian lµ 10nS , thêi gian cao lµ 50% , thêi gian thÊp lµ

50%.

ViÖc g¸n kho¶ng thêi gian ®· ®−îc ghi vµo file UCF mµ b¹n cã

thÓ nh×n thÊy ë cuèi b¶n kª trong cöa sæ g¸n. KÝch chuét vµo PORT

tab cña bé so¹n th¶o g¸n, b¹n sÏ thÊy c¸c ch©n ®−îc g¸n trong file

UCF ë b−íc thùc hiÖn tr−íc ®· ®−îc nhËp vµo trong cöa sæ so¹n

th¶o. Dïng phÝm Ctr ®Ó chän c¸c ®Çu ra, sau ®ã gâ vµo hép Group

Page 96: Giao trinh fpga

96

Name ch÷ lights.

Sau ®ã kÝch vµo nót Create Group, trong hép Select Group

chän lights vµ kÝch vµo nót Clock to Pad. Hép tho¹i sÏ hiÖn ra vµ

thiÕt lËp thêi gian theo yªu cÇu lµ 15nS, kÝch nót OK. Khi nµy viÖc

g¸n thêi gian ®· ®−îc g¸n vµo trong file UCF.

KÝch chuét vµo nót Save vµ tho¸t khái bé so¹n th¶o g¸n. Quay

l¹i víi m«i tr−êng ISE, nh×n trong cöa sæ Processes, b−íc tiÕp theo

lµ ph¶i cho ch−¬ng tr×nh hoµn thµnh viÖc thùc thi thiÕt kÕ, cã nghÜa

lµ ph¶i ®¶m b¶o cã ch÷ V mÇu xanh bªn tr¸i dßng Implement

Design. BÊm chuét ph¶i vµo dßng nµy vµ chän Properties, chän

môc Fitting. ë vÝ dô nµy chóng ta chän Output Voltage Standard

lµ LVCMOS18 (Tøc chuÈn vµo ra1,8V), nhÊn OK. Nh¸y ®óp chuét

vµo dßng Implement Design, lóc nµy toµn bé thiÕt kÕ cña chóng ta

sÏ ®−îc thùc thi trªn thiÕt bÞ ®Ých mµ kh«ng cã lçi.

H×nh 2.33. C¸c th«ng b¸o hoµn thµnh viÖc biªn dÞch trong cöa

sæ Process

Khi nµy bé ph©n tÝch thêi gian còng ®−îc tù ®éng thùc hiÖn vµ

ch−¬ng tr×nh ®−a ra c¸c th«ng b¸o cña Fitter vµ Timing. Lóc nµy b¹n

Page 97: Giao trinh fpga

97

cã thÓ xem c¸c th«ng b¸o vÒ lçi, vÒ logic, ®Çu vµo, ®Çu ra, danh s¸ch

c¸c ch©n...b»ng viÖc kÝch vµo c¸c dßng th«ng b¸o bªn tr¸i trong cét

Fitter Report.

H×nh 2.34. C¸c th«ng b¸o sau biªn dÞch cña CPLD

2.4.3.2. N¹p ch−¬ng tr×nh cho CPLD

Dïng c¸p Parallel - JTAG vµ bé n¹p ch−¬ng tr×nh iMPACT ®Ó

t¶i cÊu h×nh xuèng thiÕt bÞ. Chó ý J¾c nguån cña c¸p ph¶i ®−îc nèi.

Trong cöa sæ Source chän file top.vhd, nh¸y ®óp vµo dßng

Configure Device (iMPACT) trong cöa sæ Processes, cöa sæ bé n¹p

iMPACT hiÖn ra vµ thùc hiÖn n¹p ch−¬ng tr×nh.

2.4.4 Thùc thi trªn FPGA.

Sau khi m« pháng thµnh c«ng thiÕt kÕ, qu¸ tr×nh tæng hîp sÏ

chuyÓn ®æi thiÕt kÕ d−íi d¹ng VHDL sang file Nestlist cã ®u«i

'.NGC '. B−íc thùc thi sÏ lÊy file nµy vµ file r»ng buéc ng−êi dïng

®Ó t¹o l¹i thiÕt kÕ mµ nã sö dông c¸c tµi nguyªn cho phÐp trong

FPGA. Sau ®ã qu¸ tr×nh x¾p xÕp sÏ ph©n chia thiÕt kÕ víi c¸c tµi

nguyªn cho phÐp trong FPGA, nã sö dông file .UCF ®Ó qu¶n lý thêi

Page 98: Giao trinh fpga

98

gian ®−îc g¸n vµ quyÕt ®Þnh ®−a ra xem cã thÓ ®−a thªm hoÆc t¸i t¹o

l¹i c¸c ®¬n vÞ logic ®Ó phï hîp víi thêi gian ®−îc yªu cÇu. C¸c b−íc

thùc thi trªn FPGA gåm bèn b−íc c¬ b¶n sau ®©y:

- Tæng hîp thiÕt kÕ

- L¾p ®Æt

- M« pháng thêi gian

- N¹p ch−¬ng tr×nh

Trong môc nµy chóng ta sÏ tiÕp tôc ®i thùc thi vÝ dô bé ®iÒu

khiÓn ®Ìn tÝn hiÖu giao th«ng trªn Spartan-3 FPGA. Quay l¹i thiÕt kÕ

víi CPLD trong cöa sæ Sources cña Project Navigator nh¸y ®óp

vµo dßng xc2c256-7tq144-XST VHDL vµ chän c¸c th«ng sè cña

FPGA nh− h×nh sau.

ThiÕt kÕ nguyªn thuû cho CPLD b©y giê ®· trë thµnh Project

cho FPGA Spartan-3, c¸c ch÷ V mÇu xanh trong cöa sæ Processes

biÕn mÊt vµ thay vµo ®ã lµ nh÷ng dÊu hái chÊm mÇu vµng, hiÓn thÞ

thiÕt kÕ cÇn ph¶i ®−îc tæng hîp vµ thùc thi l¹i.

2.4.4.1. Tæng hîp thiÕt kÕ.

Trong thiÕt kÕ cña chóng ta c«ng cô tæng hîp sÏ nhËn ra file

Page 99: Giao trinh fpga

99

top.vhd gåm hai khèi cã møc thÊp h¬n lµ "counter" vµ

"stat_mac".Trong cöa sæ Processes kÝch chuét vµo dÊu "+" vµ chän

dßng Check Syntax, kÝch ®óp th× ch÷ V mÇu xanh ®−îc hiÓn thÞ,

bëi nã ®· ®−îc kiÓm tra trong phÇn thùc thi cña CPLD.

KÝch chuét ph¶i vµo dßng Synthesize vµ chän Properties vµo

tab cña HDL Option chän môc FSM Encoding Algorithm ®Æt lµ

one-hot. Trong tab cña Xilinx Specific Option ph¶i ®Ó môc Add

I/O Buffer ®−îc chän, kÝch nót OK. Trong cöa sæ Processes kÝch

®óp vµo dßng Synthesize vµ ®¶m b¶o r»ng cã ch÷ V mÇu xanh bªn

tr¸i ®−îc hiÖn lªn. V× ta ®Æt chÕ ®é one-hot nªn khi tæng hîp sÏ cã

th«ng b¸o c¸c tr¹ng th¸i ( red , amber, redamb, vµ green ) sÏ ®−îc

g¸n riªng thanh ghi mét bit.

Synthesizing Unit <SHELL_STAT_MAC>.

Related source file is D:/Traffic/Traffic/STAT_MAC.vhd.

Found 1-bit register for signal <RD>.

Found 1-bit register for signal <GRN>.

Found 1-bit register for signal <AMB>.

Found 1-bit register for signal <AMBER>.

Found 1-bit register for signal <GREEN>.

Found 1-bit register for signal <RED>.

Found 1-bit register for signal <REDAMB>.

2.4.4.2. File r»ng buéc ng−êi dïng (.UCF).

§Ó cã ®−îc sù thùc hiÖn cuèi cïng trªn thiÕt bÞ b¹n ph¶i ®−a ra

c«ng cô thùc thi thùc hiÖn c¸i g× vµ ë ®©u. Víi thiÕt kÕ nµy gi¶ sö

Page 100: Giao trinh fpga

100

®−îc thùc hiÖn víi clock cã tÇn sè lµ 100 MHz, vµ c¸c ch©n ra ®−îc

x¸c ®Þnh trªn FPGA. Trong môc nµy file top_constraints.ucf cÇn

ph¶i ®−îc g¸n c¸c ch©n míi, v× thiÕt kÕ cò dïng trong CPLD. Trong

cöa sæ Source chän file nµy, cßn trong cöa sæ Processes trong User

Constraints kÝch ®óp vµo dßng Edit Constraints. Söa ®æi vµ ghi

l¹i, ®ãng cöa sæ Constraints. KÝch ®óp vµo dßng Assign Package

Pins nh− h×nh d−íi.

Cöa sæ PACE sÏ ®−îc khëi t¹o, chän c¸c ch©n g¸n cho ®Çu vµo

vµ ra nh− sau:

H×nh 2.35. G¸n ch©n ng−êi dïng trong FPGA

Ghi l¹i vµ tho¸t khái cöa sæ PACE. KÝch ®óp vµo dßng Create

Timing Constraints trong cöa sæ processes, cöa sæ Constraints

Editor hiÖn ra, lóc nµy c¸c ch©n ®−îc g¸n trong PACE ®· ®−îc

Page 101: Giao trinh fpga

101

nhËp vµo trong cöa sæ nµy. Nh¸y ®óp vµo Period trong tab cña Port,

lóc nµy cöa sæ ®Þnh nghÜa chu kú clock hiÖn ra.

H×nh 2.36. Cöa sæ ®Þnh nghÜa Clock

§−a vµo chu kú lµ 10nS , kÝch chuét vµo nót OK.Trong tab cu¶

Port ta thÊy c¸c ®−êng vµo ra ®· ®−îc nhËp, dïng phÝm Ctr chän

c¸c ®Çu ra.Trong tr−êng Group Name nhËp vµo ch÷ lights, nhÊn

Create Group.Trong hép Select Group chän lights vµ nhÊn Clock

to Pad.

Page 102: Giao trinh fpga

102

Trong hép tho¹i Clock to Pad ®Æt Offset =15nS, kÝch nót OK.

Lóc nµy tr−êng Clock To Pad ®−îc ®iÒn tù ®éng vµo cöa sæ phÝa

d−íi cña Constraints Editor .

Ghi vµ ®ãng cöa sæ Constraints Editor. KÝch ®óp vµo

Implement Design trong cöa sæ Processes cña Project Navigator,

lóc nµy c¸c tÝch mÇu xanh hiÓn thÞ ë dßng Translate, Map, Place and

Route . ThiÕt kÕ ®· hoµn thµnh giai ®o¹n thùc thi.

Mçi mét giai ®o¹n thùc hiÖn ®Òu cã mét th«ng b¸o. Trong

Translate sÏ chØ ra th«ng b¸o vÒ lçi thiÕt kÕ vµ lçi rong file UCF,

Page 103: Giao trinh fpga

103

cßn trong Map sÏ ®−a ra th«ng b¸o vÒ sù x¸c nhËn tµi nguyªn ®−îc

sö dông trong FPGA....

2.4.4.3. T¶i cÊu h×nh xuèng FPGA.

KÝch chuét ph¶i vµo Generate Programming File vµ kÝch vµo

Properties trong tab Startup Options, ph¶i ®¶m b¶o r»ng clock

khëi ®éng ph¶i ®−îc ®Æt lµ JTAG Clock, nhÊn OK. KÝch ®óp vµo

Generate Programming File , thao t¸c nµy sÏ t¹o ra file ".bit" ®Ó

sö dông cho ch−¬ng tr×nh n¹p iMPACT. Më c«ng cô Generate

Programming File kÝch ®óp vµo Configure Device (iMPACT),

(Lóc nµy ph¶i ®¶m b¶o c¸p JTAG ®· ®−îc nèi víi PC ). NÕu nh− c¸c

th«ng sè trong thiÕt kÕ kh«ng ®−îc tù ®éng ®−a vµo tõ c«ng cô ISE

th× kÝch chuét ph¶i vµo cöa sæ cña iMPACT vµ chän Add Xilinx

Device, ®−a ®−êng dÉn cña thiÕt kÕ vµ chän file top.bit sau ®ã kÝch

vµo biÓu t−îng cña thiÕt bÞ .

Tõ Menu Operation chän Program, sau ®ã sÏ ®−îc th«ng b¸o

viÖc n¹p ®· thµnh c«ng. Tuy nhiªn víi Board Spartan-3 b¹n cÇn l−u

ý khi n¹p ch−¬ng tr×nh , v× trªn nã bao gåm mét Flash Rom nèi tiÕp

b¹n sÏ ®−îc ch−¬ng tr×nh hái mét sè c©u hái tr−íc khi n¹p.

Page 104: Giao trinh fpga

104

Ch−¬ng III

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

Page 105: Giao trinh fpga

105

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ö nµo ®ã cÇn dïng 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:

Page 106: Giao trinh fpga

106

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

Page 107: Giao trinh fpga

107

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 ;

Page 108: Giao trinh fpga

108

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:

Page 109: Giao trinh fpga

109

A B

COUT CIN

SUM

FULL_ADDER

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);

Page 110: Giao trinh fpga

110

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:

CINCOUT

SUM (0)SUM (1)SUM (2)SUM (3)

A (3) B (3) A (2) B (2) A (1) B (1) A (0) B (0)

FULL _ ADDER

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 ®ång thêi ).

Page 111: Giao trinh fpga

111

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}

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' ;

Page 112: Giao trinh fpga

112

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

Page 113: Giao trinh fpga

113

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:

X1

A1

L1

L2

SUM

CARRY

Page 114: Giao trinh fpga

114

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;

Page 115: Giao trinh fpga

115

ë 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

Page 116: Giao trinh fpga

116

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

Page 117: Giao trinh fpga

117

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

Page 118: Giao trinh fpga

118

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

Page 119: Giao trinh fpga

119

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.

Page 120: Giao trinh fpga

120

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) ;

Page 121: Giao trinh fpga

121

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

Page 122: Giao trinh fpga

122

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ña 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ý

Page 123: Giao trinh fpga

123

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;

Page 124: Giao trinh fpga

124

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

Page 125: Giao trinh fpga

125

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

Page 126: Giao trinh fpga

126

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' ),

Page 127: Giao trinh fpga

127

('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;

Page 128: Giao trinh fpga

128

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è

Page 129: Giao trinh fpga

129

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

Page 130: Giao trinh fpga

130

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

nhÊt

C¸c to¸n tö C¸c to¸n h¹ng

Logical_operator

and

or

nand

Cïng kiÓu

Cïng kiÓu

Cïng kiÓu

Relational _ operator

nor

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

Cïng kiÓu

concatenation_operator

arithmetic_operator

&

+

-

Cïng kiÓu

Cïng kiÓu

.

.

.

.

.

.

.

.

.

.

arithmetic_operator +

-

BÊt kú kiÓu sè nµo

BÊt kú kiÓu sè nµo

Page 131: Giao trinh fpga

131

arithmetic_operator *

/

mod

rem

Cïng kiÓu

Cïng kiÓu

integer

integer

Møc

−u

tiªn

cao

nhÊt

arithmetic_operator

Logical_operator

**

abs

not

KiÓu mò integer

BÊt kú kiÓu sè nµo

Cïng kiÓu

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);

Page 132: Giao trinh fpga

132

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

Page 133: Giao trinh fpga

133

- 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

Page 134: Giao trinh fpga

134

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.

Page 135: Giao trinh fpga

135

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

Page 136: Giao trinh fpga

136

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:

Page 137: Giao trinh fpga

137

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

Page 138: Giao trinh fpga

138

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

Page 139: Giao trinh fpga

139

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µ

Page 140: Giao trinh fpga

140

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.

Page 141: Giao trinh fpga

141

- 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.

Page 142: Giao trinh fpga

142

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

Page 143: Giao trinh fpga

143

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; . . .

Page 144: Giao trinh fpga

144

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

Page 145: Giao trinh fpga

145

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

Page 146: Giao trinh fpga

146

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

1

3

4

S

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.

Page 147: Giao trinh fpga

147

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:

Page 148: Giao trinh fpga

148

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:

Page 149: Giao trinh fpga

149

c. So s¸nh INERTIAL DELAY vµ TRANSPORT DELAY.

S

A

10ns 20ns 30ns 40ns

Inertial Delay

S <= A after 20 ns

S

A

10ns 20ns 30ns 40ns

Transport Delay

S <= Transport A after 20 ns

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

Page 150: Giao trinh fpga

150

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

Page 151: Giao trinh fpga

151

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

Page 152: Giao trinh fpga

152

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.

Page 153: Giao trinh fpga

153

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;

Page 154: Giao trinh fpga

154

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

Page 155: Giao trinh fpga

155

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

Page 156: Giao trinh fpga

156

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:

Page 157: Giao trinh fpga

157

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;

Page 158: Giao trinh fpga

158

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.

Page 159: Giao trinh fpga

159

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.

Page 160: Giao trinh fpga

160

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.

Page 161: Giao trinh fpga

161

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];

Page 162: Giao trinh fpga

162

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;

Page 163: Giao trinh fpga

163

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

Page 164: Giao trinh fpga

164

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 ;

Page 165: Giao trinh fpga

165

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:

Page 166: Giao trinh fpga

166

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

Page 167: Giao trinh fpga

167

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;

Page 168: Giao trinh fpga

168

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:

Page 169: Giao trinh fpga

169

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

Page 170: Giao trinh fpga

170

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.

Page 171: Giao trinh fpga

171

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è.

Page 172: Giao trinh fpga

172

- 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);

Page 173: Giao trinh fpga

173

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:

Page 174: Giao trinh fpga

174

[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

Page 175: Giao trinh fpga

175

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;

Page 176: Giao trinh fpga

176

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

Page 177: Giao trinh fpga

177

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

Page 178: Giao trinh fpga

178

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

Page 179: Giao trinh fpga

179

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.

Page 180: Giao trinh fpga

180

- 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ô:

Page 181: Giao trinh fpga

181

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

Page 182: Giao trinh fpga

182

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

Page 183: Giao trinh fpga

183

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.

PhÇn giao diÖn component cña bé céng Full_adder.

SUM

Cout

Cin

N3

N1

N2

A

B

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é

Page 184: Giao trinh fpga

184

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;

Page 185: Giao trinh fpga

185

§Ó 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);

Page 186: Giao trinh fpga

186

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:

Page 187: Giao trinh fpga

187

X (3) Y (3) X (2) Y (2) X (1) Y (1) X (0) Y (0)

Cout ' 0 '

Z (3) Z (2) Z (1) Z (0)

FA (3) FA (2) FA (1) FA (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

Page 188: Giao trinh fpga

188

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

Z (3) Z (2) Z (1) Z (0)

FA (3) FA (2) FA (1) HA (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 );

Page 189: Giao trinh fpga

189

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:

Page 190: Giao trinh fpga

190

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);

Page 191: Giao trinh fpga

191

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.

register

CombinationalLogic

DOUT

clock

DIN

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 :

Page 192: Giao trinh fpga

192

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.

Page 193: Giao trinh fpga

193

Signal S, Data_in, Data_out : bit;process (S, Data_in)Begin

if ( S = '1' ) thenData_out <= Data_in;

end if;end process ;

S

Q

QSET

CLR

DData_In Data_out

§Ó 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' ) thenData_out <= Data_in;

elseData_out <= ' 0 ';

end if;end process ;

Data_In

S

Data_out

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:

SQ

QSET

CLR

DData_In Data_out

en

RST

Signal S, RST, Data_in, Data_out : bit;

process (S, RST, Data_in)Begin

if ( RST = '1' ) thenData_out <= ' 0 ';

elsif ( S = ' 1 ' ) thenData_out <= Data_in;

end if;end process ;

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.

Page 194: Giao trinh fpga

194

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;

process (CLK)Begin

if ( CLK'event and CLK = '1' ) thenData_out <= Data_in;

end if;end process ;

CLKQ

QSET

CLR

DData_In Data_out

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 ';

elseData_out <= Data_in;

end if;end if;

end process ;

CLKQ

QSET

CLR

DData_In

Data_out' 0 '

S_RST

MUX

3.11.4. C¸c ®−êng tÝn hiÖu SET vµ RESET kh«ng ®ång bé.

Page 195: Giao trinh fpga

195

CLK

Q

QSET

CLR

DData_In Data_out

A_RST

Signal CLK, A_RST, Data_in, Data_out : bit;

process (CLK, A_RST)Begin

if ( A_RST = '0' ) thenData_out <= ' 0 ';

elsif ( CLK'event and CLK = ' 1 ' ) thenData_out <= Data_in;

end if;end process ;

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:

PB

CLK

Q1Q2

PB.Pulse

FF FF

Page 196: Giao trinh fpga

196

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 ".

Page 197: Giao trinh fpga

197

S

Q

DS

Q

D

Q

D

R

Q

D

R

Dout (3) Dout (2) Dout (1) Dout (0)

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:

Page 198: Giao trinh fpga

198

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:

FF FF FF FFDin

CLK

D D D DQ Q Q QDout

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:

FFT

FFT

FFT

FFTQ Q Q Q

RESET

CLK

Count (0) Count (1) Count (2) Count (3)

1 1 1 1

signal CLK, RESET : Bit;

signal COUNT : Bit_vector ( 3 downto 0 );

Page 199: Giao trinh fpga

199

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

Page 200: Giao trinh fpga

200

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.

OE

Din Dout

Library IEEE;use IEEE.STD_LOGIC_1164. all;

architecture IMP of TRI_STATE isSignal Din, Dout, OE : STD_LOGIC;Beginprocess (OE, Din)Begin

if ( OE = '0' ) then Dout <= ' Z ';

else Dout <= Din;

end if;end process ;

Page 201: Giao trinh fpga

201

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

Page 202: Giao trinh fpga

202

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;

S (0)

S (1)

2 to 4

Decoder

R 0 R 1 R 2 R 3

Bus Line

OE (0) OE (1) OE (2) OE (3)

0

1

2

3

CÊu tróc ®−êng Bus t¸m bit

Page 203: Giao trinh fpga

203

Ch−¬ng IV

ThiÕt kÕ bé ®iÒu khiÓn ®éng c¬ b−íc

4.1. Giíi thiÖu tãm t¾t

ViÖc øng dông ®iÒu khiÓn c¸c m« t¬ b−íc, th«ng th−êng ®−îc

kÕt hîp víi c¸c bé vi xö lý ®· t¹o ra mét kh¶ n¨ng ®iÒu khiÓn vÞ trÝ

víi ®é chÝnh x¸c cao. Motor b−íc lµ thiÕt bÞ mµ nã cã thÓ quay víi

mét sè ®é chÝnh x¸c trªn mçi b−íc. C¸c lo¹i motor b−íc ®iÓn h×nh

th−êng quay víi gãc quay lµ 150 hoÆc 7.50 trªn mét b−íc, th−êng th×

motor ®−îc chØ ra sè b−íc cÇn thiÕt ®Ó quay hÕt mét vßng 3600 ( Víi

motor b−íc quay 150 trªn mét b−íc sÏ quay 24 b−íc trong mét

vßng). ViÖc ®iÒu khiÓn ®éng c¬ b−íc chÝnh lµ ®iÒu khiÓn viÖc cung

cÊp ®iÖn ¸p trªn c¸c cuén d©y cña chóng. ë ch−¬ng nµy t¸c gi¶ xin

tr×nh bÇy mét vÝ dô ®¬n gi¶n sö dông CPLD, FPGA vµ giíi thiÖu bé

vi xö lý th−êng dïng ®Ó ®iÒu khiÓn ®éng c¬ b−íc víi bèn cuén d©y

pha. VÝ dô nµy lµ mét vÝ dô ®¬n gi¶n nh»m ®Ó lµm quen vµ hiÓu c¸ch

lËp tr×nh trªn cÊu tróc cu¶ CPLD vµ FPGA chø kh«ng ®−a vµo øng

dông nµo c¶. Tuy nhiªn nÕu muèn ph¸t triÓn vÝ dô nµy thµnh øng

dông th× viÖc triÓn khai còng rÊt dÔ dµng, v× c¸c b−íc c¬ b¶n cña

thiÕt kÕ sÏ ®−îc tiÕn hµnh theo tr×nh tù, vµ chØ thªm mét sè thiÕt bÞ

®¬n gi¶n kh¸c nh− Encoder hay c¸c m¾t quang lµ cã thÓ cã mét

vßng ®iÒu khiÓn kÝn ®èi víi vÝ dô nµy .

4.2.ThiÕt kÕ bé ®iÒu khiÓn ®éng c¬ b−íc

4.2.1. §iÒu khiÓn ®éng c¬ b−íc sö dông bé vi ®iÒu khiÓn

89C51 truyÒn thèng .

Page 204: Giao trinh fpga

204

§Ó ®iÒu khiÓn ®éng c¬ b−íc, cã nghÜa lµ ta ph¶i cung cÊp mét

lo¹t c¸c ®iÖn ¸p vµo bèn cuén cña motor. C¸c cuén sÏ ®−îc cÊp n¨ng

l−îng ®Ó motor quay ®−îc mét b−íc. C¸c mÉu cÊp n¨ng l−îng cho

c¸c cuén cÇn ph¶i ®−îc cung cÊp chÝnh x¸c. C¸c mÉu nµy sÏ ®−îc

thay ®æi phô thuéc vµo chÕ ®é sö dông víi motor. Víi c¸c chÕ ®é

th«ng th−êng cho c¸c øng dông cã m« men quay thÊp, th−êng ®−îc

sö dông ë chÕ ®é ®iÒu khiÓn nöa b−íc, cã nghÜa lµ víi motor cã ®é

ph©n gi¶i 24 b−íc trong mét vßng quay th× sÏ quay 48 b−íc trong

mét vßng quay. S¬ ®å ®iÓn h×nh ®Ó ®iÒu khiÓn mét ®éng c¬ b−íc cã

s¬ ®å nh− h×nh 4.1. §©y lµ s¬ ®å ®· ®−îc t¸c gi¶ sö dông trong thùc

tÕ ®Ó ®iÒu khiÓn víi c¸c øng dông cã m« men quay cña motor thÊp .

Sö dông bãng MosFet ®Ó ®iÒu khiÓn , v× lo¹i nµy th«ng th−êng ®iÒu

khiÓn b»ng ¸p.

Bit0

Bit1

Bit2

Bit3 M

VCCVCC

VCC

VCC

VCC

VCC

IRF 630

IRF 630IRF 630

IRF 630

H×nh 4.1. S¬ ®å ®iÒu khiÓn Motor b−íc, phÇn c«ng suÊt

Gi¶ sö bé vi xö lý dïng bèn cæng t¹o ra mÉu bit (Bit 0, Bit 1, Bit

Page 205: Giao trinh fpga

205

2, Bit 3) ®Ó ®iÒu khiÓn ®éng c¬ quay, mÉu bit ®iÒu khiÓn ®éng c¬

quay nöa b−íc ®−îc chØ ra nh− b¶ng 4.1:

B¶ng 4.1. MÉu bit ®iÒu khiÓn nöa b−íc

Step Bit 3 Bit 2 Bit 1 Bit 0

1 1 0 1 0

2 1 0 0 0

3 1 0 0 1

4 0 0 0 1

5 0 1 0 1

6 0 1 0 0

7 0 1 1 0

8 0 0 1 0

Víi c¸c øng dông cã m« men quay lín mÉu b−íc th−êng ®−îc

sö dông chØ ra ë b¶ng 4.2.

B¶ng 4.2. MÉu bit ®iÒu khiÓn c¶ b−íc:

Step Bit 3 Bit 2 Bit 1 Bit 0

1 1 0 1 0

2 1 0 0 1

3 0 1 0 1

4 0 1 1 0

§Ó ®iÒu khiÓn motor b−íc, bé vi xö lý cÇn ph¶i ®−a ra c¸c mÉu

bit tuÇn tù nh− hai b¶ng võa nªu. §Ó ®¶o chiÒu quay cña ®éng c¬

ph¶i thùc hiÖn t¹o mÉu bit tuÇn tù theo thø tù ng−îc l¹i cña c¸c

b−íc. L−u ý, søc × qu¸n tÝnh cña ®éng c¬ cÇn cã mét ®é gi÷ chËm

Page 206: Giao trinh fpga

206

nhÊt ®Þnh (th«ng th−êng kho¶ng tõ 5 ®Õn 15 ms) gi÷a mçi b−íc.

D−íi ®©y xin giíi thiÖu ch−¬ng tr×nh ®−îc viÕt b»ng ng«n ng÷ C

vµ n¹p cho chip vi ®iÒu khiÓn hä 89C51 hoÆc 89C2051 dïng bèn

d−êng song song cña cæng P1.

NÕu dïng th¹ch anh kh¸c th× ph¶i tÝnh gi¸ trÞ n¹p cho TH0 vµ

TL0 kh¸c, ch−¬ng tr×nh sau ®iÒu khiÓn cho motor quay 30 b−íc liªn

tôc sau ®ã ®¶o chiÒu quay. §©y lµ ch−¬ng tr×nh vÝ dô dïng ®Ó

tham kh¶o tr−íc khi b−íc sang thùc hiÖn trªn CPLD vµ FPGA.

#include <c:\keil\c51\inc\reg51.h>

#include <c:\Keil\c51\inc\absacc.h>

void time()

{

TH0=0x9E; /* Th¹ch anh 6Mhz*/

TL0=0x58; /* N¹p bé ®Õm gi÷ chËm 50 ms */

TF0=0;

TR0=1;

while (TF0==0);

TR0=0;

}

/*--------------------------------------------------------------------------

-----*/

unsigned char steptab[] = {0x0a, 0x08, 0x09, 0x01, 0x05, 0x04,

0x06, 0x02};

//unsigned char steptab[] = {0x0a,0x09,0x05,0x06};

Page 207: Giao trinh fpga

207

main()

{

unsigned char ptr =0;

unsigned char cntr;

bit DFLAG;

TMOD=0x21;

DFLAG=0;

while(1)

{

for (cntr=0;cntr<30;cntr++)

{

P1=steptab[ptr&0x7];

time();

if (DFLAG==0)

ptr++;

else

ptr--;

}

DFLAG=!(DFLAG);

}

}

§Ó cã ®é gi÷ chËm gi÷a c¸c b−íc, ph¶i t¹o bé dÕm gi÷ chËm 50

ms víi th¹ch anh 6 MHz th× ph¶i n¹p 9E58H vµo thanh ghi TH0 vµ

TL0.

Page 208: Giao trinh fpga

208

4.2.2 §iÒu khiÓn ®éng c¬ b−íc sö dông CPLD XC9572XL

Môc nµy sÏ thiÕt kÕ bé ®iÒu khiÓn ®éng c¬ b−íc víi bèn phÝm

g¹t ®−a vµo CPLD ®Ó ®iÒu khiÓn ®éng c¬ b−íc víi c¸c chøc n¨ng

sau:

- SW1 : Dïng ®Ó khëi ®éng vµ dõng ®éng c¬ . ( C«ng t¾c Start/Stop)

- SW2 : Dïng ®Ó ®¶o chiÒu quay cña ®éng c¬ . ( C«ng t¾c Dir)

- SW3: Dïng ®Ó t¨ng gi¶m tèc ®é ®éng c¬. ( T¨ng, gi¶m tèc ®é ®éng

c¬ Inc/Dec)

- SW4 : Dïng ®Ó Reset hÖ thèng .

1. S¬ ®å khèi cña hÖ thèng :

§Ó thiÕt kÕ mét ch−¬ng tr×nh trong CPLD, th«ng th−êng ta ph¶i

vÏ s¬ ®å khèi, hoÆc m« t¶ kü h¬n ë d¹ng m« t¶ m¸y tr¹ng th¸i, sau

®ã ®iÒn c¸c tÝn hiÖu vµo ra.Víi thiÕt kÕ nµy, cÇn ph¶i thiÕt kÕ ba

khèi trong CPLD, sau ®ã tæng hîp chóng vµ ®−a vµo mét thiÕt kÕ mµ

cã chøa ba khèi nµy.

Tr−íc tiªn khèi xö lý phÝm vµ t¹o tÝn hiÖu ®iÒu khiÓn bªn trong

ph¶i lu«n quÐt phÝm, ®Ó nhËn biÕt tÝn hiÖu ®iÒu khiÓn, sau ®ã ra lÖnh

cho khèi t¹o b−íc ®Ó xuÊt ra c¸c mÉu b−íc ( Xem h×nh 4.2 ).

Khèi t¹o mÉu b−íc sÏ nhËn tÝn hiÖu tõ bé t¹o xung Clock ®Ó

lµm Clock cña m×nh, phô thuéc vµo tÝn hiÖu ®iÒu khiÓn cña khèi

®iÒu khiÓn ®−a sang, bé t¹o Clock sÏ t¹o Clock cho khèi t¹o b−íc,

tõ ®ã sÏ ®iÒu khiÓn ®−îc tèc ®é cña ®éng c¬ nhanh hay chËm.

Khèi t¹o mÉu b−íc ®−îc thùc hiÖn phô thuéc vµo khèi t¹o

Clock ®−a sang, v× thÕ c¸c b−íc tuÇn tù ®−îc ®−a ra theo tÝn hiÖu

Clock nµy.

Page 209: Giao trinh fpga

209

Do ë ®©y sö dông lo¹i XC9572XL 3.3V nªn ë m¹ch ®Çu ra ta

ph¶i ghÐp opto c¸ch ly ®Ó tr¸nh háng vi m¹ch.

Khèi Xö LýPhÝm vµ T¹o

TÝn HiÖu §iÒuKhiÓn

Khèi T¹o C¸cXung Ra Theo

MÉu B−íc

Khèi C«ng SuÊtIRF 630

Khèi PhÝmChøc N¨ng

Khèi T¹o XungClock

TÝn hiÖu ®iÒu khiÓnClock

TÝn hiÖu®iÒu khiÓn C¸c mÉu bit

Clock hÖ thèng 8 MHz

CPLD XC9572

M

H×nh 4.2. S¬ ®å khèi bé ®iÒu khiÓn ®éng c¬ tõ bµn phÝm

sö dông CPLD XC9572XL

2. T¹o thiÕt kÕ:

a. ThiÕt kÕ Modul t¹o mÉu b−íc: Tr−íc tiªn ta ®i viÕt ch−¬ng

tr×nh cho Modul t¹o mÉu b−íc tr−íc, ®Ó x©y dùng ®−îc khèi nµy ta

sö dông m« t¶ FSM ( Cã thÓ dïng ch−¬ng tr×nh StateCAD hoÆc viÕt

trùc tiÕp b»ng VHDL). ë ®©y t¸c gi¶ xin giíi thiÖu ch−¬ng tr×nh

®−îc viÕt b»ng VHDL. S¬ ®å m« t¶ tr¹ng th¸i cña modul t¹o b−íc cã

d¹ng nh− sau:

Page 210: Giao trinh fpga

210

E = 0 & DIR = 0

Step_0 Step_1

Step_2Step_3

E =1

E =1E =1

E =1

RESET

E = 0 & DIR = 0

E = 0 & DIR = 0

E = 0 & DIR = 0

E = 0 & DIR = 1

E = 0 & DIR = 1

E = 0 & DIR = 1

E = 0 & DIR = 1

H×nh 4.3. S¬ ®å m« t¶ m¸y tr¹ng th¸i cña Modul SecGenerator

C¸c mÉu b−íc sÏ lµ bèn b−íc hoÆc 8 b−íc nh− sau:

-- Full Step Table : ( x"A", x"9" , x"5",x"6" )

-- Half Step Table : (x"A",x"8",x"9",x"1",x"5",x"4",x"6",x"2").

Víi s¬ ®å trªn ta thÊy, ®Ó motor quay bèn b−íc theo mét chiÒu

nhÊt ®Þnh, ta ph¶i t¹o tÝn hiÖu E = 0, vµ Dir = 0 ®−a vµo khèi nµy.

Cßn muèn ®Ó quay theo chiÒu ng−îc l¹i ta ph¶i cho E = 0 vµ Dir

= 1.

Trong ch−¬ng tr×nh Project Navigator ta t¹o mét modul míi

víi tªn lµ SecGenerator.vhd vµ khai b¸o c¸c ®Çu vµo ®Çu ra,

ch−¬ng tr×nh ®−îc viÕt d−íi d¹ng VHDL ( Xem phÇn phô lôc1, file

SecGenerator.vhd ).

Sau khi viÕt xong tiÕn hµnh kiÓm tra có ph¸p vµ m« pháng. T¹o

file m« pháng víi tªn lµ Sec_tb.tbw vµ t¹o biÓu ®å kiÓm tra nh−

h×nh 4.4.

Page 211: Giao trinh fpga

211

H×nh 4.4. T¹o biÓu ®å kiÓm tra

Khi m« pháng d¹ng sãng ®Çu ra cã d¹ng sau:

H×nh 4.5. D¹ng sãng ra cña modul SecGenerator

Nh− chóng ta thÊy c¸c mÉu b−íc ®−îc ®−a ra ®Çu ra víi tªn sec

nh− h×nh 4.5. Nh− vËy modul t¹o mÉu b−íc ®· hoµn toµn ®−îc m«

pháng, h¬n n÷a nã còng ®· ®−îc kiÓm nghiÖm vµ ch¹y thö trong

m¹ch thùc tÕ (Xem h×nh 4.25 vµ h×nh 4.26).

b. ThiÕt kÕ Modul t¹o xung Clock :

ViÖc modul t¹o mÉu b−íc sÏ ®−a ra c¸c b−íc nhanh hay chËm

lµ do khèi t¹o xung Clock nµy ®−a sang. Trong phÇn mÒm Project

Page 212: Giao trinh fpga

212

Navigator t¹o modul míi víi tªn Clk_Generator.vhd. L−u ®å

thuËt to¸n cña Modul nµy nh− h×nh 4.6.

Xem file Clk_Generator.vhd trong phô lôc1. TiÕp theo ta ®i

kiÓm tra có ph¸p cña modul nµy vµ ®i m« pháng.

File m« pháng hÖ thèng cã tªn lµ Clk_tb.twb, kÕt qu¶ m«

pháng sÏ thu ®−îc vµ cã d¹ng nh− h×nh 4.7.

RESET = 1 ?

COUNT 10M = COUNT 10M + 1

InitCOUNT 10M = 0, Clk_1ms = 0,COUNT_xms = 0, Clk_Out =0

Clk In ?

COUNT 10M = 4000 ?

COUNT 10M = 0Clk_1ms = Not (Clk_1ms)

Yes

No

Yes

No

Clk_1ms?

COUNT_xms = COUNT_xms + 1

COUNT_xms = DIV ?

COUNT_xms = 0Clk_Out = Not (Clk_Out)

No

Yes

Yes

No

No

Yes

H×nh 4.6. L−u ®å thuËt to¸n cña Modul Clk_Generator

Page 213: Giao trinh fpga

213

H×nh 4.7. BiÓu ®å d¹ng sãng ®Çu ra cña Modul Clock

Nh− trªn biÓu ®å ta thÊy d¹ng sãng ®Çu ra cña tÝn hiÖu Clk_out

thay ®æi phô thuéc vµo tÝn hiÖu Div ®−a vµo ®Çu vµo. Nhê cã tÝn

hiÖu nµy thay ®æi mµ motor sÏ xuÊt ra c¸c mÉu b−íc nhanh hay

chËm.

c. ThiÕt kÕ Modul quÐt phÝm vµ t¹o lÖnh ®iÒu khiÓn:

Nh− ®· giíi thiÖu ë phÇn trªn, c¸c phÝm sÏ cã c¸c chøc n¨ng

nh− Reset, Inc/Dec, Cnt_Dir, Start/Stop. Xong v× thiÕt kÕ phÝm theo

kiÓu phÝm g¹t nªn chØ cÇn kiÓm tra bèn phÝm.

Khi bËt nguån, ch−¬ng tr×nh ph¶i kiÓm tra c¸c phÝm nµy liªn tôc

®Ó ®−a ra c¸c lÖnh ®iÒu khiÓn . C¸c lÖnh ®iÒu khiÓn Motor bao gåm :

- TÝn hiÖu Reset : Reset hÖ thèng.

- TÝn hiÖu Start/Stop : Cho phÐp hay kh«ng cho phÐp hÖ thèng

ho¹t ®éng.

- TÝn hiÖu Inc : T¨ng hay gi¶m tèc ®é ®éng c¬.

Page 214: Giao trinh fpga

214

- TÝn hiÖu Dir : Dïng ®Ó ®¶o chiÒu ®éng c¬.

L−u ®å thuËt to¸n cña Modul nµy thÓ hiÖn ë h×nh 4.8. Xem

ch−¬ng tr×nh phÇn phô lôc 1, file Inc_Dec.vhd. B©y giê ta ®i m«

pháng modul nµy.

T−¬ng tù nh− trªn, ch¹y file Inc_Dec_tb.tbw vµ biÓu ®å m«

pháng sÏ thu ®−îc nh− h×nh 4.9.

Reset = 1

InitDout = "000", E =1, Dir =1

No

Yes

Start = 0 ?

E = 0

E = 1

Yes

No Cnt_Dir = 0 ?

Dir = 0

Dir =1

Yes

NoInc = 0 ?

Dout =Dout +1

Yes

NoDout =Dout - 1

H×nh 4.8. L−u ®å thuËt to¸n Modul quÐt phÝm chøc n¨ng,

Inc_Dec.vhd

Page 215: Giao trinh fpga

215

H×nh 4.9. D¹ng sãng ®Çu ra cña Modul ®iÒu khiÓn vµ quÐt phÝm

Nh− biÓu ®å d¹ng sãng ra ta thÊy sù phô thuéc vµo phÝm Inc

®−îc g¹t vÒ kh«ng hay mét th× d÷ liÖu Dout ®−a ra t¨ng lªn hay

gi¶m ®i. HoÆc khi ®¶o chiÒu c¸c bÝt sÏ t¹o ra theo thø tù ng−îc l¹i

trong b¶ng.

d. ThiÕt kÕ Modul tæng thÓ : ViÖc thiÕt kÕ Modul nµy chØ ®¬n

thuÇn lµ ghÐp c¸c modul ®· thiÕt kÕ l¹i víi nhau, hay thÓ hiÖn chóng

trong mét modul líp trªn (Xem ch−¬ng tr×nh trong File

Top_Step.vhd trong phÇn phô lôc 1), v× thÕ trong ch−¬ng tr×nh

Project Navgator khi ch¹y ch−¬ng tr×nh ECS sÏ cho ta mét khèi

chøc n¨ng kÝn chØ cã ®Çu vµo vµ ra nh− h×nh 4.10.

Page 216: Giao trinh fpga

216

H×nh 4.10 . S¬ ®å tæng thÓ cña Modul ®iÒu khiÓn Motor b−íc

khi ch¹y ch−¬ng tr×nh ECS trong Project Navigator

Modul nµy sÏ cã bèn ®Çu vµo phÝm ( Inc , Start , Reset, Cnt_Dir

), mét ®−êng Clock 8MHz ®Çu vµo, clock cña hÖ thèng. Ba ®Çu ra

bao gåm mét Bus ®Çu ra bèn bit dïng ®Ó t¹o mÉu b−íc cho Motor vµ

hai ®Çu ra tÝn hiÖu Led chØ thÞ. S¬ ®å g¸n ch©n ng−êi dïng ®−îc thùc

hiÖn trong ch−¬ng tr×nh PACE nh− sau:

Toµn bé thiÕt kÕ nµy ®· ®−îc dÞch, n¹p vµo trong CPLD

XC9572XL th«ng qua c¸p JTAG vµ cho ch¹y thö trªn m¹ch thùc tÕ.

C¸c modul ch−¬ng tr×nh ®−îc giíi thiÖu trong phô lôc 1. ë môc nµy

t¸c gi¶ xin kh«ng giíi thiÖu s¬ ®å m¹ch in phÇn ®iÒu khiÓn vµ m¹ch

Page 217: Giao trinh fpga

217

in phÇn c«ng suÊt v× hai s¬ ®å nµy lµ hai s¬ ®å d¹ng ®¬n gi¶n.

4.2.3 §iÒu khiÓn motor b−íc ghÐp nèi víi m¸y tÝnh PC sö

dông Board m¹ch Spartan-3 FPGA

PhÇn nµy lµ phÇn thiÕt kÕ n©ng cao vµ sö dông vi m¹ch chÝnh lµ

XC3S200 FPGA. ViÖc ghÐp nèi víi m¸y tÝnh ®ßi hái ch−¬ng tr×nh

ph¶i ®−îc thiÕt kÕ mét bé UART ®Ó nhËn d÷ liÖu tõ m¸y tÝnh PC.

Th«ng th−êng khi thiÕt kÕ phÇn cøng, ta th−êng ph¶i dïng mét vi

m¹ch chuyÓn ®æi møc Max 232 hoÆc Max3232, c¸c vi m¹ch UART

1640 hoÆc 1650. Víi nh÷ng ng−êi lËp tr×nh vi ®iÒu khiÓn th× c«ng

viÖc ghÐp nèi víi m¸y tÝnh PC lµ c«ng viÖc kh¸ ®¬n gi¶n, v× trong

c¸c bé vi ®iÒu khiÓn cã s½n mét bé UART. Khi sö dông CPLD hoÆc

FPGA, chóng ta ph¶i thùc hiÖn viÕt ch−¬ng tr×nh thùc hiÖn c¸c chøc

n¨ng cña vi m¹ch UART nµy. Nãi nh− vËy viÖc sö dông CPLD vµ

FPGA phøc t¹p h¬n?. §óng vËy, khi míi b¾t ®Çu lµm quen víi

CPLD vµ FPGA ®Ó b¾t ®Çu tõ ®©u lu«n lµ mét c©u hái khã. §Ó thùc

hiÖn ®−îc còng ph¶i cã mét thêi gian cÇn thiÕt ®Ó ®äc, tham kh¶o,

t×m tßi. Xong khi ®· thùc hiÖn ®−îc trªn nã, th× míi thÊy ®−îc nã rÊt

−u viÖt, bëi lÏ chóng ta cã thÓ t¹o ch−¬ng tr×nh cña chóng ta viÕt ra

thµnh mét core (lâi), mµ khi cã lÇn nµo ®ã ta cã thÓ sö dông l¹i

chóng mét c¸ch dÔ dµng. Vµ mét ®iÒu quan träng n÷a lµ chóng ta ®·

®−a mét vi m¹ch UART vµo trong mét chÝp ®¬n mµ trong chip nµy

cã thÓ ®−îc tÝch hîp cïng nhiÒu c¸c vi m¹ch kh¸c n÷a ®Ó thùc hiÖn

mét hÖ thèng phøc t¹p chØ trong mét chip. §©y míi chØ lµ mét øng

dông s¬ khai ban ®Çu, víi FPGA nã cßn c¶ mét chÆng dµi c¸c tµi

Page 218: Giao trinh fpga

218

nguyªn ch−a ®−îc khai th¸c hÕt, b¹n cã thÓ t¹o RAM trong chóng,

t¹o mét bé vi xö lý trong chóng hay biÕn chóng thµnh mét bé DSP,

hay c¸c bé läc sè chuyªn dông, bé xö lý c¸c thuËt to¸n xö lý ¶nh ...

Víi vÝ dô nhá bÐ nµy t¸c gi¶ còng xin ®−îc tr×nh bµy, v× dï sao nã

còng lµ b−íc ®i ban ®Çu trªn nÒn cña c¸c chÝp mËt ®é cao tèc ®é lín

nµy. Còng víi vÝ dô ®· giíi thiÖu, b©y giê ta kh«ng ®iÒu khiÓn b»ng

phÝm n÷a mµ ta sö dông ch−¬ng tr×nh ®Ó ®iÒu khiÓn. Ch−¬ng tr×nh

nµy ®−îc viÕt b»ng Visual Basic ®Ó ®iÒu khiÓn motor b»ng m¸y tÝnh

th«ng qua cæng COM1. Trong chip Spartan sÏ ®−îc viÕt mét bé

UART ®Ó nhËn d÷ liÖu tõ m¸y tÝnh PC ®−a sang.

1. Ch−¬ng tr×nh ®iÒu khiÓn giao diÖn phÇn mÒm Visual Basic

Môc ®Ých cña chóng ta lµ ®i thiÕt kÕ bé UART kÕt hîp víi

modul ®iÒu khiÓn ®éng c¬ b−íc nh− ®· giíi thiÖu. ChÝnh v× lý do

nµy ch−¬ng tr×nh viÕt b»ng Visual Basic ®−îc viÕt ®¬n gi¶n víi c¸c

nót Ên ®Ó thay cho phÝm trong vÝ dô tr−íc. NÕu thªm mét b−íc n÷a

lµ chóng ta cã thÓ lÊy d÷ liÖu tõ m¹ch ph¶n håi cña ®éng c¬ ®Ó xö lý

trong m¸y tÝnh. Tuy nhiªn ë luËn v¨n nµy t¸c gi¶ chØ ®Ò cËp ®Õn mét

môc ®Ých c¬ b¶n vÒ viÖc ghÐp nèi m¸y tÝnh víi FPGA th«ng qua mét

bé UART ®−îc viÕt trong FPGA. Trªn form ch−¬ng tr×nh, khi ta

kÝch chuét vµo c¸c nót nhÊn nµy th× ch−¬ng tr×nh sÏ truyÒn c¸c Byte

d÷ liÖu qua cæng COM 1 víi khu«n mÉu truyÒn ®Æt s½n lµ

"9600,N,8,1". (Ch−¬ng tr×nh nµy ®· ®−îc thö nghiÖm ghÐp nèi víi

bé vi xö lý 89C51 vµ FPGA Spartan3 XC3S200 – 5ft256). Mçi lÇn

kÝch chuét lµ mét lÇn ch−¬ng tr×nh truyÒn mét Byte d÷ liÖu, v× thÕ bé

UART ®−îc viÕt trong bo m¹ch Spartan-3 sÏ còng ph¶i viÕt víi tèc

Page 219: Giao trinh fpga

219

®é Baudrate lµ 9600 víi khu«n mÉu truyÒn nhËn nh− trªn. Ch−¬ng

tr×nh ®iÒu khiÓn nµy ®−îc viÕt d−íi d¹ng mét Form ®¬n víi s¸u nót

nhÊn nh− sau: - Start : Khëi ®éng Motor.

- Left, Right : Dïng ®Ó ®¶o chiÒu ®éng c¬

- Nót Slow/Fast : Dïng ®Ó t¨ng gi¶m tèc ®é ®éng c¬.

H×nh 4.11. Giao diÖn khèi ®iÒu khiÓn Motor

M· ch−¬ng tr×nh ®−îc viÕt nh− sau:

Option Explicit

Dim command As Byte

Dim FLAG As Boolean

Private Sub cmdDown_Click()

If FLAG = True Then

command = &H44 'character D

MSComm1.Output = Chr(command)

Else

Page 220: Giao trinh fpga

220

MsgBox ("Start Command Button haven't been pressed")

End If

End Sub

-----------------------------------------------------------------------------

-------

Private Sub cmdLeft_Click()

If FLAG = True Then

command = &H4C 'character L

MSComm1.Output = Chr(command)

Else

MsgBox ("Start Command Button haven't been pressed")

End If

End Sub

-----------------------------------------------------------------------------

-------

Private Sub cmdRight_Click()

If FLAG = True Then

command = &H52 'chatacter R

MSComm1.Output = Chr(command)

Else

MsgBox ("Start Command Button haven't been pressed")

End If

End Sub

-----------------------------------------------------------------------------

Page 221: Giao trinh fpga

221

-------

Private Sub CmdStart_Click()

FLAG = True

command = &H53 'character S

MSComm1.Output = Chr(command)

End Sub

-----------------------------------------------------------------------------

-------

Private Sub cmdSTOP_Click()

FLAG = False

command = &H42 'character B = stop

MSComm1.Output = Chr(command)

End Sub

-----------------------------------------------------------------------------

-------

Private Sub cmdUp_Click()

If FLAG = True Then

command = &H55 ' character U

MSComm1.Output = Chr(command)

Else

MsgBox ("Start Command Button haven't been pressed")

End If

End Sub

Private Sub Form_Load()

Page 222: Giao trinh fpga

222

FLAG = False

MSComm1.CommPort = 1

MSComm1.Settings = "9600,N,8,1"

MSComm1.PortOpen = True

End Sub

-----------------------------------------------------------------------------

-------

Private Sub Form_Unload(Cancel As Integer)

MSComm1.PortOpen = False

End Sub

2. ThiÕt kÕ bé UART vµ ghÐp nèi PC :

§Ó thiÕt kÕ Modul UART chóng ta ph¶i thiÕt kÕ mét Modul

chÝnh vµ hai modul con víi c¸c tªn file nh− sau (SÏ ®−îc giíi thiÖu ë

phÇn phô lôc2 ):

- Modul UART.vhd : Modul chÝnh chøa c¸c Modul thµnh phÇn

.

- Modul Rx.vhd : Modul dïng ®Ó lµm bé thu d÷ liÖu kh«ng

®ång bé.

- Modul Tx.vhd: Modul dïng ®Ó thùc hiÖn bé ph¸t d÷ liÖu

kh«ng ®ång bé.

- Modul Counter.vhd : Dïng ®Ó t¹o ®ång hå Baudrate, khi thiÕt

lËp tèc ®é Baudrate víi m¸y tÝnh PC.

- Modul Synchroniser.vhd dïng ®Ó ®ång bé Clock.

§Ó thiÕt kÕ mét Modul UART vµ t¹o chóng thµnh Core rÊt

Page 223: Giao trinh fpga

223

phøc t¹p, cÇn ph¶i hiÓu râ ho¹t ®éng chøc n¨ng cña mét bé UART

vµ c¸ch t¹o core.

ë ®©y ®Ó ®¬n gi¶n trong viÖc viÕt ch−¬ng tr×nh, bé uart nµy sÏ

lµm viÖc tù ®éng thu ph¸t d÷ liÖu nèi tiÕp, kh«ng thiÕt kÕ c¸c ®−êng

dÉn b¾t tay nh− CTS, RTS, DTR, DSR, kh«ng cã FIFO .

Víi khu«n d¹ng d÷ liÖu cña bé truyÒn sÏ ®−îc truyÒn d−íi d¹ng

sau:

Start d0 d1 d2 d3 d4 d5 d6 d7 Stop Start

H×nh 4.12 Khu«n d¹ng d÷ liÖu ®−îc truyÒn ®i

Khu«n d¹ng d÷ liÖu cña bé thu sÏ ®−îc thu d−íi ®¹ng sau:

S t a r t d 0 d 1

H×nh 4.13. Khu«n d¹ng d÷ liÖu ®−îc thu vÒ

a. Bé ®Öm truyÒn d÷ liÖu :

Bé truyÒn d÷ liÖu sÏ truyÒn nh− sau:

§Çu tiªn sÏ h¹ ®−êng Start xuèng møc thÊp trong mét thêi gian

b»ng tèc ®é Baud, sau ®ã sÏ ph¸t c¸c bit cßn l¹i. §Õn bit Stop, nã sÏ

n©ng ®−êng nµy lªn møc cao.Víi bé thu d÷ liÖu, sÏ dß ®−êng Bit

Start b»ng c¸ch dß s−ên xuèng cña bit nµy, sau ®ã ®Õm clock ®Õn

gi÷a bÝt Start th× ghi l¹i mét bit. TiÕp tôc ®Õm Clock ®Õn gi÷a chu kú

cña bit d0 th× ghi l¹i bit nµy, tiÕp tôc ®Õm cho ®Õn bÝt Stop sau ®ã

ghÐp chóng l¹i thµnh mét byte d÷ liÖu thu ®−îc.

Page 224: Giao trinh fpga

224

Bé UART sÏ cã s¬ ®å khèi chøc n¨ng nh− h×nh 4.14:

UART_RX

BAUDRATE

TIMING

UART_TXTXD

RXD

H×nh 4.14. S¬ ®å khèi chøc n¨ng tæng qu¸t cña bé UART

Nh− vËy s¬ ®å khèi tæng qu¸t cña bé ®iÒu khiÓn Motor b»ng

m¸y tÝnh sÏ nh− sau:

Modul UART Modul Step_MotorSec [3:0]

Start/Stop

Cnt_Dir

Inc/Decpin_rs232_rd

pin_rs232_td Led

Led1

Modul IO XC3s200

Clock Reset

H×nh 4.15. S¬ ®å tæng quan Modul ®iÒu khiÓn ghÐp nèi víi m¸y

tÝnh

Víi Modul Step_Motor nh− ®· ®−îc giíi thiÖu ë trªn, ë ®©y ta

chØ viÖc thu d÷ liÖu, sau ®ã xö lý råi ®−a c¸c ®−êng ®iÒu khiÓn nh−

trªn h×nh sang khèi Step_motor.. C«ng viÖc tiÕp theo lµ viÕt ch−¬ng

tr×nh vµ m« pháng c¸c bé Tx vµ Rx, viÖc xö lý c¸c tÝn hiÖu ®iÒu

khiÓn chØ viÕt thªm mét Process trong modul I/O lµ cã thÓ ch¹y

®−îc. Ch−¬ng tr×nh ®−îc thùc hiÖn víi ng«n ng÷ VHDL, sau ®ã sÏ

®−îc ghÐp víi modul ®iÒu khiÓn motor b»ng phÝm nh− ®· tr×nh bµy.

Tuy nhiªn c¸c ®−êng ®iÒu khiÓn trong modul IO.vhd (phô lôc 2) cÇn

Page 225: Giao trinh fpga

225

ph¶i lµ bé chèt, cã thÓ ch−¬ng tr×nh dich sÏ tù t¹o bé chèt cho c¸c

tÝn hiÖu ®iÒu khiÓn nµy trong FPGA, xong cÇn ph¶i xem th«ng b¸o

sau khi dÞch ch−¬ng tr×nh.

Reset = 1

InitTxD = 1, Bitpos=0, TbufL =0

No

Yes

Enable= 1 ?

TxD=1

Yes

No

LoadS=1?

Tbuff=DataInTbufL = 1,

Busy = TbufL or LoadA

YesNo

TBufL=1?

Yes

BitPos=0?

Treg = TbuffBitPos = BitPos+1

TBufL= 0.

TxD=0

Yes

BitPos=1?

TxD =Treg(BitPos)BitPos = BitPos+1

Yes

Yes

BitPos=10

TxD =Treg(BitPos)BitPos = 0

NoNoNo

H×nh 4.16. L−u ®å thuËt to¸n cña bé ®Öm TxD

S¬ ®å cña bé ®Öm ph¸t cã ®Çu vµo vµ ra khi ch¹y ch−¬ng tr×nh

ECS nh− h×nh 4.17.

Page 226: Giao trinh fpga

226

H×nh 4.17. S¬ ®å vµo ra cña bé ®Öm ph¸t

Sau khi ch¹y ch−¬ng tr×nh m« pháng ta thu ®−îc tÝn hiÖu trªn

®−êng Tx nh− h×nh d−íi ®©y. Gi¶ sö ta n¹p sè 04 Hex ®Ó truyÒn ®i,

khi ®ã trªn ®−êng Tx cã d¹ng xung nh− trong biÓu ®å h×nh 4.18:

H×nh 4.18. BiÓu ®å m« pháng bé ®Öm ph¸t

Page 227: Giao trinh fpga

227

b. Bé ®Öm thu d÷ liÖu: T−¬ng tù, bé ®Öm thu cã l−u ®å thuËt

to¸n nh− h×nh 4.19

Reset = 1

InitRRegL = 0, Bitpos = 0

No

Yes

Enable= 1 ?

SampleCount = 0Bitpos = 1RRegL = 0

Yes

No

RxD = 0 ?

Yes

BitPos=0?

Yes

Yes

BitPos=10

RReg = 1, Bitpos=0DataO = RReg

NoNo

RxAv = 0

ReadA =1 ?

BitPos= 2 - 9No

SampleCount =1 &BitPos >= 2?

RReg (BitPos ) =RxDBitPos = 0

Yes SampleCount = 3 ?

BitPos = BitPos+1

No

SampleCount = 3 ?

SampleCount = 0

SampleCount =SampleCount + 1

Yes

No

Yes

No

No

Yes

RxAv = 1No

Yes

H×nh 4.19. L−u ®å thuËt to¸n bé ®Öm thu d÷ liÖu

Trong ch−¬ng tr×nh Project Navigator ch¹y ch−¬ng tr×nh ECS

ta thu ®−îc s¬ ®å khèi vµo ra cña bé ®Öm thu nh− h×nh 4.20.

Page 228: Giao trinh fpga

228

H×nh 4.20. S¬ ®å khèi vµo ra cña Modul bé ®Öm thu Rx

BiÓu ®å m« pháng cña bé ®Öm thu sau khi cho ®Çu vµo Rx sè

06 Hex, ch¹y ch−¬ng tr×nh ModelSim ta thu ®−îc c¸c tÝn hiÖu ë dÇu

ra Data[7:0] sè 06 Hex nh− biÓu ®å d−íi ®©y:

H×nh 4.21. BiÓu ®å sãng ®Çu ra cña bé ®Öm thu d÷ liÖu Rx

( Xem ch−¬ng tr×nh File Rx.vhd phô lôc 2 )

B©y giê chØ cÇn viÕt thªm mét ®o¹n Process xö lý c¸c Byte nhËn

Page 229: Giao trinh fpga

229

tõ m¸y tÝnh sang ®Ó ®−a ra c¸c ®−êng ®iÒu khiÓn nh− h×nh 4.15.

Trong file IO.vhd khai b¸o thªm mét sè tÝn hiÖu cña Modul

Top_Step (Add thªm component Top_Step ë phÇn ®iÒu khiÓn b»ng

phÝm g¹t nh− ®· giíi thiÖu ë trªn), thªm ®o¹n xö lý Process d−íi

®©y (Xem ch−¬ng tr×nh trong file IO.vhd phô lôc 2):

-----------------------------------------------------

process (charBuf)

Begin

case charBuf is

when x"53" => -- Start

Start <= '0';

when x"42" => -- Stop

Start <= '1';

when x"4C" => -- Left

Cnt_Dir <= '1';

when x"52" => -- Right

Cnt_Dir <= '0';

when x"55" => -- Up

Inc <= '0';

when x"44" => -- Down

Inc <='1' ;

when others =>

Start <= '1';

Cnt_Dir <= '1' ;

Page 230: Giao trinh fpga

230

Inc <= '1';

end case;

end Process;

end arch;

Sau ®ã ®i tæng hîp vµ thùc thi ch−¬ng tr×nh, ta sÏ thu ®−îc c¸c

dÊu tÝch mÇu xanh, ch−¬ng tr×nh Project Navigator sÏ th«ng b¸o

r»ng viÖc thùc thi trªn thiÕt bÞ kh«ng cã lçi nh− ( H×nh 4.22).

H×nh 4.22. Thùc thi ch−¬ng tr×nh trªn Spartan-Xc3S200-5ft256

Thùc hiÖn g¸n ch©n trong ch−¬ng tr×nh Xilinx PACE dïng cho

Board m¹ch Starter Kit Board Spartan-3 víi c¸c ch©n ®−îc g¸n nh−

h×nh 4.23:

Page 231: Giao trinh fpga

231

H×nh 4.23. Cöa sæ g¸n ch©n Spartan-Xc3S200-5ft256

Sau khi dÞch, ch−¬ng tr×nh sÏ t¹o ra file IO.bit, kh¸c víi CPLD,

sau khi dÞch nã t¹o ra file .Jed. Sau ®ã n¹p ch−¬ng tr×nh víi tool

iMPACT tªn file IO.bit vµo thiÕt bÞ. Ch−¬ng tr×nh ®· ®−îc ch¹y thö

nghiÖm bé UART ghÐp nèi m¸y tÝnh th«ng qua phÇn mÒm Hyper

Terminal cña Windows, sau ®ã ®−îc n¹p vµo kÝt Spartan3–

Xc3s200-5ft256 vµ ch¹y thö. B−íc thö nghiÖm trªn Hyper

Terminal lµ b−íc nªn lµm trong lËp tr×nh ghÐp nèi víi PC.

Page 232: Giao trinh fpga

232

H×nh 4.24. Thö nghiÖm trªn HyperTerminal

GhÐp nèi víi ch−¬ng tr×nh Hyper Terminal, khi b¹n gâ bÊt kú

phÝm nµo trªn bµn phÝm, bé UART sÏ tù ®éng thu vµ truyÒn ng−îc

trë l¹i nh− h×nh 4.24.

Nh− vËy toµn bé ch−¬ng nµy ®· giíi thiÖu viÖc thùc hiÖn ®iÒu

khiÓn M«tor víi hai thiÕt bÞ ®Ých kh¸c nhau lµ CPLD vµ FPGA. VÝ

dô nµy ®· ®−îc cho ch¹y trªn thùc tÕ víi m« t¬ ®−îc chän lµ 7.50

b−íc, ®iÖn ¸p cÊp cho ®éng c¬ lµ 5V, ®−îc thö nghiÖm trªn c¶ hai

board m¹ch CPLD XC9572 vµ Spartan3-XC3s200 xem h×nh 4.25 vµ

h×nh 4.26.

Page 233: Giao trinh fpga

233

H×nh 4.25. ¶nh chôp qu¸ tr×nh thö nghiÖm trªn FPGA Spartan3

Page 234: Giao trinh fpga

234

H×nh 4.26. ¶nh chôp qu¸ tr×nh thö nghiÖm trªn CPLD XC9572XL

Page 235: Giao trinh fpga

235

Page 236: Giao trinh fpga

1

Phô lôc ch−¬ng tr×nh 1

Ch−¬ng tr×nh ®iÒu khiÓn m« t¬ sö dông phÝm

thùc hiÖn trªn CPLD XC9572XL

C¸c file ch−¬ng tr×nh:

1. Top_Step.vhd

2. Inc_Dec.vhd

3. Clk_Generator.vhd

4. SecGenerator.vhd

Page 237: Giao trinh fpga

2

---------------------------- Top_Step.vhd -----------------------------

-- ---------------------------------------------

--Author :PHAM TUAN HAI_ Lop Dieu Khien K15 --

--Project:Step_Motor_Controller using KeyPad --

--Modul :Top_Step.vhd --

-- ---------------------------------------------

------------------------------------------------

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Top_Step is Port ( Clk,Reset,Inc,Start,Cnt_Dir : in

std_logic; Sec : out std_logic_vector(3

downto 0); Led,Led1 : Out std_logic ); end Top_Step; ------------------------------------------

------ architecture Behavioral of Top_Step is ------------------------------------------

------ Component Clk_Generator Port ( Clk,Reset : in std_logic; Div : in

Page 238: Giao trinh fpga

3

std_logic_vector(2 downto 0); Clk_Out : Buffer std_logic); end Component Clk_Generator; ------------------------------------------

----------------- Component Inc_Dec Port ( Clk, Reset,Inc,Start,Cnt_Dir

:Std_logic; E,Dir,Led,Led1 : Out Std_logic; DOut : Buffer

std_logic_vector(2 downto 0)); end Component Inc_Dec; ------------------------------------------

----------------- Component SecGenerator Port ( Clk,Reset,E,Dir : in std_logic; Sec : out std_logic_vector(3

downto 0)); end Component SecGenerator; ------------------------------------------

----------------- Signal E,Clk_Step : Std_Logic; Signal SysDiv : Std_Logic_Vector(2 downto

0); signal Dir : Std_logic; --Signal Dec : Std_logic; ------------------------------------------

----------------- ------------------------------------------

------------------- begin X1: Inc_Dec port map (

Clk,Reset,Inc,Start,Cnt_Dir,E,Dir,Led,Led1,SysDiv);

X2: Clk_Generator port map ( Clk, Reset, SysDiv, Clk_Step );

Page 239: Giao trinh fpga

4

X3: SecGenerator port map ( Clk_Step, Reset, E, Dir, Sec);

-----------------------------------------------------------

end Behavioral ; --------------------------- Inc_Dec.vhd---

------------------------------ -- ---------------------------------------

------ --Author :PHAM TUAN HAI_ Lop Dieu Khien

K15 -- --Project:Step_Motor_Controller using Key

-- --Modul : Inc_Dec.vhd

-- -- ---------------------------------------

------ ------------------------------------------

------ library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Inc_Dec is Port ( Clk, Reset,Inc,Start,Cnt_Dir

:Std_logic; E,Dir,Led,Led1 : Out Std_logic; DOut : Buffer

std_logic_vector(2 downto 0)); end Inc_Dec; ------------------------------------------

----------------- architecture Behavioral of Inc_Dec is Signal Dec : Std_logic; ------------------------------------------

Page 240: Giao trinh fpga

5

----------------- begin Dec <= NOT (Inc); ------------------------------------------

----------------- Process(Reset,Clk,Start) begin if Reset = '1' then E <= '1'; elsif Clk'event and Clk = '1' then if Start = '0' then E <= '0'; Led1 <= '0'; elsif Start = '1' then E <='1'; Led1 <= '1'; end if; end if; End Process; ------------------------------------------

----------------- Process (Clk,Cnt_Dir) Begin if Cnt_Dir='0' then Dir <= '1'; led <='0'; else Dir <= '0'; led <= '1'; end if; End process;

------------------------------------------

----------------- Process(Clk, Inc, Dec, Reset) begin

Page 241: Giao trinh fpga

6

If Reset = '1' then DOut <= b"000"; elsif Clk'event and clk='1' then If Inc = '0' then if Dout = "100" then Dout <= "000"; else Dout <= Dout + 1; end if; elsif Dec = '0' then if Dout = "000" then Dout <= "100"; else Dout <= Dout - 1; end if; else Dout <= Dout; end if; end if; end process; end Behavioral; ---------------------------

Clk_Generator.vhd---------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Clk_Generator is Port ( Clk,Reset : in std_logic; Div : in

std_logic_vector(2 downto 0); Clk_Out : Buffer std_logic); end Clk_Generator; architecture Behavioral of Clk_Generator

Page 242: Giao trinh fpga

7

is Signal Count_10MHz : Integer Range 0 to

8000; Signal Count_xms : Integer Range 0 to

8; Signal Clk_1ms : Std_Logic; --signal Clk_Out :Std_logic; begin ------------------------------------- Process( Clk, Reset ) Begin If Reset = '1' then Count_10MHz <= 0; Clk_1ms <= '0'; elsif Clk'event and Clk = '1' then if Count_10MHz = 2 then Count_10MHz <= 0; Clk_1ms <= not(Clk_1ms); else Count_10MHz <= Count_10MHz + 1; end if; end if; end Process; --------------------------------------- Process( Count_xms,Clk_1ms, Reset,

Div,Clk_Out ) Begin If Reset = '1' then Count_xms <= 0; Clk_Out <= '0'; elsif Clk_1ms'event and Clk_1ms = '1'

then if Count_xms < DIV then Count_xms <= Count_xms + 1; else

Page 243: Giao trinh fpga

8

Count_xms <= 0; Clk_Out <= not(Clk_Out); end if; end if; end Process; end Behavioral; -----------------------------

SecGenerator.vhd---------------------- -- ---------------------------------------

------ --Author :PHAM TUAN HAI_ Lop Dieu Khien

K15 -- --Project:Step_Motor_Controller using

KeyPad -- --Modul :SecGenetator.vhd

-- -- ---------------------------------------

------ library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity SecGenerator is Port ( Clk,Reset,E,Dir : in std_logic; Sec : out std_logic_vector(3

downto 0)); end SecGenerator; ------------------------------------------

----------------- architecture Behavioral of SecGenerator is -- Full Step Table : ( x"A", x"9" ,

x"5",x"6" ) -- Half Step Table :

(x"A",x"8",x"9",x"1",x"5",x"4",x"6",x"2") Type States is (Step_0, Step_1, Step_2,

Page 244: Giao trinh fpga

9

Step_3,Step_4,Step_5,Step_6,Step_7); Signal Next_State, Current_State :

States; begin ---------------------- Process( Clk, Reset, E, Dir,

Current_State ) Begin if Reset = '1' then -- Reset ='1'

key Pressed Next_State <= Step_0; Sec <= x"A"; elsif Clk'event and Clk = '1' and E =

'0' then Case Current_State is When Step_0 => Sec <= x"A"; if DIR = '1' then Next_State <= Step_1; else Next_State <= Step_7; end if; When Step_1 => Sec <= x"8"; if DIR = '1' then Next_State <= Step_2; Else Next_State <= Step_0; end if; When Step_2 => Sec <= x"9"; if DIR = '1' then Next_State <= Step_3; Else Next_State <= Step_1; end if;

Page 245: Giao trinh fpga

10

When Step_3 => Sec <= x"1"; if DIR = '1' then Next_State <= Step_4; Else Next_State <= Step_2; end if; When Step_4 => Sec <= x"5"; if DIR = '1' then Next_State <= Step_5; Else Next_State <= Step_3; end if; When Step_5 => Sec <= x"4"; if DIR = '1' then Next_State <= Step_6; Else Next_State <= Step_4; end if; When Step_6 => Sec <= x"6"; if DIR = '1' then Next_State <= Step_7; Else Next_State <= Step_5; end if; When Step_7 => Sec <= x"2"; if DIR = '1' then Next_State <= Step_0; Else Next_State <= Step_6; end if; When Others =>

Page 246: Giao trinh fpga

11

Next_State <= Step_0; end Case; end if; end Process; ------------------------------------------

----------------- Process(Clk) Begin if Clk'event and clk = '1' then Current_State <= Next_State; end if; end process; end Behavioral;

Page 247: Giao trinh fpga

12

Phô lôc ch−¬ng tr×nh 2

Ch−¬ng tr×nh ®iÒu khiÓn m« t¬ b−íc ghÐp nèi PC

thùc hiÖn trªn FPGA Spartan3-XC3S200-5ft256

Page 248: Giao trinh fpga

13

C¸c file ch−¬ng tr×nh:

1. IO.vhd

2. UART.vhd

3. Rx.vhd

4. Tx.vhd

5. COUNTER.vhd

6. Synchroniser.vhd

Vµ c¸c file cña Project Top_Step.vhd trong phô lôc 1.

1. Top_Step.vhd

2. Inc_Dec.vhd

3. Clk_Generator.vhd

4. SecGenerator.vhd

Page 249: Giao trinh fpga

14

-------------------------------------

IO.vhd------------------------------- ------------------------------------------

------ -- ---------------------------------------

------ -- Author : PHAM TUAN HAI_ Lop Dieu Khien

K15 -- -- Project RS232 CONNECTION

-- -- ---------------------------------------

------ ------------------------------------------

------ library IEEE; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; entity IO is port( CLK : in std_logic; Pushbtn : in std_logic; rs232_rd: in std_logic; rs232_td: out std_logic; Led,Led1,pin_led: Out std_logic ; Sec : out std_logic_vector(3 downto 0)); end IO; ------------------------------------------

------------- architecture arch of IO is constant YES: std_logic := '1'; constant NO: std_logic := '0';

Page 250: Giao trinh fpga

15

constant HI: std_logic := '1'; constant LO: std_logic := '0'; signal sysClk : std_logic; signal sysReset : std_logic; -- uart component component uart generic(BRDIVISOR: INTEGER range 0 to

65535 := 130); port( CLK_I : in std_logic; -- clock RST_I : in std_logic; -- Reset input ADR_I : in std_logic_vector(1 downto

0); DAT_I : in std_logic_vector(7 downto

0); DAT_O : out std_logic_vector(7 downto

0); WE_I : in std_logic; -- Write Enable STB_I : in std_logic; -- Strobe ACK_O : out std_logic; -- Acknowledge -- process signals IntTx_O : out std_logic; IntRx_O : out std_logic; BR_Clk_I : in std_logic; TxD_PAD_O: out std_logic; RxD_PAD_I: in std_logic); end component; ------------------------------------------

--------------------------- component Top_step Port ( Clk,Reset,Inc,Start,Cnt_Dir : in

std_logic; Sec : out std_logic_vector(3 downto

0); Led,Led1 : Out std_logic ); End component;

Page 251: Giao trinh fpga

16

-----------------------------------------------------------

-----------------------------------------------------------

-- uart signals signal uart_CLK_I : std_logic; signal uart_RST_I : std_logic; signal uart_ADR_I : std_logic_vector(1

downto 0); signal uart_DAT_I : std_logic_vector(7

downto 0); signal uart_DAT_O : std_logic_vector(7

downto 0); signal uart_WE_I : std_logic; signal uart_STB_I : std_logic; signal uart_ACK_O : std_logic; signal uart_IntTx_O : std_logic; signal uart_IntRx_O : std_logic; signal uart_BR_Clk_I : std_logic; signal uart_TxD_PAD_O: std_logic; signal uart_RxD_PAD_I: std_logic; signal charBuf :std_logic_vector(7

downto 0); signal Inc,Start,Cnt_Dir:std_logic; signal Step_Clk : std_logic; signal Step_Reset : std_logic; signal charAvail :std_logic;

------------------------------------------

--------------------------------------- BEGIN sysClk <= CLK; sysReset <= Pushbtn; uart_ADR_I <= "00"; ------------------------------------------

Page 252: Giao trinh fpga

17

--------------------------------------- ------------------------------------------

-- sysuart: uart generic map(BRDIVISOR =>

1320) port map(CLK_I => uart_CLK_I, RST_I => uart_RST_I, ADR_I => uart_ADR_I, DAT_I => uart_DAT_I, DAT_O => uart_DAT_O, WE_I => uart_WE_I, STB_I => uart_STB_I, ACK_O => uart_ACK_O, --process signals IntTx_O => uart_IntTx_O, IntRx_O => uart_IntRx_O, BR_Clk_I => uart_BR_Clk_I, TxD_PAD_O => uart_TxD_PAD_O, RxD_PAD_I => uart_RxD_PAD_I ); ------------------------------------------

---------------- sysstep:Top_Step port map

(Step_Clk,Step_Reset,Inc,Start,Cnt_Dir,Sec,Led,Led1);

----------------------------------------------------------

--uart port connections/conversions uart_CLK_I <= sysClk; uart_RST_I <= sysReset; Step_Reset <= sysReset; uart_BR_Clk_I <= sysClk; Step_Clk <= sysClk; rs232_td <= uart_TxD_PAD_O; uart_RxD_PAD_I <= rs232_rd; ------------------------------------------

Page 253: Giao trinh fpga

18

--------------------------------------- ------------------------------------------

--------------------------------------- process(Pushbtn,CLK,uart_IntRx_O,

uart_IntTx_O,uart_DAT_O,charBuf,charAvail) begin if Pushbtn = '1' then charBuf <= "00000000"; charAvail <= NO; uart_ACK_O <= '0' ; pin_led <= '1'; elsif CLK'event and CLK = '1' then if(uart_IntRx_O = HI) then charBuf <= uart_DAT_O; charAvail <= YES; uart_WE_I <= LO; uart_STB_I <= HI; uart_ACK_O <= uart_STB_I; pin_led <= '1'; elsif(uart_IntTx_O=HI) then if( charAvail=YES ) then uart_DAT_I <= charBuf; charAvail <= NO; uart_WE_I <= HI; uart_STB_I <= HI; uart_ACK_O <= uart_STB_I; end if; -- pin_led <= '0'; else -- charBuf <= "00000000"; uart_STB_I <= LO; uart_ACK_O <= uart_STB_I; pin_led <= '0'; end if; end if; end process;

Page 254: Giao trinh fpga

19

------------------------------------------------------

process (Pushbtn,charBuf,CLK) Begin if Pushbtn = '1' then Start <= '1' ; Cnt_Dir <= '1'; Inc <= '1'; elsif CLK'event and CLK = '1' then case charBuf is when x"53" => --

Start Start <= '0'; when x"42" => -- Stop Start <= '1'; when x"4C" => --

Left Cnt_Dir <= '1'; when x"52" => -- Right Cnt_Dir <= '0'; when x"55" => -

- Up Inc <= '0'; when x"44" => --

Down Inc <='1' ; when others => Start <= '1'; Cnt_Dir <= '1' ; Inc <= '1'; end case; end if; end Process; end arch; ---------------------------------

Page 255: Giao trinh fpga

20

UART.vhd-------------------------------- ------------------------------------------

------------------- -- Title : UART

--- -- Project : UART --- -- Clock : 50MHz Using Clock of Board

XC3s200 --- -- Author : Pham Tuan Hai_Lop Dieu

Khien K15 --- ------------------------------------------

------------------- ------------------------------------------

------------------- library ieee; use ieee.std_logic_1164.all; entity UART is generic(BRDIVISOR: INTEGER range 0 to

65535 := 130); port ( CLK_I : in std_logic; RST_I : in std_logic; ADR_I : in std_logic_vector(1 downto

0); DAT_I : in std_logic_vector(7 downto

0); DAT_O : out std_logic_vector(7 downto

0); WE_I : in std_logic; STB_I : in std_logic; ACK_O : out std_logic; -- process signals -- Transmit interrupt: indicate waiting

for Byte IntTx_O : out std_logic; IntRx_O : out std_logic;

Page 256: Giao trinh fpga

21

BR_Clk_I : in std_logic; TxD_PAD_O: out std_logic; RxD_PAD_I: in std_logic); end UART; -- Architecture for UART for synthesis architecture Behaviour of UART is ------------------------------------------

------------------ component Counter generic(COUNT: INTEGER range 0 to

65535); port ( Clk : in std_logic; -- Clock Reset : in std_logic; -- Reset

input CE : in std_logic; -- Chip

Enable O : out std_logic); -- Output end component; ------------------------------------------

------------------ component Rx port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; -- Async Read Received Byte . ReadA =1

then no thing to do, ReadA=0 => read ReadA : in Std_logic; RxD : in std_logic; RxAv : out std_logic; DataO : out std_logic_vector(7

downto 0)); end component; ------------------------------------------

------------------

Page 257: Giao trinh fpga

22

component Tx port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; -- Asynchronous Load signal =1 then

transfer Data in input to Buffer, BufL=1 LoadA : in std_logic; TxD : out std_logic; Busy : out std_logic; DataI : in std_logic_vector(7

downto 0)); -- Byte to transmit end component; ------------------------------------------

------------------ -- Signals of uart signal RxData : std_logic_vector(7

downto 0); signal TxData : std_logic_vector(7

downto 0); signal SReg : std_logic_vector(7

downto 0); signal EnabRx : std_logic; -- Enable RX

unit signal EnabTx : std_logic; -- Enable TX

unit -- Data Received =1 Buffer contains a

received byte ,=0 Buffer empty or idle signal RxAv : std_logic; -- Transmiter Busy =1 is Busy , =0 Accept

a byte to transmit signal TxBusy : std_logic; signal ReadA : std_logic; -- Async

Read receive buffer signal LoadA : std_logic; -- Async

Load transmit buffer

Page 258: Giao trinh fpga

23

signal Sig0 : std_logic; -- gnd signal

signal Sig1 : std_logic; -- vcc signal

------------------------------------------------------------

BEGIN sig0 <= '0'; sig1 <= '1'; ------------------------------------------

------------------------------------- Uart_Rxrate : Counter generic map (COUNT => BRDIVISOR) port map (BR_CLK_I, sig0, sig1, EnabRx); ------------------------------------------

------------------------------------ Uart_Txrate : Counter generic map (COUNT => 8) port map (BR_CLK_I, Sig0, EnabRx,

EnabTx); ------------------------------------------

------------------------------------- Uart_Tx : Tx port map (BR_CLK_I, RST_I, EnabTX,

LoadA, TxD_PAD_O, TxBusy, TxData); Uart_Rx : Rx port map (BR_CLK_I, RST_I, EnabRX,

ReadA, RxD_PAD_I, RxAv, RxData); ------------------------------------------

------------------------------------- IntTx_O <= not TxBusy; -- Flag signal TxBusy=1 Transmiter is

Busy ,or IntTx_0 = 0 is Busy IntRx_O <= RxAv; -- RxAv =1 one Byte Received -- RxAv =0 Receiver Buffer empty

Page 259: Giao trinh fpga

24

SReg(0) <= not TxBusy; SReg(1) <= RxAv; SReg(7 downto 2) <= "000000"; ------------------------------------------

------------------------------------- -- Clocked on rising edge. Synchronous

Reset RST_I ------------------------------------------

------------------------------------- WBctrl : process(CLK_I, RST_I, STB_I,

WE_I, ADR_I) variable StatM : std_logic_vector(4

downto 0); begin if Rising_Edge(CLK_I) then --

System Clock rising if (RST_I = '1') then -- if

no Reset ReadA <= '0'; -- ReadA

Signal =0 LoadA <= '0'; -- LoadA

Signal =0 else -- When reset = 0

occured -- Write Byte to Tx if (STB_I = '1' and WE_I = '1' and

ADR_I = "00") then -- Get input connect to TxData input

signal of Transmiter TxData <= DAT_I; -- Async transmit buffer Load signal ,

load data into Transmiter LoadA <= '1'; else LoadA <= '0'; end if; -- Read Byte from Rx

Page 260: Giao trinh fpga

25

if (STB_I = '1' and WE_I = '0' and ADR_I = "00") then

-- DAT_O <= RxData; -- Out Data to Bus -- Async receive buffer Read signal

connects to ReadA input of Receiver ReadA <= '1'; -- Signal is used

to read buffer, ReadA=1 => Read else ReadA <= '0'; end if; end if; end if; end process; ------------------------------------------

------------------------------------- ACK_O <= STB_I; DAT_O <= RxData when ADR_I = "00" else -- Read

Byte from Rx SReg when ADR_I = "01" else -- Read

Status Reg "00000000"; end Behaviour; --------------------------------------

Rx.vhd----------------------------- ------------------------------------------

------------------- -- Title : UART --- -- Project : UART --- -- Clock : 50MHz --

- -- Author : Pham Tuan Hai

--- ------------------------------------------

------------------- library ieee; use ieee.std_logic_1164.all;

Page 261: Giao trinh fpga

26

entity Rx is port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; ReadA : in Std_logic; RxD : in std_logic; RxAv : out std_logic; DataO : out std_logic_vector(7

downto 0)); end Rx; ------------------------------------------

------------------------------------- architecture Behaviour of Rx is signal RReg : std_logic_vector(7 downto

0); signal RRegL: std_logic; begin ------------------------- RxAv process----

------------------------ RxAvProc : process(RRegL,Reset,ReadA) begin if ReadA = '1' or Reset = '1' then RxAv <= '0'; elsif Rising_Edge(RRegL) then RxAv <= '1'; end if; end process; ----------------------- Rx Process--------

------------------------- RxProc :

process(Clk,Reset,Enable,RxD,RReg) variable BitPos : INTEGER range 0 to 10; variable SampleCnt : INTEGER range 0 to

3;

Page 262: Giao trinh fpga

27

begin if Reset = '1' then RRegL <= '0'; BitPos := 0; elsif Rising_Edge(Clk) then if Enable = '1' then case BitPos is when 0 => RRegL <= '0'; if RxD = '0' then SampleCnt := 0; BitPos := 1; end if; when 10 => BitPos := 0; RRegL <= '1'; DataO <= RReg; when others => if (SampleCnt = 1 and

BitPos >= 2) then RReg(BitPos-2)<=RxD ; end if; if SampleCnt = 3 then BitPos := BitPos + 1; end if; end case; -- if SampleCnt = 3 then SampleCnt := 0; else sampleCnt := SampleCnt + 1; end if; -- end if; end if; end process;

Page 263: Giao trinh fpga

28

end Behaviour; ------------------------------------

Tx.vhd-------------------------------- ------------------------------------------

------------------- -- Title : UART --

- -- Project : UART --- -- Clock : 50MHz --

- -- Author : Pham Tuan Hai

--- ------------------------------------------

------------------- ------------------------------------------

------------------- library ieee; use ieee.std_logic_1164.all; entity Tx is port ( Clk : in std_logic; Reset : in std_logic; Enable : in std_logic; LoadA : in std_logic; TxD : out std_logic; Busy : out std_logic; DataI : in std_logic_vector(7

downto 0)); end Tx; ------------------------------------------

--------------------------- architecture Behaviour of Tx is ------------------------------------------

--------------------------- component synchroniser port (

Page 264: Giao trinh fpga

29

C1 : in std_logic; C : in std_logic; O : out Std_logic); end component; signal TBuff : std_logic_vector(7 downto

0); signal TReg : std_logic_vector(7 downto

0); signal TBufL : std_logic; signal LoadS : std_logic; ------------------------------------------

-------------------------------------begin

-- Begin of Architech -- Synchronise Load on Clk SyncLoad : Synchroniser port map (LoadA,

Clk, LoadS); Busy <= LoadS or TBufL; -- Tx process ------------------------------------------

----------------------- TxProc : process(Clk, Reset, Enable,

DataI, TBuff, TReg, TBufL) variable BitPos : INTEGER range 0 to 10; begin if Reset = '1' then TBufL <= '0'; BitPos := 0; TxD <= '1'; elsif Rising_Edge(Clk) then if LoadS = '1' then TBuff <= DataI; TBufL <= '1'; end if; if Enable = '1' then case BitPos is

Page 265: Giao trinh fpga

30

when 0 => TxD <= '1'; if TBufL = '1' then TReg <= TBuff; TBufL <= '0'; BitPos := 1; end if; when 1 => TxD <= '0'; BitPos := 2; when others => TxD <= TReg(BitPos-2); --

Serialisation of TReg BitPos := BitPos + 1; end case; if BitPos = 10 then --

bit8. next is stop bit BitPos := 0; end if; end if; end if; end process; end Behaviour; -------------------------------

COUNTER.vhd----------------------------- ------------------------------------------

------------------- -- Title : UART

--- -- Project : UART --- -- Clock : 50MHz --

- -- Author : Pham Tuan Hai

--- ------------------------------------------

-------------------

Page 266: Giao trinh fpga

31

-------------------------------------------------------------

library IEEE,STD; use IEEE.std_logic_1164.all; entity Counter is generic(Count: INTEGER range 0 to

65535); -- Count revolution port ( Clk : in std_logic; -- Clock Reset : in std_logic; -- Reset

input CE : in std_logic; -- Chip

Enable O : out std_logic); -- Output end Counter; ------------------------------------------

---------------------- ------------------------------------------

---------------------- architecture Behaviour of Counter is begin counter : process(Clk,Reset) -- Variable Cnt is using temple count

variable variable Cnt : INTEGER range 0 to

Count-1; begin if Reset = '1' then Cnt := Count - 1; O <= '0'; elsif Rising_Edge(Clk) then if CE = '1' then -- if Cnt = 0 then O <= '1';

Page 267: Giao trinh fpga

32

Cnt := Count - 1; else O <= '0'; Cnt := Cnt - 1; end if; -- else O <= '0'; end if; end if; end process; end Behaviour; --------------------------

Synchroniser.vhd------------------ ------------------------------------------

------------------- -- Title : UART --- -- Project : UART --- -- Clock : 50MHz --- -- Author : Pham Tuan Hai

--- ------------------------------------------

------------------- ------------------------------------------

------------------- library IEEE,STD; use IEEE.std_logic_1164.all; entity synchroniser is port ( C1: in std_logic; -- Asynchronous

signal C : in std_logic; -- Clock O : out std_logic); -- Synchronised

signal end synchroniser; ------------------------------------------

Page 268: Giao trinh fpga

33

------------------------- architecture Behaviour of synchroniser is signal C1A : std_logic; signal C1S : std_logic; signal R : std_logic; begin RiseC1A : process(C1,R) begin if Rising_Edge(C1) then C1A <= '1'; end if; if (R = '1') then C1A <= '0'; end if; end process; ------------------------------------------

------------------------- SyncP : process(C,R) begin if Rising_Edge(C) then if (C1A = '1') then C1S <= '1'; else C1S <= '0'; end if; if (C1S = '1') then R <= '1'; else R <= '0'; end if; end if; if (R = '1') then C1S <= '0'; end if; end process; O <= C1S;

Page 269: Giao trinh fpga

34

end Behaviour;

Page 270: Giao trinh fpga

35

Tμi liÖu tham kh¶o

1. NguyÔn T¨ng C−êng, Phan Quèc Th¾ng, Vò H÷u NghÞ

(2002), CÊu tróc

m¸y tÝnh, Häc viÖn kü thuËt qu©n sù, Hµ Néi.

2. NguyÔn T¨ng C−êng, Phan Quèc Th¾ng, TrÇn V¨n Hîp

(2002), CÊu tróc

c¸c hÖ xö lý tÝn hiÖu sè, Häc viÖn kü thuËt qu©n sù, Hµ

Néi

3. NguyÔn T¨ng C−êng, Phan Quèc Th¾ng (2003), CÊu tróc vµ

lËp tr×nh hä

vi ®iÒu khiÓn 8051, Häc viÖn kü thuËt qu©n sù, Hµ Néi.

4. V¨n ThÕ Minh (1998), Kü thuËt vi xö lý, NXB Gi¸o dôc, Hµ

Néi

5. §ç Xu©n TiÕn (1991), Kü thuËt vi xö lý, Häc viÖn kü thuËt

qu©n sù, Hµ

Néi.

6. David Harris (1955) Structural Design With Verilog Harvey

Mudd

College.

7. Donnamaie E. White (2002), Logic Design for Array-Based

Circuits,

Original Hardcover – Still, London.

8. Don Davis (Winter 2002), “Architectural Synthesis:

Unleashing the

Page 271: Giao trinh fpga

36

Power of FPGA System-Level Design”, Xcell Journal,

(Issue 44),

pages 30–34, Xilinx, United States of America.

9. Giovanni De Micheli, Rajesh K. Gupta (3/1997),

“Hardware/Software

Co-Design”, Proceedings of the IEEE, (Vol. 85, No 3),

pages 349 – 64.

10. Daniel Tabak (1995), Advanced Microprocesors, McGraw-

Hill, United

States of America.

11. Donnamaie E. White (2002), Logic Design for Array-Based

Circuits,

Original Hardcover – Still, London.

12. Don Davis (Winter 2002), “Architectural Synthesis:

Unleashing the

Power of FPGA System-Level Design”, (Issue 44),

pages 30 – 34,

13. Michael John Sebastian Smith (1997), Application-Specific

Integrated

Circuits, Hardcover (www.Amazon.com), United

States of

America.

14. Peter J.Ashenden (1990), The VHDL CooKBook, University

of Adelaide,

Page 272: Giao trinh fpga

37

South Australia.

15. Roger Lipsett & Carl Schaefer (1989), VHDL: Hardware

Description

and Design, Kluwer Academic Publishers, United

States of

America.

16. Nguån tham kh¶o tõ Internet

http://support.xilinx.com/support/techsup/tutorials/index.htm

http://support.xilinx.com/ xlnx/xil_ans_brower.jsp

http://support.xilinx.com/apps/appsweb.htm

http://support.xilinx.com/

xlnx/xweb/xil_publications_index.jsp