Khai báo của các kiểu dữ liệu phải cho phép entity thấy được qua ANDGATE... Thân kiến trúc Architecture body Khai báo entity là một hộp đen với mô tả các giao tiếp I/O còn thân kiến
Trang 1Chương 5 THIẾT KẾ SỐ DÙNG VHDL
Trang 2NỘI DUNG
Trang 31 GIỚI THIỆU
Các phương pháp thiết kế:
Các phương trình Boolean
Thiết kế dựa trên Schematic
Các ngôn ngữ mô tả phần cứng HDLs (Hardware
Description Languages): VHDL, Verilog HDL, ABEL, …
Trang 41 GIỚI THIỆU (tt)
Quá trình thiết kế hệ thống số:
Trang 5 Vẽ dạng sóng quan hệ vào/ra (Waveform Editor)
Trang 61 GIỚI THIỆU (tt)
Tổng hợp (synthesis):
Tổng hợp logic (logic synthesis/logic optimization)
Tổng hợp sơ đồ mạch (layout synthesis/physical design)
Mô phỏng (simulation)
Trang 71 GIỚI THIỆU (tt)
VHDL (Very High Speed Integrated Circuits HDL):
Ngôn ngữ được dùng để mô tả các hệ thống số: lập tài liệu
(documentation), mô phỏng (simulation), kiểm chứng (verification) và tổng hợp (synthesis)
VHDL được chuẩn hóa vào năm 1987 qua chuẩn IEEE 1076
(VHDL-87) và được cập nhật năm 1993 (VHDL-93) Sau đó
được bổ sung qua chuẩn IEEE 1164 với hệ thống logic đa
trị.
Ứng dụng: thiết kế với các PLD, CPLD và FPGA
Sự khác biệt giữa VHDL và các ngôn ngữ lập trình thông thường
Ngôn ngữ lập trình thông thường: tuần tự
VHDL: song song
Trang 82 CÁC CẤU TRÚC CƠ BẢN CỦA VHDL
Trang 92.1 Entity (tt)
Khai báo entity
Entity định nghĩa giao tiếp của module phần cứng với môi
trường bên ngoài sử dụng nó
Cú pháp khai báo:
entity entity_name is
genericsports
begin
entity statements
end [entity] entity_name;
Trang 10 Các port trong khai báo entity:
Mỗi tín hiệu I/O trong một khai báo entity được xem là một
port
Mỗi port được khai báo phải có tên, chiều dữ liệu (mode) và
kiểu dữ liệu
port (port_name: mode data_type;
port_name: mode data_type;
… port_name: mode data_type);
In: luồng dữ liệu chỉ đi vào entity.
Out: luồng dữ liệu chỉ đi ra khỏi entity.
Buffer: tương tự out, nhưng cho phép hồi tiếp nội
Inout: luồng dữ liệu có thể vào hay ra entity và cũng cho phép hồi
tiếp nội.
Trang 112.1 Entity (tt)
Kiểu dữ liệu:
IEEE 1076/93: boolean, bit, bit_vector, integer, …
IEEE std_logic_1164: std_ulogic, std_ulogic_vector, std_logic và
std_logic_vector (hệ thống logic đa trị).
Các kiểu dữ liệu do người sử dụng đinh nghĩa.
Khai báo của các kiểu dữ liệu phải cho phép entity thấy được qua
ANDGATE
Trang 122.1 Entity (tt)
Ví dụ 2.2: khai báo bộ so sánh 4-bit
entity eqcomp4 is port (A, B : in bit_vector(3 downto 0);
equals : out bit);
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
Trang 132.2 Thân kiến trúc (Architecture body)
Khai báo entity là một hộp đen với mô tả các giao tiếp I/O còn
thân kiến trúc cung cấp mô tả chức năng của hộp đen đó
Một entity có thể có nhiều thân kiến trúc
Mỗi thân kiến trúc chỉ kết hợp với một khai báo entity
Các kiến trúc của VHDL được chia làm 2 loại:
Mô tả hành vi (behavior description)
Mô tả dạng giải thuật (algorithmic description)
Mô tả luồng dữ liệu (data flow description)
Mô tả cấu trúc (structural description)
Một thiết kế có thể dùng một trong các loại trên hay cũng có thể
kết hợp các loại với nhau
Trang 141 GIỚI THIỆU (tt)
Biểu diễn hệ thống:
Dạng hành vi: mô tả chức năng của hệ thống → tập trung
vào quan hệ giữa các tín hiệu vào và ra
Dạng cấu trúc: mô tả cài đặt bên trong của hệ thống → đặc tả
rõ ràng các thành phần nào được dùng và kết nối giữa chúng
Trang 152.2 Thân kiến trúc (Architecture body) (tt)
Khai báo thân kiến trúc:
architecture architecture_name of entity_name is
declarations
begin
concurrent_statements
end [architecture] architecture_name;
Mô tả hành vi: mô tả chức năng của hệ thống → tập trung vào
quan hệ giữa các tín hiệu vào và ra
Mô tả dạng giải thuật: còn được gọi là mô tả cấp cao
(high-level) vì nó tương tự với mô tả trong các ngôn ngữ cấp cao như C, Basic …
Trang 16Ví dụ 2.4: Mô tả dạng giải thuật:
bộ so sánh bằng 4-bit
entity eqcomp4 is
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
Trang 17 Mô tả luồng dữ liệu: mô tả cách dữ liệu truyền từ ngõ vào
đến ngõ ra (không dùng các phát biểu tuần tự)
Ví dụ 2.5: Mô tả dạng luồng dữ liệu:
bộ so sánh bằng 4-bit
library ieee;
use ieee.std_logic_1164.all;
entity eqcomp4 is
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
Trang 18Ví dụ 2.6: Mô tả dạng luồng dữ liệu khác:
bộ so sánh bằng 4-bit
library ieee;
use ieee.std_logic_1164.all;
entity eqcomp4 is
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
end eqcomp4;
architecture bool of eqcomp4 is
begin
equals <= not(a(0) xor b(0))
and not(a(1) xor b(1)) and not(a(2) xor b(2)) and not(a(3) xor b(3)) ; end bool;
Trang 192.2 Thân kiến trúc (Architecture body) (tt)
Mô tả dạng cấu trúc:
Chứa các danh sách kết nối (netlist) – các thành phần
(component) được khởi tạo và được kết nối với nhau qua các tín hiệu
Thiết kế dạng phân tầng (hierarchical design)
Structural Decomposition
Behavioral Modeling
a Full Tree Design
Behavioral Modeling
b Partial Tree Design
Trang 20Ví dụ 2.7: Mô tả dạng cấu trúc:
library ieee;
use ieee.std_logic_1164.all;
entity eqcomp4 is
port (a, b : in std_logic_vector(3 downto 0);
equals: out std_logic);
u0: xnor2 port map (a(0), b(0),x(0));
u1: xnor2 port map (a(1), b(1),x(1));
u2: xnor2 port map (a(2), b(2),x(2));
u3: xnor2 port map (a(3), b(3),x(3));
u4: and4 port map (x(0), x(1),x(2),x(3),equals);
end struct;
Trang 212.3 Danh hiệu
gạch dưới
Ký tự đầu tiên phải là chữ cái
Ký tự cuối cùng không được là dấu gạch dưới
Không phân biệt chữ hoa/thường
Không cho phép hai dấu gạch dưới xuất hiện liên tiếp
Có thể sử dụng bất cứ ký tự cho phép nào, bao gồm cả các
ký tự !, , @, và $
Phân biệt chữ hoa và chữ thường
Trang 22 Ví dụ 2.9: Các danh hiệu nào sau đây là hợp lệ:
Trang 232.4 Các đối tượng dữ liệu
Đối tượng dữ liệu giữ giá trị cĩ kiểu dữ liệu cụ thể
Đối tượng dữ liệu thuộc một trong 4 lớp: hằng số, biến số, tín
hiệu và tập tin (file)
Kh n ng nhìn th y (visibility):ả năng nhìn thấy (visibility): ăng nhìn thấy (visibility): ấy (visibility):
Một đối tượng được khai báo trong một package có thể
được tham chiếu bởi một entity hay một architecture dùng package đó
Một đối tượng được khai báo trong một entity chỉ được
thấy trong entity đó
Một đối tượng được khai báo trong một architecture chỉ
được thấy trong architecture đó
Một đối tượng được khai báo trong một process chỉ được
thấy trong process đó
Trang 242.4.1 Hằng số
Giữ một giá trị khơng đổi trong mơ tả thiết kế Giá trị này
thường được gán khai báo
constant constant_name: type_name [:= value];
Ví dụ 2.10: Các khai báo hằng số:
constant bus_width: integer := 8;
constant rise_time: time := 10ns;
constant iteration: integer := 4;
Được khai báo trong vùng khai báo của package, entity,
architecture hay process
Ứng dụng: định nghĩa nội dung của ROM hay các thông số cố
định (delay, số lần lặp, rise time, hold time …)
Trang 252.4.2 Tín hiệu
Đại diện cho giá trị dữ liệu trên các đường dữ liệu thực trong
mạch (wire, port …) hay trạng thái của các phần tử nhớ
signal signal_name: type_name [:= initial value];
Ví dụ 2.11: Các khai báo tín hiệu
signal clock: bit;
signal databus: std_logic_vector(0 to 7);
Thường được khai báo trong phần khai báo của entity hay
architecrture
Có hai chiều: thời gian và giá trị
Một giá trị được gán đến một tín hiệu không làm tín hiệu thay
đổi tức thời mà phải sau một thời gian delay nhỏ
Ký hiệu phép gán: “<=”
Trang 26 Chỉ dùng trong các process hay subprogam (function và
procedure)
variable variable _name: type_name [:= initial value];
Ví dụ 2.12: Các khai báo biến số
variable result: std_logic := 0;
variable sum: integer range 0 to 100 := 10;
Ph i được khai báo trong vùng khai báo của các process hay ả năng nhìn thấy (visibility):
subprogam
Phép gán cho một variable là tức thời (không có chiều thời
gian)
Ký hiệu phép gán: “:=”
Các biến được dùng chủ yếu cho mục đích tính toán (vòng lặp,
trị trung gian, …)
Trang 272.5 Các kiểu dữ liệu
Trong VHDL các đối tượng dữ liệu của các kiểu cơ bản (base
type) khác nhau không thể gán cho nhau mà không dùng hàm chuyển đổi kiểu
Ví dụ 2.13: Nếu a và b đều là các biến nguyên thì phép gán
a <= b + ‘1’;
sẽ phát sinh lỗi trừ khi toán tử “+” là overloaded
Các kiểu dữ liệu trong VHDL có thể chia ra làm 4 loại chính:
Kiểu vô hướng (kiểu một chiều)
Kiểu phức hợp (kiểu đa chiều)
Kiểu truy cập (access)
Kiểu tập tin (file)
Trang 282.5.1 Kiểu vô hướng
Kiểu vô hướng chỉ giữ một giá trị tại thời điểm mô phỏng hiện
hành (current simulation time)
Kiểu vô hướng có thứ tự cho phép dùng với các toán tử quan hệ
Có 4 loại kiểu vô hướng:
(1) Kiểu liệt kê (enumeration type)
(2) Kiểu số nguyên (integer type)
(3) Kiểu số dấu chấm động (floating type)
(4) Kiểu vật lý (physical type)
Trang 292.5.1.1 Kiểu liệt kê
Danh sách các giá trị mà một đối tượng có thể giữ
Kiểu liệt kê có thứ tự: giá trị phía trái nhất là nhỏ nhất, tăng dần
theo chiều sang phải và giá trị phía phải nhất là lớn nhất
Các kiểu định nghĩa sẵn (predefined) trong các gói standard,
std_logic_1164, …
standard: bit, boolean, character
std_logic_1164: std_ulogic, std_logic
Ví dụ 2.14:
type boolean is (false, true);
type bit is (‘0’, ‘1’);
Trang 302.5.1.1 Kiểu liệt kê (tt)
std_ulogic: hệ thống 9 mức logic
type std_ulogic is (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘-’);
Kiểu std_logic có cùng tập giá trị như std_ulogic nhưng có
hàm phân giải, resolved, để phân giải mức logic khi có nhiều phép gán đến cùng một tín hiệu
subtype std_logic is resolved std_ulogic;
Trang 312.5.1.1 Kiểu liệt kê (tt)
Do người sử dụng định nghĩa (user-defined):
Ví dụ 2.15:
type states is (read, write , play, sleep);
signal current_state: states;
type sports is (baseball, football, basketball, soccer, running);
signal your_sport: sports;
better_than_baskball<=‘1’ when your_sport>= basketball else
‘0’;
Trang 322.5.1.2 Kiểu integer
VHDL hỗ trợ các số nguyên trong khoảng – 2147483648 (hay –
(231-1)) ÷ 2147483647 ((231-1)) → (32-bit)
type integer is range -2147483648 to 2147483647;
Một đối tượng kiểu integer có thể ràng buộc với một khoảng
variable a : integer range -255 to 255;
Các thao tác với số có dấu và không dấu → tùy công cụ tổng hợp
hỗ trợ
2.5.1.3 Kiểu real
Giá trị trong khoảng -1.0E38 ÷ +1.0E38
type real is range -1.0E38 to 1.0E38;
Thường không được hỗ trợ trong các công cụ tổng hợp do lượng
tài nguyên cần để cài đặt các thao tác số học là rất lớn
Trang 33 Thường là các đơn vị đo, không có ý nghĩa cho việc tổng hợp.
Ví dụ 2.16: Kiểu vật lý định nghĩa sẵn là time
type time is range -2147483647 to 2147483647
Trang 342.5.2 Kiểu phức hợp
Một đối tượng kiểu phức hợp có thể giữ nhiều giá trị tại 1 thời
điểm
Có 2 loại kiểu phức hợp:
(1) Kiểu mảng (array type)
(2) Kiểu bản ghi (record type)
Trang 35 Đối tượng kiểu mảng gồm nhiều phần tử có cùng kiểu dữ liệu.
Các kiểu định nghĩa sẵn:
Ví dụ 2.17:
type bit_vector is array (natural range <>) of bit;
type std_logic_vector is array (natural range <>) of std_logic;
signal a: std_logic_vector (7 downto 0);
Người dùng cũng có thể định nghĩa kiểu riêng:
Ví dụ 2.18:
type byte is array(7 downto 0) of bit;
signal b: byte;
type data_word is array (7 downto 0) of std_logic; 1D
type ROM is array (0 to 125) of data_word; 1D x 1D
type decode_matrix is array (positive range 15 downto 1,
natural range 3 downto 0) of std_logic; 2D
Trang 36 Một đối tượng mảng có thể gán cho một đối tượng mảng khác có
Có thể dùng ký hiệu để chỉ định cơ số cho một chuỗi bit: nhị
phân (B), bát phân (O) và thập lục phân (X)
Ví dụ 2.20:
signal a: std_logic_vector(0 to 7);
a <= X“7A”;
Trang 37 Đối tượng kiểu bản ghi gồm nhiều phần tử có thể có các kiểu dữ
liệu khác nhau
Ví dụ 2.21:
type iocell is record
buffer_inp : bit_vector(7 downto 0);
Trang 38 Ví dụ 2.22:
type byte_size is integer range 0 to 255;
signal my_int: byte_size;
signal your_int: integer range 0 to 255;
Thao tác sau phát sinh lỗi biên dịch: if my_int=your_int then …
Kiểu con là kiểu cơ bản (base type) với một ràng buộc
Ví dụ 2.23:
type DIGIT is (‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’);
subtype MIDDLE is DIGIT range ’3’ to ’7’;
subtype byte is bit_vector(7 downto 0);
signal b1: byte;
signal b2: bit_vector(7 downto 0);
Thao tác sau không phát sinh lỗi biên dịch: if b1 = b2 then …
Trang 392.5.4 Một số kiểu dữ liệu bổ sung
Chuẩn IEEE 1076.3 định nghĩa 2 package VHDL: numeric_bit
và numeric_std
Hai package này mở rộng một vài toán tử và định nghĩa một số
hàm mới cho các kiểu unsigned và signed
Numeric_std:
type unsigned is array (natural range <>) of std_logic;
type signed is array (natural range <>) of std_logic;
Numeric_bit:
type unsigned is array (natural range <>) of bit;
type signed is array (natural range <>) of bit;
Tham khảo thêm các package khác trong \Refs\ieee1164pkg.pdf
Trang 402.5.5 Chuyển đổi kiểu dữ liệu
Chuyển đổi từ một kiểu dữ liệu này sang một kiểu dữ liệu khác
Các package bổ sung cung cấp sẵn một số hàm chuyển đổi kiểu
(tham khảo \Refs\ieee1164pkg.pdf)
Ví dụ 2.24:
- to_stdlogicvector(bit_vector): chuyển bit_vector thành std_logic_vector.
signal a: bit_vector(3 downto 0);
signal b: std_logic_vector(3 downto 0);
a <= “0101”;
b <= to_stdlogicvector(a);
- conv_std_logic_vector(integer, bits) : chuyển integer thành std_logic_vector.
conv_std_logic_vector(7,4) sẽ cho kết quả là “0111”
- conv_integer(std_logic_vector) : chuyển std_logic_vector thành integer.
conv_integer(“0111”) sẽ cho kết quả là 7
Trang 412.6 Các toán tử
Biểu thức (expression): bao gồm các toán tử và các toán hạng
Mỗi toán tử (operator) được chỉ định với một hay một số kiểu dữ
liệu cụ thể → dùng toán tử với các toán hạng thuộc kiểu dữ liệu không được hỗ trợ là không hợp lệ → các toán tử mở rộng (overloaded operators)
Trang 422.6 Các toán tử (tt)
Các toán hạng trong các phép toán số học phải cùng kiểu,
ngoại trừ phép toán lấy mũ cần số mũ phải là số nguyên
Các toán tử logic không có thứ tự ưu tiên như trong đại số
Boole → cần dùng các dấu ngoặc trong các phương trình logic nhiều tầng (multilevel logic equations)
Ví dụ 2.25:
X = A + B.C trong đại số Boole được tính là X = A + (B.C)
Nhưng trong VHDL sẽ là X = (A + B).C
Do đó đoạn mã: X <= A or B and C cần viết lại là X <= A or (B and C)
Các toán hạng trong các phép toán quan hệ phải cùng kiểu,
tuy nhiên kết quả luôn là kiểu Boolean (True hay False)
Overloaded operators: tham khảo \Refs\ieee1164pkg.pdf
Trang 432.7 Các thuộc tính
Cung cấp thông tin bổ sung về một tín hiệu, biến, kiểu dữ liệu
hay một thành phần (component)
Một số thuộc tính định nghĩa sẵn thông dụng:
Một số thuộc tính của kiểu vô hướng và kiểu mảng:
X'high giới hạn trên của X (hay chỉ số trên nếu X là 1 mảng) X'low giới hạn dưới của X (hay chỉ số dưới nếu X là mảng) X'left giá trị phía trái nhất của X (hay chỉ số phía trái nhất nếu X là
1 mảng)
X'right giá trị phía phải nhất của X (hay chỉ số phía phải nhất nếu X là
1 mảng)
Một số thuộc tính của kiểu mảng có ràng buộc:
X'reverse_range khoảng của X theo thứ tự ngược