1. Trang chủ
  2. » Khoa Học Tự Nhiên

Kiến thức cơ bản về VHDL

68 1,9K 18
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Kiến Thức Cơ Bản Về Vhdl
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Kỹ Thuật Phần Mềm
Thể loại bài viết
Năm xuất bản 1983
Thành phố thành phố hồ chí minh
Định dạng
Số trang 68
Dung lượng 598,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Nội Dung: 1. CÁC CẤU TRÚC CƠ BẢN CỦA NGÔN NGỮ VHDL 2. CÁC ĐỐI TƯỢNG DỮ LIỆU 3. CÁC KIỂU DỮ LIỆU 4. CÁC TOÁN TỬ 5. CÁC KIỂU TOÁN HẠNG 6. CÁC PHÁT BIỂU TUẦN TỰ 7. CÁC PHÁT BIỂU ĐỒNG THỜI

Trang 1

KIẾN THỨC CƠ BẢN VỀ VHDL

VHDL là viết tắt của cụm từ Very High Speed Intergrated Circuit HardwareDescription Language - ngôn ngữ mô tả phần cứng cho các mạch tích hợp tốc độrất cao VHDL là ngôn ngữ mô tả phần cứng được phát triển dùng cho chươngtrình VHSIC (Very High Speed Intergrated Circuit) của bộ quốc phòng Mỹ Mụctiêu của việc phát triển VHDL là có được một ngôn ngữ mô tả phần cứng tiêuchuẩn và thống nhất cho phép phát triển thử nghiệm các hệ thống số nhanh hơncũng như cho phép dễ dàng đưa các hệ thống đó vào ứng dụng trong thực tế Ngônngữ VHDL được ba công ty Intermetics, IBM và Texas Instruments bắt đầunghiên cứu phát triển vào 7/1983 Phiên bản đầu tiên được công bố vào 8/1985.Sau đó VHDL được đề xuất để tổ chức IEEE xem xét thành một tiêu chuẩn Năm

1987, đã đưa ra tiêu chuẩn về VHDL – tiêu chuẩn IEEE-1076-1987

VHDL được phát triển để giải quyết các khó khăn trong việc phát triển, thayđổi và lập tài liệu cho các hệ thống số Như ta đã biết, một hệ thống số có rất nhiềutài liệu mô tả Ðể có thể vận hành bảo trì sửa chữa một hệ thống ta cần tìm hiểu tàiliệu đó kỹ lưỡng Với một ngôn ngữ mô tả phần cứng thì việc xem xét các tài liệu

mô tả trở nên dễ dàng hơn vì bộ tài liệu đó có thể được thực thi để mô phỏng hoạtđộng của hệ thống Như thế ta có thể xem xét toàn bộ các phần tử của hệ thốnghoạt động trong một mô hình thống nhất

Trước khi VHDL ra đời, có nhiều ngôn ngữ mô tả phần cứng được sử dụngnhưng không có một tiêu chuẩn thống nhất Vì các ngôn ngữ mô phỏng phần cứng

đó được các nhà cung cấp thiết bị phát triển, nên mang các đặc trưng gắn với cácthiết bị của nhà cung cấp đó và thuộc sở hữu của nhà cung cấp

Trong khi đó, VHDL được phát triển như một ngôn ngữ độc lập không gắn vớibất kỳ một phương pháp thiết kế, bộ mô phỏng hay công nghệ phần cứng nào.Người thiết kế có thể tự do lựa chọn công nghệ, phương pháp thiết kế trong khivẫn sử dụng một ngôn ngữ duy nhất

VHDL có một số ưu điểm hơn hẳn các ngôn ngữ mô tả phần cứng khác là:

Tính công cộng: VHDL được phát triển dưới sự bảo trợ của chính phủ Mỹ

và hiện nay là một tiêu chuẩn của IEEE, VHDL không thuộc sở hữu của bất

kỳ cá nhân hay tổ chức nào Do đó VHDL được hỗ trợ của nhiều nhà sản

Trang 2

xuất thiết bị cũng như nhiều nhà cung cấp công cụ thiết kế mô phỏng hệthống Ðây là một ưu điểm nổi bật của VHDL, giúp VHDL trở nên ngàycàng phổ biến.

Khả năng hỗ trợ nhiều công nghệ và phương pháp thiết kế: VHDL cho

phép thiết kế bằng nhiều phương pháp như phương pháp thiết kế từ trênxuống, hay từ dưới lên dựa vào các thư viện có sẵn Như vậy VHDL có thểphục vụ tốt cho nhiều mục đích thiết kế khác nhau, từ việc thiết kế các phần

tử phổ biến đến việc thiết kế các IC ứng dụng đặc biệt (ApplicationSpecified IC)

