LIBRARY 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 nand_gate IS PORT - ENTITY : đặt tê
Trang 1- VHDL là ngôn ngữ mô tả phần cứng
- VHDL viết tắt của V HSIC (Very High Speed Integrated Circuit) H ardware D escription L anguage
- 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
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.
Trang 2Mã VHDL cơ bản
LIBRARY khai báo thư viện
ENTITY thực thể
ARCHITECTURE kiến trúc
Trang 3LIBRARY 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 nand_gate IS PORT (
- 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
a
Mô tả các tín hiệu xuất/nhập của khối component
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
IN IN
OUT BUFFER
OUT INOUT
Trang 4- ARCHITECTURE : đặt tên cho architecture (model model )
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.
- 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)
a
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;
* 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;
* Hằng số (Constant): giữ một giá trị không được thay đổi
CONSTANT constant_name : constant_type;
VARIABLE b : std_logic;
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;
Trang 5- Lệnh gán tín hiệu: signal_name <= expression;
a <= NOT b AND c ;
variable_name := expression;
y := NOT a ;
- Lệnh gán biến:
- Biến (Variable) là cục bộ trong process.
- 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
* Sự khác nhau giữa Tín hiệu (Signal) và Biến (Variable)
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ó thể tạo ra các kiểu dữ liệu mới bằng lệnh TYPE hoặc SUBTYPE
- Các dữ liệu cùng kiểu mới được gán hoặc kết nối với nhau
* 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 liệt kê (ENUMERATION) do người sử dụng định nghĩa.
* Kiểu CHARACTER
*
Trang 6SIGNAL a : STD_LOGIC;
SIGNAL b : STD_LOGIC_VECTOR(7 DOWNTO 0);
a là tín hiệu STD_LOGIC kiểu 1 bit b,c là tín hiệu STD_LOGIC kiểu bus có 8 bit
‘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.
SIGNAL d : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL e : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL f : STD_LOGIC_VECTOR(8 DOWNTO 0);
a <= ’1’; giá trị gán đặt giữa 1 dấu nháy đơn ‘ ’
a <= b(2) ; a <= b(2),
b <= "0000”; giá trị gán đặt giữa 1 dấu nháy kép “ ”
c <= B”0000”; B là ký hiệu cơ số 2 (có thể bỏ)
d <= ”0110_0111”; biểu diễn từng nhóm 4 bit phân cách _
e <= X”AF67”; X là ký hiệu cơ số 16 (Hex)
f <= O”723”; O là ký hiệu cơ số 8 (Octal)
Trang 7SIGNAL 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);
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 ROL ROR
* Phép toán cộng (Adding Operator): +
Trang 8-* 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
** ABS NOT
* / MOD REM + - (Dấu)
+ - &
= /= < <= > >=
AND 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 (Structural)
LUỒNG DỮ LIỆU (Dataflow)
HÀNH VI (Behavioral)
Trang 9MÔ 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)
- Để kết nối component cấp thấp, thực hiện lệnh thay thế trị số component (component instantiation) PORT MAP
* Kết hợp vị trí (positional association)
* Kết hợp theo tên (named association) Có 2 cách :
Label : component_name PORT MAP (
port_name1 => sig_name1 ,
port_name2 => sig_name2 );
Trang 10Label : component_name PORT MAP (
ARCHITECTURE structural OF xor3 IS
SIGNAL u1_out: STD_LOGIC;
c
result
VD: Thiết kế XOR 3 ngõ vào u1_out
Trang 11MÔ 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
- 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
* Phép gán WHEN - ELSE
* Phép gán WITH – SELECT - WHEN
* Phép tạo GENERATE
ARCHITECTURE dataflow OF xor3 IS
SIGNAL u1_out : STD_LOGIC;
BEGIN
u1_out <= a XOR b Result <= u1_out XOR c END dataflow;
Result <= u1_out XOR c u1_out <= a XOR b
a b
c
result u1_out
Phép gán bằng phép toán (OPERATOR)
Trang 12Phép gán tín hiệu theo điều kiện (Condition Signal Assigment)
WHEN - ELSE
signal_name <= value1 WHEN condition1 ELSE
{value2 WHEN condition2 ELSE } valueN ;
mux2to1
sel y 0 1
c <= ’1’ WHEN a = ’0’ AND b = ’0’ ELSE
’0’ WHEN a = ’0’ AND b = ’1’ ELSE
’0’ WHEN a = ’1’ AND b = ’0’ ELSE
’1’ WHEN a = ’1’ AND b = ’1’ ELSE
Trang 13Phé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 ;
d0 d1 y sel
mux2to1
sel y 0 1
d0 d1
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.
Trang 14c <= ’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
xor_array : FOR i IN 7 downto 0 GENERATE
user : xor2 PORT MAP (
x(i) , y(i) , z(i) );
END GENERATE ;
Trang 15generic_name1 : data_type := default_values;
generic_name2 : data_type := default_values;
) PORT (
port_name : mode data_type;
) END entity_name;
PORT MAP (
port_name => sig_name );
* Khai báo component có GENERIC
COMPONENT component_name GENERIC (
generic_name1 : data_type := default_values;
) PORT (
port_name : mode data_type;
) END COMPONENT ;
Trang 16MÔ TẢ HÀNH VI ( Behavioral description)
- Mô tả sự đáp ứng của ngõ ra theo ngõ vào
- 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
- 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ó
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.
- Một Architecture có nhiều Process Các Process là các phát biểu đồng thời
- 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
Trang 17* 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 ;
d0 d1 y sel
mux2to1
sel y 0 1
d0 d1
VD: Mux2to1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS PORT ( d0 , d1 , sel : IN STD_LOGIC;
IF sel = ’0’ THEN y <= d0 ; ELSE y <= d1 ;
END IF;
END PROCESS;
END behavior1;
Trang 18Phát biểu CASE - WHEN
CASE select_signal IS
WHEN value1 => sequential_statements_1;
WHEN value2 => sequential_statements_2;
WHEN OTHERS => sequential_statements_N;
END CASE ;
d0 d1 y sel
mux2to1
sel y 0 1
d0 d1
VD: Mux2to1
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux2to1 IS PORT ( d0 , d1 , sel : IN STD_LOGIC;
Phát biểu FOR - LOOP
[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 ;
Tương tự như phát biểu đồng thời FOR_GENERATE.
Trang 19Phát biểu WHILE - LOOP
THIẾT KẾ HỆ TỔ HỢP 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)
Trang 20BỘ CỘNG
A D D E R LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY fulladder IS PORT ( x , y , z : IN STD_LOGIC;
y
s z
Cin
a2 a1 a0 b3 b2 b1 b0
s3 s2 s1 s0
LIBRARY ieee;
USE ieee.std_logic_1164.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 Structure;
Thiết kế bộ cộng 4 bit adder4 sử dụng fulladder
Trang 21Lệ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.
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);
NguyenTrongLuat 41
BỘ DỒN KÊNH
M U X
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux4 IS PORT (
END Function;
MUX4 d0 d1 d2 d3 s1 s0 y
ARCHITECTURE Dataflow OF mux4 IS BEGIN
y <= d0 WHEN s = ”00” ELSE d1 WHEN s = ”01” ELSE d2 WHEN s = ”10” ELSE d3 WHEN OTHERS;
END Dataflow;
WITH s SELECT
y <= d0 WHEN ”00”, d1 WHEN ”01”, d2 WHEN ”10”, d3 WHEN OTHERS ;
Trang 22LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux16 IS PORT (
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) , );
Thiết kế MUX 16 1 sử dụng MUX 4 1
mux16
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux16 IS PORT (
Trang 23BỘ GIẢI MÃ D
E C O D E R
x0 x1 en dec2x4
ARCHITECTURE flow2 OF
dec2x4 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” ,
Trang 24LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY dec3to8 IS PORT ( : IN STD_LOGIC_VECTOR(2 downto 0);
Để sử dụng hàm này, trong phần LIBRARY cần phải khai báo gói (package)
- STD_LOGIC_ARITH
- STD_LOGIC_UNSIGNED
BỘ GIẢI MÃ
3 8 BỘ GIẢI MÃ
3 8
Trang 25NguyenTrongLuat 49
BỘ MÃ HÓA ƯU TIÊN
E N C O D E R
x0 x1 v encoder
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 BEGIN
x <= ”11” WHEN i(3) = ’1’ ELSE
”10” WHEN i(2) = ’1’ ELSE
”01” WHEN i(1) = ’1’ ELSE
x : OUT STD_LOGIC_VECTOR(1 downto 0);
Trang 26NguyenTrongLuat 51
BỘ SO SÁNH C
O M P A R A T O R
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY compare IS PORT ( a, b : IN STD_LOGIC_VECTOR(3 downto 0);
aeqb, agtb, altb : OUT STD_LOGIC);
END compare;
ARCHITECTURE behavior1 OF compare IS BEGIN
aeqb <= ’1’ WHEN a = b ELSE ’0’;
agtb <= ’1’ WHEN a > b ELSE ’0’;
altb <= ’1’ WHEN a < b ELSE ’0’;
END behavior1;
ARCHITECTURE behavior2 OF compare IS BEGIN
PROCESS (a, b) BEGIN
aeqb <= ’0’; agtb <= ’0’; altb <= ’0’;
IF a = b THEN aeqb <= ’1’; END IF ;
IF a > b THEN agtb <= ’1’; END IF ;
IF a < b THEN altb <= ’1’; END IF ; END PROCESS;
segs : OUT STD_LOGIC_VECTOR(6 downto 0);
Trang 27THIẾT KẾ HỆ TUẦN TỰ BẰNG VHDL
- Hệ tuần tự chỉ được thực hiện bằng các phát biểu tuần tự (sequential statement)
- Thực hiện: mạch chốt, FF, thanh ghi, bộ đếm, máy trạng thái.
- Biến (Variable) chỉ tồn tại cục bộ trong Process, vì vậy muốn lấy giá trị của biến ra ngoài Process thì ta phải gán biến cho tín hiệu (Signal).
NguyenTrongLuat 53
- Trong Process, biến được cập nhật giá trị sau mỗi phát biểu;
còn tín hiệu chỉ được cập nhật ở cuối Process
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Dlatch IS PORT ( , Clk : IN STD_LOGIC;
IF Clk = ’1’ THEN
Q <= D
Qn <= NOT Q ; END IF ;
END PROCESS ; END behavior;
Trang 28NguyenTrongLuat 55
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Dflipflop IS PORT ( , Clk : IN STD_LOGIC;
IF Clk’event AND Clk = ’1’ THEN
Q <= D
Qn <= NOT Q ; END IF ;
- clk’event phát hiện sự thay đổi tín hiệu clk từ 0 lên 1 hoặc từ 1 về 0.
- Gói std_logic_1164 có định nghĩa 2 hàm (function): rising_edge để phát hiện cạnh lên và falling_edge để phát hiện cạnh xuống của tín hiệu.
IF rising_edge( clk ) THEN
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY DFF IS PORT ( , Clk, Pr, Cl : IN STD_LOGIC;
Q Qn : OUT STD_LOGIC);
END DFF;
ARCHITECTURE behavior OF DFF IS BEGIN
PROCESS ( Clk, Pr, Cl ) BEGIN