Bài giảng Kỹ thuật số 2 - Chương 5: Thiết kế số dùng VHDL

- VHDL (Very High Speed Integrated Circuits HDL):

Ngôn ngữ được dùng để mô tả các hệ thống số: lập tài liệu (documentation), mô phỏng (simulation), kiểm chứng (verification) và tổng hợp (synthesis).

VHDL được chuẩn hóa vào năm 1987 qua chuẩn IEEE 1076 (VHDL-87) và được cập nhật năm 1993 (VHDL-93). Sau đó được bổ sung qua chuẩn IEEE 1164 với hệ thống logic đa trị.

Ứng dụng: thiết kế với các PLD, CPLD và FPGA.

- Sự khác biệt giữa VHDL và các ngôn ngữ lập trình thông thường

Ngôn ngữ lập trình thông thường: tuần tự

VHDL: song song

 

ppt 135 trang thom 08/01/2024 2700
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật số 2 - Chương 5: Thiết kế số dùng VHDL", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Kỹ thuật số 2 - Chương 5: Thiết kế số dùng VHDL

Bài giảng Kỹ thuật số 2 - Chương 5: Thiết kế số dùng VHDL
Chương 5 
THIẾT KẾ SỐ DÙNG VHDL 
Bài giảng môn Kỹ thuật số 2 
1 
Giảng viên: Nguyễn Hữu Chân Thành 
NỘI DUNG 
GIỚI THIỆU VỀ HDLs (Hardware Description Languages) 
CÁC CẤU TRÚC CƠ BẢN CỦA VHDL 
CÁC PHÁT BIỂU ĐỒNG THỜI 
CÁC PHÁT BIỂU TUẦN TỰ 
THIẾT KẾ MẠCH TUẦN TỰ 
THIẾT KẾ MÁY TRẠNG THÁI 
THIẾT KẾ PHÂN CẤP 
Bài giảng môn Kỹ thuật số 2 
2 
Giảng viên: Nguyễn Hữu Chân Thành 
1. GIỚI THIỆU 
Các phương pháp thiết kế: 
Các phương trình Boolean 
Thiết kế dựa trên Schematic 
Các ngôn ngữ mô tả phần cứng HDLs (Hardware Description Languages): VHDL, Verilog HDL, ABEL,  
Bài giảng môn Kỹ thuật số 2 
3 
Giảng viên: Nguyễn Hữu Chân Thành 
1. GIỚI THIỆU (tt) 
Quá trình thiết kế hệ thống số: 
Bài giảng môn Kỹ thuật số 2 
4 
Giảng viên: Nguyễn Hữu Chân Thành 
1. GIỚI THIỆU (tt) 
Các công cụ CAD: 
Nhập yêu cầu thiết kế (design entry) 
Dùng bảng chân trị 
Trực tiếp 
Vẽ dạng sóng quan hệ vào/ra (Waveform Editor) 
Dùng sơ đồ mạch (Graphic Editor) → thiết kế phân cấp 
Dùng HDLs 
Bài giảng môn Kỹ thuật số 2 
5 
Giảng viên: Nguyễn Hữu Chân Thành 
1. GIỚI THIỆU (tt) 
Các công cụ CAD: 
Tổng hợp (synthesis): 
Tổng hợp logic (logic synthesis/logic optimization) 
Ánh xạ công nghệ (technology mapping) 
Tổng hợp sơ đồ mạch (layout synthesis/physical design) 
Mô phỏng (simulation) 
Mô phỏng chức năng (functional simulation) 
Mô phỏng định thời (timing simulation) 
Bài giảng môn Kỹ thuật số 2 
6 
Giảng viên: Nguyễn Hữu Chân Thành 
1. GIỚI THIỆU (tt) 
VHDL ( V ery High Speed Integrated Circuits HDL ): 
Ngôn ngữ được dùng để mô tả các hệ thống số: lập tài liệu (documentation), mô phỏng (simulation), kiểm chứng (verification) và tổng hợp (synthesis). 
VHDL được chuẩn hóa vào năm 1987 qua chuẩn IEEE 1076 (VHDL-87) và được cập nhật năm 1993 (VHDL-93). Sau đó được bổ sung qua chuẩn IEEE 1164 với hệ thống logic đa trị . 
Ứng dụng: thiết kế với các PLD, CPLD và FPGA. 
Sự khác biệt giữa VHDL và các ngôn ngữ lập trình thông thường 
Ngôn ngữ lập trình thông thường: tuần tự 
VHDL: song song 
Bài giảng môn Kỹ thuật số 2 
7 
Giảng viên: Nguyễn Hữu Chân Thành 
2. CÁC CẤU TRÚC CƠ BẢN CỦA VHDL 
2.1. Entity 
Interface declaration 
Functional definition 
Entity 
Entity Declaration 
Architecture body 
Black box 
Internal 
machinery 
Packages 
Bài giảng môn Kỹ thuật số 2 
8 
Giảng viên: Nguyễn Hữu Chân Thành 
2.1. Entity (tt) 
Khai báo entity 
Entity định nghĩa giao tiếp của module phần cứng với môi trường bên ngoài sử dụng nó. 
Cú pháp khai báo: 
entity entity_name is 
	generics 
	ports 
begin 
	entity statements 