Ðộc lập với công nghệ: VHDL hoàn toàn độc lập với công nghệ chế tạo

phần cứng Một mô tả hệ thống dùng VHDL thiết kế ở mức cổng có thểđược chuyển thành các bản tổng hợp mạch khác nhau tuỳ thuộc vào côngnghệ chế tạo phần cứng nào được sử dụng (dùng CMOS, nMOS, hayGaAs) Ðây cũng là một ưu điểm quan trọng của VHDL nó cho phép ngườithiết kế không cần quan tâm đến công nghệ phần cứng khi thiết kế hệthống, như thế khi có một công nghệ chế tạo phần cứng mới ra đời nó cóthể được áp dụng ngay cho các hệ thống đã thiết kế

Khả năng mô tả mở rộng: VHDL cho phép mô tả hoạt động của phần cứng

từ mức hệ thống số (hộp đen) cho đến mức cổng VHDL có khả năng mô tảhoạt động của hệ thống trên nhiều mức nhưng chỉ sử dụng một cú pháp chặtchẽ thống nhất cho mọi mức Như thế ta có thể mô phỏng một bản thiết kếbao gồm cả các hệ con được mô tả ở mức cao và các hệ con được mô tả chitiết

Khả năng trao đổi kết quả: Vì VHDL là một tiêu chuẩn được chấp nhận,

nên một mô hình VHDL có thể chạy trên mọi bộ mô phỏng đáp ứng đượctiêu chuẩn VHDL và các kết quả mô tả hệ thống có thể được trao đổi giữacác nhà thiết kế sử dụng công cụ thiết kế khác nhau nhưng cùng tuân theochuẩn VHDL Hơn nữa, một nhóm thiết kế có thể trao đổi mô tả mức caocủa các hệ thống con trong một hệ thống; trong khi các hệ con đó được thiết

kế độc lập

Khả năng hỗ trợ thiết kế mức lớn và khả năng sử dụng lại các thiết kế:

VHDL được phát triển như một ngôn ngữ lập trình bậc cao, vì vậy nó cóthể sử dụng để thiết kế một hệ thống lớn với sự tham gia của một nhóm

Trang 3

nhiều người Bên trong ngôn ngữ VHDL có nhiều tính năng hỗ trợ việcquản lý, thử nghiệm và chia sẻ thiết kế VHDL cũng cho phép dùng lại cácphần đã có sẵn.

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ămnhóm cơ bản như sau:

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ủaphầ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ủathự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àyvà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ácnhau 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ếtkế

Trang 4

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àicủa 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:

 [] : 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ằngdù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)

Trang 5

- 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ộthướ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ặcbên phải phép gán) Inout là một cổng hai hướng, còn Buffer là một cổngkhô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

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:

Trang 6

Hình 3.1: Thực thể FULL_ADDER 1bit.

Hình 3.1 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à COUTcũng mang kiểu dữ liệu là kiểu BIT Ngôn ngữ VHDL dùng để diễn tả giao diệnnà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àyhằng N được dùng để chỉ ra số bít của một bộ cộng Trong quá trình mô phỏnghoặ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;

Trang 7

Giao diện mô tả bộ cộng này như sau:

Hình 3.2: Thực thể FULL_ADDER 4 bit

3.1.2 Các kiểu kiến trúc (Achitecture)

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ềuhơ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 các phần: Khai báocác các tín hiệu, hằng, khai báo các kiểu, 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êngbiệ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ácquá 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à

Trang 8

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ộngvới tên là FULL_ADDER.

architecture BEHAVIOUR of FULL_ADDER is

(A='1' and B='0' and CIN='0') then

COUT <= '0' ;

(A='0' and B='1' and CIN='1') or

(A='1' and B='1' and CIN='0') then

3.1.2.2 Kiến trúc theo kiểu hoạt động của các luồng dữ liệu (Dataflow)

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ờicủ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ôngtin 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

Trang 9

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áccổng logic nguyên thủy

SUM <= S xor CIN after 10 ns;

COUT <= (A and B ) or (S and CIN) after 5ns;

end DATAFLOW;

3.1.2.2 Kiến trúc theo kiểu cấu trúc (Structure)

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 khaibá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ấutrú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

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

Trang 10

một Entity khác, mà Entity này bao gồm một cổng XOR và một cổng AND Giaotiếp của một bộ cộng HALF_ADDER có dạng như sau:

Hình 3.3: Giao tiếp bộ cộng HALF_ADDER.

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 đó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 haynhiều đơn vị thiết kế (hay các phần tử có thể dùng chung được) Nó có chứa cáckiể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ó cha 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);

Q, QBAR: out BIT)

Trang 11

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

được sử dụng Mệnh đề use tiếp theo sẽ lấy tất cả các khai báo có trong Package

