Skip to content Skip to navigation

Connexions

You are here: Home » Content » Đối tượng và kiểu dữ liệu trong VHDL

Navigation

Lenses

What is a lens?

Definition of a lens

Lenses

A lens is a custom view of the content in the repository. You can think of it as a fancy kind of list that will let you see content through the eyes of organizations and people you trust.

What is in a lens?

Lens makers point to materials (modules and collections), creating a guide that includes their own comments and descriptive tags about the content.

Who can create a lens?

Any individual member, a community, or a respected organization.

What are tags? tag icon

Tags are descriptors added by lens makers to help label content, attaching a vocabulary that is meaningful in the context of the lens.

This content is ...

Affiliated with (What does "Affiliated with" mean?)

This content is either by members of the organizations listed or about topics related to the organizations listed. Click each link to see a list of all content affiliated with the organization.
  • VOCW

    This module is included inLens: Vietnam OpenCourseWare's Lens
    By: Vietnam OpenCourseWare

    Click the "VOCW" link to see all content affiliated with them.

Recently Viewed

This feature requires Javascript to be enabled.
Download
x

Download module as:

  • PDF
  • EPUB (what's this?)

    What is an EPUB file?

    EPUB is an electronic book format that can be read on a variety of mobile devices.

    Downloading to a reading device

    For detailed instructions on how to download this content's EPUB to your specific device, click the "(what's this?)" link.

  • More downloads ...
Reuse / Edit
x

Module:

Add to a lens
x

Add module to:

Add to Favorites
x

Add module to:

 

Đối tượng và kiểu dữ liệu trong VHDL

Module by: Do Manh Ha. E-mail the author

Summary: Trình bày khái niệm, cú pháp và ứng dụng của của các đối tượng thiết kế sử dụng trong VHDL (tín hiệu - signal, biến - variable, hằng - constant) và các kiểu dữ liệu cơ bản được sử dụng cho các đối tượng thiết kế đó.

1. Đối tượng trong VHDL

Trong ngôn ngữ VHDL gồm có 3 đối tượng là: tín hiệu - signal, biến - variable, hằng - constant, mỗi đối tượng được khai báo dựa vào từ khóa tương ứng và chúng có mục đích sử dụng như sau:

+ Tín hiệu – Signal: là đối tượng để biểu diễn đường kết nối các giữa các cổng vào/ra của thực thể, giữa các cổng vào/ra của các khối thành phần phần cứng xuất hiện trong thực thể… Chúng là phương tiện truyền dữ liệu động giữa các thành phần của thực thể.

Tín hiệu có tính toàn cục rất cao, chúng có thể được khai báo trong package (tín hiệu toàn cục, được sử dụng bởi một số thực thể), khai báo trong thực thể - Entity (tín hiệu nội bộ dùng trong thực thể, có thể được tham chiếu bởi bất kỳ kiến trúc nào của thực thể đó), khai báo trong kiến trúc – Architecture (tín hiệu nội bộ dùng trong kiến trúc, có thể được sử dụng trong bất cứ cấu trúc lệnh nào trong kiến trúc). Các tín hiệu có thể được sử dụng nhưng không được khai báo trong tiến trình – process, trong chương trình con. Vì tiến trình và chương trình con là thành phần cơ sở của mô hình và chúng được coi như các hộp đen. Cú pháp khai báo tín hiệu như sau:

Signal tên_tín_hiệu {,tên_tín_hiệu}:kiểu_dữ_liệu [:=giá_trị_khởi_tạo];

Ví dụ: Signal a,b,c: Bit:=’1’;

Signal y, reg: std_logic_vector(3 downto 0):=”0000”;

+ Biến – Variable: là đối tượng cục bộ được sử dụng để chứa các kết quả trung gian. Biến chỉ được khai báo và sử dụng trong process và trong chương trình con. Cú pháp khai báo của biến cũng tương tự như khai báo tín hiệu:

Variable tên_biến {,tên_biến}: kiểu_dữ_liệu [:=giá_trị_khởi_tạo];

Ví dụ: variable x: Bit:=’1’;

variable Q: std_logic_vector(3 downto 0);