end [entity] entity_name; 
Bài giảng môn Kỹ thuật số 2 
9 
Giảng viên: Nguyễn Hữu Chân Thành 
2.1. Entity (tt) 
Các port trong khai báo entity: 
Mỗi tín hiệu I/O trong một khai báo entity được xem là một port. 
Mỗi port được khai báo phải có tên, chiều dữ liệu (mode) và kiểu dữ liệu. 
port (port_name : mode data_type ; 
	 port_name : mode data_type ; 
	 port_name : mode data_type) ; 
Các mode: 
In: luồng dữ liệu chỉ đi vào entity. 
Out: luồng dữ liệu chỉ đi ra khỏi entity. 
Buffer: tương tự out, nhưng cho phép hồi tiếp nội 
Inout: luồng dữ liệu có thể vào hay ra entity và cũng cho phép hồi tiếp nội. 
Bài giảng môn Kỹ thuật số 2 
10 
Giảng viên: Nguyễn Hữu Chân Thành 
2.1. Entity (tt) 
Kiểu dữ liệu: 
IEEE 1076/93: boolean, bit, bit_vector, integer,  
IEEE std_logic_1164: std_ulogic, std_ulogic_vector, std_logic và std_logic_vector (hệ thống logic đa trị). 
Các kiểu dữ liệu do người sử dụng đinh nghĩa. 
Khai báo của các kiểu dữ liệu phải cho phép entity thấy được qua các mệnh đề library và use . 
Ví dụ 2.1: khai báo cổng AND 
entity andgate is 
	 port ( A, B:	 in 	bit; 
	 C :	 out 	bit ) ; 
end andgate ; 
Bài giảng môn Kỹ thuật số 2 
11 
Giảng viên: Nguyễn Hữu Chân Thành 
2.1. Entity (tt) 
Ví dụ 2.2: khai báo bộ so sánh 4-bit 
entity eqcomp4 is 
port (A, B : in 	bit_vector(3 downto 0); 
	 equals : out 	bit); 
end eqcomp4; 
Ví dụ 2.3: 
library ieee; 
use ieee.std_logic_1164. all; 
 entity eqcomp4 is 
	 	 port (a, b :	 in	 std_logic_vector(3 downto 0); 
	 equals:	 out	 std_logic); 
 end eqcomp4; 
Bài giảng môn Kỹ thuật số 2 
12 
Giảng viên: Nguyễn Hữu Chân Thành 
2.2. Thân kiến trúc (Architecture body) 
Khai báo entity là một hộp đen với mô tả các giao tiếp I/O còn thân kiến trúc cung cấp mô tả chức năng của hộp đen đó. 
Một entity có thể có nhiều thân kiến trúc. 
Mỗi thân kiến trúc chỉ kết hợp với một khai báo entity. 
Các kiến trúc của VHDL được chia làm 2 loại: 
Mô tả hành vi (behavior description) 
Mô tả dạng giải thuật (algorithmic description) 
Mô tả luồng dữ liệu (data flow description) 
Mô tả cấu trúc (structural description) 
Một thiết kế có thể dùng một trong các loại trên hay cũng có thể kết hợp các loại với nhau. 
Bài giảng môn Kỹ thuật số 2 
13 
Giảng viên: Nguyễn Hữu Chân Thành 
1. GIỚI THIỆU (tt) 
Biểu diễn hệ thống: 
Dạng hành vi: mô tả chức năng của hệ thống → tập trung vào quan hệ giữa các tín hiệu vào và ra. 
Dạng cấu trúc: mô tả cài đặt bên trong của hệ thống → đặc tả rõ ràng các thành phần nào được dùng và kết nối giữa chúng. 
Bài giảng môn Kỹ thuật số 2 
14 
Giảng viên: Nguyễn Hữu Chân Thành 
2.2. Thân kiến trúc (Architecture body) (tt) 
Khai báo thân kiến trúc: 
architecture architecture_name of entity_name is 
	declarations 
begin 
	concurrent_statements 
end [ architecture ] architecture_name ; 
Mô tả hành vi: mô tả chức năng của hệ thống → tập trung vào quan hệ giữa các tín hiệu vào và ra. 
Mô tả dạng giải thuật: còn được gọi là mô tả cấp cao (high-level) vì nó tương tự với mô tả trong các ngôn ngữ cấp cao như C, Basic  
Bài giảng môn Kỹ thuật số 2 
15 
Giảng viên: Nguyễn Hữu Chân Thành 
2.2. Thân kiến trúc (Architecture body) (tt) 
Ví dụ 2.4: Mô tả dạng giải thuật: 
-- bộ so sánh bằng 4-bit 
entity eqcomp4 is 
	 port (a, b : 	in std_logic_vector(3 downto 0); 
	equals: 	 out std_logic); 
end eqcomp4; 
architecture behavioral of eqcomp4 is 
begin 
	comp: process (a, b) 
	 begin 
	 if a=b then 
	equals <= ‘1’; 
	 else 
	equals<=‘0’; 
	 end if; 
	 end process comp; 
end behavioral; 
Bài giảng môn Kỹ thuật số 2 
16 
Giảng viên: Nguyễn Hữu Chân Thành 
2.2. Thân kiến trúc (Architecture body) (tt) 
Mô tả luồng dữ liệu: mô tả cách dữ liệu truyền từ ngõ vào đến ngõ ra (không dùng các phát biểu tuần tự). 
Ví dụ 2.5: Mô tả dạng luồng dữ liệu: 
-- bộ so sánh bằng 4-bit 
library ieee; 
use ieee.std_logic_1164. all ; 
entity eqcomp4 is 
	 port (a, b : 	in std_logic_vector(3 downto 0); 
	equals: out std_logic); 
