You are on page 1of 100

Thiết kế nhờ máy tính

Nguyễn Thành Kiên


Bộ môn Kỹ thuật Máy tính
Khoa Công nghệ thông tin, ĐH
BKHN
Tài liệu tham khảo
 Text Book:
 Circuit Design with VHDL, Volnei A.Pedroni, MIT
press.
 VHDL Programming by Examples, Douglas L.Perry,
McGraw Hill.
 Reference Books:
 1076 IEEE Standard Vhdl Language Reference
Manual 2002, IEEE Computer Society.
 Microprocessor Design Principles and Practices with
VHDL, Enoch O. Hwang.
 HDL Chip Design- A Practical Guide for Designing,
Synthesizing and Simulating ASICs and FPGAs using
VHDL or Verilog, Douglas J.Smith.

Copyright © by N.T.K - 8/2008


Phần mềm học tập
 Active-HDL 7.1.sp2
 Quartus (for Altera FPGAs)
 ISE (for Xilinx FPGAs)

 www.opencores.org

Copyright © by N.T.K - 8/2008


Giảng viên
 Nguyễn Thành Kiên
 Giảng viên Bộ môn Kỹ thuật Máy

tính
Khoa CNTT, ĐHBKHN.
 Mobile: +84983588135

 Email: kiennt-fit@mail.hut.edu.vn

Copyright © by N.T.K - 8/2008


Yêu cầu môn học
 Tham gia >75% số giờ học.
 Nghỉ ≥ 5 buổi => Học lại.
 Nghỉ ≥ 3 buổi => Không thi lần 1.
 Cách tính điểm:
 Bài kiểm tra giữa kỳ: 20%
 Bài tập lớn: 20%
 Bài kiểm tra cuối kỳ: 60%

Copyright © by N.T.K - 8/2008


Nội dung môn học
 I. 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.
 10. Tổng hợp mã VHDL.
 II. Thiết kế CPU.
 1. Nguyên tắc thiết kế CPU.
 2. Các thành phần của CPU.
 3. Tối ưu hóa, mô phỏng, tổng hợp và triển khai CPU.
Copyright © by N.T.K - 8/2008
Nội dung môn học
 I. 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.
 II. Thiết kế CPU.

Copyright © by N.T.K - 8/2008


1. Giới thiệu ngôn ngữ
VHDL.

Phương Phương
pháp pháp
thiết kế thiết kế
bằng HDL truyền
thống

Copyright © by N.T.K - 8/2008


1. Giới thiệu ngôn ngữ
VHDL.
 VHDL là gì?
 Một ngôn ngữ mô tả phần cứng:

VHDL - VHSIC Hardware Description Language.

VHSIC - Very High Speed Integrated Circuits.
 Là chuẩn do Bộ QP Mỹ phát triển từ thập niên
70. Dựa trên ngôn ngữ lập trình ADA, nhằm
tạo ra tài liệu mô tả hoạt động của các mạch
điện tử.
 1987 được IEEE chuẩn hóa trong IEEE 1076-1987.
 1993 hoàn thiện lại thành IEEE 1076-1993.
 2002 giải quyết vấn đề protected types=>IEEE
1076-2002
Copyright © by N.T.K - 8/2008
1. Giới thiệu ngôn ngữ
VHDL.
 VHDL là chuẩn độc lập mô tả hệ thống:
 Các nhà phát triển hệ thống dựa trên VHDL
để mô tả, thiết kế hệ thống.
 Các phần mềm mô phỏng có thể thực hiện
mô phỏng hoạt động của hệ thống mô tả.
 Các phần mềm tổng hợp có thể thực hiện
tổng hợp sinh ra mạch thực để thực hiện hệ
thống.
 Mạch sau khi tổng hợp có thể được nạp
xuống chip để thực hiện chức năng mô tả.

 Chức năng: mô tả hoạt động của các hệ


thống hoặc mạch điện tử nhằm thực
hiện các hệ thống
Copyright © byhoặc mạch này trên
N.T.K - 8/2008
1. Giới thiệu ngôn ngữ
VHDL.
 Ưu điểm của VHDL:
 Cho phép hoạt động của hệ thống được mô
tả (modeled) và kiểm thử (simulated) trước
khi các công cụ tổng hợp “dịch” thiết kế
sang phần cứng thực tế (gates and wires).
 Cho phép mô tả hệ thống song song.
 Khi các mô hình VHDL được “dịch” sang
“gates and wires” thì nó có thể được nạp lên
phần cứng CPLD và FPGA để thực thi.

Copyright © by N.T.K - 8/2008


1. Giới thiệu ngôn ngữ
VHDL.
 Hai ứng dụng chính của VHDL là:
 PLD (Programmable Logic Device):
 CPLD (Complex PLD)
 FPGA (Field Programmable Gate Array).
 ASIC (Application-Specific IC)

Copyright © by N.T.K - 8/2008


