Tải bản đầy đủ (.pdf) (41 trang)

Giao trinh bai tap kts2 ch2 asm

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (438.98 KB, 41 trang )

GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

VHDL
- VHDL là ngôn ngữ mô tả phần cứng.
- VHDL viết tắt của VHSIC (Very High Speed Integrated
Circuit) Hardware Description Language
- VHDL không phân biệt chữ viết hoa và chữ thường.

databus

Databus

DataBus

DATABUS

- VHDL là ngôn ngữ “đònh dạng tự do”.
if (a=b) then
if

(a=b)

then

if (a =
b) then
NguyenTrongLuat

1



Thuật ngữ COMPONENT:
- Là khái niệm trung tâm mô tả phần cứng bằng VHDL để biểu
diễn các cấp thiết kế từ cổng đơn giản đến 1 hệ thống phức tạp.
- Mô tả component bao gồm ENTITY và ARCHITECTURE.
- Một component có thể sử dụng các component khác.
mux2to1

nand2

a
b

NguyenTrongLuat

GV dạy: Lê Chí Thơng

d0

z

d1

y

sel

2

1



GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

Mã VHDL cơ bản
LIBRARY
khai báo thư viện
ENTITY
thực thể
ARCHITECTURE
kiến trúc

NguyenTrongLuat

3

Ví dụ: Mã VHDL mô tả component NAND 2 ngõ vào
LIBRARY ieee;
USE ieee.std_logic_1164.all;

a
b

z

ENTITY nand_gate IS
PORT(
a

: IN STD_LOGIC;
b
: IN STD_LOGIC;
z
: OUT STD_LOGIC);
END nand_gate;
ARCHITECTURE model OF nand_gate IS
BEGIN
z <= a NAND b;
END model;

NguyenTrongLuat

GV dạy: Lê Chí Thơng

4

2


GV soạn: Nguyễn Trọng Luật

LIBRARY

ĐH Bách Khoa TP.HCM

LIBRARY ieee;
USE ieee.std_logic_1164.all;

- LIBRARY: khai báo thư viện ieee

- USE: sử dụng các đònh nghóa gói (package) std_logic_1164
ENTITY

Mô tả các tín hiệu xuất/nhập của khối component

a

z

b

ENTITY nand_gate IS
PORT(
a
: IN STD_LOGIC;
b
: IN STD_LOGIC;
z
: OUT STD_LOGIC);
END nand_gate;

- ENTITY: đặt tên cho entity (nand_gate)
- PORT: khai báo các chân xuất/nhập
* Tên port (portname): a, b, z
* Kiểu port (mode): IN, OUT
* Kiểu tín hiệu (type): STD_LOGIC
NguyenTrongLuat

5


* Các kiểu chân PORT I/0

IN: dữ liệu đi vào entity qua port và có thể được đọc trong entity.
OUT: dữ liệu xuất ra ngoài entity qua chân port.
Port OUT không thể đọc về lại entity.
INOUT: là port 2 chiều, cho phép dữ liệu đi vào hoặc ra.
BUFFER: tương tự port OUT, nhưng được phép đọc lại bởi entity.
IN

OUT
BUFFER

IN
IN

INOUT

OUT
NguyenTrongLuat

GV dạy: Lê Chí Thơng

6

3


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM


ARCHITECTURE
Mô tả thiết kế bên trong của khối, chỉ rõ mối quan hệ
giữa các ngõ vào và ngõ ra.
a

z

b

ARCHITECTURE model OF nand_gate IS
BEGIN
z <= a NAND b;
END model;

- ARCHITECTURE: đặt tên cho architecture (model
model)
model
- Có 3 loại mô tả architecture
* Mô tả cấu trúc (Structural)
* Mô tả luồng dữ liệu (Dataflow)
* Mô tả hành vi (Behavioral)
NguyenTrongLuat

7

ĐỐI TƯNG DỮ LIỆU (Data object)
* Tín hiệu (signal): biểu diễn cho các dây kết nối của mạch.
Nó được khai báo trong phần PORT của khai báo entity hoặc
trong phần đầu trong architecture (trước BEGIN).

SIGNAL signal_name : signal_type;
SIGNAL a : std_logic;
* Biến (Variable): được khai báo và sử dụng trong process.
Biến không phải là tín hiệu logic thật.
VARIABLE variable_name : variable_type;
VARIABLE b : std_logic;
* Hằng số (Constant): giữ một giá trò không được thay đổi
CONSTANT constant_name : constant_type;
CONSTANT max : integer;
Các đối tượng dữ liệu có thể được đặt giá trò đầu, khai báo sau
phần khai báo kiểu dữ liệu _type:= value;
CONSTANT max : integer : = 25;
NguyenTrongLuat

GV dạy: Lê Chí Thơng

8

4


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

* Sự khác nhau giữa Tín hiệu (Signal) và Biến (Variable)
- Lệnh gán tín hiệu:

signal_name <= expression;
a <= NOT b AND c;


