You are on page 1of 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

d : bit_vector (27 downto 25). 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). loại tín hiệu sẽ mô tả các giá trị mà tín hiệu đó có thể được ấn định. c : bit_vector (3 to 5). 3. ENTITY my_design is Port (a. architechture có 3 dạng: mô tả cấu trúc (structure). có thể thực hiện từ phần mềm hỗ trợ hoặc thực hiện như sau: Ví dụ. nhưng chỉ một trong số đó có khả năng xuất hiện trong mã VHDL. ARCHITECTURE.3". attribute pinnum of d: signal is "6. • BUFFER: Kiểu tín hiệu này 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 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).4". • 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.… • OUT: mô tả dòng dữ liệu đi ra khỏi entity.2. có thể viết nhiều kiến trúc khác nhau trong một entity.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Trong khai báo ENTITY. Tuy nhiên . attribute pinnum of c: signal is "1. Loại tín hiệu cũng phải được mô tả trong khai báo PORT. Để gán các chân. vì vậy nó không thể được sử dụng cho các dữ liệu ngõ vào. attribute pinnum: string. 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. Lưu ý: trong file report. b : in integer range 0 to 7. ngoài ra có thể mô tả một vector những tín hiệu có cùng loại.5. các ngõ vào điều khiển. có 4 kiểu tín hiệu khác nhau: • IN: mô tả các ngõ vào entity. mô tả hành vi (behavioral) GV: Nguyễn Trọng Hải Trang 3 . END my_design. attribute pinnum of e: signal is "2". 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ế. 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. e : out Boolean). Kiểu IN thì được sử dụng cho các ngõ vào clock. 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). 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. mô tả dòng dữ liệu (data flow). tín hiệu sẽ không thể điều khiển từ ngõ ra của entity.

END HALF_ADDER. 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ụ. N: out BIT). chương trình bộ cộng trên sẽ có dạng: ENTITY HALF_ADDER IS PORT( A.B : IN BIT. SUM. Mô hình dòng dữ liệu sử dụng phát biểu gán tín hiệu đồng thời. End component Component AND2 Port(L. CARRY<=A and B.CARRY : OUT BIT). Chú ý. Z: out BIT). ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS Component XOR2 Port(X. SUM.CARRY : OUT BIT). End component BEGIN X1: XOR2 port map (A.B.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ụ. 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.B : IN BIT. END HA_STRUCTURE. ký hiệu <= chỉ giá trị được gán cho tín hiệu. chương trình bộ cộng trên sẽ có dạng: ENTITY HALF_ADDER IS PORT( A.M: in BIT. ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS BEGIN SUM<=A xor B.Y: in BIT. A1: AND2 port map (A. GV: Nguyễn Trọng Hải Trang 4 . END HALF_ADDER.CARRY).SUM).B. END HA_STRUCTURE.

Begin SUM<=A xor B.B).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. End process. Tín hiệu không được khai báo trong process Ví dụ. CARRY<=A and B. End process. mô tả một D-FF: D Q CK Q ENTITY DFF IS PORT( D. ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS BEGIN Process(A. GV: Nguyễn Trọng Hải Trang 5 . Ví dụ. Begin If rising_edge(ck) then Q<=D. END DFF_BEHAVIOR . END DFF. ARCHITECTURE DFF_BEHAVIOR OF DFF IS BEGIN Process(CK). SUM. END HA_STRUCTURE.CARRY : OUT BIT). END HALF_ADDER. Q : OUT BIT). End if.CK : IN BIT. chương trình bộ cộng trên sẽ có dạng: ENTITY HALF_ADDER IS PORT( A.B : IN BIT. Biến được khai báo trong process là biến cục bộ.

COUT<=T1 or T2 or T3.CIN : IN BIT. 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. End process.B. T2:=A and CIN. SUM.Y: in BIT. GV: Nguyễn Trọng Hải Trang 6 . SUM<=S1 xor CIN.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ụ. Begin T1:=A and B. --dataflow END FULL_ADDER.B. ARCHITECTURE FA_MIXED OF FULL_ADDER IS Component XOR2 Port(X. Z: out BIT). --structure Process(A. T3:=B and CIN.B. End component Signal S1: BIT --Khai báo tín hiệu cục bộ trong architechture BEGIN X1: XOR2 port map (A. --behavior Variable T1. END DFF.T2. COUT : OUT BIT).T3: BIT.CIN).S1).