Nếu không được khởi tạo giá trị ban đầu biến sẽ nhận giá trị khởi tạo ban đầu là giá trị thấp nhất trong các giá trị thuộc miền xác định của kiểu dữ liệu. Tín hiệu cũng có thể chứa dữ liệu nhưng chúng lại không được sử dụng vì những lý do sau:

  • Việc sử dụng biến hiệu quả hơn vì giá trị của biến được gán ngay lập tức trong process khi tín hiện chỉ được lập kế hoạch để thực hiện và chỉ được cập nhật toàn bộ sau khi kết thúc process.
  • Biến chiếm ít bộ nhớ hơn trong khi tín hiệu cần nhiều thông tin để có thể lập kế hoạch thực hiện cũng như để chứa các thuộc tính của tín hiệu.
  • Sử dụng tín hiệu yêu cầu có lệnh wait để thực hiện đồng bộ phép gán tín hiệu với phép lặp thực hiện theo cách sử dụng quen thuộc.

+ Hằng –constant: là đối tượng hằng được gán cho các giá trị cụ thể của một kiểu khi được tạo ra và không đổi trong toàn bộ quá trình thực hiện. Hằng cũng có tính toàn cục giống như tín hiệu và có thể được khai báo trong package, entity, architecture, proceduce, process… Cú pháp khai báo hằng:

constant tên_hằng {,tên_hằng} : kiểu_dữ_liệu := giá_trị_khởi_tạo;

Ví dụ: constant GND: std_logic:=’0’;

constant PI: real:=3.1414;

Tóm lại: Các đối tượng trong VHDL có mục đích sử dụng, phạm vi sử dụng khác nhau, nhưng chúng có cú pháp khai báo chung như sau:

Đối_tượng tên_đối_tượng: kiểu_dữ_liệu {:=giá_trị_khởi_tạo}

Các đối tượng khi khai báo phải được xác định kiểu dữ liệu tương ứng. VDHL định nghĩa nhiều kiểu dữ liệu khác nhau để phù hợp với việc mô tả, thiết kế, mô phỏng các hệ thống số khác nhau trong thực tế.

2. Kiểu dữ liệu trong VHDL

Trong VHDL có 4 dạng dữ liệu:

  • Vô hướng: gồm các dữ liệu có giá trị đơn như bit, boolean, integer, real, physical, character, std_logic và std_ulogic, enumerated (kiểu liệt kê)...
  • Kiểu ghép: các dữ liệu dưới dạng một nhóm các thành phần như mảng, bảng ghi (record). Bit_logic_vector, std_logic_vector và String đều là những dạng dữ liệu ghép đã được định nghĩa sẵn.
  • 2-D Arrays: các dữ liệu có dạng mảng 2 chiều, được tạo nên từ 1 mảng của một mảng 1 chiều ( hay một bản ghi).
  • VHDL Subtypes: dạng dữ liệu con do người dùng tự định nghĩa dựa trên những dạng có sẵn.

Các kiểu dữ liệu đã được định nghĩa trong gói Standard chứa trong thư viện chuẩn Standard Library của VHDL là: bit, boolean, integer, real, physical, character, std_logic and std_ulogic, Bit_logic_vector, std_logic_vector và String và một số kiểu dữ liệu con. Cú pháp chung định nghĩa kiểu dữ liệu như sau:

Type Tên_kiểu is giới_hạn_giá_trị_của_kiểu

a. Kiểu vô hướng

- Kiểu Bit: Kiểu liệt kê với 2 giá trị ‘0’ và ‘1’. Kiểu Bit đã được định nghĩa như sau:

Type Bit is (‘0’, ‘1’);

- Kiểu Boolean: Kiểu liệt kê với 2 giá trị false và true. Kiểu Boolean đã được định nghĩa như sau: Type Boolean is (false, true);

- Kiểu Integer: Kiểu số nguyên với những giá trị dương hoặc âm, độ lớn mặc định là 32 bit với giới hạn giá trị: từ -2147483647 đến +2147483647. Khi sử dụng có thể giới hạn miền xác định theo giới hạn giảm dần dùng từ khóa downto hoặc tăng dần dùng từ khóa to:

signal A: integer range 0 to 7; -- A số nguyên 3 bit

variable B: integer range 15 downto 0; -- B số nguyên 4 bit

signal B: integer range 15 downto -15; -- B số nguyên 5 bit

Các cách biểu diễn số nguyên dạng thập phân:

+ digit[underline]digit, ví dụ: 0, 1, 123_456_789 , -123_5678…