- Lệnh gán biến:

variable_name := expression;
y := NOT a;

- Phép gán biến (Variable) cho giá trò tức thời, phép gán
của tín hiệu (signal) bò trễ (delay)
- Tín hiệu (Signal) có thể quan sát dạng sóng (waveform),
nhưng biến (Variable) thì không.
- Biến (Variable) là cục bộ trong process.
NguyenTrongLuat

9

KIỂU DỮ LIỆU (Data type)
- Các kiểu dữ liệu là đặc tính của signal, variable, …
- Các dữ liệu cùng kiểu mới được gán hoặc kết nối với nhau
- Có thể tạo ra các kiểu dữ liệu mới bằng lệnh TYPE hoặc
SUBTYPE
* Kiểu BIT và BIT_VECTOR:
- BIT có giá trò ‘0’ và ‘1’.
- BIT_VECTOR là dãy (array) của BIT.
* Kiểu INTEGER
* Kiểu BOOLEAN: có giá trò TRUE và FALSE.
* Kiểu CHARACTER
* Kiểu liệt kê (ENUMERATION) do người sử dụng đònh nghóa.
* ...
NguyenTrongLuat


GV dạy: Lê Chí Thơng

10

5


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

* STD_LOGIC:

Value

- Là kiểu tín hiệu quyết
đònh (có thể được lái bằng
2 ngõ vào)
- Có 9 giá trò
- Hữu ích khi mô phỏng
- Chỉ có 3 giá trò ‘0’, ‘1’,
‘Z’ là có thể tổng hợp

Meaning

‘X’

Forcing (Strong driven) Unknown

‘0’


Forcing (Strong driven) 0

‘1’

Forcing (Strong driven) 1

‘Z’

High Impedance

‘W’

Weak (Weakly driven) Unknown

‘L’

Weak (Weakly driven) 0.
Models a pull down.

‘H’

Weak (Weakly driven) 1.
Models a pull up.

‘-’

Don't Care

‘U’


Uninitialized

SIGNAL a: STD_LOGIC;
a là tín hiệu STD_LOGIC kiểu 1 bit
SIGNAL b: STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL c: STD_LOGIC_VECTOR(0 TO 7);
b,c là tín hiệu STD_LOGIC kiểu bus có 8 bit

NguyenTrongLuat

11

Phép gán tín hiệu kiểu STD_LOGIC
SIGNAL
SIGNAL
SIGNAL
SIGNAL
SIGNAL
SIGNAL

a:
b:
c:
d:
e:
f:

STD_LOGIC;
STD_LOGIC_VECTOR(3 DOWNTO 0);

STD_LOGIC_VECTOR(0 TO 3);
STD_LOGIC_VECTOR(7 DOWNTO 0);
STD_LOGIC_VECTOR(15 DOWNTO 0);
STD_LOGIC_VECTOR(8 DOWNTO 0);

-- giá trò gán đặt giữa 1 dấu nháy đơn ‘ ’
-- a <= b(2),
-- giá trò gán đặt giữa 1 dấu nháy kép “ ”
-- B là ký hiệu cơ số 2 (có thể bỏ)
-- biểu diễn từng nhóm 4 bit phân cách _
-- X là ký hiệu cơ số 16 (Hex)
-- O là ký hiệu cơ số 8 (Octal)
-- b(3) <= c(0), b(2) <= c(1),
-- b(1) <= c(2), b(0) <= c(3)
d(7 downto 6)<= ”11”;
c(0 to 2)<= e(7 downto 5);
a
a
b
c
d
e
f
b

<=
<=
<=
<=
<=

<=
<=
<=

’1’;
b(2);
"0000”;
B”0000”;
”0110_0111”;
X”AF67”;
O”723”;
c;

NguyenTrongLuat

GV dạy: Lê Chí Thơng

12

6


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

Ghép nối chuỗi (Concatenation)
SIGNAL a: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL b: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL c, d, e: STD_LOGIC_VECTOR(7 DOWNTO 0);


a <= ”0000”;
b <= ”1111”;
c <= a & b;

--

d <= ’0’ & ”0001111”;

-- d = “00001111”

c = “00001111”

e <= ’0’ & ’0’ & ’0’ & ’0’ & ’1’ & ’1’ &
’1’ & ’1’;
-- e = “00001111”

NguyenTrongLuat

13

PHÉP TOÁN (Operator)
* Phép toán Logic (Logical Operator):

NOT

AND

OR


NAND

NOR

XOR

XNOR

Sử dụng cho kiểu: bit, bit_vector, boolean, std_logic, std_logic_vector.
* Phép toán quan hệ (Relationship Operator):

=

/=

<

<=

>

>=

So sánh 2 toán hạng cùng kiểu và kết quả trả về kiểu boolean
* Phép toán dòch (Shift Operator):

SLL

SRL


SLA

SRA

* Phép toán cộng (Adding Operator):
NguyenTrongLuat

GV dạy: Lê Chí Thơng

ROL
+

