Professional Documents
Culture Documents
Slide VHDL
Slide VHDL
www.viethung-idt.com.vn
1
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
4
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
6
II. Cấu trúc (tiếp)
LIBRARY IEEE;
USE ...; Library
--------------------
ENTITY Example IS
GENERIC (...);
PORT (...); Entity
END Example;
--------------------
ARCHITECTURE Ex1 OF Example IS
COMPONENT (...);
GENERIC MAP (...);
PORT MAP (...);
BEGIN
Architecture
Process(...);
End Process;
END Ex1;
7
II.1. Library
Các thành phần (package) của thư viện
chuẩn IEEE:
Dùng chung với tất cả các công cụ lập trình.
IEEE công khai mã nguồn của thư viện này.
Các công cụ phát triển của các hãng khác
nhau có thể có thư viện riêng.
-- Các thư viện này được khai báo sẵn khi tạo Project
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
8
II.2. Entity
Xác định: số lượng, chiều, kiểu các cổng
vào/ra và một số tham số khác.
-- Entity Declaration
ENTITY Adder IS
GENERIC
(iCount : INTEGER);
PORT
(A : IN STD_LOGIC_VECTOR(15 downto 0);
B : IN STD_LOGIC_VECTOR(15 downto 0);
S : OUT STD_LOGIC_VECTOR(15 downto 0);
C : OUT STD_LOGIC);
END Adder;
9
II.3. Architecture
Giữa 2 từ khóa “Architecture” và “Begin”
là khai báo, liệt kê các phần tử bên trong
của vi mạch, bao gồm:
Tín hiệu (signal)
Thành phần (component)
Giữa 2 từ khóa “Begin” và “End” là đoạn
mã mô tả kết nối giữa các thành phần bên
trong và hoạt động của vi mạch.
10
II.3. Architecture (tiếp)
-- Architecture Body
ARCHITECTURE Adder16 OF Adder IS
BEGIN
...
PROCESS (...)
...
END PROCESS;
END Adder16;
11
II.4 Khái niệm Process
Các câu lệnh nằm ngoài Process được
thực hiện đồng thời (concurrent)
Các câu lệnh nằm trong Process được
thực hiện tuần tự (sequential)
Process được kích hoạt khi 1 trong các tín
hiệu trong “sensitivity list” thay đổi giá trị.
Các tín hiệu trong “sensitivity list” thường là
các tín hiệu đầu vào của vi mạch.
PROCESS (Clk, Rst,...)
...
END PROCESS;
12
II.4 Khái niệm Process (tiếp)
Nếu có nhiều Process thì các Process này
được thực hiện đồng thời
Để chuyển giá trị từ một process
sang một process khác ta phải dùng
tín hiệu (signal)
P1: Process (Rst) P3: Process (Clk)
13
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
15
III. Các đối tượng trong VHDL (tiếp)
Variable: là các biến được sử dụng để tính
toán, lưu các giá trị trung gian.
biến nhận giá trị ngay khi được gán, giá trị
mới này có thể được sử dụng ngay trong
dòng lệnh tiếp theo
biến chỉ sử dụng được trong phạm vi Process
16
III. Các đối tượng trong VHDL (tiếp)
Clk1 Encryptor
Clk
Component_1
Key
Key_In
Key_Out
Key_1_2
Key_In
17
III. Các đối tượng trong VHDL (tiếp)
entity
architecture
component
1
Signals
process
component
Input Ports Variables Output Ports
2
18
III. Các đối tượng trong VHDL (tiếp)
Architecture Example1 of Example is
End Example1
19
III. Các đối tượng trong VHDL (tiếp)
Architecture Example1 of Example is
End Example1
-- Có thể gán trị mặc định cho tín hiệu khi khai báo
signal wire: std_logic := ‘1’;
signal bus: std_logic_vector(3 downto 0) := “1010”;
20
III. Các đối tượng trong VHDL (tiếp)
End Example1
21
III. Các đối tượng trong VHDL (tiếp)
Architecture Example1 of Example is
-- Khai báo các thành phần
...
-- Khai báo các tín hiệu
...
-- Khai báo các kết nối
...
-- Mô tả hoạt động
Begin
Process (...)
variable i: integer range 0 to 15;
constant pi: real := 3.14;
Begin
...
End Process
End Example1
22
III. Các đối tượng trong VHDL (tiếp)
Generic
Sử dụng Generic cho phép khai báo các tham
số chung để có thể sử dụng một cách linh
hoạt, mềm dẻo trong nhiều tình huống.
Generic là thành phần không bắt buộc trong
thiết kế VHDL.
Entity Example is
Generic (iCount: integer; iTime: time);
Port (...);
End Example;
23
III. Các đối tượng trong VHDL (tiếp)
LIBRARY IEEE;
Use IEEE.std_logic_1164.ALL;
ENTITY Example IS
GENERIC (rise, fall: time; load: integer);
PORT (inA, inB, inC, inD: In std_logic;
out1, out2: Out std_logic);
END Example;
BEGIN
U1: Com1
GENERIC MAP (10 ns, 12 ns, 3);
PORT MAP (inA, inB, out1);
U2: Com1
PORT MAP (inC, inD, out2);
END Ex1;
24
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
26
IV. Các kiểu dữ liệu (tiếp)
Integer
32 bit (-2,147,483,647 ... +12,147,483,647)
a := 1; a := -1; -- đúng
a := 1.0; -- sai
Real
32 bit (-10^38 ... +10^38)
độ chính xác: 7 chữ số phần thập phân
a := 1; a := -1; -- sai
a := 1.0; -- đúng
a := -1.0E10; a := 1.5E-20; -- đúng
27
IV. Các kiểu dữ liệu (tiếp)
Kiểu dữ liệu tự định nghĩa
1. Kiểu dữ liệu liệt kê
• Thường dùng khi mô tả trạng thái
2. Kiểu dữ liệu mảng 1 chiều
TYPE MyState IS : (Start, S1, S2, S3, Stop);
...
variable S : MyState;
...
S := S1;
TYPE MyRegister IS ARRAY (0 to 255) OF INTEGER;
...
variable R : MyRegister;
...
R(1) := 1;
28
IV. Các kiểu dữ liệu (tiếp)
Kiểu dữ liệu tự định nghĩa
3 Kiểu dữ liệu mảng nhiều chiều
• Thường dùng với chức năng bảng tra giá trị
(Lookup Table)
29
IV. Các kiểu dữ liệu (tiếp)
Time
Thời gian là kiểu dữ liệu vật lý duy nhất được
định nghĩa sẵn trong VHDL
Dùng để xác định trễ và đồng bộ tín hiệu (với
từ khóa “wait”)
Đơn vị: fs, ps, ns, us, ms, sec, min, hr
variable T : time;
...
T := 1 ns;
30
IV. Các kiểu dữ liệu (tiếp)
Có thể nói: không có khái niệm “ép kiểu”
trong VHDL. Một số ngoại lệ:
integer +/- bit_vector/std_logic_vector
Xét ví dụ:
TYPE long is integer range -100 to 100;
TYPE short is integer range -10 to 10;
Signal x: short;
Signal y: long;
...
y <= 2 * x + 5; -- Sai
y <= long(2 * x + 5); -- OK
-- trong trường hợp này, thực chất x và y
-- có cùng kiểu là integer
31
IV. Các kiểu dữ liệu (tiếp)
Để chuyển đổi kiểu dữ liệu, có 2 cách:
Tự viết một đoạn mã để chuyển dữ liệu.
Khai báo thư viện và dùng hàm có sẵn.
Gói std_logic_arith trong thư viện IEEE có
một số hàm chuyển đổi kiểu dữ liệu:
conv_integer(p)
conv_unsigned(p, b)
conv_signed(p, b)
conv_std_logic_vector(p, b)
32
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
34
V. Các phép toán (tiếp)
Phép toán logic
Toán tử: and or not xor nor nand xnor
Toán hạng: boolean, bit, bit_vector, std_logic,
std_logic_vector
Các toán hạng vector phải cùng kích thước và
phép toán được thực hiện trên các bit tương
ứng
35
V. Các phép toán (tiếp)
Phép toán so sánh
Toán tử: =, /=, <, <=, >, >=
Trả về giá trị boolean (true/false)
Phép toán số học
*, /, ** (exp) chỉ dùng với integer, real, time.
mod, rem chỉ dùng với integer.
+,- dùng với cả integer, real, time và
bit_vector, std_logic_vector
+,- cho phép 1 toán hạng integer và 1 toán
hạng bit_vector/std_logic_vector (THĐB)
36
V. Các phép toán (tiếp)
Phép toán shift (dịch bit)
Toán tử: sll, srl, sla, sra, rol, ror
Toán hạng trái: bit_vector/std_logic_vector
Toán hạng phải: integer
signal DI : bit_vector (7 downto 0) := “11000110”;
signal DO : bit_vector (7 downto 0);
37
Ví dụ 1: (câu hỏi)
Thiết kế bộ cộng đầy đủ (Full Adder) 16bit
Chú ý: ví dụ chỉ mang tính minh họa vì phép cộng
“C <= A + B” đã được định nghĩa sẵn.
a b cin s cout
a 0 0 0 0 0
s
Full 0 1 0 1 0
b Adder
cout 1 0 0 1 0
cin 1 1 0 0 1
0 0 1 1 0
s <= a xor b xor cin; 0 1 1 0 1
cout <= (a and b) or (cin and (a xor b)); 1 0 1 0 1
1 1 1 1 1
38
Ví dụ 1: (trả lời)
ENTITY Adder IS
PORT
(B : IN STD_LOGIC_VECTOR(15 downto 0);
A : IN STD_LOGIC_VECTOR(15 downto 0);
S : OUT STD_LOGIC_VECTOR(15 downto 0);
C : OUT STD_LOGIC);
END Adder;
y3 y2 y1 y0
x3 x2 x1 x0 and y0
(phần trả lời
tham khảo x3 x2 x1 x0 and y1
mã nguồn x3 x2 x1 x0 and y2
kèm theo)
x3 x2 x1 x0 and y3
z3 z2 z1 z0 z3 z2 z1 z0
40
Ví dụ 3: (câu hỏi)
Xây dựng bộ chia chia số 16bit cho số 8bit
đối với kiểu std_logic_vector.
41
Bài tập 1:
Xây dựng bộ cộng 2 số dấu phẩy động
(học viên tự tìm hiểu số dấu phẩy động)
42
Bài tập 2:
Xây dựng bộ nhân 2 số dấu phẩy động
(học viên tự tìm hiểu số dấu phẩy động)
43
44
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
46
VI.1. Mệnh đề IF
IF (biểuthứclogic1) THEN
...
ELSIF (biểuthứclogic2) THEN –- có thể có nhiều ELSIF
...
ELSE –- nhưng chỉ có 1 ELSE
... A
END IF; M
B
U S
process (A, B, C, D, Sel ) C X
begin
if (Sel = “00”) then S <= A; D
elsif (Sel = “01”) then S <= B;
elsif (Sel = “10”) then S <= C;
Sel
elsif (Sel = “11”) then S <= D;
else S <= “0000”;
end if;
end process;
47
VI.2. Mệnh đề CASE
CASE (biến / tínhiệu) IS
WHEN giátrị1 => ...
WHEN giátrị2 => ...
WHEN OTHERS => ...
END CASE;
A
B M
process (A, B, C, D, Sel )
U S
begin C X
case (Sel) is
when “00” => S <= A; D
when “01” => S <= B;
when “10” => S <= C;
Sel
when “11” => S <= D;
when others => S <= “0000”;
end case;
end process;
48
VI.2. Mệnh đề CASE (tiếp)
Ta có thể sử dụng 1 dải giá trị hữu
hạn trong biểu thức logic của mệnh
đề CASE hoặc IF.
if (x = 12 to 14) then
...
end if;
case (D_In) is
when “1000” to “1010” => ...
...
end case;
49
VI.2. Mệnh đề CASE (tiếp)
Xét ví dụ
Cú pháp hoàn toàn đúng.
S có thể được gán cùng lúc 1 giá trị A và 3 giá
trị “0000”. S trong trường hợp này được gọi là
“multi-driver signal”.
Có thể tổng hợp được nhưng kết quả sai!
Architecture Bad of MUX is
Begin
S <= A when Sel = “00” else “0000”;
S <= B when Sel = “01” else “0000”;
S <= C when Sel = “10” else “0000”;
S <= D when Sel = “11” else “0000”;
End Bad;
50
VI.2. Mệnh đề CASE (tiếp)
Kết quả sai là do hiện tượng “chập mạch”
(short-circuit) khi tổng hợp.
Thực tế có rất nhiều tín hiệu nhận giá trị từ
nhiều nguồn (source) khác nhau (nguồn tín
hiệu của S là A, B, C, D).
Cách xử lý
Người thiết kế/lập trình phải phân giải giá trị
từ nhiều nguồn khác nhau để tín hiệu chỉ
nhận 1 giá trị duy nhất tại 1 thời điểm (multi-
source - single-driver).
51
VI.3. Mệnh đề LOOP
PROCESS (A_Sig, B_Bus)
variable i : integer;
Begin
for i in 7 downto 0 loop
C_Bus(i) <= A_Sig and B_Bus(i);
end loop;
END PROCESS;
52
VI.3. Mệnh đề LOOP (tiếp)
Dừng vòng lặp đang thực hiện dở để
chuyển sang vòng lặp tiếp theo: NEXT.
Dừng vòng lặp đang thực hiện dở và thoát
hẳn khỏi vòng lặp: EXIT.
Có thể có nhiều vòng lặp lồng nhau, nhưng
lệnh Exit chỉ có tác dụng đối với vòng lặp trực
tiếp chứa nó.
53
VI.4. Mệnh đề WAIT
Mệnh đề WAIT dùng để tạm dừng Process
trong một khoảng thời gian nào đó:
Wait on tín_hiệu_nào_đó_thay_đổi_giá_trị
Wait until biểu_thức_logic_nhận_giá_trị_true
Wait for khoảng_thời_gian_xác_định
Wait (khoảng_thời_gian_không_xác_định)
Wait on A, B;
...
Wait until Clk = ‘1’;
...
Wait for 10 ns;
...
Wait;
54
VI.4. Mệnh đề WAIT (tiếp)
55
VI.4. Mệnh đề WAIT (tiếp)
Mệnh đề Wait có thể được viết dưới dạng
tường minh (explicit) hoặc không tường
minh (implicit).
Một số công cụ tổng hợp mạch không
hỗ trợ explicit ‘wait’.
-- Implicit WAIT -- Explicit WAIT
Process (A, B) Process
Begin Begin
C <= A and B; Wait on A, B;
End Process; C <= A and B;
End Process;
56
Ví dụ 4: (câu hỏi)
Xây dựng hệ dãy đoán nhận xâu “1101”
0 1 1
0
1 1 0 1
A B C D E
0
0
Input
Output
58
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
60
VIII. Mã hóa DES với VHDL (tiếp)
...
16
IP F F F F FP
rounds
...
61
VIII. Mã hóa DES với VHDL (tiếp)
62
VIII. Mã hóa DES với VHDL (tiếp)
63
Nội dung
1 Giới thiệu VHDL
2 Cấu trúc lập trình
65
VIII. Mã hóa AES với VHDL (tiếp)
CipherKey ShiftRows
MixColumn
ShiftRows
66
VIII. Mã hóa AES với VHDL (tiếp)
67
VIII. Mã hóa AES với VHDL (tiếp)
68
VIII. Mã hóa AES với VHDL (tiếp)
69
VIII. Mã hóa AES với VHDL (tiếp)
70
So sánh với Embedded C
Vi xử lý, vi điều khiển có sẵn tập lệnh nên
có thể dùng Embedded C để lập trình, các
lệnh C sẽ được dịch sang ngôn ngữ máy ở
dạng nhị phân.
FPGA chỉ bao gồm các phần tử Logic cơ
bản nên phải sử dụng VHDL để mô phỏng
và tổng hợp dưới dạng ghép nối các phần
tử logic.
Làm việc với VHDL đòi hỏi hiểu sâu hơn
về cấu trúc và hoạt động của vi mạch.
71
So sánh với Verilog
Giống nhau:
Cùng là ngôn ngữ mô phỏng và tổng hợp
phần cứng. Có thể so sánh như C++ và Java.
Khác nhau:
VHDL yêu cầu cấu trúc chặt chẽ hơn (đặc biệt
về kiểu dữ liệu) nên dễ phát hiện lỗi hơn, tuy
nhiên lại thường dài dòng hơn và khó phân
tích mã nguồn hơn.
VHDL được dùng nhiều ở Châu Âu, Verilog
được dùng nhiều ở Mỹ (mặc dù cả 2 đều sinh
ra ở Mỹ)
72
Tài liệu tham khảo
VHDL Programming by Examples, Douglas
L.Perry, McGraw Hill.
Circuit Design with VHDL, Volnei
A.Pedroni, MIT Press.
1076 IEEE Standard VHDL Reference
Manual, IEEE Computer Society.
73
74