0% found this document useful (0 votes)
28 views29 pages

Array, Records, and Aggregated Constants: Dr. Yann-Hang Lee Yhlee@asu - Edu

The document describes different composite data structures in VHDL including arrays, records, and aggregated constants. It provides examples of declaring arrays with discrete ranges, accessing and slicing arrays, concatenating arrays, and using vectors for operations that would otherwise require loops. Records are described as grouping elements of different types. Aggregated constants allow defining constant values for composite types like arrays and records by listing the values for each index or field. Multidimensional arrays and examples of lookup tables are also covered.

Uploaded by

Chutiya
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
28 views29 pages

Array, Records, and Aggregated Constants: Dr. Yann-Hang Lee Yhlee@asu - Edu

The document describes different composite data structures in VHDL including arrays, records, and aggregated constants. It provides examples of declaring arrays with discrete ranges, accessing and slicing arrays, concatenating arrays, and using vectors for operations that would otherwise require loops. Records are described as grouping elements of different types. Aggregated constants allow defining constant values for composite types like arrays and records by listing the values for each index or field. Multidimensional arrays and examples of lookup tables are also covered.

Uploaded by

Chutiya
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 29

Array, Records, and Aggregated

Constants
Dr. Yann-Hang Lee
[email protected]
Composite structures

 Arrays
 group elements of same types
 Records
 group elements of different types
 Access
 like pointers in “C”, may be useful in file I/O and
creation of test environments. Generally beyond the
scope of this course.

CSE 422 page 2


Declaring Arrays

 FORM
TYPE array_name IS ARRAY (discrete_range {,…})
OF element_subtype_indication;

 Examples
TYPE carrier IS ARRAY (15 downto 0) of bit;
TYPE regs IS ARRAY ( 0 to 31) of byte;
(where we previously defined type byte by
type byte is 0 to 255;)

CSE 422 page 3


USE of Discrete Range

 Discrete range is
 index_value TO index_value
 index_value DOWNTO index_value
 using a previously defined type
 type_name’range OR
 type_name RANGE left_value TO right_value OR
 type_name RANGE right_value DOWNTO left_value

CSE 422 page 4


Objects or Types

 Can declare objects to be arrays directly


SIGNAL AX : ARRAY ( leftbit DOWNTO rightbit ) of
BIT;
 HOWEVER! Almost always MULTIPLE arrays of the
same dimensions and with the same element types
are needed, so usually
 declare array type
 declare objects
TYPE word IS ARRAY ( 31 DOWNTO 0 ) of BIT;
SIGNAL AX, BX, CX, DX : word;
VARIABLE temp : word;

CSE 422 page 5


Array Attributes

 left -- left index defined in range


 right -- right index defined in range
 low -- smallest index value defined in range
 high -- largest index value defined in range
 range -- left index, direction, right index
 reverserange -- right index, opposite direction, left
index
 length -- number of elements in array

CSE 422 page 6


Reference to Elements of an Array

 Use parenthesis, not brackets for index


 Example:
AX ( word’left ) -- means AX(31) from previous definition of type
word
 Example
FOR j in AX’range LOOP
IF j <> AX’right THEN AX ( j) <= AX(j-1);
ELSE AX(j) <= new_right_bit;
END LOOP;
 Constant index is legal, but generally bad practice
 e.g. AX(0);

CSE 422 page 7


Reference to Array Slices

 Useful for extracting and inserting


“subvector” or “field” values.
Example:
AH := AX (31 downto 16 );
AL := AX (15 downto 0);

Example: picking off the carry bit after an add operation:


result <= add_temp (add_temp’left-1 downto 0);
cybit <= add_temp (add_temp’left);

CSE 422 page 8


The & symbol -- concatentation

 connects arrays end-to-end

Example: combining two halfwords to make a full word


fullbus <= AH & AL;

Example: swapping halfwords


AX <= AL & AH; -- where AL and AH are the right and
left half of AX

CSE 422 page 9


Shift and Rotate

More examples using slices and concatenation

 Left shift, zero fill


AX <= AX ( AX’left-1 downto AX’right ) & ‘0’;

 Right rotate
AX <= AX (0) & ( AX’left downto AX’right+1 ) & ‘0’;

CSE 422 page 10


Vector Operation Replaces FOR Loop

 Previous example
FOR j in AX’range LOOP
IF j <> AX’right THEN AX ( j) <= AX(j-1);
ELSE AX(j) <= new_right_bit;
END LOOP;

 Better representation:
AX <= AX(ax’left-1 downto ax’right) & new_right_bit;

CSE 422 page 11


Stack manipulation example

 Suppose we declare
SIGNAL STK : ARRAY ( 0 to stacksize-1) of stack_element;
SIGNAL TOS : stack_element;
CONSTANT NO_ELT : stack_element := 0;

 PUSH operation where TOS is a separate signal


STK <= TOS & STK (stk’left to stk’right-1);

 POP operation
STK <= STK (stk’left+1 to stk’right) & NO_ELT;
TOS <= STK (stk’left);

CSE 422 page 12


Unconstrained Arrays

 In a package,
 declare element types
 declare array types
 At the time the array type is declared, the actual size
of the array objects is unknown
 Necessary because OPERATIONs on the array need
to be written generally
 operate the objects regardless of the size they may
have.

CSE 422 page 13


How to Declare an Unconstrained Array

FORM
TYPE arrayname IS ARRAY ( indextype RANGE <> )
OF element_type;