Bài giảng Thiết Kế Hệ Thống Số Phần VHDL 4. dễ dàng kiểm tra được thiết kế hơn một chương trình lớn. Ví dụ. 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ó. ENTITY component_i IS ARCHITECHTURE ARCHITECHTURE ARCHITECHTURE Behavioral dataflow Structural OF OF OF component_i component_i component_i IS IS IS …. Cout: OUT BIT). 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.B. B0. FA_STRUCTURE.D2 : IN BIT. Component AND2 Port ( Z: OUT BIT. • Một component với một entity. …. xây dựng một entity FULL_ADDER ở trên có thể tách ra làm ba architecture body: FA_BEHAVIOR. -. SUM. END componen. Library HS_LIB.Cin : IN BIT. END Component.B1: IN BIT). Một architecture bất kỳ có thể được chọn bằng cách đặc tả một configuration thích hợp.Đặc tả cấu hình: GV: Nguyễn Trọng Hải Trang 7 . …. và FA_MIXED. ARCHITECTURE FA_STR OF FULL_ADDER IS Component XOR2 Port(D1. CMOS_LIB. DZ : OUT BIT). END FULL_ADDER. Định cấu hình cho phép mô phỏng các thiết kế ở thành phần con. ENTITY FULL_ADDER IS Port(A.

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

Type STD_ULOGIC is (‘U’. ERROR). ‘_’). ‘H’. 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. Signal S: STD_ULOGIC. RUN. ‘L’.architecture có sẵn trong thư viện thiết kế CMOS_LIB. Ví dụ. 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). • Kiểu nguyên. ‘1’). • Đặ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. giá trị bên trái nhỏ hơn giá trị bên phải. --HALT< READY< RUN< ERROR Variable STATE: STATE_TYPE. dãy một chiều và kiểu bản ghi. ‘1’. • Kiểu liệt kê. CÁC KHAI BÁO TRONG VHDL. 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. GV: Nguyễn Trọng Hải Trang 9 . số nguyên.architecture AND2HS và AND2STR đã có trong thư viện thiết kế HS_LIB. 1. kiến trúc này có sẵn trong thư viện WORK. ‘Z’. READY. II. Kiểu STD_ULOGIC và STATE_TYPE là 2 kiểu liệt kê. ‘0’. 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. --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< _. ‘0’.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 . Khai báo kiểu hỗ trợ. Type CODE_TYPE is (NUL. • Đặ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 . ‘X’.architecture XOR2 và XOR2BEH có sẵn trong thư viện WORK. ‘W’. tuy nhiên mức độ trừu tượng của STATE_TYPE cao hơn của STD_ULOGIC. Kiểu liệt kê. Ví dụ. Function CODE (C: in INTEGER) return CODE_TYPE. type LENGTH is range 0 to 1000. đối tượng A1 và A2 được liên kết tới entity khác là: A_GATE có architecture A_GATE_BODY. Type STATE_TYPE is (HALT. • Đặc tả thứ hai liên kết đối tượng component AND2 có nhãn A3 đến entity bởi cặp entity .

V.INT <= 0. Tuy nhiên chỉ có dãy một chiều được công cụ tổng hợp cho phép. 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. Type STD_LOGIC is ( ‘U’. Begin Process Variable V: ITEM_TYPE. đị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ụ.Uninitialized ‘X’. Begin S1 <= V. End record.Weak 0 GV: Nguyễn Trọng Hải Trang 10 . Architecture A of E is Type CODE_TYPE is (NONE. CODE: CODE_TYPE. V:= S2. Ví dụ. STATMT) . type MY_INTEGER is range -2147483647 to 2147483647.Forcing Unknown ‘0’. 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. • Kiểu dãy nhiều chiều. • Tiêu chuẩn IEEE Khối STD_LOGIC_1164 định nghĩa các giá trị kiểu đa luận lý. -. Thay vì: Type OTHER_RAM is array (1023 downto 0.CODE. Signal S1.Forcing 1 ‘Z’. -. Kiểu dãy nhiều chiều được VHDL hỗ trợ để định nghĩa một tập chỉ số. Khối này được hỗ trợ bởi tất cả công cụ tổng hợp. Mỗi thành phần bản ghi được định vị bằng tên của nó. DATA. Vậy phải khai báo hai dãy một chiều thay vì một dãy hai chiều. -. INT: INTEGER. Ví dụ.Forcing 0 ‘1’. … S2. -. -.CODE := S1.Weak Unknown ‘L’. -.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL type BYTE_INT is range –128 to 127.High Impedance ‘W’. -. Type ITEM_TYPE is record. Type RAM is array (1023 downto 0) of WORD. S2 : ITEM_TYPE. Type WORD is array (31 downto 0) of BIT.

Bài giảng Thiết Kế Hệ Thống Số Phần VHDL ‘H’. 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. III. 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. tất cả tín hiệu giữ các giá trị mới của chúng. '1' và 'X'. '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. 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. biến số và tín hiệu. -. Đ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. Trong suốt giai đoạn này. Hằng số. Các khai báo hằng số: Constant constant_name : type_name [:=value] Ví dụ. kiểu vật lý định nghĩa trước TIME không được hỗ trợ. '0' là giá trị mạnh và trội hơn các giá trị yếu 'W'. nên các giá trị 'L' và 'H' không có ngữ nghĩa tổng hợp chuẩn. mục đích của phép gán là đặt đầu ra tới bộ đệm 3 trạng thái. '1' và '0' có thể hiểu như là nối nguồn và nối đất. Đối tượng trong VHDL là các thông tin về hằng số. 'H' và chúng lại trội hơn 'Z'. -. GV: Nguyễn Trọng Hải Trang 11 . 'L'. 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. 1. 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ụ. 'X'. tất cả kiểu vật lý định nghĩa bởi người thiết kế không được hỗ trợ). 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. bao gồm lệnh biểu thức thời gian wait for. Ở mỗi bước mô phỏng. 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. Giá trị 'U'và 'W' được gọi là giá trị gần luận lý. Các kiểu con. Giá trị 'U' là chữ tận cùng bên trái trong định nghĩa STD_ULOGIC liệt kê. 3. Nếu các mệnh đề này được sử dụng trong mô tả VHDL. 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). Ví dụ. 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. 'W' có ảnh hưởng ít hơn có thể bị gán đến '0'.Weak 1 ‘U’.Don’t care ). '1'. 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. 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. Các kiểu con rất hữu dụng cho tổng hợp. 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. Đối với tổng hợp. 2. CÁC ĐỐI TƯỢNG VHDL. 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.

Constant bus_width : integer :=8. B : BIT. 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ụ. A: BIT_VECTOR(7 downto 0). A. GV: Nguyễn Trọng Hải Trang 12 . ‘1’)). ’0’). trong biểu thức lệnh if hoặc case If S= CST1 then … Case VALUE is When CST_N =>… Ví dụ. R. 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. Khai báo biến số và tín hiệu. 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ụ. BIT) of BIT. Signal V. Ví dụ. Ví dụ.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Constant rise_time : time :=10 ns. Ví dụ.B). Sự khai báo hằng số không tạo ra phần cứng. Type TAB2 is array (BIT. R <= A and MASK. trong lệnh đồng thời có điều kiện: Z <= CST1 when A=’1’ else S when B= CST2 else CST3. Constant MASK: BIT_VECTOR:=”01111111”. 2. Constant AND_TAB: TAB2 := ((‘0’. Variable CTRL_STATUS : BIT_VECTOR (10 DOWNTO 0). Giá trị hằng số được tính toán chỉ một lần. (‘0’. Signal Z. … begin V <= COD1. … Z <= AND_TAB (A. Hằng số chỉ cung cấp điều kiện để xác định phần cứng. Các khai báo biến số Variable variable_name : type_name [:=value]. Phía phải của phép gán tín hiệu Constant COD1: BIT_VECTOR := X ”EA”.

End MEMO_ONE. A3 := A1(0) or A2(1). Begin If CLOCK = ‘1’ and CLOCK’event then A1 := DATA and K1. A2 := DATA and K2. A2: BIT_VECTOR(DATA’range). Z <= A3. End if. ở đó tất cả các biến được thay thế bởi các phương trình của chúng. Begin If CLOCK = ‘1’ and CLOCK’event then Z <= (DATA and K2)(1) or (DATA and K1)(0). Constant K2: BIT_VECTOR := “10” . mỗi phần tử trong dãy có kiểu là BIT Ví dụ. CLOCK :in BIT. Architecture A of MEMMO_ONE is Begin Process (CLOCK) Variable A1. Z: out BIT). Thật ra quá trình tương đương có thể được cho mà không có bất kỳ biến nào. Constant K1: BIT_VECTOR : = “01”. 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). End process. 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 . End if.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ử. Variable A3: BIT. 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. End A. Chúng ta có thể viết lại như sau.

chúng phải được ngăn cách bằng dấu () : A and B nand C. Signal clock: bit. 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.đúng luật. 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. -.& 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. 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. Chúng được chỉ ở bảng dưới đây với sự tăng dần mức ưu tiên. Toán tử logic và toán tử bit là một phần của toán tử số học. Các giá trị khởi động. Nếu cổng out hoặc thông số out của chương trình con có giá trị mặc định. 4.khai bo tín hiệu data_bus thuộcc kiểu bit_vector có độ rộng 8 bit 3. GV: Nguyễn Trọng Hải Trang 14 . VHDL định nghĩa bảy loại toán tử.0 Signal data_bus : bit_vector( 0 to 7). 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. BOOLEAN. Toán tử nand và nor không kết hợp với nhau trong 1 cú pháp liên tục.-. 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 + . Trường hợp thứ nhất và thứ hai sẽ bị bỏ qua bởi công cụ tổng hợp. --khai báo tín hiệu clock của kiểu bit lấy giá trị 1. Đ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. 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. Các toán tử số học. -.trái luật (A and B ) nand C.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ. Trong VHDL. và VECTOR với kích thước giống nhau.

toán tử bằng và khác được định nghĩa rõ ràng cho các kiểu. 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. R <= (A and B) and C. Các toán tử cộng. Signal R. 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. Signal T. kiểu 'LEFT' thấp hơn kiểu 'RIGHT'. C : BIT.. Sơ đồ kết quả của các hàm trên như sau: X(1. F.. A. Kết quả là TRUE nếu hai toán hạng có cùng giá trị. đô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. B.0) E T A F B G C Toán tử quan hệ.0) D Y(1. 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. G: BOOLEAN. X.is true “10” < “101” -. Thứ tự của kiểu vô hướng được định nghĩa bởi khai báo của nó. 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.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ê. -- Begin S <= X and Y. T <= D xor E xor F xor G. Trong mô phỏng. thứ bậc quan hệ của chúng được định nghĩa bởi bậc ngữ nghĩa. “0” < ”1” -. 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 . D.is true “A” < “BC” -. Y: BIT_VECTOR (1 downto 0). Toán tử cộng và trừ được định nghĩa cho các toán hạng số nguyên. Signal S.. Đối với dãy một chiều. Lưu ý.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ. E.0) S(1.

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

6. Vì vậy. Ví dụ Variable V: BIT_VECTOR(1 to 3). nhiều biến số có thể gộp lại. Trong VHDL lệnh duy nhất để đồng bộ là lệnh wait. (1 => A. --B được gán cho bản ghi FIELD của REC VECTOR := X “AA”. C) := V. Do đó. nếu biến số đã được gán. 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. Ví dụ. -. Lưu ý.FIELD := B.Phép gán với tên Hơn nữa. Một quá trình phải chứa ít nhất một lệnh wait.phép gán vector toàn cục WBUS(1) := F(A). BIT2 => “11”). -. B. Phép gán tín hiệu. -.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL 5. 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.giá trị integer 0 được gán cho biến A REC. Lệnh đồng bộ. -. … --Hai trạng thái sau là tương đương (A. Variable A. -. cách gán biến khác nhau: A:= 0 .Phép gán giá trị theo vị trí của vetor REC := (LETTER => ‘C’. -. Signal <= a_waveform_with_one_item_and_without_delay_expression 7. 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 ). C: BIT. FIELD => 3. ở phần bên trái của lệnh gán. 3. Mục đích của gán tín hiệu giống như phép gán biến. “10”). Phép gán biến được thực hiện bởi toán tử :=. 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.phép gán phần tử của vector WORD(3 to 4) := “10”. 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 . Phép gán biến số. 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.phép gán một nhóm phần tử vector REC := (‘A’. thao tác này xảy ra ngay lập tức khi tính toán. 3 => C):= V. B. 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ũ. 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.2 => B.

('STABLE là một hàm chấp nhận kiểu thông số TIME có giá trị mặc định là zero). chỉ mức ưu tiên thực hiện các rẽ nhánh khác nhau. B. Ví dụ. Điều này xác định sườn lên hợp lệ cho tổng hợp. 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. S <= A or B. Wait until CLK = ‘1’. thì để phù hợp với sự mô phỏng. 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. Ví dụ. Nếu lệnh wait là rõ ràng. Wait until CLK =’1’ and CLK’last_value = ‘0’. clock được xác định bởi các sự kiện và sườn xung. Lệnh if bao gồm cả rẽ nhánh elsif và else. Else R <= C+1. thiết kế các MUX sau GV: Nguyễn Trọng Hải Trang 18 . lệnh đồng bộ được mô tả bởi một lệnh điều kiện if Ví dụ. If E then R <= C + D. End if. D. C. Process Begin Wait on A. Tín hiệu này phải là duy nhất. điều kiện sau phải được thêm vào lệnh wait: CLK'LAST_VALUE = '0'. End process. 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ị.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ. Điều kiện cạnh xung đồng hồ trở thành: Ví dụ. • Đợi một sự kiện xảy ra trên tín hiệu đồng hồ (Clock). Ví dụ.

mỗi nhánh được kiểm tra một cách tuần tự). End process.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Process (S1. When others => R <= 0. Signal CODE: CODE_TYPE. Y. Chú ý rằng nhánh others được dùng cho giá trị 2 và 3 của tín hiệu X. Subtype WORD is INTEGER range 0 to 3. INCX). R3. R3. không có ưu tiên. End if. Lệnh case. Signal X. End process. Process (CODE. Trong lệnh case. RST. Lưu ý. R: WORD. Để nhóm lại tất cả các gia trị "don't care". Thiết kế mạch sau Type CODE_TYPE is (ADD. R2. mỗi nhánh có cùng cấp với nhau (lệnh if và lệnh elsif. Y) Begin Case X is When 0 => R <= Y. GV: Nguyễn Trọng Hải Trang 19 . Trong lệnh case. R1. S2. SUB. Else RESULT <= R4. others không bao giờ nên dùng nếu tất cả giá trị đã được liệt kê trước đó Ví dụ. Elsif S2 = ’0’ then RESULT <= R2. Elsif S3 = ’1’ then RESULT <= R3. X. When 1 => R <= CODE_TYPE’pos (CODE). tất cả các giá trị có thể phải được đưa vào hết và chúng là duy nhất. R4) Begin If S1 = ‘1’ then RESULT <= R1. End case. mệnh đề others có thể được sử dụng.

l3). l3. 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. End if. l2. End. l3) thì một phần tử nhớ mạch lật được tạo ra. End if. GV: Nguyễn Trọng Hải Trang 20 . 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. l2. Ví dụ. l3) then RESULT <= DATA (l1. -.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Tạo ra bộ nhớ. l3. l2. l3. 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). l3) Then RESULT <= DATA (l1. l3. nên đôi khi RESULT sẽ không thay đổi và sẽ giữ nguyên giá trị. nếu chỉ phụ thuộc vào các giá trị đầu vào (l1. Process (l1. RESULT). l2. Ngược lại. Để đảm bảo không tạo ra phần tử nhớ. l3) then RESULT <= DATA (l1. Bởi vì chức năng CONDITION không luôn luôn trả về hằng số TRUE.default assignment If CONDITION (l1. Vì vậy. l3) – inferring a flip-flop Begin If CONDITION (l1. l3) Then RESULT <= DATA(l1. l2. End if. RESULT). l2 . End. Đôi khi một vài giá trị điều kiện không đúng. l2. l2. End if. RESULT).l3) then RESULT <= DATA (l1. End if. 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ộ. Ví dụ. l2. phải có phần tử nhớ . Process (I1. If CONDITION (l1. else RESULT <= DEFAULT_VALUE. Trong trường hợp này. l3. RESULT). l2. 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. RESULT) – inferring a latch Begin If CONDITION (l1. … 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. phần tử nhớ là cần thiết. một rẽ nhánh else được tạo ra rõ ràng : If CONDITION (l1. l2. Ví dụ. l2. 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. l2.

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. 8. C) Begin S <= A and B and C. B. 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. khai báo biến là cần thiết. 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. không tạo ra phần cứng nào: Process (A. Các quá trình như sau: Process (A. Lệnh quá trình và lệnh đồng bộ. biến có thể sử dụng trong hai cách khác nhau: • Giống như các biến cục bộ.before being read End process. C) – no memorization for this … and gate Variable VAR : BIT. Trong VHDL có hai loại lệnh lặp lại. khai báo cục bộ và phần lệnh tuần tự. Một lệnh quá trình bao gồm 3 phần: danh sách tùy chọn. C. 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. Thật ra. -. Quá trình trên cũng có thể tương đương với: Process … begin … wait on A. 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. Khai báo cục bộ. S <= A and VAR. GV: Nguyễn Trọng Hải Trang 21 . B. End process. Trong tất cả các khai báo có thể có bên trong phần khai báo quá trình.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Lệnh lặp lại. B. vòng lặp for và vòng lặp while. C) – danh sách các biến được xem xét … begin … end process. Danh sách độ nhạy. có thể bao hàm phần tử nhớ. Begin VAR : = B and C. 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.

nếu một biến luôn được gán trước khi được đọc. 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. Else S <= C. • Khi thiết kế dữ liệu dưới dạng máy trạng thái. 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. 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 <= a when x = ‘1’ else B when Y = ‘1’ else C Ví dụ. Hai ví dụ trên chứng minh các phép gán tín hiệu. Ví dụ. nếu A. GO). Variable STATE: T_STATE. 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ớ. End process. Trong trường hợp tổng quát thì giữa 2 lệnh đồng bộ. Elsif Y = ‘1’ then S <= B. Begin Wait until CLK=’1’. Process – synchronous finite state machine with two states Type T_STATE is (STOP. Case STATE is --variable STATE is read -. -.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.S được gán tới A bởi phần cứng Z <= ‘1’. C. C. -.before being target of assignment when STOP => STATE:= GO. 9. End if. X. Vì thế. X. 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. Y) Begin If X = ‘1’ then S <= A. giữa hai lênh đồng bộ. Y được định nghĩa như là các tín hiệu. end case. Biểu thức case. when GO => STATE:= STOP. thì biến này không tạo ra bất kỳ phần cứng nào. B. đ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ó. End process.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. GV: Nguyễn Trọng Hải Trang 22 . B. quá trình tương là: Process (A. Phép gán tín hiệu. phép gán chọn lựa và có điều kiện. Phép gán tín hiệu đơn giản.

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

Khi điều kiện bảo vệ không thoả. -. Đâ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. 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.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. 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ệ. 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. Dưới một số điều kiện. GV: Nguyễn Trọng Hải Trang 24 . 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. phép gán bảo vệ có thể định nghĩa hành vi ba trạng thái. S <= V1 &V2. Liên kết với lệnh không nối (disconnect) và tín hiệu resolved. • 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. Điều này được chỉ ra trong ví dụ sau. B: block (not CLK’state and CLK = ‘0’ and CLK’last_value =’1’) Signal R: BIT. B. BLOCK_NAME : block Subtype TWO_BIT_TYPE is BIT_VECTOR(1 to 2). tín hiệu đích không được nối. Ví dụ.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL 11. Đối với tổng hợp. Signal V1. E. S <= guarded R . ở đó giả thiết rằng tín hiệu clock là đa giá trị. F. Begin R <= guarded DATA(1). Begin V1 <= (A or C) &B. Signal S. V2: TWO_BIT_TYPE. V2 <= E &(F and G). Các lệnh block được sử dụng cho cấu trúc lệnh đồng thời Ví dụ. D. C. 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. 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). BIT_VECTOR(1 to 4). 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). BLOCK. Ứ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. Hơn nữa. G: BIT. End block BLOCK_NAME. Signal A.

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

