Bài giảng "Thiết kế hệ thống số" giới thiệu về ngôn ngữ mô tả phần cứng HDL, đặc biệt là ngôn ngữ VHDL. Trong bài giảng này, bạn sẽ được học cách sử dụng VHDL để mô tả và thiết kế các hệ thống số. Các chủ đề chính bao gồm cú pháp cơ bản của VHDL, các kiểu dữ liệu, lệnh điều khiển cơ bản và các khái niệm liên quan đến mô hình RTL (Register Transfer Level). Bằng cách tham gia bài giảng này, bạn sẽ có được kiến thức cần thiết để bắt đầu xây dựng các hệ thống số bằng VHDL.
Trang 1Chương 5 : NGÔN NGỮ MÔ TẢ PHẦN CỨNG HDL
Hardware Description Language
Phần C: Ngôn ngữ VHDL (VHSIC HDL = Very-High-Speed Integrated Circuits)
Trang 27.1 TỔNG QUAN NGÔN NGỮ VHDL
VHDL = VHSIC HDL (very-high-speed integrated circuits hardware descripton language)
VHDL là một ngôn ngữ mô tả phần cứng, được dùng phổ biến trong việc thiết
kế các mạch tích hợp và các hệ thống số một cách dễ dàng và hiệu quả với tốc độ cao Ngôn ngữ VHDL dựa trên một ngôn ngữ mô tả phần cứng khác là VHSIC (Very High Speed Integated Circuit) do bộ quốc phòng Mỹ phát triển từ năm 1980 Phiên bản đầu tiên của ngôn ngữ này là VHDL 87 VHDL là một ngôn ngữ mô tả phần cứng đầu tiên được tổ chức IEEE chứng nhận là một tiêu chuẩn chung
Một trong những điều cơ bản thúc đẩy việc sử dụng ngôn ngữ VHDL đó là tính chuẩn hóa, độc lập về công nghệ của các nhà cung cấp…VHDL được ứng dụng trực tiếp trên các công nghệ FPGA , CPLDs…Code VHDL được viết để thực thi các mạch tích hợp trong các thiết bị lập trình được của các hãng như Xilinx, Altera, Amtel …
7.2 CẤU TRÚC CỦA MỘT THIẾT KẾ DÙNG NGÔN NGỮ VHDL
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 PACKAGE được xác định là:
(Thư viện)
Trang 3-
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
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
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ị
Trang 4PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
- 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
Trang 5cấ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;
-
7.2.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)
Trang 67.2.3.1 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);
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í
7.2.3.2 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);
Trang 7END 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
7.2.3.3 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);
Trang 8- ENTITY DFF IS
7.2.3.4 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:
-
ENTITY FULL_ADDER IS
PORT( A,B,CIN : IN BIT;
Trang 9SUM, COUT : OUT BIT);
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
Trang 10Đị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
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
Trang 11For 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);
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;
-
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)
Trang 12• Đặ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
7.3 CÁC KHAI BÁO TRONG VHDL
7.3.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
7.3.1.1 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
7.3.1.2 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ụ:
Trang 13- type LENGTH is range 0 to 1000;
type BYTE_INT is range –128 to 127;
type MY_INTEGER is range -2147483647 to 2147483647;
-
7.3.1.3 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ì:
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;
Trang 147.3.1.5 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
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'
Trang 15Do 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
7.3.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ễntrong 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)
7.3.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
Trang 16Ví dụ:
-
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ụ: 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;
Trang 177.4.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];
Port ( DATA: in BIT_VECTOR (1 downto 0);
CLOCK :in BIT;
Z: out BIT);
Constant K1: BIT_VECTOR : = “01”;
Trang 18Variable A1, A2: BIT_VECTOR(DATA’range);
Variable A3: BIT;
Begin
If CLOCK = ‘1’ and CLOCK’event then
Z <= (DATA and K2)(1) or (DATA and K1)(0);
Trang 19- 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
-
7.4.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
Trang 20Toá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;
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ị
Trang 21Cá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ụ:
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
Signal A, B, C: BIT_VECTOR(2 downto 0);
Trang 22Cá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
7.4.4.5 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
Trang 23-
7.4.4.6 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
7.4.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ụ: -
Trang 24Lư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
• Đợ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:
Ví dụ:
- Process
Trang 25Nế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í
Begin
If S1 = ‘1’ then
RESULT <= R1;
Elsif S2 = ’0’ then
Trang 26Type CODE_TYPE is (ADD, SUB, RST, INCX);
Subtype WORD is INTEGER range 0 to 3;
Signal CODE: CODE_TYPE;