EXAMPLE_PACK vào trong khai báo Entity của RX Có nghĩa là ta có thể chọnlựa các khai báo từ trong một các khai báo của một đóng gói vào trong một đơn vịthiết kế khác

Ví dụ :

library DESIGN_LIB;

use DESIGN_LIB.EXAMPLE_PACK.D_FLIP_FLOP;

use DESIGN_LIB.EXAMPLE_PACK.PIN2PIN_DELAY;

architecture RX_STRUCTURE of RX is

Hai mệnh đề use ở ví dụ này nhằm tạo ra khai báo cho D_FLIP_FLOP và khai báohằng cho PIN2PIN_DELAY được phép sử dụng trong thân kiến trúc

3.1.3.1 Phần khai báo thân Package

Sự khác biệt giữa khai báo Package và thân Package có cùng mục đích như khaibáo của một Entity và phần thân kiến trúc Architecture của chúng Cú pháp khaibáo của Package như sau:

Trang 12

Ví dụ:

package EX_PKG is

subtype INT8 is integer range 0 to 255;

constant zero : INT8:=0;

procedure Incrementer (variable Count : inout INT8);

end EX_PKG;

package body EX_PKG is

procedure Incrementer (variable Data : inout INT8) is

Trang 13

(Component) trong một thiết kế dạng cấu trúc Cú pháp khai báo củaConfiguration này như sau:

Configuration configuration_name of entity_name is

ta đã dịch hai thực thể HALF_ADDER và OR_GATE thành thư viện với tên làburcin và sử dụng chúng trong ví dụ trên

3.1.5 Các thư viện thiết kế

Kết quả 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

Trang 14

Chú ý! VHDL không hỗ trợ các thư viện theo thứ bậc Bạn có thể có nhiều thư

viện như theo ý muốn nhưng không được khai báo lồng nhau!

Để mở một thư viện và truy cập chúng như một Entity đã được biên dịch trongmộ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 bamức như sau:

library_name.Package_name.item_name

Ví dụ: Giả sử chúng ta tạo một đóng gói để cất một hằng mà hằng này được sử

dụng trong nhiều thiết kế, sau đó dịch nó và cất vào trong thư viện với tên làburcin

Package my_pkg is

constant delay: time:=10ns;

end my_pkg;

Tiếp đến chúng ta gọi my_pkg để sử dụng chúng trong thiết kế dưới đây:

architecture DATAFLOW of FULL_ADDER is

signal S : BIT;

begin

S <= A xor B;

SUM <= S xor CIN after burcin.my_pkg.delay;

COUT <= (A and B ) or (S and CIN) after 5ns;

end DATAFLOW;

3.2 CÁC ĐỐI TƯỢNG DỮ LIỆU

Một đối tượng dữ liệu giữ một giá trị của một kiểu nhất định Trong VHDL có balớp đối tượng dữ liệu :

Trang 15

3.2.1 Các hằng (Constants)

Một hằng nó là một đối tượng mà nó được khởi tạo để chỉ ra một giá trị cố định và

nó không bị thay đổi Khai báo hằng được phép khai báo trong các đóng gói, cácEntity, các kiến trúc, các chương trình con, các khối, và trong phát biểu của cácquá trình processes

Cú pháp khai báo chúng như sau:

Constant constant_name {,constant_name}: type [:= value];

Ví dụ:

constant YES : BOOLEAN:= TRUE;

constant CHAR7: BIT_VECTOR (4 downto 0 ):="00111";

variable X,Y : BIT;

variable TEMP: BIT_VECTOR (8 downto 0) ;

variable DELAY: INTERGER range 0 to 15:=5;

3.2.3 Các kiểu tín hiệu (Signals)

Tín hiệu được dùng để kết nối các Entity của thiết kế lại với nhau và trao đổi cácgiá trị biến đổi ở trong phát biểu process Chúng có thể được xem như các dây dẫnhay các bus nối ở trong mạch thực tế Tín hiệu có thể được khai báo trong cácđóng gói (Package), trong các khai báo Entity, trong khai báo kiến trúc(Architecture), trong các khối (Block) Với các tín hiệu được khai báo trong cácpackage thì tín hiệu này được gọi là tín hiệu toàn cục (các thiết kế có thể sử dụngchúng ), các tín hiệu được khai báo trong Entity là tín hiệu toàn cục trong mộtEntity, tương tự với tín hiệu được khai báo trong một kiến trúc, nó là tín hiệu dùngchung trong một kiến trúc đó

Cú pháp của chúng có dạng như sau:

Signal Signal_name {,signal_name}: type [:=value];

Ví dụ:

Trang 16

signal BEEP : BIT:= '0';

signal TEMP: STD_LOGIC_VECTOR (8 downto 0);

