Đăng ký Đăng nhập

Tài liệu Báo cáo mạch số bằng vhdl

.DOCX
30
511
114

Mô tả:

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 -

Tài liệu liên quan