Quy trình thiết kế mạch dựa trên
VHDL

Copyright © by N.T.K - 8/2008


Các công cụ thiết kế VHDL
 Bộ công cụ của nhà sản xuất chip:
 Quartus/Maxplus => tổng hợp VHDL code
lên chip CPLD/FPGA của Altera.
 ISE => tổng hợp VHDL code lên chip
CPLD/FPGA của Xilinx.
 Một số công cụ của các hãng thứ ba:
 ActiveHDL
 Leonardo Spectrum (Mentor Graphics).
 Synplify (Synplicity).
 ModelSim (Mentor Graphics).

Copyright © by N.T.K - 8/2008


Một ví dụ VHDL đơn giản

Copyright © by N.T.K - 8/2008


Một ví dụ VHDL đơn giản

Copyright © by N.T.K - 8/2008


Nội dung môn học
 I. 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.
 II. Thiết kế CPU.

Copyright © by N.T.K - 8/2008


Code structure
library IEEE;
use IEEE.std_logic_1164.all;

ENTITY full_adder IS
PORT (a,b,cin: in bit;
s,cout:out bit);
END full_adder;

Architecture dataflow of full_adder is


begin
s <= a xor b xor cin;
cout <= (a and b) or (a and
cin)
or (b and cin);
end dataflow;
Copyright © by N.T.K - 8/2008
Cấu trúc code
 Thư viện LIBRARY
 ENTITY
 ARCHITECTURE

Copyright © by N.T.K - 8/2008


Thư viện LIBRARY
 A LIBRARY là một
tập các đoạn mã
thường được sử
dụng. Đặt các
đoạn mã thường
sử dụng vào thư
viện cho phép
chúng có thể
được tái sử dụng
hoặc chia sẻ giữa
các thiết kế khác
nhau.
Copyright © by N.T.K - 8/2008
Thư viện LIBRARY
 Khai báo thư viện:

Copyright © by N.T.K - 8/2008


Thư viện LIBRARY
 Các thư viện thường sử dụng:
 ieee.std_logic_1164 (from the ieee
library),
 standard (from the std library), and
 work (work
LIBRARY ieee; library).
-- A semi-colon (;) indicates
USE ieee.std_logic_1164.all; -- the end of a statement
or

LIBRARY std; -- declaration, while a double


USE std.standard.all; -- dash (--) indicates
acomment.

LIBRARY work;
Copyright © by N.T.K - 8/2008
Thư viện LIBRARY
 std_logic_1164
 Gói của thư viện IEEE hỗ trợ multi-level
logic.
 std
 Gói thư viện tài nguyên (kiểu dữ liệu, text
IO…) cho môi trường thiết kế VHDL.
 work
 Gói thư viện chứa các thiết kế của người
dùng mới tạo ra.

Copyright © by N.T.K - 8/2008


Thư viện LIBRARY
 Thư viện IEEE:
 std_logic_1164

std_logic (8 mức logic),std_ulogic (9 mức logic)
 std_logic_arith

Thực hiện các phép toán số học và so sánh.
 std_logic_signed

Thực hiện các phép toán với kiểu DL
std_logic_vector, dữ liệu coi là có dấu
 std_logic_unsigned
 Thực hiện các phép toán với kiểu DL
std_logic_vector, dữ liệu coi là không dấu.

Copyright © by N.T.K - 8/2008


Cấu trúc code
 Thư viện LIBRARY
 ENTITY
 ARCHITECTURE

Copyright © by N.T.K - 8/2008


ENTITY
 ENTITY là danh sách đặc tả của các cổng
vào ra (input/output pins) của mạch.

BLACK_BOX
rst
q[7:0]
d[7:0]
co
clk

 PORT là giao diện của mạch với các


mạch bên ngoài khác, PORT thường là
các chân pin.
Copyright © by N.T.K - 8/2008
ENTITY

 signal_mode: chiều truyền dữ liệu


 IN, OUT, INOUT (2chiều), BUFFER (khi tín hiệu ra
được dùng cho các tín hiệu khác bên trong).
 signal_type:
 bit, std_logic, integer…
 Port_name:
 Đặt tên theo quy tắc đặt tên chuẩn, tránh các từ
khóa.
Copyright © by N.T.K - 8/2008
ENTITY
Chế độ signal_mode cho biết chiều dữ liệu được
truyền nhận: Entity

 IN Dữ liệu chỉ đi vào ENTITY

 OUT Dữ liệu chỉ đi ra khỏi ENTITY


(và không được sử dụng bên trong)

 INOUT Dữ liệu là hai chiều (đi vào và ra)

 BUFFER Dữ liệu đi ra khỏi ENTITY và cũng


được đưa Copyright
quay©trở lại- 8/2008
by N.T.K vào trong
Ví dụ về ENTITY