+ digit(E)digit, ví dụ: 987E6 (=987.106­)…

Các cách biểu diễn dưới dạng cơ số xác định:

+ base#based_integer#[exponent], ví dụ: 2#1100_0100#, 16#C4#, 4#301#E1, (=196)

- Kiểu Real: Kiểu số thực có giới hạn từ -1.0E+38 đến 1.0E+38, khác với kiểu integer kiểu số thực khi sử dụng thường được định nghĩa thành kiểu dữ liệu riêng và có giới hạn miền xác định:

signal a: Real:=-123E-4;

type CAPACITY is range -25.0 to 25.0 ;

signal Sig_1: CAPACITY:= 3.0 ;

type PROBABILITY is range 1.0 downto 0.0;

constant P: PROBABILITY:= 0.5 ;

Các cách biểu diễn số thực:

+ Biểu diễn dưới dạng thập phân: integer[.integer][exponent],

ví dụ: 0.0, 0.5, 1.1234_5678, 12.4E-9…

+ Biểu diễn dưới dạng cơ số xác định:

base#based_integer[.based_integer ]#[exponent]

Ví dụ: 2#1.111_1111_111#E+11, 16#F.FF#E2 (=4095.0)

- Kiểu Character: Kiểu kiểu ký tự, liệt kê với miền xác định là tập hợp các ký tự ASCII. Biểu diễn của giá trị Character: ‘A’, ‘a’, ‘*’, ‘ ‘, NUL, ESC…

- Kiểu Vật lý – Physical: được sử dụng để biểu diễn các đại lượng vật lý như khoảng cách, điện trở, dòng điện, thời gian… Kiểu vật lý cung cấp đơn vi cơ bản và các đơn vị kế tiếp được định nghịa theo đơn vị cơ bản, đơn vị nhỏ nhất có thể biểu diễn được là đơn vị cơ bản. Trong thực việc chuẩn Time (kiểu dữ liệu thời gian) là kiểu vật lý duy nhất đã được định nghĩa.

type Time is range <xác_định giới hạn>

Ví dụ sử dụng:constant Tpd: time:= 3ns ;...Z <= A after Tpd ; units

fs; -- Đơn vị cơ bản

ps = 1000 fs;

ns = 1000 ps;

us = 1000 ns;

ms = 1000 us;

sec = 1000 ms;

min = 60 sec;

hr = 60 min;

End Units;

- Kiểu std_logic và std_ulogic: kiểu dữ liệu logic nhiều mức đã được định nghĩa trong gói std_logic_1164, so với kiểu Bit thì chúng có thể mô tả chính xác và chi tiết hơn cho các phần cứng số, chúng còn xác định được cường độ khác nhau của các tín hiệu.

Bảng 1
type std_ulogic is ( ‘U’,-- UninitializeX’, -- Forcing Unknown‘0’, -- Forcing Zero‘1’, -- Forcing One‘Z’, -- High Impedance‘W’, -- Weak Unknown‘L’, -- Weak Zero‘H’, -- Weak One‘-‘ -- Don’t Care) ; type std_logic is ( ‘U’, -- UninitializeX’, -- Forcing Unknown‘0’, -- Forcing Zero‘1’, -- Forcing One‘Z’, -- High Impedance‘W’, -- Weak Unknown‘L’, -- Weak Zero‘H’, -- Weak One‘-‘ -- Don’t Care) ;

Hai kiểu dữ liệu std_logic và std_ulogic tương tự nhau, chúng chỉ khác nhau ở chỗ là kiểu std_ulogic không có hàm phân dải (unresolved) – hàm quyết định giá trị tín hiệu, do đó sẽ có lỗi khi các tín hiệu kiểu std_ulogic được nối chung vào 1 điểm. Thư viện cũng cung cấp hàm phát hiện lỗi này của các tín hiệu kiểu std_ulogic.

signal A,B,C,Res_Out: std_logic ;signal Out_1: std_ulogic ;Out_1 <= A ;Out_1 <= B ;Out_1 <= C ;CBARes_Out <= A;Res_Out <= B;Res_Out <= C;Res_OutCBAOut_1XCó lỗiThực hiện được

(Ký hiệu “<=” dùng ở trên là lệnh gán tín hiệu, lệnh gán tín hiệu thực hiện được với 2 dữ liệu cùng kiểu, cùng độ lớn, giá trị của tín hiệu bên phải sẽ được gán cho tín hiệu bên trái).