end eqcomp4; 
architecture dataflow of eqcomp4 is 
begin 
	equals <= ‘1’ when (a=b) else ‘0’; 
end dataflow; 
Bài giảng môn Kỹ thuật số 2 
17 
Giảng viên: Nguyễn Hữu Chân Thành 
2.2. Thân kiến trúc (Architecture body) (tt) 
Ví dụ 2.6: Mô tả dạng luồng dữ liệu khác: 
-- bộ so sánh bằng 4-bit 
library ieee; 
use ieee.std_logic_1164. all ; 
entity eqcomp4 is 
	 port (a, b : 	in std_logic_vector(3 downto 0); 
	equals: 	 out std_logic); 
end eqcomp4; 
architecture bool of eqcomp4 is 
begin 
	equals <= 	 not (a(0) xor b(0)) 
	 and not (a(1) xor b(1)) 
	 and not (a(2) xor b(2)) 
	 and not (a(3) xor b(3)) ; 
end bool; 
Bài giảng môn Kỹ thuật số 2 
18 
Giảng viên: Nguyễn Hữu Chân Thành 
2.2. Thân kiến trúc (Architecture body) (tt) 
Mô tả dạng cấu trúc: 
Chứa các danh sách kết nối (netlist) – các thành phần (component) được khởi tạo và được kết nối với nhau qua các tín hiệu. 
Thiết kế dạng phân tầng (hierarchical design). 
Top-down design 
Bottom-up design 
Bài giảng môn Kỹ thuật số 2 
19 
Giảng viên: Nguyễn Hữu Chân Thành 
2.2. Thân kiến trúc (Architecture body) (tt) 
Ví dụ 2.7: Mô tả dạng cấu trúc: 
library ieee; 
use ieee.std_logic_1164. all ; 
entity eqcomp4 is 
	 port (a, b : 	in std_logic_vector(3 downto 0); 
	equals:	 out std_logic); 
end eqcomp4; 
use work.gatespkg. all ; 
architecture struct of eqcomp4 is 
	signal x: std_logic_vector(0 to 3); 
begin 
	u0 : xnor2 port map (a(0), b(0),x(0)); 
	u1 : xnor2 port map (a(1), b(1),x(1)); 
	 u2 : xnor2 port map (a(2), b(2),x(2)); 
	u3 : xnor2 port map (a(3), b(3),x(3)); 
	u4 : and4 port map (x(0), x(1),x(2),x(3),equals); 
end struct; 
Bài giảng môn Kỹ thuật số 2 
20 
Giảng viên: Nguyễn Hữu Chân Thành 
2.3. Danh hiệu 
Danh hiệu cơ bản: gồm các ký tự alphabet, các ký số và dấu gạch dưới. 
Ký tự đầu tiên phải là chữ cái. 
Ký tự cuối cùng không được là dấu gạch dưới. 
Không phân biệt chữ hoa/thường. 
Không cho phép hai dấu gạch dưới xuất hiện liên tiếp. 
Danh hiệu mở rộng: chuỗi ký tự được ghi giữa hai dấu ‘\’ 
Có thể sử dụng bất cứ ký tự cho phép nào, bao gồm cả các ký tự !, ., @, và $. 
Phân biệt chữ hoa và chữ thường. 
Bài giảng môn Kỹ thuật số 2 
21 
Giảng viên: Nguyễn Hữu Chân Thành 
2.3. Danh hiệu (tt) 
Ví dụ 2.9: Các danh hiệu nào sau đây là hợp lệ: 
 _tx_clk? 
	 Sai: phải bắt đầu bằng một chữ cái. 
Tx_clk? 
	 Đúng: danh hiệu hợp lệ. 
6A15X? 
	 Sai: không được bắt đầu bằng một chữ số. 
Big#buffer? 
 	 Sai: không được có ký tự # trong danh hiệu. 
Select? 
 	 Sai: từ khóa. 
tx_clk_? 
 	 Sai: ký tự cuối cùng không được là dấu gạch dưới. 
ABC_456? 
 	 Đúng: danh hiệu hợp lệ. 
Tx__clk 
 	 Sai: không cho phép hai dấu gạch dưới liên tiếp. 
Bài giảng môn Kỹ thuật số 2 
22 
Giảng viên: Nguyễn Hữu Chân Thành 
2.4. Các đối tượng dữ liệu 
Đối tượng dữ liệu giữ giá trị có kiểu dữ liệu cụ thể. 
Đối tượng dữ liệu thuộc một trong 4 lớp: hằng số, biến số, tín hiệu và tập tin (file). 
Khả năng nhìn thấy (visibility): 
Moät ñoái töôïng ñöôïc khai baùo trong moät package coù theå ñöôïc tham chieáu bôûi moät entity hay moät architecture duøng package ñoù. 
Moät ñoái töôïng ñöôïc khai baùo trong moät entity chæ ñöôïc thaáy trong entity ñoù. 
Moät ñoái töôïng ñöôïc khai baùo trong moät architecture chæ ñöôïc thaáy trong architecture ñoù. 
Moät ñoái töôïng ñöôïc khai baùo trong moät process chæ ñöôïc thaáy trong process ñoù. 
Bài giảng môn Kỹ thuật số 2 
23 
Giảng viên: Nguyễn Hữu Chân Thành 
2.4.1 Hằng số 
Giữ một giá trị không đổi trong mô tả thiết kế. Giá trị này thường được gán khai báo. 
Khai báo: 
	 constant constant_name: type_name [:= value]; 
	Ví dụ 2.10: Các khai báo hằng số: 
