Está en la página 1de 37

BOÄ GIAÙO DUÏC & ÑAØO TAÏO

TRÖÔØNG ÑAÏI HOÏC KYÕ THUAÄT COÂNG NGHEÄ


THAØNH PHOÁ HOÀ CHÍ MINH

Ths. NGUYEÃN TROÏNG HAÛI

TOÙM TAÉT BAØI GIAÛNG

VHDL
Very High speed integrated circuit Description Language

LÖU HAØNH NOÄI BOÄ


07/2005
Bài giảng Thiết Kế Hệ Thống Số Phần VHDL

VHDL
Very High speed integrated circuit Description Language

I. CẤU TRÚC CỦA MỘT THIẾT KẾ DÙNG NGÔN NGỮ VHDL.

---------------------------------
-- Ghi chú
---------------------------------

PACKAGE (Tùy chọn)


library
(Thư viện)
use
ENTITY (Bắt buộc)
ARCHITECTURE (Bắt buộc)
CONFIGURATIONS (Tùy chọn)

1. PACKAGE (KHỐI).
Package là một vùng lưu trữ các dữ liệu để dùng chung cho các entity.
Mô tả dữ liệu bên trong một package cho phép được tham khảo bởi một entity khác, vì
vậy dữ liệu có thể được dùng chung.
Một package bao gồm 2 phần: phần mô tả định nghĩa giao diện cho package, phần
thân ấn định các hoạt động cụ thể của package.
Cú pháp khai báo khối được xác định là:

PACKAGE example_arithmetic IS
-- các khai báo khối có thể chứa các khai báo sau:
- Subprogram declaration.
- Type, subtype declaration.
- Constant, deferred constant declaration.
- Signal declaration creates a global signal.
- File declaration.
- Alias declaration.
- Attribute declaration, a user-define attribute.
- Attribute specification.
- Use clause.
END example_arithmetic;
Tất cả các đối tượng khai báo trong package có thể được truy xuất bởi bất kỳ một thiết
kế nào đó bằng cách sử dụng mệnh đề use và khai báo library.
library my_lib;
use my_lib.example_arithmetic.all;
Một số thư viện chuẩn

GV: Nguyễn Trọng Hải Trang 1


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
library ieee;
use ieee.std_logic_1164.all;
std_logic_1164: là thư viện logic chuẩn của IEEE (đoạn 1164), mục đích cung cấp
các chuẩn cơ bản để có thể mô tả các kiểu dữ liệu kết nối trong VHDL.
std_logic_arith: là thư viện chứa tập các phép toán và hàm
Kiểu std_logic có thể có các giá trị
U Uninitialized
X Unknown
0 Zero
1 One
Z Tristate (Must be upper case!)
W Weak unknown
L Weak Zero
H Weak One
- Don't care
Ngoài ra có thể tự tạo riêng các thư viện trong thiết kế.

2. ENTITY
Khai báo entity chỉ dùng để mô tả ngõ vào và ngõ ra của một thiết kế. Mức cao nhất
của bất kỳ một thiết kế VHDL là một khai báo entity đơn, khi thiết kế trong VHDL, tên
của file lưu trữ phải trùng với tên theo sau của từ khóa entity.
Ví dụ, mô tả bộ cộng bán phần sau
X1
A SUM

A1

B CARRY

library ieee;
use ieee.std_logic_1164.all;
ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;

GV: Nguyễn Trọng Hải Trang 2


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Trong khai báo ENTITY, có 4 kiểu tín hiệu khác nhau:
• IN: mô tả các ngõ vào entity. Kiểu IN thì được sử dụng cho các ngõ vào clock, các
ngõ vào điều khiển,…
• OUT: mô tả dòng dữ liệu đi ra khỏi entity, entity sẽ không thể đọc các tín hiệu này,
kiểu OUT chỉ được sử dụng khi tín hiệu không được sử dụng bởi bất kỳ kiểu nào
trong entity.
• BUFFER: Kiểu tín hiệu này mô tả dòng dữ liệu đi ra khỏi entity, nhưng entity có
thể đọc những tín hiệu này (mục đích đọc lại tín hiệu ngõ ra ở bên trong của cấu
trúc). Tuy nhiên , tín hiệu sẽ không thể điều khiển từ ngõ ra của entity, vì vậy nó
không thể được sử dụng cho các dữ liệu ngõ vào.
• INOUT: Kiểu tín hiệu này cho phép tín hiệu có thể có cả hai kiểu: vào và ra, khi
khai báo tín hiệu theo kiểu INOUT thì tín hiệu có thể được điều khiển từ ngõ ra của
entity. Kiểu tín hiệu này chỉ nên sử dụng khi thật cần thiết(ví dụ như bus dữ kiệu 3
trạng thái), và khi sử dụng kiểu tín hiệu này thì mã của chương trình sẽ trở nên khó
hiểu hơn đối với người thiết kế.
Loại tín hiệu cũng phải được mô tả trong khai báo PORT, loại tín hiệu sẽ mô tả các giá
trị mà tín hiệu đó có thể được ấn định, ngoài ra có thể mô tả một vector những tín hiệu
có cùng loại.
Lưu ý: trong file report, nếu không gán chân linh kiện thì các biến ngõ vào và ra sẽ
được gán ngẫu nhiên. Để gán các chân, có thể thực hiện từ phần mềm hỗ trợ hoặc thực
hiện như sau:
Ví dụ,

ENTITY my_design is
Port (a, b : in integer range 0 to 7;
c : bit_vector (3 to 5);
d : bit_vector (27 downto 25);
e : out Boolean);
attribute pinnum: string;
attribute pinnum of c: signal is "1,2,3";
attribute pinnum of d: signal is "6,5,4";
attribute pinnum of e: signal is "2";
END my_design;

3. ARCHITECTURE.
Chức năng của architecture là mô tả mối liên hệ giữa các tín hiệu ngõ vào và tín hiệu
ngõ ra ( bao gồm cả những tín hiệu BUFFER), có thể viết nhiều kiến trúc khác nhau
trong một entity, nhưng chỉ một trong số đó có khả năng xuất hiện trong mã VHDL.
architechture có 3 dạng: mô tả cấu trúc (structure); mô tả dòng dữ liệu (data flow); mô
tả hành vi (behavioral)

GV: Nguyễn Trọng Hải Trang 3


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Mô tả architechture dưới dạng cấu trúc (structure)
Ví dụ, chương trình bộ cộng trên sẽ có dạng:

ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS
Component XOR2
Port(X,Y: in BIT; Z: out BIT);
End component
Component AND2
Port(L,M: in BIT; N: out BIT);
End component
BEGIN
X1: XOR2 port map (A,B,SUM);
A1: AND2 port map (A,B,CARRY);
END HA_STRUCTURE;
Chú ý, trong trường hợp này các tín hiệu trong Port Map(ánh xạ cổng) của đối tượng
trong thành phần này và các tín hiệu trong khai báo phải được liên kết theo vị trí
Mô tả architechture dưới dạng dòng dữ liệu (data flow)
Ví dụ, chương trình bộ cộng trên sẽ có dạng:

ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS
BEGIN
SUM<=A xor B;
CARRY<=A and B;
END HA_STRUCTURE;

Mô hình dòng dữ liệu sử dụng phát biểu gán tín hiệu đồng thời, ký hiệu <= chỉ giá trị
được gán cho tín hiệu. Phép gán được thực hiện khi có 1 sự kiện tín hiệu của biểu thức
bên phải.

GV: Nguyễn Trọng Hải Trang 4


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Mô tả architechture dưới dạng hành vi (behavioral)
Kiểu mô tả hành vi bao gồm tập hợp thứ tự các phép gán tín hiệu tuần tự được khai báo
bên trong phát biểu process.
Biến được khai báo trong process là biến cục bộ. Tín hiệu không được khai báo trong
process
Ví dụ, chương trình bộ cộng trên sẽ có dạng:

ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS
BEGIN
Process(A,B);
Begin
SUM<=A xor B;
CARRY<=A and B;
End process;
END HA_STRUCTURE;
Ví dụ, mô tả một D-FF:

D Q

CK Q

ENTITY DFF IS
PORT( D,CK : IN BIT;
Q : OUT BIT);
END DFF;
ARCHITECTURE DFF_BEHAVIOR OF DFF IS
BEGIN
Process(CK);
Begin
If rising_edge(ck) then
Q<=D;
End if;
End process;
END DFF_BEHAVIOR ;

GV: Nguyễn Trọng Hải Trang 5


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Mô tả architechture dưới dạng hỗn hợp (mixed style)
Có thể trộn lẫn 3 kiểu trong một architechture
Ví dụ, mô tả mạch cộng toàn phần (FULL_ADDER) sau

structure dataflow
X1
A
: B SUM
Cin

CARRY

behavior

ENTITY FULL_ADDER IS
PORT( A,B,CIN : IN BIT;
SUM, COUT : OUT BIT);
END DFF;
ARCHITECTURE FA_MIXED OF FULL_ADDER IS
Component XOR2
Port(X,Y: in BIT; Z: out BIT);
End component
Signal S1: BIT --Khai báo tín hiệu cục bộ trong architechture
BEGIN
X1: XOR2 port map (A,B,S1); --structure
Process(A,B,CIN); --behavior
Variable T1,T2,T3: BIT;
Begin
T1:=A and B;
T2:=A and CIN;
T3:=B and CIN;
COUT<=T1 or T2 or T3;
End process;
SUM<=S1 xor CIN; --dataflow
END FULL_ADDER;

