Vhdl
Chia sẻ bởi Lương Hòai Thương |
Ngày 10/05/2019 |
48
Chia sẻ tài liệu: vhdl thuộc Hóa học 10
Nội dung tài liệu:
Bài 1
Vấn đề Mô hình hoá phần cứng
(Hardware Modeling)
VHDL 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
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 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
Chuẩ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ác bộ phận của VHDL 200X
được hỗ trợ bởi một số tool
IEEE 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
Behavioral
Logic
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
Sự chồng chéo trong VHDL
Behavioral
Logic
RTL
Layout
Place & Route Utility
FPGA Vendor Library
Synthesizable Code
Hardware Model
Sum <= A + B after 3 ns ;
Sum <= A + B ;
component Xlx_add2
port ( A: in bit ;
B: in bit ;
Sum: out bit
);
end component ;
Trình tự thiết kế Top-Down
VHDL hỗ trợ hướng tiếp cận top-down trong thiết kế
Nguyê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
A[3:0]
entity
Add_4
B[3:0]
C_in
SUM [3:0]
C_out
C_out
Sum
A
B
C_in
entity
Full_Add
A
B
entity
Half_Add
Sum
Carry
Leaf Cell
Cấu trúc Top - Down
Macro
VHDL
modules
Synthesis
Place & Route
Behavioral Simulation
(Testbench driven)
Gate-Level Functional
(Netlist-driven )
Gate-Level Timing
(Back-annotated netlist )
V I T A L
VHDL Initiative Toward
ASIC Libraries
SDF (Standard Delay Format)
& Structural VHDL File
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
Các bước kiểm tra thiết kế
(1) Mô phỏng Behavioral
Thực hiện mã nguồn mô tả hành vi, dùng testbench
(2) Mô phỏng RTL
Thực hiện file mã nguồn RTL,
dùng testbench
(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
Test-Bench
Behavioral Module
MCU
FPGA
PLD
Memory
Kiểm tra thiết kế?
Chip level
Board level
Std parts model
Model bus operation
Discrete event-driven
Flexibility over strictly
netlist-driven
Kế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)
Bài 2
Ngôn ngữ VHDL
Chươ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 VHDL
Entity
Architecture
Configuration
Package
Package Body
Library
Các loại Design Unit
Trong VHDL có hai loại design unit, đó là:
Primary
Không phụ thuộc vào các design unit khác
Secondary
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
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 đó
entity Half_Add is
port (A, B : in std_logic ;
Carry, Sum : out std_logic) ;
end Half_Add ;
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 ; ’
architecture My_Arch of Half_Add is
begin
Sum <= A xor B ;
Carry <= A and B ;
end My_Arch ;
Note: VHDL’93 cho phép sử dụng reserved word architecture sau reserved word end
Architecture
Architecture mô tả hoạt động bên trong của thực thể (entity) gắn với nó (primary unit)
Một architecture thể hiện một chức năng của thực thể gắn với nó, có thể có nhiều architecture cho một thực thể
Multiple Architecture
Có thể có nhiều architecture cùng tồn tại để mô tả hoạt động của một thực thể
Chúng có thể biểu diễn các giai đoạn khác nhau của quá trình thiết kế hoặc các cách tiếp cận khác nhau cho cùng một chức năng (optimization for speed verus area, etc.)
package My_Pack is
constant. . .
. . .
function. . .
. . .
component . . .
. . .
subtype. . .
end package My_pack ;
library IEEE;
use IEEE.std_logic_1164.all ;
. . .
use work.My_Pack.all ;
entity . . .
Package
Một package declaration được dùng để khai báo các dữ liệu dùng cho toàn bộ thiết kế, bao gồm:
Constants, data types, subtypes, subprogram và function declarations, v.v…
package My_Pack is
constant. . .
. . .
function bv_to_integer (
. . .
component . . .
. . .
subtype. . .
end My_Pack ;
package 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 ;
declaration
details
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
Library
Về cơ bản, tất cả các đối tượng VHDL đều được lưu trong các thư viện
Theo định nghĩa, thư viện là một tập hợp các đơn vị thiết kế (design unit) đã được kiểm chứng
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 ;
Library
Libraries và Packages comprise the VHDL Design Management structure
Theo một nghĩa nào đó, nó tương tự như directories và subdirectories
package std_logic_1164 is..
package std_logic_arith is..
package std_logic_unsigned is..
library IEEE ;
Khở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..
library My_Lib ;
use My_Lib.Fast_Counters.all ;
entity Mod1 is
port ( . . .
library My_Lib
Khở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..
library My_Lib ;
use My_Lib.Fast_Counters.all ;
entity Mod1 is
port ( . . .
library My_Lib
Work 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
Design Unit Identifier
entity HALF_ADD
entity DFF
entity REG4
package My_Counters. . .
architecture RTL
architecture STRUCTURAL
Work Library
Một ví dụ về nội dung của
work library
Secondary (dependent) design units tham trỏ tới primary unit tương ứng với nó
entity 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
D
Q
Ví dụ về Hierarchy : DFF
entity REG_4 is
port (D_in : in std_logic_vector (3 downto 0);
Clk, Rst : in std_logic;
Q_out : out std_logic_vector (3 downto 0));
end REG_4;
architecture Structural of REG_4 is
component DFF
port ( D, Clock : in std_logic ;
Reset : in std_logic;
Q : out std_logic ) ;
end component ;
begin
U3 : DFF port map (D_in(3), Clk, Rst, Q_out(3));
U2 : 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
D_in(3)
D_in(2)
D_in(1)
D_in(0)
Q_out(3)
Q_out(2)
Q_out(1)
Q_out(0)
DFF
DFF
DFF
DFF
U3
U0
U1
U2
REG_4
Ví dụ về Hierarchy : REG-4
Liên kết Tín hiệu
Có hai phương pháp liên kết các tín hiệu với các cổng tương ứng của chúng
Liên kết theo vị trí: Các tín hiệu ở mức cao được liệt kê theo đúng trật tự của các cổng (port) ở mức thấp trong component declaration
U1: DFF port map (D_in, Clk, Rst, Q_out) ;
component DFF
port (D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic ) ;
end component ;
Liên kết Tín hiệu
Có hai phương pháp liên kết các tín hiệu với các cổng tương ứng của chúng
Liên kết theo tên: Các cổng (ports) và tín hiệu (signals) được liệt kê một cách rõ ràng, đầy đủ, không phụ thuộc trật tự (strongly recommended)
U1: DFF port map ( D =>D_in(1), Clock =>Clk, Reset =>Rst, Q =>Q_out(1)) ;
component DFF
port (D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic ) ;
end component ;
architecture 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 ) ;
B2, B3, B4 : out std_logic) ;
end component ;
signal Bus_1 : std_logic_vector (3 downto 0) ;
signal Sig_1: std_logic ;
begin
U0 : Sub_A port map (I1, I2, Sig_1, Bus_1) ;
U1 : Sub_B port map (Bus_1, Sig_1, O1, O2) ;
end Structural ;
Sub_A
Sub_B
Top
I1
I2
O1
O2
Sig_1
Bus_1
A1
A2
A4
A3
B4
B3
B2
B1
entity Top is
port (I1, I2 : in std_logic;
01, 02 : out std_logic) ;
end Top ;
Signal Declaration
Tất cả các tín hiệu bên trong thực thể cần phải được khai báo rõ ràng
entity REG_4 is
port (D_in : in std_logic_vector (3 downto 0) ;
Clk, Rst : in std_logic ;
Q_out : out std_logic_vector (3 downto 0)) ;
end REG_4 ;
architecture Xilinx_Struct of REG_4 is
component FDC
port (D : in std_logic ;
Clock, Reset : in std_logic ;
Q : out std_logic) ;
end component ;
begin
U3 : FDC port map (D=>D_in(3), Clock=>Clk, Reset=>Rst, Q=> Q_out(3)) ;
U2 : FDC port map (D=>D_in(2), Clock=>Clk, Reset=>Rst, Q=> Q_out(2)) ;
U1 : FDC port map (D=>D_in(1), Clock=>Clk, Reset=>Rst, Q=> Q_out(1)) ;
U0 : FDC port map (D=>D_in(0), Clock=>Clk, Reset=>Rst, Q=> Q_out(0)) ;
end Xilinx_Struct ;
Component instantiation from target library may be helpful for chip level optimization ( i.e., Xilinx Virtex )
Clk
Rst
D_in(3)
D_in(2)
D_in(1)
D_in(0)
Q_out(3)
Q_out(2)
Q_out(1)
Q_out(0)
FDC
FDC
FDC
FDC
U3
U2
U1
U0
Cụ thể hoá phần tử
Sử 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 kế (component instantiation)
Điều này cho phép khai báo các tham số một cách linh hoạt, mềm dẻo
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned_all;
use IEEE.std_logic_arith.all;
entity My_Cntr is
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;
Cập nhật giá trị của Generics
Sử dụng một generic map
cùng với port map, khi có một phần tử được cụ thể hoá đâu đó trong thiết kế
Nếu không có generic
map, generic 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;
entity MY_TOP_DESIGN is
port ( DATA_BUS: in std_logic_vector (63 downto 0);
CLOCK, RST, LD, CNTRL : in std_logic;
DATA_Out: out std_logic_vector (63 downto 0)) ;
end entity MY_TOP_DESIGN;
architecture STRUCTURAL of MY_TOP_DESIGN is
component My_Cntr
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 component ;
begin
U0: My_Cntr generic map (Count_Width => 64)
port map (DATA_BUS, CLOCK, RST, LD, CNTRL, DATA_OUT ) ; • • • •
end architecture RTL;
Biên dịch VHDL
Có thể có bốn giai đoạn biên dịch ứng với bốn mức xử lý cho một mô hình phần cứng VHDL
Analysis (phân tích)
Design unit được kiểm tra lỗi cú pháp. Sau khi hoàn tất, nó sẽ được lưu giữ ở work directory
Elaboration (chỉnh sửa)
Cấu trúc hierarchy của thiết kế được dàn trải bắt đầu từ mức cao nhất. Ứng với mỗi sub-module cụ thể chỉ có một copy duy nhất được tạo ra
Synthesis (tổng hợp)
Dạng mô tả netlist của thiết kế được tạo ra hoặc theo format chuẩn công nghiệp hoặc theo một vendor-specific format
Execution (chỉ mô phỏng)
Mô hình được mô phỏng theo các bước thời gian gián đoạn. Nó được điều khiển bởi các sự kiện ở các tín hiệu đồng bộ quá trình
Analyze
Elaborate
Execute
Synthesize
Quy trình biên dịch
entity DFF is
port (D, Clk : in
Reset: in
Q: out
. . .
architecture..
Trì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
- - 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
A_OUT <= ‘1’ ; - - Comments có thể viết từ đây
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
Kế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)
Bài 3
Signals và
Data Types
Data Types
Data types là một yếu tố quan trọng trong VHDL (cũng như trong các ngôn ngữ khác)
Mỗi một kiểu dữ liệu chỉ cho phép nhận các giá trị trong một giải nhất định
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)
entity 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 ;
A <= C;
A <= C + 1;
A <= B;
D <= C;
B <= D;
Q_out <= Cntrl;
Signals và Ports
Kiểu dữ liệu và độ rộng bus cần phải phù hợp trong các lệnh gán tín hiệu (signal) và cổng vào ra (port)
Các loại data type trong VHDL
Có 4 categories (loại) data types trong VHDL
Scalar
Single value object, defined indices, ordered
Composite
Group objects, similar or different types
Access
Defines pointers to objects
covered in Advanced VHDL course
File
Sequence of objects of given type
covered in Advanced VHDL course
Scalar 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ó:
Bit
Boolean
Integer
Real
Physical
Character
Std_logic and std_ulogic
Enumerated
type 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
Z <= B ;
end if . . .
if Sel =‘1’, if F >= G..
both yield boolean result
Bit và Boolean
Vừa đủ để mô hình hoá phần cứng, nhưng nó không cho phép mô tả các giá trị high-impedance, unknown, don’t care, v.v...
Thích hợp cho việc mô hình hoá ở mức khái niệm lý thuyết
Integer 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 ;
Time 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
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us; . . .
constant Tpd : time := 3ns ;
. . .
Z <= A after Tpd ;
Physical
Kiểu vật lý (Physical type) được dùng để định lượng các đại lượng vật lý như là khối lượng, độ dài, thời gian
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ở
type std_ulogic is ( ‘U’, -- Uninitialized
‘X’, -- Forcing Unknown
‘0’, -- Forcing Zero ‘1’, -- Forcing One
‘Z’, -- High Impedance
‘W’, -- Weak Unknown
‘L’, -- Weak Zero ‘H’, -- Weak One
‘ - ‘ -- Don’t Care
) ;
Recall: type bit is limited to (‘0’, ‘1’).
Std_logic và Std_ulogic
Std_logic được phát triển từ hệ thống MVL (Multi-Value Logic) và được dùng để mô hình hoá phần cứng một cách chi tiết hơn so với kiểu bit
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
signal A,B,C,Res_Out : std_logic ;
signal Out_1 : std_ulogic ;
Out_1 <= A ;
Out_1 <= B ; Out_1 <= C ;
C
B
A
Out_1
C
B
A
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
signal A,B,C,Res_Out : std_logic ;
C
B
A
Res_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
Signal Resolution
Một cửa ra cụ thể không thể có nhiều tín hiệu điều khiển kiểu wire-or
Để mô hình một cửa ra ba trạng thái, ta sử dụng một lệnh gán tín hiệu có điều kiện và data-type là std_logic:
type 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 ;
Composite 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” ;
Array
Array là nhóm các phần tử đơn có cùng kiểu (type) ban đầu
type WORD is array (3 downto 0) of std_logic ;
index position
0
1
2
3
B_bus
Nế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 ;
signal My_BusA, My_BusB: bit_vector (3 downto 0) ;
signal My_BusC : bit_vector (0 to 3) ;
3
0
1
2
3
0
1
2
My_BusA
My_BusB
My_BusB <= My_BusA ;
My_BusA
3
0
1
2
0
3
2
1
My_BusC
Inadvertent bit-swap?
My_BusC <= My_BusA ;
Phép gán các Array
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
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” ;
Record 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;
PARITY
ADDRESS
DATA_BYTE
NUM_VALUE
STOP_BITS
. . .
T X _ P A C K E T
Records
String là array của các character
signal Warning1: string (1 to 30) := “ Unexpected Outputs Detected” ;
--declared within the architecture
variable Warning2: string (1 to 30) := “ Unstable, Aborting Now” ;
--declared within the process
constant Warning3: string (1 to 20) := “ Entering FSM State2” ;
--declared within the package or architecture
String
signal H_BYTE, L_BYTE: std_logic_vector ( 0 to 7);
signal Q_Out : std_logic_vector (31 downto 0);
signal A, B, C, D : std_logic;
signal WORD : std_logic_vector (3 downto 0);
(A,B,C,D)<=WORD;
WORD <= ( A, B, C, D ) ;
Q_Out <= ( others => ‘0’ ) ;
WORD <= ( 2 => ‘1’, 3 => D, others => ‘0’ ) ;
The total number of elements on both sides of any assignment must match, “others” can be used as a default assignment, regardless of the array size
Phép gộp các Array
Phép gộp (Aggregate) là một công cụ tiện lợi để nhóm các kiểu dữ liệu (data type) cả vô hướng và phức hợp trong các phép gán
Only scalar data variables are allowed on the left-side aggregates.
H_Byte <= ( 7|6|0 => ‘1’, 2 to 5 => ‘0’ ) ;
type D_WORD is record
UPPER : std_logic_vector (7 downto 0 ) ;
LOWER : std_logic_vector (7 downto 0 ) ;
end record ;
signal DATA_WORD : D_WORD ;
signal H_BYTE, L_BYTE: std_logic_vector (7 downto 0);
signal TX_PACKET, RX_PACKET : OPCODE; --defined earlier
TX_PACKET <= ( ‘1’,”0011”,”11101010”,5,”10” ) ;
TX_PACKET. ADDRESS <= ( “0011” ) ;
Gộp các Record
Phép gộp (Aggregate) là một công cụ tiện lợi để nhóm các kiểu dữ liệu (data type) cả vô hướng và phức hợp trong các phép gán
Only records can accept aggregate of arrays
TX_PACKET. ADDRESS(2) <= ‘0’ ;
DATA_WORD <= ( H_BYTE, L_BYTE) ;
DATA_WORD <= ( LOWER => L_BYTE, UPPER=> H_BYTE) ;
DATA_WORD <= ( LOWER | UPPER=> H_BYTE);
DATA_WORD <= ( others => H_BYTE);
Tạo lập các Array 2-D
Khi cần mô hình hoá các cấu trúc bộ nhớ, người thiết kế phải tạo ra một cấu trúc array 2 chiều (2-D structure)
Đây thực sự là một array của các array (hoặc các record)
type Mem_Array is array ( 0 to 3 ) of std_logic_vector ( 7 downto 0);
signal My_Mem : Mem_Array ;
0
1
2
3
Tạo Array của các Record
Array của các record thường được dùng trong các ứng dụng xử lý gói tin (packet handling)
type Data_Array is array ( 0 to 2 ) of OPCODE ;
signal My_Data : Data_Array ;
My_Data
Phép gán các Array 2-D
Với hầu hết các ứng dụng của memory, vector địa chỉ Read/Write được chuyển thành dạng integer, để tham trỏ tới một phần tử trong array 2-D
- Hàm biến đổi conv_integer có trong gói ieee.std_logic_unsigned
My_Mem (conv_integer( W_Addr)) <= Data_In ;
. . .
D_Out <= My_Mem (conv_integer (R_Addr));
Initializing a ROM Array
Với các ứng dụng ROM, phép kết tập (aggregate) là một công cụ tiện ích để kích hoạt mạng array 2-D
constant My_ROM : ROM_Array := (
0 => (others => ‘1’) ,
1 => “10100010”,
2 => “00001111”,
3 => “11110000” ) ;
Các kiểu con (Subtypes) thường được dùng để phát hiện lỗi ‘out-of-range’ trong kết quả mô phỏng, và cũng có thể có tác dụng tối ưu hoá quá trình tổng hợp logic
Kiểu con trong VHDL
Một kiểu con (subtype) trong VHDL là một tập hợp có hạn chế của một kiểu (type) đã có
Kiểu đã có cũng có thể là một kiểu đã được định nghĩa trong IEEE1076 hoặc cũng có thể do người dùng tạo ra
Sử dụng kiểu con trong VHDL
Bài 4
Operators và
Expressions
Các toán tử trong VHDL
VHDL chứa một lượng lớn các toán tử (operator) dùng cho việc mô hình hoá phần cứng
Tuy nhiên, mỗi toán tử được sử dụng với (những) kiểu dữ liệu (data type) nhất đ ịnh
Đặc biệt, cần lưu ý các toán tử số học (arithmetic) không dùng được với các kiểu dữ liệu phức hợp (bit_vector and std_logic_vector), vì các array không có giá trị bằng số tường minh
Các Function (subprogram) được tạo ra để khắc phục những vấn đề liên quan
Các hàm này có trong các gói được gọi là “arithmetic packages”
Operator Overloading
Operator overloading (chồng hàm) trong VHDL có nghĩa là một toán tử cụ thể (ví dụ, ‘+’ ) có thể được dùng với các data type khác nhau
Điều này xảy ra do các subprogram riêng biệt được viết cho từng data type nhất định
Compiler tự động chọn sub-function thích hợp dựa trên data type của các operands
signal A, B : std_logic_vector ( 3 downto 0 ) ;
signal C, D : integer range 0 to 31 ;
signal Q_Out : std_logic_vector ( 15 downto 0 );
Y <= A + B ; -- add 2 vectors
F <= C + D ; -- add 2 integers
Q_Out <= Q_Out + 1; -- add vector and integer
and
or
nand
nor
xor
not
xnor (VHDL-93)
Y <= G or ( F and H ) ;
Z <= A and B ;
Z
B
A
F
H
G
Y
Các toán tử Logic
Các logical operator được định nghĩa với các toán hạng có kiểu (data type) bit, boolean, bit_vector và std_logic_vector
Quy tắc sử dụng với biến kiểu Array
1. Các array phải có cùng kiểu (type)
2. Các array phải có cùng kích thước
3. Phép toán thực hiện với các phần tử cùng vị trí trong mỗi array, từ trái sang phải
signal A_vec, B_vec, C_vec : bit_vector ( 7 downto 0 ) ;
B_vec (7)
A_vec (7)
C_vec (7)
B_vec (6)
A_vec (6)
C_vec (6)
B_vec (5)
A_vec (5)
C_vec (5)
B_vec (0)
A_vec (0)
C_vec (0)
.
.
.
C_vec <= A_vec and B_vec ;
Các toán tử Logic với biến kiểu Array
= Equality
/= Inequality
< Less than
<= Less than or equal
> Greater than
>= Greater than or equal
signal FLAG_BIT : boolean ;
signal A, B : integer ;
FLAG_BIT <= ( A > B ) ;
Nếu A lớn hơn B, FLAG_BIT sẽ được gán giá trị true, ngược lại FLAG_BIT được gán giá trị false
Các toán tử quan hệ
Các toán tử quan hệ có thể dùng với hầu hết các data type
Tất cả các toán tử quan hệ đều cho kết quả kiểu (type) Boolean
Rules for use on Arrays
1. Arrays must be same type
2. Arrays may be different lengths
3. Arrays of different lengths are aligned left and then lexically compared -- Compares ASCII values
signal A_vec : bit_vector ( 7 downto 0 ) := “11000110” ;
signal B_vec : bit_vector ( 5 downto 0 ) := “111001” ;
if ( A_vec > B_vec ) then
State <= Normal
else
State <= Code_Red
end if …
Toán tử quan hệ với các Array
Ví dụ này cho kết quả là false
Các vector được so sánh từ trái sang phải. Việc so sánh được thực hiện lần lượt theo từng phần tử
Quy tắc: để đảm bảo phép so sánh số được hợp lý các array cần phải có cùng kích thước
+ Addition
- Subtraction
* Multiplication
/ Division
abs Absolute Value
** Exponentiation
signal A_num, B_num : integer range 0 to 15 ;
signal Z_num : integer range 0 to 31 ;
Z_num <= ( A_num + B_num ) ;
+
Z_num
A_num
B_num
Infers a 5-bit adder
Các toán tử số học
Các toán tử số học dùng với các kiểu dữ liệu (data type) integer, real, và physical
Các toán tử số học vốn không dùng với các dữ liệu có kiểu array
Phép tính số học với các biến Array
Để thực hiện các phép tính số học cần có các function định nghĩa sẵn trong IEEE hoặc từ các hãng cung cấp phần mềm thiết kế
Các function như vậy thường được đặt trong các gói gọi là “arithmetic packages”. Một số công cụ (tool) dịch sẵn các gói này và đặt ở thư viện của chúng
Các gói std_logic_unsigned và std_logic_arith được xác lập trong thư viện IEEE để phát huy khả năng trao đổi mã nguồn giữa các công cụ khác nhau
Toán tử “+” là overloaded
package STD_LOGIC_UNSIGNED is
function “+” (A,B: std_logic_vector) return std_logic_vector ;
function “+” (A: std_logic_vector, B: integer ) return std_logic_vector ;
function “+” (A,B: std_logic_vector) return integer ;
. . . .
library IEEE ;
use IEEE.std_logic_1164.all ;
use IEEE.Std_Logic_Unsigned.all ;
use IEEE.Std_Logic_Arith.all;
signal A_vec : std_logic_vector ( 7 downto 0 ) := “11001001” ;
signal B_vec : std_logic_vector ( 7 downto 0 ) := “11100100 ” ;
signal Z_vec : std_logic_vector ( 8 downto 0 ) ;
signal D_int : integer range ( 0 to 9 ) ;
Z_vec < = A_vec + D_int ;
Z_vec < = A_vec + B_vec ;
Array Arithmetic
Nếu có các function thích hợp có thể dùng được trong module thiết kế (thông qua mệnh đề “use”), thì compiler sẽ tự động truyền tham số cho trả lại kết quả tính từ subprogram đó
Nếu không, compiler sẽ thông báo lại rằng các operator đó là “undefined”
Các toán tử Shift (dịch)
Các toán tử Shift được định nghĩa trong VHDL-93 và rất hay được sử dụng, nhất là khi cần mô tả hoạt động của các phần tử trong cấu trúc máy tính
Mỗi toán tử có hai toán hạng, toán hạng trái có kiểu array one-dimension (1-D) và toán hạng phải có kiểu nguyên (integer) chỉ số bước cần dịch (hoặc quay). Số âm cũng được dùng để chỉ chiều dịch (hoặc quay) ngược lại
Kết quả của các phép dịch (hoặc quay) có cùng kiểu và kích thước với toán hạng trái
Các toán tử Shift (dịch)
sll - Logical left shift
srl - Logical right shift
sla - Arithmetic left shift
sra - Arithmetic right shift
rol - rotate left logical
ror - rotate right logical
Shift Operator - Các ví dụ
Ví dụ:
signal A_vec : bit_vector (7 downto 0) := “11000110”;
signal D_vec : bit_vector (7 downto 0);
D_vec <= A_vec sll 2;
D_vec <= A_vec sra 2;
D_vec <= A_vec ror 3;
D_vec <= A_vec srl 2;
D_vec <= A_vec sra -2;
“00011000”
“11110001”
“11011000”
“00110001”
“00011000”
cho kq
signal A_vec, B_vec : std_logic_vector ( 7 downto 0 ) ;
signal Z_vec : std_logic_vector ( 15 downto 0 ) ;
signal A_bit, B_bit, C_bit, D_bit : std_logic ;
signal X_vec : std_logic_vector ( 2 downto 0 ) ;
signal Y_vec : std_logic_vector ( 8 downto 0 ) ;
Z_vec <= A_vec & B_vec ;
X_vec <= A_bit & B_bit & C_bit ;
Y_vec <= B_vec & D_bit ;
Concatenation
Toán tử nối (concatenation) “&” cho phép kết nối các biến kiểu scalar và kiểu array thành kiểu array lớn hơn
Các phép gán được thực hiện với sự tương hợp vị trí (positional association)
Z <= A + B + C + D ;
Z <= ( A + B ) + ( C + D ) ;
B
A
C
D
Z
3 logic levels
D
Z
A
B
C
2 logic levels
This is especially important when the target technology is LUT (Look-Up Table) based. Each added level of logic incurs additional block and routing delays
+
+
+
+
+
+
Nhóm các toán tử
Có thể sử dụng dấu ngoặc đơn để nhóm các toán tử trong một biểu thức đã cho làm cho nó dễ đọc hơn
signal A_vec, B_vec : std_logic_vector (7 downto 0) ;
signal Z_vec : std_logic_vector (15 downto 0) ;
signal A_bit, B_bit, C_bit, D_bit : std_logic ;
Z_vec (15 downto 8) <= A_vec ;
B_vec <= Z_vec (12 downto 5) ;
A_vec (1 downto 0) <= C_bit & D_bit ;
. . .
Z_vec (5 downto 1) <= B_vec (1 to 5 ) ;
The direction (ascending or descending) of the slice must be consistent with the direction of the array as it was originally declared
Các Slice của Array
Một nhóm các phần tử kề cận nhau trong một array được goại là một slice và có thể được tham trỏ đồng thời
Các phần tử khác của array không bị ảnh hưởng bởi phép gán slice
signal Status_Bus : std_logic_vector (15 downto 0) ;
Slice và Concatenation
Ví dụ, để mô hình hoá một biểu thức có điều kiện với các phần tử được chọn không liền nhau (9,8,3,2,1, và 0) từ ‘Status’ bus gồm 16-bit
Giải mã toàn bộ bus có thể làm tăng số lượng mạch logic tổ hợp và làm cho thiết bị làm việc chậm hơn)
signal Int_Bus : std_logic_vector ( 5 downto 0 ) ;
. . .
Int_Bus <= Status_Bus ( 9 downto 8 ) & Status_Bus ( 3 downto 0 ) ;
Inefficient !!
Bài 5
Các câu lệnh Concurrent và Sequential
Mô hình hoá phần cứng
Để mô hình hoá một thực thể phần cứng một cách có hiệu quả, VHDL sử dụng cả các câu lệnh concurrent (đồng thời) lẫn sequential (tuần tự)
Các câu lệnh được gọi là concurrent khi chúng được thực hiện không tuỳ thuộc vào vị trí của chúng trong chương trình
Các câu lệnh được gọi là sequential khi chúng được thực hiện một cách tuần tự theo trình tự viết chúng trong chương trình, giống như các lệnh trong các phần mềm thông thường
Tất cả các câu lệnh viết trong một process là những lệnh sequential
architecture RTL of ENTITY_1 is
. . .
begin
concurrent statements ;
. . .
process
begin
sequential statements ;
. . .
end process ;
. . .
concurrent statements ;
. . .
process
begin
sequential statements ;
. . .
end process ;
...
end architecture RTL ;
Mọi câu lệnh nằm ngoài một process đều là lệnh concurrent
Cấu trúc ngôn ngữ
architecture RTL of My_And2 is
begin
. . .
process (A, B)
begin
C <= A and B ;
end process ;
. . .
end architecture RTL;
Process
Một process bao gồm các câu lệnh sequential
Các câu lệnh trong một process được thực hiện lần lượt
Mỗi process đều phải được hoạt kích theo một cách nhất định
Thường là do sự thay đổi của các tín hiệu trong process, hoặc các điều kiện cụ thể trong một câu lệnh ‘wait’
G1
G2
G3
B
A
C
C<=A and B
...
Process 1
process (C,..)
begin
Process 3
If C = ‘1’
then
...
Process 2
C
C
Các Process là đồng thời
Trong việc mô hình hoá phần cứng, quan điểm về concurrency (tính đồng thời) là rất cần thiết
Bất kỳ sự thay đổi nào ở tín hiệu ‘C’ - cửa ra của cổng G1, cũng đều được đồng thời đưa tới cửa vào của các cổng G2 và G3
C<=A and B
...
Process n
process (C,..)
begin
Process n2
If C = ‘1’
then
...
Process n1
C
C
Mô hình kết nối trong VHDL
Chỉ có các tín hiệu (signal) là có thể chuyển giá trị từ một process sang một process khác
Các process concurrent, được liên kết bởi các tín hiệu, thường được gọi là VHDL Connectivity Model (mô hình kết nối)
process n
process (...
Rst
Sig1
Sig2
Process n4
Process n3
architecture Behave of DFF is
begin
. . .
Reg1: process (Clock, Reset)
begin
if Reset = ‘1’ then
Q <= ‘0’ ;
elsif ( Clock’event and Clock = ‘1’ ) then
Q <= D ;
end if ;
end process;
. . .
end Behave ;
Optional Label
Các thành phần của Process
Signals in sensitivity
list create implied
“wait” condition
Signal updated with
new value when
process suspends
All statements within
the process are handled
sequentially, in order
Keyword
Keywords “end”
and “process”
architecture ...
process ( )
begin
Out1 <= A;
Out1 <= B;
. . .
end process ;
end architecture ;
architecture . . .
begin
Out1 <= A;
Out1 <= B;
. . .
end architecture ;
B
B
Chỉ có phép gán cuối cùng là có hiệu lực
Out1
?
Out1
A
Cần phải có một hàm resolution cho tín hiệu ra ‘Out1’
Bên trong và bên ngoài Process
wait on... An event on given signal
wait until... A specific condition
wait for ... A specified time amount
wait Indefinite suspension
wait on A, B ;
wait until CLK = ‘1’ ;
wait for 10 ns ;
Tạm dừng các Process
Mỗi process cần phải có một cơ chế để kích hoạt, điều đó cũng có nghĩa là có cơ chế để tạm dừng (suspending) process
Điều này tạo nên trạng thái đợi (wait) cho process
Với đoạn mã RTL, các tín hiệu trong sensitivity list tạo nên một điều kiện wait mặc địnhcho process
Đối với các mô hình hành vi, người thiết kế thưòng dùng các câu lệnh wait. Trong VHDL có bốn dạng lệnh wait
wait;
Các điều kiện Wait
Ví dụ dưới đây so sánh các điều kiện ‘wait’ từ các câu lệnh được viết rõ ràng (explicit) và điều kiện ‘wait’ ẩn ý (implicit)
Note: Một số compiler dùng tổng hợp mạch không hỗ trợ điều kiện explicit ‘wait’
FYI: Another important consideration is that all processes are initialized before simulation, that means they are run until the first ‘wait’ condition is met
Given that fact, what is the value on ‘C’ at simulation time zero—assuming use of std_logic for each of the examples above ?
Simulation discrete time step
998
999
1000
1001
D1
D+n
D+2
D+1
1002
. . .
Delta cycles in-between
D1
D+2
D+1
. . .
Delta cycles in-between
Concurrent Operations
Modeling Concurrency
Công cụ mô phỏng VHDL được hoạt kích theo sự kiện
Tại một thời điểm bất kỳ trong thời gian mô phỏng, (1) tất cả các process được thực hiện cho đến khi bị tạm dừng, (2) giá trị của các tín hiệu được cập nhật, (3) sự thay đổi giá trị ở các tín hiệu làm cho các process liên quan được th
Vấn đề Mô hình hoá phần cứng
(Hardware Modeling)
VHDL 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
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 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
Chuẩ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ác bộ phận của VHDL 200X
được hỗ trợ bởi một số tool
IEEE 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
Behavioral
Logic
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
Sự chồng chéo trong VHDL
Behavioral
Logic
RTL
Layout
Place & Route Utility
FPGA Vendor Library
Synthesizable Code
Hardware Model
Sum <= A + B after 3 ns ;
Sum <= A + B ;
component Xlx_add2
port ( A: in bit ;
B: in bit ;
Sum: out bit
);
end component ;
Trình tự thiết kế Top-Down
VHDL hỗ trợ hướng tiếp cận top-down trong thiết kế
Nguyê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
A[3:0]
entity
Add_4
B[3:0]
C_in
SUM [3:0]
C_out
C_out
Sum
A
B
C_in
entity
Full_Add
A
B
entity
Half_Add
Sum
Carry
Leaf Cell
Cấu trúc Top - Down
Macro
VHDL
modules
Synthesis
Place & Route
Behavioral Simulation
(Testbench driven)
Gate-Level Functional
(Netlist-driven )
Gate-Level Timing
(Back-annotated netlist )
V I T A L
VHDL Initiative Toward
ASIC Libraries
SDF (Standard Delay Format)
& Structural VHDL File
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
Các bước kiểm tra thiết kế
(1) Mô phỏng Behavioral
Thực hiện mã nguồn mô tả hành vi, dùng testbench
(2) Mô phỏng RTL
Thực hiện file mã nguồn RTL,
dùng testbench
(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
Test-Bench
Behavioral Module
MCU
FPGA
PLD
Memory
Kiểm tra thiết kế?
Chip level
Board level
Std parts model
Model bus operation
Discrete event-driven
Flexibility over strictly
netlist-driven
Kế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)
Bài 2
Ngôn ngữ VHDL
Chươ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 VHDL
Entity
Architecture
Configuration
Package
Package Body
Library
Các loại Design Unit
Trong VHDL có hai loại design unit, đó là:
Primary
Không phụ thuộc vào các design unit khác
Secondary
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
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 đó
entity Half_Add is
port (A, B : in std_logic ;
Carry, Sum : out std_logic) ;
end Half_Add ;
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 ; ’
architecture My_Arch of Half_Add is
begin
Sum <= A xor B ;
Carry <= A and B ;
end My_Arch ;
Note: VHDL’93 cho phép sử dụng reserved word architecture sau reserved word end
Architecture
Architecture mô tả hoạt động bên trong của thực thể (entity) gắn với nó (primary unit)
Một architecture thể hiện một chức năng của thực thể gắn với nó, có thể có nhiều architecture cho một thực thể
Multiple Architecture
Có thể có nhiều architecture cùng tồn tại để mô tả hoạt động của một thực thể
Chúng có thể biểu diễn các giai đoạn khác nhau của quá trình thiết kế hoặc các cách tiếp cận khác nhau cho cùng một chức năng (optimization for speed verus area, etc.)
package My_Pack is
constant. . .
. . .
function. . .
. . .
component . . .
. . .
subtype. . .
end package My_pack ;
library IEEE;
use IEEE.std_logic_1164.all ;
. . .
use work.My_Pack.all ;
entity . . .
Package
Một package declaration được dùng để khai báo các dữ liệu dùng cho toàn bộ thiết kế, bao gồm:
Constants, data types, subtypes, subprogram và function declarations, v.v…
package My_Pack is
constant. . .
. . .
function bv_to_integer (
. . .
component . . .
. . .
subtype. . .
end My_Pack ;
package 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 ;
declaration
details
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
Library
Về cơ bản, tất cả các đối tượng VHDL đều được lưu trong các thư viện
Theo định nghĩa, thư viện là một tập hợp các đơn vị thiết kế (design unit) đã được kiểm chứng
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 ;
Library
Libraries và Packages comprise the VHDL Design Management structure
Theo một nghĩa nào đó, nó tương tự như directories và subdirectories
package std_logic_1164 is..
package std_logic_arith is..
package std_logic_unsigned is..
library IEEE ;
Khở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..
library My_Lib ;
use My_Lib.Fast_Counters.all ;
entity Mod1 is
port ( . . .
library My_Lib
Khở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..
library My_Lib ;
use My_Lib.Fast_Counters.all ;
entity Mod1 is
port ( . . .
library My_Lib
Work 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
Design Unit Identifier
entity HALF_ADD
entity DFF
entity REG4
package My_Counters. . .
architecture RTL
architecture STRUCTURAL
Work Library
Một ví dụ về nội dung của
work library
Secondary (dependent) design units tham trỏ tới primary unit tương ứng với nó
entity 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
D
Q
Ví dụ về Hierarchy : DFF
entity REG_4 is
port (D_in : in std_logic_vector (3 downto 0);
Clk, Rst : in std_logic;
Q_out : out std_logic_vector (3 downto 0));
end REG_4;
architecture Structural of REG_4 is
component DFF
port ( D, Clock : in std_logic ;
Reset : in std_logic;
Q : out std_logic ) ;
end component ;
begin
U3 : DFF port map (D_in(3), Clk, Rst, Q_out(3));
U2 : 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
D_in(3)
D_in(2)
D_in(1)
D_in(0)
Q_out(3)
Q_out(2)
Q_out(1)
Q_out(0)
DFF
DFF
DFF
DFF
U3
U0
U1
U2
REG_4
Ví dụ về Hierarchy : REG-4
Liên kết Tín hiệu
Có hai phương pháp liên kết các tín hiệu với các cổng tương ứng của chúng
Liên kết theo vị trí: Các tín hiệu ở mức cao được liệt kê theo đúng trật tự của các cổng (port) ở mức thấp trong component declaration
U1: DFF port map (D_in, Clk, Rst, Q_out) ;
component DFF
port (D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic ) ;
end component ;
Liên kết Tín hiệu
Có hai phương pháp liên kết các tín hiệu với các cổng tương ứng của chúng
Liên kết theo tên: Các cổng (ports) và tín hiệu (signals) được liệt kê một cách rõ ràng, đầy đủ, không phụ thuộc trật tự (strongly recommended)
U1: DFF port map ( D =>D_in(1), Clock =>Clk, Reset =>Rst, Q =>Q_out(1)) ;
component DFF
port (D, Clock : in std_logic ;
Reset : in std_logic ;
Q : out std_logic ) ;
end component ;
architecture 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 ) ;
B2, B3, B4 : out std_logic) ;
end component ;
signal Bus_1 : std_logic_vector (3 downto 0) ;
signal Sig_1: std_logic ;
begin
U0 : Sub_A port map (I1, I2, Sig_1, Bus_1) ;
U1 : Sub_B port map (Bus_1, Sig_1, O1, O2) ;
end Structural ;
Sub_A
Sub_B
Top
I1
I2
O1
O2
Sig_1
Bus_1
A1
A2
A4
A3
B4
B3
B2
B1
entity Top is
port (I1, I2 : in std_logic;
01, 02 : out std_logic) ;
end Top ;
Signal Declaration
Tất cả các tín hiệu bên trong thực thể cần phải được khai báo rõ ràng
entity REG_4 is
port (D_in : in std_logic_vector (3 downto 0) ;
Clk, Rst : in std_logic ;
Q_out : out std_logic_vector (3 downto 0)) ;
end REG_4 ;
architecture Xilinx_Struct of REG_4 is
component FDC
port (D : in std_logic ;
Clock, Reset : in std_logic ;
Q : out std_logic) ;
end component ;
begin
U3 : FDC port map (D=>D_in(3), Clock=>Clk, Reset=>Rst, Q=> Q_out(3)) ;
U2 : FDC port map (D=>D_in(2), Clock=>Clk, Reset=>Rst, Q=> Q_out(2)) ;
U1 : FDC port map (D=>D_in(1), Clock=>Clk, Reset=>Rst, Q=> Q_out(1)) ;
U0 : FDC port map (D=>D_in(0), Clock=>Clk, Reset=>Rst, Q=> Q_out(0)) ;
end Xilinx_Struct ;
Component instantiation from target library may be helpful for chip level optimization ( i.e., Xilinx Virtex )
Clk
Rst
D_in(3)
D_in(2)
D_in(1)
D_in(0)
Q_out(3)
Q_out(2)
Q_out(1)
Q_out(0)
FDC
FDC
FDC
FDC
U3
U2
U1
U0
Cụ thể hoá phần tử
Sử 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 kế (component instantiation)
Điều này cho phép khai báo các tham số một cách linh hoạt, mềm dẻo
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned_all;
use IEEE.std_logic_arith.all;
entity My_Cntr is
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;
Cập nhật giá trị của Generics
Sử dụng một generic map
cùng với port map, khi có một phần tử được cụ thể hoá đâu đó trong thiết kế
Nếu không có generic
map, generic 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;
entity MY_TOP_DESIGN is
port ( DATA_BUS: in std_logic_vector (63 downto 0);
CLOCK, RST, LD, CNTRL : in std_logic;
DATA_Out: out std_logic_vector (63 downto 0)) ;
end entity MY_TOP_DESIGN;
architecture STRUCTURAL of MY_TOP_DESIGN is
component My_Cntr
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 component ;
begin
U0: My_Cntr generic map (Count_Width => 64)
port map (DATA_BUS, CLOCK, RST, LD, CNTRL, DATA_OUT ) ; • • • •
end architecture RTL;
Biên dịch VHDL
Có thể có bốn giai đoạn biên dịch ứng với bốn mức xử lý cho một mô hình phần cứng VHDL
Analysis (phân tích)
Design unit được kiểm tra lỗi cú pháp. Sau khi hoàn tất, nó sẽ được lưu giữ ở work directory
Elaboration (chỉnh sửa)
Cấu trúc hierarchy của thiết kế được dàn trải bắt đầu từ mức cao nhất. Ứng với mỗi sub-module cụ thể chỉ có một copy duy nhất được tạo ra
Synthesis (tổng hợp)
Dạng mô tả netlist của thiết kế được tạo ra hoặc theo format chuẩn công nghiệp hoặc theo một vendor-specific format
Execution (chỉ mô phỏng)
Mô hình được mô phỏng theo các bước thời gian gián đoạn. Nó được điều khiển bởi các sự kiện ở các tín hiệu đồng bộ quá trình
Analyze
Elaborate
Execute
Synthesize
Quy trình biên dịch
entity DFF is
port (D, Clk : in
Reset: in
Q: out
. . .
architecture..
Trì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
- - 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
A_OUT <= ‘1’ ; - - Comments có thể viết từ đây
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
Kế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)
Bài 3
Signals và
Data Types
Data Types
Data types là một yếu tố quan trọng trong VHDL (cũng như trong các ngôn ngữ khác)
Mỗi một kiểu dữ liệu chỉ cho phép nhận các giá trị trong một giải nhất định
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)
entity 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 ;
A <= C;
A <= C + 1;
A <= B;
D <= C;
B <= D;
Q_out <= Cntrl;
Signals và Ports
Kiểu dữ liệu và độ rộng bus cần phải phù hợp trong các lệnh gán tín hiệu (signal) và cổng vào ra (port)
Các loại data type trong VHDL
Có 4 categories (loại) data types trong VHDL
Scalar
Single value object, defined indices, ordered
Composite
Group objects, similar or different types
Access
Defines pointers to objects
covered in Advanced VHDL course
File
Sequence of objects of given type
covered in Advanced VHDL course
Scalar 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ó:
Bit
Boolean
Integer
Real
Physical
Character
Std_logic and std_ulogic
Enumerated
type 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
Z <= B ;
end if . . .
if Sel =‘1’, if F >= G..
both yield boolean result
Bit và Boolean
Vừa đủ để mô hình hoá phần cứng, nhưng nó không cho phép mô tả các giá trị high-impedance, unknown, don’t care, v.v...
Thích hợp cho việc mô hình hoá ở mức khái niệm lý thuyết
Integer 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 ;
Time 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
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us; . . .
constant Tpd : time := 3ns ;
. . .
Z <= A after Tpd ;
Physical
Kiểu vật lý (Physical type) được dùng để định lượng các đại lượng vật lý như là khối lượng, độ dài, thời gian
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ở
type std_ulogic is ( ‘U’, -- Uninitialized
‘X’, -- Forcing Unknown
‘0’, -- Forcing Zero ‘1’, -- Forcing One
‘Z’, -- High Impedance
‘W’, -- Weak Unknown
‘L’, -- Weak Zero ‘H’, -- Weak One
‘ - ‘ -- Don’t Care
) ;
Recall: type bit is limited to (‘0’, ‘1’).
Std_logic và Std_ulogic
Std_logic được phát triển từ hệ thống MVL (Multi-Value Logic) và được dùng để mô hình hoá phần cứng một cách chi tiết hơn so với kiểu bit
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
signal A,B,C,Res_Out : std_logic ;
signal Out_1 : std_ulogic ;
Out_1 <= A ;
Out_1 <= B ; Out_1 <= C ;
C
B
A
Out_1
C
B
A
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
signal A,B,C,Res_Out : std_logic ;
C
B
A
Res_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
Signal Resolution
Một cửa ra cụ thể không thể có nhiều tín hiệu điều khiển kiểu wire-or
Để mô hình một cửa ra ba trạng thái, ta sử dụng một lệnh gán tín hiệu có điều kiện và data-type là std_logic:
type 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 ;
Composite 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” ;
Array
Array là nhóm các phần tử đơn có cùng kiểu (type) ban đầu
type WORD is array (3 downto 0) of std_logic ;
index position
0
1
2
3
B_bus
Nế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 ;
signal My_BusA, My_BusB: bit_vector (3 downto 0) ;
signal My_BusC : bit_vector (0 to 3) ;
3
0
1
2
3
0
1
2
My_BusA
My_BusB
My_BusB <= My_BusA ;
My_BusA
3
0
1
2
0
3
2
1
My_BusC
Inadvertent bit-swap?
My_BusC <= My_BusA ;
Phép gán các Array
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
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” ;
Record 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;
PARITY
ADDRESS
DATA_BYTE
NUM_VALUE
STOP_BITS
. . .
T X _ P A C K E T
Records
String là array của các character
signal Warning1: string (1 to 30) := “ Unexpected Outputs Detected” ;
--declared within the architecture
variable Warning2: string (1 to 30) := “ Unstable, Aborting Now” ;
--declared within the process
constant Warning3: string (1 to 20) := “ Entering FSM State2” ;
--declared within the package or architecture
String
signal H_BYTE, L_BYTE: std_logic_vector ( 0 to 7);
signal Q_Out : std_logic_vector (31 downto 0);
signal A, B, C, D : std_logic;
signal WORD : std_logic_vector (3 downto 0);
(A,B,C,D)<=WORD;
WORD <= ( A, B, C, D ) ;
Q_Out <= ( others => ‘0’ ) ;
WORD <= ( 2 => ‘1’, 3 => D, others => ‘0’ ) ;
The total number of elements on both sides of any assignment must match, “others” can be used as a default assignment, regardless of the array size
Phép gộp các Array
Phép gộp (Aggregate) là một công cụ tiện lợi để nhóm các kiểu dữ liệu (data type) cả vô hướng và phức hợp trong các phép gán
Only scalar data variables are allowed on the left-side aggregates.
H_Byte <= ( 7|6|0 => ‘1’, 2 to 5 => ‘0’ ) ;
type D_WORD is record
UPPER : std_logic_vector (7 downto 0 ) ;
LOWER : std_logic_vector (7 downto 0 ) ;
end record ;
signal DATA_WORD : D_WORD ;
signal H_BYTE, L_BYTE: std_logic_vector (7 downto 0);
signal TX_PACKET, RX_PACKET : OPCODE; --defined earlier
TX_PACKET <= ( ‘1’,”0011”,”11101010”,5,”10” ) ;
TX_PACKET. ADDRESS <= ( “0011” ) ;
Gộp các Record
Phép gộp (Aggregate) là một công cụ tiện lợi để nhóm các kiểu dữ liệu (data type) cả vô hướng và phức hợp trong các phép gán
Only records can accept aggregate of arrays
TX_PACKET. ADDRESS(2) <= ‘0’ ;
DATA_WORD <= ( H_BYTE, L_BYTE) ;
DATA_WORD <= ( LOWER => L_BYTE, UPPER=> H_BYTE) ;
DATA_WORD <= ( LOWER | UPPER=> H_BYTE);
DATA_WORD <= ( others => H_BYTE);
Tạo lập các Array 2-D
Khi cần mô hình hoá các cấu trúc bộ nhớ, người thiết kế phải tạo ra một cấu trúc array 2 chiều (2-D structure)
Đây thực sự là một array của các array (hoặc các record)
type Mem_Array is array ( 0 to 3 ) of std_logic_vector ( 7 downto 0);
signal My_Mem : Mem_Array ;
0
1
2
3
Tạo Array của các Record
Array của các record thường được dùng trong các ứng dụng xử lý gói tin (packet handling)
type Data_Array is array ( 0 to 2 ) of OPCODE ;
signal My_Data : Data_Array ;
My_Data
Phép gán các Array 2-D
Với hầu hết các ứng dụng của memory, vector địa chỉ Read/Write được chuyển thành dạng integer, để tham trỏ tới một phần tử trong array 2-D
- Hàm biến đổi conv_integer có trong gói ieee.std_logic_unsigned
My_Mem (conv_integer( W_Addr)) <= Data_In ;
. . .
D_Out <= My_Mem (conv_integer (R_Addr));
Initializing a ROM Array
Với các ứng dụng ROM, phép kết tập (aggregate) là một công cụ tiện ích để kích hoạt mạng array 2-D
constant My_ROM : ROM_Array := (
0 => (others => ‘1’) ,
1 => “10100010”,
2 => “00001111”,
3 => “11110000” ) ;
Các kiểu con (Subtypes) thường được dùng để phát hiện lỗi ‘out-of-range’ trong kết quả mô phỏng, và cũng có thể có tác dụng tối ưu hoá quá trình tổng hợp logic
Kiểu con trong VHDL
Một kiểu con (subtype) trong VHDL là một tập hợp có hạn chế của một kiểu (type) đã có
Kiểu đã có cũng có thể là một kiểu đã được định nghĩa trong IEEE1076 hoặc cũng có thể do người dùng tạo ra
Sử dụng kiểu con trong VHDL
Bài 4
Operators và
Expressions
Các toán tử trong VHDL
VHDL chứa một lượng lớn các toán tử (operator) dùng cho việc mô hình hoá phần cứng
Tuy nhiên, mỗi toán tử được sử dụng với (những) kiểu dữ liệu (data type) nhất đ ịnh
Đặc biệt, cần lưu ý các toán tử số học (arithmetic) không dùng được với các kiểu dữ liệu phức hợp (bit_vector and std_logic_vector), vì các array không có giá trị bằng số tường minh
Các Function (subprogram) được tạo ra để khắc phục những vấn đề liên quan
Các hàm này có trong các gói được gọi là “arithmetic packages”
Operator Overloading
Operator overloading (chồng hàm) trong VHDL có nghĩa là một toán tử cụ thể (ví dụ, ‘+’ ) có thể được dùng với các data type khác nhau
Điều này xảy ra do các subprogram riêng biệt được viết cho từng data type nhất định
Compiler tự động chọn sub-function thích hợp dựa trên data type của các operands
signal A, B : std_logic_vector ( 3 downto 0 ) ;
signal C, D : integer range 0 to 31 ;
signal Q_Out : std_logic_vector ( 15 downto 0 );
Y <= A + B ; -- add 2 vectors
F <= C + D ; -- add 2 integers
Q_Out <= Q_Out + 1; -- add vector and integer
and
or
nand
nor
xor
not
xnor (VHDL-93)
Y <= G or ( F and H ) ;
Z <= A and B ;
Z
B
A
F
H
G
Y
Các toán tử Logic
Các logical operator được định nghĩa với các toán hạng có kiểu (data type) bit, boolean, bit_vector và std_logic_vector
Quy tắc sử dụng với biến kiểu Array
1. Các array phải có cùng kiểu (type)
2. Các array phải có cùng kích thước
3. Phép toán thực hiện với các phần tử cùng vị trí trong mỗi array, từ trái sang phải
signal A_vec, B_vec, C_vec : bit_vector ( 7 downto 0 ) ;
B_vec (7)
A_vec (7)
C_vec (7)
B_vec (6)
A_vec (6)
C_vec (6)
B_vec (5)
A_vec (5)
C_vec (5)
B_vec (0)
A_vec (0)
C_vec (0)
.
.
.
C_vec <= A_vec and B_vec ;
Các toán tử Logic với biến kiểu Array
= Equality
/= Inequality
< Less than
<= Less than or equal
> Greater than
>= Greater than or equal
signal FLAG_BIT : boolean ;
signal A, B : integer ;
FLAG_BIT <= ( A > B ) ;
Nếu A lớn hơn B, FLAG_BIT sẽ được gán giá trị true, ngược lại FLAG_BIT được gán giá trị false
Các toán tử quan hệ
Các toán tử quan hệ có thể dùng với hầu hết các data type
Tất cả các toán tử quan hệ đều cho kết quả kiểu (type) Boolean
Rules for use on Arrays
1. Arrays must be same type
2. Arrays may be different lengths
3. Arrays of different lengths are aligned left and then lexically compared -- Compares ASCII values
signal A_vec : bit_vector ( 7 downto 0 ) := “11000110” ;
signal B_vec : bit_vector ( 5 downto 0 ) := “111001” ;
if ( A_vec > B_vec ) then
State <= Normal
else
State <= Code_Red
end if …
Toán tử quan hệ với các Array
Ví dụ này cho kết quả là false
Các vector được so sánh từ trái sang phải. Việc so sánh được thực hiện lần lượt theo từng phần tử
Quy tắc: để đảm bảo phép so sánh số được hợp lý các array cần phải có cùng kích thước
+ Addition
- Subtraction
* Multiplication
/ Division
abs Absolute Value
** Exponentiation
signal A_num, B_num : integer range 0 to 15 ;
signal Z_num : integer range 0 to 31 ;
Z_num <= ( A_num + B_num ) ;
+
Z_num
A_num
B_num
Infers a 5-bit adder
Các toán tử số học
Các toán tử số học dùng với các kiểu dữ liệu (data type) integer, real, và physical
Các toán tử số học vốn không dùng với các dữ liệu có kiểu array
Phép tính số học với các biến Array
Để thực hiện các phép tính số học cần có các function định nghĩa sẵn trong IEEE hoặc từ các hãng cung cấp phần mềm thiết kế
Các function như vậy thường được đặt trong các gói gọi là “arithmetic packages”. Một số công cụ (tool) dịch sẵn các gói này và đặt ở thư viện của chúng
Các gói std_logic_unsigned và std_logic_arith được xác lập trong thư viện IEEE để phát huy khả năng trao đổi mã nguồn giữa các công cụ khác nhau
Toán tử “+” là overloaded
package STD_LOGIC_UNSIGNED is
function “+” (A,B: std_logic_vector) return std_logic_vector ;
function “+” (A: std_logic_vector, B: integer ) return std_logic_vector ;
function “+” (A,B: std_logic_vector) return integer ;
. . . .
library IEEE ;
use IEEE.std_logic_1164.all ;
use IEEE.Std_Logic_Unsigned.all ;
use IEEE.Std_Logic_Arith.all;
signal A_vec : std_logic_vector ( 7 downto 0 ) := “11001001” ;
signal B_vec : std_logic_vector ( 7 downto 0 ) := “11100100 ” ;
signal Z_vec : std_logic_vector ( 8 downto 0 ) ;
signal D_int : integer range ( 0 to 9 ) ;
Z_vec < = A_vec + D_int ;
Z_vec < = A_vec + B_vec ;
Array Arithmetic
Nếu có các function thích hợp có thể dùng được trong module thiết kế (thông qua mệnh đề “use”), thì compiler sẽ tự động truyền tham số cho trả lại kết quả tính từ subprogram đó
Nếu không, compiler sẽ thông báo lại rằng các operator đó là “undefined”
Các toán tử Shift (dịch)
Các toán tử Shift được định nghĩa trong VHDL-93 và rất hay được sử dụng, nhất là khi cần mô tả hoạt động của các phần tử trong cấu trúc máy tính
Mỗi toán tử có hai toán hạng, toán hạng trái có kiểu array one-dimension (1-D) và toán hạng phải có kiểu nguyên (integer) chỉ số bước cần dịch (hoặc quay). Số âm cũng được dùng để chỉ chiều dịch (hoặc quay) ngược lại
Kết quả của các phép dịch (hoặc quay) có cùng kiểu và kích thước với toán hạng trái
Các toán tử Shift (dịch)
sll - Logical left shift
srl - Logical right shift
sla - Arithmetic left shift
sra - Arithmetic right shift
rol - rotate left logical
ror - rotate right logical
Shift Operator - Các ví dụ
Ví dụ:
signal A_vec : bit_vector (7 downto 0) := “11000110”;
signal D_vec : bit_vector (7 downto 0);
D_vec <= A_vec sll 2;
D_vec <= A_vec sra 2;
D_vec <= A_vec ror 3;
D_vec <= A_vec srl 2;
D_vec <= A_vec sra -2;
“00011000”
“11110001”
“11011000”
“00110001”
“00011000”
cho kq
signal A_vec, B_vec : std_logic_vector ( 7 downto 0 ) ;
signal Z_vec : std_logic_vector ( 15 downto 0 ) ;
signal A_bit, B_bit, C_bit, D_bit : std_logic ;
signal X_vec : std_logic_vector ( 2 downto 0 ) ;
signal Y_vec : std_logic_vector ( 8 downto 0 ) ;
Z_vec <= A_vec & B_vec ;
X_vec <= A_bit & B_bit & C_bit ;
Y_vec <= B_vec & D_bit ;
Concatenation
Toán tử nối (concatenation) “&” cho phép kết nối các biến kiểu scalar và kiểu array thành kiểu array lớn hơn
Các phép gán được thực hiện với sự tương hợp vị trí (positional association)
Z <= A + B + C + D ;
Z <= ( A + B ) + ( C + D ) ;
B
A
C
D
Z
3 logic levels
D
Z
A
B
C
2 logic levels
This is especially important when the target technology is LUT (Look-Up Table) based. Each added level of logic incurs additional block and routing delays
+
+
+
+
+
+
Nhóm các toán tử
Có thể sử dụng dấu ngoặc đơn để nhóm các toán tử trong một biểu thức đã cho làm cho nó dễ đọc hơn
signal A_vec, B_vec : std_logic_vector (7 downto 0) ;
signal Z_vec : std_logic_vector (15 downto 0) ;
signal A_bit, B_bit, C_bit, D_bit : std_logic ;
Z_vec (15 downto 8) <= A_vec ;
B_vec <= Z_vec (12 downto 5) ;
A_vec (1 downto 0) <= C_bit & D_bit ;
. . .
Z_vec (5 downto 1) <= B_vec (1 to 5 ) ;
The direction (ascending or descending) of the slice must be consistent with the direction of the array as it was originally declared
Các Slice của Array
Một nhóm các phần tử kề cận nhau trong một array được goại là một slice và có thể được tham trỏ đồng thời
Các phần tử khác của array không bị ảnh hưởng bởi phép gán slice
signal Status_Bus : std_logic_vector (15 downto 0) ;
Slice và Concatenation
Ví dụ, để mô hình hoá một biểu thức có điều kiện với các phần tử được chọn không liền nhau (9,8,3,2,1, và 0) từ ‘Status’ bus gồm 16-bit
Giải mã toàn bộ bus có thể làm tăng số lượng mạch logic tổ hợp và làm cho thiết bị làm việc chậm hơn)
signal Int_Bus : std_logic_vector ( 5 downto 0 ) ;
. . .
Int_Bus <= Status_Bus ( 9 downto 8 ) & Status_Bus ( 3 downto 0 ) ;
Inefficient !!
Bài 5
Các câu lệnh Concurrent và Sequential
Mô hình hoá phần cứng
Để mô hình hoá một thực thể phần cứng một cách có hiệu quả, VHDL sử dụng cả các câu lệnh concurrent (đồng thời) lẫn sequential (tuần tự)
Các câu lệnh được gọi là concurrent khi chúng được thực hiện không tuỳ thuộc vào vị trí của chúng trong chương trình
Các câu lệnh được gọi là sequential khi chúng được thực hiện một cách tuần tự theo trình tự viết chúng trong chương trình, giống như các lệnh trong các phần mềm thông thường
Tất cả các câu lệnh viết trong một process là những lệnh sequential
architecture RTL of ENTITY_1 is
. . .
begin
concurrent statements ;
. . .
process
begin
sequential statements ;
. . .
end process ;
. . .
concurrent statements ;
. . .
process
begin
sequential statements ;
. . .
end process ;
...
end architecture RTL ;
Mọi câu lệnh nằm ngoài một process đều là lệnh concurrent
Cấu trúc ngôn ngữ
architecture RTL of My_And2 is
begin
. . .
process (A, B)
begin
C <= A and B ;
end process ;
. . .
end architecture RTL;
Process
Một process bao gồm các câu lệnh sequential
Các câu lệnh trong một process được thực hiện lần lượt
Mỗi process đều phải được hoạt kích theo một cách nhất định
Thường là do sự thay đổi của các tín hiệu trong process, hoặc các điều kiện cụ thể trong một câu lệnh ‘wait’
G1
G2
G3
B
A
C
C<=A and B
...
Process 1
process (C,..)
begin
Process 3
If C = ‘1’
then
...
Process 2
C
C
Các Process là đồng thời
Trong việc mô hình hoá phần cứng, quan điểm về concurrency (tính đồng thời) là rất cần thiết
Bất kỳ sự thay đổi nào ở tín hiệu ‘C’ - cửa ra của cổng G1, cũng đều được đồng thời đưa tới cửa vào của các cổng G2 và G3
C<=A and B
...
Process n
process (C,..)
begin
Process n2
If C = ‘1’
then
...
Process n1
C
C
Mô hình kết nối trong VHDL
Chỉ có các tín hiệu (signal) là có thể chuyển giá trị từ một process sang một process khác
Các process concurrent, được liên kết bởi các tín hiệu, thường được gọi là VHDL Connectivity Model (mô hình kết nối)
process n
process (...
Rst
Sig1
Sig2
Process n4
Process n3
architecture Behave of DFF is
begin
. . .
Reg1: process (Clock, Reset)
begin
if Reset = ‘1’ then
Q <= ‘0’ ;
elsif ( Clock’event and Clock = ‘1’ ) then
Q <= D ;
end if ;
end process;
. . .
end Behave ;
Optional Label
Các thành phần của Process
Signals in sensitivity
list create implied
“wait” condition
Signal updated with
new value when
process suspends
All statements within
the process are handled
sequentially, in order
Keyword
Keywords “end”
and “process”
architecture ...
process ( )
begin
Out1 <= A;
Out1 <= B;
. . .
end process ;
end architecture ;
architecture . . .
begin
Out1 <= A;
Out1 <= B;
. . .
end architecture ;
B
B
Chỉ có phép gán cuối cùng là có hiệu lực
Out1
?
Out1
A
Cần phải có một hàm resolution cho tín hiệu ra ‘Out1’
Bên trong và bên ngoài Process
wait on... An event on given signal
wait until... A specific condition
wait for ... A specified time amount
wait Indefinite suspension
wait on A, B ;
wait until CLK = ‘1’ ;
wait for 10 ns ;
Tạm dừng các Process
Mỗi process cần phải có một cơ chế để kích hoạt, điều đó cũng có nghĩa là có cơ chế để tạm dừng (suspending) process
Điều này tạo nên trạng thái đợi (wait) cho process
Với đoạn mã RTL, các tín hiệu trong sensitivity list tạo nên một điều kiện wait mặc địnhcho process
Đối với các mô hình hành vi, người thiết kế thưòng dùng các câu lệnh wait. Trong VHDL có bốn dạng lệnh wait
wait;
Các điều kiện Wait
Ví dụ dưới đây so sánh các điều kiện ‘wait’ từ các câu lệnh được viết rõ ràng (explicit) và điều kiện ‘wait’ ẩn ý (implicit)
Note: Một số compiler dùng tổng hợp mạch không hỗ trợ điều kiện explicit ‘wait’
FYI: Another important consideration is that all processes are initialized before simulation, that means they are run until the first ‘wait’ condition is met
Given that fact, what is the value on ‘C’ at simulation time zero—assuming use of std_logic for each of the examples above ?
Simulation discrete time step
998
999
1000
1001
D1
D+n
D+2
D+1
1002
. . .
Delta cycles in-between
D1
D+2
D+1
. . .
Delta cycles in-between
Concurrent Operations
Modeling Concurrency
Công cụ mô phỏng VHDL được hoạt kích theo sự kiện
Tại một thời điểm bất kỳ trong thời gian mô phỏng, (1) tất cả các process được thực hiện cho đến khi bị tạm dừng, (2) giá trị của các tín hiệu được cập nhật, (3) sự thay đổi giá trị ở các tín hiệu làm cho các process liên quan được th
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Lương Hòai Thương
Dung lượng: |
Lượt tài: 1
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)