(Codientu - Org) - Doko - VN 160498 Huong Dan Hoc FPGA Bang Tieng Viet PDF
(Codientu - Org) - Doko - VN 160498 Huong Dan Hoc FPGA Bang Tieng Viet PDF
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.
2
* Ni tng cc LUT to b nh ln hn .
* Cc ng dng c th thay i kch thc b nh mt cch mm
do, FIFO, v cc b m.
+/ Khi RAM nhng ti 1.87Mb
* Nhng ti 104 khi RAM ng b bng vic ni tng cc khi
RAM 18Kb.
* Mi khi RAM 18Kb coi nh mt RAM n cng hoc lng
cng .
* Cung cp cc bi s ca t s tng quan, chuyn i rng d
liu, tnh chn l.
* Cung cp cho cc ng dng gm: b m d liu, FIFO, v cc b
m khc.
+/ Giao tip b nh
* Cho php giao tip in vi cc chun nh HSTL, SSTL, cho php
thc hin kt ni vi b nh thng thng.
+/ Cc b nhn
* Cho php cc php tnh ton hc v s hc n gin cng nh cc
chc nng nng cao ca DSP.
* Cung cp 104 b nhn 18x18 vi cc php nhn18 bit du hoc 17
bit khng du, cho php ni tng tng rng s bit.
* Cc b nhn h s hng : B nh on - Chip v cc Logic Cell lm
vic cht ch vi nhau xy dng cc b nhn vi cc ton hng l
hng s.
* B nhn Logic cell : Thc hin thut ton thng thng chng hn
18
ng dng m ho, x l ng
ng nhanh .
Cc khi nhn 18x18 . - Dng cho vic x l DSP tc
cao; S s dng cc b nhn kt
hp vi kt cu khung d liu
cho php thc hin DSP song
song siu nhanh.
Tn hiu u cui (ln ti 622 - Cho php kt ni cc chp ang
Mbps) nh dng theo cc chun dng vi cc chip, b nh khc,
LVTTL, LVCMOS, GTL, GTL+, v t cc chip ang dng ti cc
PCI, HSTL-I, II, III, SSTL- I, II . chun tn hiu mch phn hi,
loi bt s cn nhiu IC chuyn
i .
B qun l ng h s ( DCM ) - Loi tr s gi chm ng h
mc board v on-chip, nhn chia
tc th, c th gim c tc
ng h ph hp mc board,
gim s b ng h trn bo
mch. C th iu chnh pha
ng h m bo chnh xc
cao .
C cc ti nguyn c nh - S phn phi cc clock v cc
tuyn ton cc. tn hiu khc cng vi cc h s
phn chia u ra cao trn ton
21
thit b.
iu khin u ra cho php lp - Nng cao tnh ton vn ca
trnh . thit b
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
38
cc cng AND cho php lp trnh hon ton thng qua lp trnh cc
cng OR . Mt ma trn PAL b c nh bi ma trn cc cng OR (
xem hnh 1.1 v 1.2 Mc 1.1), ma trn PLA nhn cc u vo ca
n trc tip t ZIA. C 36 cp u vo v cc u vo b xung t
ZIA, cc u vo ny c cung cp ti 48 tch s nhn trong ma
trn. Bn tm ng tch s nhn ny, th trong c 8 ng iu
khin cc b (LCT [0:7]) c php s dng nh cc tn hiu iu
khin ti mi Macrocell (MC) dng khi s dng cc clock khng
ng b, reset, preset v cho php u ra (OE) Output Enable.
Nu khng dng 8 ng iu khin ny th chng c nhp
vi 40 tch s nhn cn li to ngun logic. Trong mi khi chc
nng c 8 ng phn hi NAND c dng tng hp v tng
mt logic, h tr cc hm logic ln hn.
c tnh ny c th c php hoc khng c th do phn mm
ngi s dng qui nh. Cng vi cc tch s nhn, ng iu
khin v cc ng phn hi khng c s dng n, cc ng
ny chng li c th gp li v c dng nh mt ngun ti nguyn
logic. Nu c ln hn mt php tnh logic nhn, h s n ti mi
MC th 47 tch s nhn na s c gp li trc to ra VFM (
Variable Function Multiplexer - B chn knh chc nng bin i ).
B VFM tng s ti u ho logic bng vic thc hin mt vi
chc nng logic u vo trc khi i vo Macrocell xem hnh 1.19.
44
tc ca chng l .
2. Ni cc cng li vi nhau bng vic s dng cc mng v dy
ni. Hon tt vic iu khin ni cc cng theo bt c cu hnh no
m cn cho ng dng .
3. a thm v t tn cho cc b m u vo v u ra , cc
nhn ny s ch r cc chn trong ng gi vo ra ca thit b .
4. To danh sch cc mng cc ng ni ca mch.
Hnh 1.23 di y m t lung thit k vi cc PLDs .
end if;
end if;
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
reset => ,
count => );
Tip tc, thc hin tng t trong ca s Sources in Project
chn file stat_mac.vhd, trong ca s Source nhy p vo View
VHDL Instantiation Template. Copy phn khai bo Component
v phn Instantiation dn vo file top.vhd. Khai bo mt Signal
timer : std_logic_vector (3 downto 0) di khai bo cu trc . Sau
khi thc hin cc bc ta s c chng trnh ca lp 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
EXIT.
Name ch lights.
Sau kch vo nt Create Group, trong hp Select Group
chn lights v kch vo nt Clock to Pad. Hp thoi s hin ra v
thit lp thi gian theo yu cu l 15nS, kch nt OK. Khi ny vic
gn thi gian c gn vo trong file UCF.
Kch chut vo nt Save v thot khi b son tho gn. Quay
li vi mi trng ISE, nhn trong ca s Processes, bc tip theo
l phi cho chng trnh hon thnh vic thc thi thit k, c ngha
l phi m bo c ch V mu xanh bn tri dng Implement
Design. Bm chut phi vo dng ny v chn Properties, chn
mc Fitting. v d ny chng ta chn Output Voltage Standard
l LVCMOS18 (Tc chun vo ra1,8V), nhn OK. Nhy p chut
vo dng Implement Design, lc ny ton b thit k ca chng ta
s c thc thi trn thit b ch m khng c li.
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
105
Entity entity_name is
[generic (generic_declaration);]
[port (port_declaration);]
{entity_declarative_item {constants, types, signals};}
end [entity_name];
[] : Du ngoc vung ch ra cc tham s c th la chn.
| : Du gch ng hin th mt s la chn trong s cc la chn
khc.
{} : Khai bo mt hoc nhiu cc i tng, m cc i tng
ny c th c nh ngha bi ngi dng.
a. Khai bo Generic dng khai bo cc hng m chng c
th c dng iu khin cu trc v s hot ng ca Entity. C
php ca khai bo ny nh sau:
generic ( constant_name : type [:=init_value]
{;constant_name: type[:=init_value]});
y tn hng constant_name ch ra tn ca mt hng dng
generic (hng dng chung).
Kiu (Type) c dng ch ra kiu d liu ca hng.
init_value : ch ra gi tr khi to cho hng.
b. Khai bo cng ( Port ): c dng khai bo cc cng vo,
ra ca Entity. C php ca khai bo ny nh sau:
Port ( port_name : [mode] type [:= init_value]
{; port_name:[mode] type [:=init_value]});
port_name c dng ch ra tn ca mt cng, mode
107
C : out integer ;
D : inout integer ;
E : buffer integer) ;
end xxx;
architecture bhv of xxx is
begin
process (A,B)
begin
C <= A ; -- ( Cu lnh ng: A c gn cho C ).
A <= B ; -- ( Cu lnh sai: A l mt u vo ).
E <= D + 1; -- ( Cu lnh ng: D mode inout v vy n c
th c gn v 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:
109
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
L1
X1 SUM
A1 CARRY
L2
114
v d ny tn ca package c khai bo l
EXAMPLE_PACK. N c cha cc khai bo kiu, phn t, hng, v
hm. Lu rng hot ng ca hm INT2BIT_VEC khng xut
hin trong khai bo gi, m ch c giao tip ca hm xut hin.
Vic nh ngha, hay thn ca hm ch xut hin trong thn ca
ng gi ( Body Package ).
Gi s rng ng gi ny c dch v to thnh mt th
vin thit k v c gi l DESIGN _LIB . Xem xt vic dng
mnh use s dng chng di y:
library DESIGN_LIB;
use DESIGN_LIB.EXAMPLE_PACK.all
Entity RX 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
119
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','_');
Mi mt nh danh trong mt kiu u c mt v tr nht nh
trong kiu, chng c xc nh bi th t xut hin cu chng
trong kiu . Trong v d trn, mc nh RED c v tr 0,
ORANGE s c v tr 1 ..... Nu chng ta khai bo mt i tng d
liu vi kiu l COLOR v khng nh ngha gi tr khi to th i
tng d liu s c khi to mc nh v tr u tin ca kiu
lit k ( V tr khng ), trong trng hp ny COLOR s nhn gi tr
RED.
3.3.2. Kiu nguyn :
Kiu nguyn l cc kiu s nguyn, chng c dng cho cc
php tnh, cc ch s, cc iu khin s vng lp. Trong hu ht cc
kiu thc thi trong VHDL c di t - 2,147,483,647 n + 2, 147,
483,647. C php ca chng c khai bo 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
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
126
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"
3.5. Cc kiu ton hng .
Trong mt biu thc cc ton t s dng cc ton hng tnh
ton cc gi tr ca chng. Cc ton hng trong mt biu thc bao
gm :
- Kiu ch
- Kiu nh danh
- Cc tn c nh theo ch s
- Tn cc Slice
- Tn cc c tnh
133
v gi tr mc nh ca chng l Null.
V d : 'A' , 'a' , ......'1' .
Kiu ch k t khng phi l kiu bit k t nh '1' hoc kiu
nguyn 1, v vy kiu ch l t cn phi c cung cp mt tn kiu
no .
3.5.1.3. Kiu chui .
Mt kiu chui k t thc cht l mt mng cc k t . Mt
chui cc k t c nh ngha trong mt du ngoc kp .
V d : "A" , " hold time error ", " x " ....
3.5.1.4. Kiu BIT .
Kiu bit l kiu m t hai gi tr ri rc bng vic s dng cc
ch k t '0' v '1'. i khi cc kiu Bit ny c dng to ra kiu
ch bit mt cch tng minh dng phn bit chng vi cc kiu
k t.
V d : '1' , ' 0 ' , bit' ('1')
3.5.1.5. Kiu BIT_VECTOR .
Kiu bit_vector l mt mng cc bit m chng c t trong
du ngoc kp .
V d : "01001111000" , x"00FFF0" , b"100010101" ,
o"277756"...
Trong v d trn ch 'x' c dng din t cc gi tr s hexa,
cn 'b' c dng m t kiu binary, cn 'o' c dng cho h
m c s 8.
3.5.1.6. Kiu ch trong ng gi chun STD_LOGIC.
135
array_name (expression)
Vi array_name l mt tn ca mt hng hay mt bin no
nm trong mt mng. Cn expression phi tr v gi tr nm trong
di ch s ca mng .
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. Kiu Slice v ALIAS.
Mt khai bo Slice c dng ch ra mt s phn t ca
mng. Hng ca n cn phi ph hp vi hng mng. Alias c
dng to ra mt tn mi cho tt c cc hoc mt s phn t no
nm trong mt mng.
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 ngha 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. Kiu thuc tnh ATTRIBUTE:
Ly cc thuc tnh cu mt bin hay mt tn hiu ca mt kiu
cho trc no v tr v mt kiu gi tr. Di y l cc kiu
138
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):
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.
147
b.Inertial Delay.
Inertial Delay ( G chm do qun tnh ), l gi tr mc nh ca
VHDL. N c dng cho cc thit b m khng c phn ng cho
n khi u vo c php trong mt khong thi gian nht nh.
Thng th vi tn hiu c khong thi gian tc ng khng u v
nh hn thi gian gi chm ca cc cng th s b b qua.
Vi v d trn, m t hot ng ca n vi gi chm do sc
qun tnh ca mch. Nu thi gian tc ng ca cng tc nh hn
gi chm ca mch th u ra s khng c tc ng hay n s
khng c bt sng. Gi s ta c cu lnh n s c bt sng sau
3 giy, nhng cng tc ch tc ng trong thi gian hai giy th n
s khng c bt sng. Xem hnh v di y:
148
A
A
S S
V d 2:
OU <= '0' ;
elsif IN1 = 'X' or IN2 = 'X' then
OU <= '1';
else
OU <= '1' ;
end if;
end process;
V d 3:
branch
end case;
Pht biu case la chn mt trong nhng nhnh cho vic thc
thi da trn gi tr ca biu thc. Gi tr biu thc phi thuc kiu
ri rc hoc kiu mng mt chiu. Cc chn la ( Choices ) c th
c din t nh mt gi tr n, hoc mt di gi tr bng vic s
dng du " | " hoc s dng mnh khc. Tt c cc gi tr c th
c ca biu thc phi c th hin trong pht biu case ng mt
ln. Cc mnh khc c th c s dng bao qut tt c cc
gi tr, v nu c, phi l nhnh cui cng trong pht biu case. Mi
mt chn la phi c cng kiu vi kiu ca biu thc. Mt th d
cho pht biu 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;
Nhnh 2 c chn nu DAY c gi tr l MON hoc WED.
Nhnh 3 bao gm cc gi tr FRI, SAT v SUN. Trong khi nhnh 4
gm cc gi tr cn li, THU. Pht biu case cng l pht biu tun
t, tuy nhin n cng c th c pht biu xp lng nhau.
153
V d 2:
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
155
SUM:=SUM*10
if (SUM >100) then
exit L3; -- Thc hin exit khi L3 nu Sum>
100
enf if;
end loop L3;
3.6.10. Pht biu WAIT.
Nh chng ta thy, mt qu trnh m phng c th tr hon
(Hay treo s thc hin ca mt pht biu Process hoc mt chng
trnh con ) cho n khi gp mt iu kin ph hp. C 3 hnh thc
c bn ca pht biu 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 hin din ca sensitivity list trong mt qu trnh trng vi trng
hp mt trong ba trng hp trn ca pht biu wait . Mt pht
biu qu trnh c wait on cui ca Process tng ng vi mt
pht biu qu trnh c khai bo sensitivity-list.
Xem hnh di y: Hai process ny l tng ng nhau.
159
V d 2 :
process -- Khng 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 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.
sensitivity list .
Mt thn architecture c th cha s lng bt k ca nhng
pht biu gn tn hiu ng thi. V chng l nhng pht biu ng
thi nn th t ca nhng pht biu l khng quan trng. Nhng
pht biu gn tn hiu ng thi c thc thi bt c khi no c s
kin xy ra trong tn hiu c s dng trong biu thc.
V d1 :
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 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 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:
166
a <= d;
end if;
end process;
end A2;
V d 3: S dng cc pht biu c iu kin.
label : Block
{block_declarative_part}
begin
{concurrent_statement}
end block [label];
Phn khai bo block ch ra cc i tng thuc min cc b ca
block v c th l cc thnh phn sau y:
- Khai bo tn hiu.
- Khai bo hng.
- Khai bo kiu.
- Khai bo cc kiu con.
- Thn cc chng trnh con
- Khai bo b danh ALIAS
- Cc mnh use
- Khai bo cc thnh phn ( Component).
Cc i tng c khai bo trong mt block ch c php
hot ng trong block v cc block vng trong ca n. Khi mt
block con khai bo mt i tng c trng tn vi i tng trong
block cha th khai bo ca block con s nh ngha li i tng
trng tn vi 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 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.
- 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.
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. 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.
172
end c_to_f;
variable temp : real;
begin
temp : = c_to_f (5.0) + 20.0; -- temp = 61
end process;
Tham s chuyn vo hm c hiu mc nh l mt hng s, v
khng c khai bo ca class.
b. Th tc v cc c trng ca chng.
- Chng c gi nh mt li pht biu.
- C th tr v khng hoc mt hoc nhiu i s.
- Cc tham s chuyn giao cho th tc c th l mode in, out, v
inout.
- Cc tham s chuyn giao cho th tc c th l tn hiu, hng,
bin.
- C th c cha pht biu Wait.
C php khai bo th tc nh sau:
procedure identifier interface_list is
{subprogram_declarative_item}
begin
{sequential_statement}
end [identifier];
Identifier c s dng ch ra tn ca procedure v
interface_list ch ra cc tham s hnh thc ca procedure. Mi tham
s c s dng theo nh ngha sau:
174
quay vc t c xc nh vi tn l ARRAY_NAME, bt u t
bit START_BIT ti bit STOP_BIT, bi mt gi tr ROTATE_BY.
Lp i tng ca tham s ARRAY_NAME c xc nh mt
cch tng minh. Bin FILL_VALUE t ng c khi to v 0
mi khi procedure c gi.
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
Cc procedure c gi bi li gi procedure. Mt li gi
Procedure c th l mt pht biu tun t hoc mt pht biu ng
thi, pht biu ny ph thuc vo ni xut hin li gi th tc hin
ti. Nu li gi ny nm bn trong mt pht biu process hoc mt
chng trnh con khc th n c gi l pht biu gi procedure
tun t, ngc li n c gi l pht biu gi procedure gi ng
thi. C php ca pht biu gi procedure nh sau :
[ label : ] procedure_name ( list_of_actual );
Thc t cc biu thc, cc bin, cc tn hiu hoc cc file, c
chuyn vo trong th tc v cc tn cu i tng v cc tn ny s
c dng ly cc gi tr tnh ton t trong th tc. Chng c
ch ra mt cch r rng bi vic s dng s kt hp theo tn v kt
hp theo v tr .
V d:
ARITH_UNIT (D1, D2, ADD, SUM, COMP ); -- S kt hp
theo v tr.
ARITH_UNIT ( Z => SUM, B=> D2, A=>D1,
OP=>ADD, ZCOMP => COMP); -- S kt hp
theo tn.
Mt pht biu gi th tc tun t c thc thi tun t cng vi
cc pht biu tun t chung quanh n. Mt pht biu gi th tc
ng thi c thc thi bt c lc no khi c mt s kin xy ra trn
mt trong cc tham s, m cc tham s ny l mt tn hiu ch
in hoc inout. Mt li gi th tc ng thi c ngha tng ng
177
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;
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;
thnh phn .
Mt n v c s din t hnh vi hot ng chnh l cc pht
biu process, cn n v c s din t theo kiu cu trc chnh l
cc pht biu th hin ca cc n v thnh phn. C hai loi ny
u c th c mt trong mt thn ca mt kin trc ( architecture ).
3.9.1. Cc khai bo thnh phn .
Mt thn kin trc c th s dng cc Entity khc (khng trong
cng khai bo ca architecture ), cc Entity ny c m t tch bit
v c t trong th vin thit k. s dng chng, ngi ta dng
cc khai bo thnh phn v cc pht biu th hin ca chng .Trong
m t thit k, mi pht biu khai bo thnh phn phi tng ng
vi mt Entity . Cc pht biu khai bo thnh phn phi ging vi
cc pht biu c ch ra trong Entity (cc pht biu giao tip vo ra
ca thnh phn ). C php khai bo ca chng nh sau:
component component _name
[ port ( local_port_declaration ) ]
end component ;
Trong component _name m t tn ca Entity v
port_declaration l khai bo cc cng ca component v phi trng
vi phn khai bo ch ra cu component nm trong phn khai bo
ca Entity.
3.9.2. Cc th hin ca component.
Mt component c nh ngha trong mt architecture c th
c th hin thng qua vic s dng cc pht biu th hin ca
183
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
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
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
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
188
Cout
FA (3) FA (2) FA (1) HA (0)
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 ;
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:
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
clock
RST
PB.Pulse
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. 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 ".
197
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
200
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 ;
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;
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 .
204
Bit0
VCC
Bit1
Bit2 VCC
VCC
Bit3 M
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 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.
208
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
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
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
-------
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. 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
223
S ta r t d0 d1
RXD
UART_RX
BAUD
RATE
TIMING
TXD
UART_TX
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.
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
Ph lc chng trnh 1
---------------------------- 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
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
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;
is
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
Ph lc chng trnh 2
-------------------------------------
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
------------------------------------------
-----------------
------------------------------------------
-----------------
-- 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;
------------------------------------------
---------------------------------------
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,Le
d,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
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 (R = '1') then
C1S <= '0';
end if;
end process;
O <= C1S;
34
end Behaviour;
35
South Australia.
15. Roger Lipsett & Carl Schaefer (1989), VHDL: Hardware
Description
and Design, Kluwer Academic Publishers, United
States of
America.
16. Ngun tham kho 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