VHDL là ngôn ngữ mô tả phần cứng cho các mạch tích hợp tốc độ rất cao, là một loại ngôn ngữ mô tra phần cứng được phát triển dùng cho chương trình VHSIC của bộ quốc phòng Mỹ
Trang 1Lập trình VHDL
Trang 2Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 3I Giới thiệu VHDL
cứng
VHSIC Hardware Description Language
VHSIC = Very High Speed IC
PLD (Programmable Logic Device)
• CPLD (Complex PLD)
• FPGA (Field Programmable Gate Array)
ASIC (Application-Specific IC)
Xilinx ISE và Altera Quartus
Trang 4I Giới thiệu VHDL (tiếp)
Không phân biệt chữ hoa – thường
Các lệnh được phân cách bởi dấu “;”
Các chú thích được bắt đầu bởi dấu “ ”
Mô phỏng phần cứng theo hướng Top-down
Yêu cầu chặt chẽ về kiểu dữ liệu
Trang 5Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 6II Cấu trúc
Library
Library chứa các phép toán đã được xây
dựng sẵn trên 1 kiểu dữ liệu nào đó
Entity
Entity thể hiện giao diện bên ngoài của vi
mạch (các cổng vào/ra)
Architecture
Architecture thể hiện cấu trúc bên trong, chức
năng, hoạt động của vi mạch
Trang 7II Cấu trúc (tiếp)
Architecture
Trang 8II.1 Library
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 ;
Trang 10II.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.
Trang 11II.3 Architecture (tiếp)
Cùng 1 Entity ta có thể định nghĩa nhiều
Architecture khác nhau Tuy nhiên, 1
Architecture chỉ gắn với một Entity xác định
Architecture Body
ARCHITECTURE Adder16 OF Adder IS
signal Cr : STD_LOGIC_VECTOR (16 downto 0);
Trang 12II.4 Khái niệm Process
thực hiện đồng thời (concurrent)
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 ;
Trang 13II.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
sang một process khác ta phải dùng tín hiệu (signal)
Trang 14Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 15III Các đối tượng trong VHDL
chỉnh có thể được chia thành nhiều thành phần nhỏ hơn.
Signal: biểu diễn dây nối, kết nối các cổng của các thành phần với nhau.
tín hiệu chỉ đổi giá trị khi kết thúc 1 chu kỳ
lệnh vì yêu cầu về đồng bộ
Trang 16III 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
Trang 17III Các đối tượng trong VHDL (tiếp)
Trang 18III Các đối tượng trong VHDL (tiếp)
Trang 19III Các đối tượng trong VHDL (tiếp)
Architecture Example1 of Example is
Trang 20III 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
signal Key_1_2: std_logic_vector (1 to 32);
Khai báo các kết nối
Mô tả hoạt động
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”;
Trang 21III Các đối tượng trong VHDL (tiếp)
Architecture Example1 of Example is
Trang 22III Các đối tượng trong VHDL (tiếp)
Architecture Example1 of Example is
variable i: integer range 0 to 15;
constant pi: real := 3.14;
Begin
.
End Process
End Example1
Trang 23III Các đối tượng trong VHDL (tiếp)
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
Trang 24III 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;
ARCHITECTURE Ex1 OF Example IS
COMPONENT Com1
GENERIC (rise, fall: time:= 10 ns; load: integer:= 0);
PORT (a, b: In std_logic ; c: Out std_logic );
Trang 25Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 26IV Các kiểu dữ liệu
bit, bit_vector
thường dùng để định nghĩa biến (variable)
chỉ nhận các giá trị ‘0’, ‘1’
std_logic, std_logic_vector
thường dùng để định nghĩa tín hiệu (signal)
nhận các giá trị: ‘U’ (Uninitialized), ‘0’, ‘1’,
‘X’ (Forcing Unknown), ‘Z’ (High Impedance),
true, false
Trang 27IV Các kiểu dữ liệu (tiếp)
Trang 28IV 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);
Trang 29IV 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)
TYPE LUT IS ARRAY (0 TO 3, 0 TO 3) OF std_logic ;
constant MyLUT : LUT :=
((‘0’, ‘0’, ‘0’),
(‘0’, ‘0’, ‘0’),
(‘0’, ‘0’, ‘1’));
Trang 30IV Các kiểu dữ liệu (tiếp)
Trang 31IV 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;
Trang 32IV 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)
Trang 33Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 34V Các phép toán
đối với tín hiệu: “<=”, đối với biến: “:=”
kiểu và kích thước dữ liệu 2 vế của phép gán
phải giống nhau
dùng với kiểu bit_vector/std_logic_vector
signal DI1 : bit_vector (7 downto 0) := “11000110”;
signal DI2 : bit_vector (3 downto 0) := “0010”;
signal DO : bit_vector (7 downto 0);
DO <= DI1(7 downto 4) & DI2; 1100 0010
Trang 35V 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
Trang 36 *, /, ** (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)
Trang 37V 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);
Trang 38Ví 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.
Full Adder
s <= a xor b xor cin;
cout <= (a and b) or (cin and (a xor b));
Trang 39ARCHITECTURE Adder16 OF Adder IS
signal Cr : STD_LOGIC_VECTOR (16 downto 0);
S(i) <= A(i) xor B(i) xor Cr(i);
Cr(i+1) <= (A(i) and B(i)) or (Cr(i) and (A(i) xor B(i))); End loop;
C <= Cr(16);
END PROCESS;
Trang 40Ví dụ 2: (câu hỏi)
Xây dựng bộ nhân 2 số 8bit đối với kiểu
std_logic_vector
x3 x2 x1 x0 y3 y2 y1 y0
x3 x2 x1 x0 x3 x2 x1 x0 x3 x2 x1 x0 x3 x2 x1 x0
and and and and
y0 y1 y2 y3
z3 z2 z1 z0 z3 z2 z1 z0
(phần trả lời
tham khảo
mã nguồn
kèm theo)
Trang 41Ví 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
Trang 42Bà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)
Trang 43Bà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)
Trang 45Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 47elsif (Sel = “01”) then S <= B;
elsif (Sel = “10”) then S <= C;
elsif (Sel = “11”) then S <= D;
else S <= “0000”;
end if ;
end process ;
M U X
A B C D
S
Sel
Trang 48A B C D
S
Sel
Trang 49VI.2 Mệnh đề CASE (tiếp)
đề CASE hoặc IF.
Trang 50VI.2 Mệnh đề CASE (tiếp)
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”;
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!
Trang 51VI.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 source - single-driver)
Trang 52(multi-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 ;
Trang 53VI.3 Mệnh đề LOOP (tiếp)
chuyển sang vòng lặp tiếp theo: NEXT.
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ó
Trang 54VI.4 Mệnh đề WAIT
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
Trang 55VI.4 Mệnh đề WAIT (tiếp)
Trang 56VI.4 Mệnh đề WAIT (tiếp)
tường minh (explicit) hoặc không tường
C <= A and B;
End Process ;
Trang 57Output
(phần trả lời tham khảo mã nguồn kèm
Trang 58Bài tập
Trang 59Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 60VII Mã hóa DES với VHDL
Là thuật toán mã hóa khối, làm việc với
khối dữ liệu 64bit.
Khóa mã hóa 64bit (thực tế chỉ có 56bit vì 8bit còn lại dùng để kiểm tra)
Vì khóa không đủ độ dài, DES được cải
tiến thành Triple_DES (thức hiện DES 3
lần với 3 khóa)
Trang 61VIII Mã hóa DES với VHDL (tiếp)
16 rounds
Trang 62VIII Mã hóa DES với VHDL (tiếp)
Trang 63VIII Mã hóa DES với VHDL (tiếp)
Trang 64Nội dung
Giới thiệu VHDL
1
Cấu trúc lập trình2
Các đối tượng3
Các kiểu dữ liệu4
Các phép toán5
Các mệnh đề tuần tự6
DES với VHDL7
AES với VHDL8
Trang 65VIII Mã hóa AES với VHDL
Là thuật toán mã hóa khối, làm việc với khối dữ liệu 128bit.
dụng để thay thế Triple_DES.
Trang 66VIII Mã hóa AES với VHDL (tiếp)
Ciphertext
Trang 67VIII Mã hóa AES với VHDL (tiếp)
Trang 68VIII Mã hóa AES với VHDL (tiếp)
Trang 69VIII Mã hóa AES với VHDL (tiếp)
Trang 70VIII Mã hóa AES với VHDL (tiếp)
Trang 71So 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.
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.
Trang 72 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ỹ)
Trang 73Tài liệu tham khảo
L.Perry, McGraw Hill.
Circuit Design with VHDL, Volnei
A.Pedroni, MIT Press.
Manual, IEEE Computer Society.