ENTITY mux IS
PORT (a, b: IN std_logic_vector(7 downto 0);
sel: IN STD_LOGIC_VECTOR(0 to 1);
c: OUT STD_LOGIC_VECTOR(7 downto 0));
END mux;
Copyright © by N.T.K - 8/2008
Cấu trúc code
 Thư viện LIBRARY
 ENTITY
 ARCHITECTURE

Copyright © by N.T.K - 8/2008


ARCHITECTURE
 Phần ARCHITECTURE mô tả mạch
hoạt động như thế nào.

Một ARCHITECTURE luôn gắn với một ENTITY và mô tả


hoạt động của ENTITY đó.
Một ARCHITECTURE chỉ gắn với một ENTITY nhưng
Một ENTIY có thể có nhiều ARCHITECTURE khác nhau
Copyright © by N.T.K - 8/2008
ARCHITECTURE

 ARCHITECTURE có hai phần:


 Phần khai báo (optional)
 Khai báo tín hiệu và biến.
 Phần mã code:

Mô tả cách kết nối, hoạt động của mạch.

Copyright © by N.T.K - 8/2008


ARCHITECTURE
 Ví dụ về mạch NAND:

Mô tả kết nối mạch:


Mạch thực hiện thao
tác NAND trên 2 đầu
vào (a,b) và gán (<=)
kết quả cho đầu ra x.

Copyright © by N.T.K - 8/2008


VD1: Full_adder
 Bộ cộng hai số 1bit đầy đủ
library IEEE;
use IEEE.std_logic_1164.all;

ENTITY full_adder IS
PORT (a,b,cin: in std_logic;
s,cout:out std_logic);
END full_adder;
A(7:0) Architecture dataflow of full_adder is
C(7:0) begin
B(7:0) Adder s <= a xor b xor cin;
cout <= (a and b) or (a and cin)
or (b and
cin);
end dataflow;
Copyright © by N.T.K - 8/2008
library IEEE;
use IEEE.std_logic_1164.all;

ENTITY adder IS
PORT (A,B: IN std_logic_vector(7 downto 0);
C: OUT std_logic_vector(7 downto
0));
END adder;
A(7:0)
C(7:0) Architecture dataflow of adder is
B(7:0) Adder begin
C <= A+B;
end dataflow;

Copyright © by N.T.K - 8/2008


