Giao Trinh Fpga
-
Upload
paul-warburg -
Category
Documents
-
view
100 -
download
2
Transcript of 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.
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
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
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¶
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
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
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
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
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Ó
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.
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:
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
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.
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,
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,
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.
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
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
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
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
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,
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.
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
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:
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:
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 ....
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.
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 :
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
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
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.
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.
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,
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.
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:
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:
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ö
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í
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 ).
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
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
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
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.
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
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 :
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
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
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µ
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,
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
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
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
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:
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:
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
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.
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
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
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
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
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
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
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
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µ
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,
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ã
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
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µ
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
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 .
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.
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;
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.
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
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 :
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
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)
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Ï:
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
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".
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:
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"
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.
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 .
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 => ,
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;
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
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.
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.
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.
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
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
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µ
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æ
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
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
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
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
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ö
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
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.
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,
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.
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
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:
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
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 ;
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:
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);
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 ).
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' ;
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
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
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;
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
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
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
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
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.
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) ;
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
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ý
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;
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
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
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' ),
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;
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è
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
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
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);
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
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
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.
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
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:
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
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
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µ
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.
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.
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
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; . . .
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
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
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.
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:
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:
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
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
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
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.
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;
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
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
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:
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;
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.
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.
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.
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];
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;
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
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 ;
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:
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
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;
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:
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
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.
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è.
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);
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:
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
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;
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
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
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
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.
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ô:
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
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
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é
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;
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);
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:
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
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 );
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:
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);
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 :
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.
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.
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é.
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
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 ".
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:
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 );
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
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 ;
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
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
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 .
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
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
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};
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.
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.
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:
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.
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
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
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¬.
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
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.
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
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
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
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
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
-----------------------------------------------------------------------------
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()
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
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.
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
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.
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
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.
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
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' ;
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:
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.
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.
233
H×nh 4.25. ¶nh chôp qu¸ tr×nh thö nghiÖm trªn FPGA Spartan3
234
H×nh 4.26. ¶nh chôp qu¸ tr×nh thö nghiÖm trªn CPLD XC9572XL
235
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
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
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 );
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; ------------------------------------------
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
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
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
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,
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;
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 =>
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;
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
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
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';
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;
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"; ------------------------------------------
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; ------------------------------------------
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;
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; ---------------------------------
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;
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; ------------------------------------------
------------------
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
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
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
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;
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;
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;
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 (
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
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
--- ------------------------------------------
-------------------
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';
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; ------------------------------------------
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;
34
end Behaviour;
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
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,
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