Nội dung môn học
3. Thiết kế mạch với ngôn ngữ VHDL.
1. Giới thiệu VHDL.
2. Cấu trúc code.
3. Các kiểu dữ liệu.
4. Các phép toán và thuộc tính.
5. Code song song/Code tuần tự.
6. Tín hiệu và biến.
7. Máy hữu hạn trạng thái.
8. Phương pháp thiết kế đa cấp (Packages,
Components, Subprogram).
9. Attibutes & Configurations.
Thiết kế CPU.
3.2 - CẤU TRÚC MÃ LỆNH VHDL
library IEEE;
use IEEE.std_logic_1164.all;
LIBRARY
VHDL
BASIC
CODE
ENTITY
ARCHITECTURE
ENTITY Cong_And IS
PORT (a,b, : in bit;
y :out bit);
END Cong_And;
Architecture dataflow of
Cong_And is
begin
y <= a and b;
end dataflow;
3. Các kiểu dữ liệu.
3.1. Các kiểu đối tượng.
3.1.1. Signal
3.1.2. Variable
3.1.3. Constant
3.2. Các kiểu dữ liệu.
3.1. Các kiểu đối tượng
Một đối tượng VHDL bao gồm 1 trong
các loại sau:
Signal: biểu diễn cho dây kết nối giữa
các cổng của các thành phần trong hệ
thống.
Variable: được sử dụng lưu trữ dữ liệu
nội bộ tạm thời, chỉ visible bên trong
process.
Constant: hẳng số
3.1.1. Signal
Signal
Các đối tượng signal được sử dụng
để kết nối - truyền thông giữa các
entity nhằm tạo nên hệ thống.
3.1.1. Signal
Phân loại:
External Signal: là các tín hiệu kết nối
hệ thống với bên ngoài, tạo nên giao
diện ghép nối của hệ thống với các hệ
thống khác.
Internal Signal: là các tín hiệu chỉ
nhúng bên trong hệ thống, không nhìn
thấy từ bên ngoài, tạo ra sự truyền
thông giữa các thành phần bên trong
hệ thống.
3.1.1. Signal
External Signal & Internal Signal:
External
Signal
Khai báo
trong Entity
NTITY myboard IS
PORT ( [SIGNAL] a,b,c: inout bit;
data,extbus,result: inout bit_vector(0 to 7));
ND myboard;
Internal
Signal
Khai báo
trong Architecture
ARCHITECTURE structure OF myboard IS
SIGNAL x,y: bit;
SIGNAL intbus: bit_vector(0 to 7);
BEGIN
3.1.1. Signal
Vị trí khai báo signal:
Phần khai báo của ENTITY
Phần khai báo của ARCHITECTURE
Phần khai báo của PACKAGE
Khai báo signal:
SIGNAL name: mode type
[:=initial_value]
Không cần trong ENTITY
Chỉ cần trong ENTITY
3.1.1. Signal
Ví dụ khai báo signal trong
package:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
PACKAGE sigdecl IS
TYPE bus_type IS ARRAY(0 to 7) OF std_logic;
SIGNAL vcc : std_logic := ‘1’;
SIGNAL ground : std_logic := ‘0’;
FUNCTION magic_function( a : IN bus_type) RETURN bus_type;
END sigdecl;
=> USE WORK.sigdecl.ALL;
3.1.1. Signal
Phạm vi tác động của khai báo signal:
Một signal được khai báo trong PACKAGE thì
sử dụng được (visible) trong tất cả các thiết
kế sử dụng gói package này.
Một signal được khai báo trong ENTITY thì sử
dụng được (visible) trong tất cả các
ARCHITECTURE gắn với ENTITY này.
Một signal được khai báo trong phần khai
báo của ARCHITECTURE thì chỉ sử dụng được
trong architecture này.
Một signal được khai báo trong 1 khối
(block) bên trong ARCHITECTURE thì chỉ sử
dụng được bên trong khối đó.
3.1.1. Signal
Ví dụ về phạm vi tác động của
signal
C
A
D
B
E
F
3.1.1. Signal
Một đặc điểm quan trọng của
signal khi được sử dụng bên trong
một phần của mã tuần tự (vd
PROCESS, FUNCTION, PROCEDURE)
là:
Giá trị không được cập nhật ngay lập
tức sau câu lệnh, mà phải đến kết
thúc đoạn mã tuần tự đó.
3.1.2. Biến (variable)
Biến variable chỉ biểu diễn các dữ
liệu nội bộ, chỉ có thể sử dụng bên
trong PROCESS, FUNCTION, hoặc
PROCEDURE.
Giá trị của biến variable không thể
truyền ra ngoài trực tiếp.
Giá trị của biến được cập nhật trực
tiếp sau từng dòng mã lệnh.
3.1.2. Biến (variable)
Khai báo biến:
VARIABLE name: type [range] [:=
init_value];
VARIABLE control: BIT := '0';
VARIABLE count: INTEGER RANGE 0 TO 100;
VARIABLE y: STD_LOGIC_VECTOR (7 DOWNTO 0) := "10001000";
Ví dụ
về sử
dụng
variabl
e
trong
VHDL
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------ENTITY count_ones IS
PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
ones: OUT INTEGER RANGE 0 TO 8);
END count_ones;
--------------------------------------ARCHITECTURE ok OF count_ones IS
BEGIN
PROCESS (din)
VARIABLE temp: INTEGER RANGE 0 TO 8;
BEGIN
temp := 0;
FOR i IN 0 TO 7 LOOP
IF (din(i)='1') THEN
temp := temp + 1;
END IF;
END LOOP;
ones <= temp;
END PROCESS;
END ok;
BRARY ieee;
SE ieee.std_logic_1164.all;
--------------------------------------NTITY mux IS
ORT ( a, b, c, d, s0, s1: IN STD_LOGIC;
y: OUT STD_LOGIC);
ND mux;
--------------------------------------RCHITECTURE not_ok OF mux IS
SIGNAL sel : INTEGER RANGE 0 TO 3;
EGIN
PROCESS (a, b, c, d, s0, s1)
BEGIN
sel <= 0;
IF (s0='1') THEN sel <= sel + 1;END IF;
IF (s1='1') THEN sel <= sel + 2;END IF;
CASE sel IS
WHEN 0 => y<=a;
WHEN 1 => y<=b;
WHEN 2 => y<=c;
WHEN 3 => y<=d;
END CASE;
END PROCESS;
ND not_ok;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
----------------------------------------ENTITY mux IS
PORT ( a, b, c, d, s0, s1: IN STD_LOGIC;
7y: OUT STD_LOGIC);
END mux;
----------------------------------------ARCHITECTURE ok OF mux IS
BEGIN
PROCESS (a, b, c, d, s0, s1)
VARIABLE sel : INTEGER RANGE 0 TO 3;
BEGIN
sel := 0;
IF (s0='1') THEN sel := sel + 1; END IF;
IF (s1='1') THEN sel := sel + 2; END IF;
CASE sel IS
WHEN 0 => y<=a;
WHEN 1 => y<=b;
WHEN 2 => y<=c;
WHEN 3 => y<=d;
END CASE;
END PROCESS;
END ok;
So sánh giữa Signal &
Variable
3.1.3. Hằng số (Constant)
Hằng số Constant là các tên được gán
cho các giá trị cụ thể của 1 kiểu DL. Sử
dụng hằng số cho phép người thiết kế
xây dựng mô hình dễ hiểu (betterdocumented) và dễ thay đổi.
Khai báo hằng số:
CONSTANT name : type := value;
Hằng số có thể khai báo trong package,
entity hoặc architecture. Phạm vi tác động
giống như tín hiệu signal.
3.1.3. Hằng số (Constant)
Ví dụ về khai báo hằng số:
CONSTANT set_bit : BIT := '1';
CONSTANT pi: REAL := 3.1414;
CONSTANT datamemory : memory := ( ('0','0','0','0'),
('0','0','0','1'),
('0','0','1','1'));
3.2. Các kiểu dữ liệu VHDL
3.2.1. Kiểu dữ liệu vô
hướng
Kiểu dữ liệu vô hướng (Scalar
Types):
Integer types
Real types
Enumerated types
Physical types
Kiểu số nguyên Integer
Kiểu dl số nguyên 32 bit,
synthesizable.
Hỗ trợ các phép tóan: +, -, *, /
Dải giá trị biểu diễnARCHITECTURE
được: test OF test IS
BEGIN
PROCESS(X)
VARIABLE a : INTEGER;
VARIABLE b : int_type;
BEGIN
a := 1; --Ok 1
a := -1; --Ok 2
a := 1.0; --error 3
END PROCESS;
END test;
-2,147,483,647
=> +2,147,483,647
Kiểu số thực Real
Kiểu dl số thực, un-synthesizable.
Dải giá trị biểu diễn được:
-1.0E+38
=> +1.0E+38.
ARCHITECTURE test OF test IS
SIGNAL a : REAL;
BEGIN
a <= 1.0;
--Ok 1
a <= 1;
--error 2
a <= -1.0E10; --Ok 3
a <= 1.5E-20; --Ok 4
a <= 5.3 ns; --error 5
END test;
Kiểu dữ liệu liệt kê
ENUMERATED
Kiểu dữ liệu liệt kê rất hữu ích cho
việc mô hình hóa trừu tượng, biểu
diễn chính xác các giá trị cần cho
tính toán.
Các kiểu
dữ liệu
TYPE bit IS ('0', '1');
liệt kê đã
TYPE bit_vector IS ARRAY (NATURAL RANGE <>) OF BIT;
định nghĩa
trước
TYPE fourval IS ( ‘X’, ‘0’, ‘1’, ‘Z’ );
TYPE state IS (idle, forward, backward, stop);
TYPE color IS ( red, yellow, blue, green, orange );
Kiểu dữ liệu liệt kê
ENUMERATED
Việc mã hóa các dữ liệu liệt kê
được thực hiện tuần tự và tự động.
Ví dụ:
TYPE color IS (red, green, blue, white);
Có 4 dữ liệu liệt kê, dùng 2 bit biểu
diễn, gán “00”=>red, “01”=>green,
“10”=>blue, “11”=>white.