VHDL
VHDL
- VHDL là ngôn ngữ mô tả phần cứng.
- VHDL viết tắt của VHSIC (Very High Speed
Integrated Circuit) Hardware Description
Language
- VHDL không phân biệt chữ viết hoa và
chữ thường.
databus
Databus
DataBus
DATABUS
- VHDL là ngôn ngữ “định dạng tự do”.
if (a=b) then
if
(a=b)
if (a =
b) then
NguyenTrongLuat
then
Thuật ngữ COMPONENT:
- Là khái niệm trung tâm mô tả phần
cứng bằng VHDL để biểu diễn các cấp
thiết kế từ cổng đơn giản đến 1 hệ thống
phức
- Môtạp.
tả component bao gồm ENTITY và
ARCHITECTURE.
- Một component có thể sử dụng các
component khaùc.
mux2to1
nand2
a
b
NguyenTrongLuat
d0
z
d1
sel
y
Mã VHDL cơ bản
LIBRARY
khai báo thư viện
ENTITY
thực thể
ARCHITECTURE
kiến trúc
NguyenTrongLuat
Ví dụ: Mã VHDL mô tả component NAND 2
ngõ vào
LIBRARY ieee;
USE ieee.std_logic_1164.all;
a
b
z
ENTITY nand_gate IS
PORT(
a
: IN STD_LOGIC;
b
: IN STD_LOGIC;
z
: OUT STD_LOGIC);
END nand_gate;
ARCHITECTURE model OF nand_gate IS
BEGIN
z <= a NAND b;
END model;
NguyenTrongLuat
LIBRARY
LIBRARY ieee;
USE ieee.std_logic_1164.all;
- LIBRARY: khai báo thư viện ieee
- USE: sử dụng các định nghóa gói (package)
std_logic_1164
Mô tả các tín hiệu xuất/nhập
ENTITY
của khối component
a
b
z
ENTITY nand_gate IS
PORT(
a
: IN STD_LOGIC;
b
: IN STD_LOGIC;
z
: OUT STD_LOGIC);
END nand_gate;
- ENTITY: đặt tên cho entity (nand_gate)
- PORT: khai báo
cácport
chân
xuất/nhập
* Tên
(portname):
a, b,
z
* Kiểu port (mode): IN,
OUT
* Kiểu tín hieäu (type):
STD_LOGIC
NguyenTrongLuat
* Các kiểu chân PORT I/0
IN: dữ liệu đi vào entity qua port và có thể
được
đọcliệu
trongxuất
entity.
OUT: dữ
ra ngoài entity qua chân
port.
OUT 2
không
thể
vềdữ
lạiliệu
entity.
INOUT:Port
là port
chiều,
chọc
phép
đi
vào
hoặc
ra. tự port OUT, nhưng được phép
BUFFER
: tương
đọc lại bởi entity.
IN
OUT
BUFFER
IN
IN
INOUT
OUT
NguyenTrongLuat
ARCHITECTURE
Mô tả thiết kế bên trong của khối,
chỉ rõ mối quan hệ giữa các ngõ vào
và ngõ ra.
a
b
z
ARCHITECTURE model OF nand_gate IS
BEGIN
z <= a NAND b;
END model;
- ARCHITECTURE: đặt tên cho architecture
(model)
- Có 3 loại mô tả architecture
* Mô tả cấu trúc (Structural)
* Mô tả luồng dữ liệu (Dataflow)
* Mô tả hành vi (Behavioral)
NguyenTrongLuat
ĐỐI
DỮ biểu
LIỆUdiễn
(Data
object)
* Tín TƯNG
hiệu (signal):
cho
các
dây kết nối của mạch. Nó được khai báo
trong phần PORT của khai báo entity hoặc
trong phần đầu trong architecture (trước
BEGIN).
SIGNAL signal_name : signal_type;
SIGNAL a được
: std_logic;
* Biến (Variable):
khai báo và sử
dụng trong process. Biến không phải là tín
hiệu logic thật.
VARIABLE variable_name : variable_type;
VARIABLE b : std_logic;
* Hằng số (Constant): giữ một giá trị
không được thay đổi
CONSTANT constant_name : constant_type;
CONSTANT max : integer;
Các đối tượng dữ liệu có thể được
đặt giá trị đầu, khai báo sau phần khai
báo kiểu dữ liệu _type:= value;
CONSTANT max : integer : = 25;
NguyenTrongLuat
* Sự khác nhau giữa Tín hiệu (Signal) và
Biến (Variable)
- Lệnh gán tín hiệu:
signal_name <= expression;
a <= NOT b AND c;
- Lệnh gán biến:
variable_name := expression;
y := NOT a;
- Phép gán biến (Variable) cho giá trị
tức thời, phép gán của tín hiệu (signal)
bị trễ (delay)
- Tín hiệu (Signal) có thể quan sát dạng
sóng (waveform), nhưng biến (Variable) thì
không.
- Biến (Variable) là cục bộ trong process.
NguyenTrongLuat
KIỂU DỮ LIỆU (Data type)
- Các kiểu dữ liệu là đặc tính của
signal, variable, …
- Các dữ liệu cùng kiểu mới được gán ho
- Có thể tạo ra các kiểu dữ liệu mới
bằng lệnh TYPE hoặc SUBTYPE
* Kiểu BIT và BIT_VECTOR:
*
*
*
*
*
- BIT có giá trị ‘0’ và ‘1’.
- BIT_VECTOR là dãy (array) của BIT.
Kiểu INTEGER
có giá trị TRUE và
Kiểu BOOLEAN:
FALSE.
Kiểu CHARACTER
do người sử dụng
Kiểu liệt kê (ENUMERATION)
định nghóa.
...
NguyenTrongLuat
* STD_LOGIC:
Valu
Meaning
e
- Là kiểu tín
Forcing (Strong driven)
‘X’
hiệu quyết định
Unknown
(có thể được
‘0’
Forcing (Strong driven) 0
lái
bằng
2 trị
ngõ
- Có
9 giá
‘1’
Forcing (Strong driven) 1
vào)
‘Z’
High Impedance
- Hữu ích khi mô phỏng
Weak (Weakly driven)
- Chỉ có 3 giá
‘W’
Unknown
trị ‘0’, ‘1’, ‘Z’ là
Weak (Weakly driven) 0.
có thể tổng hợp ‘L’
Models a pull down.
‘H’
Weak (Weakly driven) 1.
Models a pull up.
SIGNAL a: STD_LOGIC; ‘-’
Care
a là tín hiệuDon't
STD_LOGIC
kiểu 1
‘U’
Uninitialized
bit
SIGNAL b: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL c: STD_LOGIC_VECTOR(0 TO 7);
b,c là tín hiệu STD_LOGIC kiểu
bus có 8 bit
NguyenTrongLuat
Phép gán tín hiệu kiểu STD_LOGIC
SIGNAL
SIGNAL
SIGNAL
SIGNAL
SIGNAL
SIGNAL
a:
b:
c:
d:
e:
f:
STD_LOGIC;
STD_LOGIC_VECTOR(3 DOWNTO 0);
STD_LOGIC_VECTOR(0 TO 3);
STD_LOGIC_VECTOR(7 DOWNTO 0);
STD_LOGIC_VECTOR(15 DOWNTO 0);
STD_LOGIC_VECTOR(8 DOWNTO 0);
a <= ’1’;
-- giá trị gán đặt giữa 1
dấu nháy đơn ‘ ’
a <= b(2);
-- a <= b(2),
b <= "0000”;
-- giá trị gán đặt giữa 1
dấu nháy kép “ ”
c <= B”0000”;
-- B là ký hiệu cơ số 2 (có
thể bỏ)
d <= ”0110_0111”; -- biểu diễn từng nhóm 4
bit phân cách _
e <= X”AF67”;
-- X là ký hiệu cơ số 16
(Hex)
NguyenTrongLuat
Ghép nối chuỗ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;
“00001111”
d <= ’0’ & ”0001111”;
“00001111”
--
c=
--
d=
e <= ’0’ & ’0’ & ’0’ & ’0’ & ’1’ & ’1’ &
’1’ & ’1’;
-- e =
“00001111”
NguyenTrongLuat
PHÉP TOÁN (Operator)
* Phép toán Logic (Logical Operator):
NOT
NOT AND
AND OR
OR NAND
NAND NOR
NOR XOR
XOR XNOR
XNOR
Sử dụng cho kiểu: bit, bit_vector, boolean,
std_logic, std_logic_vector.
* Phép toán quan hệ (Relationship
Operator):
==
/=
/=
<<
<=
<=
>>
>=
>=
So sánh 2 toán hạng cùng kiểu và kết
quả trả về kiểu boolean
* Phép toán dịch (Shift Operator):
SLL
SLL SRL
SRL SLA
SLA SRA
SRA ROL
ROL ROR
ROR
* Phép toán coäng (Adding Operator):
+
-
+
NguyenTrongLuat
-
* Phép toán nhân (Multiplying Operator):
**
//
MOD
MOD
REM
REM
* Phép toán dấu (Sign Operator):
-++
**
* Phép toán khác (Operator):**
ABS
ABS
* Thứ tự ưu tiên thực hiện các phép
toán
**
*
+
+
=
AND
ABS NOT
/
MOD
REM
(Dấu)
&
/=
<
<=
>
>=
OR NAND NOR XOR XNOR
Các phép toán cùng loại không có ưu
tiên,
nếu cần sử dụng ( )
NguyenTrongLuat
MÔ TẢ THIẾT KẾ (Design description)
MÔ TẢ THIẾT
KẾ
CẤU TRÚC
(Structural)
(Design
description)
LUỒNG DỮ
LIỆU
(Dataflow)
NguyenTrongLuat
HÀNH VI
(Behavioral)
MÔ TẢ CẤU TRÚC (Structural
description)
- Sử dụng các khối component có cấp
thấp
- Các hơn.
khối component này được kết nối
thứ
bậc.
-theo
Các
component
cấp thấp được khai báo
bằng lệnh COMPONENT, đặt ở phần
ARCHITECTURE (trước BEGIN).
x
1
x
2
y
COMPONENT
COMPONENT
PORT
PORT
and2
and2
(x1,x2:IN
(x1,x2:IN STD_LOGIC;
STD_LOGIC;
y:
y: OUT
OUT STD_LOGIC);
STD_LOGIC);
END
END COMPONENT;
COMPONENT;
- Để kết nối component cấp thấp, thực
hiện lệnh thay thế trị số component
(component instantiation) PORT MAP.
* Kết
hợp vị trí (positional
Có 2 cách
:
association)
* Kết hợp theo tên (named
association)
NguyenTrongLuat
* Kết hợp theo tê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
* Kế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
PORT
PORT
and2
and2
(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
);
VD: Thiết kế XOR 3
ngõ vào
LIBRARY ieee;
USE ieee.std_logic_1164.all;
a
b
u1_out
result
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
MÔ TẢ LUỒNG DỮ LIỆU (Dataflow
description)
- Mô tả luồng dữ liệu di chuyển từ ngõ
vào đến ngõ ra.
- Sử dụng các phát biểu đồng thời
(Concurrent statement):
* Phép gán bằng phép toán
* Phép gán WHEN - ELSE
* Phép gán WITH – SELECT - WHEN
* Phép tạo GENERATE
- Các phát biểu này được thực thi cùng
thời điểm, vì vậy thứ tự các phát biểu
là như nhau
NguyenTrongLuat
Phép gán bằng phép toán (OPERATOR)
a
b
u1_out
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
Result <= u1_out XOR c;
u1_out <= a XOR b;
Result <= u1_out XOR c; u1_out <= a XOR b;
END dataflow;
NguyenTrongLuat
Phép gán tín hiệu theo điều kiện
(Condition Signal Assigment)
WHEN - ELSE
signal_name <= value1 WHEN condition1 ELSE
{value2 WHEN condition2 ELSE}
valueN ;
VD: Mux2to1 LIBRARY ieee;
mux2to1
d0
y
d1
sel
se
l
y
0
1
d0
d1
NguyenTrongLuat
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;
VD: xnor2
xnor2
a
b
c
a
b
c
0
0
1
1
0
1
0
1
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’
ELSE
ELSE
ELSE
ELSE