Professional Documents
Culture Documents
- VHDL la ngon ng mo ta phan cng. - VHDL viet tat cua VHSIC (Very High Speed Integrated Circuit) Hardware Description Language - VHDL khong phan biet ch viet hoa va ch thng.
databus
Databus
DataBus
DATABUS
Thuat ng COMPONENT: - La khai niem trung tam mo ta phan cng bang VHDL e bieu dien cac cap thiet ke t cong n gian en 1 he thong phc tap. - Mo ta component bao gom ENTITY va ARCHITECTURE. - Mot component co the s dung cac component khac.
nand2 mux2to1 d0
a b
d1 sel
NguyenTrongLuat
Ma VHDL c ban
LIBRARY
thc the
ARCHITECTURE
kien truc
NguyenTrongLuat
a b
LIBRARY
- LIBRARY: khai bao th vien ieee - USE: s dung cac nh ngha goi (package) std_logic_1164
ENTITY
a b
NguyenTrongLuat
- ENTITY: at ten cho entity (nand_gate) - PORT: khai bao cac chan xuat/nhap * Ten port (portname): a, b, z * Kieu port (mode): IN, OUT * Kieu tn hieu (type): STD_LOGIC
IN: d lieu i vao entity qua port va co the c oc trong entity. OUT: d lieu xuat ra ngoai entity qua chan port. INOUT: la port 2 chieu, cho phep d lieu i vao hoac ra. BUFFER: tng t port OUT, nhng c phep oc lai bi entity.
IN OUT BUFFER
IN IN
INOUT
OUT
NguyenTrongLuat 6
ARCHITECTURE
Mo ta thiet ke ben trong cua khoi, ch ro moi quan he gia cac ngo vao va ngo ra.
a b
- Co 3 loai mo ta architecture
* Mo ta cau truc (Structural) * Mo ta luong d lieu (Dataflow) * Mo ta hanh vi (Behavioral)
NguyenTrongLuat 7
Cac oi tng d lieu co the c at gia tr au, khai bao sau phan khai bao kieu d lieu _type:= value;
CONSTANT
NguyenTrongLuat
* S khac nhau gia Tn hieu (Signal) va Bien (Variable) - Lenh gan tn hieu: signal_name <= expression; a <= NOT b AND c; - Lenh gan bien: variable_name := expression; y := NOT a; - Phep gan bien (Variable) cho gia tr tc thi, phep gan cua tn hieu (signal) b tre (delay) - Tn hieu (Signal) co the quan sat dang song (waveform), nhng bien (Variable) th khong.
* Kieu INTEGER * Kieu BOOLEAN: * Kieu CHARACTER * Kieu liet ke (ENUMERATION) * ...
NguyenTrongLuat
* STD_LOGIC:
Value
X 0 1 Z W L H - U
Meaning
Forcing (Strong driven) Unknown Forcing (Strong driven) 0 Forcing (Strong driven) 1 High Impedance Weak (Weakly driven) Unknown Weak (Weakly driven) 0. Models a pull down. Weak (Weakly driven) 1. Models a pull up. Don't Care Uninitialized
- La kieu tn hieu quyet nh (co the c lai bang 2 ngo vao) - Co 9 gia tr - Hu ch khi mo phong - Ch co 3 gia tr 0, 1, Z la co the tong hp
11
a a b c d e f b
1; -- gia tr gan at gia 1 dau nhay n b(2); -- a <= b(2), "0000; -- gia tr gan at gia 1 dau nhay kep B0000; -- B la ky hieu c so 2 (co the bo) 0110_0111; -- bieu dien tng nhom 4 bit phan cach _ XAF67; -- X la ky hieu c so 16 (Hex) O723; -- O la ky hieu c so 8 (Octal) c; -- b(3) <= c(0), b(2) <= c(1),
12
--
c = 00001111
-- d = 00001111
NguyenTrongLuat
13
NOT
AND
OR
NAND
NOR
XOR
XNOR
/=
<
<=
>
>=
So sanh 2 toan hang cung kieu va ket qua tra ve kieu boolean * Phep toan dch (Shift Operator):
SLL
SRL
SLA
SRA
ROL
ROR
14
MOD
REM ** + ABS
** * + + = AND
NguyenTrongLuat
ABS NOT / MOD REM (Dau) & /= < <= > >= OR NAND NOR XOR XNOR
15
Cac phep toan cung loai khong co u tien, neu can s dung ( )
MO TA THIET KE
(Design description)
CAU TRUC LUONG D LIEU HANH VI
(Structural)
(Dataflow)
(Behavioral)
NguyenTrongLuat
16
- Cac component cap thap c khai bao bang lenh COMPONENT, at phan ARCHITECTURE (trc BEGIN).
x1 x2
- e ket noi component cap thap, thc hien lenh thay the tr so component
* Ket hp theo ten (named association) COMPONENT component_name port declarations; END COMPONENT; ... Label: component_name PORT MAP ( port_name1 => sig_name1, port_name2 => sig_name2 );
COMPONENT and2 PORT (x1,x2:IN STD_LOGIC; y: OUT STD_LOGIC); END COMPONENT; BEGIN user1: and2 PORT MAP ( x1 => a, x2 => b, y => c ); ...
NguyenTrongLuat 18
* Ket hp v tr (positional association) COMPONENT component_name port declarations; END COMPONENT; ... Label: component_name PORT MAP ( sig_name1, sig_name2, ...
);
COMPONENT and2 PORT (x1,x2:IN STD_LOGIC; y: OUT STD_LOGIC); END COMPONENT; BEGIN user1: and2 PORT MAP ( a, b, c ); ...
NguyenTrongLuat 19
a b
c
u1_out result
ENTITY xor3 IS PORT ( a, b, c : IN STD_LOGIC; result : OUT STD_LOGIC); END xor3; ARCHITECTURE structural OF xor3 IS SIGNAL u1_out: STD_LOGIC; COMPONENT xor2 PORT ( i1, i2 : IN STD_LOGIC; y : OUT STD_LOGIC ); END COMPONENT; BEGIN u1: xor2 PORT MAP ( i1 => a, i2 => b, y => u1_out); u2: xor2 PORT MAP ( i1 => u1_out, i2 => c, y => result); END structural;
NguyenTrongLuat 20
u1_out
result
VD: Mux2to1
mux2to1 d0 d1 sel y
sel
0 1
NguyenTrongLuat
y
d0 d1
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux2to1 IS PORT ( d0, d1 : IN STD_LOGIC; sel : IN STD_LOGIC; y : OUT STD_LOGIC); END mux2to1; ARCHITECTURE dataflow1 OF mux2to1 IS BEGIN y <= d0 WHEN sel = 0 ELSE d1; END dataflow1; y <= d0 WHEN sel = 0 ELSE d1 WHEN OTHERS;
23
VD: xnor2
xnor2
a b c
0 0 1 1 0 1 0 1
c
1 0 0 1
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY xnor2 IS PORT ( a, b : IN STD_LOGIC; c : OUT STD_LOGIC); END xnor2; ARCHITECTURE dataflow1 OF xnor2 IS BEGIN c <= 1 WHEN a = 0 AND b = 0 WHEN a = 0 AND b = 0 WHEN a = 1 AND b = 1 WHEN a = 1 AND b = 0 WHEN OTHERS; END dataflow1;
NguyenTrongLuat
0 1 0 1
24
sel
0 1
NguyenTrongLuat
y
d0 d1
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux2to1 IS PORT ( d0, d1 : IN STD_LOGIC; sel : IN STD_LOGIC; y : OUT STD_LOGIC); END mux2to1; ARCHITECTURE dataflow2 OF mux2to1 IS BEGIN WITH sel SELECT y <= d0 WHEN 0, d1 WHEN OTHERS; END dataflow2;
25
WITH select_signal SELECT signal_name <= value1 WHEN const1_of_select_signal, {value2 WHEN const2_of_select_signal,} valueN WHEN OTHERS;
Tham so const_of_select_signal co the bieu dien nhieu gia tr rieng biet hoac 1 dai gia tr lien tiep.
PORT ( d0, d1, d2, d3 : IN STD_LOGIC; sel : IN STD_LOGIC_VECTOR(2 DOWNTO 0); y : OUT STD_LOGIC ); ... ... WITH sel SELECT y <= d0 WHEN d1 WHEN d2 WHEN d3 WHEN
NguyenTrongLuat
VD: xnor2
xnor2
a b c
0 0 1 1 0 1 0 1
c
1 0 0 1
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY xnor2 IS PORT ( a, b : IN STD_LOGIC; c : OUT STD_LOGIC); END xnor2; ARCHITECTURE dataflow2 OF xnor2 IS SIGNAL ab : STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN ab <= a & b; WITH ab SELECT c <= 1 WHEN 00 | 11, 0 WHEN OTHERS; END dataflow2;
NguyenTrongLuat 27
g0: FOR i IN 0 to 3 GENERATE z(i) <= x(i) and y(i+8); END GENERATE; xor_array: FOR i IN 7 downto 0 GENERATE user: xor2 PORT MAP ( x(i), y(i), z(i) END GENERATE;
NguyenTrongLuat
);
28
GENERIC - La cau truc e a 1 hang so vao trong entity giong khai bao CONSTANT. - Tien li cua generic la co the s dung no trong phep gan thay the tr so tng ng component (component instantitation), e s dung cac gia tr hang so khac nhau khi tham chieu component.
ENTITY entity_name IS
GENERIC ( generic_name1: data_type := default_values; generic_name2: data_type := default_values; ) PORT ( port_name: mode data_type; ... ) END entity_name;
NguyenTrongLuat 29
PROCESS
- Process thc hien cac lenh ben trong no 1 cach tuan t. V vay th t cua cac lenh rat quan trong. - Process c kch hoat khi co s thay oi cua 1 tn hieu. [Name:] PROCESS (sensitivity list) variable declarations BEGIN sequential statements END PROCESS [Name];
Sensitivity list: danh sach cam nhan Variable declarations: khai bao bien
- Mot Architecture co nhieu Process. Cac Process la cac phat bieu ong thi
NguyenTrongLuat 32
- Khi Process c kch hoat th cac phat bieu ben trong process c thc hien tuan t. Khi thc hien xong phat bieu cuoi cung th Process vao trang thai ch (suspend).
VD: Mux2to1
mux2to1 d0
d1 sel y
sel
0 1
y
d0 d1
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux2to1 IS PORT ( d0, d1 , sel : IN STD_LOGIC; y : OUT STD_LOGIC); END mux2to1; ARCHITECTURE behavior1 OF mux2to1 IS BEGIN PROCESS (d0, d1, sel) BEGIN IF sel = 0 THEN y <= d0 ; ELSE y <= d1 ; END IF; END PROCESS; END behavior1;
34
NguyenTrongLuat
VD: Mux2to1
mux2to1 d0 d1 sel y
sel
0 1
NguyenTrongLuat
y
d0 d1
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux2to1 IS PORT ( d0, d1 , sel : IN STD_LOGIC; y : OUT STD_LOGIC); END mux2to1; ARCHITECTURE behavior2 OF mux2to1 IS BEGIN PROCESS (d0, d1, sel) BEGIN CASE sel IS WHEN 0 => y <= d0 ; WHEN OTHERS => y <= d1 ; END CASE; END PROCESS; END behavior2;
35
sqr: FOR
i IN 1 to 10 LOOP a(i) := i*i; END LOOP sqr; FOR j IN 3 downto 0 LOOP IF reset(j) = 1 THEN data(j) := 0; END IF; END LOOP;
NguyenTrongLuat
36
NguyenTrongLuat
37
NguyenTrongLuat
38
fulladder
x y z
BO CONG
s=x y z c=xy +yz +xz
s c
A D D E R
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY fulladder IS PORT ( x , y , z : IN STD_LOGIC; s , c : OUT STD_LOGIC); END fulladder; ARCHITECTURE Function OF fulladder IS BEGIN s <= x XOR y XOR z ; C <= (x AND y) OR (y AND z) OR (x AND z); END Function;
NguyenTrongLuat 39
adder4
Cout LIBRARY ieee; USE ieee.std_logic_1164.all; s3 ENTITY adder4 IS s2 b3 PORT ( Cin : IN STD_LOGIC; s1 b2 a, b : IN STD_LOGIC_VECTOR(3 downto 0); s0 s : OUT STD_LOGIC_VECTOR(3 downto 0); b1 Cout : OUT STD_LOGIC); b0 END adder4; ARCHITECTURE Structure OF adder4 IS Cin SIGNAL c : STD_LOGIC_VECTOR(1 to 3); COMPONENT fulladder PORT ( x , y , z : IN STD_LOGIC; s , c : OUT STD_LOGIC); END COMPONENT; BEGIN stage0: fulladder PORT MAP(a(0),b(0),Cin,s(0),c(1)) ; stage1: fulladder PORT MAP(a(1),b(1),c(1),s(1),c(2)) ; stage2: fulladder PORT MAP(a(2),b(2),c(2),s(2),c(3)) ; stage3: fulladder PORT MAP(a(3),b(3),c(3),s(3),Cout) ; END Structure;
NguyenTrongLuat 40
a3 a2 a1 a0
hieu std_logic.
NguyenTrongLuat
41
BO DON KENH
LIBRARY ieee; MUX4 USE ieee.std_logic_1164.all; ENTITY mux4 IS d0 PORT ( d1 y d0 , d1 , d2 , d3 : IN STD_LOGIC; d2 s : IN STD_LOGIC_VECTOR(1 downto 0); d3 y : OUT STD_LOGIC); s0 s1 END mux4; ARCHITECTURE Function OF mux4 IS BEGIN s1 s0 y <= (NOT s(1) AND NOT s(0) AND d0) OR (NOT s(1) AND s(0) AND d1) OR 0 0 (s(1) AND NOT s(0) AND d2) OR 0 1 (s(1) AND s(0) AND d3 ); 1 0 END Function; 1 1 ARCHITECTURE Dataflow OF mux4 IS BEGIN WITH s SELECT y <= d0 WHEN s = 00 ELSE y <= d0 WHEN d1 WHEN s = 01 ELSE d1 WHEN d2 WHEN s = 10 ELSE d2 WHEN d3 WHEN OTHERS; d3 WHEN END Dataflow;
NguyenTrongLuat
M U X
y
d0 d1 d2 d3
00, 01, 10, OTHERS;
42
LIBRARY ieee; USE ieee.std_logic_1164.all; mux16 c3 c2 c1 c0 f ENTITY mux16 IS 0 0 0 0 d0 PORT ( 0 0 0 1 d1 d : IN STD_LOGIC_VECTOR(15 downto 0); 0 0 1 0 d2 c : IN STD_LOGIC_VECTOR(3 downto 0); 0 0 1 1 d3 f : OUT STD_LOGIC); 0 1 0 0 d4 0 1 0 1 d5 END mux16; 0 1 1 0 d6 ARCHITECTURE Structure OF mux16 IS 0 1 1 1 d7 SIGNAL w : STD_LOGIC_VECTOR(0 to 3); 1 0 0 0 d8 COMPONENT mux4 1 0 0 1 d9 1 0 1 0 d10 PORT ( 1 0 1 1 d11 d0 , d1 , d2 , d3 : IN STD_LOGIC; 1 1 0 0 d12 s : IN STD_LOGIC_VECTOR(1 downto 0); 1 1 0 1 d13 y : OUT STD_LOGIC); 1 1 1 0 d14 1 1 1 1 d15 END COMPONENT; BEGIN M0: mux4 PORT MAP (d(0),d(1),d(2),d(3),c(1 downto 0),w(0)); M1: mux4 PORT MAP (d(4),d(5),d(6),d(7),c(1 downto 0),w(1)); M2: mux4 PORT MAP (d(8),d(9),d(10),d(11),c(1 downto 0),w(2)); M3: mux4 PORT MAP (d(12),d(13),d(14),d(15),c(1 downto 0),w(3)); M4: mux4 PORT MAP (w(0),w(1),w(2),w(3),c(3 downto 2),f); END Structure;
NguyenTrongLuat 43
LIBRARY ieee; USE ieee.std_logic_1164.all; S dung ENTITY mux16 IS PORT ( GENERATE d : IN STD_LOGIC_VECTOR(15 downto 0); c : IN STD_LOGIC_VECTOR(3 downto 0); f : OUT STD_LOGIC); END mux16; ARCHITECTURE Structure2 OF mux16 IS SIGNAL w : STD_LOGIC_VECTOR(0 to 3); COMPONENT mux4 PORT ( d0 , d1 , d2 , d3 : IN STD_LOGIC; s : IN STD_LOGIC_VECTOR(1 downto 0); y : OUT STD_LOGIC); END COMPONENT; BEGIN G0: FOR i IN 0 to 3 GENERATE MUXES: mux4 PORT MAP ( d(4*i),d(4*i+1),d(4*i+2),d(4*i+3),c(1 downto 0),w(i)); END GENERATE; M4: mux4 PORT MAP (w(0),w(1),w(2),w(3),c(3 downto 2),f); END Structure2;
NguyenTrongLuat 44
BO GIAI MA
dec2x4 y0 x0 x1 y1
en x1 x0
y3 y2 y1 y0
0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
LIBRARY ieee; y2 USE ieee.std_logic_1164.all; en ENTITY dec2x4 IS y3 PORT ( en : IN STD_LOGIC; x : IN STD_LOGIC_VECTOR(1 downto 0); y : OUT STD_LOGIC_VECTOR(3 downto 0)); END dec2x4; ARCHITECTURE flow OF dec2x4 IS SIGNAL ARCHITECTURE flow2 OF temp: STD_LOGIC_VECTOR(3 downto 0); dec2x4 IS BEGIN SIGNAL WITH x SELECT en_x: STD_LOGIC_VECTOR( temp <= 0001 WHEN 00 , 2 downto 0); BEGIN 0010 WHEN 01 , en_x <= en & x; 0100 WHEN 10 , WITH en_x SELECT 1000 WHEN 11 , f <= 0001 WHEN 100 , 0000 WHEN OTHERS; 0010 WHEN 101 , y <= temp WHEN en = 1 0100 WHEN 110 , ELSE 0000; 1000 WHEN 111 , END flow; 0000 WHEN OTHERS; END flow2; NguyenTrongLuat 45
0 1 1 1 1
X 0 0 1 1
X 0 1 0 1
D E C O D E R
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dec138 IS PORT ( c, b, a : IN STD_LOGIC; g1,g2a,g2b: IN STD_LOGIC; y : OUT STD_LOGIC_VECTOR(7 downto 0)); END dec138; ARCHITECTURE flow OF dec138 IS SIGNAL data: STD_LOGIC_VECTOR(2 downto 0); temp: STD_LOGIC_VECTOR(7 downto 0); BEGIN data <= c & b & a; WITH data SELECT temp <= 11111110 WHEN 000 , 11111101 WHEN 001 , 11111011 WHEN 010 , 11110111 WHEN 011 , 11101111 WHEN 100 , 11011111 WHEN 101 , 10111111 WHEN 110 , 01111111 WHEN 111 , 11111111 WHEN OTHERS; y <= temp WHEN (g1 AND NOT g2a AND NOT g2b) = 1 ELSE 11111111; END flow;
NguyenTrongLuat 46
S dung PROCESS
Phat bieu
If . Case .
BO GIAI MA 38
NguyenTrongLuat
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dec3to8 IS PORT (x : IN STD_LOGIC_VECTOR(2 downto 0); en: IN STD_LOGIC; y : OUT STD_LOGIC_VECTOR(7 downto 0)); END dec3to8; ARCHITECTURE behavior OF dec3to8 IS BEGIN PROCESS (x, en) BEGIN y <= 11111111; IF (en = 1) THEN CASE x IS WHEN 000 => y(0) <= 0; WHEN 001 => y(1) <= 0; WHEN 010 => y(2) <= 0; WHEN 011 => y(3) <= 0; WHEN 100 => y(4) <= 0; WHEN 101 => y(5) <= 0; WHEN 110 => y(6) <= 0; WHEN 111 => y(7) <= 0; END CASE; END IF; END PROCESS; END behavior;
47
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; ENTITY decode38 IS S dung PORT ( x : IN STD_LOGIC_VECTOR(2 downto 0); PROCESS y : OUT STD_LOGIC_VECTOR(0 to 7)); END decode38; ARCHITECTURE behavior OF decode38 IS BEGIN Phat bieu PROCESS(x) VARIABLE j: integer; For . loop BEGIN j := CONV_INTEGER(x); S dung ham CONV_INTEGER e oi d lieu kieu FOR i IN 0 to 7 LOOP STD_LOGIC_VECTOR thanh kieu INTEGER. IF (i = j) THEN y(i) <= 0; e s dung ham nay, trong phan LIBRARY can phai ELSE y(i) <= 1; khai bao goi (package) END IF; - STD_LOGIC_ARITH END LOOP; - STD_LOGIC_UNSIGNED END PROCESS; END behavior;
NguyenTrongLuat 48
BO GIAI MA 38
encoder i0 x0 i1 x1 i2 v i3
BO MA HOA U TIEN
i3 i2 i1 i0
0 0 0 0 1 0 0 0 1 X 0 0 1 X X 0 1 X X X
x1 x0 v
d 0 0 1 1 d 0 1 0 1 0 1 1 1 1
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY encoder IS PORT ( i : IN STD_LOGIC_VECTOR(3 downto 0); x : OUT STD_LOGIC_VECTOR(1 downto 0); v : OUT STD_LOGIC); END encoder; ARCHITECTURE flow OF encoder IS WITH i SELECT BEGIN x <=00 WHEN 0001 , x <= 11 WHEN i(3) = 1 ELSE 01 WHEN 0010|0011, 10 WHEN i(2) = 1 ELSE 10 WHEN 0100 01 WHEN i(1) = 1 ELSE to 0111, 11 WHEN OTHERS; 00 ; WITH i SELECT v <= 0 WHEN i = 0000 V <=0 WHEN 0000, ELSE 1; 1 WHEN OTHERS; END flow;
NguyenTrongLuat 49
E N C O D E R
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY encoder2 IS PORT ( i : IN STD_LOGIC_VECTOR(3 downto 0); x : OUT STD_LOGIC_VECTOR(1 downto 0); v : OUT STD_LOGIC); END encoder2; ARCHITECTURE behavior OF encoder2 IS BEGIN PROCESS (i) PROCESS (i) BEGIN BEGIN x <= 00; IF i(3) = 1 THEN x <= 11; IF i(1)=1 ELSIF i(2) = 1THEN END IF; x <= 10; IF i(2)=1 ELSIF i(1) = 1THEN END IF; x <= 01; IF i(3)=1 ELSIF x <= 00; END IF; END IF; v <= 1; END PROCESS; IF i=0000 v <= 0 WHEN i = 0000 END IF; ELSE 1; END PROCESS; END behavior;
NguyenTrongLuat
PROCESS
S dung
THEN x <=11;
THEN v <=0;
50
BO SO SANH 4 BIT
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY compare IS PORT (a, b : IN STD_LOGIC_VECTOR(3 downto aeqb, agtb, altb : OUT STD_LOGIC); END compare; ARCHITECTURE behavior1 OF compare IS BEGIN aeqb <= 1 WHEN a = b ELSE 0; agtb <= 1 WHEN a > b ELSE 0; altb <= 1 WHEN a < b ELSE 0; END behavior1; ARCHITECTURE behavior2 OF compare IS BEGIN PROCESS (a, b) BEGIN aeqb <= 0; agtb <= 0; altb <= 0; IF a = b THEN aeqb <= 1; END IF; IF a > b THEN agtb <= 1; END IF; IF a < b THEN altb <= 1; END IF; END PROCESS; END behavior2;
NguyenTrongLuat
BO SO SANH C O M P A 0); R A T O R
51
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY led IS PORT ( bcd : IN STD_LOGIC_VECTOR(3 downto 0); segs : OUT STD_LOGIC_VECTOR(6 downto 0); END led; ARCHITECTURE Behavioral OF led IS BEGIN PROCESS(bcd) BEGIN CASE bcd IS -- abcdefg WHEN "0000" => segs <= "1111110"; WHEN "0001" => segs <= "0110000"; WHEN "0010" => segs <= "1101101"; WHEN "0011" => segs <= "1111001"; WHEN "0100" => segs <= "0110011"; WHEN "0101" => segs <= "1011011"; WHEN "0110" => segs <= "1011111"; WHEN "0111" => segs <= "1110000"; WHEN "1000" => segs <= "1111111"; WHEN "1001" => segs <= "1111011"; WHEN OTHERS => segs <= "0000000";-- ALL OFF END CASE; END PROCESS; END Behavioral;
NguyenTrongLuat
D T O 7 S E G S
52
NguyenTrongLuat
53
MACH CHOT
Dlatch D Q LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY Dlatch IS PORT (D, Clk : IN STD_LOGIC; Q, Qn : OUT STD_LOGIC); END Dlatch; ARCHITECTURE behavior OF Dlatch IS BEGIN PROCESS (D, Clk) BEGIN IF Clk = 1 THEN Q <= D; Qn <= NOT Q; END IF; END PROCESS; END behavior;
54
Clk
clk D
0 X 1 0 1 1
Q+ Q+ Q Q 0 1 1 0
NguyenTrongLuat
LIBRARY ieee; USE ieee.std_logic_1164.all; Dflipflop ENTITY Dflipflop IS PORT (D, Clk : IN STD_LOGIC; D Q Q, Qn : OUT STD_LOGIC); END Dflipflop; ARCHITECTURE behavior OF Dflipflop IS Q clk BEGIN PROCESS (Clk) BEGIN IF Clkevent AND Clk = 1 THEN Q <= D; IF rising_edge(clk) THEN Qn <= NOT Q; END IF; END PROCESS; END behavior;
FLIP - FLOP
- Goi std_logic_1164 co nh ngha 2 ham (function): rising_edge e phat hien canh len va falling_edge e phat hien canh xuong cua tn hieu.
NguyenTrongLuat 55
Pr D Q
DFF
Clk Cl Q
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY DFF IS PORT (D, Clk, Pr, Cl : IN STD_LOGIC; Q, Qn : OUT STD_LOGIC); END DFF; ARCHITECTURE behavior OF DFF IS BEGIN PROCESS (Clk, Pr, Cl) BEGIN IF Pr = 0 THEN Q <= 1; Qn <= 0; ELSIF Cl = 0 THEN Q <= 0; Qn <= 1; ELSIF Clkevent AND Clk = 0 THEN Q <= D; Qn <= NOT Q; END IF; END PROCESS; END behavior;
56
NguyenTrongLuat
57
BO EM (COUNTER)
LIBRARY ieee; Upcnt4 USE ieee.std_logic_1164.all USE ieee.std_logic_unsigned.all; Rst Q0 ENTITY Upcnt4 IS Q1 PORT (Clk, Rst : IN STD_LOGIC; Q: OUT STD_LOGIC_VECTOR(3 downto 0)); Q2 END Upcnt4; Clk Q3 ARCHITECTURE Behavioral OF Upcnt4 IS BEGIN PROCESS (Clk, Rst) VARIABLE count: STD_LOGIC_VECTOR (3 downto 0); BEGIN IF Rst ='1' THEN count := (others=>'0'); ELSIF rising_edge(clk) THEN count := count + "0001"; END IF; S dung bien count e thc hien chc nang bo em Q <= count; Bien count c gan cho ngo ra Q cuoi Process, END PROCESS; v bien la gia tr cuc bo trong Process END Behavioral;
NguyenTrongLuat 58
LIBRARY ieee; USE ieee.std_logic_1164.all USE ieee.std_logic_unsigned.all; ENTITY Upcnt4 IS PORT ( Clk, Rst : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(3 downto 0)); END Upcnt4; ARCHITECTURE Behavioral OF Upcnt4 IS SIGNAL count: STD_LOGIC_VECTOR (3 downto 0); BEGIN (Clk, Rst) Bo em co PROCESS BEGIN reset ong IF rising_edge(clk) THEN IF Rst ='1' THEN bo count <= (others=>'0'); ELSE count <= count + "0001"; END IF; END IF; S dung tn hieu count thay cho bien count. END PROCESS; Q <= count; Tn hieu count c gan cho ngo ra Q ben END Behavioral; ngoai Process.
NguyenTrongLuat 59
LIBRARY ieee; BO EM LEN USE ieee.std_logic_1164.all THAP PHAN USE ieee.std_logic_unsigned.all; ENTITY Upcnt10 IS PORT ( Clk, Rst : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(3 downto 0)); END Upcnt10; ARCHITECTURE Behavioral OF Upcnt10 IS BEGIN PROCESS (Clk, Rst) VARIABLE count: STD_LOGIC_VECTOR (3 downto 0); BEGIN IF Rst ='1' THEN count := (others=>'0'); ELSIF rising_edge(clk) THEN IF count = "1001" then count := (others=>'0'); ELSE count := count + "0001"; END IF; END IF; Q <= count; END PROCESS; END Behavioral;
NguyenTrongLuat 60
LIBRARY ieee; BO EM 4 bit USE ieee.std_logic_1164.all LEN / XUONG USE ieee.std_logic_unsigned.all; ENTITY Updncnt4 IS PORT ( Clk, Rst, Updn: IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(3 downto 0)); END Updncnt4; ARCHITECTURE Behavioral OF Updncnt4 IS SIGNAL count: STD_LOGIC_VECTOR (3 downto 0); BEGIN PROCESS (Clk, Rst) BEGIN IF Rst = 1 THEN count <= (others =>0); Updn Q0 ELSIF rising_edge(Clk) THEN Q1 Rst IF Updn = 1 THEN Q2 count <= count + 0001; Q3 Clk ELSE count <= count - 0001; Updncnt4 END IF; END IF; END PROCESS; Q <= count; END Behavioral;
NguyenTrongLuat 61
S I P O
62
S I S O
siso LIBRARY ieee; Serin USE ieee.std_logic_1164.all; ENTITY siso IS GENERIC (n : NATURAL := 8); Serout PORT (Clk, Serin : IN STD_LOGIC; Clk Serout : OUT STD_LOGIC); END siso; ARCHITECTURE shiftreg OF siso IS SIGNAL reg : STD_LOGIC_VECTOR(n-1 downto 0); BEGIN PROCESS (Clk) BEGIN IF rising_edge(Clk) THEN reg <= reg(n-2 downto 0) & Serin; END IF; END PROCESS; Serout <= reg(n-1); END shiftreg;
63
NguyenTrongLuat
piso
LIBRARY ieee; Clk USE ieee.std_logic_1164.all; ShLd ENTITY piso IS Serin n GENERIC (n: NATURAL := 8); D Serout PORT (Serin, Clk, ShLd : IN STD_LOGIC; D : IN STD_LOGIC_VECTOR(n-1 downto 0); Serout : OUT STD_LOGIC); END piso; ARCHITECTURE shiftreg OF piso IS SIGNAL reg : STD_LOGIC_VECTOR(n-1 downto 0); BEGIN PROCESS (Clk) BEGIN IF rising_edge(Clk) THEN IF ShLd = 0 THEN reg <= D; ELSE reg <= reg(n-2 downto 0) & Serin; END IF; I END PROCESS; S Serout <= reg(n-1); O END shiftreg;
NguyenTrongLuat
64
FSM
- May trang thai hu han c thiet ke de dang bang phat bieu PROCESS. - Viec chuyen trang thai c mo ta trong Process vi danh sach cam nhan (sensitivity list) la clock va tn hieu reset bat ong bo.
- Ngo ra co the c mo ta bang cac phat bieu ong thi (concurrenrt) nam ngoai process.
- Co 2 kieu FSM: MOORE va MEALY
NguyenTrongLuat
65
Inputs
MOORE FSM
clock reset
Outputs Output function Present State Register: thanh ghi trang thai hien tai lu gi 1 trang thai hien tai, se chuyen trang thai khi co xung clock. Next state function: ham trang thai ke tiep la mach to hp phu thuoc vao ngo vao va trang thai hien tai Output function: ham ngo ra la mach to hp phu thuoc vao trang thai hien tai
NguyenTrongLuat 66
clock reset
Output function
Outputs
Concurrent Statements
- Process Ham ngo ra co the thay the bang cac phat bieu ong thi (concurrent
statement)
LIBRARY ieee; PROCESS (reset, clock) USE iee.std_logic_1164.all; ENTITY Moore_FSM IS PORT (clock, rerset, input: IN std_logic; output: OUT std_logic); END Moore_FSM; ARCHITECTURE behavior OF Moore_FSM IS TYPE state IS (list of states); SIGNAL pr_state, nx_state: state; BEGIN PROCESS(clk, reset) BEGIN IF reset = 1 THEN pr_state <= reset state; ELSIF (clock = 1 and clockevent) THEN pr_state <= nx_state; END IF; END PROCESS;
TYPE state IS (list of states): khai bao state la d lieu kieu liet ke
NguyenTrongLuat 68
69
TT hien tai S0 S1 S2 S3
Ngo ra (z)
LIBRARY ieee; USE iee.std_logic_1164.all; ENTITY Moore_FSM IS PORT ( clock, rerset, x: IN std_logic; z: OUT std_logic); END Moore_FSM; ARCHITECTURE behavior OF Moore_FSM IS TYPE state IS (S0, S1, S2, S3); SIGNAL pr_state, nx_state: state; BEGIN regst: PROCESS(clk, reset) BEGIN IF reset = 1 THEN pr_state <= S0; ELSIF (clock = 1 and clockevent) THEN pr_state <= nx_state; END IF; END PROCESS;
NguyenTrongLuat 71
0 0 0 1
nxst: PROCESS (x, ps_state ) x=0 CASE ps_state IS WHEN S0 => S0 S0 IF x = 0 THEN S1 S2 nx_state <= S0; S2 S0 ELSIF nx_state <= S1; S3 S2 END IF; WHEN S1 => IF x = 0 THEN nx_state <= S2; ELSIF nx_state <= S1; END IF; WHEN S2 => IF x = 0 THEN nx_state <= S0; ELSIF nx_state <= S3; END IF; WHEN S3 => IF x = 0 THEN nx_state <= S2; ELSIF nx_state <= S1; END IF; END CASE; END PROCESS;
NguyenTrongLuat
TT hien tai
TT ke tiep x=1 S1 S1 S3 S1
Ngo ra (z)
0 0 0 1
72
TT hien tai
Ngo ra (z)
Output: PROCESS(ps_state ) CASE ps_state IS WHEN S3 => z <= 1; WHEN OTHERS => z <= 0; END CASE; END PROCESS; END behavior;
S0 S1 S2 S3
0 0 0 1
NguyenTrongLuat
73
nx_out: PROCESS (x, ps_state ) x=0 CASE ps_state IS WHEN S0 => S0 S0 z <= 0; S2 S1 IF x = 0 THEN S0 S2 nx_state <= S0; S2 S3 ELSIF nx_state <= S1; END IF; WHEN S1 => z <= 0; IF x = 0 THEN nx_state <= S2; ELSIF nx_state <= S1; END IF; WHEN S2 => z <= 0; IF x = 0 THEN nx_state <= S0; ELSIF nx_state <= S3; END IF; WHEN S3 => z <= 1; IF x = 0 THEN nx_state <= S2; ELSIF nx_state <= S1; END IF; END CASE; END PROCESS; Ket hp Process 2 va 3 thanh 1 Process END behavior;
NguyenTrongLuat
TT hien tai
TT ke tiep x=1 S1 S1 S3 S1
Ngo ra (z)
0 0 0 1
74
MEALY FSM
FSM kieu MEALY c mo ta bang 2 PROCESS
Inputs
Present State
Process Ham trang thai ke tiep va Ngo ra: PROCESS (input, present_state) Process Thanh ghi trang thai:
PROCESS (reset, clock)
clock reset
Output function
NguyenTrongLuat
Outputs
75
PROCESS (input, ps_state ) CASE ps_state IS WHEN state_1 => IF input = THEN output <= ...; nx_state <= state_2; ELSIF output <= ...; nx_state <= state_3; END IF; . . . END CASE; END PROCESS;
NguyenTrongLuat
76
nx_out: PROCESS (x, ps_state ) CASE ps_state IS WHEN S0 => IF x = 0 THEN z <= 0; nx_state <= S0; ELSIF z <= 0; nx_state <= S1; END IF; WHEN S1 => IF x = 0 THEN z <= 0; nx_state <= S2; ELSIF z <= 0; nx_state <= S1; END IF; WHEN S2 => IF x = 0 THEN z <= 0; nx_state <= S2; ELSIF z <= 0; nx_state <= S1; END IF; END CASE; END PROCESS;
NguyenTrongLuat
TT HT S0 S1 S2
TT ke tiep X=0 S0 S2 S2 1 S1 S1 S1
77
Gn trng thi
- Viec gan trang thai thng la t ong.
TYPE state IS (S0, S1, S2); SIGNAL pr_state, nx_state: state;
TYPE state IS STD_LOGIC_VECTOR(1 downto 0); CONSTANT S0: state:= 00; CONSTANT S1: state:= 01; CONSTANT S2: state:= 11; SIGNAL pr_state, nx_state: state;
Process c thc thi khi co s thay oi gia tr cua 1 hoac nhieu tn hieu trong danh sach cam nhan
WAIT UNTIL condition_signal;
Process c thc thi khi co ieu kien cua 1 tn hieu xay ra (true)
WAIT FOR time;
Ch dung trong mo phong (testbench). Tam dng thc hien Process trong 1 khoang thi gian (time).
NguyenTrongLuat 79
LIBRARY ieee; Dlatch USE ieee.std_logic_1164.all; ENTITY Dlatch IS D Q PORT (D, Clk : IN STD_LOGIC; Q, Qn : OUT STD_LOGIC); END Dlatch; Q Clk ARCHITECTURE behavior OF Dlatch IS BEGIN PROCESS (D, Clk) BEGIN ARCHITECTURE behavior OF Dlatch IS IF Clk = 1 THEN BEGIN Q <= D; PROCESS Qn <= NOT Q; BEGIN END IF; WAIT ON Clk, D; END PROCESS; IF Clk = 1 THEN END behavior; Q <= D; Qn <= NOT Q; END IF; END PROCESS; END behavior;
NguyenTrongLuat 80
LIBRARY ieee; USE ieee.std_logic_1164.all; Dflipflop ENTITY Dflipflop IS PORT (D, Clk : IN STD_LOGIC; D Q Q, Qn : OUT STD_LOGIC); END Dflipflop; ARCHITECTURE behavior OF Dflipflop IS Q clk BEGIN PROCESS (Clk) BEGIN IF Clkevent AND Clk = 1 THEN Q <= D; Qn <= NOT Q; END IF; ARCHITECTURE behavior OF Dflipflop IS END PROCESS; BEGIN END behavior; PROCESS BEGIN WAIT UNTIL Clkevent AND Clk = 1; Q <= D; Qn <= NOT Q; END PROCESS; END behavior;
NguyenTrongLuat 81