signal COUNT: INTEGER range 0 to 100 :=5;

3.3 CÁC KIỂU DỮ LIỆU

Tất cả các đối tượng dữ liệu trong VHDL cần phải được định nghĩa với một kiểu

dữ liệu Một khai báo kiểu phải chỉ ra tên và dải của kiểu đó Khai báo kiểu dữ liệuchúng được phép khai báo trong phần khai báo các đóng gói, trong phần khai báoEntity, trong phần khai báo kiến trúc, trong phần khai báo các chương trình con vàtrong phần khai báo các Process Các kiểu dữ liệu bao gồm các kiểu sau:

- Kiểu liệt kê

- Kiểu nguyên

- Các kiểu dữ liệu tiền định nghĩa

- Kiểu mảng

- Kiểu bản ghi

- Kiểu dữ liệu chuẩn logic

- Kiểu dữ liệu có dấu và không dấu

- Các kiểu phụ

3.3.1 Các kiểu liệt kê (ENUMERATION)

Một kiểu liệt kê được chỉ ra bởi việc liệt kê các giá trị cho phép của kiểu đó Tất cảcác giá trị được định nghĩa bởi người dùng có thể là các tên định danh, hoặc cáccác kiểu chữ ký tự Tên định danh thực chất là một tên do người dùng đặt ra,chẳng hạn như blue, ball, monday Kiểu chữ ký tự là kiểu của các ký tự có kèmtheo dấu nháy đơn, chẳng hạn như 'x', ' 0'

Cú pháp khai báo của chúng như sau:

Type type_name is (enumerattion_literal {, enumeration_literal});

Với type_name là một tên định danh và mỗi enumerattion_literal hoặc là một tênđịnh danh hoặc là một chữ ký tự

Trang 17

type STD_LOGIC is ('U','X','0','1','Z','W','L','H','_');

Mỗi một định danh trong một kiểu đều có một vị trí nhất định trong kiểu, chúngđược xác định bởi thứ tự xuất hiện của chúng trong kiểu đó Trong ví dụ trên, mặcđịnh RED có vị trí 0, ORANGE sẽ có vị trí 1 Nếu chúng ta khai báo một đốitượng dữ liệu với kiểu là COLOR và không định nghĩa giá trị khởi tạo thì đốitượng dữ liệu sẽ được khởi tạo mặc định ở vị trí đầu tiên của kiểu liệt kê (vị tríkhông), trong trường hợp này COLOR sẽ nhận giá trị RED

3.3.2 Kiểu nguyên

Kiểu nguyên là các kiểu số nguyên, chúng được dùng cho các phép tính, các chỉ

số, các điều khiển số vòng lặp Trong hầu hết các kiểu thực thi trong VHDL có dải

từ - 2,147,483,647 đến + 2,147,483,647 Cú pháp của chúng được khai báo nhưsau:

type type_name is range - 2,147,483,647 to + 2, 147, 483,647;

Ví dụ:

type INTEGER is range - 2,147,483,647 to + 2, 147, 483,647;

type COUNT is range 0 to 10;

3.3.3 Các kiểu dữ liệu tiền định nghĩa trong VHDL

IEEE định nghĩa hai gói dữ liệu STANDARD và TEXTIO trong thư viện STD.Mỗi một gói dữ liệu này có chứa một loạt các kiểu và các phép tính chuẩn Dướiđây là các kiểu dữ liệu được định nghĩa trong gói STANDARD:

- BOOLEAN: Một kiểu liệt kê với hai giá trị True và False, các thao tác Logic và

các phép toán quan hệ sẽ trả về giá trị Boolean

- BIT: Một kiểu liệt kê với hai giá trị '0' và '1', các phép tính logic có thể lấy và trả

về giá trị kiểu BIT

- CHARACTER: Kiểu liệt kê của các mã ASCII

- INTEGER: Được dùng để miêu tả các số âm và dơng Dải hoạt động của chúng

được ấn định từ - 2,147,438,647 đến 2,147,438,647 Các hàm toán học như cộng,trừ, nhân, chia được hỗ trợ kiểu nguyên

- NATURE: Các kiểu con của kiểu nguyên được dùng để miêu tả các số kiểu tự

nhiên (không âm)

- POSITIVE: Các kiểu con của kiểu nguyên được dùng để miêu tả các số dương

Trang 18

- BIT_VECTOR: Được dùng để miêu tả một mảng các giá trị kiểu BIT

- STRING: Một mảng các ký tự, một giá trị kiểu chuỗi được đi kèm bởi dấu nháy

kép

- REAL: Được dùng để mô tả các kiểu số thực, dải hoạt động từ -1.0E+38 đến

+1.0E+38

- Kiểu thời gian vật lý: Mô tả các giá trị thời gian được dùng trong mô phỏng

