Professional Documents
Culture Documents
Li gii thiu
Khai thc, nghin cu c bn cng ngh mi l bc khng th thiu trong
vic ci tin, nng cao, cng nh ch to mi cc trang thit b qun s v dn s
nhm p ng vic hin i ho cng nghip ho ca t nc. Cng vi s pht
trin vt bc ca nghnh cng ngh thng tin, cc cng ngh mi v cc mch tch
hp vi in t, cc mch t hp logic lp trnh c ra i lm cho cc sn phm
qun s cng nh dn s ngy cng hon thin v u vit hn. tin mt bc xa
hn trong vic ci tin, ch to kh ti qun s nhm p ng chin tranh in t
hin i vi tc x l cc k cao, i hi phi c cng ngh tin tin ph hp vi
tnh hnh chung ca th gii.
Trn c s pht trin t cc chp PLA, hin nay cng ngh na n c a
vo ch to cc mch tch hp lp trnh c FPGA v CPLD, n lm cho
mch tch hp logic ln n hng chc triu cng, tc ng h ln n 500 MHz.
ng dng cng ngh mi vo trong thit k ch to cc thit b in t lp trnh
PLIC l mt bc cn thit cho tng lai vi mt nc ang pht trin nh Vit
Nam. p ng c tnh bo mt trong qun s cng nh tnh phn ng nhanh
trong chin tranh hin i cng vi nhu cu chuyn dng ho, ti u ho (thi gian,
khng gian, gi thnh ), tnh ch ng trong cng vic... ngy cng i hi kht
khe. Vic a ra cng ngh mi trong lnh vc ch to mch in t p ng
nhng yu cu trn l hon ton cp thit mang tnh thc t cao. Cng ngh FPGA
(Field Programmable Gate Array) v CPLD (Complex Programmable Logic
Device) c cc hng ln tp trung nghin cu v ch to, in hnh l Xilinx v
Altera. lm ch cng ngh mi v t chc thit k sn xut cng ngh FPGA
ca Xilinx cho php chng ta t thit k nhng vi mch ring, nhng b x l s
ring dnh cho ng dng ca chng ta. c bit trong lnh vc x l tn hiu s, cc
mch tch hp dng nhn dng m thanh, hnh nh, cm bin ... vi tnh mm do
cao v gi thnh thp.
Mc d cng ngh FPGA xut hin t nm 1985, xong i vi nc ta th
n vn cn rt mi. Do vy tm hiu, lm ch v cng ngh FPGA l vic lm hon
ton cn thit. N khng ch c ngha i vi cc lnh vc in t - Vin thng,
2
cng ngh thng tin... m n c ngha c bit quan trng trong lnh vc an ninh
quc phng.
Xut pht t thc t i hi cp bch , b mn T ng v K thut tnh
Khoa K thut iu khin Hc Vin K thut qun s cho xut bn cun sch
Thit k thit b in t lp trnh s dng cng ngh FPGA v CPLD, ti liu ny
nm trong lot cc ti liu c b mn n hnh, bao gm Cu trc my tnh,
Cu trc v lp trnh cho cc h x l tn hiu s, cu trc v lp trnh h vi iu
khin.
Ti kiu gii thiu phng php thit k CPLD, FPGA cng nh ngn ng lp
trnh, t i su nghin cu cc gii php c lin quan cng nh cc cng c h
tr thit k, sau p dng thit k, tch hp vo loi CPLD v FPGA c th . Ti
liu c chia thnh 4 chng:
- Chng 1: Gii thiu tng quan t chc phn cng ca ASIC. Gii thiu
tng quan t chc cc h thit b cng nh cu trc ca chng (ti liu gii thiu cu
trc ASIC ca hng Xilinx).
- Chng 2: Gii php v t chc phn mm m bo. Gii thiu cc phn
mm h tr thit k, ngn ng lp trnh.
- Chng 3: Ngn ng lp trnh VHDL
- Chng 4: Thit k ng dng c bn. Chng ny c thc hin vi vic
tch hp cc mch in t trn c s s dng ngn ng VHDL, thit k b iu
khin ng c bc trn hai h thit b CPLD v FPGA.
Cun sch c dng lm gio trnh ging dy bc i hc v sau i hc
chuyn ngnh in, in t hoc lm ti liu tham kho cho cc nghin cu sinh v
cho nhng ai quan tm n cu trc v lp trnh ASIC.
Cun sch c bin son bi PGS. TS. Nguyn Tng Cng v TS. Phan
Quc Thng, ThS. Phm Tun Hi, KS L Trng Ngha, do PGS. TS. Nguyn Tng
Cng ch bin.
Nhn dp ny, tp th tc gi xin by t li cm n chn thnh nht n nhng
ngi c nhiu ng gp trong qu trnh hon thnh ti liu, n cc anh ch em
B mn T ng v K thut tnh thuc Khoa K thut iu khin, Hc vin K
thut Qun s, c bit phi k n s h tr hiu qu ca TS. nh Ngha.
Do kinh nghim v thi gian hn ch, ti liu ny chc chn khng th trnh
3
vic in p 2.5 Volt (XC9500 XV), 3.3 Volt (XC9500 XL), 5 Volt (XC9500 ).
Cc thit b ny cho php lp trnh mc h thng ISP, iu ny cho php s
dng li cc thit k trong sut thi gian th mu, g ri h thng, nng cp, test
trc khi xut xng.
Da vo cc k thut x l tin tin, h XC9500 a ra s bo hnh nhanh
(Ch cn file chng trnh c ng gi v np li), cho php kho chn ngi
dng, giao tip c vi chun JTAG. Tt c cc h XC9500 c c tnh tin cy
tuyt vi vi 10.000 ln np xo v lu tr d liu trong vng 20 nm.
- H XC9500 5 V : L mt trong s 6 thit b di t 36 n 288 Macrocell vi
cc kiu ng gi chn a dng. Cc chn vo ra cho php giao tip trc tip vi h
thng 3V v 5 V (VccIO - chn giao tip ngi dng), vi cc phin bn mi n tr
nn rt d s dng vi cc ng gi theo kiu CSP (Chip Scale Package), BGA (Ball
Grid Array) v cho php truy cp n 192 tn hiu.
* Cu trc kho chn linh hot :
Cng vi phn mm fitter a ra kh nng nh tuyn ln nht, mm do
trong thc thi. Vi cu trc c giu c tnh, cho php a ra nhiu tch s nhn
ring bit, c ba b ng h ton cc, c nhiu tch s nhn trn u ra hn cc loi
CPLD khc.
Cc tnh nng v cu trc ca loi ny rt thch nghi vi vic sa i thit k
trong qu trnh thit k.
* Tr gip g ri v pht trin giao tip vi JTAG IEEE 1149.1: Giao tip
JTAG ca h XC9500 thng minh hn bt c h CPLD no c mt trn th trng.
N c cc c tnh chun h tr k thut hi vng, ly mu, kim tra m rng.
Hn na n gm c cc ch dn qut bin m cc loi CPLD khc khng c,
n bao gm INTEST (dng cho kim tra chc nng ca thit b ), HIGHZ ( dng
cho k thut hi vng ).
H XC9500 5V ny a ra nhiu chun cng nghip pht trin th h th ba,
cc cng c g ri nh Corelis , JTAG, Assert Intertech.
Cc cng c ny cho php bn pht trin cc vc t test vng bin phn tch
s nh hng ln nhau, test, g ri li h thng.
17
cung cp bi ngi dng chng hn nh Vref. Trng hp ny, cc chn I/O ngi
dng c xp t t ng nh cc u vo cho in p ly mu Vref. Khong mt
trong 6 cc chn vo ra ca cc Bank ng vai tr ny.
- Cc chn Vref trong mt bank c ni bn trong v v vy ch mt in p
Vref c th c s dng trong mi bank .Tt c cc chn Vref trong cc bank cn
phi c ni vi ngun in p bn ngoi chng hot ng ng.
c s trao i nhanh gia cc tn hiu, cc chn tn hiu u vo cn phi
c cung cp trc khi ngun cp vo chn Vccint v chn Vcco v phi m bo
khng c ng dn dng ngc t cc chn I/O quay v in p ngun cung cp
Vccint v Vcco (C ngha l m bo cho thit b c th hot ng mt in p v
giao tip mt in p, hai in p ny c th khc nhau ).
Configurable Logic Blok v Logic Cell:
- Cc n v c bn ca CLB (Khi logc cho php nh cu hnh) thuc h
thit b Spartan-IIE chnh l cc Logic Cell ( LC - Xem hnh 1.5 v hnh 1.6 mc 1.1
chng I ). Mi mt Logic Cell bao gm mt b to chc nng (Hay b to hm)
gm 4 u vo, phn t logic nh v phn t lu tr (Flip-Flop loi D).
- u ra ca b to chc nng ca mi Logic Cell iu khin c u ra CLB
hoc u vo D ca Flip-Flop.
- Mi mt CLB c cha bn Logic Cell v c t chc thnh hai Slice tng
t nhau, mt slice n c dng nh (hnh 1.12).
- Thm vo bn b LC c bn, cc CLB ca Spartan-IIE c cha phn t logic
m n kt hp vi cc b to chc nng a ra cc chc nng 5 hoc 6 u vo .
Look-Up tables (LUT):
- Cc b to chc nng ca Spartan -IIE thc hin nh LUT c bn u vo.
hot ng nh mt b to chc nng, mi mt LUT c th cung cp mt RAM
16x1bit ng b.
- Hn na hai LUT trong mt Slice c th c kt hp to mt RAM 16x2
bit hoc 32x1 bit ng b .
Storage Element:
26
Hnh 1.12 .Cu trc Logic Cell hay mt Slice n trong Spartan -IIE
- Cc phn t lu tr trong slice ca Spartan-IIE c th c xem nh mt
Flip-Flop loi D kch hot bng sn, hoc nh mt b cht nhy mc. Cc u vo
D c th c iu khin hoc bi b to chc nng trong slice hoc trc tip t u
vo cc slice (b qua b to chc nng). Thm vo cc ng Clock (CLK) v Clock
Enable (CE) (hnh 1.12), mi Slice c cc tn hiu set v reset ng b (SR v BY).
ng SR p cc phn t lu tr v trng thi khi to, c bit trong trng hp
nhi cu hnh. ng BY p phn t lu tr v trng thi ngc li. C th la chn
hai ng ny chng hot ng khng ng b.
Tt c cc tn hiu iu khin c th o ngc mt cch hon ton c lp v
chng c chia s bi hai Flip-Flop trong mt Slice.
Arithmetic Logic: B dn knh F5IN trong mi Slice c kt hp vi cc
u ra b to chc nng c ch ra hnh 1.13.
27
I/O Cell :
M t tm tt:
- M phng chc nng : Ti giai on ny, s phng chc nng ch kim tra
nhng t hp ng ca khng v mt m mch nguyn l a ra. Ngi thit k s
a ra ch dn s m phng v thi gian ngay sau theo cc bc trong lung thit
k ny. Nu nh c chc nng no khng ng, cn phi quay li s nguyn l
hoc file HDL (Xem hnh 1.26) v sa i li, to li file Netlist v sau cho chy
li b m phng. Nhng ngi thit k thng mt khong 50% thi gian vo vic
sa i i qua bc ny cho n khi thit k t theo yu cu mong mun . Vic
s dng file HDL c rt nhiu thun li khi kim tra thit k : Ngi thit k c th
m phng trc tip t file ngun HDL, iu ny cho php b qua thi gian tiu tn
trong qu trnh tng hp m thi gian ny thng c yu cu mi khi thay i
thit k. Mt thit k khi lm vic ng, chy cng c tng hp to ra file
Netlist cho cc bc tip theo trong qu trnh thit k .
- Thc thi trn thit b : Mt file Netlist cu thit k m t hon ton y
mt thit k m thit k ny s dng th vin cc cng ca nh phn phi ca mt
h thit b no v t nht n cng i qua bc kim tra. n lc a file
ny vo trong mt chip v iu ny c xem nh s thc hin trn thit b.
Bin dch bao s gm nhiu chng trnh s c s dng, cc chng trnh
ny nhp file Netlist ca thit k c dch v dng n b tr, xp xp cc
cng logic. Cc chng trnh ny s khc nhau vi cc nh phn phi th vin khc
nhau.
Cc chng trnh tham gia vo qu trnh bin dch bao gm: Chng trnh ti
u ho, dch cc phn t ca thit b vt l, kim tra cc qui lut thit k vi thit b
c th no (xem n c vt qua s b m Clock cho php trong thit b ny
khng ?... ).
Trong sut giai on thit k, ngi thit k s c hi chn thit b ch,
ng gi, cp v cc chn la khc i vi thit b c n nh . Thng thng
qu trnh bin dch kt thc vi mt bo co kt qu bao hm ton b cc chng
trnh c thc hin. Thm vo cc cnh bo li, dng bn k ca thit b v
vic s sng cc ng vo ra. Chnh iu ny gip ngi thit k la chn c
40
thit b ch tt nht.
- Lp t trn thit b: i vi h CPLD th bc ny c gi l lp t, c
ngha l a thit k vo trong thit b ch (iu chnh cho ph hp vi ngun ti
nguyn ca thit b ch). Trong hnh v 1.26 trn, c mt phn ca thit k c
gi l lp t vo trong CPLD. Cc CPLD c cu trc c nh , v th nn phn mm
cn ly cc cng v cc ng ni ph hp vi mch thit k. Cng vic ny thng
c phn mm x l rt nhanh bng phn mm. Mt vn khc na c kh nng
xy ra l vic gn v tr ca cc chn vo ra (Thng c gi l s kho chn I/O)
c th b thc hin trc. Thng th iu ny hay xy ra khi dng li mt thit
k m thit k ny c tha hng, hoc thit k ny c np vo board mch
in ca thit k no .
Cc cu trc m n cung cp vic kho cc chn vo ra (chng hn nh XC
9500, CoolRunner CPLDs ) c s thun tin rt ln . Chng cho php gi li cc
chn vo ra gc, bt k thit k thay i hay c s tn dng no , hoc c s thc
hin theo yu cu no . S kho chn rt quan trng khi s dng ISP (In system
Programmable Device - Cho php lp trnh trong h thng), nu mch in v v
ni vi cc chn vo ra, sau thit k b thay i v np li chng trnh, bn hy
yn tm l cc chn ny vn c gi nguyn .
- Sp t v nh tuyn :
Vi h FPGA, chng trnh xp t v nh tuyn c chy sau khi bin dch.
Xp t chnh l qu trnh chn la cc module c th hoc cc khi logic trong
FPGA ni m cc cng ca thit k s nm trong .
nh tuyn n mang ng ngha ca n, chnh l vic ni vt l cc ng
ni gia cc khi logic. Hu ht cc nh phn phi cung cp cng c t ng sp t
v nh tuyn, v th bn khng phi lo lng v cc chi tit kh hiu phc tp ca
cu trc thit b.
Mt s nh phn phi a ra cng c cho php bn sp t v nh tuyn bng
tay nhng phn then cht nht ca thit k, c th thu c s thc hin tt hn
cng c t ng.
B to s mt bng b tr cc phn t logic l mt kiu ca cng c s dng
41
bng tay.
Chng trnh sp t v nh tuyn cn nhiu thi gian nht hon thin
thnh cng mt thit k, bi v n l cng vic rt phc tp xc nh ni t
nhng thit k ln v m bo rng chng c ni vi nhau chnh xc v p ng
c s thc hin nh mong mun.
Tuy nhin cc chng trnh ny ch c th lm vic tt nu cu trc ca thit b
ch c s nh tuyn ph hp vi thit k.
Bn khng th sa m chng trnh b mt cu trc c hnh thnh sai
lch, c bit nu cu trc ca thit b khng nh tuyn cc ng ni. Nu
nh gp phi vn ny, th gii php chung nht l chn mt thit b ch ln hn.
Mt b phn tch thi gian tnh thng thng l mt phn ca phn mm thc
thi ca nh phn phi. N cung cp thng tin v thi gian ca cc ng dn trong
thit k, thng tin ny rt chnh xc v c th hin th theo nhiu cch khc nhau.
Chng hn nh hin th tt c cc ng ni v xp loi chng t gi chm
di nht n gi chm ngn nht.
Hn na khi ny bn c th s dng thng tin xp t c chi tit ho sau
khi nh dng v quay tr v b m phng c chn vi cc thng tin chi tit v
thi gian.
Qa trnh ny c gi l ch thch ngc (hay thng tin phn hi), n c s
thun li trong vic cung cp chnh xc thi gian ca s thc hin cc s khng v
cc s mt trong thit k cu bn. Trong c hai trng hp, thi gian phn nh s
gi chm ca cc khi logic cng nh cc ng ni.
Bc thc hin cui cui cng l ti hay np cu hnh xung thit b.
- Ti hay np chng trnh:
Ti chng trnh nhn chung c xem nh l ti thng tin xung thit b d
bin i nh SRAM FPGA . ng vi tn gi ca n, bn ti thng tin cu hnh
thit b vo trong b nh ca thit b.
Lung cc bit m n c truyn i c cha tt c cc thng tin nh ngha
logic v cc ng ni cu thit k, thng tin ny s l khc nhau i vi thit k
khc nhau. Xem hnh 1.27.
42
Chng II
Gii php v t chc phn mm m bo
2.1. Gii thiu s lc
Thit k logic lp trnh c a ra k nguyn m trong mt ca thit
b n v hng triu cng, s thc hin ca h thng tc hng trm MHz.
Xilinx a ra cc cng c thit k in t hon ton y m n cho php
thc hin cc thit k trong h PLD ca Xilinx. Cc gii php pht trin kt hp vi
cc k thut mnh to ra mt s linh hot, mm do, giao tip ho d s dng
gip bn c c cc thit k tt nht c th trong mt d n ln - m khng cn
quan tm n kinh nghim ca bn. Cng c phn mm thit k ISE (Integrated
Sofware Enviroment- Mi trng phn mm tch hp) l cng c thit k tng th,
bao hm cc cng c phn mm thit k chuyn dng khc nhau v y cng l
cng c c s dng nhiu nht trong thit k cc PLD (Programmable Logic
Device) ca Xilinx.
2.2. Cc cng c thit k
Phn mm ISE ci thin ng k thi gian a mt sn phm ra th trng bi
vic tng tc qu trnh nhp thit k. Cc bc thc hin mt thit k c cung cp
trong phn mm ISE, ngoi ra chng cn c h tr thm bi cc phn mm b
xung khc. tin cho vic nm bt v phn loi cc loi phn mm chng ta s i
m t phn ny theo th t thc hin ca mt thit k .
2.2.1 Nhp thit k
Cc cng c h tr cc phng php ph bin nht ngy nay vic to ra mt
thit k bao gm : Nhp thit k bng s , bng ngn ng HDL, bng vic tch
hp cc li IP, h tr mnh m vic ti s dng cc li IP. S a dng ca vic nhp
mt thit k a ra mt mi trng thit k d s dng nht v cho php vi tt
c cc thit k logic. N bao gm cc cng c thit 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 Transceiver), Xilinx System Generator for DSP.
44
1. Nhp thit k: Chn Start-> Program-> Xilinx ISE 6-> Project Navigator.
Chn New Project trong menu File, t project l Traffic v t trong th mc
Traffic.
RESET RED
RD = '1';
TIMER
TIMER
REDAMB
AMBER
RD = '1';
AMB = '1'; AMB = '1';
TIMER
TIMER
GREEN
GRN = '1';
RESET RED
RD = '1';
TIMER[3:0]
TIMER="1111"
TIMER="0000"
REDAMB
AMBER
RD = '1';
AMB = '1'; AMB = '1';
TIMER="0011" TIMER="0100"
GREEN
GRN = '1';
Hnh 2.23. Cc nhm trng thi sau khi son tho xong
Chn cng c Add Wire bng vic kch vo biu tng , sau ni hai
ng clock v reset ca hai khi li, ng count ni vi ng timer. Sau chn
Add Net Name c biu tng ch abc , lc ny nhp Net xut hin, ta g
clock sau n Enter, t vo net clock, lm tng t vi cc net cn li .
b ch m khng c li.
Hnh 2.33. Cc thng bo hon thnh vic bin dch trong ca s Process
Khi ny b phn tch thi gian cng c t ng thc hin v chng trnh
a ra cc thng bo ca Fitter v Timing. Lc ny bn c th xem cc thng bo v
li, v logic, u vo, u ra, danh sch cc chn...bng vic kch vo cc dng
thng bo bn tri trong ct Fitter Report.
k di dng VHDL sang file Nestlist c ui '.NGC '. Bc thc thi s ly file ny
v file rng buc ngi dng to li thit k m n s dng cc ti nguyn cho
php trong FPGA. Sau qu trnh xp xp s phn chia thit k vi cc ti nguyn
cho php trong FPGA, n s dng file .UCF qun l thi gian c gn v quyt
nh a ra xem c th a thm hoc ti to li cc n v logic ph hp vi thi
gian c yu cu. Cc bc thc thi trn FPGA gm bn bc c bn sau y:
- Tng hp thit k
- Lp t
- M phng thi gian
- Np chng trnh
Trong mc ny chng ta s tip tc i thc thi v d b iu khin n tn hiu
giao thng trn Spartan-3 FPGA. Quay li thit k vi CPLD trong ca s Sources
ca Project Navigator nhy p vo dng xc2c256-7tq144-XST VHDL v chn
cc thng s ca FPGA nh hnh sau.
Chng III
Gii thiu ngn ng VHDL
3.1. Cc cu trc c bn ca ngn ng VHDL.
Cc thnh phn chnh xy dng trong ngn ng VHDL c chia ra thnh nm
nhm c bn nh sau:
- Entity
- Architecture
- Package
- Configuration.
- Library.
Entity: Trong mt h thng s, thng thng c thit k theo mt s xp
chng cc modul, m mi Modul ny tng ng vi mt thc th thit k ( c gi
l Entity ) trong VHDL. Mi mt Entity bao gm hai phn :
- Khai bo thc th ( Entity).
- Thn kin trc ( Architecture Bodies )
Mt khai bo Entity c dng m t giao tip bn ngoi ca mt phn t
(component), n bao gm cc khai bo cc cng u vo, cc cng u ra ca phn
t . Phn thn ca kin trc c dng m t s thc hin bn trong ca thc
th .
Packages: Cc ng gi ch ra thng tin dng chung, m cc thng tin ny
c s dng bi mt vi Entity no .
Configuration: nh cu hnh, n cho php gn kt cc th hin ca phn t
no cn dng ca mt thit k no c dng mt cu trc v a cc th hin
ny vo trong cp Entity v Architecture.
N cho php ngi thit k c th th nghim thay i cc s thc thi khc
nhau trong mt thit k. Mi mt thit k dng VHDL bao gm mt vi n v th
vin, m mt trong cc th vin ny c dch sn v ct trong mt th vin thit k.
3.1.1 Khai bo Entity:
79
c )
D <= C + 1; -- ( Cu lnh sai : C l cng u ra nn khng th c c cho
u vo ).
end process;
end bhv;
* V d v khai bo Entity:
A B
SUM
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;
COUT CIN
FULL _ ADDER
end [ architecture_name ];
3.1.2.1. Kin trc theo kiu hnh vi hot ng ( Behavioral ):
Mt kin trc kiu hnh vi hot ng ch ra cc hot ng m mt h thng
ring bit no phi thc hin trong mt chng trnh, n ging nh vic din t
cc qu trnh hot ng, nhng khng cung cp chi tit m thit k c thc thi
nh th no. Thnh phn ch yu ca vic din t theo kiu hnh vi trong VHDL l
process. Di y l v d ch ra kiu din t theo kiu hnh vi ca mt b cng vi
tn l FULL_ADDER.
architecture BEHAVIOUR of FULL_ADDER is
begin
process (A,B,CIN)
begin
if ( A ='0' and B ='0' and CIN='0' ) then
SUM <= '0';
COUT <= '0' ;
elsif
(A='0' and B='0' and CIN='1') or
(A='0' and B='1' and CIN='0') or
(A='1' and B='0' and CIN='1') then
SUM <= '1';
COUT <= '0' ;
elsif (A='0' and B='1' and CIN='1') or
(A='1' and B='0' and CIN='1') or
(A='1' and B='1' and CIN='0') then
SUM <= '0';
COUT <= '1';
elsif (A='1' and B='1' and CIN='1') then
SUM <='1';
COUT <='1';
end if;
end process;
end BEHAVIOURAL;
L1
X1 SUM
A1 CARRY
L2
end [package_name]
Mt thn package c dng lu cc nh ngha ca mt hm v th tc,
m cc hm v th tc ny chng c khai bo trong phn khai bo package
tng ng. V vy phn thn package lun c kt hp vi phn khai bo ca
chng, hn na mt phn khai bo package lun c t nht mt phn thn package
kt hp vi chng.
V d : package EX_PKG is
subtype INT8 is integer range 0 to 255;
constant zero : INT8:=0;
procedure Incrementer (variable Count : inout INT8);
end EX_PKG;
package body EX_PKG is
procedure Incrementer (variable Data : inout INT8) is
begin
if (Count >= MAX ) then
Count:=ZERO;
else Count:= Count +1;
end if;
end Incrementer;
end EX_PKG;
3.1.4. nh cu hnh ( Configurations ) :
Mi mt Entity bao gm nhiu kin trc khc nhau. Trong qu trnh thit k,
ngi thit k c th mun th nghim vi cc s bin i khc nhau ca thit k
bng vic chn la cc kiu kin trc khc nhau. Configuration c th c s dng
cung cp mt s thay th nhanh cc th hin ca cc phn t ( Component ) trong
mt thit k dng cu trc. C php khai bo ca Configuration ny nh sau:
Configuration configuration_name of entity_name is
{configuration_decalarative_part}
For block_specification
{use_cluse}
88
{configuration_item}
end for;
Vi mt Entity ca b cng FULL_ADDER nh gii thiu phn trn, v
d ny ta c th s dng chng trong php nh cu hnh nh sau:
configuration FADD_CONFIG of FULL_ADDER is
For STRUCTURE
for HA1, HA2 : HALF_ADDER use entity
burcin.HALF_ADDER(structure);
for OR1: OR_GATE use Entity burcin.OR_GATE;
end for;
end FADD_CONFIG;
y tn ca php nh cu hnh l tu , v d ny ta ly tn l
FADD_CONFIG, cn vi dng lnh For STRUCTURE ch ra kin trc c nh
cu hnh v c s dng vi thc th Entity FULL_ADDER. Gi s rng chng ta
dch hai thc th HALF_ADDER v OR_GATE thnh th vin vi tn l burcin
v s dng chng trong v d trn.
3.1.5. Cc th vin thit k :
Kt qu ca vic bin dch VHDL l chng c ct gi bn trong cc th vin
dng cho bc m phng tip theo, iu ny ging nh vic s dng mt phn t
c khai bo trong mt thit k khc. Mt th vin thit k c th cha cc n
v th vin nh sau:
- Cc ng gi (PACKAGES)
- Cc thc th Entity
- Cc kiu kin trc Architectures
- Cc php nh cu hnh Configurations.
Ch ! VHDL khng h tr cc th vin theo th bc. Bn c th c
nhiu th vin nh theo mun nhng khng c khai bo lng nhau!
m mt th vin v truy cp chng nh mt Entity c bin dch trong
mt thit k VHDL mi, iu u tin cn lm l phi khai bo tn th vin. C
php ca chng nh sau:
89
dng.
- BIT_VECTOR : c dng miu t mt mng cc gi tr kiu BIT.
- STRING : Mt mng cc k t, mt gi tr kiu chui c i km bi du
ngoc kp.
- REAL: c dng m t cc kiu s thc, di hot ng t-1.0E+38 n
+1.0E+38.
- Kiu thi gian vt l : M t cc gi tr thi gian c dng trong m phng.
C mt vi kiu d liu c nh ngha trong gi 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. Kiu mng :
Kiu mng l kiu ca nhm cc phn t c cng kiu ging nhau. C hai kiu
mng nh sau:
- Kiu mng c gn kiu .
- Kiu mng khng b gn kiu.
Kiu mng b gn kiu l kiu m cc ch s mng ca chng c nh ngha
tng minh. C php ca chng nh sau:
type array_type_name is array (discrete_range) of subtype_indication;
y array_type_name l tn ca kiu mng c p kiu, discrete_range
kiu ph ca kiu nguyn khc hoc kiu lit k, subtype_indication chnh l kiu
ca mi phn t ca mng.
Kiu mng khng b gn kiu l kiu m ch s mng ca chng khng b ch
ra, nhng cc kiu ch s ca chng phi c ch ra. C php ca chng c ch ra
nh sau:
type array_type_name is array (type_name range <>) of subtype_indication;
94
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 mt mng gm ba hai phn t m trong mi phn t l mt kiu
nguyn. Mt v d khc ch ra kiu Bit_vector v kiu String c to ra trong chun
cc gi STANDARD.
V d : subtype B1 is BIT_VECTOR ( 3 downto 0);
variable B2 : BIT_VECTOR (0 to 10);
Di ch s xc nh s phn t trong mng v hng ca chng ( low to high |
high to low ).
VHDL cho php khai bo cc mng nhiu chiu c th dng khai bo
cc mu RAM v ROM. Xem v d di y:
type Mat is array (0 to 7, 0 to 3) of BIT;
constant ROM : MAT : = (( '0', '1', '0', '1'),
('1', '1', '0', '1' ),
('0', '1', '1', '1' ),
('0', '1' , '0', '0' ),
('0', '0' ,'0' , '0'),
('1', '1' , '0', '0' ),
('1', '1' , '1', '1' ),
('1', '1' , '0', '0' );
X := ROM (4,3);
Bin X s ly gi tr '0' c t m.
3.3.5. Kiu Record :
Kiu record l mt nhm c nhiu hn mt phn t c cc kiu khc nhau.
Phn t ca Record bao gm cc phn t ca bt c kiu no, n c th l cc kiu
mng hoc kiu Record.
V d :
95
Library IEEE;
USE IEEE.STD_LOGIC_1164.all;
3.3.7. Cc kiu d liu khng du v c du .
Cc kiu d liu c du v khng du chng c ch ra trong cc gi chun
NUMERIC_BIT v NUMERIC_STD. Cc i tng vi kiu c du v khng du
chng c hiu nh l cc s nguyn binary khng du v cc i tng vi kiu
c du v chng c dch nh cc nguyn b hai .
Vic nh ngha ca cc kiu d liu c ch ra nh sau:
type signed is array (NATURAL range <>) of BIT/STD_LOGIC;
Cc pht biu di y bao gm cc khai bo vic s dng ca cc kiu d
kiu c du v khng du.
Library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_BIT.all;
use IEEE.NUMERIC_STD.all;
3.3.8. Cc kiu con .
VHDL cung cp cc cc kiu con m cc kiu con ny chng c nh ngha
trong cc nh cc tp ph trong mt kiu khc. Bt c u c mt khai bo kiu
th c th xut hin mt nh ngha kiu con. Kiu NATURAL v kiu
POSITIVE l mt kiu ph hay kiu con ca kiu nguyn v chng c th c
dng vi bt k mt hm nguyn no.
V d :
subtype INT4 is INTEGER range 0 to 15;
subtype BIT_VECTOR6 is BIT_VECTOR (5 downto 0);
3.4. Cc ton t :
VHDL cung cp 6 lp ton t , mi mt ton t c mt mc u tin nht nh.
Tt c cc ton t trong cng mt lp th c cng mt mc u tin.
97
Mc u
tin thp Cc ton t Cc ton hng
nht
.
and
. Cng kiu
Logical_operator or
. Cng kiu
nand
. Cng kiu
. nor Cng kiu
. xor Cng kiu
. = Cng kiu
. Relational _ /= Cng kiu
. operator < Cng kiu
. <= Cng kiu
> Cng kiu
>= Cng kiu
concatenation_op &
erator + Cng kiu
arithmetic_operat - Cng kiu
or
arithmetic_operat + Bt k kiu s no
or - Bt k kiu s no
arithmetic_operat * Cng kiu
or / Cng kiu
mod integer
rem integer
Mc u arithmetic_operat ** Kiu m integer
tin cao or abs Bt k kiu s no
nht not Cng kiu
Logical_operator
3.4.1. Cc ton t logical .
98
Kiu ton t logic khng chp nhn cc ton hng l cc kiu tin nh ngha
nh kiu BIT, BOOLEAN v cc kiu mng cc bit, cc ton hng cn phi l cng
kiu v cng di.
V d :
signal A,B : BIT_VECTOR (6 downto 0);
signal C,D,E,F,G: BIT;
A<= B and C ; -- Khng xy ra v cc ton hng khng cng
kiu.
D <= (E xor F) and (C xor G);
3.4.2. Cc ton t quan h .
Cc ton t quan h cho ta kt qu c kiu Boolean, cc ton hng cn phi c
cng kiu v cng di.
V d :
signal A,B : BIT_VECTOR (6 downto 0);
signal C: BOOLEAN;
C <= B <= A; ( Tng ng nh C <= (B<=A));
3.4.3. Cc ton t cng .
Cc ton t cng bao gm "+", "-" , v "&" , trong ton t "&" l ton t
kt ni chui v cc i tng l mng cc thanh ghi. Vi s c du v khng du
c th c dng vi cc s nguyn v cc kiu 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 kt qu l : "ABCxyz"
"1010" & "1" cho kt qu l : "10101"
99
...
PZ: process(A); -- PZ l nhn ca qu trnh
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 mt s kin xy ra trn tn hiu A ti thi im T1 v bin V2 c gn
gi tr l 10, trong pht biu th 3, sau mt s kin xy ra trn tn hiu A ti thi
im T2, gi tr ca V2 c s dng trong pht biu 1 s cng l 10. Mt bin cng
c th c khai bo bn ngoi mt qu trnh hoc mt chng trnh con. Mt bin
c th c c v cp nht bi mt hoc c th nhiu qu trnh, nhng bin ny
c gi l shared variable (Bin chia s).
3.6.2. Pht biu gn tn hiu.
Pht biu gn tn hiu s thay th gi tr hin ti ca tn hiu vi mt gi tr
mi bi vic s dng mt biu thc.
Tn hiu v kt qu ca biu thc cn c cng mt kiu d liu. C php ca
chng nh sau:
target_signal <= [ Transport] expression [after time_expression]
Pht biu gn tn hiu c th xut hin bn trong hoc bn ngoi mt qu trnh.
Nu n xy ra bn ngoi ca mt qu trnh, n c xem l mt pht biu gn tn
hiu ng thi.
Khi pht biu gn tn hiu xut hin bn trong qu trnh, n c xem nh l
mt pht biu gn tn hiu c th t v n c thc thi tun t theo th t ca
nhng pht biu tun t khc xut hin bn trong qu trnh.
V d php gn tn hiu trong mt Process (Vi A,B,C,D l cc tn hiu):
108
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 biu trn ta thy cng vic th t cn thc hin trc cng
vic th 5, nhng trong phn chng trnh th pht biu ca cng vic th 5 li c
thc hin trc cng vic th t. Hnh v di y m t pht biu Transport, sau 3s
n s c bt sng v sng trong khong thi gian ng bng thi gian bt cng
tc.
b.Inertial Delay.
Inertial Delay ( G chm do qun tnh ), l gi tr mc nh ca VHDL. N
110
A
A
S
S
Mt pht biu if c dng chn la nhng pht biu tun t cho vic thc
thi da trn gi tr ca biu thc iu kin. Biu thc iu kin y c th l mt
biu thc bt k m gi tr ca chng phi l kiu lun l.
Dng thng thng ca pht biu if l:
if boolean-expression then
sequential-statements
{elsif boolean-expression then
sequential -statement }
{else
sequential-statement}
enf if;
V d1:
if sum <=100 then -- <= is less-than-or-equal-to operator.
SUM:=SUM+10;
end if;
V d 2:
dng pht biu ny l trong pht biu if hoc trong pht biu case.
V d : Variable A, B : INTEGER range 0 to 31 ;
Case A is
when 0 to 12 =>
B:= A;
when others =>
Null;
End Case;
3.6.6. Pht biu xc nhn ASSERTION.
Pht biu xc nhn rt hay dng cho vic kim tra thi gian v cc iu kin
ngoi di.
V d : assert (X >3 )
report " Setup violation"
severity warning;
3.6.7. Pht biu Loop.
Mt pht biu lp c s dng lp li mt lot cc cu lnh tun t. C
php ca pht biu lp l:
[loop-label:] iteration-scheme loop
sequential-statements
end loop [loop-lebel];
C 3 kiu s lp. u tin l s lp c dng:
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 ny, thn ca vng lp thc thi N-1 ln, vi nh danh lp l
NUMBER v tng ln 1 sau mi vng lp. i tng NUMBER c khai bo n
trong vng lp ty thuc vo kiu integer, n c gi tr t 2 n N. V vy khai bo
khng r rng cho nh danh vng lp l iu cn thit, nh danh vng lp cng
khng th c gn cho bt k gi tr no trong vng lp for. Nu mt bin khc c
cng tn c to bn ngoi vng lp for, l hai loi bin c gii quyt ring r
116
v bin s dng trong vng lp for s chuyn giao cho nh danh vng lp. Vng
ca vng lp FOR cng c th l vng ca mt kiu lit 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 ly nhng gi tr trong kiu HEXA t 2 cho n 0.
end loop;
V d 3: V d v While .... loop
next;
else
null;
end if;
K:=K+1;
end loop;
Khi pht biu next c thc thi, qu trnh thc hin s nhy n phn cui
ca vng lp (pht biu cui cng K: =K+1) sau gim gi tr ca nh danh vng
lp j, v thc hin li t u.
V d 2:
V d 2 :
process -- Khng sensitivity list
variable TEMP1, TEMP2:BIT;
119
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 di y ch ra hai process c pht biu Wait
on. Process bn tri s lm cho Process treo ngay sau khi Start v ch cho n khi c
s kin xut hin trn tn hiu SigA. Cn Process bn phi s thc hin ba cu lnh
v sau ri vo trng thi ch n khi xut hin s kin trn tn hiu SigB.
- Khai bo bin .
- Khai bo hng .
- Khai bo cc kiu.
- Khai bo cc kiu con.
- Khai bo cc b danh Alias.
- Cc mnh USE.
Mt sensitivity list ( Tp cc s kin thay i trng thi cn x l trong mt
qu trnh ) c cng ngha vi mt Process c cha pht biu wait, m pht biu
wait ny l pht biu cui cng trong mt process v chng c dng sau: Wait
on sensitivity list ;
Mt process c chc nng ging nh mt vng lp v hn m trong n c cha
ton b cc pht biu tun t c ch ra trong vng lp . V vy mt pht biu
process cn phi c hoc mt sensitivity list hoc mt pht biu wait on hoc c hai.
V d 1:
architecture A2 of example is
signal i1, i2, i3, i4, and_out, or_out : bit;
begin
pr1 : process (i1, i2, i3, i4)
begin
and_out <= i1 and i2 and i3 and i4;
end process pr1;
pr2 : process (i1, i2, i3, i4)
begin
or_out <= i1 or i2 or i3 or i4 ;
end process pr2;
end A2
V d 2:
122
V d 2:
architecture A2 of example is
signal i1, i2, i3, i4, and_out, or_out : bit;
begin
process (i1, i2, i3, i4)
begin
and_out <= i1 and i2 and i3 and i4;
end process ;
process (i1, i2, i3, i4)
begin
or_out <= i1 or i2 or i3 or i4 ;
end process ;
end A2
V d 3:
architecture A3 of example is
signal i1, i2, i3, i4, and_out, or_out : bit;
begin
process
begin
and_out <= i1 and i2 and i3 and i4;
or_out <= i1 or i2 or i3 or i4;
wait on i1, i2, i3, i4;
end A3;
Ba v d trn y l tng ng nhau.
3.7.3. Cc php gn tn hiu c iu kin v cc php gn tn hiu
c chn la.
a. Cc php gn tn hiu c iu kin.
Mt php gn tn hiu c iu kin chnh l mt pht biu ng thi v c mt
ch gn nht nh, tuy nhin php gn ny c th c nhiu hn mt biu thc cho
124
mt ch. Ngoi tr biu thc cui cng, cc biu thc cn li phi c mt iu kin
chc chn, cc iu kin ny c nh gi theo th t. Nu mt iu kin c
nh gi l TRUE th biu thc tng ng c s dng, ngc li cc biu thc cn
li s c s dng. Nh rng ch mt biu thc c s dng ti mt thi im . C
php ca cu lnh ny nh sau:
target <= {expression [ after time_expression ] when condition else}
expression [ after time_expression ];
Mt pht biu gn tn hiu c iu kin c th c m t bi mt pht biu
process m process c cha pht biu IF. Bn c th s dng pht biu gn tn hiu
c iu kin trong mt process .
V d 1:
architecture A1 of example is
signal a, b, c ,d : integer ;
begin
a <= b when ( d >10 ) else
c when ( d >5 ) else
d;
end A1;
V d 2:
architecture A2 of example is
signal a, b, c ,d : integer ;
begin
process (b, c, d)
begin
if ( d > 10) then
a <= b
elsif ( d >5 ) then
a <=c;
else
a <= d;
125
end if;
end process;
end A2;
V d 3: S dng cc pht biu c iu kin.
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 ;
B2: block
begin
out 2 <= S ;
end block B2;
end BHV;
Trong v d ny ta thy block B1-1 l block con ca block B1. C B1 v B1-1
u khai bo tn hiu S. Tn hiu S trong B1-1 s l kiu integer v truyn cho tn
hiu out 1 cng l kiu integer, mc d S c khai bo trong B1 l kiu Bit. Tn
hiu S trong B1 c s dng trong B2 l kiu Bit, trng vi kiu tn hiu out 2.
3.7.5. Cc li gi th tc ng thi.
Mt li gi th tc ng thi chnh l mt li gi th tc m n c thc thi
bn ngoi mt process, n ng c lp trong mt kin trc architecture. Li gi th
tc ng thi bao gm :
- C cc tham s IN, OUT, INOUT.
128
- C th c nhiu hn mt gi tr tr v
- N c xem nh mt pht biu.
- N tng ng vi mt process c cha mt li gi th tc n.
Hai v d di ay l tng ng nhau.
V d 1:
architecture .................
begin
procedure_any (a,b) ;
end..........;
V d 2:
architecture ................
Begin
process
begin
procedure_ any (a,b);
wait on a,b;
end process ;
end .............;
3.7.6. Cc chng trnh con .
Cc chng trnh con bao gm cc th tc v cc hm m n c th c gi
thc hin cng vic no lp li t cc v tr gi khc nhau trong VHDL. Trong
VHDL cung cp hai kiu chng trnh con khc nhau l:
- Cc th tc (Procedure).
- Cc hm ( Function ).
a. Hm v cc c trng ca hm.
- Chng c gi v thc hin nh mt biu thc.
- Lun tr v mt i s.
- Tt c cc tham s ca hm u phi l ch mode IN.
- Tt c cc tham s ca hm phi thuc lp cc tn hiu hoc cc hng.
- Bt buc phi khai bo kiu ca ga tr tr v .
129
end DUMMY_ARCH;
Pht biu process tng ng vi li gi mt th tc ng thi nh sau:
process
begin
INT_2_VEC (D_ARRAY,START,STOP,SIGNAL_VALUE);
-- Phn th hin ca cc li gi th tc tun t
wait on SIGNAL_VALUE;
-- Ch s kin trn SIGNAL_VALUE v xem chng nh mt tn hiu vo.
end process;
Mt procedure c th s dng hoc l mt pht biu ng thi hoc l
pht biu tun t. Cc li gi ng thi thng xuyn c dng m t
chnh l cc process.
V d ca th tc dng c khai bo postpone ( Tr hon ).
postponend procedure INT_2_VEC ( signal D:out BIT_VECTOR ;
START_BIT,STOP_BIT : in NATUAL;
signal VALUE :in INTEGER) is
begin
-- Phn khai bo hot ng ca th tc
end INT_2_VEC;
A
Sum
B FULL_Adder
Cin Cout
N3
Cout
N2
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
138
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;
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;
139
begin
U1 : XOR_gate port map (I0 => A, I1=> B, O=>N1);
U2 :AND2_gate port map ( A, B, N2);
U3 :AND2_gate port map ( Cin, N1, N3);
U4 :XOR_gate port map ( Cin, N1, Sum);
U5 :OR2_gate port map ( N3, N2, Cout);
end IMP;
3.9.3. Cc pht biu Generate.
Pht biu generate l mt pht biu ng thi v n c nh ngha trong
phn architecture. N c dng m t cc cu trc ging nhau, hay ti to li
cc cu trc khc ging nh bn gc. C php ca chng nh sau:
instantiation _label : generation_scheme generate
{concurrent_statement}
end generate [instantiation _label];
C hai loi lc generation : Lc for v lc if. Lc for c
dng din t cu trc thng thng, n c dng khai bo mt tham s
generate v mt di ri rc ca lc for ( ch ra tham s vng lp v di ri rc
trong cc pht biu lp tun t ). Cc gi tr tham s ca generate c th c c
nhng khng c gn hay chuyn ra ngoi pht biu generate.
a. S dng lc for:
V d : Gi s ta c b cng 4 bit m trong bao gm bn b cng
Full_adder nh c m t trn. Xem hnh di y:
140
Cout '0'
FA (3) FA (2) FA (1) FA (0)
component FULL_ADDER
port ( A, B, Cin : in STD_LOGIC ;
Sum, Cout : out STD_LOGIC );
end component ;
begin
TMP (0) <= ' 0 ';
G : for I in 0 to 3 generate
FA: FULL_ADDER port map ( X (I), Y(I), TMP (I), Z (I),TMP ( I+1 ));
end generate ;
Cout <= TMP (4);
end IMP;
141
b. S dng lc if.
X (3) Y (3) X (2) Y (2) X (1) Y (1) X (0) Y (0)
Cout
FA (3) FA (2) FA (1) HA (0)
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
142
HA: HALF_ADDER port map ( X (I), Y(I), Z (I), TMP ( I+1 ));
end generate ;
end generate ;
Cout <= TMP ( 4 );
end IMP;
3.9.4. Cc thng s ca vic nh cu hnh.
Trong mt Entity c th c mt vi cu trc, v vy cc chi tit cu vic nh
cu hnh cho php ngi thit k chn cc Entity v kin trc ca n. C php khai
bo ca chng nh sau:
for instantiation _list : component _name
use Entity library_name. Entity _name [( architecture _name)] ;
Nu ch c mt kin trc architecture th tn architecture c th b b qua.
Xem thm mt v d di y:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
Entity FULL_ADDER is
port (A, B, Cin : in STD_LOGIC;
Sum, Cout : out STD_LOGIC);
End FULL_ADDER;
Architecture IMP of FULL_ADDER is
component XOR_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component ;
component AND2_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
end component;
component OR2_gate
port ( I0, I1 : in STD_LOGIC; O : out STD_LOGIC );
143
end component;
signal N1, N2, N3: STD_LOGIC;
for U1 : XOR_gate use entity work.XOR_gate (BHV);
for others : XOR_gate use entity work.XOR_gate (BHV);
for all : AND2_gate use entity work.AND2_gate (BHV);
for U5 : OR2_gate use entity work.OR2_gate (BHV);
begin
U1 : XOR_gate port map (I0 => A, I1=> B, O=>N1);
U2 :AND2_gate port map ( A, B, N2);
U3 :AND2_gate port map ( Cin, N1, N3);
U4 :XOR_gate port map ( Cin, N1, Sum);
U5 :OR2_gate port map ( N3, N2, Cout);
end IMP;
DIN DOUT
Combinational
Logic
register
clock
RST
PB Q1
Q2
CLK FF FF
PB.Pulse
Entity PULSER is
port ( CLK, PB : in bit;
PB_PULSER : out bit );
end PULSER;
architecture BHV of PULSER is
signal Q1, Q2 : bit;
begin
process ( CLK, Q1, Q2 )
begin
if ( CLK'event and CLK = ' 1' ) then
Q1 <= PB;
Q2 <= Q1;
end if;
PB_PULSE <= ( not Q1 ) nor Q2;
end process ;
end BHV;
3.11.6. Cc thanh ghi.
C rt nhiu kiu thanh ghi m chng c s dng trong mt mch. V d
sau y s ch ra mt thanh ghi bn bit m chng c t trc khng ng b v
tr " 1100 ".
148
Q Q Q Q
S S R R
D D D D
CLK
ASYNC
Din Dout
D Q D Q D Q D Q
FF FF FF FF
CLK
3.11.8. Cc b m khng ng b.
B m khng ng b l b m m trng thi ca n thay i khng b iu
khin bi cc xung ng b ng h.
Cch m t b m ny nh sau:
Count (0) Count (1) Count (2) Count (3)
1 Q 1 1 1
T T Q T Q T Q
CLK FF FF FF FF
RESET
3.11.9. Cc b m ng b.
Nu tt c cc Flip - Flop ca b m c iu khin bi tn hiu clock
chung th chng c gi l b m ng b.
Cch vit chng 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
Library IEEE; OE
use IEEE.STD_LOGIC_1164. all;
3.11.21.M t Bus.
Mt h thng Bus c th c xy dng vi cc cng ba trng thi thay v cc
cng multiplexers.
Ngi thit k phi m bo khng c nhiu hn mt b m trng thi kch
hot ti bt k thi im no. Cc b m kt ni cn phi c iu khin v vy
ch c b m ba trng thi truy cp ng Bus trong khi cc b m khc duy tr
trng thi tr khng cao.
Thng thng cc php gn tn hiu tc th, chng hn nh cc ng Bus
trong v d di y khng c php mc mt kin trc. Tuy nhin cc kiu
d liu STD_LOGIC v STD_LOGIC_VECTOR c th c nhiu ng iu khin.
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 ;
152
Bus Line
0
S (0) 2 to 4
1
Decoder
S (1)
2
3
R0 R1 R2 R3
Chng IV
Thit k b iu khin ng c bc
4.1. Gii thiu tm tt
Vic ng dng iu khin cc m t bc, thng thng c kt hp vi cc
b vi x l to ra mt kh nng iu khin v tr vi chnh xc cao. Motor
bc l thit b m n c th quay vi mt s chnh xc trn mi bc. Cc loi
motor bc in hnh thng quay vi gc quay l 150 hoc 7.50 trn mt bc,
thng th motor c ch ra s bc cn thit quay ht mt vng 3600 ( Vi
motor bc quay 150 trn mt bc s quay 24 bc trong mt vng). Vic iu
khin ng c bc chnh l iu khin vic cung cp in p trn cc cun dy ca
chng. chng ny tc gi xin trnh by mt v d n gin s dng CPLD, FPGA
v gii thiu b vi x l thng dng iu khin ng c bc vi bn cun dy
pha. V d ny l mt v d n gin nhm lm quen v hiu cch lp trnh trn
cu trc cu CPLD v FPGA ch khng a vo ng dng no c. Tuy nhin nu
mun pht trin v d ny thnh ng dng th vic trin khai cng rt d dng, v cc
bc c bn ca thit k s c tin hnh theo trnh t, v ch thm mt s thit b
n gin khc nh Encoder hay cc mt quang l c th c mt vng iu khin kn
i vi v d ny .
4.2.Thit k b iu khin ng c bc
4.2.1. iu khin ng c bc s dng b vi iu khin 89C51 truyn
thng .
iu khin ng c bc, c ngha l ta phi cung cp mt lot cc in p
vo bn cun ca motor. Cc cun s c cp nng lng motor quay c mt
bc. Cc mu cp nng lng cho cc cun cn phi c cung cp chnh xc. Cc
mu ny s c thay i ph thuc vo ch s dng vi motor. Vi cc ch
thng thng cho cc ng dng c m men quay thp, thng c s dng ch
iu khin na bc, c ngha l vi motor c phn gii 24 bc trong mt
vng quay th s quay 48 bc trong mt vng quay. S in hnh iu khin
mt ng c bc c s nh hnh 4.1. y l s c tc gi s dng trong
154
VCC VCC
VCC
Bit0
VCC
Bit1
Bit2 VCC
VCC
Bit3 M
{
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 chm gia cc bc, phi to b dm gi chm 50 ms vi thch
anh 6 MHz th phi np 9E58H vo thanh ghi TH0 v TL0.
4.2.2 iu khin ng c bc s dng CPLD XC9572XL
Mc ny s thit k b iu khin ng c bc vi bn phm gt a vo
CPLD iu khin ng c bc vi cc chc nng sau:
- SW1 : Dng khi ng v dng ng c . ( Cng tc Start/Stop)
- SW2 : Dng o chiu quay ca ng c . ( Cng tc Dir)
- SW3: Dng tng gim tc ng c. ( Tng, gim tc ng c Inc/Dec)
- SW4 : Dng Reset h thng .
1. S khi ca h thng :
thit k mt chng trnh trong CPLD, thng thng ta phi v s khi,
157
CPLD XC9572
Khi X L Tn hiu
iu khin Cc mu bit
Phm v To Khi To Cc
Khi Cng Sut
Tn Hiu iu Xung Ra Theo
IRF 630 M
Khin Mu Bc
Tn hiu iu khin
Clock
chng trnh StateCAD hoc vit trc tip bng VHDL). y tc gi xin gii thiu
chng trnh c vit bng VHDL. S m t trng thi ca modul to bc c
dng nh sau:
RESET
E = 0 & DIR = 0
E =1 E =1
Step_0 Step_1
E = 0 & DIR = 1
E = 0 & DIR = 1
E =1 E =1
Step_3 Step_2
E = 0 & DIR = 0
Init
COUNT 10M = 0, Clk_1ms = 0,
COUNT_xms = 0, Clk_Out =0
Yes
RESET = 1 ?
No
No
Clk_1ms?
No
Clk In ?
Yes
Yes
COUNT_xms = COUNT_xms + 1
No
COUNT_xms = DIV ?
No
COUNT 10M = 4000 ? Yes
COUNT_xms = 0
Yes Clk_Out = Not (Clk_Out)
COUNT 10M = 0
Clk_1ms = Not (Clk_1ms)
Init
Dout = "000", E =1, Dir =1
Yes
Reset = 1
No
No No
No Inc = 0 ? Dout =Dout - 1
Cnt_Dir = 0 ? Dir =1
Start = 0 ? E=1
Yes Yes
Yes
Dir = 0 Dout =Dout +1
E=0
Hnh 4.8. Lu thut ton Modul qut phm chc nng, Inc_Dec.vhd
162
mt thi gian cn thit c, tham kho, tm ti. Xong khi thc hin c trn
n, th mi thy c n rt u vit, bi l chng ta c th to chng trnh ca
chng ta vit ra thnh mt core (li), m khi c ln no ta c th s dng li
chng mt cch d dng. V mt iu quan trng na l chng ta a mt vi
mch UART vo trong mt chp n m trong chip ny c th c tch hp cng
nhiu cc vi mch khc na thc hin mt h thng phc tp ch trong mt chip.
y mi ch l mt ng dng s khai ban u, vi FPGA n cn c mt chng di
cc ti nguyn cha c khai thc ht, bn c th to RAM trong chng, to mt
b vi x l trong chng hay bin chng thnh mt b DSP, hay cc b lc s chuyn
dng, b x l cc thut ton x l nh ... Vi v d nh b ny tc gi cng xin
c trnh by, v d sao n cng l bc i ban u trn nn ca cc chp mt
cao tc ln ny. Cng vi v d gii thiu, by gi ta khng iu khin bng
phm na m ta s dng chng trnh iu khin. Chng trnh ny c vit
bng Visual Basic iu khin motor bng my tnh thng qua cng COM1. Trong
chip Spartan s c vit mt b UART nhn d liu t my tnh PC a sang.
1. Chng trnh iu khin giao din phn mm Visual Basic
Mc ch ca chng ta l i thit k b UART kt hp vi modul iu khin
ng c bc nh gii thiu. Chnh v l do ny chng trnh vit bng Visual
Basic c vit n gin vi cc nt n thay cho phm trong v d trc. Nu
thm mt bc na l chng ta c th ly d liu t mch phn hi ca ng c
x l trong my tnh. Tuy nhin lun vn ny tc gi ch cp n mt mc ch
c bn v vic ghp ni my tnh vi FPGA thng qua mt b UART c vit
trong FPGA. Trn form chng trnh, khi ta kch chut vo cc nt nhn ny th
chng trnh s truyn cc Byte d liu qua cng COM 1 vi khun mu truyn t
sn l "9600,N,8,1". (Chng trnh ny c th nghim ghp ni vi b vi x l
89C51 v FPGA Spartan3 XC3S200 5ft256). Mi ln kch chut l mt ln
chng trnh truyn mt Byte d liu, v th b UART c vit trong bo mch
Spartan-3 s cng phi vit vi tc Baudrate l 9600 vi khun mu truyn nhn
nh trn. Chng trnh iu khin ny c vit di dng mt Form n vi su
nt nhn nh sau: - Start : Khi ng Motor.
165
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
------------------------------------------------------------------------------------
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")
167
End If
End Sub
Private Sub Form_Load()
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. Thit k b UART v ghp ni PC :
thit k Modul UART chng ta phi thit k mt Modul chnh v hai
modul con vi cc tn file nh sau (S c gii thiu phn ph lc2 ):
- Modul UART.vhd : Modul chnh cha cc Modul thnh phn .
- Modul Rx.vhd : Modul dng lm b thu d liu khng ng b.
- Modul Tx.vhd: Modul dng thc hin b pht d liu khng ng b.
- Modul Counter.vhd : Dng to ng h Baudrate, khi thit lp tc
Baudrate vi my tnh PC.
- Modul Synchroniser.vhd dng ng b Clock.
thit k mt Modul UART v to chng thnh Core rt phc tp, cn phi
hiu r hot ng chc nng ca mt b UART v cch to core.
y n gin trong vic vit chng trnh, b uart ny s lm vic t ng
thu pht d liu ni tip, khng thit k cc ng dn bt tay nh CTS, RTS, DTR,
DSR, khng c FIFO .
Vi khun dng d liu ca b truyn s c truyn di dng sau:
S tart d0 d1 d2 d3 d4 d5 d6 d7 S top S tart
S ta rt d0 d1
RXD
UART_RX
BAUD
RATE
TIMING
TXD
UART_TX
Modul IO XC3s200
pin_rs232_td Led
Start/Stop
Cnt_Dir
Sec [3:0]
pin_rs232_rd Modul UART Modul Step_Motor
Inc/Dec Led1
Clock Reset
Init
TxD= 1, Bitpos=0, TbufL =0
Yes
Reset = 1
No
No
Enable= 1 ?
Yes LoadS=1?
No
Yes
No No No
BitPos=0? BitPos=1? BitPos=10
Yes Yes
Tbuff=DataIn
TbufL = 1,
Yes Busy = TbufL or LoadA
TxD=1 TxD=0
TBufL=1?
Yes
Treg = Tbuff
TxD=Treg(BitPos) TxD=Treg(BitPos)
BitPos = BitPos+1
BitPos = BitPos+1 BitPos = 0
TBufL= 0.
Init
RRegL = 0, Bitpos = 0
Yes
Reset = 1
No
No
ReadA =1 ? RxAv = 1
No
Enable= 1 ?
Yes
RxAv = 0
Yes
No No
BitPos=0? BitPos= 2 - 9 No
No SampleCount = 3 ?
BitPos=10
Yes
Yes
No Yes
Yes
RxD = 0 ? No
SampleCount =1 &
BitPos >= 2? RReg = 1, Bitpos=0 SampleCount = 0
Yes
DataO = RReg
SampleCount = 0 No
Yes
Bitpos = 1 SampleCount = 3 ?
RRegL = 0
Yes SampleCount =
RReg (BitPos ) =RxD
SampleCount + 1
BitPos = 0 BitPos = BitPos+1
biu di y:
Ph lc chng trnh 1
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 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 );
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;
3
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;
-----------------------------------------------------------
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
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---------------------
-
4
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;
entity SecGenerator is
Port ( Clk,Reset,E,Dir : in std_logic;
5
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 =>
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;
7
Ph lc chng trnh 2
4. SecGenerator.vhd
------------------------------------- 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';
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
9
----------------------------------------------------------
--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;
----------------------------------------------------------------------------
-----
----------------------------------------------------------------------------
-----
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;
------------------------------------------------------
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';
11
--------------------------------- 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;
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));
12
end component;
------------------------------------------------------------
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
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
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)
13
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)
14
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;
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;
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;
15
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 (
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
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---------------------------
16
--
-------------------------------------------------------------
-- Title : UART ---
-- Project : UART ---
-- Clock : 50MHz ---
-- Author : Pham Tuan Hai ---
-------------------------------------------------------------
-------------------------------------------------------------
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';
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;
17
-------------------------------------------------------------------
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 (R = '1') then
C1S <= '0';
end if;
end process;
O <= C1S;
end Behaviour;
18