- Kiểu dữ liệu liệt kê tự định nghĩa: Kiểu dữ liệu liệt kê, do người sử dụng tự định nghĩa, cho phép mô tả rất sáng sủa, và linh hoạt cho các mô hình phần cứng số với mức độ trừu tượng cao. Kiểu dữ liệu này dùng nhiều mô tả đồ hình trạng thái, các hệ thống phức tạp…

Ví dụ:

type My_State is( RST, LOAD, FETCH, STOR, SHIFT) ;

. . .

signal STATE, NEXT_STATE: My_State ;

b. Kiểu dữ liệu ghép

Tương tự các ngôn ngữ lập trình, VHDL cũng có các kiểu dữ liệu ghép là nhóm các phần tử dữ liệu theo dạng mảng (array) hoặc bảng ghi (record).

+ Mảng – Array:

Mảng là nhóm nhiều phần tử có cùng kiểu dữ liệu với nhau thành đối tượng duy nhất. Mỗi phần tử của mảng có thể được truy cập bằng một hoặc nhiều chỉ số của mảng. Cú pháp định nghĩa kiểu dữ liệu mảng như sau:

Type tên_mảng is array (khoảng _của _chỉ số) of kiểu_của_phần_tử;

Ví dụ một số cách khai báo và sử dụng dữ liệu mảng:

type WORD is array (3 downto 0) of std_logic ;

signal B_bus: WORD ;

type DATA is array (3 downto 0) of integer range 0 to 9 ;

signal C_bus: DATA ;

Các kiểu dữ liệu mảng đã được định nghĩa trong thư viện chuẩn của VHDL là: Bit_logic_vector (mảng dữ liệu kiểu Bit), std_logic_vector (mảng dữ liệu kiểu std_logic) và String (mảng dữ liệu kiểu Chacracter). Một số ví dụ sử dụng các kiểu dữ liệu này như sau:

signal My_BusA, My_BusB: bit_vector (3 downto 0);

signal My_BusC: bit_vector (0 to 3) ;

signal Data_Word: std_logic_vector (11 downto 0);

variable Warning2: string(1 to 30):= “Unstable, Aborting Now”;

constant Warning3: string(1 to 20):= “Entering FSM State2”;

Một số phép toán thao tác với phần tử mảng:

- Phép gán cho mảng: 2 mảng phải cùng kiểu, cùng độ lớn, phép gán sẽ thực hiện gán theo từng phần tử theo thứ tự từ trái sang phải:

Data_Word <= ”101001101111” ;

Data_Word <= X”A6F”;

Data_Word <= O”5157”;

Data_Word <= B”1010_0110_1111” ;

Cách biểu diễn số liệu bit_vector và std_logic_vector: B|O|X ”giá_trị” (dùng dấu nháy kép). Trong đó B: Binary -Kiểu nhị phân, O: Octal - kiểu bát phân, X: hexadecimal.

X”1AF”=B”0001_1010_1111”= B”000_110_101_111”=O”0657”

- Phép gộp ( ): cho phép nhóm cả dữ liệu vô hướng và dữ liệu mảng để thuận tiện cho các phép gán cho mảng:

signal H_BYTE, L_BYTE: std_logic_vector ( 0 to 7);

signal Q_Out: std_logic_vector (31 downto 0);

signal A, B, C, D : std_logic;

signal WORD: std_logic_vector (3 downto 0);

...

(A,B,C,D)<=WORD;

Chú ý: Phép gộp ở vế bên trái chỉ dùng với kiểu dữ liệu vô hướng.

WORD <= ( 2 => ‘1’, 3 => D, others => ‘0’ ) ;

Q_Out <= (others => ‘0’) ;

WORD <= ( A, B, C, D ) ;

H_Byte <= (7|6|0=>’1’, 2 to 5 => ‘0’ );

L_Byte <= (3=>’1’, 1 to 2 => ‘0’, 4 to 7 => ‘1’);

Chú ý: “others” có thể được sử dụng khi gán mặc định, nó có ý nghĩa là các tất cả các phần tử còn lại được gán bằng một giá trị nào đó) .

+ Bảng ghi – Record:

Bảng ghi là nhóm nhiều phần tử có kiểu dữ liệu khác nhau thành đối tượng duy nhất.

  • Mỗi phần tử của bản ghi được truy nhập tới theo tên trường.
  • Các phần tử của bản ghi có thể nhận mọi kiểu của ngôn ngữ VHDL kể cả mảng và bảng ghi.

3012My_BusAMy_BusBMy_BusB <= My_BusA ;30123012My_BusAMy_BusBMy_BusC <= My_BusA ;0;2

Ví dụ định nghĩa kiểu dữ liệu bảng ghi như sau:

type OPCODE is record

PARITY : bit;

ADDRESS: std_logic_vector ( 0 to 3 );

DATA_BYTE: std_logic_vector ( 7 downto 0 );

NUM_VALUE: integer range 0 to 6;

STOP_BITS: bit_vector (1 downto 0);

end record ;

. . .

signal TX_PACKET, RX_PACKET : OPCODE;

PARITYADDRESSDATA_BYTENUM_VALUESTOP_BITS;Cách truy nhập và gán dữ liệu cho các trường của bản ghi: Các phần tử của bản ghi được truy nhập theo tên bản ghi và tên trường, 2 thành phần này được ngăn cách bởi dấu ‘.’

TX_PACKET <= ( ‘1’,”0011”,”11101010”,5,”10” ) ;

TX_PACKET.ADDRESS <= (“0011”);

TX_PACKET <= RX_PACKET;

TX_PACKET.ADDRESS <= RX_PACKET.ADDRESS;

c. Kiểu dữ liệu mảng 2 chiều (2-D Array)

Mảng 2 chiều là kiểu dữ liệu mảng của các phần tử mạng một chiều hay bảng ghi. Một số ví dụ định nghĩa và khai báo kiểu dữ liệu mảng 2 chiều như sau:

type Mem_Array is array (0 to 3) of std_logic_vector (7 downto 0);

type Data_Array is array ( 0 to 2 ) of OPCODE ;

...

signal My_Mem:Mem_Array ;

signal My_Data:Data_Array ;

Ví dụ ứng dụng dùng mảng 2 chiều khởi tạo một vùng nhớ ROM

constant My_ROM: REM_Array:= (0 => (others=>‘1’),

1 => “10100010”,

2 => “00001111”,

3 => “11110000”);

d. Kiểu dữ liệu con

Là một tập hợp con của các kiểu dữ liệu đã được định nghĩa khác. Phép khai báo kiểu dữ liệu con có thể nằm ở mọi vị trí cho phép khai báo kiểu dữ liệu. Cú pháp khai báo chung:

Subtype Tên_kiểu_dữ_liệu_con is xác_định_kiểu_dữ_liệu_con;

Ví dụ: subtype My_Int is integer range 0 to 255 ;

subtype My_Small_Int is My_Int range 5 to 30 ;

subtype word is bit_vector(31 downto 0);

Content actions

Download module as:

PDF | EPUB (?)

What is an EPUB file?

EPUB is an electronic book format that can be read on a variety of mobile devices.

Downloading to a reading device

For detailed instructions on how to download this content's EPUB to your specific device, click the "(?)" link.

| More downloads ...

Add module to:

My Favorites (?)

'My Favorites' is a special kind of lens which you can use to bookmark modules and collections. 'My Favorites' can only be seen by you, and collections saved in 'My Favorites' can remember the last module you were on. You need an account to use 'My Favorites'.

| A lens I own (?)

Definition of a lens

Lenses

A lens is a custom view of the content in the repository. You can think of it as a fancy kind of list that will let you see content through the eyes of organizations and people you trust.

What is in a lens?

Lens makers point to materials (modules and collections), creating a guide that includes their own comments and descriptive tags about the content.

Who can create a lens?

Any individual member, a community, or a respected organization.

What are tags? tag icon

Tags are descriptors added by lens makers to help label content, attaching a vocabulary that is meaningful in the context of the lens.

| External bookmarks

Reuse / Edit:

Reuse or edit module (?)

Check out and edit

If you have permission to edit this content, using the "Reuse / Edit" action will allow you to check the content out into your Personal Workspace or a shared Workgroup and then make your edits.

Derive a copy

If you don't have permission to edit the content, you can still use "Reuse / Edit" to adapt the content by creating a derived copy of it and then editing and publishing the copy.