VD2: D Flip-flop, asyn
reset
LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------
ENTITY dff IS
PORT ( d, clk, rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END dff;
---------------------------------------
ARCHITECTURE behavior OF dff IS
BEGIN
PROCESS (rst, clk)
D flip-flop tích cực theo sườn dương của BEGIN
xung đồng hồ clk với tín hiệu reset không IF (rst='1') THEN
đồng bộ. q <= '0';
Hoạt động: ELSIF (clk'EVENT AND
clk='1') THEN
+ rst = ‘1’ => q<=‘0’ không phụ q <= d;
thuộc clk. END IF;
+ rst = ‘0’, sườn dương clk => q<=d. END PROCESS;
DEMO END
Copyright © by N.T.K behavior;
- 8/2008
VD2: RS Flip-flop, asyn
reset
 Bài tập tại lớp:
 Viết VHDL code mô tả flip-flop RS
đồng bộ theo sườn âm với tín hiệu
reset không đồng bộ.

Copyright © by N.T.K - 8/2008


VD2: RS Flip-flop, asyn
reset
LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------
ENTITY RSff IS
PORT ( r,s,clk,rst: IN STD_LOGIC;
q: OUT STD_LOGIC);
END RSff;
---------------------------------------
ARCHITECTURE behavior OF RSff IS
BEGIN
PROCESS (rst, clk)
BEGIN
IF (rst='1') THEN
q <= '0';
ELSIF (clk'EVENT AND clk=‘0') THEN
if (r='0' and s='1')then q<= '1';
elsif (r='1' and s='0') then q<='0';
elsif (r='1' and s='1') then q<= '-';
end if;
END IF;
END PROCESS;
END behavior;
Copyright © by N.T.K - 8/2008
VD3: asyn-reset DFF &
NAND
ENTITY example IS
PORT ( a, b, clk: IN BIT;
q: OUT BIT);
END example;
---------------------------------------
ARCHITECTURE example OF example IS
SIGNAL temp : BIT;
BEGIN
temp <= a NAND b;
Sự kết hợp giữa mạch PROCESS (clk)
BEGIN
tổ hợp và mạch dãy IF (clk'EVENT AND clk='1') THEN q<=temp;
END IF;
END PROCESS;
END example;
DEMO ---------------------------------------

Copyright © by N.T.K - 8/2008


VD4: Bộ dồn kênh
Multilpexor

a,b: hai kênh vào 8bit


sel: các bit chọn kênh
c: kênh ra 8bit

Copyright © by N.T.K - 8/2008


VD4: Bộ dồn kênh
Multilpexor
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux IS
PORT ( a,b : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
sel : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
c : OUT STD_LOGIC_VECTOR (7 DOWNTO 0));
END ENTITY mux;
---------------------------------------
ARCHITECTURE example OF mux IS
BEGIN
PROCESS (a, b, sel)
BEGIN
IF (sel = "00") THEN
c <= "00000000";
ELSIF (sel=“01”) THEN
c <= a;
ELSIF (sel = "10") THEN
c <= b;
ELSE
c <= “ZZZZZZZZ”;
END IF;
END PROCESS;
END example; Copyright © by N.T.K - 8/2008
Demostration
 Sử dụng phần mềm ActiveHDL thiết kế
và mô phỏng bộ cộng đầy đủ:
 Tạo workspace làm việc.
 Tạo một mạch thiết kế design.
 Viết VHDL source code.
 Thêm file vào design.
 Dịch workspace.
 Đưa tín hiệu vào dạng waveform mô phỏng.

Copyright © by N.T.K - 8/2008


Nội dung môn học
 I. 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.
 II. Thiết kế CPU.

Copyright © by N.T.K - 8/2008


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.

Copyright © by N.T.K - 8/2008


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ố
Copyright © by N.T.K - 8/2008
3.1.1. 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.

Signal

Copyright © by N.T.K - 8/2008


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.
Copyright © by N.T.K - 8/2008
3.1.1. Signal
 External Signal & Internal Signal:

External Internal
Signal Signal

Khai báo Khai báo


trong Entity trong Architecture

ENTITY myboard IS ARCHITECTURE structure OF myboard IS


PORT ( [SIGNAL] a,b,c: inout bit; SIGNAL x,y: bit;
data,extbus,result: inout bit_vector(0 to 7)); SIGNAL intbus: bit_vector(0 to 7);
END myboard; Copyright ©BEGIN
by N.T.K - 8/2008
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

Copyright © by N.T.K - 8/2008


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;


Copyright © by N.T.K - 8/2008
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 đó.
Copyright © by N.T.K - 8/2008
3.1.1. Signal
 Ví dụ về phạm vi tác động của
signal

B E
D F

Copyright © by N.T.K - 8/2008


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ự đó.
Về nhà tìm hiểu, hôm sau hỏi
Copyright © by N.T.K - 8/2008
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.

Copyright © by N.T.K - 8/2008


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";

Copyright © by N.T.K - 8/2008


LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------
Ví dụ ENTITY count_ones IS
PORT ( din: IN STD_LOGIC_VECTOR (7 DOWNTO 0);

về sử
ones: OUT INTEGER RANGE 0 TO 8);
END count_ones;
---------------------------------------
dụng ARCHITECTURE ok OF count_ones IS
BEGIN

variabl PROCESS (din)


VARIABLE temp: INTEGER RANGE 0 TO 8;
BEGIN
e temp := 0;
FOR i IN 0 TO 7 LOOP

trong IF (din(i)='1') THEN


temp := temp + 1;
END IF;
VHDL END LOOP;
ones <= temp;
END PROCESS;
END Copyright
ok; © by N.T.K - 8/2008
LIBRARY ieee; LIBRARY ieee;
USE ieee.std_logic_1164.all; USE ieee.std_logic_1164.all;
----------------------------------------- -----------------------------------------
ENTITY mux IS ENTITY mux IS
PORT ( a, b, c, d, s0, s1: IN STD_LOGIC; PORT ( a, b, c, d, s0, s1: IN STD_LOGIC;
y: OUT STD_LOGIC); 7y: OUT STD_LOGIC);
END mux; END mux;
----------------------------------------- -----------------------------------------
ARCHITECTURE not_ok OF mux IS ARCHITECTURE ok OF mux IS
SIGNAL sel : INTEGER RANGE 0 TO 3; BEGIN
BEGIN PROCESS (a, b, c, d, s0, s1)
PROCESS (a, b, c, d, s0, s1) VARIABLE sel : INTEGER RANGE 0 TO
BEGIN BEGIN
sel <= 0; sel := 0;
IF (s0='1') THEN sel <= sel + 1;END IF; IF (s0='1') THEN sel := sel + 1; END IF;
IF (s1='1') THEN sel <= sel + 2;END IF; IF (s1='1') THEN sel := sel + 2; END IF;
CASE sel IS CASE sel IS
WHEN 0 => y<=a; WHEN 0 => y<=a;
WHEN 1 => y<=b; WHEN 1 => y<=b;
WHEN 2 => y<=c; WHEN 2 => y<=c;
WHEN 3 => y<=d; WHEN 3 => y<=d;
END CASE; END CASE;
END PROCESS; END PROCESS;
END not_ok; Copyright © END ok;
by N.T.K - 8/2008
So sánh giữa Signal &
Variable

Copyright © by N.T.K - 8/2008


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 (better-
documented) 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.

Copyright © by N.T.K - 8/2008


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'));

Copyright © by N.T.K - 8/2008


3.2. Các kiểu dữ liệu VHDL

Copyright © by N.T.K - 8/2008


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

Copyright © by N.T.K - 8/2008


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ễn được:
ARCHITECTURE test OF test IS
BEGIN
 -2,147,483,647 PROCESS(X)
VARIABLE a : INTEGER;
 => +2,147,483,647 VARIABLE b : int_type;
BEGIN
a := 1; --Ok 1
a := -1; --Ok 2
a := 1.0; --error 3
END PROCESS;
END test;
Copyright © by N.T.K - 8/2008
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 ARCHITECTURE test OF test IS
 => +1.0E+38. 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;

Copyright © by N.T.K - 8/2008


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
Các kiểu
dữ liệu tính toán.
TYPE bit IS ('0', '1');
liệt kê đã
định nghĩa
TYPE bit_vector IS ARRAY (NATURAL RANGE <>) OF BIT;
trước
TYPE fourval IS ( ‘X’, ‘0’, ‘1’, ‘Z’ );
TYPE state IS (idle, forward, backward, stop);
TYPE color IS ( red, yellow, blue, green, orange );

Copyright © by N.T.K - 8/2008


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.

Copyright © by N.T.K - 8/2008


ENTITY traffic_light IS
PORT(sensor : IN std_logic;
clock : IN std_logic;
red_light : OUT std_logic; IF (sensor = ‘1’) THEN
green_light : OUT std_logic; next_state <= green;
yellow_light : OUT std_logic); ELSE
END traffic_light; next_state <= red;
------------------------------------------------------------ END IF;
ARCHITECTURE simple OF traffic_light IS WHEN yellow =>
TYPE t_state is (red, green, yellow); red_light <= ‘0’;
Signal present_state, next_state : t_state; green_light <= ‘0’;
BEGIN yellow_light <= ‘1’;
PROCESS(present_state, sensor) next_state <= red;
BEGIN END CASE;
CASE present_state IS END PROCESS;
WHEN green => PROCESS
next_state <= yellow; BEGIN
red_light <= ‘0’; WAIT UNTIL clock’EVENT and clock=‘1’;
green_light <= ‘1’; present_state <= next_state;
yellow_light <= ‘0’; END PROCESS;
WHEN red => END simple;
red_light <= ‘1’;
green_light <= ‘0’;
yellow_light <= ‘0’; Copyright © by N.T.K - 8/2008
Kiểu dữ liệu PHYSICAL
 Kiểu dữ liệu Physical được dùng để biểu
diễn các đại lượng vật lý như khoảng
cách, thời gian, dòng điện…
 Kiểu dữ liệu Physical không chỉ chỉ ra
đối tượng mà còn chỉ ra cả các đơn vị
mà đối tượng đó có thể có.
TYPE current IS RANGE 0 to 1000000000
UNITS
Primary unit na; --nano amps
ua = 1000 na; --micro amps
Secondary units ma = 1000 ua; --milli amps
a = 1000 ma; --amps
END UNITS;
Copyright © by N.T.K - 8/2008
Kiểu dữ liệu PHYSICAL
 VHDL chuẩn đã định nghĩa sẵn một
kiểu dữ liệu physical đó là time:
TYPE TIME IS RANGE -2147483647 to 2147483647
UNITS
fs; --femtosecond
ps = 1000 fs; --picosecond
ns = 1000 ps; --nanosecond
us = 1000 ns; --microsecond
ms = 1000 us; --millisecond
sec = 1000 ms; --second
min = 60 sec; --minute
hr = 60 min; --hour
END UNITS;

Copyright © by N.T.K - 8/2008


PACKAGE example IS
TYPE current IS RANGE 0 TO 1000000000
UNITS
na; --nano amps
ua = 1000 na; --micro amps
ma = 1000 ua; --milli amps
a = 1000 ma; --amps
END UNITS;
TYPE load_factor IS (small, med, big );
END example;
----------------------------------------------------------------
USE WORK.example.ALL;
ENTITY delay_calc IS
PORT ( out_current : OUT current;
load : IN load_factor;
delay : OUT time);
END delay_calc;
ARCHITECTURE delay_calc OF delay_calc IS
BEGIN
delay <= 10 ns WHEN (load = small) ELSE
delay <= 20 ns WHEN (load = med) ELSE
delay <= 30 ns WHEN (load = big) ELSE
delay <= 10 ns;
out_current <= 100 ua WHEN (load = small)ELSE
out_current <= 1 ma WHEN (load = med) ELSE
out_current <= 10 ma WHEN (load = big) ELSE
out_current <= 100 ua;
END delay_calc; Copyright © by N.T.K - 8/2008
3.2.2. Kiểu dữ liệu tổng
hợp
 Kiểu dữ liệu tổng
hợp(CompositeTypes)
 Kiểu mảng (Array Types)
 Kiểu bản ghi (Record Types)

Copyright © by N.T.K - 8/2008


Kiểu mảng (Array Types)
 Kiểu dữ liệu mảng nhóm các phần tử
cùng kiểu với nhau như là 1 đối tượng
đơn. Các phần tử trong mảng được truy
nhập bằng chỉ số.
 Ba loại mảng hay dùng:

1D
1Dx1D 2D

Copyright © by N.T.K - 8/2008


Kiểu mảng (Array Types)
 Thực tế, các kiểu dữ liệu định nghĩa sẵn
trong VHDL chỉ bao gồm kiểu vô hướng
và vector (mảng một chiều của các bit).
 Các kiểu DL định nghĩa sẵn có thể tổng
hợp bao gồm:
 Scalars: BIT, STD_LOGIC, STD_ULOGIC, and
BOOLEAN.
 Vectors: BIT_VECTOR, STD_LOGIC_VECTOR,
STD_ULOGIC_VECTOR, INTEGER, SIGNED,
and UNSIGNED.

Copyright © by N.T.K - 8/2008


Kiểu mảng (Array Types)
 Khai báo mảng:
 TYPE name IS ARRAY (spec) OF
data_type;
 Khai báo sử dụng kiểu mảng:
 SIGNAL/VARIABLE/CONSTANT
signal_name: type_name [:=
TYPE data_bus IS ARRAY(0 TO 31) OF BIT;
initial_value];
VARIABLE X: data_bus;
VARIABLE Y: BIT;
Y := X(0); --line 1
Y := X(15); --line 2
Copyright © by N.T.K - 8/2008
Kiểu mảng (Array Types)
 Ví dụ về mảng 1Dx1D
TYPE row IS ARRAY (7 DOWNTO 0) OF STD_LOGIC; -- 1D array
TYPE matrix IS ARRAY (0 TO 3) OF row; -- 1Dx1D array
SIGNAL x: matrix; -- 1Dx1D signal
--------------------------------------------------------------------------------------------
TYPE matrix IS ARRAY (0 TO 3) OF STD_LOGIC_VECTOR(7 DOWNTO 0);

 Ví dụ về mảng 2D
TYPE matrix2D IS ARRAY (0 TO 3, 7 DOWNTO 0) OF STD_LOGIC;
-- 2D array

Copyright © by N.T.K - 8/2008


Kiểu mảng (Array Types)
 Khởi tạo dữ liệu mảng:
 ... :="0001"; -- for 1D array
 ... :=('0','0','0','1') -- for 1D array
 ... :=(('0','1','1','1'), ('1','1','1','0')); -- for
1Dx1D or
-- 2D array

Copyright © by N.T.K - 8/2008


Ví dụ về mảng 1D
PACKAGE array_example IS
TYPE data_bus IS ARRAY(0 TO 31) OF BIT;
TYPE small_bus IS ARRAY(0 TO 7) OF BIT;
END array_example;
-------------------------------------------------------------------
USE WORK.array_example.ALL;
ENTITY extract IS
PORT ( data : IN data_bus;
start : IN INTEGER;
data_out : OUT small_bus);
END extract;
ARCHITECTURE test OF extract IS
BEGIN
PROCESS(data, start)
BEGIN
FOR i IN 0 TO 7 LOOP
data_out(i) <= data(i + start);
END LOOP;
END PROCESS;
END test; Copyright © by N.T.K - 8/2008
Ví dụ về mảng 1Dx1D
ARCHITECTURE basic OF rom IS
CONSTANT z_state : data_out := (‘Z’, ‘Z’, ‘Z’, ‘Z
LIBRARY IEEE; CONSTANT x_state : data_out := (‘X’, ‘X’, ‘X’, ‘
USE IEEE.std_logic_1164.ALL; CONSTANT rom_data : mem_data :=
PACKAGE memory IS ( ( ‘0’, ‘0’, ‘0’, ‘0’),
CONSTANT width : INTEGER := 3; ( ( ‘0’, ‘0’, ‘0’, ‘1’),
CONSTANT memsize : INTEGER := 7; ( ( ‘0’, ‘0’, ‘1’, ‘0’),
TYPE data_out IS ARRAY(0 TO width) ( ( ‘0’, ‘0’, ‘1’, ‘1’),
OF std_logic; ( ( ‘0’, ‘1’, ‘0’, ‘0’),
TYPE mem_data IS ARRAY(0 TO memsize) ( ( ‘0’, ‘1’, ‘0’, ‘1’),
OF data_out; ( ( ‘0’, ‘1’, ‘1’, ‘0’),
END memory; ( ( ‘0’, ‘1’, ‘1’, ‘1’) );
LIBRARY IEEE; BEGIN
USE IEEE.std_logic_1164.ALL; ASSERT addr <= memsize
USE WORK.memory.ALL; REPORT “addr out of range”
ENTITY rom IS SEVERITY ERROR;
PORT( addr : IN INTEGER; data <= rom_data(addr) AFTER 10 ns WHEN c
PORT( data : OUT data_out; data <= z_state AFTER 20 ns WHEN cs = ‘0’ E
PORT( cs : IN std_logic); data <= x_state AFTER 10 ns;
END rom; END basic;
Copyright © by N.T.K - 8/2008
Kiểu mảng không ràng
buộc
 Kiểu mảng không ràng buộc về
kích thước (Unconstrained arrays):
 Kích thước mảng không được chỉ ra
khi khai báo.
 Kích thước mảng sẽ được chỉ ra khi
khai báo signal/variable/constant sử
dụng kiểu mảng này.
TYPE BIT_VECTOR IS ARRAY(NATURAL RANGE <>) OF BIT;

Copyright © by N.T.K - 8/2008


Kiểu dữ liệu con subtype
 Khai báo kiểu dữ liệu con được sử
dụng để định nghĩa các tập con
của một kiểu dữ liệu. Tập con có
thể chứa tòan bộ khoảng giá trị
của kiểu cơ sở những cũng có thể
chỉ chứa một phần.
TYPE INTEGER IS -2,147,483,647 TO +2,147,483,647;
SUBTYPE NATURAL IS INTEGER RANGE 0 TO +2,147,483,647;

Copyright © by N.T.K - 8/2008


Ví dụ về khai báo subtype
PACKAGE mypack IS
SUBTYPE eightbit IS BIT_VECTOR(0 TO 7);
SUBTYPE fourbit IS BIT_VECTOR(0 TO 3);
FUNCTION shift_right(val : BIT_VECTOR)
RETURN BIT_VECTOR;
END mypack;
-------------------------------------------------------------------------------
PACKAGE BODY mypack IS
FUNCTION shift_right(val : BIT_VECTOR) RETURN
BIT_VECTOR
IS VARIABLE result : BIT_VECTOR(0 TO (val’LENGTH -1));
BEGIN
result := val;
IF (val’LENGTH > 1) THEN
FOR i IN 0 TO (val’LENGTH -2) LOOP
result(i) := result(i 1);
END LOOP;
result(val’LENGTH -1) := 0;
ELSE
result(0) := 0;
END IF;
RETURN result;
END shift_right;
Copyright © by N.T.K - 8/2008
END mypack;
Kiểu bản ghi record
 Kiểu dữ liệu bản ghi nhóm các đối
tượng có kiểu khác nhau như một
đối tượng duy nhất.
 Mỗi thành phần của bản ghi có thể
được truy cập bằng tên trường của
nó.
 Các thành phần của bản ghi có thể
cùng kiểu hoặc khác kiểu dữ liệu.
Kiểu dữ liệu có thể bao gồm cả
mảng và bản ghi.
Copyright © by N.T.K - 8/2008
Kiểu bản ghi record
 Ví dụ về kiểu bản ghi:

TYPE optype IS ( add, sub, mpy, div, jmp );


TYPE instruction IS
RECORD
opcode : optype;
src : INTEGER;
dst : INTEGER;
END RECORD;

Copyright © by N.T.K - 8/2008


Kiểu bản ghi record
PROCESS(X)
VARIABLE inst : instruction;
VARIABLE source, dest : INTEGER;
TYPE optype IS ( add, sub, VARIABLE operator : optype;
mpy, div, jmp ); BEGIN
TYPE instruction IS source := inst.src; --Ok line 1
dest := inst.src; --Ok line 2
RECORD
source := inst.opcode; --error line 3
opcode : optype; operator := inst.opcode; --Ok line 4
src : INTEGER; inst.src := dest; --Ok line 5
dst : INTEGER; inst.dst := dest; --Ok line 6
END RECORD; inst := (add, dest, 2); --Ok line 7
inst := (source); --error line 8
END PROCESS;

Copyright © by N.T.K - 8/2008


Kiểu bản ghi record
TYPE word IS ARRAY(0 TO 3) OF
std_logic;
TYPE t_word_array IS ARRAY(0 TO 15)
OF word; PROCESS(X)
TYPE addr_type IS VARIABLE packet : data_packet;
RECORD BEGIN
source : INTEGER; packet.addr.key := 5; --Ok
key : INTEGER; packet.addr := (10, 20); --Ok
END RECORD; packet.data(0) := (‘0’, ‘0’, ‘0’, ‘0’);
TYPE data_packet IS packet.data(10)(4) := ‘1’; --error
RECORD packet.data(10)(0) := ‘1’; --Ok
addr : addr_type; END PROCESS;
data : t_word_array;
checksum : INTEGER;
parity : BOOLEAN;
END RECORD;
Copyright © by N.T.K - 8/2008
Kiểu dữ liệu File
 Các file bao gồm các dãy tuần tự
của một kiểu dữ liệu (có thể là
INTEGER, record…)
 Cuối mỗi file được đánh dấu kết
thúc bằng ký tự “End of file”.

Copyright © by N.T.K - 8/2008


Kiểu dữ liệu File
 Các thao tác thực hiện với file:
 READ (file, data)Procedure
 WRITE (file, data)Procedure
 ENDFILE (file)Function, returns
boolean

Copyright © by N.T.K - 8/2008


Kiểu dữ liệu File
 Khai báo kiểu file:
 TYPE int_file IS FILE OF INTEGER;

 Khai báo đối tượng file:


 FILE myfile : int_file IS IN
“/test/data_file”

Copyright © by N.T.K - 8/2008


LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY rom IS
PORT(addr : IN INTEGER;
cs : IN std_logic;
data : OUT INTEGER);
END rom;
ARCHITECTURE rom OF rom IS

Ví BEGIN
PROCESS(addr, cs)
VARIABLE rom_init : BOOLEAN := FALSE; --line 1

dụ TYPE rom_data_file_t IS FILE OF INTEGER; --line 2


FILE rom_data_file : rom_data_file_t IS IN “/dlp/test1.dat”; --line 3
TYPE dtype IS ARRAY(0 TO 63) OF INTEGER;

về VARIABLE rom_data : dtype; --line 4


VARIABLE i : INTEGER := 0; --line 5
BEGIN
tru IF (rom_init = false) THEN --line 6
WHILE NOT ENDFILE(rom_data_file) --line 7

y
AND (i < 64) LOOP
READ(rom_data_file, rom_data(i)); --line 8
i := i + 1; --line 9

cập
END LOOP;
rom_init := true; --line 10
END IF;

file IF (cs = ‘1’) THEN

ELSE
--line 11
data <= rom_data(addr); --line 12

data <= -1; --line 13


END IF;
END PROCESS;
Copyright © by N.T.K - 8/2008
Các kiểu DL có thể tổng
hợp

Copyright © by N.T.K - 8/2008


Copyright © by N.T.K - 8/2008
Đề tài môn học Thiết kế nhờ
MT

Nhóm: 6 người/nhóm
Đề tài môn học Thiết kế nhờ
MT
 Đề tài có 2 phần:
 Phần 1: Nghiên cứu ví dụ về viết CPU
trong tài liệu “VHDL Programming by
Example 4th Ed” – Douglas L.Perry.
 Phần 2: Thực hiện 1 trong các đề tài sau:

Copyright © by N.T.K - 8/2008


Đề tài phần 2 (μC)
 8051
 PIC 16F84 – VHDL & Verilog
 AVR ATTiny64.
 AVR AT90S1200.
 AVR ATMega.
 miniMIPS.
 SuperH-2 (Aquarius).
 MIPS I (YACC-Yet Another CPU) – Verilog.
 Yellow Star (MIPS R3000) – Verilog.
 OpenRISC 1000 (32/64bit RISC).

Copyright © by N.T.K - 8/2008


Đề tài phần 2 (others)
 PCI Bridge.
 Ethernet MAC 10/100 Mbps
 VGA/LCD Controller.
 PS2 Interfaces (y/c hardware).
 UART Controller.
 FPU (Floating Point Unit).
 Mã hóa AES.
 Mã hóa DES.

Copyright © by N.T.K - 8/2008


 Chú ý:
Nên làm cùng môn đồ án FPGA.

Copyright © by N.T.K - 8/2008


Đề tài phần 3 (ko làm)
 Nghiên cứu,tìm hiểu ngôn ngữ Verilog.
 Nghiên cứu,tìm hiểu ngôn ngữ VHDL-
AMS.

Copyright © by N.T.K - 8/2008


Yêu cầu:
 Báo cáo:
 Tìm hiểu và xây dựng lại sơ đồ khối
của vđk. Phân tích kỹ từng khối. Thực
hiện test kiểm nghiệm hoạt động.
 Tìm hiểu hoạt động trong 1 chu kỳ
đồng hồ.
 Nói rõ công việc từng người.

Copyright © by N.T.K - 8/2008


Tài liệu tham khảo
 Cách thiết kế 1 vđk bằng VHDL:
 MicroProcessor Design.
 VHDL Programming by Examples (4th).
 Websites:
 www.opencores.org
 www.asics.ws

Copyright © by N.T.K - 8/2008


 Lịch bảo vệ: 17/11
 30% điểm – Không bảo vệ -> ko thi L1
 Nếu làm tốt => +10 điểm vào bài thi
 Địa điểm: bộ môn KTMT C1-322.
 Thời gian: 8h – 17h
 Y/c: Mang slide + Mã nguồn + Tài liệu
TK
 Khi báo cáo sẽ phải demo chương trình
(chạy mô phỏng).
 Nếu ai demo phức tạp, tự đem máy tính.
Copyright © by N.T.K - 8/2008

You might also like