ROR
14

7


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

* Phép toán nhân (Multiplying Operator):

*

/

MOD


REM

* Phép toán dấu (Sign Operator):
* Phép toán khác (Operator):

**

+
ABS

* Thứ tự ưu tiên thực hiện các phép toán

**
*
+
+
=
AND

ABS NOT
/
MOD
REM
(Dấu)
&
/=
<
<=
>
>=

OR NAND NOR XOR XNOR

Các phép toán cùng loại không có ưu tiên, nếu cần sử dụng ( )
NguyenTrongLuat

15

MÔ TẢ THIẾT KẾ (Design description)

MÔ TẢ THIẾT KẾ
(Design description)

CẤU TRÚC

LUỒNG DỮ LIỆU

HÀNH VI

(Structural)

(Dataflow)

(Behavioral)

NguyenTrongLuat

GV dạy: Lê Chí Thơng

16


8


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

MÔ TẢ CẤU TRÚC (Structural description)
- Sử dụng các khối component có cấp thấp hơn.
- Các khối component này được kết nối theo thứ bậc.
- Các component cấp thấp được khai báo bằng lệnh
COMPONENT, đặt ở phần ARCHITECTURE (trước BEGIN).
x1

y

x2

COMPONENT and2
PORT (x1,x2:IN STD_LOGIC;
y: OUT STD_LOGIC);
END COMPONENT;

- Để kết nối component cấp thấp, thực hiện lệnh thay thế trò
số component (component instantiation) PORT MAP.
Có 2 cách: * Kết hợp vò trí (positional association)
* Kết hợp theo tên (named association)
NguyenTrongLuat

17


* Kết hợp theo tên (named association)
COMPONENT component_name
port declarations;
END COMPONENT;
...
Label: component_name PORT MAP (
port_name1 => sig_name1,
port_name2 => sig_name2 );
COMPONENT and2
PORT (x1,x2:IN STD_LOGIC;
y: OUT STD_LOGIC);
END COMPONENT;
BEGIN
user1: and2 PORT MAP ( x1 => a, x2 => b,
y => c );
...
NguyenTrongLuat

GV dạy: Lê Chí Thơng

18

9


GV son: Nguyn Trng Lut

H Bỏch Khoa TP.HCM


* Keỏt hụùp vũ trớ (positional association)
COMPONENT component_name
port declarations;
END COMPONENT;
...
Label: component_name PORT MAP (
sig_name1, sig_name2, ...

);

COMPONENT and2
PORT (x1,x2:IN STD_LOGIC;
y: OUT STD_LOGIC);
END COMPONENT;
BEGIN
user1: and2 PORT MAP ( a, b, c );
...
NguyenTrongLuat

VD: Thieỏt keỏ XOR 3 ngoừ vaứo
LIBRARY ieee;
USE ieee.std_logic_1164.all;

19

a
b

u1_out
result


c

ENTITY xor3 IS
PORT ( a, b, c : IN STD_LOGIC;
result : OUT STD_LOGIC);
END xor3;
ARCHITECTURE structural OF xor3 IS
SIGNAL u1_out: STD_LOGIC;
COMPONENT xor2
PORT ( i1, i2 : IN STD_LOGIC;
y : OUT STD_LOGIC );
END COMPONENT;
BEGIN
u1: xor2 PORT MAP ( i1 => a, i2 => b,
y => u1_out);
u2: xor2 PORT MAP ( i1 => u1_out, i2 => c,
y => result);
END structural;
NguyenTrongLuat

GV dy: Lờ Chớ Thụng

20

10


GV soạn: Nguyễn Trọng Luật


ĐH Bách Khoa TP.HCM

MÔ TẢ LUỒNG DỮ LIỆU (Dataflow description)
- Mô tả luồng dữ liệu di chuyển từ ngõ vào đến ngõ ra.
- Sử dụng các phát biểu đồng thời (Concurrent statement):
* Phép gán bằng phép toán
* Phép gán WHEN - ELSE
* Phép gán WITH – SELECT - WHEN
* Phép tạo GENERATE
- Các phát biểu này được thực thi cùng thời điểm, vì vậy thứ
tự các phát biểu là như nhau
NguyenTrongLuat

21

Phép gán bằng phép toán (OPERATOR)
a
b

u1_out
result

c
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY xor3 IS
PORT ( a, b, c : IN STD_LOGIC;
result : OUT STD_LOGIC);
END xor3;
ARCHITECTURE dataflow OF xor3 IS

SIGNAL u1_out: STD_LOGIC;
BEGIN
Result <= u1_out XOR c;
u1_out <= a XOR b;
Result <= u1_out XOR c; u1_out <= a XOR b;
END dataflow;
NguyenTrongLuat

GV dạy: Lê Chí Thơng

22

11


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

Pheùp gaùn tín hieäu theo ñieàu kieän (Condition Signal Assigment)
WHEN - ELSE
signal_name <= value1 WHEN condition1 ELSE
{value2 WHEN condition2 ELSE}
valueN ;

