You are on page 1of 120

Bài 1

Vấn đề Mô hình hoá
phần cứng
(Hardware Modeling)

Hardware Modeling - 1 - 1
VHDL là gì?
• Một từ viết tắt cho một từ viết tắt khác, VHDL là từ
viết tắt của VHSIC Hardware Description
Language
– Còn VHSIC là từ viết tắt của Very High Speed
Integrated Circuit
• Tiếp theo, chúng ta bắt đầu tìm hiểu về xuất xứ và
mục đích của ngôn ngữ này

Hardware Modeling - 1 - 2
VHDL - Mục đích và sự
hình thành
• VHDL, trước hết và chủ yếu là một công cụ để mô
hình hoá phần cứng (hardware modeling)
– Để mô phỏng (simulation) và tổng hợp (synthesis)
mạch
• Chuẩn IEEE 1076 rất hoàn chỉnh cho việc mô hình
hoá thiết bị, nhưng nó mới chỉ định nghĩa các tham
số khái quát cho việc tổng hợp thiết bị
• Kết quả: một mô hình phần cứng đã cho không hẳn
đã phù hợp với một thiết kế ở mức cổng logic đã có
thông qua các công cụ và các công nghệ đích
(target) khác nhau

Hardware Modeling - 1 - 3
Chuẩn hoá VHDL
• Tổ chức IEEE chính thức phê chuẩn chấp nhận ngôn ngữ
VHDL như là một chuẩn của họ vào năm 1987, chuẩn
IEEE 1076
– Giống như các chuẩn kác của IEEE, chuẩn IEEE 1076 được
sửa đổi theo chu kỳ tối thiểu là 5 năm

• Sửa đổi đầu tiên được thực hiện năm 1993, và VHDL-93
hiện nay được coi là phiên bản chính thức của ngôn ngữ
này, hiện nay bắt đầu xuất hiện VHDL 200X
– Tuy nhiên, hầu hết các công cụ (tool)
VHDL-2X
đều hỗ trợ phiên bản đầu tiên (VHDL-87)
– Các bộ phận của VHDL 200X VHDL-93

được hỗ trợ bởi một số tool
VHDL-87

Hardware Modeling - 1 - 4
Language Subsets

IEEE 1076
IEEE 1076
(modeling)
(synthesis)

• Không phải tất cả các cấu trúc VHDL đều có thể tổng
hợp được. Ví dụ, wait for 10 ns là một cấu trúc mô
hình hoá thông dụng, nhưng nó không tương ứng với
và cũng không thể tạo ra một phần tử ở mức cổng logic

Hardware Modeling - 1 - 5
Các mức trừu tượng trong
mô tả phần cứng
Ít chi tiết hơn, F
thiết kế và mô
Behavioral
phỏng nhanh
hơn

RTL
AND_OR2
DFF

Chi tiết hơn, phụ Logic
thuộc công nghệ,
thiết kế và mô
phỏng chậm hơn
Layout CLB_
R5C5
CLB_
R5C6

Hardware Modeling - 1 - 6
Sự chồng chéo
trong VHDL
Sum <= A + B after 3 ns ; Behavioral Hardware Model

Sum <= A + B ; RTL Synthesizable Code

component Xlx_add2
Logic FPGA Vendor Library
port ( A: in bit ;
B: in bit ;
Sum: out bit
);
end component ; Layout Place & Route Utility

Hardware Modeling - 1 - 7
Trình tự thiết kế Top-Down
• VHDL hỗ trợ hướng tiếp cận top-down trong thiết kế

Hardware Modeling - 1 - 8
Nguyên tắc phân đoạn
• Khi tiến hành phân đoạn một thiết kế trong VHDL,
cần lưu tâm cân nhắc một số các điểm chính sau
– Tín hiệu ra có chốt (Register) tại biên giới các module
• Phù hợp với cấu trúc mã nguồn dạng RTL
– Giảm đến tối thiểu số clock trên mỗi block
• Quan trọng đối với các ràng buộc về thời gian, Important
for timing constraints, tối ưu hoá cấu trúc mạch
– Duy trì các tín hiệu then chốt trong phạm vi mỗi block
• Hầu hết các công cụ đều không tối ưu thông qua biên
giới hierarchy
– Kích thước của từng block đủ nhỏ để có thể kiểm tra
nhanh chóng
• Mẫu thử nhanh, đơn giản cho mỗi sub-module

Hardware Modeling - 1 - 9
Cấu trúc Top - Down
entity
A[3:0] Add_4
SUM [3:0]

B[3:0]
C_out
C_in

A entity
Full_Add Sum
B
C_in C_out Macro

A entity
B Half_Add Sum
Carry Leaf Cell

Hardware Modeling - 1 - 10
Kiểm tra thiết kế
• Khi sử dụng VHDL, có thể thực hiện các bước kiểm
tra thiết kế, bắt đầu từ Behavioral Simulation

VHDL Behavioral Simulation
(Testbench driven)
modules
VITAL

Gate-Level Functional
Synthesis (Netlist-driven )

VHDL Initiative Toward Gate-Level Timing
Place & Route
ASIC Libraries (Back-annotated netlist )

SDF (Standard Delay
Format)
& Structural VHDL File

Hardware Modeling - 1 - 11
Các bước kiểm tra thiết kế
(1) Mô phỏng Behavioral
• Thực hiện mã nguồn mô tả hành vi, dùng testbench
(2) Mô phỏng RTL
• Thực hiện file mã nguồn RTL, VHDL
dùng testbench modules
(3) Mô phỏng chức năng trong VHDL
• Thực hiện file .vhd mô tả cấu trúc,
dùng testbench Synthesis
(4) Mô phỏng chức năng thiết bị ở mức cổng
• Mô phỏng netlist pre-P&R EDN
dùng công cụ mức cổng
(5) Mô phỏng theo quan hệ thời gian trong VHDL Place & Route
• Thực hiện file cấu trúc .vhd và file SDF;
dùng testbench
(6) Mô phỏng quan hệ thời gian ở mức cổng
• Mô phỏng netlist post P&R EDN netlist, sử dụng các delays

Hardware Modeling - 1 - 12
Kiểm tra thiết kế?
Test-Bench
• Chip level Behavioral Module
• Board level
• Std parts model
• Model bus operation
• Discrete event-driven
• Flexibility over strictly
netlist-driven FPGA
MCU

Memory PLD

Hardware Modeling - 1 - 13
Kết luận
• VHDL là một ngôn ngữ dùng để mô hình hoá phần
cứng của thiết bị
• Tổng hợp logic là một tập con của toàn bộ ngôn ngữ
• Các vấn đề về công cụ và công nghệ có ảnh hưởng
đến việc tổng hợp logic của một thiết kế
• Các mô phỏng HDL có thể bao gồm các dữ liệu định
thời (back-annotated timing data)

Hardware Modeling - 1 - 14
Bài 2

Ngôn ngữ VHDL

Hardware Modeling - 1 - 15
Design Units trong
VHDL
• Entity
• Architecture
Chương trình VHDL bao gồm
• Configuration
các design units.
• Package
• Package Body Một số design units độc lập với
• Library các design unit khác.

Hardware Modeling - 1 - 16
Các loại Design Unit
• Trong VHDL có hai loại design unit, đó là:
– Primary
• Không phụ thuộc vào các design unit khác
– Secondary
• Phụ thuộc vào primary design unit

• Mỗi khi có thay đổi trong primary design unit, cần
phải kiểm tra lại secondary design unit. Nếu không,
chương trình sẽ có lỗi.
• Các secondary unit không thể tồn tại độc lập
-- tức là, phải phụ thuộc primary unit

Hardware Modeling - 1 - 17
Entity
• Entity mô tả external interface của thực thể được thiết
kế, cùng các thuộc tính liên quan với interface đó

entity Half_Add is
A Sum
port (A, B : in std_logic ;
Carry, Sum : out std_logic) ; B Carry

end Half_Add ;

Chú thích: VHDL’93 cho phép dùng optional
reserved word entity ngay sau reserved word
end, ví dụ, ‘end entity Half_Add ; ’

Hardware Modeling - 1 - 18
Architecture
• Architecture mô tả hoạt động bên trong của thực
thể (entity) gắn với nó (primary unit)
– Một architecture thể hiện một chức năng của thực thể
gắn với nó, có thể có nhiều architecture cho một thực
thể
architecture My_Arch of Half_Add is
begin
Sum <= A xor B ;
Note: VHDL’93 cho
Carry <= A and B ;
phép sử dụng reserved
word architecture sau
end My_Arch ;
reserved word end

Hardware Modeling - 1 - 19
Multiple Architecture
• Có thể có nhiều architecture cùng tồn tại để mô tả hoạt
động của một thực thể
– Chúng có thể biểu diễn các giai đoạn khác nhau của quá
trình thiết kế hoặc các cách tiếp cận khác nhau cho cùng
một chức năng (optimization for speed verus area, etc.)
entity Half_Add is entity Cnt64 is
... ...
end Half_Add ; end Cnt64 ;
architecture BEH of Half_Add is architecture BEH of Cnt64 is
... ...
end BEH ; end BEH ;
architecture RTL of Half_Add is architecture RTL of Cnt64 is
... ...
end RTL ; end RTL ;
architecture XLX of Half_Add is architecture XLX of Cnt64 is
... ...
end XLX ; end XLX ;

