1. Trang chủ
  2. » Công Nghệ Thông Tin

Sổ tay lập trình VHDL

87 1,4K 15
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

Định dạng
Số trang 87
Dung lượng 389,75 KB

Nội dung

Sổ tay lập trình VHDL

Trang 1

Sổ tay lập trình VHDL

ebooks@free4vn.org

Created by lythanhthuan@free4vn.org

Trang 2

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: 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ế

Trang 3

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:

[] : 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

Trang 4

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

Trang 5

begin

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 )

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;

Trang 6

SUM, COUT : out BIT );

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:

CIN COUT

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 )

Trang 7

- 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

Trang 8

COUT <= '0' ;

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

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ỷ

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à

Trang 9

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);

X1

A1 L1

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

Trang 10

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);

port (D, CK:in BIT;

Q, QBAR: out BIT)

ở 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;

Trang 11

use DESIGN_LIB.EXAMPLE_PACK.all

Entity RX is

Mệnh đề library DESIGN_LIB cho phép thư viện thiết kế DESIGN_LIB

được phép dùng trong phần mô tả này, điều đó có nghĩa là tên DESIGN_LIB

có thể đượ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ọn lự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áo hằng cho PIN2PIN_DELAY được phép sử dụng trong thân kiến trúc

3.1.3.2 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ư khai báo của một Entity và phần thân kiến trúc Architecture của chúng

Cú pháp khai báo của Package được khai báo như sau:

Trang 12

khai b¸o cña chóng, h¬n n÷a mét phÇn khai b¸o package lu«n cã Ýt nhÊt mét phÇn th©n package kÕt hîp víi chóng

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

Configuration configuration_name of entity_name is

{configuration_decalarative_part}

For block_specification

{use_cluse}

{configuration_item}

Trang 13

end for;

Với một Entity của bộ cộng FULL_ADDER như đã giới thiệu ở phần trên, ở ví dụ này ta có thể sử dụng chúng trong phép định cấu hình như sau: configuration FADD_CONFIG of FULL_ADDER is

ở đây tên của phép định cấu hình là tuỳ ý, ở ví dụ này ta lấy tên là

FADD_CONFIG, còn với dòng lệnh For STRUCTURE chỉ ra kiến trúc

được định cấu hình và được sử dụng với thực thể Entity FULL_ADDER Giả

sử rằng chúng 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:

Trang 14

Để 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 để 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

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

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

Trang 15

- Các tín hiệu ( Signals )

Lớp cuả một đối tượng được chỉ ra bởi một từ khoá và nó được chỉ ra ở

điểm bắt đầu của một khai báo

3.2.1 Các hằng ( Constant ):

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ác Entity, 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ác quá 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 ( Signal ):

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ác giá trị biến đổi ở trong phát biểu process Chúng có thể được xem như các dây dẫn hay 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,

Trang 16

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ác package 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ụng chúng ), các tín hiệu được khai báo trong Entity là tín hiệu toàn cục trong một Entity, 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ùng chung 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ụ :

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ệu chúng được phép khai báo trong phần khai báo các đóng gói, trong phần khai báo Entity, 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 dữ liệu chuẩn logic

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

- Các kiểu phụ

Trang 17

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ác cá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èm theo dấu ngoặc đơn, chẳng hạn như 'x', ' 0'

Cú pháp khai báo cảu 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

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 cuả 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 đối tượng dữ liệu với kiểu là COLOR và không định nghĩa giá trị khởi tạo thì đối tượ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

Trang 18

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 STANDART 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

- 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 ngoặc kép

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

Trang 19

từ 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 -2147483648 to 2147483648;

Type REAL is Range -1.0E38 to 1.0E38;

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

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_range kiểu phụ của kiểu nguyên khác hoặc kiểu liệt kê, subtype_indication chính là kiểu củ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ỉ ra như sau:

type array_type_name is array (type_name range <>) of

Trang 20

subtype_indication;

Ví dụ :

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

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ác gói STANDARD

Ví dụ : subtype B1 is BIT_VECTOR ( 3 downto 0);

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

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

Trang 21

nhau PhÇn tö cña Record bao gåm c¸c phÇn tö cña bÊt cø kiÓu nµo, nã cã thÓ lµ c¸c kiÓu m¶ng hoÆc kiÓu Record

VÝ dô :

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

record

YEAR : INTEGER range 1900 to 1999;

MONTH : INTEGER range 1 to 12 ;

DAY : INTEGER range 1 to 31;

Trang 22

3.3.7 Các kiểu dữ liệu không dấu và có 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ẩn NUMERIC_BIT và NUMERIC_STD Các đối tượng với kiểu có dấu

và không dấ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ới kiể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

Trang 23

NATURAL và kiểu POSITIVE là một kiểu phụ hay kiểu con của kiểu nguyên và chúng có thể được dùng với bất kỳ một hàm nguyên nào

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

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

= /=

Trang 24

concatenation_operator arithmetic_operator

&

+

-

Cùng kiểu Cùng kiểu arithmetic_operator +

-

Bất kỳ kiểu số nào Bất kỳ kiểu số nào arithmetic_operator *

/ mod rem

Cùng kiểu Cùng kiểu integer integer Mức