constant bus _ width: integer := 8; 
constant rise_time: time := 10ns; 
constant iteration: integer := 4; 
Ñöôïc khai baùo trong vuøng khai baùo cuûa package, entity, architecture hay process. 
ÖÙng duïng: ñònh nghóa noäi dung cuûa ROM hay caùc thoâng soá coá ñònh (delay, soá laàn laëp, rise time, hold time ). 
Bài giảng môn Kỹ thuật số 2 
24 
Giảng viên: Nguyễn Hữu Chân Thành 
2.4.2 Tín hiệu 
Ñaïi dieän cho giaù trò döõ lieäu treân caùc ñöôøng döõ lieäu thöïc trong maïch (wire, port ) hay traïng thaùi cuûa caùc phaàn töû nhôù. 
Khai baùo: 
	 signal signal_name: type_name [:= initial value]; 
	Ví duï 2.11: Caùc khai baùo tín hieäu 
	 signal clock: bit; 
	 signal databus: std_logic_vector(0 to 7); 
Thöôøng ñöôïc khai baùo trong phaàn khai baùo cuûa entity hay architecrture. 
Coù hai chieàu: thôøi gian vaø giaù trò. 
Moät giaù trò ñöôïc gaùn ñeán moät tín hieäu khoâng laøm tín hieäu thay ñoåi töùc thôøi maø phaûi sau moät thôøi gian delay nhoû. 
Kyù hieäu pheùp gaùn: “ <= ” 
Bài giảng môn Kỹ thuật số 2 
25 
Giảng viên: Nguyễn Hữu Chân Thành 
2.4.3 Biến số 
Chæ duøng trong caùc process hay subprogam (function vaø procedure). 
Khai baùo: 
	 variable variable _name: type_name [:= initial value]; 
	Ví duï 2.12: Caùc khai baùo bieán soá 
	 variable result: std_logic := 0; 
	 variable sum: integer range 0 to 100 := 10; 
Phải ñöôïc khai baùo trong vuøng khai baùo cuûa caùc process hay subprogam. 
Pheùp gaùn cho moät variable laø töùc thôøi (khoâng coù chieàu thôøi gian). 
Kyù hieäu pheùp gaùn: “ := ” 
Caùc bieán ñöôïc duøng chuû yeáu cho muïc ñích tính toaùn (voøng laëp, trò trung gian, ). 
Bài giảng môn Kỹ thuật số 2 
26 
Giảng viên: Nguyễn Hữu Chân Thành 
2.5. Các kiểu dữ liệu 
Trong VHDL các đối tượng dữ liệu của các kiểu cơ bản (base type) khác nhau không thể gán cho nhau mà không dùng hàm chuyển đổi kiểu. 
Ví dụ 2.13: Nếu a và b đều là các biến nguyên thì phép gán 
	a <= b + ‘1’; 
	sẽ phát sinh lỗi trừ khi toán tử “+” là overloaded. 
Các kiểu dữ liệu trong VHDL có thể chia ra làm 4 loại chính: 
Kiểu vô hướng (kiểu một chiều) 
Kiểu phức hợp (kiểu đa chiều) 
Kiểu truy cập (access) 
Kiểu tập tin (file) 
Bài giảng môn Kỹ thuật số 2 
27 
Giảng viên: Nguyễn Hữu Chân Thành 
2.5.1. Kiểu vô hướng 
Kiểu vô hướng chỉ giữ một giá trị tại thời điểm mô phỏng hiện hành (current simulation time). 
Kiểu vô hướng có thứ tự cho phép dùng với các toán tử quan hệ. 
Có 4 loại kiểu vô hướng: 
(1) Kiểu liệt kê (enumeration type) 
(2) Kiểu số nguyên (integer type) 
(3) Kiểu số dấu chấm động (floating type) 
(4) Kiểu vật lý (physical type) 
Bài giảng môn Kỹ thuật số 2 
28 
Giảng viên: Nguyễn Hữu Chân Thành 
2.5.1.1. Kiểu liệt kê 
Danh sách các giá trị mà một đối tượng có thể giữ. 
Kiểu liệt kê có thứ tự: giá trị phía trái nhất là nhỏ nhất, tăng dần theo chiều sang phải và giá trị phía phải nhất là lớn nhất. 
Các kiểu định nghĩa sẵn (predefined) trong các gói standard, std_logic_1164,  
standard: bit, boolean, character 
std_logic_1164: std_ulogic, std_logic 
Ví dụ 2.14: 
type boolean is (false, true); 
type bit is (‘0’, ‘1’); 
Bài giảng môn Kỹ thuật số 2 
29 
Giảng viên: Nguyễn Hữu Chân Thành 
2.5.1.1. Kiểu liệt kê (tt) 
std_ulogic: hệ thống 9 mức logic 
type std_ulogic is (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘-’); 
Kiểu std_logic có cùng tập giá trị như std_ulogic nhưng có hàm phân giải, resolved , để phân giải mức logic khi có nhiều phép gán đến cùng một tín hiệu. 
subtype std_logic is resolved std_ulogic; 
Bài giảng môn Kỹ thuật số 2 
30 
Giảng viên: Nguyễn Hữu Chân Thành 
2.5.1.1. Kiểu liệt kê (tt) 
Do người sử dụng định nghĩa (user-defined): 
Ví dụ 2.15: 
type states is (read, write , play, sleep); 
signal current_state: states; 
type sports is (baseball, football, basketball, soccer, running); 
signal your_sport: sports; 
better_than_baskball= basketball else ‘0’; 
Bài giảng môn Kỹ thuật số 2 
31 
Giảng viên: Nguyễn Hữu Chân Thành 
2.5.1.2. Kiểu integer 
VHDL hỗ trợ các số nguyên trong khoảng – 2147483648 (hay –(2 31 -1)) ÷ 2147483647 ((2 31 -1)) → (32-bit) 
	type integer is range -2147483648 to 2147483647; 