Hardware Modeling - 1 - 20
Package
• Một package declaration được dùng để khai báo các dữ
liệu dùng cho toàn bộ thiết kế, bao gồm:
– Constants, data types, subtypes, subprogram và function
declarations, v.v…

package My_Pack is
constant. . . library IEEE;
... use IEEE.std_logic_1164.all ;
function. . . ...
... use work.My_Pack.all ;
component . . .
... entity . . .
subtype. . .

end package My_pack ;

Hardware Modeling - 1 - 21
Package Body
• Một package body là một dependent unit của một
package, nó chứa các thông tin chi tiết về các đối
tượng trong package
– Subprograms, deferred constants
package My_Pack is package body My_Pack is
constant. . . function bv_to_integer (BV: bit_v..
... declaration return integer is
function bv_to_integer ( variable …
... details begin
component . . . for index in BV'range loop
... ....
subtype. . .
...
end My_Pack ; end My_Pack ;

Hardware Modeling - 1 - 22
Library
• Về cơ bản, tất cả các đối tượng VHDL đều được lưu
trong các thư viện
– Theo định nghĩa, thư viện là một tập hợp các đơn vị
thiết kế (design unit) đã được kiểm chứng
– Work và std là hai thư viện dùng được cho mọi design
unit

library IEEE ;

package std_logic_1164 is..

package std_logic_unsigned is..

package std_logic_arith is..

Hardware Modeling - 1 - 23
Library
• Libraries và Packages comprise the VHDL Design
Management structure
– Theo một nghĩa nào đó, nó tương tự như directories và
subdirectories

library IEEE ;

package std_logic_1164 is..

package std_logic_unsigned is..

package std_logic_arith is..

Hardware Modeling - 1 - 24
Khởi tạo các Library
• Tên của library đơn thuần là một tham trỏ về mặt
logic
– Chuẩn VHDL không quy định các yêu cầu chặt chẽ về
cấu trúc của library, do vậy chúng không dễ được
chuyển giao giữa các tool

library My_Lib

package Fast_Counters is..
library My_Lib ;
use My_Lib.Fast_Counters.all ; package DSP_Filters is..
entity Mod1 is
port ( . . .

Hardware Modeling - 1 - 25
Khởi tạo các Library
• Thông thường, cần phải tạo các thư viện trong mỗi
tool cụ thể thay vì attach các thư viện đã có ở đâu
đó
– Đặt tên cho library, và sau đó phân tách các design
unit được chọn đưa vào nó

library My_Lib

package Fast_Counters is..
library My_Lib ;
use My_Lib.Fast_Counters.all ; package DSP_Filters is..
entity Mod1 is
port ( . . .

Hardware Modeling - 1 - 26
Work Library
• Đây là thư mục con (sub-directory) mặc định được
dùng để lưu giữ tất cả các đơn vị thiết kế đã được
biên dịch (compiled design units), trừ khi có các chỉ
định khác.
• Mỗi một công cụ mô phỏng hoặc tổng hợp đều sẽ
tạo ra một cấu trúc như thế
– Chú ý: hiển thị ở library là nhãn tên của design unit
chứ không phải là tên của source file

Hardware Modeling - 1 - 27
Work Library
Một ví dụ về nội dung của
work library

Design Unit Identifier

entity HALF_ADD
entity DFF
Secondary (dependent)
entity REG4 design units tham trỏ
package My_Counters. . . tới primary unit tương
ứng với nó
architecture RTL
architecture STRUCTURAL

Hardware Modeling - 1 - 28
Ví dụ về Hierarchy : DFF
entity DFF is
port (D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic) ;
end entity DFF ;
D Q
architecture RTL of DFF is
begin
process (Clock, Reset)
begin
If (Reset = ‘1’ ) then
Q <= ‘0’ ;
elsif (Clock’event and Clock = ‘1’) then Clock
Q <= D ; Reset
end if ;
end process ;
end architecture RTL ;

Hardware Modeling - 1 - 29
Ví dụ về Hierarchy : REG-4
entity REG_4 is
port (D_in : in std_logic_vector (3 downto 0);
REG_4
Clk, Rst : in std_logic;
Q_out : out std_logic_vector (3 downto 0)); D_in(3) DFF Q_out(3)
U3

end REG_4;
architecture Structural of REG_4 is D_in(2) DFF Q_out(2)
U2
component DFF
port ( D, Clock : in std_logic ;
Reset : in std_logic; D_in(1) DFF Q_out(1)
U1
Q : out std_logic ) ;
end component ;
D_in(0) DFF Q_out(0)
begin U0
U3 : DFF port map (D_in(3), Clk, Rst, Q_out(3)); Clk
U2 : DFF port map (D_in(2), Clk, Rst, Q_out(2)); Rst
U1 : DFF port map (D_in(1), Clk, Rst, Q_out(1));
U0 : DFF port map (D_in(0), Clk, Rst, Q_out(0));
end Structural;

Hardware Modeling - 1 - 30
Liên kết Tín hiệu
• Có hai phương pháp liên kết các tín hiệu với các
cổng tương ứng của chúng
– Liên kết theo vị trí: Các tín hiệu ở mức cao được liệt
kê theo đúng trật tự của các cổng (port) ở mức thấp
trong component declaration
• U1: DFF port map (D_in, Clk, Rst, Q_out) ;

component DFF
port (D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic ) ;
end component ;

Hardware Modeling - 1 - 31
Liên kết Tín hiệu
• Có hai phương pháp liên kết các tín hiệu với các
cổng tương ứng của chúng
– Liên kết theo tên: Các cổng (ports) và tín hiệu
(signals) được liệt kê một cách rõ ràng, đầy đủ, không
phụ thuộc trật tự (strongly recommended)
• U1: DFF port map ( D =>D_in(1), Clock =>Clk,

Reset =>Rst, Q =>Q_out(1)) ;

component DFF
port (D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic ) ;
end component ;

Hardware Modeling - 1 - 32
Signal Declaration
• Tất cả các tín hiệu bên trong thực thể cần phải được
khai báo rõ ràng
entity Top is architecture Structural of Top is
port (I1, I2 : in std_logic;
01, 02 : out std_logic) ; component Sub_A
end Top ; port (A1, A2, A3 : in std_logic ;
A4 : out std_logic_vector (3 downto 0)) ;
end component ;

component Sub_B
Top port (B1: in std_logic_vector (3 downto 0 ) ;
B2, B3, B4 : out std_logic) ;
end component ;
Sub_A Sub_B signal Bus_1 : std_logic_vector (3 downto 0) ;
Bus_1 signal Sig_1: std_logic ;
A4 B1
I1 A1 B3 O1
Sig_1 begin
I2 A2 A3 B2 B4 O2 U0 : Sub_A port map (I1, I2, Sig_1, Bus_1) ;
U1 : Sub_B port map (Bus_1, Sig_1, O1, O2) ;

end Structural ;

Hardware Modeling - 1 - 33
Cụ thể hoá phần tử
entity REG_4 is
• Component instantiation
port (D_in : in std_logic_vector (3 downto 0) ; from target library may
Clk, Rst : in std_logic ;
Q_out : out std_logic_vector (3 downto 0)) ; be helpful for chip level
end REG_4 ; optimization ( i.e., Xilinx
architecture Xilinx_Struct of REG_4 is Virtex
D_in(3) ) FDC Q_out(3)
component FDC U3
port (D : in std_logic ;
Clock, Reset : in std_logic ;
Q : out std_logic) ; D_in(2) FDC Q_out(2)
end component ; U2
begin
U3 : FDC port map (D=>D_in(3), Clock=>Clk, Reset=>Rst,
Q=> Q_out(3)) ; D_in(1) Q_out(1)
FDC
U2 : FDC port map (D=>D_in(2), Clock=>Clk, Reset=>Rst, U1
Q=> Q_out(2)) ;
U1 : FDC port map (D=>D_in(1), Clock=>Clk, Reset=>Rst, D_in(0) Q_out(0)
FDC
Q=> Q_out(1)) ; U0
Clk
U0 : FDC port map (D=>D_in(0), Clock=>Clk, Reset=>Rst,
Q=> Q_out(0)) ; Rst

end Xilinx_Struct ;

Hardware Modeling - 1 - 34
Sử dụng Generics
• Generics là các tham số có thể cập nhật động (thay
đổi giá trị) trong từng câu lệnh cụ thể hoá phần tử
của thiết kế (component instantiation)
– Điều này cho phép khai báo các tham số một cách linh hoạt,
mềm dẻo
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned_all;
use IEEE.std_logic_arith.all;

entity My_Cntr is
generic (Count_Width : integer := 8 );
port ( Data_In: in std_logic_vector (Count_Width -1 downto 0);
Clk, Reset, Load, UpDn : in std_logic;
Q_Out: out std_logic_vector (Count_Width -1 downto 0));
end entity My_Cntr;

architecture RTL of My_Cntr is  Lab
• • • • Marker
end architecture RTL;

Hardware Modeling - 1 - 35
Cập nhật giá trị của Generics
• Sử dụng một library IEEE; use IEEE.std_logic_1164.all;
generic map use IEEE.std_logic_unsigned_all; use IEEE.std_logic_arith.all;
entity MY_TOP_DESIGN is
cùng với port port ( DATA_BUS: in std_logic_vector (63 downto 0);
CLOCK, RST, LD, CNTRL : in std_logic;
map, khi có DATA_Out: out std_logic_vector (63 downto 0)) ;
end entity MY_TOP_DESIGN;
một phần tử
được cụ thể architecture STRUCTURAL of MY_TOP_DESIGN is
component My_Cntr
hoá đâu đó generic ( Count_Width : integer := 8 );
trong thiết kế port ( Data_In: in std_logic_vector (Count_Width -1 downto 0);
Clk, Reset, Load, UpDn : in std_logic;
– Nếu không Q_Out: out std_logic_vector (Count_Width -1 downto 0));
end component ;
có generic begin
map, generic U0: My_Cntr generic map (Count_Width => 64)
port map (DATA_BUS, CLOCK, RST, LD, CNTRL, DATA_OUT ) ;
nhận giá trị ••••
mặc định end architecture RTL;

ban đầu

Hardware Modeling - 1 - 36
Biên dịch VHDL
• Có thể có bốn giai đoạn biên dịch ứng với bốn mức
xử lý cho một mô hình phần cứng VHDL
– Analysis (phân tích)
• Design unit được kiểm tra lỗi cú pháp. Sau khi hoàn tất,
nó sẽ được lưu giữ ở work directory
– Elaboration (chỉnh sửa)
• Cấu trúc hierarchy của thiết kế được dàn trải bắt đầu từ
mức cao nhất. Ứng với mỗi sub-module cụ thể chỉ có
một copy duy nhất được tạo ra
– Synthesis (tổng hợp)
• Dạng mô tả netlist của thiết kế được tạo ra hoặc theo
format chuẩn công nghiệp hoặc theo một vendor-specific
format
– Execution (chỉ mô phỏng)
• Mô hình được mô phỏng theo các bước thời gian gián
đoạn. Nó được điều khiển bởi các sự kiện ở các tín hiệu
Hardware Modeling - 1 - 37 đồng bộ quá trình
Quy trình biên dịch
entity DFF
is
port (D, Clk :
in
Reset:
in
Q: out
...
architecture..

Analyze

Execute Elaborate Synthesize

Hardware Modeling - 1 - 38
Trình tự Biên dịch
• Do mối quan hệ giữa các primary và secondary
design unit cũng như khả năng có thể cụ thể hoá
các module ở mức thấp hơn, nên quá trình biên dịch
luôn tuân theo một trật tự nghgiêm ngặt
• Các entity phải được phân tích trước các
architecture tương ứng với chúng
• Các package cần phải được phân tích trước các
package body
• Mỗi một module cần phải được phân tích trước khi
nó được tham trỏ bởi các module khác
– Đây là trình tự biên dịch Bottom-up

Hardware Modeling - 1 - 39
Comments
• Comments (chú thích) có tác dụng làm cho mã
nguồn trở nên dễ hiểu hơn, điều này cũng tương tự
như ở các ngôn ngữ khác

- - Comments bắt đầu bằng hai dấu gạch ngang
- - Chúng chỉ tiếp tục cho đến hết dòng

- - Một comment trên nhiều dòng cần phải dùng
- - hai dấu gạch ngang trên tất cả các dòng

A_OUT <= ‘1’ ; - - Comments có thể viết từ đây

Hardware Modeling - 1 - 40
Kết luận
• VHDL bao gồm các primary và secondary design
unit

• Trật tự biên dịch chương trình VHDL được thực hiện
theo một quy luật chặt chẽ

• Tất cả các design unit đã được kiểm chứng được lưu
trong một thư viện gọi là work library

• Có thể sử dụng Generics để tăng tính linh hoạt của
mã nguồn (source code)

Hardware Modeling - 1 - 41
Bài 3

Signals và
Data Types

Hardware Modeling - 1 - 42
Data Types
• Data types là một yếu tố quan trọng trong VHDL
(cũng như trong các ngôn ngữ khác)
– Mỗi một kiểu dữ liệu chỉ cho phép nhận các giá trị
trong một giải nhất định
– Mỗi đối tượng (signal, variable, constant, hoặc port)
cần phải có kiểu dữ liệu nhất định khi được khai báo
(declared)
• VHDL là một ngôn ngữ định kiểu rất chặt chẽ
– Các tín hiệu liên kết với nhau cần phải có cùng kiểu
• Trong VHDL có nhiều kiểu dữ liệu cho phép mô tả
phần cứng và kiểm tra lỗi nhằm đảm bảo sự tương
thích tín hiệu trong các mô hình lớn và phức tạp
– Cần tuân thủ quy tắc kiểm tra kiểu trong các mô hình
cả hành vi (behavioral) và mức cổng (gate-level)

Hardware Modeling - 1 - 43
Signals và Ports
• Kiểu dữ liệu và độ rộng bus cần phải phù hợp trong
các lệnh gán tín hiệu (signal) và cổng vào ra (port)

entity REG_4 is
port (D_in1 : in std_logic_vector (3 downto 0);
Cntrl : in std_logic_vector (1 downto 0);
Clock, Reset : in std_logic;
Q_out : out std_logic_vector (3 downto 0));
end entity REG_4;

A <= C; ✔
signal A : integer ;
signal B : bit ; A <= C + 1; ✔
signal C : integer ; A <= B; ✘
signal D : std_logic ;
D <= C; ✘
B <= D; ✘
Q_out <= Cntrl; ✘

Hardware Modeling - 1 - 44
Các loại data type trong
VHDL
• Có 4 categories (loại) data types trong VHDL
– Scalar
• Single value object, defined indices, ordered
– Composite
• Group objects, similar or different types
– Access
• Defines pointers to objects
• covered in Advanced VHDL course
– File
• Sequence of objects of given type
• covered in Advanced VHDL course

Hardware Modeling - 1 - 45
Scalar Data Types
• Kiểu dsữ liệu vô hướng nhận các giá trị đơn lẻ.
Trong VHDL, lớp các data type này gồm có:
– Bit
– Boolean
– Integer
– Real
– Physical
– Character
– Std_logic and std_ulogic
– Enumerated

Hardware Modeling - 1 - 46
Bit và Boolean
• Vừa đủ để mô hình hoá phần cứng, nhưng nó không
cho phép mô tả các giá trị high-impedance,
unknown, don’t care, v.v...
architecture BEHAVE of MUX is
signal A,B,Sel, Z : bit ;
begin
type bit is (‘0’, ‘1’) ; if Sel = ‘1’ then
Z <= A ;
else
Z <= B ;
end if . . .

• Thích hợp cho việc mô hình hoá ở mức khái niệm lý
thuyết if Sel =‘1’, if F >= G..
type boolean is (false, true) ; both yield boolean result

Hardware Modeling - 1 - 47
Integer và Real
• Chấp nhận các giá trị và các đại lượng một cách trực
quan và linh hoạt
– Cần phải quy định giải giá trị cho các kiểu nguyên
(integer), nếu không nó sẽ sử dụng giải giá trị mặc
định với số nguyên 32-bit

type integer is range . . . signal A : integer range 0 to 7;
signal B : integer range 15 downto 0 ;

• Cho phép người thiết kế sử dụng các giá trị floating
point
Khai báo các kiểu real với giải giá trị thực nhất định

– Cách dùng giá trị kiểu ‘Real’ không giống như ‘Integer’
type CAPACITY is range -25.0 to 25.0 ;
type real is range . . . signal Sig_1 : CAPACITY := 3.0 ;

Hardware Modeling - 1 - 48
Physical
• Kiểu vật lý (Physical type) được dùng để định lượng
các đại lượng vật lý như là khối lượng, độ dài, thời
gian
• Kiểu vật lý được định nghĩa theo đơn vị cơ sở của nó
– Bất kỳ đơn vị dẫn xuất nào cũng là bội của đơn vị cơ sở

type time is range 1 to 1000000
Time là kiểu vật lý duy nhất được định
units nghĩa trong VHDL. Nó rất cần thiết cho
fs; việc mô phỏng thời gian trễ và các tham
số khác có liên quan thời gian.
ps = 1000 fs;
ns = 1000 ps; constant Tpd : time := 3ns ;
us = 1000 ns; ...
Z <= A after Tpd ;
ms = 1000 us; . . .

Hardware Modeling - 1 - 49
Std_logic và Std_ulogic
• Std_logic được phát triển từ hệ thống MVL (Multi-
Value Logic) và được dùng để mô hình hoá phần
cứng một cách chi tiết hơn so với kiểu bit
– Hỗ trợ các mức giá trị khác nhau của tín hiệu: don't-care
conditions, unknown, three-state …
– Được định nghĩa trong gói IEEE std_logic_1164
type std_ulogic is ( ‘U’, -- Uninitialized
‘X’, -- Forcing Unknown
‘0’, -- Forcing Zero
‘1’, -- Forcing One Recall: type bit is
‘Z’, -- High Impedance limited to (‘0’, ‘1’).
‘W’, -- Weak Unknown
‘L’, -- Weak Zero
‘H’, -- Weak One
‘ - ‘ -- Don’t Care
);

Hardware Modeling - 1 - 50
So sánh Std_logic và

Std_ulogic
Cả hai kiểu đều chứa cùng một tập các giá trị như nhau
– Sự khác nhau ở chỗ thực hiện mạch (implementation)
– Chữ u trong ulogic có nghĩa là unresolved
• Nếu người thiết kế sử dụng hai hay nhiều tín hiệu điều
khiển một cửa ra chung thì anh ta phải dùng một hàm
resolution (có trong gói ieee_std_1164) để quyết định
trên thực tế tín hiệu nào được đưa tới cửa ra
• Std_ulogic không có khả năng đó, nhưng nó tạo ra một
công cụ nội tại để kiểm tra các lỗi wired-oring do sơ suất
signal A,B,C,Res_Out : std_logic ;
signal Out_1 : std_ulogic ;

Out_1 <= A ; Res_Out <= A;
Out_1 <= B ; Res_Out <= B;
A A Res_Out <= C;
Out_1 <= C ;
B X Out_1 B ✔ Res_Out
C C

Hardware Modeling - 1 - 51
Signal Resolution
• Một cửa ra cụ thể không thể có nhiều tín hiệu điều
khiển kiểu wire-or
– Để mô hình một cửa ra ba trạng thái, ta sử dụng một
lệnh gán tín hiệu có điều kiện và data-type là
std_logic:
signal A,B,C,Res_Out : std_logic ;

Res_Out <= A when En0 = ‘1’ else ‘Z’ ; En0
Res_Out <= B when En1 = ‘1’ else ‘Z’ ;
A
Res_Out <= C when En2 = ‘1’ else ‘Z’ ;
En1

B ✔ Res_Out
En2
C

Hardware Modeling - 1 - 52
Enumerated (liệt kê)
• Tăng mức độ linh hoạt trong việc mô hình hoá phần
cứng
– Các kiểu liệt kê do người dùng định nghĩa sử dụng các giá
trị có thể nhận biết một cách dễ dàng và thích hợp với hoạt
động của mô hình
– Làm cho các chương trình dễ hiểu hơn nhất là khi mô tả các
máy trạng thái (hệ logic dãy) hoặc các hệ thống phức tạp

type My_State is ( RST, LOAD, FETCH, STOR, SHIFT ) ;
...
signal STATE, NEXT_STATE : My_State ;
...
case (STATE) is
when LOAD => . . .
if COND_A and COND_B then
NEXT_STATE <= FETCH ;
else NEXT_STATE <= STOR ;

Hardware Modeling - 1 - 53
Composite Data Types
• Các data type hỗn hợp là sự kết hợp các phần tử dưới
dạng một array hoặc một record
– Bit_vector, Std_logic_vector và String là các kiểu hỗn hợp
đã được định nghĩa trong VHDL

signal A_word : bit_vector (3 downto 0) := “0011” ;

• Câu lệnh này tạo nên một kiểu bit_vector (array) từ một
nhóm 4 bit
– Trong VHDL không định nghĩa đâu là LSB hoặc MSB; do
vậy, khi biên dịch giá trị này không được tự động hiểu là ‘3’
Chú ý: dùng dấu trích kép (“0011”) cho các đối tượng có
kiểu bit_vector, std_logic_vector hoặc string, và dùng dấu
trích đơn (‘1’) cho các đối tượng có kiểu bit, std_logic và
character

Hardware Modeling - 1 - 54
Array
• Array là nhóm các phần tử đơn có cùng kiểu (type)
ban đầu
type WORD is array (3 downto 0) of std_logic ;

signal B_bus : WORD ;
B_bus
Nếu B_bus có
kiểu WORD,
giá trị có thể
3 2 1 0
có của các index position
phần tử là?
Còn nếu
B_bus có kiểu signal B_bus : DATA ;
DATA?
type DATA is array (3 downto 0) of integer range 0 to 9 ;

Hardware Modeling - 1 - 55
Phép gán các Array
• Khi gán giá trị một array cho một array khác, thì:
– 1. Các array cần phải có cùng kiểu giá trị
– 2. Các array phải có cùng độ dài
– 3. Phép gán được thực hiện theo vị trí, từ trái sang
phải
signal My_BusA, My_BusB: bit_vector (3 downto 0) ;
signal My_BusC : bit_vector (0 to 3) ;

My_BusB <= My_BusA ; My_BusC <= My_BusA ;
3 2 1 0 3 2 1 0

My_BusA My_BusA

My_BusB My_BusC

3 2 1 0 0 1 2 3
Inadvertent bit-swap?

Hardware Modeling - 1 - 56
Cách viết lệnh gán Array
• Để đơn giản các phép gán array – và làm cho
chương trình dễ đọc hơn - người thiết kế có thể sử
dụng các giá trị ở cơ số 16 (hexadecimal) hoặc 8
(octal)
– Có thể sử dụng dấu gạch dưới các giá trị biến cho dễ
đọc
signal Data_Word : std_logic_vector (11 downto 0) ;

Data_Word <= X”A6F”;
Data_Word <= ”101001101111” ;

Data_Word <= O”5157”;
Data_Word <= B”1010_0110_1111” ;

Hardware Modeling - 1 - 57
Records
Record là nhóm các
type OPCODE is record phần tử đơn có kiểu
PARITY : bit; ban đầu có thể khác
ADDRESS : std_logic_vector ( 0 to 3 ); nhau.
DATA_BYTE : std_logic_vector ( 7 downto 0 );
NUM_VALUE : integer range 0 to 6;
STOP_BITS : bit_vector (1 downto 0);
end record ;
...
signal TX_PACKET, RX_PACKET : OPCODE;

...
PARITY ADDRESS DATA_BYTE NUM_VALUE STOP_BITS

TX_PACKET

Hardware Modeling - 1 - 58
String
signal Warning1: string (1 to 30) := “ Unexpected Outputs Detected” ; String là array
--declared within the architecture của các character
variable Warning2: string (1 to 30) := “ Unstable, Aborting Now” ;
--declared within the process
constant Warning3: string (1 to 20) := “ Entering FSM State2” ;
--declared within the package or architecture

process ( A_sig , B_sig, C_sig )
process ( A_sig , B_sig, C_sig )
begin
begin
if (A_sig and B_sig ) /= ‘1’ then
if (A_sig and B_sig ) /= ‘1’ then
report “ Unexpected Outputs…” ;
report Warning1;
elsif ( A_sig and C_sig ) = ‘1’ then
elsif ( A_sig and C_sig ) = ‘1’ then
report “ I need a vacation “;
report Warning2 & “ Problem Mod2“;
end if ;
end if ; process ( A_sig , B_sig, C_sig ) end process ;
end process ; begin
assert (A_sig and B_sig ) /= ‘1’ then
report Warning1;
severity note ;
end if ;
end process ;

Hardware Modeling - 1 - 59
Phép gộp các Array
• Phép gộp (Aggregate) là một công cụ tiện lợi để
nhóm các kiểu dữ liệu (data type) cả vô hướng và
phức hợp trong các phép gán
signal H_BYTE, L_BYTE: std_logic_vector ( 0 to 7);
signal Q_Out : std_logic_vector (31 downto 0);
signal A, B, C, D : std_logic;
signal WORD : std_logic_vector (3 downto 0);

(A,B,C,D)<=WORD; Only scalar data variables are allowed on the
left-side aggregates.
WORD <= ( 2 => ‘1’, 3 => D, others =>
‘0’ ) ;Q_Out <= ( others => ‘0’ )
; WORD <= ( A, B, C,
D ) ; H_Byte <= ( 7|6|0 => ‘1’, 2 to 5 => ‘0’ ) ;

The total number of elements on both sides of any assignment must
match, “others” can be used as a default assignment, regardless of the
array size

Hardware Modeling - 1 - 60
Gộp các Record
• Phép gộp (Aggregate) là một công cụ tiện lợi để
nhóm các kiểu dữ liệu (data type) cả vô hướng và
phức hợp trong các phép gán
type D_WORD is record
UPPER : std_logic_vector (7 downto 0 ) ;
LOWER : std_logic_vector (7 downto 0 )
;
end record ;
signal DATA_WORD : D_WORD ;
signal H_BYTE, L_BYTE: std_logic_vector (7
downto 0);
DATA_WORD <=signal
( H_BYTE, L_BYTE)RX_PACKET
TX_PACKET, ; Only records can accept
: OPCODE; --
defined aggregate of arrays
TX_PACKET <=earlier
( ‘1’,”0011”,”11101010”,5,”10” ) ;
DATA_WORD <= ( LOWER => L_BYTE, UPPER=> H_BYTE)
;
TX_PACKET. ADDRESS <= ( “0011” ) ;
TX_PACKET. ADDRESS(2) <= ‘0’ ;
DATA_WORD <= ( LOWER | UPPER=>
H_BYTE);
DATA_WORD <= ( others =>
H_BYTE);

Hardware Modeling - 1 - 61
Tạo lập các Array 2-D
• Khi cần mô hình hoá các cấu trúc bộ nhớ, người
thiết kế phải tạo ra một cấu trúc array 2 chiều (2-D
structure)
– Đây thực sự là một array của các array (hoặc các
record)

7 6 5 4 3 2 1 0
type Mem_Array is 0
array ( 0 to 3 ) of
std_logic_vector ( 7 1
downto 0);
signal My_Mem : 2
Mem_Array ;
3

Hardware Modeling - 1 - 62
Tạo Array của các

Record
Array của các record thường được dùng trong các
ứng dụng xử lý gói tin (packet handling)

type OPCODE is record
PARITY : bit;
ADDRESS : std_logic_vector ( 0 to 3 );
DATA_BYTE : std_logic_vector ( 7 downto 0 );
type Data_Array is array ( 0 to
NUM_VALUE : integer range 0 to 6; 2 ) of OPCODE ;
STOP_BITS : bit_vector (1 downto 0);
end record ; signal My_Data : Data_Array ;
...
signal TX_PACKET, RX_PACKET : OPCODE;
My_Data
...
PARITY ADDRESS DATA_BYTE NUM_VALUE STOP_BITS

...

...
Hardware Modeling - 1 - 63
Phép gán các Array 2-D
• Với hầu hết các ứng dụng của memory, vector địa
chỉ Read/Write được chuyển thành dạng integer, để
tham trỏ tới một phần tử trong array 2-D
- Hàm biến đổi conv_integer có trong gói
ieee.std_logic_unsigned
type Mem_Array is array ( 0 to 3 ) of std_logic_vector ( 7
downto 0 );
signal My_Mem : Mem_Array ;
signal R_Addr, W_Addr : std_logic_vector (1 downto 0 ) ;
7 6 5 4 3 2 1 0
0
My_Mem (conv_integer(
1 W_Addr)) <= Data_In ;
...
2 D_Out <= My_Mem
(conv_integer (R_Addr));
3

Hardware Modeling - 1 - 64
Initializing a ROM Array
• Với các ứng dụng ROM, phép kết tập (aggregate) là
một công cụ tiện ích để kích hoạt mạng array 2-D

type ROM_Array is array ( 0 to 3 ) of
std_logic_vector ( 7 downto 0);
constant My_ROM : ROM_Array := --continued
below
7 6 5 4 3 2 1 0
0 constant My_ROM :
ROM_Array := (
0 => (others => ‘1’) ,
1
1 => “10100010”,
2 => “00001111”,
2 3 => “11110000” ) ;

3

Hardware Modeling - 1 - 65
Kiểu con trong VHDL
• Một kiểu con (subtype) trong VHDL là một tập hợp
có hạn chế của một kiểu (type) đã có
– Kiểu đã có cũng có thể là một kiểu đã được định nghĩa
trong IEEE1076 hoặc cũng có thể do người dùng tạo
ra
subtype My_Int is integer range 0 to 255 ;

Label Base Type Constraint

subtype My_Small_Int is My_Int range 5 to 30 ;

 Các kiểu con (Subtypes) thường được dùng để phát
hiện lỗi ‘out-of-range’ trong kết quả mô phỏng, và
cũng có thể có tác dụng tối ưu hoá quá trình tổng hợp
logic
Hardware Modeling - 1 - 66
Sử dụng kiểu con trong
VHDL
type My_State is ( Load, Jump, Add, Sub, Div, Mult, StorA, StorB) ;
signal Curr_State, Next_State : My_State ;

subtype Arith_Ops is My_State range Add to Mult ;

Label Base Type Constraint

subtype My_OHE_State is std_logic_vector ( 3 downto 0 ) ;
constant Init_St0 : My_OHE_State := “0001” ;
constant Load_St1 : My_OHE_State := “0010” ;
constant Jump_St2 : My_OHE_State := “0100” ;
constant Stor_St3 : My_OHE_State := “1000” ;

Hardware Modeling - 1 - 67
Bài 4

Operators và
Expressions

Hardware Modeling - 1 - 68
Các toán tử trong VHDL
• VHDL chứa một lượng lớn các toán tử (operator)
dùng cho việc mô hình hoá phần cứng

• Tuy nhiên, mỗi toán tử được sử dụng với (những)
kiểu dữ liệu (data type) nhất đ ịnh
– Đặc biệt, cần lưu ý các toán tử số học (arithmetic)
không dùng được với các kiểu dữ liệu phức hợp
(bit_vector and std_logic_vector), vì các array không
có giá trị bằng số tường minh

• Các Function (subprogram) được tạo ra để khắc
phục những vấn đề liên quan
– Các hàm này có trong các gói được gọi là “arithmetic
packages”

Hardware Modeling - 1 - 69
Operator Overloading
• Operator overloading (chồng hàm) trong VHDL có
nghĩa là một toán tử cụ thể (ví dụ, ‘+’ ) có thể được
dùng với các data type khác nhau
– Điều này xảy ra do các subprogram riêng biệt được
viết cho từng data type nhất định
signal A, B : std_logic_vector ( 3 downto 0 ) ;
signal C, D : integer range 0 to 31 ;
signal Q_Out : std_logic_vector ( 15 downto 0 );

Y <= A + B ; -- add 2 vectors
F <= C + D ; -- add 2 integers
Q_Out <= Q_Out + 1; -- add vector and integer

Compiler tự động chọn sub-function thích hợp dựa
trên data type của các operands

Hardware Modeling - 1 - 70
Các toán tử Logic
• Các logical operator được định nghĩa với các toán
hạng có kiểu (data type) bit, boolean, bit_vector và
std_logic_vector
A
Z and
B or
F nand
Z <= A and B ;
nor
H
xor
Y
not
G
xnor (VHDL-93)
Y <= G or ( F and H ) ;

Hardware Modeling - 1 - 71
Các toán tử Logic với biến
kiểu Array
signal A_vec, B_vec, C_vec : bit_vector ( 7 downto 0 ) ;

A_vec (7)
C_vec (7)
B_vec (7)
A_vec (6) C_vec <= A_vec and B_vec ;
C_vec (6)
B_vec (6)
A_vec (5)
C_vec (5)
B_vec (5)
. Quy tắc sử dụng với biến kiểu
. Array
. 1. Các array phải có cùng kiểu
A_vec (0)
C_vec (0)
(type)
B_vec (0) 2. Các array phải có cùng kích
thước
3. Phép toán thực hiện với các
Hardware Modeling - 1 - 72
phần tử cùng vị trí trong mỗi
Các toán tử quan hệ
• Các toán tử quan hệ có thể dùng với hầu hết các
data type
• Tất cả các toán tử quan hệ đều cho kết quả kiểu
(type) Boolean
= Equality signal FLAG_BIT :
/= Inequality boolean ;
< Less than signal A, B : integer ;
<= Less than or equal
> Greater than FLAG_BIT <= ( A > B
>= Greater than or equal );

Nếu A lớn hơn B, FLAG_BIT sẽ được gán giá trị true, ngược lại
FLAG_BIT được gán giá trị false

Hardware Modeling - 1 - 73
Toán tử quan hệ với các
Array
signal A_vec : bit_vector ( 7 downto 0 ) := “11000110” ;
signal B_vec : bit_vector ( 5 downto 0 ) := “111001” ;

Rules for use on Arrays
1. Arrays must be same type
2. Arrays may be different lengths
3. Arrays of different lengths are aligned left
and then lexically compared -- Compares
ASCII values
if ( A_vec > B_vec )
then
State <= Normal
else
• Ví dụ này cho kết quả là false State <= Code_Red
– endphải.
Các vector được so sánh từ trái sang if …Việc so sánh
được thực hiện lần lượt theo từng phần tử
• Quy tắc: để đảm bảo phép so sánh số được hợp lý
các array cần phải có cùng kích thước

Hardware Modeling - 1 - 74
Các toán tử số học
• Các toán tử số học dùng với các kiểu dữ liệu (data
type) integer, real, và physical

• Các toán tử số học vốn không dùng với các dữ liệu
có kiểu array signal A_num, B_num : integer range 0 to 15 ;
+ Addition
signal Z_num : integer range 0 to 31 ;
- Subtraction Z_num <= ( A_num + B_num ) ;
* Multiplication
A_num
/ Division
abs Absolute Value + Z_num
** Exponentiation
B_num
Infers a 5-bit adder

Hardware Modeling - 1 - 75
Phép tính số học với các
biến Array
• Để thực hiện các phép tính số học cần có các
function định nghĩa sẵn trong IEEE hoặc từ các hãng
cung cấp phần mềm thiết kế
– Các function như vậy thường được đặt trong các gói
gọi là “arithmetic packages”. Một số công cụ (tool)
dịch sẵn các gói này và đặt ở thư viện của chúng
– Các gói std_logic_unsigned và std_logic_arith được
xác lập trong thư viện IEEE để phát huy khả năng
trao đổi mã nguồn giữa các công cụ khác nhau
package STD_LOGIC_UNSIGNED is
function “+” (A,B: std_logic_vector) return std_logic_vector ;
function “+” (A: std_logic_vector, B: integer ) return std_logic_vector ;
function “+” (A,B: std_logic_vector) return integer ;
....
library IEEE ;
use IEEE.std_logic_1164.all ;
• Toán tử “+” là overloaded use IEEE.Std_Logic_Unsigned.all ;
use IEEE.Std_Logic_Arith.all;

Hardware Modeling - 1 - 76
Array Arithmetic
• Nếu có các function thích hợp có thể dùng được
trong module thiết kế (thông qua mệnh đề “use”),
thì compiler sẽ tự động truyền tham số cho trả lại
kết quả tính từ subprogram đó
– Nếu không, compiler sẽ thông báo lại rằng các
operator đó là “undefined”

signal A_vec : std_logic_vector ( 7 downto 0 ) := “11001001” ;
signal B_vec : std_logic_vector ( 7 downto 0 ) := “11100100 ” ;
signal Z_vec : std_logic_vector ( 8 downto 0 ) ;
signal D_int : integer range ( 0 to 9 ) ;

Z_vec < = A_vec + B_vec ;
Z_vec < = A_vec + D_int ;

Hardware Modeling - 1 - 77
Các toán tử Shift (dịch)
• Các toán tử Shift được định nghĩa trong VHDL-93 và
rất hay được sử dụng, nhất là khi cần mô tả hoạt
động của các phần tử trong cấu trúc máy tính
• Mỗi toán tử có hai toán hạng, toán hạng trái có kiểu
array one-dimension (1-D) và toán hạng phải có
kiểu nguyên (integer) chỉ số bước cần dịch (hoặc
quay). Số âm cũng được dùng để chỉ chiều dịch
(hoặc quay) ngược lại
• Kết quả của các phép dịch (hoặc quay) có cùng kiểu
và kích thước với toán hạng trái

Hardware Modeling - 1 - 78
Các toán tử Shift (dịch)
• sll - Logical left shift
• srl - Logical right shift
• sla - Arithmetic left shift
• sra - Arithmetic right shift
• rol - rotate left logical
• ror - rotate right logical

Hardware Modeling - 1 - 79
Shift Operator - Các ví dụ

• Ví dụ:
signal A_vec : bit_vector (7 downto 0) := “11000110”;
signal D_vec : bit_vector (7 downto 0);

D_vec <= A_vec sll 2; “00011000”
D_vec <= A_vec sra 2; “11110001”
D_vec <= A_vec ror 3; cho kq “11011000”
D_vec <= A_vec srl 2; “00110001”
D_vec <= A_vec sra -2; “00011000”

Hardware Modeling - 1 - 80
Concatenation
• Toán tử nối (concatenation) “&” cho phép kết nối
các biến kiểu scalar và kiểu array thành kiểu array
lớn hơn
– Các phép gán được thực hiện với sự tương hợp vị trí
(positional association)
signal A_vec, B_vec : std_logic_vector ( 7 downto 0 ) ;

signal Z_vec : std_logic_vector ( 15 downto 0 ) ;
signal A_bit, B_bit, C_bit, D_bit : std_logic ;
signal X_vec : std_logic_vector ( 2 downto 0 ) ;
signal Y_vec : std_logic_vector ( 8 downto 0 ) ;
Z_vec <= A_vec & B_vec ;
X_vec <= A_bit & B_bit & C_bit ;
Y_vec <= B_vec & D_bit ;

Hardware Modeling - 1 - 81
Nhóm các toán tử
• Có thể sử dụng dấu ngoặc đơn để nhóm các toán tử
trong một biểu thức đã cho làm cho nó dễ đọc hơn

Z <= A + B + C + D ; Z <= ( A + B ) + ( C + D ) ;

A A
+ + B +
B
C
D
+ Z C + Z
D +
3 logic levels 2 logic levels

This is especially important when the target
technology is LUT (Look-Up Table) based. Each added
level of logic incurs additional block and routing delays

Hardware Modeling - 1 - 82
Các Slice của Array
• Một nhóm các phần tử kề cận nhau trong một array
được goại là một slice và có thể được tham trỏ đồng
thời
– Các phần tử khác của array không bị ảnh hưởng bởi
phép gán slice
signal A_vec, B_vec : std_logic_vector (7 downto
0) ;
signal Z_vec : std_logic_vector (15 downto 0) ;
signal A_bit, B_bit, C_bit, D_bit : std_logic ;
Z_vec (15 downto 8) <= A_vec ;
B_vec <= Z_vec (12 downto 5) ;
A_vec (1 downto 0) <= C_bit &
D_bit ;
... ✘
Z_vec (5 downto 1) <= B_vec (1
The direction (ascending or descending) of the
to 5 ) ; slice must be consistent with the direction of the
array as it was originally declared
Hardware Modeling - 1 - 83
Slice và Concatenation
• Ví dụ, để mô hình hoá một biểu thức có điều kiện với các
phần tử được chọn không liền nhau (9,8,3,2,1, và 0) từ
‘Status’ bus gồm 16-bit
– Giải mã toàn bộ bus có thể làm tăng số lượng mạch logic tổ
hợp và làm cho thiết bị làm việc chậm hơn)

signal Status_Bus : std_logic_vector (15 downto
0) ;
process ( Status_Bus )
begin process ( Status_Bus )
Will Not Compile!
case ( Status_Bus ) is begin
when “1101111101010011” => case ( Status_Bus(9 downto 8) & Status_Bus (3 downto 0)) is
< sequential statement(s) > ; when “110011” =>
when . . . < sequential statement(s) > ; process ( Int_Bus )
Inefficient !! when . . . begin
case ( Int_Bus ) is
when “110011” =>
signal Int_Bus : std_logic_vector ( 5 downto 0 < sequential statement(s) > ;
); when . . .
Optimal !!
...
Int_Bus <= Status_Bus ( 9 downto 8 ) &
Status_Bus ( 3 downto 0 ) ;
Hardware Modeling - 1 - 84
Bài 5

Các câu lệnh
Concurrent và
Sequential

Hardware Modeling - 1 - 85
Mô hình hoá phần cứng
• Để mô hình hoá một thực thể phần cứng một cách
có hiệu quả, VHDL sử dụng cả các câu lệnh
concurrent (đồng thời) lẫn sequential (tuần tự)
• Các câu lệnh được gọi là concurrent khi chúng được
thực hiện không tuỳ thuộc vào vị trí của chúng
trong chương trình
• Các câu lệnh được gọi là sequential khi chúng được
thực hiện một cách tuần tự theo trình tự viết chúng
trong chương trình, giống như các lệnh trong các
phần mềm thông thường
– Tất cả các câu lệnh viết trong một process là những
lệnh sequential

Hardware Modeling - 1 - 86
Cấu trúc ngôn ngữ
architecture RTL of ENTITY_1 is
. . .
begin
concurrent statements ;
...
process
begin
sequential statements ;
...
end process ; • Mọi câu lệnh nằm
...
concurrent statements ;
ngoài một process đều
... là lệnh concurrent
process
begin
sequential statements ;
...
end process ;
...
end architecture RTL ;

Hardware Modeling - 1 - 87
Process
• Một process bao gồm
architecture RTL of My_And2 is
các câu lệnh sequential begin
– Các câu lệnh trong một ...
process (A, B)
process được thực hiện begin
lần lượt C <= A and B ;
end process ;
• Mỗi process đều phải ...
được hoạt kích theo một end architecture RTL;
cách nhất định
– Thường là do sự thay
đổi của các tín hiệu
trong process, hoặc các
điều kiện cụ thể trong
một câu lệnh ‘wait’

Hardware Modeling - 1 - 88
Các Process là đồng thời
• Trong việc mô hình hoá phần cứng, quan điểm về
concurrency (tính đồng thời) là rất cần thiết
– Bất kỳ sự thay đổi nào ở tín hiệu ‘C’ - cửa ra của cổng
G1, cũng đều được đồng thời đưa tới cửa vào của các
cổng G2 và G3
Process 1 Process 2
A
C C If C = ‘1’
G2 C<=A and B
B G1 then
...
C ...

Process 3
G3 process (C,..)
begin

Hardware Modeling - 1 - 89
Mô hình kết nối trong VHDL
• Chỉ có các tín hiệu (signal) là có thể chuyển giá trị
từ một process sang một process khác
– Các process concurrent, được liên kết bởi các tín hiệu,
thường được gọi là VHDL Connectivity Model (mô hình
kết nối)
Process n Process n1
Sig1
C If C = ‘1’
C<=A and B Process n3
then
... Sig2
C ...

Process n4 process (...
Process n2
process n process (C,..) Rst
begin

Hardware Modeling - 1 - 90
Các thành phần của Process
Signals in sensitivity
Keyword list create implied
“wait” condition
Optional Label architecture Behave of DFF is
begin
...
Reg1: process (Clock, Reset)
begin
Signal updated with if Reset = ‘1’ then
new value when Q <= ‘0’ ;
process suspends elsif ( Clock’event and Clock = ‘1’ ) then
Q <= D ;
end if ;
end process; All statements within
Keywords “end”
and “process” ... the process are handled
end Behave ; sequentially, in order

Hardware Modeling - 1 - 91
Bên trong và bên ngoài
Process
architecture ...
B Out1
process ( )
begin
Out1 <= A;
Out1 <= B; Chỉ có phép gán cuối cùng
... là có hiệu lực
end process ;
end architecture ;
A
architecture . . . ? Out1
begin
Out1 <= A; B
Out1 <= B;
... Cần phải có một hàm
end architecture ; resolution cho tín hiệu ra
‘Out1’

Hardware Modeling - 1 - 92
Tạm dừng các Process
• Mỗi process cần phải có một cơ chế để kích hoạt,
điều đó cũng có nghĩa là có cơ chế để tạm dừng
(suspending) process
– Điều này tạo nên trạng thái đợi (wait) cho process
• Với đoạn mã RTL, các tín hiệu trong sensitivity list
tạo nên một điều kiện wait mặc địnhcho process
• Đối với các mô hình hành vi, người thiết kế thưòng
dùng các câu lệnh wait. Trong VHDL có bốn dạng
lệnh wait
wait on... wait on A,
An event on given signal
wait until... A specific condition wait
B ; until CLK = ‘1’
wait for ... A specified time amount ;wait for 10 ns ;
wait wait;
Indefinite suspension

Hardware Modeling - 1 - 93
Các điều kiện Wait
• Ví dụ dưới đây so sánh các điều kiện ‘wait’ từ các
câu lệnh được viết rõ ràng (explicit) và điều kiện
‘wait’ ẩn ý (implicit)
– Note: Một số compiler dùng tổng hợp mạch không hỗ
trợ điều kiện explicit ‘wait’
process (A, B) process process
begin begin begin
C <= A and B ; wait on A, B ; C <= A and B ;
end process ; C <= A and B ; wait on A, B ;
end process ; end process ;

FYI: Another important consideration is that all processes are initialized before
simulation, that means they are run until the first ‘wait’ condition is met

Given that fact, what is the value on ‘C’ at simulation time zero—assuming use of
std_logic for each of the examples above ?

Hardware Modeling - 1 - 94
Modeling Concurrency
• Công cụ mô phỏng VHDL được hoạt kích theo sự kiện
– Tại một thời điểm bất kỳ trong thời gian mô phỏng, (1) tất
cả các process được thực hiện cho đến khi bị tạm dừng, (2)
giá trị của các tín hiệu được cập nhật, (3) sự thay đổi giá trị
ở các tín hiệu làm cho các process liên quan được thực hiện
• Thời gian giữa các công đoạn này được gọi là delta cycle
• Theo cách đó, các process và các lệnh concurrent được
coi như xảy ra đồng thời tại mỗi điểm mô phỏng

Concurrent Operations

Delta cycles in-between Delta cycles in-between
...
Simulation discrete time step D1 D+1 D+2 . . . D+n D1 D+1 D+2

998 999 1000 1001 1002

Hardware Modeling - 1 - 95
Sắp xếp trình tự các Event
• Cơ chế sắp xếp trình tự các event là hạt nhân của
môi trường mô hình hoá hành vi trong VHDL

• Mỗi hoạt động (transaction) của thực thể được sắp
đặt ở một thời điểm thích hợp

• Bước thời gian chỉ tăng lên khi không còn
transaction nào khác ở thời điểm mô phỏng

Hardware Modeling - 1 - 96
Scheduling Events
Delta cycles Delta cycles ...
Simulation discrete time steps D1 D+1 D+2 . . . D+n D1 D+1 D+2
ns
t t+1 t+2 t+3 t+4

Transaction Queue
Out1 <= ‘1’ ; t+3 t+4 t+5
Out2 <= ‘0’ ;
... Out1<= ‘1’ Int <= ‘1’ Data<= ‘0’
Int <= ‘1’ after 1 ns; ... ...
Out2<= ‘0’
Delta Cycles

...
Data <= ‘0’ after 2 ns; ...
...

Discrete Time

Hardware Modeling - 1 - 97
Transactions
• Câu lệnh gán tín hiệu “Z <= A” tạo ra một
transaction trong VHDL
process (. . .)
begin
Z <= A ;
F <= G ;
...
end process ;

• Cụ thể, giá trị hiện tại của A được đọc và được dùng
để gán cho tín hiệu Z

Hardware Modeling - 1 - 98
Events
• Nếu giá trị của “Z” hoặc “F”
thực sự có thay đổi sau lệnh
process (A, G)
gán (transaction), ta nói có begin
một event xuất hiện ở tín Z <= A;
hiệu đó F <= G;
...
• Mỗi một phép gán tín hiệu end process ;
đều gây ra một
transaction, nhưng không Process 1 Process 2
phải tất cả các transaction
đều làm xuất hiện các event Z<=A;
Z If Z = ‘1’
ở tín hiệu được gán ...
then
...
• Một event ở một tín hiệu đã Z Process 3
cho có thể hoạt kích một
process chỉ khi tín hiệu đó process (Z,..)
có tên trong sensitivity list begin

của proccess
Hardware Modeling - 1 - 99
Building Registers
process ( Clk)
begin

Mọi phép gán tín hiệu xảy ra sau
if (Clk’event and Clk = ‘1’) then
C <= A and B ; mệnh đề:
end if;
end process; if clock’event and clock = ‘1’ then...

đều tạo ra một cấu trúc thanh
ghi (register)

A C
B
Clk

Hardware Modeling - 1 - 100
Khái quát về Signal và
Variable trong VHDL
• Hầu như mọi kết nối giữa các điểm trong một thực thể
đều có thể được mô hình hoá bằng signal (tín hiệu) hoặc
variable (biến)
• Tuy nhiên, cần phân biệt cách dùng, các khả năng và
những hạn chế của từng đối tượng này
• Ở mức thực thể, tất cả các port được khai báo thuộc lớp
signal, chúng có khả năng trao đổi giá trị với các module
khác, và có thể dùng được cho mọi process được khai
báo trong các architecture body lệ thuộc
• Trong mỗi architecture body, tất cả các tín hiệu được
khai báo chỉ có tác dụng cục bộ với architecture đó, và
chỉ được dùng với các process được khai báo trong cùng
architecture đó
• Trong mỗi process, có thể khai báo và sử dụng variable
để mô phỏng các mối liên kết cục bộ

Hardware Modeling - 1 - 101
Phạm vi của Signal và
Variable
• Port là signal, được khai báo ở mức cao nhất (entity)
• Trong mỗi architecture có thể có các signal cục bộ
• Trong mỗi process có thể có các variable cục bộ

entity
architecture
process

Variables
Signals
Input Ports Output Ports

Hardware Modeling - 1 - 102
Phép gán với Signal
• VHDL phân biệt rất rõ ràng trong việc xử lý với các đối
tương thuộc các lớp signal và variable

• Các quy tắc cơ bản là:
– Tất cả các signal và variable được gán phải có cùng kiểu
(type)
– Tất cả các signal và variable được gán phải có cùng kích
thước (size)

• Nếu signal là một port, người thiết kế phải lưu ý thêm:
– Signals có mode “in” có thể đọc nhưng không được gán giá
trị
– Signals có mode “out” có thể được gán giá trị trong
process, nhưng không được đọc

Hardware Modeling - 1 - 103
Phép gán với Signal
Internal_Cnt
entity Count_1 is
port (Clk, D : in bit ;
Q : out integer range...);
end Count_1;
Counter Q

architecture WRONG of Count_1 is architecture RTL of Count_1 is
begin signal Internal_Cnt : integer range ...
process (Clk) ;
begin begin
If Clk’event and Clk =‘1’ then process (Clk)
Q <= Q + 1; begin
end if ; If Clk’event and Clk =‘1’ then
end process ; Internal_Cnt <= Internal_Cnt + 1 ;
Will produce end if ;
compiler error end process ;
Q <= Internal_Cnt ;

Hardware Modeling - 1 - 104
Using Variables
• Vì phạm vi của một variable chỉ giới hạn trong process ở
đó nó được khai báo, ta không thể sử dụng nó để trao
đổi giá trị với các module khác, như cách sử dụng các
signal
• Bất kỳ variable nào được đọc trước khi giá trị của nó
được xác định, đều sẽ được suy diễn như là một register
trong cấu trúc hardware nếu như nó được dùng với một
process có clock
– Phải cẩn thận khi sử dụng variable trong các process có
clock
• Tuy nhiên, rất nên sử dụng các variable được trong các
mạch logic tổ hợp trung gian
• Chúng làm tăng tốc độ của việc chạy mô phỏng vì chỉ
cần ít delta cycles cho việc cập nhật các tín hiệu ra

Hardware Modeling - 1 - 105
Variable trong các Process
có Clock
process ( Clk ) process ( Clk )
variable B, C, D : bit := ‘1’ ; variable B, C, D : bit := ‘1’ ;
begin begin
If (Clk’event and Clk =‘1’) then If ( Clk’event and Clk =‘1’ ) then
B := A ; D := C ;
C := B ; C := B ;
D := C ; B := A ;
end if ; end if ;
end process ; end process ;

A D A B C D

Clk Clk

Hardware Modeling - 1 - 106
Alternate Solution
Internal_Cnt
entity Count_1 is
port (Clk, D : in std_logic ;
Q : out std_logic_vector Counter Q
...); end Count_1;

architecture RTL of Count_1 is
architecture WRONG of Count_1 is begin
begin process (Clk)
process (Clk) variable Internal_Cnt : std_logic_vector..
begin begin
If Clk’event and Clk =‘1’ then If Clk’event and Clk =‘1’ then
Q <= Q + 1; Internal_Cnt := Internal_Cnt + 1 ;
end if ; Q <= Internal_Cnt ;
end process ; Will produce end if ;
compiler error end process ;

Hardware Modeling - 1 - 107
Bài 6

Các lệnh điều khiển
chương trình trong
VHDL

© 2003 Xilinx, Inc. All Rights Reserved
Cấu trúc ngôn ngữ
architecture RTL of ENTITY_1 is
. . .
• Các lệnh begin
if/else, case concurrent statements ;
...
hoặc loop phải process
begin
được viết bên case ( sel_a ) is
trong một when…
...
process end case ;
end process ;
...
...
process
begin
if (sel_b = “00”) then
...
else….
end if ;
end process ;
...
end architecture RTL ;

Hardware Modeling - 1 - 109
Các câu lệnh If/Else
• Câu lệnh if/else làm cho các giao dịch được thực
hiện dựa trên những điều kiện nhất định. Có ba
dạng lệnh if/else cơ bản sau:
process
process
begin
begin
if (boolean expression 1) then
if (boolean expression) then
sequential statements ;
sequential statements;
elsif (boolean expression 2) then
end if ; sequential statements ;
elsif (boolean expression 3) then
process sequential statements ;
begin else
if (boolean expression) then sequential statements ;
sequential statements ; end if ;
else
sequential statements ;
end if ;

Hardware Modeling - 1 - 110
Ví dụ về lệnh If/Elsif
1. Điều kiện đầu tiên thoả mãn sẽ
được thực hiện ngay
A
2. Các điều kiện có thể gối nhau
B
3. Điều kiện đầu tiên của lệnh Z
if/elsif có ưu tiên cao nhất C
D
process (A, B, C, D, Sel)
begin D
Sel
If (Sel = “00”) then
C
Z <= A ;
elsif (Sel = “01”) then
Z <= B ; B
elsif (Sel = “10”) then
Z <= C ;
elsif (Sel = “11”) then Z
Z <= D ; A
end if;
Late arriving signal?
end process ;Sufficient for std_logic?

Hardware Modeling - 1 - 111
Câu lệnh Case
• Câu lệnh case làm cho các giao dịch được thực hiện
tuỳ thuộc vào giá trị của biểu thức chọn
• Lệnh case có hai dạng cơ bản:

process (…) process (...)
begin begin
case ( selector expression ) is case ( selector expression ) is
when ... => when ... =>
sequential statements ; sequential statements ;
when ... => ...
sequential statements ; when others =>
when ... => sequential statements ;
sequential statements ; end case ;
end case ; ...
... end process ;
end process ;

Hardware Modeling - 1 - 112
Ví dụ về lệnh Case
• Tất cả các giá trị có thể có của biểu thức chọn đều phải
được chỉ rõ (specified) trong câu lệnh
• Các điều kiện không được chồng chéo (gối) nhau
• Giải các giá trị được mô tả phải hữu hạn (discrete)
• Lệnh Case thích hợp với các cấu trúc kiểu LUT
– Hầu hết các công cụ tổng hợp mạch process (A, B, C, D, Sel )
đều tạo ra cấu trúc MUX từ lệnh case begin
case Sel is
when “00” => Z <= A ;
when “01” => Z <= B ;
A when “10” => Z <= C ;
B when “11” => Z <= D ;
Z
C end case ;
...
D
end process ;
Sel Is this sufficient for
std_logic?
Hardware Modeling - 1 - 113
Các điều kiện chồng chéo
• Ví dụ dưới đây minh hoạ trường hợp các điều kiện chồng
chéo nhau. Khi đó ta chỉ có thể sử dụng lệnh if/elseif.
Muốn sử dụng lệnh case phải chỉnh lại các điều kiện

process (A, B, C, D, Sel)
begin
If (Sel <= 3) then D
Z <= A ;
C
elsif (Sel <= 5) then
Z <= B ;
elsif (Sel <= 7) then B
Z <= C ;
elsif (Sel <= 9) then
Z <= D ; Z
end if; A
end process ;

Hardware Modeling - 1 - 114
Giải hữu hạn các giá trị
• Nếu một giải các giá trị được dùng làm điều kiện
của một lệnh case hoặc if/else, nó cần phải hữu hạn
(discrete)
process (…)
begin
if (x = 12 to 14) then sequential statements ; ✔
...
case ( selector expression ) is
when 0 to 7 => sequential statements ; ✔
when 4.3 to 7.7 => sequential statements ; ✘
when “1000” to “1010” => sequential statements ; ✘
when “1000” | “1010” => sequential statements ; ✔
...
end process ;

Hardware Modeling - 1 - 115
Lệnh gán Signal có điều kiện
• Lệnh gán tín hiệu có điều kiện là một dạng có tác dụng
tương đương lệnh if/else

architecture ...
begin
process ( A,B, C, Sel )
begin architecture ...
if (Sel = “00” ) then begin
Z <= A ; Z <= A when Sel = “00” else
elsif (Sel = “10”) then B when Sel = “10” else
Z <= B ; C when Sel = “11” else
elsif (Sel = “11”) then ‘X’ ;
Z <= C ; end architecture ;
else
Z <= ‘X’ ;
end if ;
end process ;
end architecture ;

• Cả hai câu lệnh đều có chung một kết quả khi mô phỏng
hoặc tổng hợp mạch
– Tuy nhiên, cấu trúc bên phải làm cho chương trình ngắn gọn
hơn
Hardware Modeling - 1 - 116
Lệnh gán Signal có lựa chọn
• Lệnh gán tín hiệu có lựa chọn là một dạng lệnh có tác
dụng tương đương với lệnh case
• Quy tắc sử dụng hoàn toàn giống với lệnh case:
– (1) Tât cả các điều kiện phải được liệt kê đủ
– (2) Các điều kiện không được chồng chéo nhau

architecture ...
begin
process ( A,B,C, SEL ) architecture...
begin with SEL select
case (SEL) is Z <= A when “00” ,
when “00” => Z <= A ; B when “10” ,
when “10” => Z <= B ; C when “11” ,
when “11” => Z <= C ; ‘X’ when others ;
when others => Z <= ‘X’ ; end architecture ;
end case ;
end process ;
end architecture ;

Hardware Modeling - 1 - 117
Outline
• If/else Statements
• Case Statement
• Concurrent Form
of If/else and Case
Statements
• Loop Statements
• Summary

Hardware Modeling - 1 - 118
Các câu lệnh Loop
• Các câu lệnh loop có thể được dùng cho mọi trường
hợp có vòng lặp
• Lệnh loop có nhiều dạng khác nhau, mỗi dạng sử
dụng một phương pháp điều khiển lặp riêng.
Dạng thông dụng nhất là “for … loop”
– Biến chỉ số ‘index’ cho vòng lặp
không được khai báo process ( A, B_bus )
riêng, không thể gán giá begin
trị cho nó, và không được for i in 7 downto 0 loop
sử dụng ở ngoài vòng lặp C_bus (i) <= A and B_bus (i) ;
– Nó được dùng như là end loop ;
một hằng số
– Sau mỗi phép lặp,
giá trị của nó được cập nhật theo chiều hướng ghi trong câu
lệnh từ trái sang phải

Hardware Modeling - 1 - 119
Sử dụng các lệnh Loop
• Khi tổng hợp, lệnh loop được process ( A, B_bus )
begin
“dàn trải ra”
for i in 7 downto 0 loop
– Việc tổng hợp mạch dựa trên C_bus (i) <= A and B_bus (i) ;
kết quả logic của từng phép lặp end loop ;
• Khi mô phỏng, các lệnh loop
tạo nên một công cụ linh hoạt A
C_bus (7)
để mô hình hoá hành vi B_bus (7)
A
• Các lệnh loop đặc biệt còn B_bus (6)
C_bus (6)
hay được sử dụng trong các ..
chương trình con .
(function và procedure) A C_bus (0)
B_bus (0)

Hardware Modeling - 1 - 120