Có một vài kiểu dữ liệu được định nghĩa trong gói STANDARD như sau:

Type BOOLEAN is ( fase, true);

Type BIT is ( '0', '1' );

Type SEVERITY_LEVEL is (note, warning, error, failure );

Type INTEGER is range -2,147,483,648 to 2,147,483,648;

Type REAL is Range -1.0E38 to 1.0E38;

Type CHARACTER is (nul, soh, stx, eot, enq, ack, bel, );

3.3.4 Kiểu mảng

Kiểu mảng là kiểu của nhóm các phần tử có cùng kiểu giống nhau Có hai kiểumảng như sau:

- Kiểu mảng được gán kiểu

- Kiểu mảng không bị gán kiểu

Kiểu mảng bị gán kiểu là kiểu mà các chỉ số mảng của chúng được định nghĩatường minh

Cú pháp của chúng như sau:

type array_type_name is array (discrete_range) of subtype_indication;

Ở đây array_type_name là tên của kiểu mảng được ép kiểu, discrete_rangekiểu phụ của kiểu nguyên khác hoặc kiểu liệt kê, subtype_indication chính là kiểucủa mỗi phần tử của mảng

Kiểu mảng không bị gán kiểu là kiểu mà chỉ số mảng của chúng không bị chỉ ra,nhưng các kiểu chỉ số của chúng phải được chỉ ra Cú pháp của chúng được chỉ ranhư sau:

type array_type_name is array (type_name range <>) of subtype_indication;

Ví dụ:

type A1 is array ( 0 to 31) of INTEGER;

Trang 19

type Bit_Vector is arrray (NATURAL range <>) of BIT;

type STRING is array (POSITIVE range <>) of CHARACTER;

A1 là một mảng gồm ba hai phần tử mà trong đó mỗi phần tử là một kiểu nguyên.Một ví dụ khác chỉ ra kiểu Bit_vector và kiểu String được tạo ra trong chuẩn cácgói STANDARD

Xem ví dụ dưới đây:

type Mat is array (0 to 7, 0 to 3) of BIT;