GV: Nguyễn Trọng Hải Trang 6


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
4. CONFIGURATION
Configuration dùng để liên kết các hợp phần tới entity
configuration ban đầu có thể được ấn định tới rất nhiều architecture trong một entity.

ENTITY component_i IS

ARCHITECHTURE ARCHITECHTURE ARCHITECHTURE


Behavioral dataflow Structural
OF OF OF
component_i component_i component_i
IS IS IS
…. …. ….

Định cấu hình cho phép mô phỏng các thiết kế ở thành phần con, dễ dàng kiểm tra
được thiết kế hơn một chương trình lớn.
Một cấu hình được dùng để nối từng cặp như sau:
• Một thân architecture tới khai báo entity của nó.
• Một component với một entity.
Ví dụ, xây dựng một entity FULL_ADDER ở trên có thể tách ra làm ba architecture
body: FA_BEHAVIOR, FA_STRUCTURE, và FA_MIXED. Một architecture bất kỳ
có thể được chọn bằng cách đặc tả một configuration thích hợp.
Library HS_LIB, CMOS_LIB;
ENTITY FULL_ADDER IS
Port(A,B,Cin : IN BIT; SUM, Cout: OUT BIT);
END FULL_ADDER;

ARCHITECTURE FA_STR OF FULL_ADDER IS


Component XOR2
Port(D1,D2 : IN BIT; DZ : OUT BIT);
END componen;
Component AND2
Port ( Z: OUT BIT; B0,B1: IN BIT);
END Component;

-- Đặc tả cấu hình:

GV: Nguyễn Trọng Hải Trang 7


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL

CONFIGURATION FA_BINDING OF FULL_ADDER IS


For FA_STR
For X1,X2 : XOR2
use entity WORK.XOR2(XOR2BEH);
End for;
-- liên kết thực thể với nhiều đối tượng của một thành phần.
For A3: AND2
Use entity HS_LIB.AND2HS(AND2STR);
PORT MAP (HS_B => A1, HS_Z=>Z, HS_A => A0 );
End for;
--liên kết thực thể với các đối tượng đơn của một thành phần.
For all : OR2
Use entity CMOS_LIB.OR2CMOS(OR2STR);
End for;
-- liên kết thực thể với tất cả các đối tượng của thành phần OR2.
For others: AND2
Use entity WORK.A_GATE(A_GATE_BODY);
PORT MAP(A0,A1,Z);
End for;
-- liên kết thực thể với tất cả các đối tượng không được liên kết của
thành phần AND2.
End for;
End for;
Signal S1, S2, S3, S4, S5: BIT;
BEGIN
X1: XOR2 port map(A, B, S1);
X1: XOR2 port map(S1, Cin, SUM);
A1: AND2 port map(S2, A, B);
A2: AND2 port map(S3, B, Cin);
A3: AND2 port map(S4, A, Cin);
O1: OR2 port map(S2, S3, S5);
O2: OR2 port map(S3, B, Cin);
NAND_GATE port map(S4,S5,Cout);
END FA_STR;

GV: Nguyễn Trọng Hải Trang 8


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Có 4 đặc tả cấu hình trong phần khai báo của thân kiến trúc (architecture body):
• Đặc tả thứ nhất chỉ rằng đối tượng có nhãn X1 và X2 của component XOR2 liên
kết với entity bởi cặp entity - architecture XOR2 và XOR2BEH có sẵn trong thư
viện WORK.
• Đặc tả thứ hai liên kết đối tượng component AND2 có nhãn A3 đến entity bởi cặp
entity - architecture AND2HS và AND2STR đã có trong thư viện thiết kế
HS_LIB. Anh xạ của cổng thành phần (AND2 ) và các cổng thực thể(AND2HS)
được liên kết theo tên (name association).
• Đặc tả thứ ba chỉ rằng tất cả các đối tượng của component OR2 được liên kết với
entity bởi cặp entity - architecture có sẵn trong thư viện thiết kế CMOS_LIB.
• Đặc tả cuối cùng chỉ rằng tất cả các đối tượng không liên kết (unbound) của
component AND2, đối tượng A1 và A2 được liên kết tới entity khác là: A_GATE
có architecture A_GATE_BODY, kiến trúc này có sẵn trong thư viện WORK.
Trong ví dụ này đã chỉ ra các đối tượng của cung một thành phần (component) có thể
được liên kết(bound) với các thực thể khác nhau.

II. CÁC KHAI BÁO TRONG VHDL.

1. Khai báo kiểu hỗ trợ.


Kiểu liệt kê, số nguyên, dãy một chiều và kiểu bản ghi.
• Kiểu liệt kê.
Ví dụ,
Type STD_ULOGIC is (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘_’);
--std_ulogic là 1 kiểu liệt kê bao gồm 9 giá trị được khai báo là
U<X<0<1<Z<W<L<H< _.
Signal S: STD_ULOGIC;
Type STATE_TYPE is (HALT, READY, RUN, ERROR);
--HALT< READY< RUN< ERROR
Variable STATE: STATE_TYPE;
Type CODE_TYPE is (NUL, ‘0’, ‘1’);
Function CODE (C: in INTEGER) return CODE_TYPE;
Kiểu STD_ULOGIC và STATE_TYPE là 2 kiểu liệt kê; tuy nhiên mức độ trừu tượng
của STATE_TYPE cao hơn của STD_ULOGIC.
Trật tự các giá trị xuất hiện trong khai báo liệt kê định nghĩa thứ tự của chúng, giá trị
bên trái nhỏ hơn giá trị bên phải.
• Kiểu nguyên.
Kiểu nguyên là 1 tập hợp những giá trị rơi vào vùng số nguyên được chỉ ra.
Ví dụ,
type LENGTH is range 0 to 1000;

GV: Nguyễn Trọng Hải Trang 9


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL

type BYTE_INT is range –128 to 127;


type MY_INTEGER is range -2147483647 to 2147483647;
• Kiểu dãy nhiều chiều.
Kiểu dãy nhiều chiều được VHDL hỗ trợ để định nghĩa một tập chỉ số.
Tuy nhiên chỉ có dãy một chiều được công cụ tổng hợp cho phép. Vậy phải khai báo
hai dãy một chiều thay vì một dãy hai chiều.
Ví dụ,
Type WORD is array (31 downto 0) of BIT;
Type RAM is array (1023 downto 0) of WORD;
Thay vì:
Type OTHER_RAM is array (1023 downto 0, 31 downto 0) of BIT
• Kiểu bản ghi
Kiểu bản ghi định nghĩa tập các kiểu khác nhau. Mỗi thành phần bản ghi được định vị
bằng tên của nó, và có thể dịch bởi công cụ tổng hợp như là giá trị độ dời không đổi
hoặc được biến đổi trong vài trường hợp (khái niệm bản ghi không còn tồn tại nữa, địa
chỉ thành phần được tính toán chỉ một lần và trở thành mã cố định).
Ví dụ,
Architecture A of E is
Type CODE_TYPE is (NONE, DATA, STATMT) ;
Type ITEM_TYPE is record;
CODE: CODE_TYPE;
INT: INTEGER;
End record;
Signal S1, S2 : ITEM_TYPE;
Begin
Process
Variable V: ITEM_TYPE;
Begin
S1 <= V;
V:= S2;

