Professional Documents
Culture Documents
VHDL
Very High speed integrated circuit Description Language
VHDL
Very High speed integrated circuit Description Language
---------------------------------
-- Ghi chú
---------------------------------
1. PACKAGE (KHỐI).
Package là một vùng lưu trữ các dữ liệu để dùng chung cho các entity.
Mô tả dữ liệu bên trong một package cho phép được tham khảo bởi một entity khác, vì
vậy dữ liệu có thể được dùng chung.
Một package bao gồm 2 phần: phần mô tả định nghĩa giao diện cho package, phần
thân ấn định các hoạt động cụ thể của package.
Cú pháp khai báo khối được xác định là:
PACKAGE example_arithmetic IS
-- các khai báo khối có thể chứa các khai báo sau:
- Subprogram declaration.
- Type, subtype declaration.
- Constant, deferred constant declaration.
- Signal declaration creates a global signal.
- File declaration.
- Alias declaration.
- Attribute declaration, a user-define attribute.
- Attribute specification.
- Use clause.
END example_arithmetic;
Tất cả các đối tượng khai báo trong package có thể được truy xuất bởi bất kỳ một thiết
kế nào đó bằng cách sử dụng mệnh đề use và khai báo library.
library my_lib;
use my_lib.example_arithmetic.all;
Một số thư viện chuẩn
2. ENTITY
Khai báo entity chỉ dùng để mô tả ngõ vào và ngõ ra của một thiết kế. Mức cao nhất
của bất kỳ một thiết kế VHDL là một khai báo entity đơn, khi thiết kế trong VHDL, tên
của file lưu trữ phải trùng với tên theo sau của từ khóa entity.
Ví dụ, mô tả bộ cộng bán phần sau
X1
A SUM
A1
B CARRY
library ieee;
use ieee.std_logic_1164.all;
ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
ENTITY my_design is
Port (a, b : in integer range 0 to 7;
c : bit_vector (3 to 5);
d : bit_vector (27 downto 25);
e : out Boolean);
attribute pinnum: string;
attribute pinnum of c: signal is "1,2,3";
attribute pinnum of d: signal is "6,5,4";
attribute pinnum of e: signal is "2";
END my_design;
3. ARCHITECTURE.
Chức năng của architecture là mô tả mối liên hệ giữa các tín hiệu ngõ vào và tín hiệu
ngõ ra ( bao gồm cả những tín hiệu BUFFER), có thể viết nhiều kiến trúc khác nhau
trong một entity, nhưng chỉ một trong số đó có khả năng xuất hiện trong mã VHDL.
architechture có 3 dạng: mô tả cấu trúc (structure); mô tả dòng dữ liệu (data flow); mô
tả hành vi (behavioral)
ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS
Component XOR2
Port(X,Y: in BIT; Z: out BIT);
End component
Component AND2
Port(L,M: in BIT; N: out BIT);
End component
BEGIN
X1: XOR2 port map (A,B,SUM);
A1: AND2 port map (A,B,CARRY);
END HA_STRUCTURE;
Chú ý, trong trường hợp này các tín hiệu trong Port Map(ánh xạ cổng) của đối tượng
trong thành phần này và các tín hiệu trong khai báo phải được liên kết theo vị trí
Mô tả architechture dưới dạng dòng dữ liệu (data flow)
Ví dụ, chương trình bộ cộng trên sẽ có dạng:
ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS
BEGIN
SUM<=A xor B;
CARRY<=A and B;
END HA_STRUCTURE;
Mô hình dòng dữ liệu sử dụng phát biểu gán tín hiệu đồng thời, ký hiệu <= chỉ giá trị
được gán cho tín hiệu. Phép gán được thực hiện khi có 1 sự kiện tín hiệu của biểu thức
bên phải.
ENTITY HALF_ADDER IS
PORT( A,B : IN BIT;
SUM,CARRY : OUT BIT);
END HALF_ADDER;
ARCHITECTURE HA_STRUCTURE OF HALF_ADDER IS
BEGIN
Process(A,B);
Begin
SUM<=A xor B;
CARRY<=A and B;
End process;
END HA_STRUCTURE;
Ví dụ, mô tả một D-FF:
D Q
CK Q
ENTITY DFF IS
PORT( D,CK : IN BIT;
Q : OUT BIT);
END DFF;
ARCHITECTURE DFF_BEHAVIOR OF DFF IS
BEGIN
Process(CK);
Begin
If rising_edge(ck) then
Q<=D;
End if;
End process;
END DFF_BEHAVIOR ;
structure dataflow
X1
A
: B SUM
Cin
CARRY
behavior
ENTITY FULL_ADDER IS
PORT( A,B,CIN : IN BIT;
SUM, COUT : OUT BIT);
END DFF;
ARCHITECTURE FA_MIXED OF FULL_ADDER IS
Component XOR2
Port(X,Y: in BIT; Z: out BIT);
End component
Signal S1: BIT --Khai báo tín hiệu cục bộ trong architechture
BEGIN
X1: XOR2 port map (A,B,S1); --structure
Process(A,B,CIN); --behavior
Variable T1,T2,T3: BIT;
Begin
T1:=A and B;
T2:=A and CIN;
T3:=B and CIN;
COUT<=T1 or T2 or T3;
End process;
SUM<=S1 xor CIN; --dataflow
END FULL_ADDER;
ENTITY component_i IS
Định cấu hình cho phép mô phỏng các thiết kế ở thành phần con, dễ dàng kiểm tra
được thiết kế hơn một chương trình lớn.
Một cấu hình được dùng để nối từng cặp như sau:
• Một thân architecture tới khai báo entity của nó.
• Một component với một entity.
Ví dụ, xây dựng một entity FULL_ADDER ở trên có thể tách ra làm ba architecture
body: FA_BEHAVIOR, FA_STRUCTURE, và FA_MIXED. Một architecture bất kỳ
có thể được chọn bằng cách đặc tả một configuration thích hợp.
Library HS_LIB, CMOS_LIB;
ENTITY FULL_ADDER IS
Port(A,B,Cin : IN BIT; SUM, Cout: OUT BIT);
END FULL_ADDER;
Clock
Entity MEMO_ONE is
Port ( DATA: in BIT_VECTOR (1 downto 0);
CLOCK :in BIT;
Z: out BIT);
Constant K1: BIT_VECTOR : = “01”;
Constant K2: BIT_VECTOR := “10” ;
End MEMO_ONE;
Architecture A of MEMMO_ONE is
Begin
Process (CLOCK)
Variable A1, A2: BIT_VECTOR(DATA’range);
Variable A3: BIT;
Begin
If CLOCK = ‘1’ and CLOCK’event then
A1 := DATA and K1;
A2 := DATA and K2;
A3 := A1(0) or A2(1);
Z <= A3;
End if;
End process;
End A;
Các biến số sử dụng trong ví dụ trên không tạo ra bất kỳ phần cứng nào. Thật ra quá
trình tương đương có thể được cho mà không có bất kỳ biến nào, ở đó tất cả các biến
được thay thế bởi các phương trình của chúng. Chúng ta có thể viết lại như sau.
Begin
If CLOCK = ‘1’ and CLOCK’event then
Z <= (DATA and K2)(1) or (DATA and K1)(0);
End if;
Khai báo tín hiệu:
Cú pháp:
Signal signal_name : type_name [:=value]
Y(1..0) E
T
A
F
B
G
C
Một số công cụ tổng hợp hỗ trợ tín hiệu không nối loại bus, thì kết quả của hàm
resolved trả về 'Z' để mã hóa mức 3 trạng thái.
12. Gọi thủ tục đồng thời.
Thủ tục đồng thời là thủ tục được gọi từ trong một block hoặc một architechture.
P (A, B, C); -- concurent procedure call;
Tương đương với:
Process -- process equivalent to the previous concurent procedure call
Begin -- C is assumed to be an actual parameter of module out.
P(A, B, C);
Wait on A, B;
End process;
Cho phép dùng lệnh wait trong các thủ tục đồng thời. Trong tổng hợp, điều này không
được hỗ trợ. Thật ra, lệnh wait có nhiều tín hiệu chỉ được cho phép nếu các điều kiện
đồng bộ là như nhau.
Thường sử dụng gọi thủ tục đồng thời khi muốn có sự linh động và khả năng thích
nghi. Thủ tục đồng thời dễ dàng sử dụng hơn là bản sao hợp phần (component), vì
không đòi hỏi sự khai báo và chỉ rõ.
13. Lệnh GENERATE.
Hai lệnh generate được định nghĩa là: lệnh generate có điều kiện và lệnh generete lặp.
Từ quan điểm tổng hợp, lệnh này không được hỗ trợ đầy đủ. Trong giai đoạn chế tạo,
một tập các lệnh đồng thời tương đương được phát sinh.
Lệnh generate lặp.
Lệnh này có thể lặp lại một tập các lệnh đồng thời (ví dụ, lặp lại nhiều lần hợp phần
hoặc gán các tín hiệu vector). Trong ví dụ sau, các hằng số k1, k2 có thể là các thông
số tương thích chung và phần cứng tương ứng sẽ không thay đổi.
Ví dụ,
Architecture A of E is
Constant k1: NATURAL := 0;
Constant k2: NATURAL := 3;
Signal A, S: BIT_VECTOR(k1 to k2 );
Architecture A of E is
Signal LOCAL: BIT_VECTOR (1 to N -1);
Component M1
Port (l: in BIT; O: out BIT);
End component;
Begin
Architecture A of SEARCH_PATTERN is
Subtype REG_TYPE is BIT_VECTOR (PATTERN’ range);
Signal REG: REG_TYPE;
Begin
P_REG: process (DATA, CLK, RESET)
Begin
If RESET = ‘1’ then
REG <= REG_TYPE (others => ‘0’);
Elsif CLK =’1’ and CLK’event then
REG <= REG(REG’left-1 downto REG’right) & DATA;
End if;
End process;
P_FOUND: process (REG)
Variable CPT: NATURAL range 0 to ERROR_NUMBER +1;
Begin
CPT := 0;
FOUND <= ‘0’;
For l in REG’range loop
If PATTERN(l) /= REG(l) then
CPT := CPT + 1;
If CPT >= ERROR_NUMBER then
FOUND <= ‘1’;
Exit;
End if;
End if;
End loop;
End process;
End A;
Trong các ví dụ trên cần chú ý những điểm sau:
• Sử dụng các lệnh assert trong entity không tạo ra phần cứng. Lệnh này kiểm tra
tính nhất quán giữa các giá trị thông số khó mô tả bởi các biểu thức tĩnh (như là các
khoảng trong các kiểu hoặc biểu thức kiểu con).
library ieee;
use ieee.std_logic_1164.all;
use work.std_arith.all;
entity divby5 is
port(x, clk : in std_logic;
y : out std_logic);
end divby5;
architecture state_machine of divby5 is
type StateType is (state0, state1, state2, state3, state4);
signal p_s, n_s : StateType;
begin
fsm: process (p_s, x)
begin
case p_s is
when state0 => y <= '0';
if x = '1' then
n_s <= state1;
else
n_s <= state0;
end if;
when state1 => y <= '0'
if x = '1' then
n_s <= state3;
else
n_s <= state2
end case
end process fsm;
state-clocked : process (clk)
begin
if rising_edge(clk) then
p_s <= n_s;
end if;
end process state_clocked;
end architecture state_machine;