Академический Документы
Профессиональный Документы
Культура Документы
- VHDL khoâng phaân bieät chöõ vieát hoa vaø chöõ thöôøng.
databus Databus DataBus DATABUS
- VHDL laø ngoân ngöõ “ñònh daïng töï do”.
if (a=b) then
if (a=b) then
if (a =
b) then
NguyenTrongLuat 1
Naming and Labeling
General rules of thumb (according to VHDL-87)
nand2 mux2to1
d0
a
z d1 y
b
sel
NguyenTrongLuat 4
Maõ VHDL cô baûn
LIBRARY
khai baùo thö vieän
ENTITY
thöïc theå
ARCHITECTURE
kieán truùc
NguyenTrongLuat 5
Ví duï: Maõ VHDL moâ taû component NAND 2 ngoõ vaøo
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY nand_gate IS
PORT(
a a : IN STD_LOGIC;
z
b b : IN STD_LOGIC;
z : OUT STD_LOGIC);
END nand_gate;
NguyenTrongLuat 6
Library Declarations
LIBRARY ieee;
USE ieee.std_logic_1164.all;
Library declaration
ENTITY nand_gate IS
PORT(
a : IN STD_LOGIC;
b : IN STD_LOGIC;
z : OUT STD_LOGIC); Use all definitions from the package
END nand_gate; std_logic_1164
LIBRARY library_name;
USE library_name.package_name.package_parts;
Libraries
• ieee Need to be explicitly
Specifies multi-level logic system,
including STD_LOGIC, and declared
STD_LOGIC_VECTOR data types
• std
Specifies pre-defined data types
(BIT, BOOLEAN, INTEGER, REAL,
SIGNED, UNSIGNED, etc.), arithmetic
operations, basic type conversion Visible by default
functions, basic text i/o functions, etc.
• work
Current designs after compilation
Entity Declaration
• Entity Declaration describes the interface
of the component, i.e. input and output
ports.
Entity name Port type
Port names
Semicolon
ENTITY nand_gate IS
PORT(
a : IN STD_LOGIC;
b : IN STD_LOGIC; No Semicolon
z : OUT STD_LOGIC after last port
);
END nand_gate;
IN
OUT
BUFFER
IN INOUT
IN
OUT
NguyenTrongLuat 13
Port Mode IN
Port signal Entity
Driver resides
outside the entity
Port Mode OUT
Entity
Port signal
Driver resides
inside the entity c <= z
Port Mode OUT (with extra
signal)
Entity
Port signal
x z
c Signal x can be
read inside the entity
Port signal
c
Port signal Z can be
read inside the entity
Driver resides
c <= z
inside the entity
Port Mode INOUT
Port signal Entity
Signal can be
read inside the entity
NguyenTrongLuat 20
ÑOÁI TÖÔÏNG DÖÕ LIEÄU (Data object)
* Tín hieäu (signal): bieåu dieãn cho caùc daây keát noái cuûa maïch.
Noù ñöôïc khai baùo trong phaàn PORT cuûa khai baùo entity hoaëc
trong phaàn ñaàu trong architecture (tröôùc BEGIN).
SIGNAL signal_name : signal_type;
SIGNAL a : std_logic;
* Bieán (Variable): ñöôïc khai baùo vaø söû duïng trong process.
Bieán khoâng phaûi laø tín hieäu logic thaät.
VARIABLE variable_name : variable_type;
VARIABLE b : std_logic;
* Haèng soá (Constant): giöõ moät giaù trò khoâng ñöôïc thay ñoåi
CONSTANT constant_name : constant_type;
CONSTANT max : integer;
Caùc ñoái töôïng döõ lieäu coù theå ñöôïc ñaët giaù trò ñaàu, khai baùo sau
phaàn khai baùo kieåu döõ lieäu _type:= value;
CONSTANT max : integer : = 25;
NguyenTrongLuat 21
* Söï khaùc nhau giöõa Tín hieäu (Signal) vaø Bieán (Variable)
- Pheùp gaùn bieán (Variable) cho giaù trò töùc thôøi, pheùp gaùn
cuûa tín hieäu (signal) bò treã (delay)
- Tín hieäu (Signal) coù theå quan saùt daïng soùng (waveform),
nhöng bieán (Variable) thì khoâng.
NguyenTrongLuat 22
KIEÅU DÖÕ LIEÄU (Data type)
- Caùc kieåu döõ lieäu laø ñaëc tính cuûa signal, variable, …
- Caùc döõ lieäu cuøng kieåu môùi ñöôïc gaùn hoaëc keát noái vôùi nhau
- Coù theå taïo ra caùc kieåu döõ lieäu môùi baèng leänh TYPE hoaëc
SUBTYPE
* Kieåu BIT vaø BIT_VECTOR:
- BIT coù giaù trò ‘0’ vaø ‘1’.
- BIT_VECTOR laø daõy (array) cuûa BIT.
* Kieåu INTEGER
* Kieåu BOOLEAN: coù giaù trò TRUE vaø FALSE.
* Kieåu CHARACTER
* Kieåu lieät keâ (ENUMERATION) do ngöôøi söû duïng ñònh nghóa.
* ...
NguyenTrongLuat 23
* STD_LOGIC: Value Meaning
‘X’ Forcing (Strong driven) Unknown
- Laø kieåu tín hieäu quyeát
‘0’ Forcing (Strong driven) 0
ñònh (coù theå ñöôïc laùi baèng
‘1’ Forcing (Strong driven) 1
2 ngoõ vaøo)
‘Z’ High Impedance
- Coù 9 giaù trò
‘W’ Weak (Weakly driven) Unknown
- Höõu ích khi moâ phoûng
Weak (Weakly driven) 0.
- Chæ coù 3 giaù trò ‘0’, ‘1’, ‘L’
Models a pull down.
‘Z’ laø coù theå toång hôïp Weak (Weakly driven) 1.
‘H’
Models a pull up.
‘-’ Don't Care
‘U’ Uninitialized
SIGNAL a: STD_LOGIC;
a laø tín hieäu STD_LOGIC kieåu 1 bit
SIGNAL b: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL c: STD_LOGIC_VECTOR(0 TO 7);
b,c laø tín hieäu STD_LOGIC kieåu bus coù 8 bit
NguyenTrongLuat 24
More on STD_LOGIC Meanings
(1)
‘1’ ‘X’
‘0’
More on STD_LOGIC Meanings
(2)
More on STD_LOGIC Meanings
(3) V
DD
VDD
‘H’
‘1’
‘0’
‘L’
More on STD_LOGIC Meanings
(4)
X X X X X X X X X
0 X 0 X 0 0 0 0 X
1 X X 1 1 1 1 1 X
Z X 0 1 Z W L H X
W X 0 1 W W W W X
L X 0 1 L W L W X
H X 0 1 H W W H X
- X X X X X X X X
STD_LOGIC Rules
a
1 wire
b
8 bus
Pheùp gaùn tín hieäu kieåu STD_LOGIC
SIGNAL a: STD_LOGIC;
SIGNAL b: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL c: STD_LOGIC_VECTOR(0 TO 3);
SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL e: STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL f: STD_LOGIC_VECTOR(8 DOWNTO 0);
a <= ’1’; -- giaù trò gaùn ñaët giöõa 1 daáu nhaùy ñôn ‘ ’
a <= b(2); -- a <= b(2),
b <= "0000”; -- giaù trò gaùn ñaët giöõa 1 daáu nhaùy keùp “ ”
c <= B”0000”; -- B laø kyù hieäu cô soá 2 (coù theå boû)
d <= -- bieåu dieãn töøng nhoùm 4 bit phaân caùch _
”0110_0111”;
e <= X”AF67”; -- X laø kyù hieäu cô soá 16 (Hex)
f <= O”723”; -- O laø kyù hieäu cô soá 8 (Octal)
b <= c; -- b(3) <= c(0), b(2) <= c(1),
-- b(1) <= c(2), b(0) <= c(3)
d(7 downto 6)<= ”11”;
c(0 to 2)<= e(7 downto 5);
NguyenTrongLuat 32
Gheùp noái chuoãi (Concatenation)
SIGNAL a: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL b: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL c, d, e: STD_LOGIC_VECTOR(7 DOWNTO 0);
a <= ”0000”;
b <= ”1111”;
c <= a & b; -- c = “00001111”
e <= ’0’ & ’0’ & ’0’ & ’0’ & ’1’ & ’1’ &
’1’ & ’1’; -- e = “00001111”
NguyenTrongLuat 33
PHEÙP TOAÙN (Operator)
* Pheùp toaùn Logic (Logical Operator):
NOT
NOT AND
AND OR
OR NAND
NAND NOR
NOR XOR
XOR XNOR
XNOR
Söû duïng cho kieåu: bit, bit_vector, boolean, std_logic, std_logic_vector.
** // MOD
MOD REM
REM
* Pheùp toaùn daáu (Sign Operator): -- ++
Correct
y <= (a and b) or (c and d) ;
MOÂ TAÛ THIEÁT KEÁ (Design description)
NguyenTrongLuat 37
MOÂ TAÛ CAÁU TRUÙC (Structural description)
COMPONENT and2
x1 COMPONENT and2
y PORT
PORT(x1,x2:IN
(x1,x2:IN STD_LOGIC;
STD_LOGIC;
x2 y:
y: OUT
OUT STD_LOGIC);
STD_LOGIC);
END
END COMPONENT;
COMPONENT;
- Ñeå keát noái component caáp thaáp, thöïc hieän leänh thay theá trò
soá component (component instantiation) PORT MAP.
Coù 2 caùch: * Keát hôïp vò trí (positional association)
* Keát hôïp theo teân (named association)
NguyenTrongLuat 38
* Keát hôïp theo teân (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 39
* Keát hôïp vò trí (positional association)
COMPONENT component_name
port declarations;
END COMPONENT;
...
Label: component_name PORT MAP (
sig_name1, sig_name2, ... );
COMPONENT
COMPONENT and2
and2
PORT
PORT (x1,x2:IN
(x1,x2:IN STD_LOGIC;
STD_LOGIC;
y:
y: OUT
OUT STD_LOGIC);
STD_LOGIC);
END
END COMPONENT;
COMPONENT;
BEGIN
BEGIN
user1:
user1: and2
and2 PORT
PORT MAP
MAP (( a,
a, b,
b, cc );
);
...
...
NguyenTrongLuat 40
a
VD: Thieát keá XOR 3 ngoõ vaøo u1_out
b
LIBRARY ieee; result
USE ieee.std_logic_1164.all; c
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 41
MOÂ TAÛ LUOÀNG DÖÕ LIEÄU (Dataflow description)
- Moâ taû luoàng döõ lieäu di chuyeån töø ngoõ vaøo ñeán ngoõ ra.
- Caùc phaùt bieåu naøy ñöôïc thöïc thi cuøng thôøi ñieåm, vì vaäy thöù
töï caùc phaùt bieåu laø nhö nhau
NguyenTrongLuat 42
Pheùp gaùn baèng pheùp toaùn (OPERATOR)
a u1_out
b
result
c
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY xor3 IS
PORT ( a, b, c : IN STD_LOGIC;
result : OUT STD_LOGIC);
END xor3;
ARCHITECTURE dataflow OF xor3 IS
SIGNAL u1_out: STD_LOGIC;
BEGIN
u1_out <= a XOR b; Result <= u1_out XOR c;
Result <= u1_out XOR c; u1_out <= a XOR b;
END dataflow;
NguyenTrongLuat 43
Pheùp gaùn tín hieäu theo ñieàu kieän (Condition Signal Assigment)
WHEN - ELSE
signal_name <= value1 WHEN condition1 ELSE
{value2 WHEN condition2 ELSE}
valueN ;
LIBRARY ieee;
mux2to1
USE ieee.std_logic_1164.all;
d0 ENTITY mux2to1 IS
d1 y PORT ( d0, d1 : IN STD_LOGIC;
sel : IN STD_LOGIC;
sel y : OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE dataflow2 OF mux2to1 IS
sel y BEGIN
0 d0 WITH sel SELECT
y <= d0 WHEN ’0’,
1 d1
d1 WHEN OTHERS;
END dataflow2;
NguyenTrongLuat 46
WITH select_signal SELECT
signal_name <= value1 WHEN const1_of_select_signal,
{value2 WHEN const2_of_select_signal,}
valueN WHEN OTHERS;
WITH
WITH sel
sel SELECT
SELECT
yy <=
<= d0
d0 WHEN
WHEN ”001”,
”001”,
d1
d1 WHEN
WHEN ”011”
”011” to
to ”101”,
”101”,
d2
d2 WHEN
WHEN ”000”
”000” || ”111”,
”111”,
d3
d3 WHEN
WHEN OTHERS;
OTHERS;
NguyenTrongLuat 47
xnor2 a b c
VD: xnor2
a 0 0 1
c 0 1 0
b
1 0 0
1 1 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 48
Phaùt bieåu FOR - GENERATE
GENERATE laø caùch ñeå taïo ra nhieàu tình huoáng (instance) cho
caùc phaùt bieåu ñoàng thôøi, thöôøng duøng cho caùc pheùp gaùn thay
theá trò soá töông ñöông component (component instantitation).
- Laø caáu truùc ñeå ñöa 1 haèng soá vaøo trong entity gioáng khai baùo
CONSTANT.
- Tieän lôïi cuûa generic laø coù theå söû duïng noù trong pheùp gaùn
thay theá trò soá töông ñöông component (component
instantitation), ñeå söû duïng caùc giaù trò haèng soá khaùc nhau khi
tham chieáu 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 50
* Khai baùo component coù GENERIC
COMPONENT component_name
GENERIC (
generic_name1: data_type := default_values;
...)
PORT (
port_name: mode data_type;
...)
END COMPONENT;
NguyenTrongLuat 51
MOÂ TAÛ HAØNH VI ( Behavioral description)
- Moâ taû söï ñaùp öùng cuûa ngoõ ra theo ngoõ vaøo.
- Söû duïng phaùt bieåu PROCESS chöùa caùc leänh ñöôïc thöïc thi
tuaàn töï, phuï thuoäc vaøo thöù töï cuûa noù
- Caùc phaùt bieåu tuaàn töï (Sequential statement): cho pheùp moâ taû
hoaït ñoäng tuaàn töï cuûa caùc tín hieäu
NguyenTrongLuat 52
PROCESS
- Process thöïc hieän caùc leänh beân trong noù 1 caùch tuaàn töï.
Vì vaäy thöù töï cuûa caùc leänh raát quan troïng.
- Process ñöôïc kích hoaït khi coù söï thay ñoåi cuûa 1 tín hieäu.
NguyenTrongLuat 54
Phaùt bieåu IF - THEN - ELSE
IF condition1 THEN sequential_statements_1;
{ELSIF condition2 THEN sequential_statements_2;}
{ELSE sequential_statements_N;}
END IF;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
VD: Mux2to1 ENTITY mux2to1 IS
mux2to1 PORT ( d0, d1 , sel : IN STD_LOGIC;
d0 y : OUT STD_LOGIC);
END mux2to1;
d1 y ARCHITECTURE behavior1 OF mux2to1 IS
sel BEGIN
PROCESS (d0, d1, sel)
BEGIN
IF sel = ’0’ THEN y <= d0 ;
sel y ELSE y <= d1 ;
0 d0 END IF;
1 d1 END PROCESS;
END behavior1;
NguyenTrongLuat 55
Phaùt bieåu CASE - WHEN
CASE select_signal IS
WHEN value1 => sequential_statements_1;
WHEN value2 => sequential_statements_2;
WHEN OTHERS => sequential_statements_N;
END CASE;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
VD: Mux2to1 ENTITY mux2to1 IS
mux2to1 PORT ( d0, d1 , sel : IN STD_LOGIC;
y : OUT STD_LOGIC);
d0 END mux2to1;
d1 y ARCHITECTURE behavior2 OF mux2to1 IS
BEGIN
sel PROCESS (d0, d1, sel)
BEGIN
CASE sel IS
sel y WHEN ’0’ => y <= d0 ;
WHEN OTHERS => y <= d1 ;
0 d0 END CASE;
1 d1 END PROCESS;
END behavior2;
NguyenTrongLuat 56
Phaùt bieåu FOR - LOOP
NguyenTrongLuat 57
Phaùt bieåu WHILE - LOOP
i:=0;
WHILE (i<10) LOOP
s <= i;
i := i+1;
END LOOP;
NguyenTrongLuat 58
THIEÁT KEÁ HEÄ TOÅ HÔÏP BAÈNG VHDL
- Heä toå hôïp coù theå ñöôïc thöïc hieän baèng caùc phaùt bieåu ñoàng
thôøi (concurent statement) vaø tuaàn töï (sequential statement).
- Phaùt bieåu tuaàn töï (sequent statement) ñöôïc duøng trong moâ taû
haønh vi (behavioral description)
NguyenTrongLuat 59
BOÄ COÄNG
fulladder
x
y
s s=x⊕ y⊕ z A
c D
z c=xy +yz +xz 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;
NguyenTrongLuat 60
adder4
d 15
33
88 END IF;
END PROCESS;
END behavior;
NguyenTrongLuat 69
BOÄGIAÛ
BOÄ GIAÛIIMAÕ
MAÕ
33
88
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
ENTITY decode38 IS
PORT ( x : IN STD_LOGIC_VECTOR(2 downto 0);
Söû duïng
y : OUT STD_LOGIC_VECTOR(0 to 7)); PROCESS
END decode38;
ARCHITECTURE behavior OF decode38 IS
BEGIN
PROCESS(x) Phaùt bieåu
VARIABLE j: integer;
BEGIN For …. loop
j := CONV_INTEGER(x);
FOR i IN 0 to 7 LOOP Söû duïng haøm CONV_INTEGER ñeå ñoåi döõ
IF (i = j) THEN lieäu kieåu STD_LOGIC_VECTOR thaønh kieåu
y(i) <= ’0’; INTEGER.
ELSE y(i) <= ’1’;
Ñeå söû duïng haøm naøy, trong phaàn LIBRARY
END IF;
caàn phaûi khai baùo goùi (package)
END LOOP;
- STD_LOGIC_ARITH
END PROCESS;
- STD_LOGIC_UNSIGNED
END behavior;
NguyenTrongLuat 70
encoder
i0
x0 BOÄ MAÕ HOÙA ÖU TIEÂN
i1
x1 E
i2 i3 i2 i1 i0 x1 x0 v N
v 0 0 0 0 d d 0 C
i3 0 0 0 1 0 0 1 O
0 0 1 X 0 1 1 D
0 1 X X 1 0 1 E
LIBRARY ieee;
1 X X X 1 1 1
USE ieee.std_logic_1164.all; R
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
BEGIN WITH i SELECT
x <= ”11” WHEN i(3) = ’1’ ELSE x <=”00” WHEN ”0001” ,
”01” WHEN ”0010”|”0011”,
”10” WHEN i(2) = ’1’ ELSE ”10” WHEN ”0100”
”01” WHEN i(1) = ’1’ ELSE to ”0111”,
”00” ; ”11” WHEN OTHERS;
v <= ’0’ WHEN i = ”0000” WITH i SELECT
V <=’0’ WHEN ”0000”,
ELSE ’1’; ’1’ WHEN OTHERS;
END flow;
NguyenTrongLuat 71
LIBRARY ieee;
USE ieee.std_logic_1164.all; Söû duïng
ENTITY encoder2 IS
PORT ( i : IN STD_LOGIC_VECTOR(3 downto 0);
PROCESS
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’ THEN x <=”01”;
ELSIF i(2) = ’1’THEN END IF;
x <= ”10”; IF i(2)=’1’ THEN x <=”10”;
ELSIF i(1) = ’1’THEN END IF;
x <= ”01”; IF i(3)=’1’ THEN x <=”11”;
ELSIF x <= ”00”; END IF;
END IF; v <= ’1’;
END PROCESS; IF i=”0000” THEN v <=’0’;
v <= ’0’ WHEN i = ”0000” END IF;
ELSE ’1’; END PROCESS;
END behavior;
NguyenTrongLuat 72
BOÄ SO SAÙNH 4 BIT
BOÄ SO SAÙNH C
LIBRARY ieee; O
USE ieee.std_logic_1164.all; M
P
ENTITY compare IS A
PORT (a, b : IN STD_LOGIC_VECTOR(3 downto 0); R
aeqb, agtb, altb : OUT STD_LOGIC); A
END compare; T
ARCHITECTURE behavior1 OF compare IS O
BEGIN R
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 73
BOÄ GIAÛI MAÕ B
LIBRARY ieee; C
USE ieee.std_logic_1164.all; LED 7 ÑOAÏN D
ENTITY led IS T
PORT ( bcd : IN STD_LOGIC_VECTOR(3 downto 0); O
segs : OUT STD_LOGIC_VECTOR(6 downto 0);
END led; 7
ARCHITECTURE Behavioral OF led IS S
BEGIN a
E
PROCESS(bcd) G
BEGIN f b S
CASE bcd IS -- abcdefg g
WHEN "0000" => segs <= "1111110";
WHEN "0001" => segs <= "0110000"; e c
WHEN "0010" => segs <= "1101101";
WHEN "0011" => segs <= "1111001"; d
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 74
THIEÁT KEÁ HEÄ TUAÀN TÖÏ BAÈNG VHDL
- Heä tuaàn töï chæ ñöôïc thöïc hieän baèng caùc phaùt bieåu tuaàn töï
(sequential statement).
- Thöïc hieän: maïch choát, FF, thanh ghi, boä ñeám, maùy traïng
thaùi.
- Bieán (Variable) chæ toàn taïi cuïc boä trong Process, vì vaäy muoán
laáy giaù trò cuûa bieán ra ngoaøi Process thì ta phaûi gaùn bieán cho
tín hieäu (Signal).
- Trong Process, bieán ñöôïc caäp nhaät giaù trò sau moãi phaùt bieåu;
coøn tín hieäu chæ ñöôïc caäp nhaät ôû cuoái Process.
NguyenTrongLuat 75
MAÏCH CHOÁT
LIBRARY ieee;
Dlatch
USE ieee.std_logic_1164.all;
ENTITY Dlatch IS
D Q
PORT (D, Clk : IN STD_LOGIC;
Q : BUFFER STD_LOGIC;
Qn : OUT STD_LOGIC);
Clk Q END Dlatch;
ARCHITECTURE behavior OF Dlatch IS
BEGIN
PROCESS (D, Clk)
clk D Q+ Q+ BEGIN
0 X Q Q IF Clk = ’1’ THEN
1 0 0 1 Q <= D;
1 1 1 0 Qn <= NOT Q;
END IF;
END PROCESS;
END behavior;
NguyenTrongLuat 76
LIBRARY ieee; FLIP - FLOP
USE ieee.std_logic_1164.all;
Dflipflop
ENTITY Dflipflop IS
PORT (D, Clk : IN STD_LOGIC;
D Q
Q : BUFFER STD_LOGIC;
Qn : OUT STD_LOGIC);
END Dflipflop;
ARCHITECTURE behavior OF Dflipflop IS clk Q
BEGIN
PROCESS (Clk)
BEGIN
IF Clk’event AND Clk = ’1’ THEN
Q <= D;
Qn <= NOT Q; IF rising_edge(clk) THEN
END IF;
END PROCESS;
END behavior;
- clk’event phaùt hieän söï thay ñoåi tín hieäu clk töø 0 leân 1 hoaëc töø 1 veà 0.
- Goùi std_logic_1164 coù ñònh nghóa 2 haøm (function): rising_edge ñeå phaùt
hieän caïnh leân vaø falling_edge ñeå phaùt hieän caïnh xuoáng cuûa tín hieäu.
NguyenTrongLuat 77
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY DFF IS
PORT (D, Clk, Pr, Cl : IN STD_LOGIC;
Q : BUFFER STD_LOGIC;
Qn : OUT STD_LOGIC);
Pr END DFF;
ARCHITECTURE behavior OF DFF IS
D Q
BEGIN
DFF PROCESS (Clk, Pr, Cl)
BEGIN
Clk Q IF Pr = ’0’ THEN Q <= ’1’;
Cl Qn <= ’0’;
ELSIF Cl = ’0’ THEN Q <= ’0’;
Qn <= ’1’;
ELSIF Clk’event AND Clk = ’0’ THEN
Q <= D;
Qn <= NOT Q;
END IF;
END PROCESS;
END behavior;
NguyenTrongLuat 78
Thanh ghi (register)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY regn IS
GENRERIC (n : NATURAL := 4);
PORT (D : IN STD_LOGIC_VECTOR(n-1 downto 0);
Clk, Reset :IN STD_LOGIC_VECTOR;
Q : OUT STD_LOGIC(n-1 downto 0));
END regn; n n
ARCHITECTURE behavioral OF regn IS D Q
BEGIN
PROCESS (Clk, Reset, D)
regn
BEGIN Clk
IF (Reset = '0') THEN
Reset
Q <= (others => '0');
ELSIF rising_edge(Clock) THEN
Q <= D;
END IF; GENRERIC (n : NATURAL := 4)
END PROCESS; Khai baùo generic n laø natural (soá nguyeân döông)
END behavioral; Q <= (Others=> ‘0’) töông ñöông vôùi Q <= “0000”
NguyenTrongLuat 79
BOÄ ÑEÁM LEÂN 4 BIT
coù Reset baát ñoàng boä BOÄ ÑEÁM (COUNTER)
LIBRARY ieee; Upcnt4
USE ieee.std_logic_1164.all
USE ieee.std_logic_unsigned.all;
Rst Q0
ENTITY Upcnt4 IS
PORT (Clk, Rst : IN STD_LOGIC; Q1
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öû duïng bieán count ñeå thöïc hieän chöùc naêng boä ñeám
Q <= count;
END PROCESS; Bieán count ñöôïc gaùn cho ngoõ ra Q ôû cuoái Process,
END Behavioral; vì bieán laø giaù trò cuïc boä trong Process
NguyenTrongLuat 80
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
PROCESS (Clk, Rst)
Boä ñeám BEGIN
coù reset IF rising_edge(clk) THEN
ñoàng boä IF Rst ='1' THEN
count <= (others=>'0');
ELSE
count <= count + "0001";
END IF;
END IF;
END PROCESS; Söû duïng tín hieäu count thay cho bieán count.
Q <= count;
Tín hieäu count ñöôïc gaùn cho ngoõ ra Q beân
END Behavioral;
ngoaøi Process.
NguyenTrongLuat 81
LIBRARY ieee;
USE ieee.std_logic_1164.all BOÄ ÑEÁM LEÂN
USE ieee.std_logic_unsigned.all; THAÄP PHAÂN
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 82
LIBRARY ieee;
USE ieee.std_logic_1164.all BOÄ ÑEÁM 4 bit
USE ieee.std_logic_unsigned.all; LEÂN / XUOÁNG
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
IF Updn = ’1’ THEN Rst Q2
count <= count + ”0001”;
Clk Q3
ELSE count <= count - ”0001”;
END IF; Updncnt4
END IF;
END PROCESS;
Q <= count;
END Behavioral;
NguyenTrongLuat 83
Thanh ghi dòch (shift reg.)
LIBRARY ieee;
USE ieee.std_logic_1164.all; n S
ENTITY sipo IS
Serin Q I
GENERIC (n: NATURAL := 8); sipo P
PORT (Serin, Clk : IN STD_LOGIC;
Clk
O
Q : OUT STD_LOGIC_VECTOR(
n-1 downto 0));
END sipo;
ARCHITECTURE shiftreg OF sipo 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;
Q <= reg;
END shiftreg;
NguyenTrongLuat 84
S
I
S siso
O LIBRARY ieee;
Serin
USE ieee.std_logic_1164.all;
ENTITY siso IS
GENERIC (n : NATURAL := 8); Serout
PORT (Clk, Serin : IN STD_LOGIC;
Serout : OUT STD_LOGIC); Clk
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;
NguyenTrongLuat 85
piso
LIBRARY ieee; Clk
USE ieee.std_logic_1164.all; ShLd
ENTITY piso IS Serin
GENERIC (n: NATURAL := 8); n
PORT (Serin, Clk, ShLd : IN STD_LOGIC; D Serout
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; P
END IF; I
END PROCESS; S
Serout <= reg(n-1);
END shiftreg; O
NguyenTrongLuat 86
MAÙY TRAÏNG THAÙI
FSM
- Maùy traïng thaùi höõu haïn ñöôïc thieát keá deã daøng baèng phaùt
bieåu PROCESS.
- Vieäc chuyeån traïng thaùi ñöôïc moâ taû trong Process vôùi danh
saùch caûm nhaän (sensitivity list) laø clock vaø tín hieäu reset baát
ñoàng boä.
- Ngoõ ra coù theå ñöôïc moâ taû baèng caùc phaùt bieåu ñoàng thôøi
(concurrenrt) naèm ngoaøi process.
- Coù 2 kieåu FSM: MOORE vaø MEALY
NguyenTrongLuat 87
Inputs Next State MOORE
function FSM
Next State Present State
clock Present State
reset Register
Output Outputs
function
Present State Register: thanh ghi traïng thaùi hieän taïi löu giöõ 1
traïng thaùi hieän taïi, seõ chuyeån traïng thaùi khi coù xung clock.
Next state function: haøm traïng thaùi keá tieáp laø maïch toå hôïp phuï
thuoäc vaøo ngoõ vaøo vaø traïng thaùi hieän taïi
Output function: haøm ngoõ ra laø maïch toå hôïp phuï thuoäc vaøo traïng
thaùi hieän taïi
NguyenTrongLuat 88
FSM kieåu MOORE ñöôïc moâ taû baèng 3 PROCESS
- Process Haøm ngoõ ra coù theå thay theá baèng caùc phaùt bieåu
ñoàng thôøi (concurrent statement)
- Process 2 vaø 3 coù theå keát hôïp thaønh 1 Process.
NguyenTrongLuat 89
LIBRARY ieee; Process Thanh ghi traïng thaùi:
USE iee.std_logic_1164.all; PROCESS (reset, clock)
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 clock’event) THEN
pr_state <= nx_state;
END IF;
END PROCESS;
TYPE state IS (list of states): khai baùo state laø döõ lieäu kieåu lieät keâ
NguyenTrongLuat 90
Process Haøm traïng thaùi keá tieáp:
PROCESS (input, present_state)
PROCESS (input, ps_state )
CASE ps_state IS
WHEN state_1 =>
IF input = ’…’ THEN
nx_state <= state_2;
ELSIF nx_state <= state_3;
END IF;
WHEN state_2 =>
IF input = ’…’ THEN
nx_state <= state_1;
ELSIF nx_state <= state_3;
END IF;
. . .
END CASE;
END PROCESS;
NguyenTrongLuat 91
Process Haøm ngoõ ra:
PROCESS (present_state)
PROCESS(ps_state )
CASE ps_state IS
WHEN state_1 =>
output <= ’...’;
WHEN state_2 =>
output <= ’...’;
...
END CASE;
END PROCESS;
Coù theå thay theá process naøy baèng phaùt bieåu ñoàng thôøi
output <= ... ;
NguyenTrongLuat 92
TT TT keá tieáp Ngoõ ra
hieän taïi x = 0 x = 1 (z)
S0 S0 S1 0
LIBRARY ieee;
USE iee.std_logic_1164.all; S1 S2 S1 0
ENTITY Moore_FSM IS S2 S0 S3 0
PORT ( S3 S2 S1 1
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 clock’event) THEN
pr_state <= nx_state;
END IF;
END PROCESS;
NguyenTrongLuat 93
TT TT keá tieáp Ngoõ ra
nxst: PROCESS (x, ps_state )
hieän taïi x = 0 x = 1 (z)
CASE ps_state IS
WHEN S0 =>
S0 S0 S1 0
IF x = ’0’ THEN
S1 S2 S1 0
nx_state <= S0;
S2 S0 S3 0
ELSIF nx_state <= S1;
S3 S2 S1 1
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 94
TT TT keá tieáp Ngoõ ra
hieän taïi x = 0 x = 1 (z)
Output: PROCESS(ps_state )
CASE ps_state IS S0 S0 S1 0
WHEN S3 => S1 S2 S1 0
z <= ’1’; S2 S0 S3 0
S3 S2 S1 1
WHEN OTHERS =>
z <= ’0’;
END CASE;
END PROCESS;
END behavior;
Output: PROCESS(ps_state ) Söû duïng
IF ps_state = S3 THEN z <= ’1’; IF…THEN
ELSE ’0’;
END IF;
Dùng phát biểu
z <= ’1’ WHEN ps_state = S3 ELSE ’0’; đồng thời
NguyenTrongLuat 95
nx_out: PROCESS (x, ps_state ) TT TT keá tieáp Ngoõ ra
CASE ps_state IS hieän taïi x = 0 x = 1 (z)
WHEN S0 =>
z <= ’0’; S0 S0 S1 0
IF x = ’0’ THEN S1 S2 S1 0
nx_state <= S0; S2 S0 S3 0
ELSIF nx_state <= S1; S3 S2 S1 1
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;
END behavior; Keát hôïp Process 2 vaø 3 thaønh 1 Process
NguyenTrongLuat 96
MEALY
FSM
FSM kieåu MEALY ñöôïc moâ taû baèng 2 PROCESS
Output Outputs
function
NguyenTrongLuat 97
Process Haøm traïng thaùi keá tieáp vaø Ngoõ ra:
PROCESS (input, present_state)
NguyenTrongLuat 98
nx_out: PROCESS (x, ps_state ) TT TT keá tieáp Ngoõ ra (Z)
CASE ps_state IS HT
X=0 1 X=0 1
WHEN S0 =>
IF x = ’0’ THEN S0 S0 S1 0 0
z <= ’0’;
nx_state <= S0; S1 S2 S1 0 0
ELSIF S2 S2 S1 0 1
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 99
Gán trạng thái
- Vieäc gaùn traïng thaùi thöôøng laø töï ñoäng.
TYPE state IS (S0, S1, S2);
SIGNAL pr_state, nx_state: state;
- Ta coù 2 caùch ñeå gaùn cho moãi traïng thaùi baèng 1 toå hôïp nhò phaân:
* Khai baùo constant
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;