Tải bản đầy đủ (.pdf) (37 trang)

bài giảng-vhdl - Very High speed integrated circuit Description Language

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (529.38 KB, 37 trang )

BỘ GIÁO DỤC & ĐÀO TẠO
TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHỆ
THÀNH PHỐ HỒ CHÍ MINH

Ths. NGUYỄN TRỌNG HẢI

TÓM TẮT BÀI GIẢNG

VHDL
Very High speed integrated circuit Description Language

LƯU HÀNH NỘ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

Ngồ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
CARRY

B

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, ngồ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
Q

: IN BIT;
: 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 tồ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);
Process(A,B,CIN);

--structure
--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
Behavioral
OF
component_i
IS
….

ARCHITECHTURE
dataflow
OF
component_i
IS
….

ARCHITECHTURE
Structural
OF
component_i
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à
USignal 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 tố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 đố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ó q phức tạp và q đặ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 tố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)

D

Q

Z

(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 q
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 tố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ử

Luận lý

Or and nor nand xor xnor

Quan hệ

= /= > <

Dịch

+ - &

Một ngôi

+ -

Nhân

*


Hỗn hợp

** abs not

Thấp nhất

Sll Srl Sla SRA Rol Ror

Cộng

Ưu tiên

/

>=

<=

mod rem
Cao nhất

Toán tử luận lý
Toán tử luận lý và tốn tử not chấp nhận các tố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.
Tố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
B


F
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, tố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 tố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”
“A” < “BC”
“10” < “101”

-- is true
-- is true
-- 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ê.
Tố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 tố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 ¬ 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ó tố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 tố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 tốn tử này dựa trên các tố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ố tồ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
tố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 ở ngồ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 q 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ữ ngun 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 ln
ln 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)
Variable VAR : BIT;
Begin
VAR : = B and C;
S <= A and VAR;
End process;

– no memorization for this … and gate

-- before being read

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 ln
đượ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, q 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 qt
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 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


×