S2.INT <= 0;
V.CODE := S1.CODE;
• Tiêu chuẩn IEEE
Khối STD_LOGIC_1164 định nghĩa các giá trị kiểu đa luận lý. Khối này được hỗ trợ
bởi tất cả công cụ tổng hợp.
Ví dụ,
Type STD_LOGIC is ( ‘U’, -- Uninitialized
‘X’, -- Forcing Unknown
‘0’, -- Forcing 0
‘1’, -- Forcing 1
‘Z’, -- High Impedance
‘W’, -- Weak Unknown
‘L’, -- Weak 0

GV: Nguyễn Trọng Hải Trang 10


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
‘H’, -- Weak 1
‘U’, -- Don’t care );
'X', '1', '0' là giá trị mạnh và trội hơn các giá trị yếu 'W', 'L', 'H' và chúng lại trội hơn 'Z'.
'1' và '0' có thể hiểu như là nối nguồn và nối đất.
Giá trị 'U'và 'W' được gọi là giá trị gần luận lý, chủ yếu có chức năng mô phỏng và
hiển nhiên không có ý nghĩa phần cứng. Giá trị 'U' là chữ tận cùng bên trái trong định
nghĩa STD_ULOGIC liệt kê, và là giá trị mặc định cho các biến số hoặc các tín hiệu
ban đầu trước khi được gán các giá trị 'X' và 'W' biểu diễn trạng thái mà bộ mô phỏng
không thể xác định được. 'W' có ảnh hưởng ít hơn có thể bị gán đến '0', '1' và 'X'.
Do các công cụ tổng hợp chưa thể phân biệt giữa các độ mạnh yếu, nên các giá trị 'L'
và 'H' không có ngữ nghĩa tổng hợp chuẩn.
'Z' có thể được dùng trong mô phỏng như là kết quả khi không có bộ điều khiển nào
đang hoạt động. Đối với tổng hợp, phần cứng đặc biệt được ám chỉ khi gán phép gán
giá trị vô hướng 'Z' được dùng, mục đích của phép gán là đặt đầu ra tới bộ đệm 3 trạng
thái.
2. Các kiểu không hỗ trợ.
Vài kiểu dữ liệu không được dùng cho mục đích tổng hợp (ví dụ, tất cả kiểu vật lý định
nghĩa bởi người thiết kế không được hỗ trợ), kiểu vật lý định nghĩa trước TIME không
được hỗ trợ. Ngay cả sự ràng buộc thời gian đối với tổng hợp không được biểu diễn
trong VHDL với các biểu thức thời gian. Do đó mệnh đề after và reject không được
dịch và không có công cụ tổng hợp nào có thể đảm bảo rằng tín hiệu sẽ thay đổi sau
một khoảng thời gian chính xác.
Nếu các mệnh đề này được sử dụng trong mô tả VHDL, công cụ tổng hợp sẽ bỏ qua và
kết quả phần cứng có thể mâu thuẫn với mô tả đầu vào. Điều này nói rằng kiểu mẫu
chính xác cho tổng hợp không dùng bất kỳ biểu thức thời gian nào, bao gồm lệnh biểu
thức thời gian wait for. Trong mô phỏng qúa trình bị tạm ngưng trong thời gian định
nghĩa bởi biểu thức for. Trong suốt giai đoạn này, tất cả tín hiệu giữ các giá trị mới của
chúng. Trong miền tổng hợp không thể phỏng đoán phần cứng với các kết quả như vậy
mà không cung cấp phần cứng vì nó quá phức tạp và quá đặc biệt (như bộ định thời
gian).
3. Các kiểu con.
Các kiểu con rất hữu dụng cho tổng hợp. Ở mỗi bước mô phỏng, các kiểu con cung cấp
khả năng mạnh mẽ cho việc kiểm tra sử dụng kiểu. Các kiểu con còn thừa hưởng tất cả
toán tử định nghĩa từ các kiểu cơ bản của chúng.
Ví dụ, chức năng thao tác trên kiểu BIT_VECTOR có thể được dùng với bất kỳ kiểu
con của BIT_VECTOR dài bằng giá trị còn lại trong khoảng thích hợp.
III. CÁC ĐỐI TƯỢNG VHDL.
Đối tượng trong VHDL là các thông tin về hằng số, biến số và tín hiệu.
1. Hằng số.
Các khai báo hằng số:
Constant constant_name : type_name [:=value]
Ví dụ,

GV: Nguyễn Trọng Hải Trang 11


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL

Constant rise_time : time :=10 ns;


Constant bus_width : integer :=8;
Ví dụ,
Type TAB2 is array (BIT, BIT) of BIT;
Constant AND_TAB: TAB2 := ((‘0’, ’0’), (‘0’, ‘1’));
Giá trị hằng số được tính toán chỉ một lần. Quá trình tổng hợp chấp nhận hằng số của
bất kỳ kiểu tổng hợp nào.
Trong trường hợp khai báo như vậy không tạo ra bất kỳ phần cứng nào:
Nếu hằng số được dùng trong phép gán tín hiệu như các lệnh dưới đây thì phần cứng
được suy ra:
Ví dụ,
Signal Z, A, B : BIT;

Z <= AND_TAB (A,B);
Sự khai báo hằng số không tạo ra phần cứng. Hằng số chỉ cung cấp điều kiện để xác
định phần cứng. Hằng số là một biểu thức vì vậy nó tồn tại trong cùng một nơi như các
biểu thức:
Ví dụ, Phía phải của phép gán tín hiệu
Constant COD1: BIT_VECTOR := X ”EA”;
Constant MASK: BIT_VECTOR:=”01111111”;
Signal V, R, A: BIT_VECTOR(7 downto 0);

begin
V <= COD1; R <= A and MASK;
Ví dụ, trong biểu thức lệnh if hoặc case
If S= CST1 then …
Case VALUE is
When CST_N =>…
Ví dụ, trong lệnh đồng thời có điều kiện:
Z <= CST1 when A=’1’ else S when B= CST2 else CST3;
2. Khai báo biến số và tín hiệu.
Các khai báo biến số
Variable variable_name : type_name [:=value];
Ví dụ,
Variable CTRL_STATUS : BIT_VECTOR (10 DOWNTO 0);

GV: Nguyễn Trọng Hải Trang 12


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Ở đây biến CTRL_STATUS là một dãy có 11 phần tử, mỗi phần tử trong dãy có kiểu
là BIT
Ví dụ, Thực hiện mạch sau

(DATA and “01”)(0) Z


D Q
(DATA and “10”)(1)
CK Q

Clock

Entity MEMO_ONE is
Port ( DATA: in BIT_VECTOR (1 downto 0);
CLOCK :in BIT;
Z: out BIT);
Constant K1: BIT_VECTOR : = “01”;
Constant K2: BIT_VECTOR := “10” ;
End MEMO_ONE;

Architecture A of MEMMO_ONE is
Begin
Process (CLOCK)
Variable A1, A2: BIT_VECTOR(DATA’range);
Variable A3: BIT;
Begin
If CLOCK = ‘1’ and CLOCK’event then
A1 := DATA and K1;
A2 := DATA and K2;
A3 := A1(0) or A2(1);
Z <= A3;
End if;
End process;
End A;
Các biến số sử dụng trong ví dụ trên không tạo ra bất kỳ phần cứng nào. Thật ra quá
trình tương đương có thể được cho mà không có bất kỳ biến nào, ở đó tất cả các biến
được thay thế bởi các phương trình của chúng. Chúng ta có thể viết lại như sau.
Begin
If CLOCK = ‘1’ and CLOCK’event then
Z <= (DATA and K2)(1) or (DATA and K1)(0);
End if;
Khai báo tín hiệu:
Cú pháp:
Signal signal_name : type_name [:=value]

GV: Nguyễn Trọng Hải Trang 13


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Ví dụ,
Signal clock: bit;
--khai báo tín hiệu clock của kiểu bit lấy giá trị 1,0
Signal data_bus : bit_vector( 0 to 7);
-- khai bo tín hiệu data_bus thuộcc kiểu bit_vector có độ rộng 8 bit
3. Các giá trị khởi động.
Trong VHDL, có 3 loại giá trị ban đầu:
• Giá trị mặc định từ định nghĩa kiểu hay kiểu con
• Giá trị ban đầu khi đối tượng được khai báo
• Giá trị được gán khi sử dụng một phát biểu lúc bắt đầu quá trình.
Trường hợp thứ nhất và thứ hai sẽ bị bỏ qua bởi công cụ tổng hợp, nên có thể phát sinh
mâu thuẫn giữa hoạt động mô phỏng và kết quả tổng hợp. Do đó đề nghị phải khởi
động một cách rõ ràng và có hệ thống các biến và tín hiệu với các lệnh đặc biệt. Điều
này đạt được trong phần mã tổng hợp phục vụ cho việc xử lý thiết lập/thiết lập lại và sự
khởi động phải được trình bày trong phần này.
Nếu cổng out hoặc thông số out của chương trình con có giá trị mặc định, chúng hoạt
động giống như một giá trị khởi động cho tín hiệu hoặc biến và sẽ bị công cụ tổng hợp
bỏ qua.
4. Các toán tử số học.
Toán tử logic và toán tử bit là một phần của toán tử số học. VHDL định nghĩa bảy loại
toán tử. Chúng được chỉ ở bảng dưới đây với sự tăng dần mức ưu tiên.

Loại Toán tử Ưu tiên


Luận lý Or and nor nand xor xnor Thấp nhất
Quan hệ = /= > < >= <=
Dịch Sll Srl Sla SRA Rol Ror
Cộng + - &
Một ngôi + -
Nhân * / mod rem
Hỗn hợp ** abs not Cao nhất
Toán tử luận lý
Toán tử luận lý và toán tử not chấp nhận các toán hạng có các kiểu BIT, BOOLEAN,
và VECTOR với kích thước giống nhau. Một quy ước được chấp nhận rộng rãi cho giá
trị boolean: TRUE tương đương với giá trị BIT '1' và ngược lại.
Toán tử nand và nor không kết hợp với nhau trong 1 cú pháp liên tục, chúng phải được
ngăn cách bằng dấu () :
A and B nand C; -- trái luật
(A and B ) nand C;-- đúng luật;

GV: Nguyễn Trọng Hải Trang 14


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Ví dụ,
Signal S, X, Y: BIT_VECTOR (1 downto 0);
Signal R, A, B, C : BIT;
Signal T, D, E, F, G: BOOLEAN;
--
Begin
S <= X and Y;
R <= (A and B) and C;
T <= D xor E xor F xor G;
Sơ đồ kết quả của các hàm trên như sau:
X(1..0)
S(1..0)
D

Y(1..0) E
T
A
F
B
G
C

Toán tử quan hệ.