Một đối tượng kiểu integer có thể ràng buộc với một khoảng. 
	variable a : integer range -255 to 255; 
Các thao tác với số có dấu và không dấu → tùy công cụ tổng hợp hỗ trợ. 
2.5.1.3. Kiểu real 
Giá trị trong khoảng -1.0E38 ÷ +1.0E38 
	type real is range -1.0E38 to 1.0E38; 
Thường không được hỗ trợ trong các công cụ tổng hợp do lượng tài nguyên cần để cài đặt các thao tác số học là rất lớn. 
Bài giảng môn Kỹ thuật số 2 
32 
Giảng viên: Nguyễn Hữu Chân Thành 
2.5.1.4. Kiểu vật lý 
Thường là các đơn vị đo, không có ý nghĩa cho việc tổng hợp. 
Ví dụ 2.16: Kiểu vật lý định nghĩa sẵn là time 
type time is range -2147483647 to 2147483647 
units 
fs; 
ps = 1000 fs; 
ns = 1000 ps; 
us = 1000 ns; 
ms = 1000 us; 
sec = 1000 ms; 
min = 60 sec; 
hr = 60 min; 
end units ; 
Bài giảng môn Kỹ thuật số 2 
33 
Giảng viên: Nguyễn H ... ;= value_expr_b_1; 
when others => 
sig_a <= value_expr_a_n; 
sig_b <= value_expr_b_n; 
end case ; 
Giả sử case_expr có thể có 5 giá trị: c0, c1, c2, c3 và c4. 
Bài giảng môn Kỹ thuật số 2 
90 
Giảng viên: Nguyễn Hữu Chân Thành 
Bài tập 
Mô tả mạch giải mã 3 → 8 (74LS138) 
Bài giảng môn Kỹ thuật số 2 
91 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ 
Một tín hiệu sẽ tạo ra chốt/flip-flop nếu được gán dưới sự thay đổi của một tín hiệu khác. 
if (clk = ‘1’) then  → tạo chốt 
if (clk’event and clk = ‘1’) then  → tạo flip-flop (cạnh lên) 
Nếu phép gán cho biến được thực hiện dưới sự thay đổi của tín hiệu khác và giá trị này sau đó truyền lại cho một tín hiệu → tạo chốt/flip-flop. 
Một biến sẽ tạo ra chốt/flip-flop nếu nó được dùng trước khi được gán một giá trị. 
Bài giảng môn Kỹ thuật số 2 
92 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.1: 
process (clk) 
begin 
	 if (clk 'event and clk='1') then 
	output1 <= temp; 	-- output1 được lưu 
	output2 <= a; 	-- output2 được lưu 
	 end if ; 
end process ; 
process (clk) 
begin 
	 if (clk 'event and clk='1') then 
	output1 <= temp; 	-- output1 được lưu 
	 end if ; 
	output2 <= a; 	-- output2 không được lưu 
end process ; 
Bài giảng môn Kỹ thuật số 2 
93 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.2 : Biến temp làm cho tín hiệu x được lưu 
process (clk) 
	 variable temp: bit; 
begin 
	 if (clk 'event and clk='1') then 
	temp := a; 
	 end if ; 
	x <= temp; -- biến temp làm cho tín hiệu x được lưu 
end process ; 
Bài giảng môn Kỹ thuật số 2 
94 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.3: Tạo D-FF 
entity dff_logic is 
 port ( 
 d, clk : in std_logic; 
 q : out std_logic); 
end dff_logic; 
architecture a of dff_logic is 
 begin 
 process (clk) 
	 begin 
 if (clk’ event and clk = ‘1’) then 
 q <= d; 
 end if ; 
 end process ; 
end a; 
Bài giảng môn Kỹ thuật số 2 
95 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.4: Tạo D-FF dùng phát biểu wait để phát hiện cạnh xung 
entity dff_logic is 
 port ( 
 d, clk : in std_logic; 
 q : out std_logic); 
end dff_logic; 
architecture a of dff_logic is 
 begin 
 process 
	begin 
 wait until (clk’ event and clk = ‘1’) then 
 q <= d; 
 end if ; 
 end process ; 
end a; 
Bài giảng môn Kỹ thuật số 2 
96 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.5: Tạo D-FF dùng hàm rising_edge để phát hiện cạnh xung 
entity dff_logic is 
 port ( 
 d, clk : in std_logic; 
 q : out std_logic); 
end dff_logic; 
 architecture a of dff_logic is 
 begin 
 process (clk) 
	begin 
 if rising_edge (clk) then 
 q <= d; 
 end if ; 
 end process ; 
 end a; 
Bài giảng môn Kỹ thuật số 2 
97 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.6: Tạo T-FF 
entity tff_logic is 
 port (t, clk : in std_logic; 
 q : buffer std_logic); 
end tff_logic; 
architecture a of tff_logic is 
 begin 
 process (clk) 
	 begin 
 if (clk ’event and clk = ‘1’) then 
 if (t = ‘1’) then 
 q <= not(q); 
 end if; 
 end if; 
 end process ; 
 end a; 
Bài giảng môn Kỹ thuật số 2 
98 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.7: Tạo D-FF với ngõ ra q và qbar 
entity dff_logic is 
 port (d, clk : in std_logic; 
 q : out std_logic; 
 qbar : out std_logic); 
end dff_logic; 
architecture a of dff_logic is 
 begin 
 process (clk) 
	 begin 
 if rising_edge (clk) then 
 q <= d; 
 qbar <= not d; 
 end if ; 
 end process ; 
end a; 
Bài giảng môn Kỹ thuật số 2 
99 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.8: Tạo D-FF với ngõ ra q và qbar 
entity dff_logic is 
 port (d, clk : in std_logic; 
 q : buffer std_logic; 
 qbar : out std_logic); 
end dff_logic; 
architecture a of dff_logic is 
 begin 
 process (clk) 
 begin 
 if rising_edge (clk) then 
 q <= d; 
 end if ; 
 end process ; 
 qbar <= not q; 
end a; 
Bài giảng môn Kỹ thuật số 2 
100 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.9: Tạo D-FF với reset bất đồng bộ 
entity dff_async_reset is 
 port (d, clk, rst: in std_logic; 
 q : out std_logic); 
end dff_async_reset; 
architecture a of dff_async_reset is 
 begin 
 process (clk, rst) 
	 begin 
 if (rst = ‘1’) then 
 q <= ‘0’; 
 elsif (clk ’event and clk = ‘1’) then 
 q <= d; 
 end if; 
 end process ; 
 end a; 
Bài giảng môn Kỹ thuật số 2 
101 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.10: Tạo D-FF với reset đồng bộ 
entity dff_sync_reset is 
 port (d, clk, rst: in std_logic; 
 q : out std_logic); 
end dff_sync_reset; 
architecture a of dff_sync_reset is 
 begin 
 process (clk) 
 begin 
 if (clk ’event and clk = ‘1’) then 
 if (rst = ‘1’) then 
 q <= ‘0’; 
 else 
 q <= d; 
 end if; 
 end if; 
 end process ; 
 end a; 
Bài giảng môn Kỹ thuật số 2 
102 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.11: Tạo thanh ghi dịch 
a 
b 
c 
Bài giảng môn Kỹ thuật số 2 
103 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.11: Tạo thanh ghi dịch (tt) 
a 
b 
c 
Bài giảng môn Kỹ thuật số 2 
104 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.11: Tạo thanh ghi dịch (tt) 
dout 
din 
Bài giảng môn Kỹ thuật số 2 
105 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.12: Tạo bộ đếm đồng bộ 8-bit với ngõ ra 3 trạng thái (OE), có chân cho phép nạp dữ liệu (LOAD) đồng bộ và cho phép đếm (EN). 
library ieee; 
use ieee.std_logic_1164. all ; 
use ieee. std_logic_unsigned. all ; 
entity counter is port ( 
	clk, load, oe, enable : in std_logic; 
	data : in std_logic_vector(7 downto 0); 
	cnt_out : out std_logic_vector(7 downto 0)); 
end counter; 
architecture cnt8 of counter is 
	 signal cnt: std_logic_vector(7 downto 0); 
begin 
	 process ( clk) 
	 begin 
Bài giảng môn Kỹ thuật số 2 
106 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.12: (tt) 
if rising_edge(clk) then 
	if load = ‘1’ then 
	cnt <= data; 
	elsif enable = ‘1’ then 
	cnt <= cnt+1; 
	end if ; 
end if ; 
	end process; 	 
	three_state: process (oe,cnt)	-- three-state buffers 
	begin 
	if oe = ’0’ then 
 	cnt_out ‘Z’); 
 	 else 
 	cnt_out <= cnt; 
	end if ; 
	end process three_state;	 
end cnt8; 
Bài giảng môn Kỹ thuật số 2 
107 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Bài tập: Tạo mạch JK_FF với ngõ ra Q đảo và không đảo 
Bài giảng môn Kỹ thuật số 2 
108 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.13: Xác định mạch tổng hợp của mô tả VHDL sau: 
Bài giảng môn Kỹ thuật số 2 
109 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Phát biểu vòng lặp loop: 
Dạng tổng quát: 
[loop_label:] [iteration_scheme] loop 
{sequential_statement} 
end loop [loop_label]; 
Có 2 kiểu lặp (iteration_scheme): 
(1) for identifier in range 
(2) while boolean_expression 
Bài giảng môn Kỹ thuật số 2 
110 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Ví dụ 5.14: Tạo thanh ghi dịch từ trái sang phải tổng quát N-bit (mặc định N = 4) với chân cho phép nạp dữ liệu đồng bộ Load. 
ENTITY shift_n IS 
	GENERIC (N : INTEGER := 4 ) ; 
	PORT (D 	: IN 	STD_LOGIC_VECTOR(N-1 DOWNTO 0); 
	 clk	 	: IN 	STD_LOGIC; 
	 Load, w	: IN 	STD_LOGIC; 
	 Q 	: BUFFER 	STD_LOGIC_VECTOR(N-1 DOWNTO 0)); 
END shift_n ; 
ARCHITECTURE behavior OF shift_n IS	 
BEGIN 
	PROCESS 
	BEGIN 
	 WAIT UNTIL Clock'EVENT AND Clock = '1' ; 
	 IF Load = '1' THEN 
	 Q <= D; 
	 ELSE 
	 Genbits: FOR i IN 0 TO N-2 LOOP 
	 Q(i) <= Q(i+1) ; 
	 END LOOP; 
	 Q(N-1) <= w; 
	 END IF; 
	END PROCESS; 
END behavior; 
Bài giảng môn Kỹ thuật số 2 
111 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Phát biểu exit: phát biểu tuần tự làm việc thực thi nhảy ra khỏi vòng lặp trong cùng hay vòng lặp được chỉ định bởi một nhãn. 
Dạng tổng quát: 
exit [loop_label] [when condition]; 
Ví dụ 5.15: 
Loop_X: loop 
 a_v := 0; 
Loop_Y: loop 
 exit Loop_X when condition_1; 
	 Output_1(a_v) := Input_1(a_v); 
	 av := av + 1; 
	 exit when condition_2; 
	 end loop Loop_Y; 
Assign_Y: B(i) <= Output_1(i) after 10 ns; 
	 exit Loop_X when condition_3; -- nếu bỏ qua nhãn Loop_X? 
 end loop Loop_X; 
Assign_X: A <=B after 10 ns; 
Bài giảng môn Kỹ thuật số 2 
112 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Phát biểu next: phát biểu tuần tự chỉ có thể dùng trong vòng lặp cho phép bỏ qua các phát biểu còn lại trong lần lặp hiện hành . 
Dạng tổng quát: 
next [loop_label] [when condition]; 
Ví dụ 5.16: 
Loop_X: for count_value in 1 to 8 loop 
Assign_1: A(count_value) := '0'; 
 	 k := 0; 
Loop_Y: loop 
Assign_2: B(k) := '0'; 
 next Loop_X when condition_1; -- nếu bỏ qua nhãn Loop_X? 
Assign_3: B(k + 8) := '0'; 
 k := k + 1; 
 end loop Loop_Y; 
 end loop Loop_X; 
Bài giảng môn Kỹ thuật số 2 
113 
Giảng viên: Nguyễn Hữu Chân Thành 
5. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Các lỗi thường gặp 
library ieee ; 
use ieee . std_logic_1164 .all; 
entity term-count is port 
 clock, reset, oe : in bit; 
 data : in std_logic_vector(7 downto 0); 
 cnt_out : out std_logic_vector(7 downto 0); 
 equals : out std_logic;); 
end term-count; 
architecture a of term-count 
 signal cnt: std_logic_vector(7 downto 0); 
begin 
 compare: process 
 begin 
 if data = cnt then 
 equals = ‘1’; 
 end if ; 
 end process ; 
Bài giảng môn Kỹ thuật số 2 
114 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Các lỗi thường gặp (tt) 
counter: process (clk) 
begin 
 if reset = ‘1’ then 
 cnt <= “0000”; 
 elseif (clock’ event and clock=‘1’) 
 cnt <= cnt + 1; 
 end if ; 
end process; 
cnt_out <= ( others <= ‘Z’) when oe = ‘0’ else cnt; 
end a; 
Bài giảng môn Kỹ thuật số 2 
115 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Mã VHDL sau khi sửa lỗi: 
library ieee ; 
use ieee . std_logic_1164 .all; 
use ieee . std_logic_unsigned .all; 
entity term _ count is port ( 
 clock, reset, oe : in bit; 
 data : in std_logic_vector(7 downto 0); 
 cnt_out : out std_logic_vector(7 downto 0); 
 equals : out std_logic); 
end term _ count; 
architecture a of term _ count 
 signal cnt: std_logic_vector(7 downto 0); 
begin 
 compare: process (cnt, data) 
 begin 
 if data = cnt then 
 equals < = ‘1’; 
 else 
 equals <= ‘0’; 
 end if ; 
 end process ; 
Bài giảng môn Kỹ thuật số 2 
116 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MẠCH TUẦN TỰ (tt) 
Mã VHDL sau khi sửa lỗi: (tt) 
counter: process ( clock, reset ) 
begin 
 if reset = ‘1’ then 
 cnt <= “ 00000000 ”; 
 elsif (clock’ event and clock=‘1’) then 
 cnt <= cnt + 1; -- khai báo thêm use ieee . std_logic_unsigned .all; 
 end if ; 
end process; 
cnt_out ‘Z’) when oe = ‘0’ else cnt; 
end a; 
Bài giảng môn Kỹ thuật số 2 
117 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI 
Có nhiều cách khác nhau để mô tả một máy trạng thái: 
Bài giảng môn Kỹ thuật số 2 
118 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI (tt) 
Một khuôn dạng mô tả máy trạng thái (reset bất đồng bộ): 
Moore output 
Bài giảng môn Kỹ thuật số 2 
119 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI (tt) 
Khuôn dạng đầy đủ: 
Bài giảng môn Kỹ thuật số 2 
120 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI (tt) 
Ví dụ 6.1: Mô tả FSM sau: 
Bài giảng môn Kỹ thuật số 2 
121 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI (tt) 
Trường hợp cần ngõ ra Mealy đồng bộ có thể dùng khuôn dạng: 
Dùng thêm 1 tín hiệu tạm temp cho ngõ ra 
Bài giảng môn Kỹ thuật số 2 
122 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI (tt) 
Ví dụ 6.2: Mô tả lại FSM của vd 6.1 
với ngõ ra đồng bộ: 
Bài giảng môn Kỹ thuật số 2 
123 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI (tt) 
Ví dụ 6.3: Mô tả FSM sau: 
Chỉ dùng 1 process cho khối logic trạng thái kế tiếp và hiện tại 
Tạo khối logic ngõ ra riêng 
Bài giảng môn Kỹ thuật số 2 
124 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI 
Ví dụ 6.3: (tt) Dùng 2 process 
Bài giảng môn Kỹ thuật số 2 
125 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI 
Ví dụ 6.4: Mô tả FSM sau: 
Chỉ dùng 1 process cho khối logic trạng thái kế tiếp và hiện tại 
Tạo khối logic ngõ ra riêng 
Bài giảng môn Kỹ thuật số 2 
126 
Giảng viên: Nguyễn Hữu Chân Thành 
6. THIẾT KẾ MÁY TRẠNG THÁI 
Vấn đề gán trạng thái: 
library IEEE; 
use IEEE.std_logic_1164. all ; 
library SYNOPSYS; 
use SYNOPSYS.attributes. all ; 
... 
architecture fsmexampe_arch of fsmexamp is 
type Sreg_type is (INIT, A0, A1, OK0, OK1); 
attribute enum_encoding of Sreg_type: type is 
"0000 0001 0010 0100 1000"; 
signal Sreg: Sreg_type; 
... 
library IEEE; 
use IEEE.std_logic_1164. all ; 
... 
architecture fsmexampc_arch of fsmexamp is 
subtype Sreg_type is STD_LOGIC_VECTOR (1 to 4); 
constant INIT: Sreg_type := "0000"; 
constant A0 : Sreg_type := "0001"; 
constant A1 : Sreg_type := "0010"; 
constant OK0 : Sreg_type := "0100"; 
constant OK1 : Sreg_type := "1000"; 
signal Sreg: Sreg_type; 
... 
Bài giảng môn Kỹ thuật số 2 
127 
Giảng viên: Nguyễn Hữu Chân Thành 
7. THIẾT KẾ PHÂN CẤP TRONG VHDL 
Bài giảng môn Kỹ thuật số 2 
128 
Giảng viên: Nguyễn Hữu Chân Thành 
7. THIẾT KẾ PHÂN CẤP TRONG VHDL (tt) 
Để dùng một component trong thiết kế cần có hai bước: 
Khai báo component: cho biết tên và các giao tiếp của component. 
Khởi tạo component: kết hợp các tín hiệu với các port của component. 
Bài giảng môn Kỹ thuật số 2 
129 
Giảng viên: Nguyễn Hữu Chân Thành 
7. THIẾT KẾ PHÂN CẤP TRONG VHDL (tt) 
Có 2 cách cơ bản để khai báo 1 component: 
Khai báo trong đoạn mã chính của thiết kế. 
Khai báo trong một PACKAGE. 
Bài giảng môn Kỹ thuật số 2 
130 
Giảng viên: Nguyễn Hữu Chân Thành 
7. THIẾT KẾ PHÂN CẤP TRONG VHDL (tt) 
Có 2 cách kết hợp giữa các tham số hình thức và tham số thực: 
Theo vị trí: mỗi tham số thực trong khởi tạo component được ánh xạ theo vị trí của mỗi port trong khai báo component. 
Theo tên: danh sách kết hợp có dạng: ( không cần theo thứ tự ) 
formal1 => actual1, formal2 => actual2,  
Bài giảng môn Kỹ thuật số 2 
131 
Giảng viên: Nguyễn Hữu Chân Thành 
7. THIẾT KẾ PHÂN CẤP TRONG VHDL (tt) 
Ví dụ 7.1: Thực hiện mạch logic như hình sau: 
Bài giảng môn Kỹ thuật số 2 
132 
Giảng viên: Nguyễn Hữu Chân Thành 
7. THIẾT KẾ PHÂN CẤP TRONG VHDL (tt) 
Ví dụ 7.1: (tt) 
w 
Bài giảng môn Kỹ thuật số 2 
133 
Giảng viên: Nguyễn Hữu Chân Thành 
7. THIẾT KẾ PHÂN CẤP TRONG VHDL (tt) 
Ví dụ 7.1: (tt) 
Cũng có thể khai báo component trong 1 PACKAGE như sau: 
Bài giảng môn Kỹ thuật số 2 
134 
Giảng viên: Nguyễn Hữu Chân Thành 
Q&A 
Bài giảng môn Kỹ thuật số 2 
135 
Giảng viên: Nguyễn Hữu Chân Thành 

File đính kèm:

  • pptbai_giang_ky_thuat_so_2_chuong_5_thiet_ke_so_dung_vhdl.ppt