-
2.4.1. Các đối tợng dữ liệu
2.4.1.1. Tín hiệu
Các đối tợng tín hiệu đợc sử dụng để nối các thực thể với nhau nhằm tạo thành các mô hình. Các tín hiệu là phơng tiện để truyền thông dữ liệu
-44-
động giữa các thực thể. Các tín hiệu có thể đợc khai báo trong phần khai báo thực thể, khai báo kiến trúc và khai báo gói. Một khai báo tín hiệu có dạng:
Signal tên tín hiệu{, tên tín hiệu}: kiểu tín hiệu[:= giá trị khởi tạo];
Ví dụ về khai báo tín hiệu:
architecture dataflow my_circuit of is signal d,e bit;
begin
-- concurrent statements tied together with signals
d <= in3 and in4; -- logic for d
e <= in5 or in6; -- logic for e
out1 <= in1 xor d; -- output logic
out2 <= in2 xor e; -- output logic
end dataflow;
2.4.1.2. Biến
Các biến đợc sử dụng để lu trữ cục bộ trong các phát biểu quá trình hoặc các chơng trình con. Khác với tín hiệu có các giá trị đợc định thời, tất cả các phép gán cho các biến xảy ra tức thời. Một khai báo biến có dạng nh sau:
Variable tên biến {, tên biến}: kiểu[: = giá trị biến khởi tạo] Ví dụ về khai báo biến:
variable state : std_logic;
variable delay : time:= 5ns;
2.4.1.3. Hằng
Hằng là đối tợng đợc khởi tạo bằng những giá trị nhất định khi đợc tạo nên trong quá trình thực hiện và sau đó giá trị của hằng không thay đổi.
-45-
Hằng có thể đợc khai báo trong các gói, thực thể, kiến trúc, chơng trình con, khối và quá trình.
Cú pháp khai báo hằng:
Constant tên hằng{, tên hằng}: kiểu[:=giá trị];
Ví dụ về khai báo hằng:
Constant char3: bit_vector(2 downto 0):= “001”; Constant nst: Integer: = 10;
2.4.2. Các kiểu dữ liệu
Mọi đối tợng dữ liệu trong VHDL đều phải đợc định nghĩa với các kiểu dữ liệu. Ngôn ngữ VHDL cho phép sử dụng các kiểu cơ sở để tạo nên các đối tợng phức tạp hơn. Kiểu phải đợc khai báo trớc khi sử dụng. Khai báo kiểu xác định kiểu và miền xác định của kiểu.
Các kiểu dữ liệu chính trong VHDL:
-Kiểu liệt kê
-Kiểu số nguyên
-Kiểu đợc định nghĩa trớc của VHDL.
-Kiểu mảng
-Kiểu bản ghi
-Kiểu STD_LOGIC.
-Kiểu signed và unsigned.
-Các kiểu con.
2.5. Toán tử và biểu thức
Trong ngôn ngữ VHDL các biểu thức là các công thức . Các công thức này xác định các tác động tính toán lên các đối tợng dữ liệu. Các biểu thức thực hiện các tính toán số học và logic sử dụng các toán tử với một số các toán hạng. Các toán tử đặc trng cho phép toán sẽ đợc thực hiện còn các toán hạng là các nguồn dữ liệu cho các phép toán.
-46-
2.5.1. Các toán tử.
Các toán tử đợc phân chia theo các mức độ u tiên và trật tự tính toán. Bảng 2.1 đa ra nhóm các phép toán với mực độ u tiên tăng dần. Các quy ớc về trật tự thực hiện các phép toán trong biểu thức nh sau:
- Trong biểu thức, các phép toán có mức độ u tiên cao hơn sẽ đợc thực
hiện trớc. Các dấu ngoặc đơn cũng giúp xác định trật tự tính toán biểu thức .
- Các phép toán trong nhóm với cùng một mức độ u tiên sẽ đợc thực
hiện từ trái qua phải trong các biểu thức.
Các phép toán logic And, or, nand, nor, xor
Các phép toán quan hệ =, /=, <, <=, >, >=
Các phép toán cộng +, , &-
Các toán tử dấu +, -
Các phép toán nhân *, /, mod, rem
Các phép toán khác **, abs, not
Bảng 2.1: Các toán tử và mức độ u tiên
2.5.2. Các toán hạng
Trong VHDL có nhiều dạng toán hạng. Các toán hạng cũng có thể là chính các biểu thức. Các dạng toán hạng bao gồm:
-Các hằng, ký hiệu. -Các tên, định danh. -Các tên thuộc tính -Các chỉ số. -Các nhóm -Các biểu thức định kiểu.
-Các biểu thức chuyển đổi kiểu.
-47-
2.6. Các lệnh tuần tự trong VHDL
Trong VHDL, một cấu trúc thực hiện đồng thời là quá trình ( process). Quá trình là một cấu trúc quan trọng đợc sử dụng để mô ta hành vi hoạt động của mạch. Trong một kiến trúc tất cả các quá trình đợc thực hiện đồng thời khi mô phỏng. Một quá trình đợc xây dựng từ những lệnh tuần tự. Các lệnh tuần tự trong VHDL gồm có:
-Câu lệnh gán cho biến.
-Câu lệnh gán cho tín hiệu.
-Câu lệnh if .
- Câu lệnh Case.
-Các lệnh vòng lặp.
-Câu lệnh Null
2.6.1.Câu lệnh gán biến.
Tơng tự nh các ngôn ngữ lập trình khác, phép gán biến thiết lập giá trị mới cho biến. Cú pháp của phép gán biến nh sau:
Biến:= biểu thức;
Vế trái của phép gán biến phải là biến đã đợc khai báo từ trớc. Vế phải của phép gán là biểu thức. Để phép gán thực hiện đợc biểu thức và biến phải cùng kiểu .
2.6.2.Câu lệnh gán tín hiệu.
Phép gán tín hiệu ding để thay đổi giá trị của tín hiệu . Các tín hiệu luôn đợc biểu diễn kết hợp với diễn biến thời gian. Phép gán tín hiệu có cú pháp.
Tín hiệu đích <= [transport] biểu thức [afterthời gian];
Biểu thức: Xác định các giá trị gán, kiểu của biểu thức phải cùng kiểu với kiểu của tín hiệu đích, thời gianlà biểu thức có kiểu TIME.
-48- Ví dụ về câu lệnh gán tín hiệu: Signal s: bit:= “0”; Process Begin S <= transport ‘1’ after 5 ns; End process; 2.6.3. Câu lệnh if
Câu lệnh if tạo nên phân nhánh khi thực hiện chơng trình. Tuỳ theo kết quả của biểu thức điều kiện mà có thể hoặc một số lệnh hoặc không có lệnh nào đợc thực hiện. Cú pháp của lệnh if nh sau:
if <điều kiện> then
{Câu lệnh tuần tự}
{ elsif <điều kiện> then
{Câu lệnh tuần tự}
[ else {Câu lệnh tuần tự}]
end if ;
Ví dụ về câu lệnh if
if (day = sunday) then
weekend := TRUE;
elsif (day = saturday) then
weekend := TRUE;
else
weekday := TRUE;
end if;
-49-
Câu lệnh Case đợc sử dụng mỗi khi giá trị của một biểu thức đơn có thể đợc sử dụng để chọn giữa một số các hành động. Cú pháp của câu lệnh Case;
case <biểu thức> is
when <lựa chọn> => <câu lệnh tuần tự>
{when<lựa chọn> => <câu lệnh tuần tự> }
end case; Ví dụ về câu lệnh case case instruction is whenload_accum => accum <= data; whenstore_accum => data_out <= accum; whenload|store => process_IO(addr); whenothers => process_error(instruction); end case; 2.6.5. Các lệnh vòng lặp
Lệnh lặp loop chứa thân vòng lặp bao gồm các câu lệnh sẽ đợc thực hiện không hoặc nhiều lần. Câu lệnh loop có cú pháp nh sau:
[<nhãn>:] [<sơ đồ lặp>] loop
{lệnh tuần tự}
{next[<nhãn>] [when<điều kiện>]}; {exit[<nhãn>] [when<điều kiện> ]};
-50-
<nhãn>: Nhãn của vòng lặp và thờng xây dợng những vòng lặp lồng nhau, trong đó mỗi vòng lặp đợc kết thúc bởi từ khóa end loop;
<sơ đồ lặp>: Trong ngôn ngữ VHDL có một số dạng vònglặp với các sơ
đồ lặp khác nhau nh: vòng lặp với sơ đồ for, vòng lặp với sơ đồ While và
vòng lặp không chứa sơ đồ Ví dụ về câu lệnh lặp:
process(A, B)
constant max_limit : integer:= 255;
begin
for i in 0 to max_limit loop
if (done(i) = TRUE) then
next;
else
done(i) := TRUE;
end if;
q(i) <= a(i) AND b(i);
end loop;
end process;
2.6.6. Câu lệnh Null
Trong ngôn ngữ VHDL, khi chơng trình mô phỏng gặp câu lệnh null nó sẽ bỏ qua lệnh này và thực hiện lệnh tiếp sau. Cú pháp câu lệnh null:
Null;
Ví dụ về câu lệnh null:
case controller_command is
-51-
when reverse => engage_motor_reverse;
when idle => null;
end case;