constant ROM : MAT : = (( '0', '1', '0', '1'),

Ví dụ:

type DATE_TYPE is ( SUN, MON, TUE , WED , THR , FRI , SAT) ;

type HOLIDAY is

record

Trang 20

YEAR : INTEGER range 1900 to 1999;

end record ; signal S : HOLIDAY;

variable T1: integer range 1900 to 1999;

Tương tự như kiểu BIT và kiểu BIT_VECTOR, VHDL cung cấp một kiểu khácgọi là STD_LOGIC_VECTOR

Để sử dụng các định nghĩa và các hàm trong gói chuẩn logic, các phát biểu sauđây cần được phải khai báo đính kèm theo chương trình

Library IEEE;

USE IEEE.STD_LOGIC_1164.all;

Trang 21

3.3.7 Các kiểu dữ liệu có dấu và không dấu

Các kiểu dữ liệu có dấu và không dấu chúng được chỉ ra trong các gói chuẩnNUMERIC_BIT và NUMERIC_STD Các đối tượng với kiểu có dấu và khôngdấu chúng được hiểu như là các số nguyên binary không dấu và các đối tượng vớikiểu có dấu và chúng được dịch như các nguyên bù hai

Việc định nghĩa của các kiểu dữ liệu được chỉ ra như sau:

type signed is array (NATURAL range <>) of BIT/STD_LOGIC;

Các phát biểu dưới đây bao gồm các khai báo việc sử dụng của các kiểu dữ kiệu

có dấu và không dấu

Ví dụ:

subtype INT4 is INTEGER range 0 to 15;

subtype BIT_VECTOR6 is BIT_VECTOR (5 downto 0)

3.4 CÁC TOÁN TỬ

VHDL cung cấp 6 lớp toán tử , mỗi một toán tử có một mức ưu tiên nhất định Tất

cả các toán tử trong cùng một lớp thì có cùng một mức ưu tiên

Trang 22

Cùng kiểu Cùng kiểu Cùng kiểu

Relational _ operator

nor xor

=/=

arithmetic_operator

&

+-

Cùng kiểuCùng kiểu

-Bất kỳ kiểu số nàoBất kỳ kiểu số nàoarithmetic_operator *

/modrem

Cùng kiểuCùng kiểuintegerintegerMức ưu

tiên cao

nhất

arithmetic_operatorLogical_operator

**

absnot

Kiểu mũ integerBất kỳ kiểu số nàoCùng kiểu

Bảng 3.1: Các loại toán tử.

3.4.1 Các toán tử Logical

Các toán hạng cần phải là cùng kiểu và cùng độ dài

Ví dụ:

signal A,B : BIT_VECTOR (6 downto 0);

signal C,D,E,F,G: BIT;

A <= B and C ; Không xảy ra vì các toán hạng không cùng kiểu

Trang 23

D <= (E xor F) and (C xor G);

Ví dụ:

signal W: BIT_VECTOR (3 downto 0);

signal X: INTEGER range 0 to15;

signal Y,Z : UNSIGED (3 downto 0);

Z <= X + Y + Z;

Y <= Z (2 downto 0) & W(1);

"ABC" & "xyz" cho kết quả là : "ABCxyz"

"1010" & "1" cho kết quả là : "10101"

Trang 24

3.5.1 Kiểu chữ

Các kiểu chữ có thể chia ra thành hai nhóm chính :

Kiểu vô hướng:

Trang 25

3.5.1.3 Kiểu BIT

Kiểu bit là kiểu mô tả hai giá trị rời rạc bằng việc sử dụng các chữ ký tự '0' và '1'.Đôi khi các kiểu Bit này được dùng để tạo ra kiểu chữ bit một cách tường minhdùng để phân biệt chúng với các kiểu ký tự

Ví dụ: '1' , ' 0 ' , bit('1')

3.5.1.4 Kiểu BIT_VECTOR

Kiểu bit_vector là một mảng các bit mà chúng được đặt trong dấu nháy kép

Ví dụ: "01001111000" , x"00FFF0" , b"100010101" , o"277756"

Trong ví dụ trên chữ 'x' đợc dùng để diễn tả các giá trị số hexa, còn 'b' được dùng

để mô tả kiểu binary, còn 'o' được dùng cho hệ đếm cơ số 8

3.5.1.5 Kiểu chữ trong đóng gói chuẩn STD_LOGIC

Kiểu chữ logic chuẩn là một trong 9 giá trị được định nghĩa trong đóng gói chuẩn

và được đưa ra dưới dạng các chữ in hoa và đặt trong dấu ngoặc đơn

Ví dụ:

' U ' không trùng với ' u '

' X ' , ' 0 ' , ' 1 ' , ' Z ' , ' W ' , ' L ' , ' H ' , ' _ '

3.5.1.6 Kiểu chữ STD_LOGIC_VECTOR

Một kiểu chữ STD_LOGIC_VECTOR thực chất là một mảng bao gồm các phần

tử của kiểu std_logic và được đặt trong dấu ngoặc kép

Ví dụ: " 10_1Z" , " UUUUU " , signed("1011 ")

3.5.1.7 Kiểu Boolean

Kiểu Boolean được dùng để mô tả hai giá trị rời rạc, đó là kiểu true và false

Ví dụ: true , false , True , TRUE, FALSE

Trang 26

0.0 không được viết 0

Kiểu định danh đơn thuần chỉ là một cái tên do người 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ộtchươ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 khaibá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 đứngsau cùng, các từ khoá của VHDL không được dùng để làm khai báo các kiểu địnhdanh, chẳng hạn như entity, port

Ví dụ: xyz = xYZ = XYZ = XyZ

S(3) phần tử thứ ba của mảng S

3.5.3 Kiểu INDEX

Kiểu INDEX được sử dụng để chỉ ra một phần tử nào đó trong một mảng

Cú pháp sử dụng của khai báo này như sau:

array_name (expression)

Với array_name là một tên của một hằng hay một biến nào đó nằm trong mộtmảng Còn expression phải trả về giá trị nằm trong dải chỉ số của mảng đó

Ví dụ:

Trang 27

type memory is array ( 0 to 7 ) of INTEGER range 0 to 123;

variable DATA_ARRAY : memory;

variable ADDR : INTEGER range 0 to 7;

variable DATA: INTEGER range 0 to 123;

DATA:= DATA_ARRAY ( ADDR );

3.5.4 Kiểu Slice và ALIAS

Một khai báo Slice được dùng để chỉ ra một số phần tử của mảng Hướng của nócần phải phù hợp với hướng mảng Alias được dùng để tạo ra một tên mới cho tất

cả các phần tử hoặc một số phần tử nào đó nằm trong một mảng

Ví dụ:

variable A1: BIT_VECTOR ( 7 downto 0 );

A2: = A1(5 downto 2) ;

Alias A3: BIT_VECTOR (0 to 3) is A1(7 downto 4);

Có nghĩa là A3(0)=A1(7), A3(1)=A1(6), A3(2)=A1(5), A3(3)= A1(4)

Alias A4: BIT is A1(3);

3.5.5 Kiểu thuộc tính ATTRIBUTE

Lấy các thuộc tính cuả một biến hay một tín hiệu của một kiểu cho trước nào đó vàtrả về một kiểu giá trị Dưới đây là các kiểu thuộc tính thường dùng trong ngônngữ VHDL:

- Left: Trả về chỉ số của phần tử ở bên trái cùng của một kiểu dữ liệu

- Right: Trả về chỉ số của phần tử ở bên phải cùng của một kiểu dữ liệu

- High: Trả về chỉ số của phần tử cao nhất của một kiểu dữ liệu

- Low: Trả về chỉ số của phần tử thấp nhất của một kiểu dữ liệu

- Range: Được dùng để lấy về dải của chỉ số

- Reverse_range: Dùng để xác định dải chỉ số ngược lại

- Length: Trả về số phần tử của kiểu BIT_VECTOR

- Event: Mô tả sự thay đổi giá trị của tín hiệu tại thời điểm mô phỏng

Ví dụ:

variable A1 : BIT_VECTOR ( 10 downto 0 );

A1' left Trả về giá trị là 10

A1' right Trả về giá trị 0

A1' high Trả về giá trị là 10

Trang 28

A1' low Trả về giá trị là 0

A1' range Trả về là 10 downto 0

A1' reverse_range Trả về giá trị là 0 to 10

A1' length Trả về giá trị là 11

3.5.6 Kiểu tập hợp

Kiểu tập hợp có thể được dùng để gán giá trị cho một đối tượng thuộc kiểu mảnghoặc kiểu Record trong khi khởi tạo khai báo hoặc trong các phát biểu gán

Ví dụ:

type color_list ( red, orange, blue, white );

type color_array is array (color_list) of BIT_VECTOR ( 1 downto 0 ); variable X : color_array;

X := (" 00 " , " 01 " , " 10 " ," 11 " );

X := ( red => "00" , blue => "01" , orange => "10" , white => "11" );

Trong dòng thứ hai, chúng ta định nghĩa một mảng mà số các phần tử của chúng(dải chỉ số) được đưa ra bởi color_list Từ color_list chúng ta có một mảng gồmbốn phần tử và mảng color_array cũng sẽ bao gồm bốn phần tử, mà mỗi phần tửnày lại được định nghĩa bởi kiểu Bit_Vector Hơn nữa, chúng ta sử dụng dải chỉ sốcủa mảng color_list sẽ có dải từ 0 đến 3, vì việc định nghĩa của mảng này chỉ chỉ

ra dải chỉ số chứ không chỉ ra kiểu của phần tử trong mảng

3.5.7 Biểu thức gán kiểu

Biểu thức gán kiểu được dùng để chỉ ra kiểu của một toán hạng nào đó

Cú pháp của chúng như sau:

type_name' ( expression );

Ví dụ:

type color1 is (red, orange, blue, white);

type color2 is (purple, green, red, black);

color2'(red);

Như chúng ta thấy toán hạng red có cả trong hai kiểu color1 và color2, vì vậy nócần phải được gán một kiểu dữ liệu rõ ràng và điều này được thực hiện bởi câulệnh thứ 3

Trang 29

3.5.8 Phép chuyển đổi kiểu tín hiệu

Phép chuyển đổi kiểu cho phép chuyển đổi các kiểu có kiểu dữ liệu gần giốngnhau

Ví dụ:

signal X : STD_LOGIC_VECTOR ( 3 downto 0 );

signal Y : STD_ULOGIC_VECTOR ( 3 downto 0 );

Y <= STD_ULOGIC_VECTOR (X);

Sau câu lệnh thứ ba Y sẽ nhận kiểu STD_ULOGIC_VECTOR

3.6 CÁC PHÁT 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ằmtrong 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

Trang 30

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àiProcess, điều đó có nghĩa là chúng chỉ được cấp phát trong Process hoặc trongchương trình con

Ví dụ về phép gán biến trong một Process

Xem thí dụ về phát biểu Process như sau:

Ví dụ 1:

process(A)

variable EVENT_ON_A : INTEGER : = -1;

Trang 31

Một thí dụ khác của phát biểu quá trình :

Trang 32

đ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ếncũ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ữngbiế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 hiệu với một giá trị mớibởi việc sử dụng một biểu thức Tín hiệu và kết quả của biểu thức cần có cùng mộtkiểu dữ liệu

Cú pháp của chúng như sau:

target_signal <= [ Transport] expression [after time_expression]

Phát biểu gán tín hiệu có 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ínhiệ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ó đượcxem 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ự theothứ 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 (Với A,B,C,D là các tín hiệu):

Trang 33

Khi một phát biểu gán tín hiệu được thực thi, giá trị của biểu thức được tính toán

và giá trị này được chuẩn bị để gán cho tín hiệu sau khi delay Lưu ý rằng biểuthức được định lượng tại thời điểm phát biểu và không thực thi ngay mà nó sẽ thựcthi sau một thời gian giữ chậm Có hai kiểu Delay được cung cấp để chuẩn bị choviệc thực thi tín hiệu:

Xem ví dụ sau: Giả sử ta có một process và biểu đồ như sau:

Hình 3.4: Biểu đồ thời gian Transport Delay

Trang 34

Như ví dụ và biểu đồ trên ta thấy công việc thứ tư cần thực hiện trước công việcthứ 5, nhưng trong phần chương trình thì phát biểu của công việc thứ 5 lại đượcthực hiện trước công việc thứ tư Hình vẽ dưới đây mô tả phát biểu Transport, sau3s đèn sẽ được bật sáng và sáng trong khoảng thời gian đúng bằng thời gian bậtcông tắc

Hình 3.5: Mô tả Transport Delay.

b Inertial Delay

Inertial Delay (giữ chậm do quán tính), là giá trị mặc định của VHDL Nó đượcdùng cho các thiết bị mà không có phản ứng cho đến khi đầu vào được phép trongmột khoảng thời gian nhất định Thường thì với tín hiệu có khoảng thời gian tácđộng không đều và nhỏ hơn thời gian giữ chậm của các cổng thì sẽ bị bỏ qua Với ví dụ trên, mô tả hoạt động của đèn với độ giữ chậm do sức ì quán tính củamạch Nếu thời gian tác động của công tắc nhỏ hơn độ giữ chậm của mạch thì đầu

ra sẽ không có tác động hay đèn sẽ không được bật sáng Giả sử ta có câu lệnh đèn

sẽ được bật sáng sau 3 giây, nhưng công tắc chỉ tác động trong thời gian hai giâythì đèn sẽ không được bật sáng Xem hình vẽ 3.6 dưới đây:

Ngày đăng: 16/10/2012, 08:36

HÌNH ẢNH LIÊN QUAN

Hình 3.1: Thực thể FULL_ADDER 1bit. - Kiến thức cơ bản về VHDL
Hình 3.1 Thực thể FULL_ADDER 1bit (Trang 6)
Hình 3.2: Thực thể FULL_ADDER 4 bit. - Kiến thức cơ bản về VHDL
Hình 3.2 Thực thể FULL_ADDER 4 bit (Trang 7)
Hình 3.3: Giao tiếp bộ cộng HALF_ADDER. - Kiến thức cơ bản về VHDL
Hình 3.3 Giao tiếp bộ cộng HALF_ADDER (Trang 10)
Bảng 3.1: Các loại toán tử. - Kiến thức cơ bản về VHDL
Bảng 3.1 Các loại toán tử (Trang 22)
Hình 3.4: Biểu đồ thời gian Transport Delay - Kiến thức cơ bản về VHDL
Hình 3.4 Biểu đồ thời gian Transport Delay (Trang 33)
Hình 3.5: Mô tả Transport Delay. - Kiến thức cơ bản về VHDL
Hình 3.5 Mô tả Transport Delay (Trang 34)
Hình 3.6: Mô tả Inertial Delay (thời gian bật công tắc là 2s). - Kiến thức cơ bản về VHDL
Hình 3.6 Mô tả Inertial Delay (thời gian bật công tắc là 2s) (Trang 35)
Hình 3.7: Mô tả Inertial Delay (thời gian bật công tắc là 4s). - Kiến thức cơ bản về VHDL
Hình 3.7 Mô tả Inertial Delay (thời gian bật công tắc là 4s) (Trang 35)
Hình 3.8: So sánh Transport Delay và Inertial Delay. - Kiến thức cơ bản về VHDL
Hình 3.8 So sánh Transport Delay và Inertial Delay (Trang 36)
Hình 3.9: Thực thể D_FF. - Kiến thức cơ bản về VHDL
Hình 3.9 Thực thể D_FF (Trang 37)
Hình 3.10: Thực thể Programmable Gate. - Kiến thức cơ bản về VHDL
Hình 3.10 Thực thể Programmable Gate (Trang 39)
Hình 3.11: Phần giao diện component của bộ cộng Full_adder - Kiến thức cơ bản về VHDL
Hình 3.11 Phần giao diện component của bộ cộng Full_adder (Trang 62)
Hình 3.12: Các thành phần bên trong bộ Full_adder. - Kiến thức cơ bản về VHDL
Hình 3.12 Các thành phần bên trong bộ Full_adder (Trang 62)
Hình 3.13: Bộ cộng 4 bit. - Kiến thức cơ bản về VHDL
Hình 3.13 Bộ cộng 4 bit (Trang 65)
Hình 3.14: Sơ đồ bộ cộng bốn bit sử dụng một bộ cộng - Kiến thức cơ bản về VHDL
Hình 3.14 Sơ đồ bộ cộng bốn bit sử dụng một bộ cộng (Trang 66)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w