Toán tử quan hệ luôn trả về giá trị Boolean '0' hoặc '1' và là kết quả của sự so sánh hai
toán hạng cùng một kiểu cơ bản.
Trong mô phỏng, toán tử bằng và khác được định nghĩa rõ ràng cho các kiểu. Kết quả
là TRUE nếu hai toán hạng có cùng giá trị.
Các toán tử quan hệ được định nghĩa cho tất cả các kiểu vô hướng và dãy một chiều.
Thứ tự của kiểu vô hướng được định nghĩa bởi khai báo của nó, kiểu 'LEFT' thấp hơn
kiểu 'RIGHT'.
Đối với dãy một chiều, thứ bậc quan hệ của chúng được định nghĩa bởi bậc ngữ nghĩa.
Ví dụ,
“0” < ”1” -- is true
“A” < “BC” -- is true
“10” < “101” -- is also true
Toán tử quan hệ này không thể dùng để so sánh các vector bit mã hóa các giá trị liệt kê.
Toán tử này nếu thực hiện với khối số học thì kết quả của lệnh cuối cùng "10" < "101"
sẽ được thông dịch khác nhau đối với số không dấu hoặc số có dấu.
Các toán tử cộng.
Toán tử cộng và trừ được định nghĩa cho các toán hạng số nguyên. Tất cả các công cụ
tổng hợp đều cài đặt các toán tử này và thường sử dụng với một số ràng buộc.
Lưu ý, đôi khi dùng các dấu ngoặc đơn để nhóm một tập hợp các cổng lại. Nói cách
khác hai biểu thức khác nhau chạy như nhau nhưng tạo ra phần cứng khác nhau

GV: Nguyễn Trọng Hải Trang 15


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Ví dụ,
Architecture …
Signal A, B, C: BIT_VECTOR(2 downto 0);
Signal B, S, R: BIT_VECTOR (0 to 5);
Signal D: BIT;
Begin
A <= D &not D &D;
S <= S & B (0 to 2) ;
R <= C(1 downto 0) & “000” & D;
Các toán tử dịch chuyển.
Các toán tử dịch chuyển hỗ trợ cho BIT_VECTOR Các toán tử dịch chuyển và quay là
sll, srl, sla, sra, rol và ror.
Các toán tử nhân.
Phép chia "/", phép nhân "*", lấy modulo "mod", lấy số dư "rem" được xếp trong
nhóm nhân. Chỉ có toán tử nhân được hỗ trợ thêm ví dụ không hạn chế đối với tất cả
các kiểu số nguyên. Đối với vài công cụ tổng hợp, nhiều chiến lược nhân được đề nghị
để tạo ra phần cứng.
"/", mod, và rem được hỗ trợ có hạn chế đối với các giá trị của toán hạng vế phải, các
công cụ tổng hợp đòi hỏi các giá trị này là dương và là lũy thừa của 2. Hơn nữa chúng
thường là các hằng số toàn cục. Kết quả phần cứng của toán tử này dựa trên các toán tử
dịch bit.
Ví dụ, xây dựng một bộ đếm modulo 4.
Entity INCREMENTER is
Port (CLK : in BIT;
RST : in BIT;
R : out NATURAL range 0 to 3) ;
End INCREMENTER;
Architecture A of INCREMENTER is
Signal MEM: NATURAL range 0 to 3;
Begin
Process
If CLK = ‘0’ then
If RST = ’1’ then
MEM <= 0;
Else
MEM <= (MEM +1) MOD 4;
End if;
End if;
End process;
R <= MEM;
End A;
Các toán tử hỗn hợp.
Abs, giá trị tuyệt đối được hỗ trợ cho tất cả các giá trị số nguyên,
Toán tử số mũ "**", được hỗ trợ với hạn chế toán hạng trái là hằng số toàn cục, giá trị
của nó phải là 2.

GV: Nguyễn Trọng Hải Trang 16


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
5. Phép gán biến số.
Biến không dùng chung được khai báo trong quá trình hoặc trong phần khai báo
chương trình con.
Phép gán biến được thực hiện bởi toán tử :=, thao tác này xảy ra ngay lập tức khi tính
toán. Do đó, giá trị của biến chỉ thay đổi bởi lệnh gán tiếp theo nếu giá trị mới khác với
giá trị cũ.
Ví dụ, cách gán biến khác nhau:

A:= 0 ; -- giá trị integer 0 được gán cho biến A


REC.FIELD := B; --B được gán cho bản ghi FIELD của REC
VECTOR := X “AA”; -- phép gán vector toàn cục
WBUS(1) := F(A); -- phép gán phần tử của vector
WORD(3 to 4) := “10”; -- phép gán một nhóm phần tử vector
REC := (‘A’, 3, “10”); -- Phép gán giá trị theo vị trí của vetor
REC := (LETTER => ‘C’, FIELD => 3, BIT2 => “11”);
-- Phép gán với tên
Hơn nữa, ở phần bên trái của lệnh gán, nhiều biến số có thể gộp lại.
Ví dụ
Variable V: BIT_VECTOR(1 to 3);
Variable A, B, C: BIT;

--Hai trạng thái sau là tương đương
(A, B, C) := V;
(1 => A;2 => B; 3 => C):= V;
Lưu ý, biến khai báo trong chương trình con chỉ tồn tại trong chương trình con này và
biến mất ở ngoài chương trình con. Vì vậy, nếu biến số đã được gán, kết quả bị mất sau
khi chạy lệnh return ngoại trừ được trả về khi dùng thông số out bên trong thủ tục hoặc
lệnh return bên trong hàm. Tuy nhiên biến này có thể tạo ra một phần nhớ nếu thời
điểm đồng bộ xảy ra trước khi chương trình con kết thúc.
6. Phép gán tín hiệu.
Mục đích của gán tín hiệu giống như phép gán biến. Hiệu quả của phép gán tín hiệu chỉ
xảy ra sau lệnh đồng bộ (lệnh wait ).
Signal <= a_waveform_with_one_item_and_without_delay_expression
7. Lệnh đồng bộ.
Trong VHDL lệnh duy nhất để đồng bộ là lệnh wait. Một quá trình phải chứa ít nhất
một lệnh wait.
Có hai cách dùng lệnh wait khác nhau là:
• Đợi một sự kiện trên một tín hiệu tùy thuộc vào danh sách. Danh sách của wait
phải bao gồm tất cả tín hiệu được đọc trong quá trình:

GV: Nguyễn Trọng Hải Trang 17


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Ví dụ,
Process
Begin
Wait on A, B, C, D;
S <= A or B;
If E then
R <= C + D;
Else
R <= C+1;
End if;
End process;
• Đợi một sự kiện xảy ra trên tín hiệu đồng hồ (Clock). Tín hiệu này phải là duy nhất,
clock được xác định bởi các sự kiện và sườn xung.
Ví dụ,
Wait until CLK = ‘1’;
Nếu kiểu của tín hiệu đồng hồ không là BOOLEAN hoặc BIT, mà là kiểu đa giá trị, thì
để phù hợp với sự mô phỏng, điều kiện sau phải được thêm vào lệnh wait:
CLK'LAST_VALUE = '0'. Điều này xác định sườn lên hợp lệ cho tổng hợp. Điều kiện
cạnh xung đồng hồ trở thành:
Ví dụ,
Wait until CLK =’1’ and CLK’last_value = ‘0’;
Nếu lệnh wait là rõ ràng, lệnh đồng bộ được mô tả bởi một lệnh điều kiện if
Ví dụ,
If CLK = ‘0’ and CLK’event and CLK’last_value =’1’ then …
Hoặc sử dụng thuộc tính 'STABLE với giá trị thời gian mặc định 0ns,
('STABLE là một hàm chấp nhận kiểu thông số TIME có giá trị mặc định là zero).
Ví dụ,
If CLK = ‘0’ and not CLK’stable and CLK’last_value =’1’ then …
Lệnh điều kiện.
Có hai cách biểu diễn lệnh điều kiện : lệnh if và lệnh case
Lệnh if.
Lệnh if bao gồm cả rẽ nhánh elsif và else, chỉ mức ưu tiên thực hiện các rẽ nhánh
khác nhau.
Ví dụ, thiết kế các MUX sau

GV: Nguyễn Trọng Hải Trang 18


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL

Process (S1, S2, R3, R1, R2, R3, R4)


Begin
If S1 = ‘1’ then
RESULT <= R1;
Elsif S2 = ’0’ then
RESULT <= R2;
Elsif S3 = ’1’ then
RESULT <= R3;
Else
RESULT <= R4;
End if;
End process;
Lệnh case.
Trong lệnh case, mỗi nhánh có cùng cấp với nhau (lệnh if và lệnh elsif, mỗi nhánh
được kiểm tra một cách tuần tự).
Trong lệnh case, tất cả các giá trị có thể phải được đưa vào hết và chúng là duy nhất,
không có ưu tiên.
Để nhóm lại tất cả các gia trị "don't care", mệnh đề others có thể được sử dụng. Lưu
ý, others không bao giờ nên dùng nếu tất cả giá trị đã được liệt kê trước đó
Ví dụ, Thiết kế mạch sau

Type CODE_TYPE is (ADD, SUB, RST, INCX);


Subtype WORD is INTEGER range 0 to 3;
Signal CODE: CODE_TYPE;
Signal X, Y, R: WORD;
Process (CODE, X, Y)
Begin
Case X is
When 0 => R <= Y;
When 1 => R <= CODE_TYPE’pos (CODE);
When others => R <= 0;
End case;
End process;
Chú ý rằng nhánh others được dùng cho giá trị 2 và 3 của tín hiệu X.

GV: Nguyễn Trọng Hải Trang 19


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Tạo ra bộ nhớ.
Đôi khi một vài giá trị điều kiện không đúng, vì thế các giá trị có kết quả từ các điều
kiện này ở trạng thái không đổi. Trong trường hợp này, phải có phần tử nhớ .
Ví dụ,
If CONDITION (l1, l2,l3) then RESULT <= DATA (l1, l2, l3);
End if;
Bởi vì chức năng CONDITION không luôn luôn trả về hằng số TRUE, nên đôi khi
RESULT sẽ không thay đổi và sẽ giữ nguyên giá trị.
Với các dòng lệnh trên thì loại phần tử nhớ được tạo ra sẽ phụ thuộc vào biểu diễn
đồng bộ. Phần tử nhớ cũng được ám chỉ nếu tín hiệu đầu ra không xuất hiện trong bất
kỳ rẽ nhánh có thể nào của chương trình.
RESULT là tín hiệu được đọc (phía bên phải của phép gán tín hiệu) và được viết (phía
bên trái của phép gán tín hiệu). Vì vậy, phần tử nhớ là cần thiết. Nếu tín hiệu này phụ
thuộc vào danh sách, thì chỉ có mạch cài đặt được tạo ra. Ngược lại, nếu chỉ phụ thuộc
vào các giá trị đầu vào (l1, l2, l3) thì một phần tử nhớ mạch lật được tạo ra.
Ví dụ,
Process (I1, l2, l3) – inferring a flip-flop
Begin

If CONDITION (l1, l2, l3)


Then RESULT <= DATA(l1, l2 , l3, RESULT);
End if;
End;
Process (l1, l2, l3, RESULT) – inferring a latch
Begin
If CONDITION (l1, l2, l3)
Then RESULT <= DATA (l1, l2, l3. RESULT);
End if;
End;
Để đảm bảo không tạo ra phần tử nhớ, một phép gán tín hiệu đầu ra mặc định phải
được viết trước lệnh điều kiện như sau:

RESULT <= DEFAULT_VALUE; -- default assignment
If CONDITION (l1, l2, l3) then RESULT <= DATA (l1, l2, l3, RESULT);
End if;

Phép gán tín hiệu đầu tiên này không được nhầm lẫn với giá trị ban đầu đã được giải
thích.
Ví dụ, một rẽ nhánh else được tạo ra rõ ràng :
If CONDITION (l1, l2, l3)
then RESULT <= DATA (l1, l2, l3, RESULT);
else RESULT <= DEFAULT_VALUE;
End if;

GV: Nguyễn Trọng Hải Trang 20


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Lệnh lặp lại.
Trong VHDL có hai loại lệnh lặp lại, vòng lặp for và vòng lặp while. Vòng lặp vô hạn
loop … end loop có thể được xem xét như một vòng lặp while với điều kiện luôn
luôn là TRUE.
Lệnh lặp vòng for được trợ giúp bởi các công cụ tổng hợp khi các giá trị biên là tĩnh
(static) toàn cục.
8. Lệnh quá trình và lệnh đồng bộ.
Các lệnh quá trình cho kiểu hành vi mạnh nhất và là cơ sở của mọi lệnh đồng thời.
Một lệnh quá trình bao gồm 3 phần: danh sách tùy chọn, khai báo cục bộ và phần lệnh
tuần tự.
Danh sách độ nhạy.
Một quá trình với một danh sách rõ ràng tương đương với một quá trình với một lệnh
đồng bộ đơn, quá trình được hoạt động mỗi khi một biến cố xảy ra trên một tín hiệu
của danh sách này. Các quá trình như sau:
Process (A, B, C) – danh sách các biến được xem xét

begin

end process;
Quá trình trên cũng có thể tương đương với:
Process

begin

wait on A, B, C;
end process;
Khai báo cục bộ.
Trong tất cả các khai báo có thể có bên trong phần khai báo quá trình, khai báo biến là
cần thiết, có thể bao hàm phần tử nhớ. Thật ra, biến có thể sử dụng trong hai cách khác
nhau:
• Giống như các biến cục bộ, không tạo ra phần cứng nào:
Process (A, B, C) – no memorization for this … and gate
Variable VAR : BIT;
Begin
VAR : = B and C;
S <= A and VAR; -- before being read
End process;
Có thể viết hành vi tương tự bằng cách thay thế biến với phần bên phải của lệnh gán:
Process (A, B, C)
Begin
S <= A and B and C;
End process;

GV: Nguyễn Trọng Hải Trang 21


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Ưng dụng của biến được chấp nhận bởi các công cụ tổng hợp và không có phần cứng
tương ứng. Trong trường hợp tổng quát thì giữa 2 lệnh đồng bộ, nếu một biến luôn
được gán trước khi được đọc, thì biến này không tạo ra bất kỳ phần cứng nào.
• Khi thiết kế dữ liệu dưới dạng máy trạng thái.
Process – synchronous finite state machine with two states
Type T_STATE is (STOP, GO);
Variable STATE: T_STATE;
Begin
Wait until CLK=’1’;
Case STATE is --variable STATE is read
-- before being target of assignment
when STOP => STATE:= GO;
when GO => STATE:= STOP;
end case;
End process;
Ví dụ này chỉ ra rằng việc đọc biến không có nghĩa là có nó trong phần bên phải của
phép gán. Biểu thức case, điều kiện if hoặc thông số in của thủ tục hoặc hàm là cách
khác để đọc nó. Vì thế, giữa hai lênh đồng bộ, nếu một biến được đọc ít nhất một lần
trước khi được gán thì biến này tạo ra phần tử nhớ.
9. Phép gán tín hiệu.
Phép gán tín hiệu đơn giản.
Dạng đơn giản nhất của một phép gán tín hiệu đồng thời là định nghĩa tín hiệu đích
nhận được các giá trị của tín hiệu nguồn mỗi lần một sự kiện xảy ra:
S <= A; -- S được gán tới A bởi phần cứng
Z <= ‘1’; -- Tín hiệu Z là một hằng số
Các phép gán tín hiệu chọn lựa và có điều kiện.
Hai phép gán tín hiệu đồng thời được định nghĩa cho mục đích có điều kiện của tín
hiệu; phép gán chọn lựa và có điều kiện.
Ví dụ,
S <= a when x = ‘1’ else B when Y = ‘1’ else C
Ví dụ, nếu A, B, C, X, Y được định nghĩa như là các tín hiệu, quá trình tương là:
Process (A, B, C, X, Y)
Begin
If X = ‘1’ then
S <= A;
Elsif Y = ‘1’ then
S <= B;
Else
S <= C;
End if;
End process;
Hai ví dụ trên chứng minh các phép gán tín hiệu, với công cụ này cho phép người thiết
kế có thể mô tả các thiết kế của mình rõ ràng hơn.

GV: Nguyễn Trọng Hải Trang 22


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
10. Component.
Mục đích của lệnh hợp phần là sử dụng một mẫu đã mô tả trước. Đây là cách chính để
xây dựng sự phân thứ bậc thiết kế. Trước khi sao chép, hợp phần phải được khai báo
cục bộ trong phần khai báo kiến trúc, hoặc riêng biệt trong một khối.
Sự khai báo hợp phần (component) định nghĩa cách nối dây cục bộ, có thể ít tổng quát
hơn so sự khai báo thực thể. Trong suốt giai đoạn cấu hình, môt số tín hiệu có thể ở vế
trái nếu chúng ở chế độ out hoặc inout, hoặc bị bỏ qua nếu chúng ở chế độ in với giá trị
mặc định.
Khi sao một hợp phần, các thông số tương thích chung phải được ánh xạ đến các giá trị
và các cổng nối với tín hiệu.
Ví dụ,
Architecture SYNTHESIZABLE of DRIVE is
Signal ORDER: ORDER_TYPE;
Signal CONTROL: BIT;
Signal DATA_IN, DATA_OUT: BIT_VECTOR(1 to N);
Component CTRL
Port (C : in BIT;
O: out BIT_VECTOR);
End component;
Component OPRT
Port (O: in BIT_VECTOR;
D1: in BIT_VECTOR;
D0: out BIT_VECTOR);
End component;
-- specification configuration
for CONTROLER : CTRL use entity WORD.CTRL(A);
for OPERATING_PART:OPRT use entity WORD OPRT(A) generic map (N);
begin
-- two component instantiation statements.
CONTROLER: CTRL port map(CONTROL, ORDER);
OPERATIVE_PART: OPRT port map (ORDER, DATA_IN,
DATA_OUT);
End SYNTHESIZABLE;
Cấu hình chỉ ra cặp thực thể/ kiến trúc được chọn cho bản sao hợp phần. Với ví dụ sau ,
hai lệnh cấu hình đặc biệt có thể được thay thế bởi một cấu hình độc lập.
Configuration C1 of DRIVER is
For SYNTHESIZABLE
For CONTROLER: CTRL use entity WORD.CTRL(A);
End for;
For OPERATIVE_PART: OPRT use entity WORK.OPRT(A);
Generic map (N);
End for;
End for;
End C1;

GV: Nguyễn Trọng Hải Trang 23


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
11. BLOCK.
Các lệnh block được sử dụng cho cấu trúc lệnh đồng thời
Ví dụ,
Signal A, B, C, D, E, F, G: BIT;
Signal S; BIT_VECTOR(1 to 4);
BLOCK_NAME : block
Subtype TWO_BIT_TYPE is BIT_VECTOR(1 to 2);
Signal V1, V2: TWO_BIT_TYPE;
Begin
V1 <= (A or C) &B; V2 <= E &(F and G);
S <= V1 &V2;
End block BLOCK_NAME;
Dưới một số điều kiện, một vài công cụ tổng hợp có thể dịch lệnh block như một cấp
của tổng hợp. Trong trường hợp này nhãn của lệnh khối được dùng như một thông số
cho cấu trúc lệnh.
Ứng dụng khác của lệnh block là định nghĩa phần lệnh đồng thời được điều khiển bởi
clock. Trong trường hợp này phần bảo vệ (guarded) được yêu cầu để mô tả chính xác
tín hiệu clock và điều kiện liên quan tới nó (cạnh lên hoặc xuống).
Hơn nữa, phép gán tín hiệu đồng thời được bảo vệ và hoạt động bởi biểu thức bảo vệ.
Điều này được chỉ ra trong ví dụ sau, ở đó giả thiết rằng tín hiệu clock là đa giá trị.
Ví dụ,
B: block (not CLK’state and CLK = ‘0’ and CLK’last_value =’1’)
Signal R: BIT;
Begin
R <= guarded DATA(1);
S <= guarded R ; -- Tín hiệu S là DATA(1) được lám trễ 1 chu kỳ
End block
Ứng dụng thứ 3 của lệnh block được dùng trong mạch 3 trạng thái.
Liên kết với lệnh không nối (disconnect) và tín hiệu resolved, phép gán bảo vệ có thể
định nghĩa hành vi ba trạng thái. Khi điều kiện bảo vệ không thoả, tín hiệu đích không
được nối. Đây là hành vi mặc định của mệnh đề disconnect và được cho phép nếu kiểu
tín hiệu đích được resolved.
Đối với tổng hợp, vấn đề được giải quyết là giá trị cuối cùng khi tất cả tín hiệu nguồn
không được nối. Giá trị này phụ thuộc vào hai yếu tố: kết quả của hàm resolved trả về
(khi độ dài của vector đầu vào là null) và loại tín hiệu resolved (bus hoặc register).
Tóm tắt hành vi của loại tín hiệu này như sau:
• Kết quả cuối cùng là giá trị được trả về bởi hàm resolved với vector đầu vào null
nếu kiểu tín hiệu đích là bus.
• Kết quả cuối cùng là giá trị trước nếu chỉ có một tín hiệu nguồn và kiểu của tín hiệu
nguồn là register.

GV: Nguyễn Trọng Hải Trang 24


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Sơ đồ bộ đệm ba trạng thái được tạo ra bởi lệnh block:

Một số công cụ tổng hợp hỗ trợ tín hiệu không nối loại bus, thì kết quả của hàm
resolved trả về 'Z' để mã hóa mức 3 trạng thái.
12. Gọi thủ tục đồng thời.
Thủ tục đồng thời là thủ tục được gọi từ trong một block hoặc một architechture.
P (A, B, C); -- concurent procedure call;
Tương đương với:
Process -- process equivalent to the previous concurent procedure call
Begin -- C is assumed to be an actual parameter of module out.
P(A, B, C);
Wait on A, B;
End process;
Cho phép dùng lệnh wait trong các thủ tục đồng thời. Trong tổng hợp, điều này không
được hỗ trợ. Thật ra, lệnh wait có nhiều tín hiệu chỉ được cho phép nếu các điều kiện
đồng bộ là như nhau.
Thường sử dụng gọi thủ tục đồng thời khi muốn có sự linh động và khả năng thích
nghi. Thủ tục đồng thời dễ dàng sử dụng hơn là bản sao hợp phần (component), vì
không đòi hỏi sự khai báo và chỉ rõ.
13. Lệnh GENERATE.
Hai lệnh generate được định nghĩa là: lệnh generate có điều kiện và lệnh generete lặp.
Từ quan điểm tổng hợp, lệnh này không được hỗ trợ đầy đủ. Trong giai đoạn chế tạo,
một tập các lệnh đồng thời tương đương được phát sinh.
Lệnh generate lặp.
Lệnh này có thể lặp lại một tập các lệnh đồng thời (ví dụ, lặp lại nhiều lần hợp phần
hoặc gán các tín hiệu vector). Trong ví dụ sau, các hằng số k1, k2 có thể là các thông
số tương thích chung và phần cứng tương ứng sẽ không thay đổi.
Ví dụ,
Architecture A of E is
Constant k1: NATURAL := 0;
Constant k2: NATURAL := 3;
Signal A, S: BIT_VECTOR(k1 to k2 );

GV: Nguyễn Trọng Hải Trang 25


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Signal R: BIT_VECTOR (k1 +1 to k2 +1);
Begin
L: for J in k1 to k2 generate
S(J) <= not A(J);
R(J+1) <= A(j);
End generate;
End;
Trong ví dụ sau, kiến trúc A và B là tương đương, kết quả tổng hợp cuối cùng giống
nhau. Trong kiến trúc đầu tiên A, kết quả là vector V được gán trong lệnh tuần tự loop
và trong kiến trúc thứ hai B, các phép gán tín hiệu đồng thời N được phát ra.
Architecture A of E is
Constant N: NATURAL := 3;
Signal B: BIT_VECTOR(0 to N );
Signal R: BIT_VECTOR (1 to N);
Begin
Process (A, B)
Begin
For l in 1 to N loop
V(l) <= F(l, A(l), B (N-1 + 1));
End loop;
End process;
End A;
Architecture B of E is
Constant N: NATURAL := 3;
Signal B: BIT_VECTOR(0 to N );
Signal A,V: BIT_VECTOR (1 to N);
Begin
L: for l in 1 to N generate
V(l) <= F(l, A(l), B (N-1 + 1));
End generate;
End B;

Lệnh generate có điều kiện.


Để hoàn tất một mẫu sử dụng các lệnh generate lặp, có thể có ích khi kiểm tra các giá
trị đầu tiên cuối cùng của chỉ số vòng lặp. Các lệnh generate điều kiện có thể được
dùng để giải quyết vấn đề này. Ví dụ sau đây minh hoạ tính chất này, ở đó sự xử lý các
bản sao hợp phần có thể khác nhau (không có, có một, hoặc nhiều bản sao).
Entity E is
Generic (N: NATURAL);
Port (INPUT: in BIT;
OUTPUT: out BIT; …);
End E;

Architecture A of E is
Signal LOCAL: BIT_VECTOR (1 to N -1);
Component M1
Port (l: in BIT; O: out BIT);
End component;
Begin

GV: Nguyễn Trọng Hải Trang 26


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
L1: if N = 0 generate
OUTPUT <= INPUT; -- no component instantiation
End generate ;
L2: if N = 1 generate
C1: M1 port map (INPUT, OUTPUT); -- only one instantiation
End generate;
L3: if N >= 2 generate -- other cases using the intermediate -
--LOCAL signal
F: M1 port map (INPUT, LOCAL(1));
L4: for: in l to N-2 generate
C :M1 port map (LOCAL(l), LOCAL(l+1));
End generate;
End A;
Sử dụng tương thích chung (Generic).
Thông số tương thích chung là tổng quát của khái niêm hằng số, để nói rằng trong suốt
giai đoạn chế tạo các giá trị của chúng phải được xác định. Vì vậy trước bước này, đối
với giai đoạn dịch, giá trị của chúng chỉ xác định kiểu mà không biết giá trị. Một vài
công cụ tổng hợp hỗ trợ hạn chế một số kiểu thông số tương thích chung (chỉ hỗ trợ
kiểu nguyên hoặc kiểu liệt kê). Tuy nhiên, không có lý do thực sự cho các hạn chế như
vậy, ngoại trừ để không hỗ trợ cho cấu hình.
Ví dụ, viết một mẫu chấp nhận một vector với kích thước N, như là đầu vào. N là
thông số tương thích chung của mẫu này.
Entity AND_N is
Generic (N: POSITIVE);
Port (Din : in BIT_VECTOR (1 to N);
R: out BIT);
End AND_N;
Architecture A1 of AND_N is
Signal INTER : BIT_VECTOR (1 to N);
BEGIN
INTER (1) <= Din (1);
L: for l in 1 to N-1 generate
INTER (l+1) <= (Din(l+1) and INTER (l));
End generate;
R <= INTER(N);
End A1;
Architecture A2 of AND_N is
BEGIN
Process (Din)
Variable RES: BIT;
Begin
RES := Din(1);
for l in 2 to N loop
RES:= RES and Din(l);
End loop;
R <= RES;
End process;
End A2;

GV: Nguyễn Trọng Hải Trang 27


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Ví dụ, nhận dạng mẫu đã cho trong chuỗi bit tuần tự. Các thông số tương thích chung
là vector phải tìm, và một số bit dùng để báo số lỗi (0: mẫu phải tìm chính xác như đã
mô tả, 1: chỉ sai khác 1 bit mới chấp nhận,…)
Entity SEARCH_PATTERN is
Generic(PATTERN: BIT_VECTOR;
ERROR_NUMBER: NATURAL);
Port ( CLK: in BIT;
DATA: in BIT;
RESET: in BIT;
FOUND: out BIT);
Begin
Assert (PATTERN ‘length >= ERROR_NUMBER)
Report “pattern length cannot be shorter than ”& “the authorized error
number”
Severity ERROR;
End SEARCH_PATTERN;

Architecture A of SEARCH_PATTERN is
Subtype REG_TYPE is BIT_VECTOR (PATTERN’ range);
Signal REG: REG_TYPE;
Begin
P_REG: process (DATA, CLK, RESET)
Begin
If RESET = ‘1’ then
REG <= REG_TYPE (others => ‘0’);
Elsif CLK =’1’ and CLK’event then
REG <= REG(REG’left-1 downto REG’right) & DATA;
End if;
End process;
P_FOUND: process (REG)
Variable CPT: NATURAL range 0 to ERROR_NUMBER +1;
Begin
CPT := 0;
FOUND <= ‘0’;
For l in REG’range loop
If PATTERN(l) /= REG(l) then
CPT := CPT + 1;
If CPT >= ERROR_NUMBER then
FOUND <= ‘1’;
Exit;
End if;
End if;
End loop;
End process;
End A;
Trong các ví dụ trên cần chú ý những điểm sau:
• Sử dụng các lệnh assert trong entity không tạo ra phần cứng. Lệnh này kiểm tra
tính nhất quán giữa các giá trị thông số khó mô tả bởi các biểu thức tĩnh (như là các
khoảng trong các kiểu hoặc biểu thức kiểu con).

GV: Nguyễn Trọng Hải Trang 28


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
• Kiến trúc bao gồm hai quá trình: Quá trình đầu tiên suy ra phần cứng tuần tự với
một tín hiệu reset bất đồng bộ, trong khi đó quá trình thứ hai biểu diễn mạch tổ hợp
thuần tuý.
• Khai báo REG_TYPE đã được đưa ra để hạn chế tập hợp còn lại (others => '0')
trong nhánh RESET bất đồng bộ.
• Các thực thể tương thích chung cần được ánh xạ đến các giá trị thông số để tạo ra
phần cứng thực sự. Điều này có thể được làm trong bản sao hợp phần hoặc trong
cấu hình, ở đó các thông số tương thích chung được ánh xạ đến các giá trị của
chúng.
14. Phép so sánh.
Có hai loại so sánh sau:
• Kiểm tra 2 đối tượng giống nhau. Bao gồm các hàm (cũng được gọi các toán tử)
bằng ('=') và không bằng ('/='). Tất các kiểu tổng hợp được có thể được so sánh khi
sử dụng các toán tử này.
• Kiểm tra thứ bậc của hai đối tượng khi sử dụng các toán tử quan hệ, các toán tử này
có thể được thực hiện trên kiểu bất kỳ với một lệnh quan hệ như là các kiểu số
nguyên, các kiểu liệt kê và kiểu biểu diễn mã ASCII là quá tải đối với các toán tử
so sánh.
15. Các toán tử số học.
Sau các toán tử Boolean và các phép so sánh, một họ quan trọng khác là toán tử số
học. Bốn phép toán cơ bản đó là: phép cộng, trừ, nhân và chia.
Kiểu dữ liệu thuận tiện nhất để thực hiện các phép toán như vậy là kiểu INTEGER và
các kiểu con quan hệ với nó: NATURAL và POSITIVE. Các toán tử VHDL '+', '-', '*',
và '/ 'được định nghĩa trước và vì vậy có thể được sử dụng mà không cần khai báo.
Điều này cần thiết cho người thiết kế để hạn chế kích thước các đối tượng của kiểu
INTEGER đến giá trị tối tưu. Nếu người thiết kế không làm công việc này, công cụ
tổng hợp sẽ xác định kích thước đã định nghĩa của kiểu INTEGER trong khối
(STD.STANDARD).
Ví dụ,
Signal l1, l2, SUM_l: INTEGER range –16 to 15;
Signal N1, N2, SUM_N: INTEGER range 0 to 47;
SUM_l <= l1 + l2;
SUM_N <= N1 + N2;
Trong ví dụ ngắn này có một vài chú thích về quy ước mã hoá các số. Tất cả quá trình
tổng hợp nhằm vào việc dịch mã nguồn HDL thành biểu diễn nhị phân. Ơ đây, các số
có dấu l1, l2 và SUM_l được mã hoá ở dạng bù hai với việc sử dụng 4 +1 bit. Mặt
khác, các số không dấu N1, N2 và SUM_N được mã hóa với 6 bit (47<2**6-1). Tuy
nhiên, không cần thiết cho khoảng của đối tượng của kiểu INTEGER là luỹ thừa của
hai.
Toán tử nhân và chia phải được xác định trước, cả hai toán hạng phải là cùng kiểu số
nguyên hoặc là kiểu floating point. Kết quả cũng phải cùng kiểu, toán tử nhân cũng
được xác định bởi trường hợp khi một trong những toán hạng là kiểu vật lý và toán
hạng thứ hai là kiểu integer hoặc real. Kết quả trả về là kiểu vật lý.

GV: Nguyễn Trọng Hải Trang 29


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
Đối với toán tử chia, chia một giá trị vật lý bởi một giá trị integer hoặc real thì được
cho phép, và kết quả trả về là kiểu vật lý. Phép chia của một giá trị kiểu vật lý bởi một
đối tượng khác cùng kiểu vật lý và phần còn lại của nó, một giá trị nguyên coi như một
kết quả.
Toán tử REM và MOD tác dụng cho toán hạng kiểu integer và kết quả có cùng một
kiểu. Kết quả của REM có biểu hiện của toán hạng thứ nhất và nó được xác định như
sau:
A rem B = A - (A / B) *B
Kết quả của toán tử MOD là biểu hiện toán hạng thứ hai, và nó được xác định như sau:
A mod B = A - B * N
Sau đây là những ví dụ sử dụng toán tử mod và rem:
7 mod 4 -- kết quả = 3;
(-7) rem 4 -- kết quả = -3;
7 mod (-4) -- kết quả = -1;
(-7) mod (-4) -- kết quả = 3;

16. Các phép dịch và quay.


Các phép tính này thường được thực hiện trên các đối tượng có biểu diễn bit_vector.
Hai loại phép tính dịch và quay có thể được phân biệt : luận lý và số học.
Phép dịch số học có thể được sử dụng cho phép nhân (dịch sang trái) hoặc chia (dịch
sang phải) nếu toán hạng vế phải của một phép toán là một luỹ thừa của 2. Mỗi một
toán tử giữ một dãy BIT hoặc BOOLEAN như một toán hạng trái và giá trị INTEGER
như toán hạng phải, đóng vai trò giải thích toán tử. Nếu giá trị INTEGER là âm, hành
vi ngược nhau sẽ xảy ra.
Toán tử SLL (xoay trái luận lý) và toán tử SRL (xoay phải luận lý) điền vào những bit
huỷ bỏ với left-operand-type'LEFT.
Toán tử SLA (xoay trái số học) điền vào những bit bị huỷ bỏ với bit cực phải của toán
hạng trái.
Toán tử SRA (xoay phải số học ), điền vào những phần tử bị huỷ bỏ với bit cực trái của
toán hạng trái.
Ví dụ,
-- giả sử tất cả những toán hạng trái đều là BIT_VECTOR
"1001010" sll2 is "0101000"; -filled with BIT'LEFT, which is '0'
"1001010" srl3 is "0001001";

GV: Nguyễn Trọng Hải Trang 30


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
III. MỘT SỐ VÍ DỤ THIẾT KẾ CÁC MẠCH TỔ HỢP VÀ TUẦN TỰ.
Đoạn mã chương trình tạo mạch dồn kênh 2 sang 1.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS
PORT (w0, w1, s :IN STD_LOGIC;
F: :OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE behavior OF mux2to1 IS
BEGIN
WITH s SELECT
F <= w0 WHEN ‘0’,
w1 WHEN OTHERS;
END behavior;

Mạch so sánh 4 bit.


Mạch so sánh 4 bit bao gồm 8 bit ngõ vào, chia thành 2 nhóm, mỗi nhóm 4 bit và được
đặt tên là A và B. Kết quả của phép so sánh có 3 trường hợp: A bằng B, A lớn hơn B và
A nhỏ hơn B. Trong mạch so sánh này kết quả của phép so sánh ở ngõ vào sẽ được
biểu thị bằng 3 bit ngõ ra cho 3 trường hợp so sánh giữa A và B, AeqB(A equal B),
AgtB(A greater B), AltB (A lighter B). Mã chương trình của mạch so sánh 4 bit có
dạng như sau:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsgned.all;
ENTITY compare IS
PORT (A, B : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
AeqB, AgtB, AltB :OUT STD_LOGIC);
END compare;

ARCHITECTURE behavior OF compare IS


BEGIN
AeqB <= ‘1’ WHEN A = B ELSE ‘0’;
AgtB <= ‘1’ WHEN A > B ELSE ‘0’;
AltB <= ‘1’ WHEN A = B ELSE ‘0’;
END behavior;

Mạch mã hóa ưu tiên.


LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY priority IS
PORT (w :IN STD_LOGIC_VECTOR(3 DOWNTO 0);
y :OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
z :IN STD_LOGIC;
END priority;
ARCHITECTURE behavior OF priority IS

GV: Nguyễn Trọng Hải Trang 31


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
BEGIN
PROCESS (w)
IF w(3) = ‘1’ THEN y <= “11”;
ELSIF w(2) = ‘1’ THEN y <= “10”;
ELSIF w(1) = ‘1’ THEN y <= “01”;
ELSE y <= “00”;
END IF;
END PROCESS;
Z <=0 WHEN w = “0000” ELSE ‘1’;
w1 WHEN OTHERS;
END behavior;
Từ đoạn mã trên ta có mạch bao gồm 4 ngõ vào, 3 ngõ ra, tùy thuộc vào các giá trị ngõ
vào mà các ngõ ra sẽ có giá trị tương ứng, ở mạch mã hóa ưu tiên này, w(3) có mức ưu
tiên cao nhất và w(0) có mức ưu tiên thấp nhất, giá trị ngõ ra z chỉ bằng 0 khi tất cả các
ngõ vào bằng 0, ngược lại nó luôn bằng 1. Đoạn mạch ở trên sử dụng mệnh đề if-then-
else, tuy nhiên người thiết kế có thể linh hoạt các thiết kế bằng những mệnh đề khác,
nhưng phải đảm bảo hoạt động của mạch là đúng nguyên tắc.
Mạch giải mã từ 2 đường sang 4.
Mạch giải mã từ 2 đường sang 4 đường, bao gồm 3 ngõ vào, đó là: w1, w2, En. Hai
ngõ vào w1, w2 là hai ngõ vào sẽ quyết định giá trị các ngõ ra, ngõ vào En là ngõ vào
cho phép(có thể là mức '0' hoặc mức '1' tùy theo người thiết kế), khi ngõ vào En tích
cực thì các ngõ ra mới có được giá trị tương ứng với các ngõ vào. Trong đoạn mã
VHDL cho mạch giải mã này, các ngõ ra có ký hiệu từ y3 đến y0. Đoạn mã của
chương trình có dạng như sau, trong đoạn mã này, phát biểu case được sử dụng.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY dec2to4 IS
PORT (w : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
En : IN STD_LOGIC;
y :OUT STD_LOGIC_VECTOR(0 TO 3);
END dec2to4;
ARCHITECTURE behavior OF dec2to4 IS
BEGIN
PROCESS (w, En)
BEGIN
IF En = ‘1’ THEN
CASE w IS
WHEN “00” => y <= “1000”;
WHEN “01” => y <= “0100”;
WHEN “10” => y <= “0010”;
WHEN OTHERS => y <= “0001”;
END CASE;
ELSE
y <= “0000”;
END IF;
END PROCESS;
END Behavior;

GV: Nguyễn Trọng Hải Trang 32


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL

Mạch chốt dữ liệu.


Mạch chốt dữ liệu có nhiệm vụ chốt lại dữ liệu ngõ vào và đưa dữ liệu đó tới ngõ ra, dữ
liệu tại ngõ ra sẽ thay đổi tương ứng với dữ liệu ngõ vào khi có một xung tác động.
Ngõ ra sẽ duy trì dữ liệu mà nó nhận được ở ngõ vào trong suốt quá trình chờ xung tác
động, khi không có xung tác động, nếu ngõ vào có thay đổi thì giá trị ngõ ra vẫn không
thay đổi giá trị mà nó nhận được ở lần nhận cuối cùng. Đoạn mã VHDL cho mạch
chốt được viết như sau:
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
ENTITY flipflop IS
Port ( D, clock : IN std_logic;
Q : OUT std_logic);
END flipflop;
ARCHITECTURE bahavior OF flipflop IS
BEGIN
PROCESS
BEGIN
WAIT UNTIL Clock’EVENT AND Clock = ‘1’;
Q <= D;
END PROCESS;
END bahavior;
Với đoạn mã VHDL trên, ngõ vào dữ liệu có tên là D, xung tác động cạnh , ngõ ra là
Q, khi có một xung cạnh lên, ngõ ra Q sẽ nhận giá trị từ ngõ vào D và duy trì giá trị đó
trong suốt quá trình chờ một xung kế tiếp. Đoạn mã trên được viết với một bit ngõ vào,
một bit ngõ ra, người thiết kế hoàn toàn có thể thay đổi số bit ngõ vào và số bit ngõ ra
cho phù hợp với thiết kế của mình. Đoạn mã trên được viết đầy đủ cho một mạch chốt,
với các công cụ tổng hợp và biên dịch, người thiết kế có thể ứng dụng nó vào trong
mạch thực tiễn sau khi đã nạp vào IC.

Mạch tạo thanh ghi 8 bit.


Thanh ghi trong mạch số đóng vai trò rất quan trọng, các thiết kế số hiện đại hầu như
đều phải sử dụng thanh ghi, VHDL cho phép người thiết kế có thể tạo ra thanh ghi với
số bit mong muốn. Ngoài ra còn có thể linh hoạt chúng trong các thiết kế của mình,
thanh ghi thực tế chính là một mạch chốt dữ liệu. Đoạn mã sau đây viết cho thanh ghi
16 bit, trong thiết kế có sử dụng thông số tương thích chung generic.
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
ENTITY regn IS
GENERIC ( N : INTEGER := 16);
Port ( D, clock : IN std_logic_vector (N-1 DOWNTO 0);
Reset, clock : IN std_logic;
Q : OUT std_logic_vector (N-1 DOWNTO 0);
END regn;
ARCHITECTURE behavior OF regn IS
BEGIN

GV: Nguyễn Trọng Hải Trang 33


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
PROCESS (Reset, clock)
BEGIN
IF Reset = ‘0’ THEN
Q <= (OTHERS => ‘0’);
ELSIF Clock’EVENT AND Clock = ‘1’ THEN
Q <= D;
END IF;
END PROCESS;
END behavior;

Mạch đếm lên.


Mạch đếm lên hoạt động theo nguyên tắc: khi có một xung tác động ở ngõ vào, ngõ ra
sẽ thay đổi một bit theo chiều hướng đếm lên, mạch đếm lên ngoài ngõ vào xung clock,
người thiết kế còn có thể tạo thêm các ngõ vào khác như Reset, Enable… để tạo thêm
tính linh hoạt của mạch. Mã VHDL cho mạch đếm lên được viết như sau:
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY upcount IS
Port ( Reset, Clock, En : IN std_logic;
Q : OUT std_logic_vector (3 DOWNTO 0);
END upcount;
ARCHITECTURE behavior OF upcount IS
SIGNAL Count : STD_LOGIC_VECTOR (3 DOWNTO 0);
BEGIN
PROCESS (Clock, Reset)
BEGIN
IF Reset = ‘0’ THEN
Count <= “0000”;
ELSIF Clock’EVENT AND Clock = ‘1’ THEN
IF En = ‘1’ THEN
Count <= Count+ 1;
ELSE
Count <= Count;
END IF;
END IF;
END PROCESS;
Q <= Count;
END behavior;

Mạch đệm 3 trạng thái.


Mạch đệm 3 trạng thái giúp mạch thực tế khi hoạt động có thể điều chỉnh ngõ ra ở trạng
thái thích hợp cho sự vận hành của mạch, với 3 trạng thái, người thiết kế các mạch số sẽ
điều chỉnh mạch sao cho hoạt động tốt hơn và tiết kiệm năng lượng hơn. Mã VHDL cho
mạch đệm 3 trạng thái được viết như sau:

GV: Nguyễn Trọng Hải Trang 34


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
ENTITY trin IS
GENERIC ( N : INTEGER := 8);
Port( X : IN std_logic_vector (N-1 DOWNTO 0);
E : IN std_logic;
F : OUT std_logic_vector (N-1 DOWNTO 0);
END trin;
ARCHITECTURE behavior OF trin IS
BEGIN
F <= (OTHERS => ‘Z’) WHEN E =’0’ ELSE X;
END behavior;

Xây dựng máy trạng thái trong VHDL

library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity divby5 is
port(x, clk : in std_logic;
y : out std_logic);
end divby5;
architecture state_machine of divby5 is
type StateType is (state0, state1, state2, state3, state4);
signal p_s, n_s : StateType;
begin
fsm: process (p_s, x)
begin
case p_s is
when state0 => y <= '0';
if x = '1' then
n_s <= state1;
else
n_s <= state0;
end if;
when state1 => y <= '0'
if x = '1' then
n_s <= state3;
else
n_s <= state2

GV: Nguyễn Trọng Hải Trang 35


Bài giảng Thiết Kế Hệ Thống Số Phần VHDL
end if;
when state2 =>
if x = '1' then
n_s <= state0;
y <= '1';
else
n_s <= state4;
y <= '0';
end if;
when state3 => y <= '1';
if x = '1' then
n_s <= state2;
else
n_s <= state1;
end if;
when state4 => y <= '1';
if x = '1' then
n_s <= state4;
else
n_s <= state3;
end if;

when others => n_s <= state0;

end case
end process fsm;
state-clocked : process (clk)
begin
if rising_edge(clk) then
p_s <= n_s;
end if;
end process state_clocked;
end architecture state_machine;

GV: Nguyễn Trọng Hải Trang 36