có một. Signal B: BIT_VECTOR(0 to N ). A(l). hoặc nhiều bản sao). B) Begin For l in 1 to N loop V(l) <= F(l. Để hoàn tất một mẫu sử dụng các lệnh generate lặp. Entity E is Generic (N: NATURAL). Signal B: BIT_VECTOR(0 to N ). Architecture B of E is Constant N: NATURAL := 3. End A. …). End process. A(l). Signal A. Architecture A of E is Signal LOCAL: BIT_VECTOR (1 to N -1). OUTPUT: out BIT. End. các phép gán tín hiệu đồng thời N được phát ra. Ví dụ sau đây minh hoạ tính chất này. Signal R: BIT_VECTOR (1 to N). End generate. Architecture A of E is Constant N: NATURAL := 3. B (N-1 + 1)). 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. Trong ví dụ sau. Begin GV: Nguyễn Trọng Hải Trang 26 . End loop. kiến trúc A và B là tương đương. R(J+1) <= A(j).V: BIT_VECTOR (1 to N). Các lệnh generate điều kiện có thể được dùng để giải quyết vấn đề này. Begin L: for J in k1 to k2 generate S(J) <= not A(J). B (N-1 + 1)). ở đó sự xử lý các bản sao hợp phần có thể khác nhau (không có. Begin Process (A. Port (INPUT: in BIT.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Signal R: BIT_VECTOR (k1 +1 to k2 +1). kết quả tổng hợp cuối cùng giống nhau. Component M1 Port (l: in BIT. End B. Lệnh generate có điều kiện. 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. Begin L: for l in 1 to N generate V(l) <= F(l. End component. End generate. End E. O: out BIT).

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

Begin P_REG: process (DATA. Elsif CLK =’1’ and CLK’event then REG <= REG(REG’left-1 downto REG’right) & DATA. Signal REG: REG_TYPE. End process. P_FOUND: process (REG) Variable CPT: NATURAL range 0 to ERROR_NUMBER +1. End if. 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. Các thông số tương thích chung là vector phải tìm.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ. Exit. Port ( CLK: in BIT. Begin Assert (PATTERN ‘length >= ERROR_NUMBER) Report “pattern length cannot be shorter than ”& “the authorized error number” Severity ERROR. End loop. End process.…) Entity SEARCH_PATTERN is Generic(PATTERN: BIT_VECTOR. FOUND: out BIT). End SEARCH_PATTERN. GV: Nguyễn Trọng Hải Trang 28 . Architecture A of SEARCH_PATTERN is Subtype REG_TYPE is BIT_VECTOR (PATTERN’ range). 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ả. End if. nhận dạng mẫu đã cho trong chuỗi bit tuần tự. FOUND <= ‘0’. RESET) Begin If RESET = ‘1’ then REG <= REG_TYPE (others => ‘0’). 1: chỉ sai khác 1 bit mới chấp nhận. End if. For l in REG’range loop If PATTERN(l) /= REG(l) then CPT := CPT + 1. 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). DATA: in BIT. CLK. RESET: in BIT. If CPT >= ERROR_NUMBER then FOUND <= ‘1’. ERROR_NUMBER: NATURAL). End A. Begin CPT := 0.

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. Các toán tử VHDL '+'.STANDARD). Signal N1. ở đó các thông số tương thích chung được ánh xạ đến các giá trị của chúng. 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. • Kiểm tra thứ bậc của hai đối tượng khi sử dụng các toán tử quan hệ. Sau các toán tử Boolean và các phép so sánh. N2. Ơ đây. 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. các số không dấu N1. Kết quả trả về là kiểu vật lý. Điều này có thể được làm trong bản sao hợp phần hoặc trong cấu hình. Đ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. '*'. Có hai loại so sánh sau: • Kiểm tra 2 đối tượng giống nhau. SUM_N: INTEGER range 0 to 47. 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. SUM_l <= l1 + l2. • 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 số có dấu l1. cả hai toán hạng phải là cùng kiểu số nguyên hoặc là kiểu floating point. Nếu người thiết kế không làm công việc này. 14. SUM_N <= N1 + N2. Mặt khác. Bốn phép toán cơ bản đó là: phép cộng. Toán tử nhân và chia phải được xác định trước. GV: Nguyễn Trọng Hải Trang 29 . trong khi đó quá trình thứ hai biểu diễn mạch tổ hợp thuần tuý. Trong ví dụ ngắn này có một vài chú thích về quy ước mã hoá các số. Ví dụ. 15. '-'. nhân và chia. l2. Kết quả cũng phải cùng kiểu. Bao gồm các hàm (cũng được gọi các toán tử) bằng ('=') và không bằng ('/='). 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. SUM_l: INTEGER range –16 to 15. Tuy nhiên. • 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ự. l2 và SUM_l được mã hoá ở dạng bù hai với việc sử dụng 4 +1 bit. N2 và SUM_N được mã hóa với 6 bit (47<2**6-1). một họ quan trọng khác là toán tử số học. Phép so sánh. Signal l1. 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. 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. trừ. 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. 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.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ộ. Các toán tử số học.

và kết quả trả về là kiểu vật lý. 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. (-7) rem 4 -. hành vi ngược nhau sẽ xảy ra. Các phép dịch và quay. Ví dụ.kết quả = 3. 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ó. 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. 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. chia một giá trị vật lý bởi một giá trị integer hoặc real thì được cho phép.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. Nếu giá trị INTEGER là âm. và nó được xác định như sau: A mod B = A . 16. 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. GV: Nguyễn Trọng Hải Trang 30 . 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.kết quả = -3.(A / B) *B Kết quả của toán tử MOD là biểu hiện toán hạng thứ hai. 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. 7 mod (-4) -. which is '0' "1001010" srl3 is "0001001".Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Đối với toán tử chia.kết quả = -1. (-7) mod (-4) -.kết quả = 3.B * N Sau đây là những ví dụ sử dụng toán tử mod và rem: 7 mod 4 -. Toán tử SRA (xoay phải số học ). 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 . một giá trị nguyên coi như một kết quả. 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. đ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. đóng vai trò giải thích toán tử.

all. y :OUT STD_LOGIC_VECTOR(1 DOWNTO 0). AgtB <= ‘1’ WHEN A > B ELSE ‘0’. mỗi nhóm 4 bit và được đặt tên là A và 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. AltB :OUT STD_LOGIC). MỘT SỐ VÍ DỤ THIẾT KẾ CÁC MẠCH TỔ HỢP VÀ TUẦN TỰ. s :IN STD_LOGIC. END behavior.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL III. AeqB. w1. ARCHITECTURE behavior OF compare IS BEGIN AeqB <= ‘1’ WHEN A = B ELSE ‘0’.std_logic_1164. AgtB(A greater B). ENTITY priority IS PORT (w :IN STD_LOGIC_VECTOR(3 DOWNTO 0). B : IN STD_LOGIC_VECTOR(3 DOWNTO 0). A lớn hơn B và A nhỏ hơn B. Mạch so sánh 4 bit bao gồm 8 bit ngõ vào. LIBRARY ieee. Mã chương trình của mạch so sánh 4 bit có dạng như sau: LIBRARY ieee. Mạch so sánh 4 bit.all. chia thành 2 nhóm.all.std_logic_1164. ENTITY compare IS PORT (A. w1 WHEN OTHERS. AeqB(A equal B). Đoạn mã chương trình tạo mạch dồn kênh 2 sang 1. LIBRARY ieee. ENTITY mux2to1 IS PORT (w0. Mạch mã hóa ưu tiên. USE ieee. ARCHITECTURE behavior OF mux2to1 IS BEGIN WITH s SELECT F <= w0 WHEN ‘0’. Kết quả của phép so sánh có 3 trường hợp: A bằng B. USE ieee. END behavior.std_logic_1164. USE ieee. ARCHITECTURE behavior OF priority IS GV: Nguyễn Trọng Hải Trang 31 .std_logic_unsgned. END mux2to1. z :IN STD_LOGIC. F: :OUT STD_LOGIC). AgtB.all. END priority. AltB (A lighter B). END compare. USE ieee. AltB <= ‘1’ WHEN A = B ELSE ‘0’.

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

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ã sau đây viết cho thanh ghi 16 bit. Reset.std_logic_1164. clock : IN std_logic. 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. ENTITY flipflop IS Port ( D.all. Với đoạn mã VHDL trên. Ngoài ra còn có thể linh hoạt chúng trong các thiết kế của mình. 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. VHDL cho phép người thiết kế có thể tạo ra thanh ghi với số bit mong muốn. USE ieee. ARCHITECTURE bahavior OF flipflop IS BEGIN PROCESS BEGIN WAIT UNTIL Clock’EVENT AND Clock = ‘1’. END regn. clock : IN std_logic_vector (N-1 DOWNTO 0).std_logic_1164. END PROCESS. 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. Q <= D. xung tác động cạnh . Thanh ghi trong mạch số đóng vai trò rất quan trọng. Đoạn mã trên được viết đầy đủ cho một mạch chốt. Mạch tạo thanh ghi 8 bit. ngõ ra là Q. khi không có xung tác động. 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. trong thiết kế có sử dụng thông số tương thích chung generic. Q : OUT std_logic_vector (N-1 DOWNTO 0). USE ieee. Đoạn mã trên được viết với một bit ngõ vào. 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.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Mạch chốt dữ liệu. thanh ghi thực tế chính là một mạch chốt dữ liệu. ENTITY regn IS GENERIC ( N : INTEGER := 16). clock : IN std_logic. END bahavior. các thiết kế số hiện đại hầu như đều phải sử dụng thanh ghi. Đoạn mã VHDL cho mạch chốt được viết như sau: LIBRARY IEEE. Q : OUT std_logic). với các công cụ tổng hợp và biên dịch. END flipflop. LIBRARY IEEE. Port ( D. khi có một xung cạnh lên. 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. ARCHITECTURE behavior OF regn IS BEGIN GV: Nguyễn Trọng Hải Trang 33 .all. ngõ vào dữ liệu có tên là D. một bit ngõ ra.

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

all. n_s : StateType.std_arith.std_logic_1164. signal p_s. END behavior. state2. use work. END trin.all.all. end divby5. x) begin case p_s is when state0 => y <= '0'.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL LIBRARY IEEE. if x = '1' then n_s <= state1. end if. ENTITY trin IS GENERIC ( N : INTEGER := 8). F : OUT std_logic_vector (N-1 DOWNTO 0). state3. E : IN std_logic. Port( X : IN std_logic_vector (N-1 DOWNTO 0). USE ieee. else n_s <= state2 GV: Nguyễn Trọng Hải Trang 35 . state1. when state1 => y <= '0' if x = '1' then n_s <= state3. state4). Xây dựng máy trạng thái trong VHDL library ieee. ARCHITECTURE behavior OF trin IS BEGIN F <= (OTHERS => ‘Z’) WHEN E =’0’ ELSE X.std_logic_1164. entity divby5 is port(x. y : out std_logic). clk : in std_logic. architecture state_machine of divby5 is type StateType is (state0. use ieee. begin fsm: process (p_s. else n_s <= state0.

when state3 => y <= '1'. else n_s <= state1. when others => n_s <= state0. else n_s <= state4. y <= '0'. end if. state-clocked : process (clk) begin if rising_edge(clk) then p_s <= n_s. when state4 => y <= '1'. end case end process fsm. else n_s <= state3. end architecture state_machine. end if. end process state_clocked. end if. when state2 => if x = '1' then n_s <= state0.Bài giảng Thiết Kế Hệ Thống Số Phần VHDL end if. GV: Nguyễn Trọng Hải Trang 36 . end if. if x = '1' then n_s <= state4. if x = '1' then n_s <= state2. y <= '1'.