Examples:
TYPE bit_vector IS ARRAY ( NATURAL RANGE <>)
OF BIT;
TYPE std_logic_vector IS ARRAY (NATURAL RANGE
<>) OF STD_LOGIC;

CSE 422 page 14


Bit_Vectors and Strings

 Predefined for use in STD.STANDARD


 Both are unconstrained array declarations
Examples of use:
constant Error_Msg : string := “System is FRIED!!!”; -- string is
-- an array of characters
constant zeroes : bit_vector := B”0000_0000”;
constant empty: bit_vector := O”052”;
constant restart: bit_vector := X”0FC”;
Notes:
 B, O, X indicate binary, octal, hex representation of bits
 Underscore within quotes is NOT treated as a character.

CSE 422 page 15


Std_Logic_Vectors

 Unconstrained array defined for us in


Library IEEE;
USE Package IEEE.STD_LOGIC_1164.all;

Example of use:
entity alu ( left, right : in std_logic_vector;
result : out std_logic_vector;
cy_in : in std_logic;
cy_out : out std_logic;
control : in std_logic_vector (0 to 3) );

CSE 422 page 16


Records

 Declaration
TYPE record_type IS
RECORD
field1 : type;
field2 : type;
END RECORD

 Should be used to group elements of different types


which logically belong together.

CSE 422 page 17


Records

 Definition --
TYPE time_stamp IS RECORD
second : integer range 0 to 59;
minute : integer range 0 to 59;
hour : integer range 0 to 23;
END RECORD;

 VARIABLE current_time : time_stamp;


current_time.second := 0;
 no variant field allowed in VHDL

CSE 422 page 18


Example of Record

 Type declarations
TYPE Operations is (move, add, sub, adc, sbb, bra, call, inc, dec,
push, pop, shf, rot flag);
TYPE Address_mode is (reg, direct, indirect, displ, indexed);
TYPE Xreg is (ax, bx, cx, dx, sp, bp, si, di);
 A type describing the structure of instructions:
TYPE Instruction is RECORD
opcode : Operations;
src_mode: Address_mode;
src_reg, dst_reg: Xreg;
dst_mode: Address_mode;
END RECORD;

CSE 422 page 19


References to records

 Just as in other languages, name the object


followed by period and the field
FORM: objectname.fieldname
 Example
SIGNAL IR : Instruction;
...
case IR.opcode IS -- references opcode field
where mov => . . .
where add => . . .

CSE 422 page 20


Aggregated constants

 The way to define constant values for composite


data objects like arrays and records.

 FORM
( index_or_field_name(s) => value,
repeated as many times as needed. . . );

index_or_field_name(s) can be a range of values for


array indexing, several enumerated values separated
by |, or the field names for records.

CSE 422 page 21


Examples of Aggregated Constants

Assume
type clock_level is (low, rising, high, falling);
type ctable is array (clock_level) of bit;

constant conversion_table : ctable := (‘0’,’1’,’1’,’0’);


constant conversion_table : ctable := (“0110”);
constant conversion_table : ctable :=
(low=>’0’,rising=>’1’,high=>’1’,falling=>’0’);
constant conversion_table : ctable := (low|falling => ‘0’,
high|rising => ‘1’);

All have the same meaning

CSE 422 page 22


Referencing into tables

Suppose we declare
Variable clk_tran : clock_level;
Signal bit_action : bit;

Then we can write the following statement:

bit_action <= ctable ( clk_tran );

Note that the index values are NOT integers, but that’s OK!

CSE 422 page 23


Aggregated Constants

 Strings and derived types on character can be


placed in “ . . . “

 Examples
Constant X : bit_vector := “0010”;
Constant Y : std_logic_vector := “001X”;
Constant Z : string := “ABCD”;

CSE 422 page 24


More examples of aggregated
constants
 Record example
Constant CLEARAX : Instruction :=
(opcode => xor,
src_reg => ax,
dst_reg => ax,
src_mode=> reg,
dst_mode => reg);

 Array example
Constant ZZs : cpureg := (cpureg’range => ‘Z’);

CSE 422 page 25


Multidimensional Arrays

TYPE array_name IS ARRAY(index_type1,


index_type2, . . .) OF element_type;

 Most useful in creating lookup tables for functions

CSE 422 page 26


Creating tables for lookup
functions - example
TYPE stdlogic_table IS ARRAY(std_ulogic,std_ulogic) OF std_ulogic;
-- truth table for "and" function
CONSTANT and_table : stdlogic_table := (
-- ----------------------------------------------------
-- | U X 0 1 Z W L H - | |
-- ----------------------------------------------------
( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ), -- | U |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | X |
( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), -- | 0 |
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | 1 |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | Z |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), -- | W |
( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), -- | L |
( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), -- | H |
( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' )); -- | - |

CSE 422 page 27


Another table lookup example

 Suppose inputs P and Q are std_ulogic, then the quickest way


to get the new value for AND is a table lookup, handled by the
AND operation in the Package STD_LOGIC_1164 Body.

Result := and_table (P,Q);

 Note: the values of P and Q are enumerated, not


indexed.

CSE 422 page 28


Use of OTHERS keyword

 Filling in all the default values in Arrays


 Extremely useful where unconstrained arrays need to
be initialized.
 FORM:
use keyword OTHERS as the index_name

 Constant S_ONE : std_logic_vector := (S_ONE’right


=> ‘1’, OTHERS => ‘0’);
 Constant S_ZZZ : std_logic_vector := (OTHERS =>
‘Z’);

CSE 422 page 29

You might also like