Báo cáo mạch số bằng vhdl
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
use
My_Lib ;
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ử đó.Phần thân của kiến trúc được dùng để mô tả sự thực hiện bên trong của thực
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 phần generic dùng để kiểm soát, thay đổi cấu trúc, hoạt
động của thực thể, chúng sẽ được truyền giá trị hoặc lấy giá trị mặc định ban đầu khi
thực thể được khởi tạo. Tham số này rất hữu ích khi thiết kế theo kiểu cấu trúc, sẽ sử
dụng nhiều thành phần cấu trúc cùng kiểu như khai báo của ENTITY nhưng có
tham số về cấu trúc, hoạt độ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 hướng vào ra của tín hiệu tại cổng đó
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
COUT
B
FULL_ADDER
CIN
SUM
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.
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
Cấu trúc này cho phép mô tả hoạt động bên trong của thực thể. Cú pháp chung
của một Architecture:
Architecture Tên_kiến_trúc of Tên_thực_thể is
-- Thực hiện các khai báo cho kiến trúc
...
Begin
-- Viết các mô tả hoạt động bên trong cho thực thể
...
End Tên_kiến_trúc;
Thông thường có thể sử dụng 3 cách chính mô tả kiến trúc của một phần tử
hay hệ thống số đó là: mô tả theo mô hình hành vi (Behaviour), mô tả theo mô
hình cấu trúc logic (Structure), và mô hình luồng dữ liệu (RTL). Tuy nhiên để mô tả
cho một hệ thống, trong một kiến trúc có thể kết hợp sử dụng 2 hoặc cả 3 mô hình
mô tả trên để thực hiện cho từng thành phần con tương ứng của hệ thống số.
2.5.1 Cú pháp cho mô hình luồng dữ liệu (RTL) :
ARCHITECTURE architecture-name OF entity-name
IS
signal-declarations; -- khai 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;
proceduredefinitions; BEGIN
PROCESS-blocks;
concurrentstatements; 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;
signaldeclarations; BEGIN
instance-name: PORT MAP-statements;
concurrentstatements; END
architecture-name;
Cho mỗi thành phần khai báo sử dụng cần có một kiế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 mạch số, và chỉ được khái báo trong
phần Entity
Cú pháp khai báo tham số dùng chung:
Generic(Tên_tham_số {, Tên_tham_số}: kiểu_dữ_liệu :=giá_trị_khởi_tạo);
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 tượng trong VHDL có mục đích sử dụng, phạm vi sử dụng khác
nhau, nhưng chúng có cú pháp khai báo chung như sau:
Đối_tượng tên_đối_tượng : kiểu_dữ_liệu {:=giá_trị_khởi_tạo}
4. Kiểu dữ liệu 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 biểu diễn kiểu dữ liệu trong VHDL như sau:
Type Tên_kiểu is giới_hạn_giá_trị_của_kiểu;
4.1. Bit và Bit_vector :
Loại Bit và Bit_vector được xác định trước trong VHDL. Đối tượng của những
loại này là giá trị „0‟ và „1‟ . Loại Bit_vector là một vector đơn giản của loại Bit.
Một vector với tất cả các bit có cùng giá trị có thể được biểu diễn bằng từ khóa
“others”.
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
Loại STD_Logic và STD_Logic_Vector cung cấp nhiều giá trị hơn loại Bit
trong kiểu mạch thực chính xác hơn. Đối tượng của lọai này có thể có những giá trị
sau:
‘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
Loại STD_Logic và STD_Logic_Vector không được xác định trước vì thế phải
khai báo 2 thư viện để sử dụng loại này:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
Nếu đối tượng loại STD_Logic_Vector được dùng như số nhị phân trong các thao
tác số học, khi đó ta sử dụng lệnh “use” với hai cú pháp sau:
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ị giống nhau có thể được biểu diễn ngắn gọn bằng
cách sử dụng từ khóa “others” với cú pháp sau:
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 :
Loại Integer đượ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 khai báo Integer dùng tối đa 32 bit để chỉ
một ký hiệu số. Integers cũng có thể dùng ít bit hơn với khai báo từ khóa RANGE.
Ví dụ: SIGNAL X: INTEGER;
SIGNAL y: INTEGER RANGE –64 to 64;
4.4
Boolean :
Loại Boolean được xác định trước để định nghiã các đối tượng chỉ có 2 giá 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 ngườ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 :
Loại ARRAY nhóm các đối tượng dữ liệu riêng lẻ của cùng một loại thành một
mảng một chiều hay nhiều chiều.
Cú pháp : TYPE identifier IS ARRAY (range) OF type;
Ví dụ : TYPE byte IS ARRAY(7 DOWNTO 0) OF BIT;
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 loại mà loạ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 (addition)
a+b
-
Phép trừ (subtraction)
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 ( modulus (integer))
a MOD b
REM
Lấy phần dư, dấu theo a (remainder (integer))
a REM b
**
Lũy thừa (exponentiation)
A ** 2
&
Phép nối (concatenation)
„a‟ & ‟b‟
ABS
Trị tuyệt đối (absolute)
a ABS b
Toán tử quan hệ (Relational Operators)
=
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 đó: phải là kiểu Bit_vector sẽ được dịch hoặc quay dữ
liệu, 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 (shift left logical)
srl
Dịch phải logic (shift right logical)
sla
Dịch trái số học (shift left arithmetic)
sra
Dịch phải số học (shift right arithmetic)
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ượng’thuộ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 nghĩ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
- Xem thêm -