Tài liệu Vhdl

  • Số trang: 37 |
  • Loại file: PDF |
  • Lượt xem: 99 |
  • Lượt tải: 0
quangtran

Đã đăng 3721 tài liệu

Mô tả:

BOÄ GIAÙO DUÏC & ÑAØO TAÏO TRÖÔØNG ÑAÏI HOÏC KYÕ THUAÄT COÂNG NGHEÄ THAØNH PHOÁ HOÀ CHÍ MINH Ths. NGUYEÃN TROÏNG HAÛI TOÙM TAÉT BAØI GIAÛNG VHDL Very High speed integrated circuit Description Language LÖU HAØNH NOÄI BOÄ 07/2005 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL VHDL Very High speed integrated circuit Description Language I. CẤU TRÚC CỦA MỘT THIẾT KẾ DÙNG NGÔN NGỮ VHDL. ---------------------------------- Ghi chú --------------------------------- PACKAGE (Tùy chọn) library (Thư viện) use ENTITY (Bắt buộc) ARCHITECTURE (Bắt buộc) CONFIGURATIONS (Tùy chọn) 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 GV: Nguyễn Trọng Hải Trang 1 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL library ieee; use ieee.std_logic_1164.all; std_logic_1164: là thư viện logic chuẩn của IEEE (đoạn 1164), mục đích cung cấp các chuẩn cơ bản để có thể mô tả các kiểu dữ liệu kết nối trong VHDL. std_logic_arith: là thư viện chứa tập các phép toán và hàm Kiểu std_logic có thể có các giá trị U Uninitialized X Unknown 0 Zero 1 One Z Tristate (Must be upper case!) W Weak unknown L Weak Zero H Weak One - Don't care Ngoài ra có thể tự tạo riêng các thư viện trong thiết kế. 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 CARRY B library ieee; use ieee.std_logic_1164.all; ENTITY HALF_ADDER IS PORT( A,B : IN BIT; SUM,CARRY : OUT BIT); END HALF_ADDER; GV: Nguyễn Trọng Hải Trang 2 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Trong khai báo ENTITY, có 4 kiểu tín hiệu khác nhau: • IN: mô tả các ngõ vào entity. Kiểu IN thì được sử dụng cho các ngõ vào clock, các ngõ vào điều khiển,… • OUT: mô tả dòng dữ liệu đi ra khỏi entity, entity sẽ không thể đọc các tín hiệu này, kiểu OUT chỉ được sử dụng khi tín hiệu không được sử dụng bởi bất kỳ kiểu nào trong entity. • BUFFER: Kiểu tín hiệu này mô tả dòng dữ liệu đi ra khỏi entity, nhưng entity có thể đọc những tín hiệu này (mục đích đọc lại tín hiệu ngõ ra ở bên trong của cấu trúc). Tuy nhiên , tín hiệu sẽ không thể điều khiển từ ngõ ra của entity, vì vậy nó không thể được sử dụng cho các dữ liệu ngõ vào. • INOUT: Kiểu tín hiệu này cho phép tín hiệu có thể có cả hai kiểu: vào và ra, khi khai báo tín hiệu theo kiểu INOUT thì tín hiệu có thể được điều khiển từ ngõ ra của entity. Kiểu tín hiệu này chỉ nên sử dụng khi thật cần thiết(ví dụ như bus dữ kiệu 3 trạng thái), và khi sử dụng kiểu tín hiệu này thì mã của chương trình sẽ trở nên khó hiểu hơn đối với người thiết kế. Loại tín hiệu cũng phải được mô tả trong khai báo PORT, loại tín hiệu sẽ mô tả các giá trị mà tín hiệu đó có thể được ấn định, ngoài ra có thể mô tả một vector những tín hiệu có cùng loại. Lưu ý: trong file report, nếu không gán chân linh kiện thì các biến ngõ vào và ra sẽ được gán ngẫu nhiên. Để gán các chân, có thể thực hiện từ phần mềm hỗ trợ hoặc thực hiện như sau: Ví dụ, 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) GV: Nguyễn Trọng Hải Trang 3 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Mô tả architechture dưới dạng cấu trúc (structure) 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 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. GV: Nguyễn Trọng Hải Trang 4 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Mô tả architechture dưới dạng hành vi (behavioral) Kiểu mô tả hành vi bao gồm tập hợp thứ tự các phép gán tín hiệu tuần tự được khai báo bên trong phát biểu process. Biến được khai báo trong process là biến cục bộ. Tín hiệu không được khai báo trong process 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 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 Q : IN BIT; : 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 ; GV: Nguyễn Trọng Hải Trang 5 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Mô tả architechture dưới dạng hỗn hợp (mixed style) Có thể trộn lẫn 3 kiểu trong một architechture Ví dụ, mô tả mạch cộng toàn phần (FULL_ADDER) sau 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); Process(A,B,CIN); --structure --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; GV: Nguyễn Trọng Hải Trang 6 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL 4. CONFIGURATION Configuration dùng để liên kết các hợp phần tới entity configuration ban đầu có thể được ấn định tới rất nhiều architecture trong một entity. ENTITY component_i IS ARCHITECHTURE Behavioral OF component_i IS …. ARCHITECHTURE dataflow OF component_i IS …. ARCHITECHTURE Structural OF 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; ARCHITECTURE FA_STR OF FULL_ADDER IS Component XOR2 Port(D1,D2 : IN BIT; DZ : OUT BIT); END componen; Component AND2 Port ( Z: OUT BIT; B0,B1: IN BIT); END Component; -- Đặc tả cấu hình: GV: Nguyễn Trọng Hải Trang 7 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL CONFIGURATION FA_BINDING OF FULL_ADDER IS For FA_STR For X1,X2 : XOR2 use entity WORK.XOR2(XOR2BEH); End for; -- liên kết thực thể với nhiều đối tượng của một thành phần. For A3: AND2 Use entity HS_LIB.AND2HS(AND2STR); PORT MAP (HS_B => A1, HS_Z=>Z, HS_A => A0 ); End for; --liên kết thực thể với các đối tượng đơn của một thành phần. For all : OR2 Use entity CMOS_LIB.OR2CMOS(OR2STR); End for; -- liên kết thực thể với tất cả các đối tượng của thành phần OR2. For others: AND2 Use entity WORK.A_GATE(A_GATE_BODY); PORT MAP(A0,A1,Z); End for; -- liên kết thực thể với tất cả các đối tượng không được liên kết của thành phần AND2. End for; End for; Signal S1, S2, S3, S4, S5: BIT; BEGIN X1: XOR2 port map(A, B, S1); X1: XOR2 port map(S1, Cin, SUM); A1: AND2 port map(S2, A, B); A2: AND2 port map(S3, B, Cin); A3: AND2 port map(S4, A, Cin); O1: OR2 port map(S2, S3, S5); O2: OR2 port map(S3, B, Cin); NAND_GATE port map(S4,S5,Cout); END FA_STR; GV: Nguyễn Trọng Hải Trang 8 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Có 4 đặc tả cấu hình trong phần khai báo của thân kiến trúc (architecture body): • Đặc tả thứ nhất chỉ rằng đối tượng có nhãn X1 và X2 của component XOR2 liên kết với entity bởi cặp entity - architecture XOR2 và XOR2BEH có sẵn trong thư viện WORK. • Đặc tả thứ hai liên kết đối tượng component AND2 có nhãn A3 đến entity bởi cặp entity - architecture AND2HS và AND2STR đã có trong thư viện thiết kế HS_LIB. Anh xạ của cổng thành phần (AND2 ) và các cổng thực thể(AND2HS) được liên kết theo tên (name association). • Đặc tả thứ ba chỉ rằng tất cả các đối tượng của component OR2 được liên kết với entity bởi cặp entity - architecture có sẵn trong thư viện thiết kế CMOS_LIB. • Đặc tả cuối cùng chỉ rằng tất cả các đối tượng không liên kết (unbound) của component AND2, đối tượng A1 và A2 được liên kết tới entity khác là: A_GATE có architecture A_GATE_BODY, kiến trúc này có sẵn trong thư viện WORK. Trong ví dụ này đã chỉ ra các đối tượng của cung một thành phần (component) có thể được liên kết(bound) với các thực thể khác nhau. II. CÁC KHAI BÁO TRONG VHDL. 1. Khai báo kiểu hỗ trợ. Kiểu liệt kê, số nguyên, dãy một chiều và kiểu bản ghi. • Kiểu liệt kê. Ví dụ, Type STD_ULOGIC is (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘_’); --std_ulogic là 1 kiểu liệt kê bao gồm 9 giá trị được khai báo là U… Ví dụ, trong lệnh đồng thời có điều kiện: Z <= CST1 when A=’1’ else S when B= CST2 else CST3; 2. Khai báo biến số và tín hiệu. Các khai báo biến số Variable variable_name : type_name [:=value]; Ví dụ, Variable CTRL_STATUS : BIT_VECTOR (10 DOWNTO 0); GV: Nguyễn Trọng Hải Trang 12 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ở đây biến CTRL_STATUS là một dãy có 11 phần tử, mỗi phần tử trong dãy có kiểu là BIT Ví dụ, Thực hiện mạch sau (DATA and “01”)(0) D Q Z (DATA and “10”)(1) CK Q 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] GV: Nguyễn Trọng Hải Trang 13 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ, Signal clock: bit; --khai báo tín hiệu clock của kiểu bit lấy giá trị 1,0 Signal data_bus : bit_vector( 0 to 7); -- khai bo tín hiệu data_bus thuộcc kiểu bit_vector có độ rộng 8 bit 3. Các giá trị khởi động. Trong VHDL, có 3 loại giá trị ban đầu: • Giá trị mặc định từ định nghĩa kiểu hay kiểu con • Giá trị ban đầu khi đối tượng được khai báo • Giá trị được gán khi sử dụng một phát biểu lúc bắt đầu quá trình. Trường hợp thứ nhất và thứ hai sẽ bị bỏ qua bởi công cụ tổng hợp, nên có thể phát sinh mâu thuẫn giữa hoạt động mô phỏng và kết quả tổng hợp. Do đó đề nghị phải khởi động một cách rõ ràng và có hệ thống các biến và tín hiệu với các lệnh đặc biệt. Điều này đạt được trong phần mã tổng hợp phục vụ cho việc xử lý thiết lập/thiết lập lại và sự khởi động phải được trình bày trong phần này. Nếu cổng out hoặc thông số out của chương trình con có giá trị mặc định, chúng hoạt động giống như một giá trị khởi động cho tín hiệu hoặc biến và sẽ bị công cụ tổng hợp bỏ qua. 4. Các toán tử số học. Toán tử logic và toán tử bit là một phần của toán tử số học. VHDL định nghĩa bảy loại toán tử. Chúng được chỉ ở bảng dưới đây với sự tăng dần mức ưu tiên. Loại Toán tử Luận lý Or and nor nand xor xnor Quan hệ = /= > < Dịch Sll Srl Sla SRA Rol Ror Cộng + - & Một ngôi + - Nhân * Hỗn hợp ** abs not / >= Ưu tiên Thấp nhất <= mod rem Cao nhất Toán tử luận lý Toán tử luận lý và toán tử not chấp nhận các toán hạng có các kiểu BIT, BOOLEAN, và VECTOR với kích thước giống nhau. Một quy ước được chấp nhận rộng rãi cho giá trị boolean: TRUE tương đương với giá trị BIT '1' và ngược lại. Toán tử nand và nor không kết hợp với nhau trong 1 cú pháp liên tục, chúng phải được ngăn cách bằng dấu () : A and B nand C; -- trái luật (A and B ) nand C;-- đúng luật; GV: Nguyễn Trọng Hải Trang 14 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ, Signal S, X, Y: BIT_VECTOR (1 downto 0); Signal R, A, B, C : BIT; Signal T, D, E, F, G: BOOLEAN; -Begin S <= X and Y; R <= (A and B) and C; T <= D xor E xor F xor G; Sơ đồ kết quả của các hàm trên như sau: X(1..0) S(1..0) D Y(1..0) E T A B F G C Toán tử quan hệ. Toán tử quan hệ luôn trả về giá trị Boolean '0' hoặc '1' và là kết quả của sự so sánh hai toán hạng cùng một kiểu cơ bản. Trong mô phỏng, toán tử bằng và khác được định nghĩa rõ ràng cho các kiểu. Kết quả là TRUE nếu hai toán hạng có cùng giá trị. Các toán tử quan hệ được định nghĩa cho tất cả các kiểu vô hướng và dãy một chiều. Thứ tự của kiểu vô hướng được định nghĩa bởi khai báo của nó, kiểu 'LEFT' thấp hơn kiểu 'RIGHT'. Đối với dãy một chiều, thứ bậc quan hệ của chúng được định nghĩa bởi bậc ngữ nghĩa. Ví dụ, “0” < ”1” “A” < “BC” “10” < “101” -- is true -- is true -- is also true Toán tử quan hệ này không thể dùng để so sánh các vector bit mã hóa các giá trị liệt kê. Toán tử này nếu thực hiện với khối số học thì kết quả của lệnh cuối cùng "10" < "101" sẽ được thông dịch khác nhau đối với số không dấu hoặc số có dấu. Các toán tử cộng. Toán tử cộng và trừ được định nghĩa cho các toán hạng số nguyên. Tất cả các công cụ tổng hợp đều cài đặt các toán tử này và thường sử dụng với một số ràng buộc. Lưu ý, đôi khi dùng các dấu ngoặc đơn để nhóm một tập hợp các cổng lại. Nói cách khác hai biểu thức khác nhau chạy như nhau nhưng tạo ra phần cứng khác nhau GV: Nguyễn Trọng Hải Trang 15 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ, Architecture … Signal A, B, C: BIT_VECTOR(2 downto 0); Signal B, S, R: BIT_VECTOR (0 to 5); Signal D: BIT; Begin A <= D ¬ D &D; S <= S & B (0 to 2) ; R <= C(1 downto 0) & “000” & D; Các toán tử dịch chuyển. Các toán tử dịch chuyển hỗ trợ cho BIT_VECTOR Các toán tử dịch chuyển và quay là sll, srl, sla, sra, rol và ror. Các toán tử nhân. Phép chia "/", phép nhân "*", lấy modulo "mod", lấy số dư "rem" được xếp trong nhóm nhân. Chỉ có toán tử nhân được hỗ trợ thêm ví dụ không hạn chế đối với tất cả các kiểu số nguyên. Đối với vài công cụ tổng hợp, nhiều chiến lược nhân được đề nghị để tạo ra phần cứng. "/", mod, và rem được hỗ trợ có hạn chế đối với các giá trị của toán hạng vế phải, các công cụ tổng hợp đòi hỏi các giá trị này là dương và là lũy thừa của 2. Hơn nữa chúng thường là các hằng số toàn cục. Kết quả phần cứng của toán tử này dựa trên các toán tử dịch bit. Ví dụ, xây dựng một bộ đếm modulo 4. Entity INCREMENTER is Port (CLK : in BIT; RST : in BIT; R : out NATURAL range 0 to 3) ; End INCREMENTER; Architecture A of INCREMENTER is Signal MEM: NATURAL range 0 to 3; Begin Process If CLK = ‘0’ then If RST = ’1’ then MEM <= 0; Else MEM <= (MEM +1) MOD 4; End if; End if; End process; R <= MEM; End A; Các toán tử hỗn hợp. Abs, giá trị tuyệt đối được hỗ trợ cho tất cả các giá trị số nguyên, Toán tử số mũ "**", được hỗ trợ với hạn chế toán hạng trái là hằng số toàn cục, giá trị của nó phải là 2. GV: Nguyễn Trọng Hải Trang 16 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL 5. Phép gán biến số. Biến không dùng chung được khai báo trong quá trình hoặc trong phần khai báo chương trình con. Phép gán biến được thực hiện bởi toán tử :=, thao tác này xảy ra ngay lập tức khi tính toán. Do đó, giá trị của biến chỉ thay đổi bởi lệnh gán tiếp theo nếu giá trị mới khác với giá trị cũ. Ví dụ, cách gán biến khác nhau: A:= 0 ; -- giá trị integer 0 được gán cho biến A REC.FIELD := B; --B được gán cho bản ghi FIELD của REC VECTOR := X “AA”; -- phép gán vector toàn cục WBUS(1) := F(A); -- phép gán phần tử của vector WORD(3 to 4) := “10”; -- phép gán một nhóm phần tử vector REC := (‘A’, 3, “10”); -- Phép gán giá trị theo vị trí của vetor REC := (LETTER => ‘C’, FIELD => 3, BIT2 => “11”); -- Phép gán với tên Hơn nữa, ở phần bên trái của lệnh gán, nhiều biến số có thể gộp lại. Ví dụ Variable V: BIT_VECTOR(1 to 3); Variable A, B, C: BIT; … --Hai trạng thái sau là tương đương (A, B, C) := V; (1 => A;2 => B; 3 => C):= V; Lưu ý, biến khai báo trong chương trình con chỉ tồn tại trong chương trình con này và biến mất ở ngoài chương trình con. Vì vậy, nếu biến số đã được gán, kết quả bị mất sau khi chạy lệnh return ngoại trừ được trả về khi dùng thông số out bên trong thủ tục hoặc lệnh return bên trong hàm. Tuy nhiên biến này có thể tạo ra một phần nhớ nếu thời điểm đồng bộ xảy ra trước khi chương trình con kết thúc. 6. Phép gán tín hiệu. Mục đích của gán tín hiệu giống như phép gán biến. Hiệu quả của phép gán tín hiệu chỉ xảy ra sau lệnh đồng bộ (lệnh wait ). Signal <= a_waveform_with_one_item_and_without_delay_expression 7. Lệnh đồng bộ. Trong VHDL lệnh duy nhất để đồng bộ là lệnh wait. Một quá trình phải chứa ít nhất một lệnh wait. Có hai cách dùng lệnh wait khác nhau là: • Đợi một sự kiện trên một tín hiệu tùy thuộc vào danh sách. Danh sách của wait phải bao gồm tất cả tín hiệu được đọc trong quá trình: GV: Nguyễn Trọng Hải Trang 17 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Ví dụ, Process Begin Wait on A, B, C, D; S <= A or B; If E then R <= C + D; Else R <= C+1; End if; End process; • Đợi một sự kiện xảy ra trên tín hiệu đồng hồ (Clock). Tín hiệu này phải là duy nhất, clock được xác định bởi các sự kiện và sườn xung. Ví dụ, Wait until CLK = ‘1’; Nếu kiểu của tín hiệu đồng hồ không là BOOLEAN hoặc BIT, mà là kiểu đa giá trị, thì để phù hợp với sự mô phỏng, điều kiện sau phải được thêm vào lệnh wait: CLK'LAST_VALUE = '0'. Điều này xác định sườn lên hợp lệ cho tổng hợp. Điều kiện cạnh xung đồng hồ trở thành: Ví dụ, Wait until CLK =’1’ and CLK’last_value = ‘0’; Nếu lệnh wait là rõ ràng, lệnh đồng bộ được mô tả bởi một lệnh điều kiện if Ví dụ, If CLK = ‘0’ and CLK’event and CLK’last_value =’1’ then … Hoặc sử dụng thuộc tính 'STABLE với giá trị thời gian mặc định 0ns, ('STABLE là một hàm chấp nhận kiểu thông số TIME có giá trị mặc định là zero). Ví dụ, If CLK = ‘0’ and not CLK’stable and CLK’last_value =’1’ then … Lệnh điều kiện. Có hai cách biểu diễn lệnh điều kiện : lệnh if và lệnh case Lệnh if. Lệnh if bao gồm cả rẽ nhánh elsif và else, chỉ mức ưu tiên thực hiện các rẽ nhánh khác nhau. Ví dụ, thiết kế các MUX sau GV: Nguyễn Trọng Hải Trang 18 Bài giảng Thiết Kế Hệ Thống Số Phần VHDL Process (S1, S2, R3, R1, R2, R3, R4) Begin If S1 = ‘1’ then RESULT <= R1; Elsif S2 = ’0’ then RESULT <= R2; Elsif S3 = ’1’ then RESULT <= R3; Else RESULT <= R4; End if; End process; Lệnh case. Trong lệnh case, mỗi nhánh có cùng cấp với nhau (lệnh if và lệnh elsif, mỗi nhánh được kiểm tra một cách tuần tự). Trong lệnh case, tất cả các giá trị có thể phải được đưa vào hết và chúng là duy nhất, không có ưu tiên. Để nhóm lại tất cả các gia trị "don't care", mệnh đề others có thể được sử dụng. Lưu ý, others không bao giờ nên dùng nếu tất cả giá trị đã được liệt kê trước đó Ví dụ, Thiết kế mạch sau Type CODE_TYPE is (ADD, SUB, RST, INCX); Subtype WORD is INTEGER range 0 to 3; Signal CODE: CODE_TYPE; Signal X, Y, R: WORD; Process (CODE, X, Y) Begin Case X is When 0 => R <= Y; When 1 => R <= CODE_TYPE’pos (CODE); When others => R <= 0; End case; End process; Chú ý rằng nhánh others được dùng cho giá trị 2 và 3 của tín hiệu X. GV: Nguyễn Trọng Hải Trang 19
- Xem thêm -