VHDL cung cấp một số toán tử sau:
Toán tử gán.
Toán tử logic.
Toán tử toán học.
Toán tử so sánh.
Toán tử dịch.
Sau đây chúng ta sẽ xem xét cụ thể từng toán tử một. 4.1.1 Toán tử gán.
VHDL định nghĩa ba loại toán tử gán sau: <=: Dùng gán giá trị cho SIGNAL.
:= : Dùng gán giá trị cho VARIABLE, CONSTANT,GENERIC. =>: Dùng gán giá trị cho thành phần các vector và các loại giá trị
khác.
Ví dụ:
SIGNAL x : STD_LOGIC;
VARIABLE y : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL w: STD_LOGIC_VECTOR(0 TO 7); x <= '1'; y := "0000 w <= "10000000"; w <= (0 =>'1', OTHERS =>'0'); 4.1.2 Toán tử Logic.
VHDL định nghĩa các toán tử logic sau:
NOT, AND, OR, NAND, NOR, XOR, XNOR
Dữ liệu cho các toán tử này phải là kiểu: BIT, STD_LOGIC, STD_ULIGIC, BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR. Ví dụ: y <= NOT a AND b; y <= NOT (a AND b); y <= a NAND b; 4.1.3 Toán tử toán học.
Các toán tử này dùng cho các kiểu dữ liệu số như là:INTEGER, SIGNED, UNSIGNED, REAL. Các toán tử bao gồm:
+ Toán tử cộng. - Toán tử trừ. * Toán tử nhân. / Toán tử chia.
** Toán tử lấy mũ.
MOD Phép chia lấy phần nguyên. REM Phép chia lấy phần dư.
ABS Phép lấy giá trị tuyệt đối. 4.1.4 Toán tử so sánh. Có các toán tử so sánh sau: = So sánh bằng /= So sánh không bằng. < So sánh nhỏ hơn. > So sánh lớn hơn. <= So sánh nhỏ hơn hoặc bằng. >= So sánh lớn hơn hoặc bằng. 4.1.5 Toán tử dịch. Cú pháp sử dụng toán tử dịch là:
<left operand> <shift operation> <right operand>
Trong đó <left operand> có kiểu là BIT_VECTOR, còn <right operand> có kiểu là INTEGER. Có hai toán tử dịch:
Sll Toán tử dịch trái. Điền 0 vào phía phải. Rll Toán tử dịch phải. Điền 0 vào phía trái.
4.2. Thuộc tính.
4.1.1. Thuộc tính dữ liệu.
VHDL cung cấp các thuộc tính sau.
d’LOW Trả về giá trị nhỏ nhất của chỉ số mảng. d’HIGH Trả về chỉ số lớn nhất của mảng.
d’LEFT Trả về chỉ số bên trái nhất của mảng. d’RIGHT Trả về chỉ số bên phải nhất của mảng. d’LENGTH Trả về kích thước của mảng.
d’RANGE Trả về mảng chứa chỉ số.
d’REVERSE_RANGE Trả về mảng chứa chỉ số được đảo ngược. Ví dụ: Nếu d là một vector được khai báo như sau:
SIGNAL d : STD_LOGIC_VECTOR(0 TO 7) Ta sẽ có:
d'LOW = 0, d'HIGH = 7, d'LEFT = 7, d'RIGHT = 0, d'LENGTH = 8, d'RANGE = (7 downto 0), d'REVERSE_RANGE = (0 to 7).
Các thuộc tính này có thể dùng trong các vòng lặp:
FOR i IN RANGE (0 TO 7) LOOP ... FOR i IN x'RANGE LOOP ...
FOR i IN RANGE (x'LOW TO x'HIGH) LOOP ... FOR i IN RANGE (0 TO x'LENGTH-1) LOOP ...
Nếu tín hiệu có kiểu liệt kê thì:
d’POS(val) Trả về vị trí có giá trị là val.
d’LEFTOF(value) Trả về giá trị ở vị trí bên trái của value.
d’VAL(row,colum) Trả về giá trị ở một vị trí đặc biệt.
4.1.2. Thuộc tính tín hiệu.
Các thuộc tính loại này chỉ được áp dụng đối với dữ liệu SIGNAL. Nếu s là một SIGNAL thì ta có :
s’EVENT : Trả về true khi một sự kiện xảy ra đối với s. s’STABLE: Trả về true nếu không có sự kiện nào xảy ra đối
với s.
s’ACTIVE: Trả về true khi s = 1.
s’QUIET<time>: Trả về true khi trong khoảng thời gian time khong có sự kiện nào xảy ra.
s’LAST_EVENT: Trả về thời gian trôi qua kể từ sự kiện cuối cùng s’LAST_ACTIVE: Trả về thới gian kể từ lần cuối cùng s = 1
s’LAST_VALUE: Trả về giá trị của s trước sự kiện trước đó. Trong các thuộc tính trên thì thuộc tính s’EVENT là hay được dùng nhất.
Vi dụ:Đây là ví dụ với tín hiệu đồng hồ.
IF (clk'EVENT AND clk='1')... IF (NOT clk'STABLE AND clk='1')... WAIT UNTIL (clk'EVENT AND clk='1'); IF RISING_EDGE(clk)...