Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 87 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
87
Dung lượng
389,75 KB
Nội dung
Sổ taylậptrìnhVHDL ebooks@free4vn.org Created by lythanhthuan@free4vn.org Giới thiệu ngôn ngữ VHDL 3.1. Các cấu trúc cơ bản của ngôn ngữ VHDL. Các thành phần chính xây dựng trong ngôn ngữ VHDL được chia ra thành năm nhóm cơ bản như sau: - Entity - Architecture - Package - Configuration. - Library. Entity: Trong một hệ thống số, thông thường được thiết kế theo một sự xếp chồng các modul, mà mỗi Modul này tương ứng với một thực thể thiết kế ( Được gọi là Entity ) trong VHDL. Mỗi một Entity bao gồm hai phần : - Khai báo thực thể ( Entity). - Thân kiến trúc ( Architecture Bodies ) Một khai báo Entity được dùng để mô tả giao tiếp bên ngoài của một phần tử (component), nó bao gồm các khai báo các cổng đầu vào, các cổng đầu ra của phần tử đó. Phần thân của kiến trúc được dùng để mô tả sự thực hiện bên trong của thực thể đó. Packages: Các đóng gói chỉ ra thông tin dùng chung, mà các thông tin này được sử dụng bởi một vài Entity nào đó. Configuration: Định cấu hình, nó cho phép gắn kết các thể hiện của phần tử cần dùng nào đó của một thiết kế nào đó có dạng một cấu trúc và đưa các thể hiện này vào trong cặp Entity và Architecture. Nó cho phép người thiết kế có thể thử nghiệm để thay đổi các sự thực thi khác nhau trong một thiết kế. Mỗi một thiết kế dạng VHDL bao gồm một vài đơn vị thư viện, mà một trong các thư viện này được dịch sẵn và cất trong một thư viện thiết kế. 3.1.1 Khai báo Entity: Như trên đã đề cập, phần khai báo Entity chỉ đưa ra một cái nhìn phía bên ngoài cuả một phần tử mà không cung cấp thông tin về sự thực hiện của phần tử đó như thế nào. Cú pháp khai báo của một Entity như sau: Entity entity_name is [generic (generic_declaration);] [port (port_declaration);] {entity_declarative_item {constants, types, signals};} end [entity_name]; [] : Dấu ngoặc vuông chỉ ra các tham số có thể lựa chọn. | : Dấu gạch đứng hiển thị một sự lựa chọn trong số các lựa chọn khác. {} : Khai báo một hoặc nhiều các đối tượng, mà các đối tượng này có thể được định nghĩa bởi người dùng. a. Khai báo Generic dùng để khai báo các hằng mà chúng có thể được dùng để điều khiển cấu trúc và sự hoạt động của Entity. Cú pháp của khai báo này như sau: generic ( constant_name : type [:=init_value] {;constant_name: type[:=init_value]}); ở đây tên hằng constant_name chỉ ra tên của một hằng dạng generic (hằng dùng chung). Kiểu (Type) được dùng để chỉ ra kiểu dữ liệu của hằng. init_value : chỉ ra giá trị khởi tạo cho hằng. b. Khai báo cổng ( Port ): Được dùng để khai báo các cổng vào, ra của Entity. Cú pháp của khai báo này như sau: Port ( port_name : [mode] type [:= init_value] {; port_name:[mode] type [:=init_value]}); port_name được dùng để chỉ ra tên của một cổng, mode chỉ ra hướng vào ra của tín hiệu tại cổng đó. Type chỉ ra kiểu dữ liệu của một cổng và init_value chỉ ra giá trị khởi tạo cho cổng đó. Chú ý ! Với VHDL không phân biệt chữ hoa và chữ thường, chẳng hạn như : xyz = xYz = XYZ. * Có bốn mode được sử dụng trong khai báo cổng : - in : chỉ có thể được đọc, nó chỉ được dùng cho các tín hiệu đầu vào ( chỉ được phép nằm bên phải phép gán ) - out : Chỉ được dùng để gán giá trị, nó chỉ được dùng cho các cổng đầu ra ( Nó chỉ được nằm bên trái của phép gán ). - inout : Có thể được dùng để đọc và gán giá trị. Nó có thể có nhiều hơn một hướng điều khiển ( Có thể nằm ở bên trái hoặc bên phải phép gán ). - Buffer : Có thể được dùng để đọc và gán giá trị. ( Có thể nằm ở bên trái hoặc bên phải phép gán ). inout là một cổng hai hướng, còn Buffer là một cổng không có hướng. c. entity_declarative_item : Được dùng để khai báo các hằng, kiểu dữ liệu, hoặc tín hiệu mà nó có thể được sử dụng trong khi thực hiện của một Entity. d. Ví dụ : * Ví dụ về khai báo các cổng vào ra: entity xxx is port ( A : in integer ; B : in integer ; C : out integer ; D : inout integer ; E : buffer integer) ; end xxx; architecture bhv of xxx is begin process (A,B) begin C <= A ; -- ( Câu lệnh đúng: A được gán cho C ). A <= B ; -- ( Câu lệnh sai: A là một đầu vào ). E <= D + 1; -- ( Câu lệnh đúng: D ở mode inout vì vậy nó có thể được gán và đọc ) D <= C + 1; -- ( Câu lệnh sai : C là cổng đầu ra nên không thể được đọc cho đầu vào ). end process; end bhv; * Ví dụ về khai báo Entity: A B COUT CIN SUM FULL_ADDER Hình trên chỉ ra một giao diện của một bộ cộng một bit. Tên Entity của phần tử này là FULL_ADDER. Nó bao gồm các cổng đầu vào A, B và CIN. Các cổng này có kiểu dữ liệu là kiểu Bit, còn các cổng đầu ra SUM và COUT cũng mang kiểu dữ liệu là kiểu BIT. Ngôn ngữ VHDL dùng để diễn tả giao diện này như sau: Entity FULL_ADDER is port ( A, B, CIN : in BIT; SUM, COUT : out BIT ); End FULL_ADDER ; Chúng ta có thể điều khiển cấu trúc cũng như thời gian của một Entity bởi việc sử dụng các hằng generic. Ví dụ sau sẽ chỉ ra việc điều khiển này, trong ví dụ này hằng N được dùng để chỉ ra số bít của một bộ cộng. Trong quá trình mô phỏng hoặc quá trình tổng hợp, giá trị thực tế cho mỗi hằng dùng chung generic có thể bị thay đổi. entity ADDER is generic (N : INTEGER := 4); M : TIME := 10ns); port ( A, B : in BIT_VECTOR (N -1 downto 0 ); CIN :in BIT; SUM : out BIT_VECTOR (N-1 downto 0); COUT : out BIT ); end ADDER; Giao diện mô tả bộ cộng này như sau: CINCOUT SUM (0)SUM (1)SUM (2)SUM (3) A (3) B (3) A (2) B (2) A (1) B (1) A (0) B (0) FULL _ ADDER 3.1.2. Các kiểu kiến trúc ( ARCHITECTURES ): Một kiến trúc đưa ra kết cấu bên trong của một Entity. Một Entity có thể có nhiều hơn một kiến trúc, nó chỉ ra quan hệ giữa các đầu vào và đầu ra của một Entity mà quan hệ này được diễn tả theo các thuật ngữ sau : - Kiểu hành vi hoạt động ( Behavioral ). - Kiểu hoạt động của các luồng dữ liệu ( Dataflow ). - Kiểu cấu trúc ( Structure ). Một kiến trúc xác định chức năng của một Entity. Nó bao gồm phần khai báo ( Khai báo các các tín hiệu, hằng, khai báo các kiểu, các phần tử, các phần tử, tiếp theo là các phát biểu(lệnh) đồng thời ). Khai báo một kiến trúc sử dụng cú pháp sau: architecture architecture_name of entity_name is { architecture_declarative_part } Begin {concurrent_statement} --(lệnh đồng thời) end [ architecture_name ]; 3.1.2.1. Kiến trúc theo kiểu hành vi hoạt động ( Behavioral ): Một kiến trúc kiểu hành vi hoạt động chỉ ra các hoạt động mà một hệ thống riêng biệt nào đó phải thực hiện trong một chương trình, nó giống như việc diễn tả các quá trình hoạt động, nhưng không cung cấp chi tiết mà thiết kế được thực thi như thế nào. Thành phần chủ yếu của việc diễn tả theo kiểu hành vi trong VHDL là process. Dưới đây là ví dụ chỉ ra kiểu diễn tả theo kiểu hành vi của một bộ cộng với tên là FULL_ADDER. architecture BEHAVIOUR of FULL_ADDER is begin process (A,B,CIN) begin if ( A ='0' and B ='0' and CIN='0' ) then SUM <= '0'; COUT <= '0' ; elsif (A='0' and B='0' and CIN='1') or (A='0' and B='1' and CIN='0') or (A='1' and B='0' and CIN='1') then SUM <= '1'; COUT <= '0' ; elsif (A='0' and B='1' and CIN='1') or (A='1' and B='0' and CIN='1') or (A='1' and B='1' and CIN='0') then SUM <= '0'; COUT <= '1'; elsif (A='1' and B='1' and CIN='1') then SUM <='1'; COUT <='1'; end if; end process; end BEHAVIOURAL; 3.1.2.2. Kiến trúc theo kiểu hoạt động của các luồng dữ liệu: Một kiến trúc kiểu luồng dữ liệu chỉ ra một hệ thống dưới dạng mô tả đồng thời của các luồng điều khiển và dịch chuyển của dữ liệu. Nó sử dụng theo mẫu thông tin hoặc mẫu hoạt động của luồng dữ liệu đó, hoặc mẫu thời gian của các chức năng logic tổ hợp. Chẳng hạn như các bộ cộng, bộ so sánh, bộ giải mã, và các cổng logic nguyên thuỷ. Ví dụ : architecture DATAFLOW of FULL_ADDER is signal S : BIT; begin S <= A xor B ; SUM <= S xor CIN after 10 ns; COUT <= (A and B ) or (S and CIN) after 5ns; end DATAFLOW; 3.1.2.3. Kiến trúc kiểu cấu trúc: Một kiến trúc kiểu cấu trúc chỉ ra sự thực thi cấu trúc theo dạng sử dụng các khai báo phần tử và các thể hiện của phần tử đó. Ví dụ dưới đây chỉ ra sự diễn tả cấu trúc của một bộ cộng FULL_ADDER như trên đã giới thiệu. Hai kiểu phần tử được sử dụng trong ví dụ này là HALF_ADDER và OR_GATE. architecture STRUCTURE of FULL_ADDER is component HALF_ADDER port (L1, L2 : in BIT; CARRY, SUM : out BIT); end component; component OR_GATE port (L1, L2 : in BIT; O: out BIT); end component; begin HA1: HALF_ADDER port map (A,B,N1,N2); HA2: HALF_ADDER port map (N2,CIN,N3,SUM); OR1 : OR_GATE port map (N1, N3,COUT); end STRUCTURE; ở ví dụ này Entity ở mức cao nhất sẽ chứa hai thể hiện của HALF_ADDER và một thể hiện của OR_GATE. Thể hiện HALF_ADDER có thể bị rằng buộc với một Entity khác, mà Entity này bao gồm một cổng XOR và một cổng AND. Giao tiếp của một bộ cộng HALF_ADDER có dạng như sau: X1 A1 L1 L2 SUM CARRY Bộ cộng này gồm có hai đầu vào L1 và L2 , đầu ra là SUM và CARRY. Kiểu BIT là kiểu tiền định nghĩa của ngôn ngữ VHDL, nó có kiểu liệt kê dạng chữ ký tự như '0' và '1'. 3.1.3. Các kiểu đóng gói ( Packages ): Mục đích chính của Package là tập hợp các phần tử có thể bị chia sẻ bởi hai hay nhiều đơn vị thiết kế ( Hay các phần tử có thể dùng chung được). Nó có chứa các kiểu dữ liệu, các hằng, các chương trình con có thể dùng chung giữa các thiết kế. Một Package có chưa hai phần chính: - Phần khai báo Package. - Phần thân Package. 3.1.3.1. Phần khai báo Package. Một khai báo Package được dùng để cất giữ hàng loạt các khai báo dùng chung, chẳng hạn như các phần tử, các kiểu, các thủ tục, các hàm. Các khai báo này có thể nhập vào các đơn vị thiết kế khác bởi việc sử dụng một mệnh đề use. Ví dụ : package EXAMPLE_PACK is type SUMMER is ( MAY, JUN, JUL, AUG, SEP); component D_FLIP_FLOP port (D, CK:in BIT; Q, QBAR: out BIT) end component; constant PIN2PIN_DELAY:TIME:=125ns; function IN2BIT_VEC(INT_VALUE:INTEGER) return BIT_VECTOR; end EXAMPLE_PACK; ở ví dụ này tên của package được khai báo là EXAMPLE_PACK. Nó có chứa các khai báo kiểu, phần tử, hằng, và hàm. Lưu ý rằng hoạt động của hàm INT2BIT_VEC không xuất hiện ở trong khai báo gói, mà chỉ có giao tiếp của hàm xuất hiện. Việc định nghĩa, hay thân của hàm chỉ xuất hiện trong thân của đóng gói ( Body Package ). Giả sử rằng đóng gói này đã được dịch và tạo thành một thư viện thiết kế và được gọi là DESIGN _LIB . Xem xét việc dùng mệnh đề use để sử dụng chúng dưới đây: library DESIGN_LIB; [...]... trì giá trị của nó trong suốt thời gian chạy chương trình Do vì một quá trình không bao giờ được thoát ra trong mỗi trạng thái hoạt động của nó, nghĩa là chúng được thực thi, hoặc ở trong một trạng thái chờ Nếu ở trạng thái chờ thì chúng phải chờ cho đến khi một sự kiện khác chắc chắn xảy ra Một quá trình bắt đầu thực hiện tại điểm khởi đầu của một quá trình mô phỏng, tại thời điểm này nó được thực thi... - C; GT B; End Process; Tại lúc bắt đầu của quá trình mô phỏng Quá trình được thực thi một lần Biến EVENT_ON_A được gán giá trị -1 sau đó tăng lên 1 Sau đó, thời điểm bất kỳ xảy ra, sự kiện trên tín hiệu A, quá trình có hiệu lực và phát biểu gán biến đơn được thực thi Nó làm cho biến EVENT_ON_A tăng lên một Tại thời điểm kết thúc của quá trình mô phỏng, biến EVENT_ON_A chứa tổng số sự kiện xảy... thể xuất hiện bên trong hoặc bên ngoài một quá trình Nếu nó xảy ra bên ngoài của một quá trình, nó được xem là một phát biểu gán tín hiệu đồng thời Khi phát biểu gán tín hiệu xuất hiện bên trong quá trình, nó được xem như là một phát biểu gán tín hiệu có thứ tự và nó được thực thi tuần tự theo thứ tự của những phát biểu tuần tự khác xuất hiện bên trong quá trình Ví dụ phép gán tín hiệu trong một Process... xảy ra trên tín hiệu A tại thời điểm T2, giá trị của V2 được sử dụng trong phát biểu 1 sẽ cũng là 10 Một biến cũng có thể được khai báo bên ngoài một quá trình hoặc một chương trình con Một biến có thể được đọc và cập nhật bởi một hoặc có thể nhiều quá trình, những biến này được gọi là shared variable (Biến chia sẻ) 3.6.2 Phát biểu gán tín hiệu Phát biểu gán tín hiệu sẽ thay thế giá trị hiện tại của tín... biểu tuần tự Phát biểu tuần tự chỉ ra sự thực hiện từng bước của một quá trình Chúng thực hiện từ câu lệnh đầu tiên, câu lệnh thứ hai, câu lệnh cuối cùng Các phát biểu nằm trong một phát biểu quá trình ( Phát biểu Process ) được gọi là phát biểu tuần tự Các phát biểu sau đây là các phát biểu tuần tự được định nghĩa trong VHDL: - Các phát biểu gán biến Variable - Các phát biểu gán tín hiệu Signal... hai giá trị ( '0' , '1' ), VHDL định nghĩa chín khoảng trong gói chuẩn Chín giá trị bao gồm : type STD_LOGIC is ( 'U' không khởi tạo giá trị 'X' Không xác định '0' Kiểu mức thấp '1' Kiểu mức cao 'Z' Kiểu trở kháng cao 'W' Không xác định ở mức yếu 'L' Mức thấp yếu 'H' Mức cao yếu '_' Không quan tâm đến giá trị ); Tương tự như kiểu BIT và kiểu BIT_VECTOR, VHDL cung cấp một kiểu khác... dùng định nghĩa, nó có thể là tên của một hằng, một biến hay một tín hiệu, một Entity, một cổng, hay một chương trình con, hay các khai báo tham biến Khi khai báo một tên cần phải khai báo ký tự đầu tiên phải kiểu chữ ký tự, lưu ý dấu gạch dưới không được phép đứng sau cùng, các từ khoá của VHDL không được dùng để làm khai báo các kiểu định danh, chẳng hạn như entity, port Ví dụ : xyz = xYZ = XYZ =... của việc biên dịch VHDL là chúng được cất giữ bên trong các thư viện để dùng cho bước mô phỏng tiếp theo, điều này giống như việc sử dụng một phần tử đã được khai báo trong một thiết kế khác Một thư viện thiết kế có thể chứa các đơn vị thư viện như sau: - Các đóng gói (PACKAGES) - Các thực thể Entity - Các kiểu kiến trúc Architectures - Các phép định cấu hình Configurations Chú ý! VHDL không hỗ trợ... bên trong một phát biểu quá trình hay còn được gọi là phát biểu Process Một biến được gán một giá trị sử dụng thông qua phát biểu gán biến, mà phát biểu này có hình thức như sau: target_variable : = expression; Lưu ý các biến được khai báo trong một Process không thể chuyển giá trị ra ngoài Process, điều đó có nghĩa là chúng chỉ được cấp phát trong Process hoặc trong chương trình con Ví dụ về phép gán... lồng nhau! Để mở một thư viện và truy cập chúng như một Entity đã được biên dịch trong một thiết kế VHDL mới, điều đầu tiên cần làm là phải khai báo tên thư viện Cú pháp của chúng như sau: Library library_name : [path/directory_name]; Bạn có thể truy cập các đơn vị đã được biên dịch từ một thư viện VHDL tới ba mức như sau: library_name.Package_name.item_name Ví dụ: Giả sử chúng ta tạo một đóng gói . Sổ tay lập trình VHDL ebooks@free4vn.org Created by lythanhthuan@free4vn.org Giới thiệu ngôn ngữ VHDL 3.1. Các cấu trúc cơ bản của ngôn ngữ VHDL. . này hằng N được dùng để chỉ ra số bít của một bộ cộng. Trong quá trình mô phỏng hoặc quá trình tổng hợp, giá trị thực tế cho mỗi hằng dùng chung generic