BÁO CÁO ĐỀ TÀI SINH VIÊN
ĐỀ TÀI:BÁO CÁO MẠCH SỐ BẰNG VHDL
Mã số: -ĐT-SV-2011
I. Giới thiệu chung về công nghệ logic khả trình CPLD/FPGA
II. Tìm hiểu ngôn ngữ mô tả phần cứng VHDL .
VDHL là ngôn ngữ mô tả phần cứng cho các kiểu mạch số trong phạm vị các kết
nối đơn giản của các cổng đến những hệ thống phức tạp. VHDL là viết tắt của
VHSIC Hardware Description Language và VHSIC là viết tắt của Very High
Speed Integrated Circuits. Ở đây,chúng ta chỉ tóm tắt ngắn gọn nguyên lý cơ bản
của VHDL và cú pháp của nó. Nhiều chức năng cao cấp của ngôn ngữ VHDL có
thể đã bị bỏ qua.
VHDL cho phép mô tả được hầu hết các hệ thống phần cứng số. Các mô hình trừu tượng
gồm :
Mô hình hành vi (a Model of Behaviour).
Mô hình thời gian (a Model of Time).
Mô hình cấu trúc (a Model of Structure).
Việc nắm chắc cấu trúc,cú pháp các mô hình mô tả của ngôn ngữ là rất quan trọng.
VHDL cũng có nhiều điểm giống như một ngôn ngữ lập trình bậc cao, có cấu
trúc, có cú pháp riêng, có cách tổ chức chương trình, có từ khóa, có phương pháp biểu
diễn số liệu riêng
Cấu trúc ngôn ngữ cơ bản của VHDL gồm:
- Đối tượng: Quy định các dạng tín hiệu cố định, tín hiệu, cổng vào - ra, hay
tín hiệu đệm …
- Các kiểu dữ liệu: Quy định các kiểu dữ liệu có thể được dùng để gán cho
mỗi đối tượng.
- Các phép toán: Quy định các phép toán sử dụng cho mỗi loại dữ liệu.
- Các đơn vị thiết kế: Các thành phần cơ bản cấu trúc lên một chương trình mã
mô tả dùng VHDL.
- Các cấu trúc lệnh tuần tự: Cấu trúc câu lệnh thực hiện theo tiến trình tuần
tự, thường dùng mô tả các cấu trúc mạch tuần tự của mạch số.
- Các cấu trúc lệnh song song: Cấu trúc câu lệnh thực hiện song song, thường
dùng mô tả các cấu trúc mạch tổ hợp.
1. Cấu trúc cơ bản của ngôn ngữ lập trình VHDL.
Cấu trúc cơ bản của một chương trình mô tả bằng VHDL
—khai báo thư viện
library IEEE;
Khai báo gói dữ liệu (package) trong thư viện cần sử dụng:
use IEEE.STD_LOGIC_1164.ALL;
Khai báo thực thể
Entity Tên_thực_thể is
Khai báo các tham số generic nếu cần:
Generic( khai báo danh sách các tham số);
Port( Khai báo danh sách các cổng vào/ra
);
End Tên_thực_thể;
Bắt đầu viết
Architecture Tên_kiến_trúc of Tên_thực_thể is
{Khai báo:kiểu dữ liệu, các component,các đối tượng constant, signal}
Begin
{ Viết các mô tả dùng cấu trúc lệnh song song }
Process( danh sách tín hiệu kích thích nếu cần)
{Khai báo:kiểu dữ liệu, các đối tượng biến constant, variable }
Begin
{ Viết các mô tả dùng cấu trúc lệnh tuần tự }
End process;
{ Viết các mô tả dùng cấu trúc lệnh song song hay process khác }
End Tên_kiến_trúc;
Ví dụ: chương trình mô tả bằng VHDL cho mạch sau:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity mach is
Port ( a,b,c,d : in STD_LOGIC;
f : out STD_LOGIC);
end mach;
architecture Behavioral of mach is
signal e,g :std_logic;
begin
e<=a and b;
g<= c xor d;
f<=e or g;
end Behavioral;
2.Các đơn vị thiết kế trong VHDL
VDHL sử dụng 6 đơn vị thiết kế gồm 2 loại: đơn vị cơ bản và đơn vị thiết kế thứ
cấp:
Đơn vị thiết kế cơ bản:
Library: Cho phép tạo thư viện trong VHDL
Package: Tạo các gói giữ liệu trong Library, như các khai báo các đối tượng,khai
báo thủ tục, hàm
Entity: (Thực thể) - cho phép khai báo các giao diện của một khối thiết kế số nào
đó: như khai báo các cổng vào/ra, các tham số của khối mạch
- Đơn vị thiết kế thứ cấp (Phụ thuộc vào một đơn vị thiết kế cơ bản):
Architecture: Mô tả hoạt động bên trong của một Entity hay đây chính là phần
mô tả hoạt động của khối mạch số.
Package Body: Mô tả chỉ tiết cho các khai báo trong Package như viết các hàm,
các thủ tục
Configuration: Đơn vị thiết kế cấu hình cho phép gắn các phiên bản của thực thể vào
những kiến trúc khác nhau. Cấu hình cũng có thể được sử dụng để thay thế một cách
nhanh chóng các phần tử của thực thể trong các biểu diễn cấu trúc của thiết kế.
2.1 Library (thư viện).
Trong VHDL có các thư viện thiết kế chuẩn,ví dụ:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL; thư viện chuẩn.
use IEEE.STD_LOGIC_ARITH.ALL; thư viện toán học
use IEEE.STD_LOGIC_UNSIGNED.ALL; thư viện chuẩn hỗ trợ thực hiện các phép
tính không dấu.
Ngoài ra người thiết kế có thể tạo các thư viện thiết kế riêng.
Kết quả của việc biên dịch VHDL là chúng được cất giữ bên trong các thư viện để
sử dụng trong các thiết kế khác.Một thư viện thiết kế có thể chứa các thư viện như
sau:
-Các đóng gói (packages):chứa những mô tả khai báo được dùng chung.
-Các thực thể Entity:những mô tả giao diện thiết kế được dùng chung.
-Các kiểu kiến trúc Architectures:những mô tả hoạt động thiết kế được dùng
chung.
-Các phép định cấu hình Configiration:những phiên bản của thực thể được dùng
chung.
Lưu ý:VHDL không hỗ trợ các thư viện theo thứ bậc,chúng ta có thể có nhiều thư
viện nhưng không được khai báo lồng nhau.
Ví dụ cách gọi và sử dụng thư viện:
library My_Lib ;
use My_Lib.Fast_Counters.all ;
entity
Mod1 is
port
( . . .
);
2.2 Package và Package Body.
Package: Là đơn vị thiết kế cơ bản dùng để chứa những khai báo cho các đối
tượng, khai báo thủ tục procedure, hàm function, kiểu dữ liệu, component có thể
dùng chung cho những thiết kế, cấu trúc, dự án khác nhau …
Package Body : là đơn vị thiết kế phụ thuộc được dùng để chứa những mô tả chỉ tiết
cho các khai báo trong đơn vị thiết kế Package nào đó, mô tả chi tiết nội dung của các
hàm, các thủ tục
Package Body thường được viết ngay sau Package.
Cú pháp khai báo của Package như sau:
package package_name is
{package_declarative_item}
end [package_name ];
package body package_name is
{package_declarative_item}
end [package_name
Ví dụ:
package EX_PKG is
subtype INT8 is integer range 0 to 255;
constant zero : INT8:=0;
procedure Incrementer (variable Count : inout INT8);
end EX_PKG;
package body EX_PKG is
procedure Incrementer (variable Data : inout INT8) is
begin
if (Count >= MAX ) then
Count:=ZERO;
else Count:= Count +1;
end if;
end Incrementer;
end EX_PKG;
2.3 Configuration:
Một thực thể có thể có một vài kiến trúc mô tả hoạt động cho nó. Trong quá trình
thiết kế có thể phải thử nghiệm một vài biến thể của thiết kế bằng cách sử dụng các
kiến trúc khác nhau. Cấu hình là thành phần cơ bản của đơn vị thiết kế. Cấu hình
cho phép gắn các phiên bản của thực thể vào những kiến trúc khác nhau. Cấu hình
cũng có thể được sử dụng để thay thế một cách nhanh chóng các phần tử của thực
thể trong các biểu diễn cấu trúc của thiết kế.
Cú pháp của mô tả cấu hình như sau:
Configuration tên_cấu_hình of tên_thực_thể is
Phần khai báo của cấu hình (cho phép sử dụng
các phần tử trong package và library.
for đặc_tả_của_khối
{mệnh_đề_use}
{các_phần_tử_của_cấu_hình}
end for;
Ví dụ:
library ttl, work;
configuration v4_27_87 of processor is use work.all;
for structure_view
for a1:alu
use configuration ttl.sn74ls181;
end for;
for m1,m2,m3: mux
use entity multiplex4 (behavior);
end for;
for all: latch use defaults
end for;
end for;
end configuration v4_27_87;
2.4 Entity.
Trong một hệ thống số,thông thường được thiết kế theo một sự xếp chồng các
modul,mà mỗi modul này tương ứng với một thực thể thiết kế (entity) trong
VHDL.
Một khai báo entity được dùng để mô tả giao tiếp bên ngoài của một phần tử
(component),nó bao gồm các khai báo các cổng đầu vào,các cổng đầu ra của phần
t ú.Phn thõn ca kin trỳc c dựng mụ t s thc hin bờn trong ca thc
th ú.
Cú pháp khai báo của một Entity nh sau:
Entity entity_name is
[generic(generic_declaration);]
[port (port_declaration);]
end [entity_name];
[] : Dấu ngoặc vuông chỉ ra các tham số có thể lựa chọn.
| : Dấu gạch đứng hiển thị một sự lựa chọn trong số các lựa chọn khác.
{} : Khai báo một hoặc nhiều các đối tợng, mà các đối tợng này có thể đợc
định nghĩa bởi ngời dùng.
2.4.1 Generic
Tham s khai bỏo trong phn generic dựng kim soỏt, thay i cu trỳc, hot
ng ca thc th, chỳng s c truyn giỏ tr hoc ly giỏ tr mc nh ban u khi
thc th c khi to. Tham s ny rt hu ớch khi thit k theo kiu cu trỳc, s s
dng nhiu thnh phn cu trỳc cựng kiu nh khai bỏo ca ENTITY nhng cú
tham s v cu trỳc, hot ng khỏc nhau.
Cú pháp của khai báo này nh sau:
generic ( constant_name : type [:=init_value]
{;constant_name:
type[:=init_value]});
ở đây :Tên hằng constant_name chỉ ra tên của một hằng dạng generic
(hằng dùng chung).
Kiểu (Type) đợc dùng để chỉ ra kiểu dữ liệu của hằng.
init_value : chỉ ra giá trị khởi tạo cho hằng.
2.4.2 Port
Đợc dùng để khai báo các cổng vào, ra của Entity. Cú pháp của khai báo này
nh sau:
Port ( port_name : [mode] type [:= init_value]
{; port_name:[mode] type
[:=init_value]});
port_name đợc dùng để chỉ ra tên của một cổng
mode ch ra hng vo ra ca tớn hiu ti cng ú
Type chỉ ra kiểu dữ liệu của một cổng
init_value chỉ ra giá trị khởi tạo cho cổng đó.
Chú ý ! Với VHDL không phân biệt chữ hoa và chữ thờng, chẳng hạn nh : xyz =
xYz = XYZ.
* Có bốn mode đợc sử dụng trong khai báo cổng :
- in : chỉ có thể đợc đọc, nó chỉ đợc dùng cho các tín hiệu đầu vào (
chỉ đợc phép nằm bên phải phép gán )
- out : Chỉ đợc dùng để gán giá trị, nó chỉ đợc dùng cho các cổng đầu ra ( Nó
chỉ đợc nằm bên trái của phép gán ).
- inout : Có thể đợc dùng để đọc và gán giá trị. Nó có thể có nhiều hơn một h-
ớng điều khiển ( Có thể nằm ở bên trái hoặc bên phải phép gán ).
- Buffer : Có thể đợc dùng để đọc và gán giá trị. ( Có thể nằm ở bên trái
hoặc bên phải phép gán ).
inout là một cổng hai hớng, còn Buffer là một cổng không có hớng.
2.4.3. Ví dụ về khai báo Entity:
A
B
COUT
CIN
Hình trên chỉ ra một giao diện của một bộ cộng một bit. Tên Entity của phần tử
này là FULL_ADDER. Nó bao gồm các cổng đầu vào A, B và CIN.
FULL_ADDER
SUM
Các cổng này có kiểu dữ liệu là kiểu Bit, còn các cổng đầu ra SUM và
COUT cũng mang kiểu dữ liệu là kiểu BIT. Ngôn ngữ VHDL dùng để diễn tả giao
diện này nh sau:
Entity FULL_ADDER is
port ( A, B, CIN : in BIT;
SUM, COUT : out BIT );
End FULL_ADDER ;
2.5 Architecture
Cu trỳc ny cho phộp mụ t hot ng bờn trong ca thc th. Cỳ phỏp chung
ca mt Architecture:
Architecture Tờn_kin_trỳc of Tờn_thc_th is
Thc hin cỏc khai bỏo cho kin trỳc
Begin
Vit cỏc mụ t hot ng bờn trong cho thc th
End Tờn_kin_trỳc;
Thụng thng cú th s dng 3 cỏch chớnh mụ t kin trỳc ca mt phn t
hay h thng s ú l: mụ t theo mụ hỡnh hnh vi (Behaviour), mụ t theo mụ
hỡnh cu trỳc logic (Structure), v mụ hỡnh lung d liu (RTL). Tuy nhiờn mụ t
cho mt h thng, trong mt kin trỳc cú th kt hp s dng 2 hoc c 3 mụ hỡnh
mụ t trờn thc hin cho tng thnh phn con tng ng ca h thng s.
2.5.1 Cỳ phỏp cho mụ hỡnh lung d liu (RTL) :
ARCHITECTURE architecture-name OF entity-name
IS
signal-declarations;
kh
a
i
bỏo
tớn hi
u
BEGIN
concurrent-statements;
END architecture-name;
Những phát biểu
concurrent
được thực hiện một cách đồng
thời. Ví dụ ARCHITECTURE Siren_RTL OF Siren IS
SIGNAL term_1: STD_LOGIC;
BEGIN
term_1 <= D OR V;
S <= term_1 AND M;
END Siren_RTL;
2.5.2 Cú pháp cho behavioral model :
ARCHITECTURE architecture-name OF entity-name
IS signal-declarations;
function-definitions;
procedure-
definitions; BEGIN
PROCESS-blocks;
concurrent-
statements; END architecture-name;
Những câu
l
ệ
nh
bên
trong process-block
được thực hiện tuần
tự,
li
ê
n
tục.
Tuy
nhiên
chính
process-block là concurrent-statements.
Ví
dụ
: ARCHITECTURE Siren_Behavioral OF Siren IS
SIGNAL term_1: STD_LOGIC;
BEGIN
PROCESS (D, V, M)
BEGIN
term_1 <= D OR V;
S <= term_1 AND M;
END PROCESS;
END Siren_Behavioral;
2.2.3 Cú pháp của structural model :
ARCHITECTURE architecture-name OF entity-name
IS
component-declarations;
signal-
declarations; BEGIN
instance-name: PORT MAP-statements;
concurrent-
statements; END
architecture-name;
Cho
mỗi
thành phần
khai
báo sử dụng cần
có một k
i
ế
n
trúc
hay
một
thực thể
phù hợp
cho
các thành phần đó. Câu
l
ệ
nh
PORT MAP
l
à
câu
l
ệ
nh
đồng
thời.
Ví
dụ
: ARCHITECTURE Siren_Structural OF Siren IS
COMPONENT myOR PORT (
in1, in2: IN STD_LOGIC;
out1: OUT STD_LOGIC);
END COMPONENT;
SIGNAL term1: STD_LOGIC;
BEGIN
U0: myOR PORT MAP (D, V, term1);
S <= term1 AND M;
END Siren_Structural;
3. Đối tượng trong VHDL.
Trong ngôn ngữ VHDL gồm có 4 đối tượng là: tín hiệu - signal, biến -
variable, hằng - constant, tham số chung – generic. Mỗi đối tượng được khai báo
dựa vào từ khóa tương ứng và chúng có mục đích sử dụng khác nhau.
3.1 Signal-tín hiệu
Là đối tượng để biểu diễn đường kết nối các giữa các cổng vào/ra của thực thể
(mạch số), giữa các cổng vào/ra của các khối thành phần phần cứng bên trong
mạch số… Chúng là phương tiện truyền dữ liệu động giữa các thành phần của mạch
số.
Tín hiệu có tính toàn cục rất cao, chúng có thể được khai báo trong package,
Entity ,Architecture .Các tín hiệu có thể được sử dụng nhưng không được khai báo
trong process, proceduce, function, vì tiến trình và thủ tục, hàm là thành phần cơ sở
của mô hình và chúng được coi như các hộp đen.
Cú pháp khai báo tín hiệu như sau:
Signal tên_tín_hiệu {,tên_tín_hiệu}:kiểu_dữ_liệu [:=giá_trị_khởi_tạo];
Ví dụ: Signal a,b,c: Bit:=’1’; Giá trị khởi tạo là ‘1’;
Signal y, reg: std_logic_vector(3 downto 0):=”0000”;
3.2 Variable-biến:
Là đối tượng cục bộ được sử dụng để chứa các kết quả trung gian. Biến chỉ
được khai báo và sử dụng trong process và trong procedure và function.
Cú pháp khai báo biến cũng tương tự :
variable tên_biến {,tên_biến}: kiểu_dữ_liệu [:=giá_trị_khởi_tạo];
Ví dụ: variable x : Bit:=’1’;
variable Q: std_logic_vector(3 downto 0);
Nếu không được khởi tạo giá trị ban đầu biến sẽ nhận giá trị ban đầu là giá trị
thấp nhất trong các giá trị thuộc miền xác định của kiểu dữ liệu.
3.3 Constant-hằng
đối tượng hằng được gán cho các giá trị cụ thể của một kiểu dữ liệu khi được tạo ra và
không đổi trong toàn bộ quá trình thực hiện. Hằng có thể dùng để mô tả cho tín hiệu
không đổi (ví dụ tín hiệu GND, VCC,…). Hằng cũng có tính toàn cục giống như
tín hiệu và có thể được khai báo trong package, entity, architecture, proceduce,
function, process…
Cú pháp khai báo hằng:
constant tên_hằng {,tên_hằng}: kiểu_dữ_liệu :=giá_trị_khởi_tạo;
Ví dụ: constant GND : std_logic:=’0’;
constant PI: real:=3.1414;
constant datamemory : memory := (('0','0','0','0'),
('0','0','0','1'),
('0','0','1','1'));
3.4 Generic tham s dựng chung
: Dựng khai bỏo tham s cho mụ hỡnh mch s, v ch c khỏi bỏo trong
phn Entity
Cỳ phỏp khai bỏo tham s dựng chung:
Generic(Tờn_tham_s {, Tờn_tham_s}: kiu_d_liu :=giỏ_tr_khi_to);
Vớ d:
entity Logic_AND is
generic( delay: Time:=1ns);
port(A, B : in std_logic;
X : out std_logic);
end Logic_AND;
Túm
l
i: Cỏc i tng trong VHDL cú mc ớch s dng, phm vi s dng khỏc
nhau, nhng chỳng cú cỳ phỏp khai bỏo chung nh sau:
i_tng tờn_i_tng : kiu_d_liu {:=giỏ_tr_khi_to}
4. Kiu d liu trong VHDL
Tất cả các đối tợng dữ liệu trong VHDL cần phải đợc định nghĩa với một kiểu
dữ liệu. Một khai báo kiểu phải chỉ ra tên và dải của kiểu đó. Khai báo kiểu dữ liệu
chúng đợc phép khai báo trong phần khai báo các đóng gói, trong phần khai báo
Entity, trong phần khai báo kiến trúc, trong phần khai báo các chơng trình con và
trong phần khai báo các Process
Cỳ phỏp chung biu din kiu d liu trong VHDL nh sau:
Type Tờn_kiu is gii_hn_giỏ_tr_ca_kiu;
4.1. Bit v Bit_vector :
L
o
i
Bit
v
B
i
t_v
e
c
to
r
c xỏc
nh
trc trong
VHDL. i
tng ca nhng
l
o
i
ny
l
g
i
ỏ
tr 0
v
1 .
L
o
i
Bit_vector
l
mt
vector n
g
i
n
ca
l
o
i
Bit.
Mt
vector
vi
tt
c
cỏc
bit
cú cựng
g
i
ỏ
tr
cú th c biu
d
i
n
bng
t
khúa
ot
h
e
r
s
.
Vớ
d
: Signal x:
bit;
Signal y: Bit_vector ( 7 downto 0);
x <= 1;
y <=
“
00000010”
;
y <=
(others
=> „0‟);
same as
“
00000000”
4.2 STD_Logic và STD_Logic_Vector
L
o
ạ
i
STD_Logic và
S
T
D_L
og
i
c
_Ve
c
t
o
r cung
cấp nhiều
g
i
á
trị hơn
l
o
ạ
i
Bit
trong k
i
ể
u mạch thực chính xác hơn.
Đối
tượng của
l
ọ
a
i
này có thể có những
g
i
á
trị
s
a
u:
‘0’—mức 0
‘1’—mức 1
‘z’—tổng trở cao
‘-‘—không quan tâm
‘L’- - mức 0 yếu
‘H’—mức 1 yếu
‘U’ –không đạt giá trị ban đầu
‘X’—không xác định
‘W’—không xác định yếu
L
o
ạ
i
STD_Logic và
S
T
D_L
og
i
c
_Ve
c
t
o
r
không được xác
định
trước
vì
thế
ph
ả
i
k
h
a
i
báo
2
thư viện để sử dụng
l
o
ạ
i
n
à
y:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
Nếu
đối
tượng
l
o
ạ
i
S
T
D_L
og
i
c
_Ve
c
t
o
r
được dùng như số
nhị
phân trong các thao
tác
s
ố
học,
khi
đó ta sử dụng
l
ệ
nh
“
us
e
”
với
h
a
i
cú pháp
s
a
u:
USE IEEE.STD_LOGIC_SIGNED.ALL;
cho số có
dấu
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
cho số không
dấu.
Một
vector mà tất cả các
bit
có giá
trị
g
i
ống
nhau có thể được biểu
d
i
ễ
n
ngắn gọn bằng
c
á
c
h
sử dụng
từ
khóa
“
ot
h
e
r
s
”
với
cú pháp
s
a
u:
Ví dụ: LIBRARY IEEE;
USE
IEEE.STD_LOGIC_1164.ALL;
SIGNAL x: STD_LOGIC;
SIGNAL y: STD_LOGIC_VECTOR(7 DOWNTO 0);
x <= 'Z';
y <= "0000001Z";
y <= (OTHERS => '0'); same as "00000000"
4.3 Integer :
L
o
ạ
i
I
n
t
e
ge
r
được xác
định trước để định
nghĩa các
đối
tượng số
nhị
phân dùng
với tính
toán số học. Mặc
đ
ị
nh
1 tín
hiệu
k
h
a
i
báo
I
n
t
e
ge
r
dùng
tối
đa
32 bit
để
chỉ
một ký
hiệu
s
ố.
I
n
t
e
ge
r
s
cũng có thể dùng
ít bit
hơn
với k
h
a
i
báo
từ
khóa
RANGE.
Ví dụ: SIGNAL X: INTEGER;
SIGNAL y: INTEGER RANGE –64 to 64;
4.4 Boolean :
L
o
ạ
i
B
oo
l
ea
n
được xác
đ
ị
nh
trước để
định
nghiã các
đối
tượng chỉ
có 2
g
i
á
trị
TRUE
ho
ặ
c
FALSE
Ví dụ: signal x:BOLEAN;
4.5 Bảng liệt kê Type
Một
bảng
li
ệ
t
kê cho phép
n
gườ
i
dùng chỉ
rõ
những giá
trị
mà
đố
i
tượng dữ
li
ệ
u
có
thể
có.
Cú pháp: TYPE indentifier IS (trị 1,trị 2,…)
Ví dụ: TYPE state_type IS( S1,S2,S3);
Signal state: state_type;
State <=S1;
4.6 Array :
L
o
ạ
i
ARRAY
nhóm các
đối
tượng
dữ
li
ệ
u
r
i
ê
ng
l
ẻ
của cùng
một
l
o
ạ
i
thành
một
mảng
một
chiều hay nhiều
c
hi
ề
u.
Cú pháp : TYPE identifier IS ARRAY (range) OF type;
Ví
dụ
:
TYPE byte
I
S
ARRAY(7
DOWNTO
0)
OF
B
I
T;
TYPE memory_type IS ARRAY(1 TO 128)
OF byte; SIGNAL memory: memory_type;
memory(3) <= "00101101";
4.7 Subtype :
SUBTYPE
l
à
tập hợp con của một
l
o
ạ
i
mà
l
o
ạ
i
đó có sự ràng buộc về phạm
vi
.
Cú pháp : SUBTYPE identifier IS type RANGE range;
Ví
dụ
: SUBTYPE integer4 IS INTEGER RANGE –8 TO 7;
SUBTYPE cell IS STD_LOGIC_VECTOR(3 DOWNTO 0);
TYPE memArray IS ARRAY(0 TO 15) OF cell;
5. Các phép toán trong VHDL
5.1. Toán tử logic
Toán tử logic gồm có: and, or, nand, nor, xor, not, xnor được sử dụng cho các
dạng dữ liệu là bit, boolean, bit_vector, std_logic_vector.
Toán
tử Logic
Toán
tử Ví dụ
AND And a AND b
OR Or a OR b
NOT Not NOT a
NAND Nand a NAND b
NOR Nor a NOR b
XOR Xor a XOR b
XNOR Xnor a XNOR b
Chú ý:
Toán tử logic dùng cho kiểu dữ liệu mảng có nguyên tắc thực hiện như sau:
+ Chỉ thực hiện với các mảng cùng kiểu, cùng độ lớn.
+ Phép toán logic thực hiện với từng phần tử của mảng và theo thứ tự từ trái sang
phải.
+ Toán tử not có độ ưu tiên cao nhất.
5.2 Toán tử quan hệ
Toán tử quan hệ được sử dụng cho hầu hết các dạng dữ liệu, tất cả các toán tử
quan hệ đều cho giá trị trả về dưới dạng boolean.
Toán tử quan hệ gồm có: =, /=, <, <=, >, >=.
Ví dụ: signal FLAG_BIT : boolean ;
signal A, B : integer ;
FLAG_BIT <=(A > B);
- Nguyên tắc thực hiện phép quan hệ với dữ liệu mảng:
+ Các mảng phải cùng kiểu, độ dài có thể khác nhau.
+ Mảng có độ dài khác nhau thì phép quan hệ thực hiện ưu tiên phần tử từ trái
sang phải và so sánh theo giá trị ASCII
5.3. Toán tử số học
+
Phép
cộng (
a
ddi
t
i
on
)
a + b
-
Phép trừ
(
s
ub
tr
a
c
t
i
on
)
a - b
* Phép nhân (multiplication (integer or floating point)) a * b
/ Phép chia ( division (integer or floating point)) a / b
MOD
L
ấ
y
phần dư, dấu theo
b (
m
odu
l
us
(
i
n
t
e
ge
r))
a MOD b
REM
L
ấ
y
phần dư, dấu theo a
(r
e
m
a
i
nd
e
r (
i
nteger))
a REM b
**
Lũy
thừa
(
e
x
pon
e
n
t
i
a
t
i
on
)
A ** 2
&
Phép
nố
i
(
c
on
c
a
t
e
n
a
t
i
on
)
„a‟
& ‟b‟
ABS
Trị
tuyệt
đố
i
(
a
bs
o
l
ut
e
)
a ABS b
Toán
tử
quan hệ
(
R
e
l
a
t
i
on
a
l
Ope
r
a
t
or
s
)
=
B
ằ
ng
/=
Không
b
ằ
ng
<
Nhỏ
hơn
<=
Nhỏ hơn hoặc b
ằ
ng
>
Lớn hơn
>=
Lớn
hơn hoặc
b
ằ
ng
Toán tử số học được sử dụng cho kiểu dữ liệu Integer, Real, Signed, Unsigned, các
dạng dữ liệu vật lý, Std_logic, Std_logic_vector, Bit, Bit_vector. Cần chú ý rằng
không phải tất cả toán tử số học đều có thể sử dụng cho kiểu dữ liệu mảng.
Các toán tử số học là: +, -, *, /, abs (trị tuyệt đối), ** (hàm mũ).
5.4 Toán tử dịch:
Toán tử dịch là toán tử tác động lên toán hạng kiểu Bit_vector để tạo ra các phép
dịch hoặc quay dữ liệu. Cú pháp của toán tử dịch:
Toán_hạng_trái Toán_Tử_dịch Toán hạng phải;
Trong đó: <Toán_hạng_trái> phải là kiểu Bit_vector sẽ được dịch hoặc quay dữ
liệu, <Toán_hạng_phải> xác định số vị trí được dịch hoặc quay và phải có kiểu số
nguyên mang giá trị dương hoặc âm, nếu là giá trị âm sẽ chỉ ra hướng ngược lại
với giá trị dương . Mỗi phép dịch cho kết qủa cùng dạng và kích thước với toán
hạng ban đầu.
sll
Dịch tr
á
i
logic (
s
hif
t
l
e
f
t
l
og
i
c
a
l
)
srl
Dịch
ph
ả
i
logic (
s
hi
f
t right
l
o
gi
c
a
l
)
sla
Dịch tr
á
i
số học
(
s
hi
f
t
l
e
f
t
a
r
i
t
hm
e
t
i
c
)
sra
Dịch
ph
ả
i
số học
(
s
hi
f
t right
a
r
i
t
hm
e
t
i
c
)
rol Xoay trái (rotate left)
ror
Xoay
ph
ả
i
(rotate
right)
Ví dụ: signal A_vec : bit_vector (7 downto 0) := “11000110”;
signal D_vec : bit_vector (7 downto 0);
5.5 Toán tử ghép nối
Toán tử ghép nối “&” cho phép ghép nối một cách linh hoạt các dữ liệu đơn và
dữ liệu dạng mảng thành các mảng lớn hơn.
Ví dụ: signal A_vector, B_vector: std_logic_vector (7 downto 0);
signal Z_vector: std_logic_vector (15 downto 0);
Z_vector <= A_vector & B_vector;
5.6. Toán tử tách
Toán tử tách cho phép ta lấy ra một số thành phần của mảng, chiều chỉ số của
phép tách phải cùng chiều đánh chỉ số đã định nghĩa cho mảng.
Ví dụ: signal Z_vec: std_logic_vector (15 downto 0);
signal B_vec: std_logic_vector (7 downto 0);
B_vec <= Z_vec (12 downto 5);
5.7 Toán tử thuộc tính
Toán tử thuộc tính cho phép xác định thuộc tính dữ liệu của đối
tượng biến và tín hiệu. Cú pháp chung:
Đ
ố
i
_
t
ư
ợ
n
g
’
t
h
u
ộ
c
_
t
í
n
h
- Các thuộc tính cho kiểu dữ liệu mảng trong VHDL là:
+ d’left, d’right: trả lại chỉ số của phần tử bên trái nhất hoặc bên phải nhất của
dữ liệu mảng d.
+ d’high, d’low : trả lại chỉ số của phần tử cao nhất hoặc thấp nhất của kiểu dữ
liệu mảng d.
+ d’range, d’reverse_range : xác định khoảng của chỉ số của mảng d.
+ d’length : trả về số lượng các phần tử của mảng d.
- Các thuộc tính cho kiểu dữ liệu liệt kê
+ d’val(pos): Trả về giá trị tại vị trí được xác định pos.
+ d’pos(value): Trả về vị trí của giá trị xác định value.
+ d’leftof(value): Trả về giá trị bên trái của giá trị xác định value.
+ d’val(row, column): Trả về giá trị tại ví trí có hàng, cột xác định.
- Các thuộc tính cho tín hiệu
+ s’event, s’stable: trả về giá trị boolean, chỉ ra rằng trên đường tín hiệu s có
xuất hiện sự kiện thay đổi hay giá trị trên đường tín hiệu ổn định tại thời điểm hiện tại.
Các thuộc tính này dùng nhiều với lệnh wait và if.
+ s’active: Trả về giá trị “true” nếu s=‘1’.
+ s’quiet (time): Trả về giá trị “true” nếu không có sự kiện nào xảy ra đối với tín
hiệu s trong khoảng thời gian xác định time.
+ s’last_event: Trả về thời gian kể từ khi có sự kiện mới nhất xảy ra đối với s.
+ s’last_active: Trả về thời gian kể từ khi s=‘1’
+ s’last_value: Trả về giá trị của s trước khi xảy ra sự kiện mới
nhất
- Thu ộ
c tính t ự đ
ịnh n gh
ĩ a
Người sử dụng có thể tự định nghĩa hàm thuộc tính với cú pháp như
sau (Viết trong gói dữ liệu package của thư viện do người dùng tạo
ra:
ATTRIBUTE Tên_thuộc_tính: Kiểu_thuộc_tính; Khai báo chung
ATTRIBUTE Tên_thuộc_tính OF Tên_đối_tượng: Loại_đối_tượng
IS giá_trị; Xác định giá trị của thuộc tính
Trong đó:
+ Kiểu_thuộc_tính: kiểu dữ liệu trả về của thuộc tính (BOOLEAN, INTEGER,
STD_LOGIC_VECTOR …)
+ Loại_đối_tượng: Kiểu đối tượng của thuộc tính (TYPE, SIGNAL,
FUNCTION…).
5.8 Chuyển đổi dạng dữ liệu.
5.8.1 Conv_integer ( ) :
Chuyển
l
o
ạ
i
s
t
d_
l
og
i
c
_v
e
c
t
o
r
thành
I
n
t
e
ge
r
Yêu cầu: LIBRARY IEEE;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
Cú pháp :
CONV_INTEGER(std_logic_vector)
Ví
dụ
: LIBRARY IEEE;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
SIGNAL four_bit: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL n: INTEGER;
n := CONV_INTEGER(four_bit);
5.8.2 Conv_Std_Logic_Vector (,):
Chuyển
l
o
ạ
i
I
n
t
e
ge
r
thành
s
t
d
_logic_vector
Yêu cầu : LIBRARY IEEE;
USE IEEE.STD_LOGIC_ARITH.ALL;
Cú pháp :
CONV_STD_LOGIC_VECTOR (integer, number_of_bits)
Ví
dụ
: LIBRARY IEEE;
USE IEEE.STD_LOGIC_ARITH.ALL;
SIGNAL four_bit: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL n: INTEGER;
four_bit := CONV_STD_LOGIC_VECTOR(n, 4);
6. Hàm (Function) và thủ tục (Procedure)
6.1 Hàm-Function
Cú pháp khai báo:
FUNCTION function-name (parameter-list) RETURN return-type;
Cú
pháp
đ
ị
nh
nghĩa
FUNCTION
FUNCTION function-name (parameter-list) RETURN
return-type IS BEGIN
sequential-
statements; END
function-name;
Cú pháp gọi FUNCTION
function-name (actuals);
6.2 Thủ tục -Procedure
Cú pháp khai báo PRODUCE
PROCEDURE procedure -name (parameter-list);
Cú pháp định nghĩa PRODUCE
PROCEDURE procedure-name (parameter-
list) IS BEGIN
sequential-
statements; END
procedure-name;
Cú pháp gọi PRODUCE
procedure -name (actuals);
7. Các cấu trúc lệnh song song
Trong mô tả một kiến trúc (Architecture) có chứa nhiều cấu trúc lệnh song song. Mỗi
cấu trúc song song có thể viết ở bất kỳ vị trí nào trong đoạn mô tả Architecture mà chức
năng hoạt động của thực thể không thay đổi. Các cấu trúc lệnh song song có trong VHDL
gồm:
• Cấu trúc process.
• Lệnh gán tín hiệu song song.
• Lệnh gán có điều kiện.
• Lệnh gán tín hiệu có lựa chọn.
• Khối.
• Phép gọi thủ tục,hàm song song.
• Lệnh lặp Generate.
• Lệnh gán chân.
7.1 Cấu trúc process:
Các process trong một thiết kế được thực hiện song song.Cấu trúc process bao gồm các
lệnh tuần tự. Nó cũng là khối cơ bản của việc mô tả hoạt động của thực thể. Tại một thời
điểm xác định chỉ có một câu lệnh tuần tự được thực hiện trong mỗi cấu trúc Process.
Cấu trúc tổng quát của Process như sau:
[Nhãn] Process [(Danh sách tín hiệu kích thích)]
[ Khai báo:kiểu dữ liệu, các đối tượng biến constant, variable ]
Begin
{ Viết các mô tả dùng cấu trúc lệnh tuần tự }
End process;
Tróng đó:
-Nhãn:do người viết chương trình tự đặt.
-Danh sách tín hiệu kích thích:bao gồm các tín hiệu đầu vào của process,khi thay đổi
chúng có thể làm thay đổi hoạt động của process. Process giống như một vòng lặp vô hạn
và mỗi bước lặp được thực hiện mỗi khi có sự thay đổi của bất kỳ tín hiệu nào trong danh
sách tín hiệu kích thích.
-Còn khi sử dụng Process để mô tả khối mạch có phần tử tuần tự mà có tín hiệu vào là
clock hay reset thì cần đưa các tín hiệu này vào danh sách tín hiệu kích thích.
-Đầu ra của process này có thể là đầu vào của process khác sau nó.
7.2 Lệnh gán tín hiệu song song.
Phép gán tín hiệu song song sử dụng bên trong các Architecture nhưng bên ngoài
Process. Dạng đơn giản nhất của phép gán tín hiệu song song có cú pháp như sau:
<tín_hiệu_đích> <= <biểu_thức> [after <biểu_thức_thời_gian>];
Lệnh after này chỉ dùng trong mô phỏng,nó tương đương một process có một phép gán
tín hiệu.
VD: clk <= not clk after 10 ns ;
7.4 Lệnh gán tín hiệu có điều kiện.
Phép gán tín hiệu có điều kiện là cấu trúc lệch song song thực hiện phép gán giá trị của
biểu thức cho tín hiệu đích.
Cú pháp:
<tín_hiệu_đích> <= <biểu_thức>[after <biểu_thức_thời_gian>] when
<điều_kiện> else
<biểu_thức>[after <biểu_thức_thời_gian>] when
<điều_kiện> else
<biểu_thức>[after <biểu_thức_thời_gian>];
Phép gán tín hiệu có điều kiện có thể xem là cấu trúc song song của lệnh tuần tự if.
7.5 Lệnh gán tín hiệu có lựa chọn.
Lệnh này gán cho tín hiệu đích một biểu thức khi có giá trị được lựa chọn.Lệnh tương
đương với lệnh case trong cấu trúc lệnh tuần tự.
Cú pháp:
With <biểu_thức_lựa_chọn> select
<tín_hiệu_đích> <= <biểu_thức> [after <biểu_thức_thời_gian>]
when <giá_trị_lựa _chọn>,
<biểu_thức> [after <biểu_thức_thời_gian>]
when <giá_trị_lựa _chọn>,
<biểu_thức> [after <biểu_thức_thời_gian>]
when others;
7.6:Khối.
Khối bao gồm tập hợp các cấu trúc lệnh song song. Mỗi khối biểu diễn một thành phần
của mô hình sử dụng để tổ chức một tập hợp các cấu trúc song song.
Cú pháp:
<nhãn>: Block
{<phần_khai_báo>}
begin
{<câu_lệnh_song_song>} – có trình tự bất kỳ
end block;
Phần khai báo có thể là:
• Khai báo hằng,kiểu dữ liệu,tín hiệu.
• Thân thủ tục.
• Khai báo component.
• Luật use-sử dụng trong configuration.
7.7 Phép gọi thủ tục,hàm song song.