ưu tiên

cao

nhất

arithmetic_operator Logical_operator

**

abs not

Kiểu mũ integer Bất kỳ kiểu số nào Cùng kiểu

3.4.1 Các toán tử logical

Kiểu toán tử logic không chấp nhận các toán hạng là các kiểu tiền định nghĩa như kiểu BIT, BOOLEAN và các kiểu mảng các bit, 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

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

3.4.2 Các toán tử quan hệ

Các toán tử quan hệ cho ta kết quả có kiểu Boolean, các toán hạng cần phải có cùng kiểu và cùng độ dài

Ví dụ :

Trang 25

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

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 26

- Các biểu thức chuyển đổi

Ví dụ : 'A' , 'a' , '1'

Kiểu chữ ký tự không phải là kiểu bit ký tự như '1' hoặc kiểu nguyên 1, vì vậy kiểu chữ lý tự cần phải được cung cấp một tên kiểu nào đó

3.5.1.3 Kiểu chuỗi

Một kiểu chuỗi ký tự thực chất là một mảng các ký tự Một chuỗi các

Trang 27

ký tự được định nghĩa trong một dấu ngoặc kép

Ví dụ : "A" , " hold time error ", " x "

3.5.1.4 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 minh dùng để phân biệt chúng với các kiểu ký tự

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

3.5.1.6 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

Trang 28

Một kiểu vật lý duy nhất được định nghĩa trước trong đóng gói chuẩn,

đó là thời gian time

Ví dụ : 10 ns , 100 us , 6.3 ns Chú ý phần số phải được viết cách phần đơn vị đo bởi một khoảng trống

3.5.2 Các kiểu định danh:

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ộ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 = XyZ

Trang 29

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ột mảng Còn expression phải trả về giá trị nằm trong dải chỉ số của

mảng đó

Ví dụ :

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 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

Trang 30

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ôn ngữ 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

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ảng hoặ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" );

Trang 31

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ồm bố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

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 được 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âu lệnh thứ 3

3.5.8 Phép chuyển đổi kiểu dữ liệ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ống nhau

Ví dụ : signal X : STD_LOGIC_VECTOR ( 3 downto 0 );

signal Y : STD_ULOGIC_VECTOR ( 3 downto 0 );

Trang 32

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

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 biến trong một Process

Trang 33

Biểu thức được xác định giá trị khi phát biểu được thực thi và giá trị

được tính toán sẽ được gán cho biến một cách tức thời

Biến được tạo tại thời điểm sản sinh và duy 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 cho đến khi gặp một phát biểu wait hoặc gặp các thành phần được khai báo trong danh mục cần được

xử lý khai báo trong Process

Trang 34

Xem thÝ dô vÒ ph¸t biÓu Process nh­ sau:

Mét thÝ dô kh¸c cña ph¸t biÓu qu¸ tr×nh :

Trang 35

được gán giá trị là 10, trong phát biểu thứ 3, sau đó một sự kiện 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ẻ)

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í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 (Với A,B,C,D là các tín hiệu):

Trang 36

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ểu thứ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ực thi sau một thời gian giữ chậm Có hai kiểu Delay được cung cấp để chuẩn bị cho việc thực thi tín hiệu:

Trang 37

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

đúng bằng thời gian bật công tắc

Trang 38

b.Inertial Delay

Inertial Delay ( Gĩư chậm do quán tính ), là giá trị mặc định của

VHDL Nó được dùng cho các thiết bị mà không có phản ứng cho đến khi

đầu vào được phép trong mộ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ủa mạ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ây thì đèn sẽ không được bật sáng Xem hình vẽ dưới đây:

Trang 39

Giả sử ta có câu lệnh bật đèn sau 3s Khi bật công tắc trong thời gian 4s sau đó tắt công tắc, thì đèn sẽ được sáng sau khi công tắc bật được 3s và sáng trong 4s đúng bằng thời gian bật công tắc

Xem hình dưới đây:

Trang 40

c So sánh INERTIAL DELAY và TRANSPORT DELAY

10ns 20ns 30ns 40ns

Transport Delay

S <= Transport A after 20 ns

Như trên hình ta thấy trong trường hợp Inertial Delay, tín hiệu A có tác

động trong khoảng 10ns, nhưng câu lệnh thực hiện đầu ra S sau 20ns, vì vậy

đầu ra S sẽ không có tác động Còn trong trường hợp Transport Delay tín hiệu đầu ra sẽ được sao y tín hiệu đầu vào sau khi bắt đầu sườn lên của tín hiệu vào có tác động ( Đúng bằng khoảng 20 ns của câu lệnh )

Ngày đăng: 17/08/2012, 09:04

HÌNH ẢNH LIÊN QUAN

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 - Sổ tay lập trình VHDL
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 (Trang 5)
Sơ đồ bộ cộng bốn bit sử dụng một bộ cộng   Half_ADDER và ba bộ cộng FULL_ADDER - Sổ tay lập trình VHDL
Sơ đồ b ộ cộng bốn bit sử dụng một bộ cộng Half_ADDER và ba bộ cộng FULL_ADDER (Trang 73)

TỪ KHÓA LIÊN QUAN

w