VD: Mux2to1

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS

PORT ( d0, d1 : IN STD_LOGIC;
sel : IN STD_LOGIC;
y : OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE dataflow1 OF mux2to1 IS
BEGIN
y <= d0 WHEN sel = ’0’ ELSE d1;
END dataflow1;

mux2to1
d0
y

d1
sel

sel

y

0
1

d0
d1

y <= d0 WHEN sel = ’0’ ELSE
d1 WHEN OTHERS;

NguyenTrongLuat


VD: xnor2

23

xnor2

a
b

c

a b

c

0
0
1
1

1
0
0
1

0
1
0
1


LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY xnor2 IS
PORT ( a, b : IN STD_LOGIC;
c : OUT STD_LOGIC);
END xnor2;
ARCHITECTURE dataflow1 OF xnor2 IS
BEGIN
c <= ’1’ WHEN a = ’0’ AND b =
’0’ WHEN a = ’0’ AND b =
’0’ WHEN a = ’1’ AND b =
’1’ WHEN a = ’1’ AND b =
’0’ WHEN OTHERS;
END dataflow1;
NguyenTrongLuat

GV dạy: Lê Chí Thông

’0’
’1’
’0’
’1’

ELSE
ELSE
ELSE
ELSE

24


12


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

Phép gán tín hiệu có chọn lọc (Select Signal Assigment)
WITH – SELECT - WHEN
WITH select_signal SELECT
signal_name <= value1 WHEN const1_of_select_signal,
{value2 WHEN const2_of_select_signal,}
valueN WHEN OTHERS;
mux2to1
d0
y

d1
sel

sel

y

0
1

d0
d1


LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS
PORT ( d0, d1 : IN STD_LOGIC;
sel : IN STD_LOGIC;
y : OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE dataflow2 OF mux2to1 IS
BEGIN
WITH sel SELECT
y <= d0 WHEN ’0’,
d1 WHEN OTHERS;
END dataflow2;

NguyenTrongLuat

25

WITH select_signal SELECT
signal_name <= value1 WHEN const1_of_select_signal,
{value2 WHEN const2_of_select_signal,}
valueN WHEN OTHERS;

Tham số const_of_select_signal có thể biểu diễn
nhiều giá trò riêng biệt hoặc 1 dãi giá trò liên tiếp.
PORT ( d0, d1, d2, d3 : IN STD_LOGIC;
sel : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
y : OUT STD_LOGIC );
...

...
WITH sel SELECT
y <= d0 WHEN
d1 WHEN
d2 WHEN
d3 WHEN
NguyenTrongLuat

GV dạy: Lê Chí Thơng

”001”,
”011” to ”101”,
”000” | ”111”,
OTHERS;
26

13


GV soạn: Nguyễn Trọng Luật

VD: xnor2

ĐH Bách Khoa TP.HCM

xnor2

a
b


c

a b

c

0
0
1
1

1
0
0
1

0
1
0
1

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY xnor2 IS
PORT ( a, b : IN STD_LOGIC;
c : OUT STD_LOGIC);
END xnor2;
ARCHITECTURE dataflow2 OF xnor2 IS
SIGNAL ab : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN

ab <= a & b;
WITH ab SELECT
c <= ’1’ WHEN ”00” | ”11”,
’0’ WHEN OTHERS;
END dataflow2;
NguyenTrongLuat

27

Phát biểu FOR - GENERATE
GENERATE là cách để tạo ra nhiều tình huống (instance) cho
các phát biểu đồng thời, thường dùng cho các phép gán thay
thế trò số tương đương component (component instantitation).
[Name:] FOR index_variable IN range GENERATE
concurent_statements;
END GENERATE [name] ;

g0: FOR i IN 0 to 3 GENERATE
z(i) <= x(i) and y(i+8);
END GENERATE;
xor_array: FOR i IN 7 downto 0 GENERATE
user: xor2 PORT MAP (
x(i), y(i), z(i)
END GENERATE;
NguyenTrongLuat

GV dạy: Lê Chí Thơng

);
28


14


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

GENERIC
- Là cấu trúc để đưa 1 hằng số vào trong entity giống khai báo
CONSTANT.
- Tiện lợi của generic là có thể sử dụng nó trong phép gán
thay thế trò số tương đương component (component
instantitation), để sử dụng các giá trò hằng số khác nhau khi
tham chiếu component.
ENTITY entity_name IS
GENERIC (
generic_name1: data_type := default_values;
generic_name2: data_type := default_values;
)
PORT (
port_name: mode data_type;
... )
END entity_name;
NguyenTrongLuat

29

* Khai báo component có GENERIC
COMPONENT component_name

GENERIC (
generic_name1: data_type := default_values;
...)
PORT (
port_name: mode data_type;
...)
END COMPONENT;

* Phép gán thay thế trò số component có GENERIC
Label: component_name
GENERIC MAP (
generic_name1 => sig_name1,
gereric_name2 => sig_name2 );
PORT MAP (
port_name => sig_name);
NguyenTrongLuat

GV dạy: Lê Chí Thơng

30

15


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

MÔ TẢ HÀNH VI ( Behavioral description)
- Mô tả sự đáp ứng của ngõ ra theo ngõ vào.

- Sử dụng phát biểu PROCESS chứa các lệnh được thực thi
tuần tự, phụ thuộc vào thứ tự của nó
- Các phát biểu tuần tự (Sequential statement): cho phép mô tả
hoạt động tuần tự của các tín hiệu
* Phát biểu IF
* Phát biểu CASE
* Phát biểu LOOP
NguyenTrongLuat

31

PROCESS
- Process thực hiện các lệnh bên trong nó 1 cách tuần tự.
Vì vậy thứ tự của các lệnh rất quan trọng.
- Process được kích hoạt khi có sự thay đổi của 1 tín hiệu.
[Name:] PROCESS (sensitivity list)
variable declarations
BEGIN
sequential statements
END PROCESS [Name];
Sensitivity list: danh sách cảm nhận
Variable declarations: khai báo biến
- Một Architecture có nhiều Process. Các Process là các phát
biểu đồng thời
NguyenTrongLuat

GV dạy: Lê Chí Thơng

32


16


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

* Danh sách cảm nhận (sensitivity list):
- Khai báo các tín hiệu dùng để kích hoạt Process khi tín hiệu
thay đổi (thường gọi là sự kiện event). Thường là các tín hiệu
ngõ vào.
- Khi Process được kích hoạt thì các phát biểu bên trong
process được thực hiện tuần tự. Khi thực hiện xong phát biểu
cuối cùng thì Process vào trạng thái chờ (suspend).
* Khai báo biến (variable declaration):
Khai báo các biến cục bộ sử dụng trong Process
* Phát biểu tuần tự :
- Đặt giữa BEGIN và END của Process.
- Gồm các phép gán tín hiệu và biến, các phát biểu tuần tự
IF, CASE, LOOP…
NguyenTrongLuat

33

Phát biểu IF - THEN - ELSE
IF condition1 THEN sequential_statements_1;
{ELSIF condition2 THEN sequential_statements_1;}
{ELSE sequential_statements_1;}

END IF;


VD: Mux2to1
mux2to1
d0
y

d1
sel

sel

y

0
1

d0
d1

NguyenTrongLuat

GV dạy: Lê Chí Thơng

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS
PORT ( d0, d1 , sel : IN STD_LOGIC;
y : OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE behavior1 OF mux2to1 IS

BEGIN
PROCESS (d0, d1, sel)
BEGIN
IF sel = ’0’ THEN y <= d0 ;
ELSE y <= d1 ;
END IF;
END PROCESS;
END behavior1;
34

17


GV son: Nguyn Trng Lut

H Bỏch Khoa TP.HCM

Phaựt bieồu CASE - WHEN
CASE select_signal IS
WHEN value1 => sequential_statements_1;
WHEN value2 => sequential_statements_2;
WHEN OTHERS => sequential_statements_N;
END CASE;

VD: Mux2to1
mux2to1
d0
y

d1

sel

sel

y

0
1

d0
d1

NguyenTrongLuat

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS
PORT ( d0, d1 , sel : IN STD_LOGIC;
y : OUT STD_LOGIC);
END mux2to1;
ARCHITECTURE behavior2 OF mux2to1 IS
BEGIN
PROCESS (d0, d1, sel)
BEGIN
CASE sel IS
WHEN 0 => y <= d0 ;
WHEN OTHERS => y <= d1 ;
END CASE;
END PROCESS;
END behavior2;


35

Phaựt bieồu FOR - LOOP
Tửụng tửù nhử phaựt bieồu ủong thụứi FOR_GENERATE.
[Name:] FOR variable_name IN range LOOP
sequential_statements;
END LOOP [name] ;

sqr: FOR

i IN 1 to 10 LOOP
a(i) := i*i;
END LOOP sqr;
FOR j IN 3 downto 0 LOOP
IF reset(j) = 1 THEN data(j) := 0;
END IF;
END LOOP;

NguyenTrongLuat

GV dy: Lờ Chớ Thụng

36

18


GV soạn: Nguyễn Trọng Luật


ĐH Bách Khoa TP.HCM

Phát biểu WHILE - LOOP

[Name:] WHILE condition LOOP
sequential_statements;
END LOOP [name] ;

i:=0;
WHILE (i<10) LOOP
s <= i;
i := i+1;
END LOOP;

NguyenTrongLuat

37

THIẾT KẾ HỆ TỔ HP BẰNG VHDL
- Hệ tổ hợp có thể được thực hiện bằng các phát biểu đồng
thời (concurent statement) và tuần tự (sequential statement).
- Phát biểu đồng thời (concurent staement) được dùng trong
mô tả cấu trúc (structural description) và luồng dữ liệu
(dataflow description)
- Phát biểu tuần tự (sequent statement) được dùng trong mô tả
hành vi (dataflow description)

NguyenTrongLuat

GV dạy: Lê Chí Thơng


38

19


GV son: Nguyn Trng Lut

H Bỏch Khoa TP.HCM

BO CONG

fulladder

x
s

s=x y z

c

c=xy +yz +xz

y
z

A
D
D
E

R

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY fulladder IS
PORT ( x , y , z : IN STD_LOGIC;
s , c : OUT STD_LOGIC);
END fulladder;
ARCHITECTURE Function OF fulladder IS
BEGIN
s <= x XOR y XOR z ;
C <= (x AND y) OR (y AND z) OR (x AND z);
END Function;
NguyenTrongLuat

39

adder4

Thieỏt keỏ boọ coọng 4 bit adder4 sửỷ duùng fulladder

a3
a2
a1
a0

Cout
LIBRARY ieee;
USE ieee.std_logic_1164.all;
s3

ENTITY adder4 IS
s2
b3
PORT ( Cin : IN STD_LOGIC;
s1
b2
a, b : IN STD_LOGIC_VECTOR(3 downto 0);
s0
s : OUT STD_LOGIC_VECTOR(3 downto 0);
b1
Cout : OUT STD_LOGIC);
b0
END adder4;
ARCHITECTURE Structure OF adder4 IS
Cin
SIGNAL c : STD_LOGIC_VECTOR(1 to 3);
COMPONENT fulladder
PORT ( x , y , z : IN STD_LOGIC;
s , c : OUT STD_LOGIC);
END COMPONENT;
BEGIN
stage0: fulladder PORT MAP(a(0),b(0),Cin,s(0),c(1)) ;
stage1: fulladder PORT MAP(a(1),b(1),c(1),s(1),c(2)) ;
stage2: fulladder PORT MAP(a(2),b(2),c(2),s(2),c(3)) ;
stage3: fulladder PORT MAP(a(3),b(3),c(3),s(3),Cout) ;
END Structure;
NguyenTrongLuat

GV dy: Lờ Chớ Thụng


40

20


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

Bộ cộng 4 bit adder4 sử dụng phép cộng số học
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_signed.all;
ENTITY adder4 IS
PORT ( Cin : IN STD_LOGIC;
a, b : IN STD_LOGIC_VECTOR(3 downto 0);
s : OUT STD_LOGIC_VECTOR(3 downto 0);
Cout : OUT STD_LOGIC);
END adder4;
ARCHITECTURE Arithmetic OF fulladder IS
SIGNAL sum : STD_LOGIC_VECTOR(4 downto 0);
BEGIN
sum <= (’0’& a ) + b + Cin ;
s <= sum(3 downto 0) ;
Cout <= sum(4) ;
END Arithmetic;

Lệnh USE ieee.std_logic_signed.all cho phép sử dụng
gói (package) std_logic_signed, để thực hiện phép toán số
học trên các tín hiệu std_logic.

NguyenTrongLuat

41

BỘ DỒN KÊNH
LIBRARY ieee;
MUX4
USE ieee.std_logic_1164.all;
ENTITY mux4 IS
d0
PORT (
d1
y
d0 , d1 , d2 , d3 : IN STD_LOGIC;
d2
s : IN STD_LOGIC_VECTOR(1 downto 0);
d3
y : OUT STD_LOGIC);
s0
s1
END mux4;
ARCHITECTURE Function OF mux4 IS
BEGIN
y <= (NOT s(1) AND NOT s(0) AND d0) OR
s1 s0
(NOT s(1) AND s(0) AND d1) OR
0 0
(s(1) AND NOT s(0) AND d2) OR
0 1
(s(1) AND s(0) AND d3 );

1 0
END Function;
1 1
ARCHITECTURE Dataflow OF mux4 IS
BEGIN
WITH s SELECT
y <= d0 WHEN s = ”00” ELSE
y <= d0 WHEN
d1 WHEN s = ”01” ELSE
d1 WHEN
d2 WHEN s = ”10” ELSE
d2 WHEN
d3 WHEN OTHERS;
d3 WHEN
END Dataflow;
NguyenTrongLuat

GV dạy: Lê Chí Thơng

M
U
X

y
d0
d1
d2
d3
”00”,
”01”,

”10”,
OTHERS;
42

21


GV soạn: Nguyễn Trọng Luật

ĐH Bách Khoa TP.HCM

Thieát keá MUX 16 1 söû duïng MUX 4 1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
mux16
c3 c2 c1 c0
f
ENTITY mux16 IS
PORT (
0 0 0 0
d0
d : IN STD_LOGIC_VECTOR(15 downto 0);
0 0 0 1
d1
0 0 1 0
d2
c : IN STD_LOGIC_VECTOR(3 downto 0);
0
0
1

1
d3
f : OUT STD_LOGIC);
0 1 0 0
d4
END mux16;
0 1 0 1
d5
ARCHITECTURE Structure OF mux16 IS
0 1 1 0
d6
0 1 1 1
d7
SIGNAL w : STD_LOGIC_VECTOR(0 to 3);
1 0 0 0
d8
COMPONENT mux4
1 0 0 1
d9
PORT (
1 0 1 0
d10
d0 , d1 , d2 , d3 : IN STD_LOGIC;
1 0 1 1
d11
1 1 0 0
d12
s : IN STD_LOGIC_VECTOR(1 downto 0);
1 1 0 1
d13

y : OUT STD_LOGIC);
1 1 1 0
d14
END COMPONENT;
1 1 1 1
d15
BEGIN
M0: mux4 PORT MAP (d(0),d(1),d(2),d(3),c(1 downto 0),w(0));
M1: mux4 PORT MAP (d(4),d(5),d(6),d(7),c(1 downto 0),w(1));
M2: mux4 PORT MAP (d(8),d(9),d(10),d(11),c(1 downto 0),w(2));
M3: mux4 PORT MAP (d(12),d(13),d(14),d(15),c(1 downto 0),w(3));
M4: mux4 PORT MAP (w(0),w(1),w(2),w(3),c(3 downto 2),f);
END Structure;
NguyenTrongLuat

43

LIBRARY ieee;
USE ieee.std_logic_1164.all;
Söû duïng
ENTITY mux16 IS
PORT (
GENERATE
d : IN STD_LOGIC_VECTOR(15 downto 0);
c : IN STD_LOGIC_VECTOR(3 downto 0);
f : OUT STD_LOGIC);
END mux16;
ARCHITECTURE Structure2 OF mux16 IS
SIGNAL w : STD_LOGIC_VECTOR(0 to 3);
COMPONENT mux4

PORT (
d0 , d1 , d2 , d3 : IN STD_LOGIC;
s : IN STD_LOGIC_VECTOR(1 downto 0);
y : OUT STD_LOGIC);
END COMPONENT;
BEGIN
G0: FOR i IN 0 to 3 GENERATE
MUXES: mux4 PORT MAP (
d(4*i),d(4*i+1),d(4*i+2),d(4*i+3),c(1 downto 0),w(i));
END GENERATE;
M4: mux4 PORT MAP (w(0),w(1),w(2),w(3),c(3 downto 2),f);
END Structure2;
NguyenTrongLuat

GV dạy: Lê Chí Thông

44

22


GV soạn: Nguyễn Trọng Luật

BOÄ GIAÛI MAÕ

ĐH Bách Khoa TP.HCM

dec2x4
y0
x0

y1
x1
y2
en
y3

en x1 x0
0
1
1
1
1

X
0
0
1
1

X
0
1
0
1

y3 y2 y1 y0
0
0
0
0

1

0
0
0
1
0

0
0
1
0
0

0
1
0
0
0

D
E
C
O
D
E
R

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY dec2x4 IS
PORT ( en : IN STD_LOGIC;
x : IN STD_LOGIC_VECTOR(1 downto 0);
y : OUT STD_LOGIC_VECTOR(3 downto 0));
END dec2x4;
ARCHITECTURE flow OF dec2x4 IS
SIGNAL
ARCHITECTURE flow2 OF
temp: STD_LOGIC_VECTOR(3 downto 0);
dec2x4 IS
BEGIN
SIGNAL
WITH x SELECT
en_x: STD_LOGIC_VECTOR(
temp <= ”0001” WHEN ”00” ,
2 downto 0);
BEGIN
”0010” WHEN ”01” ,
en_x <= en & x;
”0100” WHEN ”10” ,
WITH en_x SELECT
”1000” WHEN ”11” ,
f <= ”0001” WHEN ”100” ,
”0000” WHEN OTHERS;
”0010” WHEN ”101” ,
y <= temp WHEN en = ’1’
”0100” WHEN ”110” ,
ELSE ”0000”;
”1000” WHEN ”111” ,
END flow;

”0000” WHEN OTHERS;
END flow2;
NguyenTrongLuat
45

Thieát keá IC DECCODER 74138

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY dec138 IS
PORT ( c, b, a : IN STD_LOGIC;
g1,g2a,g2b: IN STD_LOGIC;
y : OUT STD_LOGIC_VECTOR(7 downto 0));
END dec138;
ARCHITECTURE flow OF dec138 IS
SIGNAL
data: STD_LOGIC_VECTOR(2 downto 0);
temp: STD_LOGIC_VECTOR(7 downto 0);
BEGIN
data <= c & b & a;
WITH data SELECT temp <= ”11111110” WHEN ”000” ,
”11111101” WHEN ”001” ,
”11111011” WHEN ”010” ,
”11110111” WHEN ”011” ,
”11101111” WHEN ”100” ,
”11011111” WHEN ”101” ,
”10111111” WHEN ”110” ,
”01111111” WHEN ”111” ,
”11111111” WHEN OTHERS;
y <= temp WHEN (g1 AND NOT g2a AND NOT g2b) = ’1’

ELSE ”11111111”;
END flow;
NguyenTrongLuat

GV dạy: Lê Chí Thông

46

23


GV soạn: Nguyễn Trọng Luật

Sử dụng
PROCESS

Phát biểu

If ….
Case ….
BỘ GIẢI MÃ
3 8
NguyenTrongLuat

ĐH Bách Khoa TP.HCM

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY dec3to8 IS
PORT (x : IN STD_LOGIC_VECTOR(2 downto 0);

en: IN STD_LOGIC;
y : OUT STD_LOGIC_VECTOR(7 downto 0));
END dec3to8;
ARCHITECTURE behavior OF dec3to8 IS
BEGIN
PROCESS (x, en)
BEGIN
y <= ”11111111”;
IF (en = ’1’) THEN
CASE x IS WHEN ”000” => y(0) <= ’0’;
WHEN ”001” => y(1) <= ’0’;
WHEN ”010” => y(2) <= ’0’;
WHEN ”011” => y(3) <= ’0’;
WHEN ”100” => y(4) <= ’0’;
WHEN ”101” => y(5) <= ’0’;
WHEN ”110” => y(6) <= ’0’;
WHEN ”111” => y(7) <= ’0’;
END CASE;
END IF;
END PROCESS;
END behavior;
47

BỘ GIẢI MÃ

LIBRARY ieee;
3 8
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

ENTITY decode38 IS
Sử dụng
PORT ( x : IN STD_LOGIC_VECTOR(2 downto 0);
PROCESS
y : OUT STD_LOGIC_VECTOR(0 to 7));
END decode38;
ARCHITECTURE behavior OF decode38 IS
BEGIN
Phát biểu
PROCESS(x)
VARIABLE j: integer;
For …. loop
BEGIN
j := CONV_INTEGER(x);
Sử dụng hàm CONV_INTEGER để đổi dữ
FOR i IN 0 to 7 LOOP
liệu kiểu STD_LOGIC_VECTOR thành kiểu
IF (i = j) THEN
INTEGER.
y(i) <= ’0’;
ELSE y(i) <= ’1’;
Để sử dụng hàm này, trong phần LIBRARY
END IF;
cần phải khai báo gói (package)
END LOOP;
- STD_LOGIC_ARITH
END PROCESS;
- STD_LOGIC_UNSIGNED
END behavior;
NguyenTrongLuat


GV dạy: Lê Chí Thơng

48

24


GV soạn: Nguyễn Trọng Luật

encoder
i0
x0
i1
x1
i2
v
i3

ĐH Bách Khoa TP.HCM

BỘ MÃ HÓA ƯU TIÊN
i3 i2 i1 i0

x1 x0 v

0
0
0
0

1

d
0
0
1
1

0
0
0
1
X

0
0
1
X
X

0
1
X
X
X

d
0
1
0

1

0
1
1
1
1

E
N
C
O
D
E
R

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY encoder IS
PORT ( i : IN STD_LOGIC_VECTOR(3 downto 0);
x : OUT STD_LOGIC_VECTOR(1 downto 0);
v : OUT STD_LOGIC);
END encoder;
ARCHITECTURE flow OF encoder IS
WITH i SELECT
BEGIN
x <=”00” WHEN ”0001” ,
x <= ”11” WHEN i(3) = ’1’ ELSE
”01” WHEN ”0010”|”0011”,
”10” WHEN i(2) = ’1’ ELSE

”10” WHEN ”0100”
”01” WHEN i(1) = ’1’ ELSE
to ”0111”,
”11” WHEN OTHERS;
”00” ;
WITH i SELECT
v <= ’0’ WHEN i = ”0000”
V <=’0’ WHEN ”0000”,
ELSE ’1’;
’1’ WHEN OTHERS;
END flow;
NguyenTrongLuat

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY encoder2 IS
PORT ( i : IN STD_LOGIC_VECTOR(3 downto 0);
x : OUT STD_LOGIC_VECTOR(1 downto 0);
v : OUT STD_LOGIC);
END encoder2;
ARCHITECTURE behavior OF encoder2 IS
BEGIN
PROCESS (i)
PROCESS (i)
BEGIN
BEGIN
x <= ”00”;
IF i(3) = ’1’ THEN x <= ”11”;
IF i(1)=’1’
ELSIF i(2) = ’1’THEN

END IF;
x <= ”10”;
IF i(2)=’1’
ELSIF i(1) = ’1’THEN
END IF;
x <= ”01”;
IF i(3)=’1’
ELSIF x <= ”00”;
END IF;
END IF;
v <= ’1’;
END PROCESS;
IF i=”0000”
v <= ’0’ WHEN i = ”0000”
END IF;
ELSE ’1’;
END PROCESS;
END behavior;
NguyenTrongLuat

GV dạy: Lê Chí Thơng

49

Sử dụng

PROCESS

THEN x <=”01”;
THEN x <=”10”;

THEN x <=”11”;

THEN v <=’0’;

50

25


×