MÔ TẢ LUỒNG DỮ LIỆU Dataflow * 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 –
Trang 1VHDL
Trang 2- 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
Trang 3Thuậ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à
Trang 4Mã VHDL cơ bản
Trang 5Ví dụ: Mã VHDL mô tả component NAND 2
Trang 6LIBRARY 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)
- 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,
Trang 7* 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 8và 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
Trang 9ĐỐ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;
SIGNAL a : std_logic;
VARIABLE b : std_logic;
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;
Trang 10- Lệnh gán tín hiệu: signal_name <= expression;
- 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)
Trang 11KIỂ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 12SIGNAL 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
e 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.
(có thể được
lái bằng 2 ngõ
vào)
Trang 13SIGNAL a : STD_LOGIC;
SIGNAL b : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL c : STD_LOGIC_VECTOR(0 TO 3);
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 ‘ ’
Phép gán tín hiệu kiểu STD_LOGIC
NguyenTrongLuat 13
Trang 14SIGNAL 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);
Trang 15PHÉ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,
* Phép toán dịch (Shift Operator):
SLL SRL SLA SRA ROL ROR
* Phép toán cộng (Adding Operator): +
Trang 16-* 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 ** 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
Trang 17MÔ TẢ THIẾT KẾ (Design description)
MÔ TẢ THIẾT
KẾ
(Design description)
Trang 18MÔ TẢ CẤU TRÚC (Structural
- 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
Trang 21ARCHITECTURE structural OF xor3 IS
SIGNAL u1_out: STD_LOGIC;
result
VD: Thieát keá XOR 3
Trang 22MÔ TẢ LUỒNG DỮ LIỆU (Dataflow
* 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
Trang 23ARCHITECTURE dataflow OF xor3 IS
SIGNAL u1_out : STD_LOGIC;
result u1_out
Phép gán bằng phép toán (OPERATOR)
Trang 24Phé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 ;
d0 d1 y <= d0 d1 WHEN OTHERS WHEN sel = ’0’ ; ELSE
VD: Mux2to1
Trang 25c <= ’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
VD: xnor2
a
Trang 26Phé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
END dataflow2;
Trang 27WITH select_signal SELECT
signal_name <= value1 WHEN const1_of_select_signal,
{value2 WHEN const2_of_select_signal,} valueN WHEN OTHERS ;
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 28c <= ’1’ WHEN ”00” | ”11”, ’0’ WHEN OTHERS ;
END dataflow2;
Trang 29Phá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
xor_array : FOR i IN 7 downto 0 GENERATE
user : xor2 PORT MAP ( x(i) , y(i) , z(i) ); END GENERATE ;
Trang 30- 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;
Trang 31* 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 );
* Khai báo component có GENERIC
Trang 32MÔ 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ó
Trang 33- 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 34* 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…
Trang 35Phát biểu IF - THEN - ELSE
IF condition1 THEN sequential_statements_1;
{ ELSIF condition2 THEN sequential_statements_1;}
END PROCESS;
Trang 36Phá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 PROCESS;
Trang 37Phát biểu FOR - LOOP
[Name:] FOR variable_name IN range LOOP
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 38Phát biểu WHILE - LOOP
Trang 39THIẾ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 40BỘ CỘNG
A D D E R
Trang 41b3 b2 b1 b0
s3 s2 s1 s0
s : OUT STD_LOGIC_VECTOR(3 downto 0);
Cout : OUT STD_LOGIC);
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;
Thiết kế bộ cộng 4 bit adder4
sử dụng fulladder
Trang 42Lệ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
Bộ cộng 4 bit adder4 sử dụng
phép cộng số học
s : OUT STD_LOGIC_VECTOR(3 downto 0);
Cout : OUT STD_LOGIC);
Trang 43BỘ DỒN KÊNH
M U X
y <= (NOT s(1) AND NOT s(0) AND d0 ) OR
(NOT s(1) AND s(0) AND d1 ) OR
( s(1) AND NOT s(0) AND d2 ) OR
( s(1) AND s(0) AND d3 );
END Function;
MUX4
d0 d1 d2 d3 s1 s0
ARCHITECTURE Dataflow OF mux4 IS
Trang 44M0 : 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 44
Thiết kế MUX 16 1 sử dụng
MUX 4 1
mux16
Trang 45MUXES : mux4 PORT MAP (
d(4*i) , d(4*i+1) , d(4*i+2) , d(4*i+3) , c(1 downto 0) , w(i) );
Trang 46BỘ GIẢI
MÃ
D E C O D E R
en x1 x0 y3 y2 y1 y0
0 X
X
x0 x1 en dec2x4
ARCHITECTURE flow2 OF
dec2x4 IS SIGNAL
en_x : STD_LOGIC_VECTOR(
2 downto 0);
BEGIN en_x <= en & x ;
WITH en_x SELECT
f <= ”0001” WHEN ”100” ,
”0010” WHEN ”101” , ”0100” WHEN ”110” , ”1000” WHEN ”111” ,
Trang 47Thieát keá IC DECCODER 74138
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 49For … loop
Sử dụng hàm CONV_INTEGER
để đổi dữ liệu kiểu STD_LOGIC_VECTOR thành kiểu INTEGER.
Để sử dụng hàm này, trong phần LIBRARY cần phải khai báo gói (package)
Trang 50BỘ MÃ HÓA ƯU
TIÊN 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
BEGIN
x <= ”11” WHEN i(3) = ’1’ ELSE
”10” WHEN i(2) = ’1’ ELSE
”01” WHEN i(1) = ’1’ ELSE
to ”0111”, ”11” WHEN OTHERS ;
WITH i SELECT
V <=’0’ WHEN ”0000”, ’1’ WHEN OTHERS;
Trang 51LIBRARY 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);
END PROCESS ;
Sử dụng
PROCESS
Trang 52BỘ 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’;
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;
BỘ SO SÁNH 4
BIT
Trang 53LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY led IS
PORT ( bcd : IN STD_LOGIC_VECTOR(3 downto 0);
segs : OUT STD_LOGIC_VECTOR(6 downto 0);
Trang 54THIẾ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).
- 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
Trang 56- Gói std_logic_1164 có định nghĩa 2 hàm
(function): rising_edge để phát hiện cạnh lên và
IF rising_edge( clk ) THEN
Trang 58LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY regn IS
GENRERIC ( n : NATURAL := 4);
PORT ( D : IN STD_LOGIC_VECTOR(n-1 downto 0);
Clk , Reset : _VECTORIN STD_LOGIC;
Q : OUT STD_LOGIC(n-1 downto 0));
Trang 59BỘ ĐẾM (COUNTER)
Sử dụng biến count để thực hiện chức năng bộ đếm
đồng bộ
Biến count được gán cho ngõ ra Q
ở cuối Process,
Trang 62LIBRARY ieee;
USE ieee.std_logic_1164.all
USE ieee.std_logic_unsigned.all;
ENTITY Updncnt4 IS
PORT ( Clk , Rst , Updn : IN STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(3 downto 0));
END Updncnt4;
ARCHITECTURE Behavioral OF Updncnt4 IS
SIGNAL count : STD_LOGIC_VECTOR (3 downto 0);
Trang 63ARCHITECTURE shiftreg OF sipo IS
SIGNAL reg : STD_LOGIC_VECTOR(n-1 downto 0);
Trang 64LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY siso IS
GENERIC ( n : NATURAL := 8);
PORT ( Clk , Serin : IN STD_LOGIC;
Serout : OUT STD_LOGIC);
END siso;
ARCHITECTURE shiftreg OF siso IS
SIGNAL reg : STD_LOGIC_VECTOR(n-1 downto 0);
BEGIN
PROCESS ( Clk ) BEGIN
IF rising_edge( Clk ) THEN
reg <= reg(n-2 downto 0) & Serin ;
END IF ; END PROCESS ; Serout <= reg(n-1) ;
Trang 65ARCHITECTURE shiftreg OF piso IS
SIGNAL reg : STD_LOGIC_VECTOR(n-1 downto 0);
ELSE reg <= reg(n-2 downto 0) & Serin ;