VHDL - Mục đích và sự hình thành • VHDL, trước hết và chủ yếu là một công cụ để mô hình hoá phần cứng hardware modeling – Để mô phỏng simulation và tổng hợp synthesis mạch • Chuẩn IEEE
Trang 1Bài 1
Vấn đề Mô hình hoá
phần cứng (Hardware Modeling)
Trang 2VHDL là gì?
• Một từ viết tắt cho một từ viết tắt khác, VHDL là từ viết
tắt của VHSIC Hardware Description Language
– Còn VHSIC là từ viết tắt của Very High Speed Integrated Circuit
• Tiếp theo, chúng ta bắt đầu tìm hiểu về xuất xứ và mục đích của ngôn ngữ này
Trang 3VHDL - Mục đích và sự
hình thành
• VHDL, trước hết và chủ yếu là một công cụ để mô hình hoá phần cứng (hardware modeling)
– Để mô phỏng (simulation) và tổng hợp (synthesis) mạch
• Chuẩn IEEE 1076 rất hoàn chỉnh cho việc mô hình hoá thiết bị, nhưng nó mới chỉ định nghĩa các tham số khái quát cho việc tổng hợp thiết bị
• Kết quả: một mô hình phần cứng đã cho không hẳn đã phù hợp với một thiết kế ở mức cổng logic đã có thông qua các công cụ và các công nghệ đích (target) khác nhau
Trang 4Chuẩn hoá VHDL
• Tổ chức IEEE chính thức phê chuẩn chấp nhận ngôn ngữ VHDL như là một chuẩn của họ vào năm 1987, chuẩn IEEE 1076
– Giống như các chuẩn kác của IEEE, chuẩn IEEE 1076 được sửa đổi theo chu kỳ tối thiểu là 5 năm
• Sửa đổi đầu tiên được thực hiện năm 1993, và VHDL-93 hiện nay được coi là phiên bản chính thức của ngôn ngữ này, hiện nay bắt đầu xuất hiện VHDL 200X
– Tuy nhiên, hầu hết các công cụ (tool) đều hỗ trợ phiên bản đầu tiên (VHDL-87)
được hỗ trợ bởi một số tool
VHDL-87 VHDL-93
VHDL-2X
Trang 5IEEE 1076 (modeling)
IEEE 1076 (synthesis)
Language Subsets
• Không phải tất cả các cấu trúc VHDL đều có thể tổng hợp được Ví dụ, wait for 10 ns là một cấu trúc mô hình hoá thông dụng, nhưng nó không tương ứng với và cũng không thể tạo ra một phần tử ở mức cổng logic
Trang 6Logic RTL
Layout
Ít chi tiết hơn, thiết kế và mô phỏng nhanh hơn
Chi tiết hơn, phụ thuộc công nghệ, thiết kế và mô phỏng chậm hơn
DFF AND_OR2
CLB_
R5C5
CLB_ R5C6
Các mức trừu tượng trong
mô tả phần cứng
F
Trang 7Sự chồng chéo trong VHDL
Behavioral
Logic RTL
Layout Place & Route Utility
FPGA Vendor Library Synthesizable Code
Trang 8Trình tự thiết kế Top-Down
• VHDL hỗ trợ hướng tiếp cận top-down trong thiết kế
Trang 9Nguyên tắc phân đoạn
• Khi tiến hành phân đoạn một thiết kế trong VHDL, cần lưu tâm cân nhắc một số các điểm chính sau
– Tín hiệu ra có chốt (Register) tại biên giới các module
• Phù hợp với cấu trúc mã nguồn dạng RTL
– Giảm đến tối thiểu số clock trên mỗi block
• Quan trọng đối với các ràng buộc về thời gian, Important for timing constraints, tối ưu hoá cấu trúc mạch
– Duy trì các tín hiệu then chốt trong phạm vi mỗi block
• Hầu hết các công cụ đều không tối ưu thông qua biên giới hierarchy
– Kích thước của từng block đủ nhỏ để có thể kiểm tra nhanh chóng
• Mẫu thử nhanh, đơn giản cho mỗi sub-module
Trang 10A[3:0] entity Add_4 B[3:0]
entity Full_Add
A B
entity
Cấu trúc Top - Down
Macro
Trang 11VHDL modules
SDF (Standard Delay
Format)
Kiểm tra thiết kế
• Khi sử dụng VHDL, có thể thực hiện các bước kiểm tra thiết kế, bắt đầu từ Behavioral Simulation
Trang 12VHDL modules
Synthesis
Place & Route
Các bước kiểm tra thiết kế
(3) Mô phỏng chức năng trong VHDL
• Thực hiện file vhd mô tả cấu trúc, dùng testbench
(4) Mô phỏng chức năng thiết bị ở mức cổng
• Mô phỏng netlist pre-P&R EDN dùng công cụ mức cổng
(5) Mô phỏng theo quan hệ thời gian trong VHDL
• Thực hiện file cấu trúc vhd và file SDF;
dùng testbench (6) Mô phỏng quan hệ thời gian ở mức cổng
• Mô phỏng netlist post P&R EDN netlist, sử dụng các delays
Trang 14Kết luận
• VHDL là một ngôn ngữ dùng để mô hình hoá phần cứng của thiết bị
• Tổng hợp logic là một tập con của toàn bộ ngôn ngữ
• Các vấn đề về công cụ và công nghệ có ảnh hưởng đến việc tổng hợp logic của một thiết kế
• Các mô phỏng HDL có thể bao gồm các dữ liệu định thời (back-annotated timing data)
Trang 15Bài 2
Ngôn ngữ VHDL
Trang 16Chương trình VHDL bao gồm các design units
Một số design units độc lập với các design unit khác.
Design Units trong
Trang 17Các loại Design Unit
• Trong VHDL có hai loại design unit, đó là:
• Không phụ thuộc vào các design unit khác
• Phụ thuộc vào primary design unit
• Mỗi khi có thay đổi trong primary design unit, cần phải kiểm tra lại secondary design unit Nếu không, chương trình sẽ có lỗi.
• Các secondary unit không thể tồn tại độc lập
tức là, phải phụ thuộc primary unit
Trang 18• Entity mô tả external interface của thực thể được thiết
kế, cùng các thuộc tính liên quan với interface đó
port (A, B : in std_logic ;
Carry, Sum : out std_logic) ;
A
Carry
Sum B
Entity
Chú thích: VHDL’93 cho phép dùng optional reserved word entity ngay sau reserved word end, ví dụ, ‘end entity Half_Add ; ’
Trang 19architecture My_Arch of Half_Add is
begin Sum <= A xor B ; Carry <= A and B ;
Trang 20end RTL ; architecture XLX of Half_Add is .
end XLX ;
entity Cnt64 is
end Cnt64 ;
architecture BEH of Cnt64 is .
end BEH ; architecture RTL of Cnt64 is .
end RTL ; architecture XLX of Cnt64 is .
end XLX ;
Trang 22package body My_Pack is
function bv_to_integer (BV: bit_v return integer is
variable … begin for index in BV'range loop
.
.
end My_Pack ;
declarationdetails
Package Body
• Một package body là một dependent unit của một
package, nó chứa các thông tin chi tiết về các đối tượng trong package
– Subprograms, deferred constants
Trang 23– Work và std là hai thư viện dùng được cho mọi design unit
package std_logic_1164 is
package std_logic_arith is
package std_logic_unsigned is
library IEEE ;
Trang 24package std_logic_1164 is
package std_logic_arith is
package std_logic_unsigned is
library IEEE ;
Trang 25Khởi tạo các Library
• Tên của library đơn thuần là một tham trỏ về mặt logic
– Chuẩn VHDL không quy định các yêu cầu chặt chẽ về cấu trúc của library, do vậy chúng không dễ được chuyển giao giữa các tool
package Fast_Counters is package DSP_Filters is
Trang 26Khởi tạo các Library
• Thông thường, cần phải tạo các thư viện trong mỗi tool
cụ thể thay vì attach các thư viện đã có ở đâu đó
– Đặt tên cho library, và sau đó phân tách các design unit được chọn đưa vào nó
package Fast_Counters is package DSP_Filters is
Trang 27Work Library
• Đây là thư mục con (sub-directory) mặc định được dùng
để lưu giữ tất cả các đơn vị thiết kế đã được biên dịch (compiled design units), trừ khi có các chỉ định khác.
• Mỗi một công cụ mô phỏng hoặc tổng hợp đều sẽ tạo ra một cấu trúc như thế
– Chú ý: hiển thị ở library là nhãn tên của design unit chứ không phải là tên của source file
Trang 28Design Unit Identifier
entity HALF_ADD
entity DFF entity REG4 package My_Counters .
Trang 29entity DFF is
port (D, Clock : in std_logic ; Reset : in std_logic ;
Q : out std_logic) ; end entity DFF ;
architecture RTL of DFF is
begin process (Clock, Reset) begin
If (Reset = ‘1’ ) then
Q <= ‘0’ ; elsif (Clock’event and Clock = ‘1’) then
Q <= D ; end if ; end process ; end architecture RTL ;
Clock
Reset
Ví dụ về Hierarchy : DFF
Trang 30U2 : DFF port map (D_in(2), Clk, Rst, Q_out(2));
U1 : DFF port map (D_in(1), Clk, Rst, Q_out(1));
U0 : DFF port map (D_in(0), Clk, Rst, Q_out(0));
end Structural;
Clk Rst
U0 U1 U2
REG_4
Ví dụ về Hierarchy : REG-4
Trang 32• U1: DFF port map ( D =>D_in(1), Clock =>Clk, Reset =>Rst, Q =>Q_out(1)) ;
Trang 33architecture Structural of Top is
component Sub_A port (A1, A2, A3 : in std_logic ;
A4 : out std_logic_vector (3 downto 0)) ;
end component ;
component Sub_B port (B1: in std_logic_vector (3 downto 0 ) ;
Sig_1
Bus_1
A1 A2
A4
B3 B2
Trang 34Clk Rst
U2
U1
U0
Cụ thể hoá phần tử
Trang 35Sử dụng Generics
• Generics là các tham số có thể cập nhật động (thay đổi
giá trị) trong từng câu lệnh cụ thể hoá phần tử của thiết
generic (Count_Width : integer := 8 );
port ( Data_In: in std_logic_vector (Count_Width -1 downto 0);
Clk, Reset, Load, UpDn : in std_logic;
Q_Out: out std_logic_vector (Count_Width -1 downto 0));
end entity My_Cntr;
architecture RTL of My_Cntr is
• • • •
end architecture RTL;
Lab Marker
Trang 36Cập nhật giá trị của Generics
nhận giá trị mặc định ban đầu
library IEEE; use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned_all; use IEEE.std_logic_arith.all;
port ( Data_In: in std_logic_vector (Count_Width -1 downto 0);
Clk, Reset, Load, UpDn : in std_logic;
Q_Out: out std_logic_vector (Count_Width -1 downto 0));
end component ; begin
U0: My_Cntr generic map (Count_Width => 64)
port map (DATA_BUS, CLOCK, RST, LD, CNTRL, DATA_OUT ) ;
• • • •
end architecture RTL;
Trang 38.
architecture
Trang 39Trình tự Biên dịch
• Do mối quan hệ giữa các primary và secondary design unit cũng như khả năng có thể cụ thể hoá các module ở mức thấp hơn, nên quá trình biên dịch luôn tuân theo một trật tự nghgiêm ngặt
• Các entity phải được phân tích trước các architecture tương ứng với chúng
• Các package cần phải được phân tích trước các package body
• Mỗi một module cần phải được phân tích trước khi nó được tham trỏ bởi các module khác
– Đây là trình tự biên dịch Bottom-up
Trang 40- - Comments bắt đầu bằng hai dấu gạch ngang
- - Chúng chỉ tiếp tục cho đến hết dòng
- - Một comment trên nhiều dòng cần phải dùng
- - hai dấu gạch ngang trên tất cả các dòng
Comments
• Comments (chú thích) có tác dụng làm cho mã nguồn trở nên dễ hiểu hơn, điều này cũng tương tự như ở các ngôn ngữ khác
Trang 41Kết luận
• VHDL bao gồm các primary và secondary design unit
• Trật tự biên dịch chương trình VHDL được thực hiện theo một quy luật chặt chẽ
• Tất cả các design unit đã được kiểm chứng được lưu
trong một thư viện gọi là work library
• Có thể sử dụng Generics để tăng tính linh hoạt của mã nguồn (source code)
Trang 42Bài 3
Signals và Data Types
Trang 43– Mỗi đối tượng (signal, variable, constant, hoặc port) cần phải
có kiểu dữ liệu nhất định khi được khai báo (declared)
• VHDL là một ngôn ngữ định kiểu rất chặt chẽ
– Các tín hiệu liên kết với nhau cần phải có cùng kiểu
• Trong VHDL có nhiều kiểu dữ liệu cho phép mô tả phần cứng và kiểm tra lỗi nhằm đảm bảo sự tương thích tín hiệu trong các mô hình lớn và phức tạp
– Cần tuân thủ quy tắc kiểm tra kiểu trong các mô hình cả hành vi (behavioral) và mức cổng (gate-level)
Trang 44entity REG_4 is
port (D_in1 : in std_logic_vector (3 downto 0);
Cntrl : in std_logic_vector (1 downto 0);
Clock, Reset : in std_logic;
Q_out : out std_logic_vector (3 downto 0));
end entity REG_4;
signal A : integer ; signal B : bit ;
signal C : integer ; signal D : std_logic ;
Trang 45Các loại data type trong
• Defines pointers to objects
• covered in Advanced VHDL course
– File
• Sequence of objects of given type
• covered in Advanced VHDL course
Trang 46Scalar Data Types
• Kiểu dsữ liệu vô hướng nhận các giá trị đơn lẻ Trong VHDL, lớp các data type này gồm có:
Trang 47type bit is (‘0’, ‘1’) ;
type boolean is (false, true) ;
architecture BEHAVE of MUX is
signal A,B,Sel, Z : bit ;
begin
if Sel = ‘1’ then
Z <= A ; else
• Thích hợp cho việc mô hình hoá ở mức khái niệm lý
thuyết
Trang 48Integer và Real
• Chấp nhận các giá trị và các đại lượng một cách trực
quan và linh hoạt
– Cần phải quy định giải giá trị cho các kiểu nguyên (integer), nếu không nó sẽ sử dụng giải giá trị mặc định với số nguyên 32-bit
• Cho phép người thiết kế sử dụng các giá trị floating point
– Khai báo các kiểu real với giải giá trị thực nhất định
– Cách dùng giá trị kiểu ‘Real’ không giống như ‘Integer’
type integer is range
type real is range
signal A : integer range 0 to 7;
signal B : integer range 15 downto 0 ;
type CAPACITY is range -25.0 to 25.0 ; signal Sig_1 : CAPACITY := 3.0 ;
Trang 49Time là kiểu vật lý duy nhất được định nghĩa trong VHDL Nó rất cần thiết cho việc mô phỏng thời gian trễ và các tham
số khác có liên quan thời gian.
type time is range 1 to 1000000
• Kiểu vật lý được định nghĩa theo đơn vị cơ sở của nó
– Bất kỳ đơn vị dẫn xuất nào cũng là bội của đơn vị cơ sở
Trang 50type std_ulogic is ( ‘U’, Uninitialized
– Hỗ trợ các mức giá trị khác nhau của tín hiệu: don't-care conditions, unknown, three-state …
– Được định nghĩa trong gói IEEE std_logic_1164
Trang 51
signal A,B,C,Res_Out : std_logic ;
signal Out_1 : std_ulogic ;
Out_1 <= A ; Out_1 <= B ; Out_1 <= C ; C
Res_Out <= A; Res_Out <= B; Res_Out <= C; Res_Out
So sánh Std_logic và
Std_ulogic
• Cả hai kiểu đều chứa cùng một tập các giá trị như nhau
– Sự khác nhau ở chỗ thực hiện mạch (implementation)
– Chữ u trong ulogic có nghĩa là unresolved
• Nếu người thiết kế sử dụng hai hay nhiều tín hiệu điều khiển một cửa ra chung thì anh ta phải dùng một hàm resolution
(có trong gói ieee_std_1164) để quyết định trên thực tế tín
hiệu nào được đưa tới cửa ra
• Std_ulogic không có khả năng đó, nhưng nó tạo ra một công
cụ nội tại để kiểm tra các lỗi wired-oring do sơ suất
X
Trang 52Res_Out <= A when En0 = ‘1’ else ‘Z’ ;
Res_Out <= B when En1 = ‘1’ else ‘Z’ ;
Res_Out <= C when En2 = ‘1’ else ‘Z’ ;
Res_Out
En0
En2 En1
Trang 53type My_State is ( RST, LOAD, FETCH, STOR, SHIFT ) ;
.
signal STATE, NEXT_STATE : My_State ;
Enumerated (liệt kê)
• Tăng mức độ linh hoạt trong việc mô hình hoá phần cứng
– Các kiểu liệt kê do người dùng định nghĩa sử dụng các giá trị
có thể nhận biết một cách dễ dàng và thích hợp với hoạt động của mô hình
– Làm cho các chương trình dễ hiểu hơn nhất là khi mô tả các máy trạng thái (hệ logic dãy) hoặc các hệ thống phức tạp
case (STATE) is when LOAD =>
if COND_A and COND_B then
NEXT_STATE <= FETCH ;
else NEXT_STATE <= STOR ;
Trang 54Composite Data Types
• Các data type hỗn hợp là sự kết hợp các phần tử dưới
dạng một array hoặc một record
– Bit_vector, Std_logic_vector và String là các kiểu hỗn hợp đã được định nghĩa trong VHDL
• Câu lệnh này tạo nên một kiểu bit_vector (array) từ một nhóm 4 bit
– Trong VHDL không định nghĩa đâu là LSB hoặc MSB; do vậy, khi biên dịch giá trị này không được tự động hiểu là ‘3’
Chú ý: dùng dấu trích kép (“0011”) cho các đối tượng có
kiểu bit_vector, std_logic_vector hoặc string, và dùng dấu trích đơn (‘1’) cho các đối tượng có kiểu bit, std_logic và character
signal A_word : bit_vector (3 downto 0) := “0011” ;
Trang 55Nếu B_bus có kiểu WORD, giá trị có thể
có của các phần tử là?
Còn nếu B_bus có kiểu DATA?
signal B_bus : WORD ;
type DATA is array (3 downto 0) of integer range 0 to 9 ;
signal B_bus : DATA ;
Trang 56signal My_BusA, My_BusB: bit_vector (3 downto 0) ; signal My_BusC : bit_vector (0 to 3) ;
My_BusA My_BusB
• Khi gán giá trị một array cho một array khác, thì:
– 1 Các array cần phải có cùng kiểu giá trị
– 2 Các array phải có cùng độ dài
– 3 Phép gán được thực hiện theo vị trí, từ trái sang phải
Trang 57signal Data_Word : std_logic_vector (11 downto 0) ;
Cách viết lệnh gán Array
• Để đơn giản các phép gán array – và làm cho chương trình dễ đọc hơn - người thiết kế có thể sử dụng các giá trị ở cơ số 16 (hexadecimal) hoặc 8 (octal)
– Có thể sử dụng dấu gạch dưới các giá trị biến cho dễ đọc
Data_Word <= X”A6F”;
Data_Word <= ”101001101111” ;
Data_Word <= O”5157”;
Data_Word <= B”1010_0110_1111” ;
Trang 58Record là nhóm các phần tử đơn có kiểu ban đầu có thể khác nhau.
type OPCODE is record
PARITY : bit;
ADDRESS : std_logic_vector ( 0 to 3 );
DATA_BYTE : std_logic_vector ( 7 downto 0 );
NUM_VALUE : integer range 0 to 6;
STOP_BITS : bit_vector (1 downto 0);
end record ;
.
signal TX_PACKET, RX_PACKET : OPCODE;
.
T X _ P A C K E T
Records