DSD Notes

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 28
At a glance
Powered by AI
The key takeaways are that VHDL is a hardware description language used to model and simulate digital circuits. It allows designers to describe systems as interconnected components that operate concurrently. Some important concepts are entities, architectures, processes, components and design units.

The five different types of primary design units in VHDL are: entity declaration, architecture body, configuration declaration, package declaration, and package body.

The two types of subprograms in VHDL are functions and procedures. Functions perform sequential computations and return a single value, executing in zero time. Procedures can return values through parameters or globally and may take non-zero time if they contain wait statements.

EE09 505

Digital System Design

References
1. Digital Design: principle and Practices, John F Wakerly. 2. A VHDL Primer, J Bhasker 3. http://www.seas.upenn.edu/~ese171/vhdl/vhdl_primer.html#_Toc526061341

1 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Introduction VHDL stands for VHSIC (Very High Speed Integration Circuits) Hardware Description Language. In the mid-1980s the U.S. Department of Defense and the IEEE sponsored the development of this hardware description language with the goal to develop very high-speed integrated circuit. It has become now one of industrys standard languages used to describe digital systems. The other widely used hardware description language is Verilog. Both are powerful languages that allow you to describe and simulate complex digital systems. A third HDL language is ABEL (Advanced Boolean Equation Language) which was specifically designed for Programmable Logic Devices (PLD). ABEL is less powerful than the other two languages and is less popular in industry. This tutorial deals with VHDL, as described by the IEEE standard 1076-1993. Although these languages look similar as conventional programming languages, there are some important differences. A hardware description language is inherently parallel, i.e. commands, which correspond to logic gates, are executed (computed) in parallel, as soon as a new input arrives. A HDL program mimics the behavior of a physical, usually digital, system. It also allows incorporation of timing specifications (gate delays) as well as to describe a system as an interconnection of different components. (For VHDL design features and Design flow please refer John F Wakerly P.No 264-267)

Basic Structure of a VHDL file A digital system in VHDL consists of a design entity that can contain other entities that are then considered components of the top-level entity. Each entity is modeled by an entity declaration and an architecture body. One can consider the entity declaration as the interface to the outside world that defines the input and output signals, while the architecture body contains the description of the entity and is composed of interconnected entities, processes and components, all operating concurrently, as schematically shown in Figure 3 below. In a typical design there will be many such entities connected together to perform the desired function.

Figure 3: A VHDL entity consisting of an interface (entity declaration) and a body (architectural description).

2 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

VHDL uses reserved keywords that cannot be used as signal names or identifiers. Keywords and user-defined identifiers are case insensitive. Lines with comments start with two adjacent hyphens (--) and will be ignored by the compiler. VHDL also ignores line breaks and extra spaces. VHDL is a strongly typed language which implies that one has always to declare the type of every object that can have a value, such as signals, constants and variables. To describe an entity VHDL provides five different types of primary constructs called design units. They are: a) Entity Declaration b) Architecture Body c) Configuration Declaration d) Package Declaration e) Package Body

a.

Entity Declaration The entity declaration defines the NAME of the entity and lists the input and output ports. The general form is as follows,
entity NAME_OF_ENTITY is [ generic generic_declarations);] port (signal_names: mode type; signal_names: mode type; : signal_names: mode type); end [NAME_OF_ENTITY] ;

An entity always starts with the keyword entity, followed by its name and the keyword is. Next are the port declarations using the keyword port. An entity declaration always ends with the keyword end, optionally [] followed by the name of the entity. The NAME_OF_ENTITY is a user-selected identifier signal_names consists of a comma separated list of one or more user-selected identifiers that specify external interface signals. mode: is one of the reserved words to indicate the signal direction: o in indicates that the signal is an input o out indicates that the signal is an output of the entity whose value can only be read by other entities that use it. o buffer indicates that the signal is an output of the entity whose value can be read inside the entitys architecture o inout the signal can be an input or an output. type: a built-in or user-defined signal type. Examples of types are bit, bit_vector, Boolean, character, std_logic, and std_ulogic. o bit can have the value 0 and 1 o bit_vector is a vector of bit values (e.g. bit_vector (0 to 7)

3 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

o o o o o

std_logic, std_ulogic, std_logic_vector, std_ulogic_vector: can have 9 values to indicate the value and strength of a signal. Std_ulogic and std_logic are preferred over the bit or bit_vector types. boolean can have the value TRUE and FALSE integer can have a range of integer values real can have a range of real values character any printing character time to indicate time

generic: generic declarations are optional and determine the local constants used for timing and sizing (e.g. bus widths) the entity. A generic can have a default value. The syntax for a generic follows, generic ( constant_name: type [:=value] ; constant_name: type [:=value] ; : constant_name: type [:=value] );

A few other examples of entity declarations follow Four-to-one multiplexer of which each input is an 8-bit word.
entity mux4_to_1 is port (I0,I1,I2,I3: in std_logic_vector(7 downto 0); SEL: in std_logic_vector (1 downto 0); OUT1: out std_logic_vector(7 downto 0)); end mux4_to_1;

An example of the entity declaration of a D flip-flop with set and reset inputs is
entity dff_sr is port (D,CLK,S,R: in std_logic; Q,Qnot: out std_logic); end dff_sr;

4 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

b. Architecture body The architecture body specifies how the circuit operates and how it is implemented. The architecture body looks as follows,
architecture architecture_name of NAME_OF_ENTITY is -- Declarations -- components declarations -- signal declarations -- constant declarations -- function declarations -- procedure declarations -- type declarations : begin -- Statements : end architecture_name;

The internal details of an entity are specified by an architecture body using any of the following styles. a) b) c) d) Structural Modeling (As a set of inter connected components). Data Flow modeling (As a set of concurrent assignment statements) Behavioral modeling (As a set of sequential Assignment statements) Mixed (As any combination of above three) (Refer the lecture notes for above modeling examples)

5 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Library and use keywords


A library can be considered as a place where the compiler stores information about a design project. We mentioned earlier that std_logic is defined in the package ieee.std_logic_1164 in the ieee library. In order to use the std_logic one needs to specify the library and package. This is done at the beginning of the VHDL file using the library and the use keywords as follows: library ieee; use ieee.std_logic_1164.all; The .all extension indicates to use all of the ieee.std_logic_1164 package. ieee Library:

std_logic_1164 package: defines the standard datatypes std_logic_arith package: provides arithmetic, conversion and comparison functions for the signed, unsigned, integer, std_ulogic, std_logic and std_logic_vector types std_logic_unsigned std_logic_misc package: defines supplemental types, subtypes, constants and functions for the std_logic_1164 package.

To use any of these one must include the library and use clause: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

6 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

c. Configuration Declaration
Configuration declaration is used to select one of the possibly many architecture bodies that an entity may have and to bind components to entities represented by an entity-architecture pair. Example: Configuration declaration for Half adder structural modeling Library lib1,lib2; Configuration HA_Bind of HA_adder is for HA_arch for X1:XOR2 use entity lib1.XOR_gate(dataflow); for X1:AND2 use entity lib2.AND.config; end for; end for; end HA_Bind

7 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

d. Package Declaration
1. A package declaration is used to store a setof common declarations 2. Such as, components, types, procedures and functions. 3. Can be imported into design units using a USE clause Syntax for package declaration
-- Package declaration package name_of_package is package declarations end package name_of_package;

Example Package ex_pack is type summer is (Apr,May); component d_FF port(D,Clk: in bit; Q:out bit); end component; constant delay :time :=2ns; function sum (a,b) return real; End ex_pack;

8 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

e.Package Body
A package body is used to store the definitions of functions and procedures that declared in the package declaration. General Syntax is given below,

-- Package body declarations package body name_of_package is package body declarations end package body name_of_package;

Example package body ex_pack is function sum(a,b) return real is begin --Behavior of the function end sum; end ex_pack;
For instance, the basic functions of the AND2, OR2, NAND2, NOR2, XOR2, etc. components need to be defined before one can use them. This can be done in a package, e.g. basic_func for each of these components, as follows:
-- Package declaration library ieee; use ieee.std_logic_1164.all; package basic_func is -- AND2 declaration component AND2 generic (DELAY: time :=5ns); port (in1, in2: in std_logic; out1: out std_logic); end component; -- OR2 declaration

9 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

component OR2 generic (DELAY: time :=5ns); port (in1, in2: in std_logic; out1: out std_logic); end component; end package basic_func; -- Package body declarations library ieee; use ieee.std_logic_1164.all; package body basic_func is -- 2 input AND gate entity AND2 is generic (DELAY: time); port (in1, in2: in std_logic; out1: out std_logic); end AND2; architecture model_conc of AND2 is begin out1 <= in1 and in2 after DELAY; end model_conc; -- 2 input OR gate entity OR2 is generic (DELAY: time); port (in1, in2: in std_logic; out1: out std_logic); end OR2; architecture model_conc2 of AND2 is begin out1 <= in1 or in2 after DELAY; end model_conc2; end package body basic_func;

To use the components of this package one has to declare it using the library and use clause:
library ieee, my_func; use ieee.std_logic_1164.all, my_func.basic_func.all;

10 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

BASIC LANGUAGE ELEMETS (Lexical Elements of VHDL) Identifiers Identifiers are user-defined words used to name objects in VHDL models. We have seen examples of identifiers for input and output signals as well as the name of a design entity and architecture body. When choosing an identifier one needs to follow these basic rules: 1. May contain only alpha-numeric characters (A to Z, a to z, 0-9) and the underscore (_) character 2. The first character must be a letter and the last one cannot be an underscore. 3. An identifier cannot include two consecutive underscores. 4. An identifier is case insensitive (ex. And2 and AND2 or and2 refer to the same object) 5. An identifier can be of any length. Examples of valid identifiers are: X10, x_10, My_gate1. Some invalid identifiers are: _X10, my_gate@input, gate-input.

Keywords (Reserved words) Certain identifiers are used by the system as keywords for special use such as specific constructs. These keywords cannot be used as identifiers for signals or objects we define. We have seen several of these reserved words already such as in, out, or, and, port, map, end, etc. Keywords are often printed in boldface, as is done in this tutorial.Extended identifiers can make use of keywords since these are considered different words (e.g. the extended identifier \end\ is allowed.

Numbers The default number representation is the decimal system. VHDL allows integer literals and real literals. Integer literals consist of whole numbers without a decimal point, while real literals always include a decimal point. Exponential notation is allowed using the letter E or e. For integer literals the exponent must always be positive. Examples are: Integer literals: 12 10 256E3 12e+6

Real literals: 1.2 256.24 3.14E-2

11 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Characters, Strings and Bit Strings To use a character literal in a VHDL code, one puts it in a single quotation mark, as shown in the examples below: a, B, , On the other hand, a string of characters are placed in double quotation marks as shown in the following examples: This is a string, To use a double quotation mark inside a string, use two double quotation marks This is a String. Any printing character can be included inside a string. A bit-string represents a sequence of bit values. In order to indicate that this is a bit string, one places the B in front of the string: B1001. One can also use strings in the hexagonal or octal base by using the X or O specifiers, respectively. Some examples are: Binary: B1100_1001, b1001011 Hexagonal: XC9, X4b Octal: O311, o113 Data Objects: Signals, Variables and Constants A data object is created by an object declaration and has a value and type associated with it. An object can be a Constant, Variable, Signal or a File. Up to now we have seen signals that were used as input or output ports or internal nets. Signals can be considered wires in a schematic that can have a current value and future values, and that are a function of the signal assignment statements. On the other hand, Variables and Constants are used to model the behavior of a circuit and are used in processes, procedures and functions, similarly as they would be in a programming language. Following is a brief discussion of each class of objects. Constant A constant can have a single value of a given type and cannot be changed during the simulation. A constant is declared as follows, constant list_of_name_of_constant: type [ := initial value] ; where the initial value is optional. Constants can be declared at the start of an architecture and can then be used anywhere within the architecture. Constants declared within a process can only be used inside that specific process.
12 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

constant RISE_FALL_TME: time := 2 ns; constant DELAY1: time := 4 ns; constant RISE_TIME, FALL_TIME: time:= 1 ns; constant DATA_BUS: integer:= 16; Variable A variable can have a single value, as with a constant, but a variable can be updated using a variable assignment statement. The variable is updated without any delay as soon as the statement is executed. Variables must be declared inside a process (and are local to the process). The variable declaration is as follows: variable list_of_variable_names: type [ := initial value] ; A few examples follow: variable CNTR_BIT: bit :=0; variable VAR1: boolean :=FALSE; variable SUM: integer range 0 to 256 :=16; variable STS_BIT: bit_vector (7 downto 0);

Signal Signals are declared outside the process using the following statement: signal list_of_signal_names: type [ := initial value] ; signal SUM, CARRY: std_logic; signal CLOCK: bit; signal TRIGGER: integer :=0; signal DATA_BUS: bit_vector (0 to 7); signal VALUE: integer range 0 to 100; Signals are updated when their signal assignment statement is executed, after a certain delay, as illustrated below,

13 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

SUM <= (A xor B) after 2 ns; If no delay is specified, the signal will be updated after a delta delay. One can also specify multiple waveforms using multiple events as illustrated below, signal wavefrm : std_logic; wavefrm <= 0, 1 after 5ns, 0 after 10ns, 1 after 20 ns; Difference between Signal and Variable . A variable changes instantaneously when the variable assignment is executed. On the other hand, a signal changes a delay after the assignment expression is evaluated. If no delay is specified, the signal will change after a delta delay. This has important consequences for the updated values of variables and signals. Let us compare the two files in which a process is used to calculate the signal RESULT

Example of a process using Variables


architecture VAR of EXAMPLE is signal TRIGGER, RESULT: integer := 0; begin process variable variable1: integer :=1; variable variable2: integer :=2; variable variable3: integer :=3; begin wait on TRIGGER; variable1 := variable2; variable2 := variable1 + variable3; variable3 := variable2; RESULT <= variable1 + variable2 + variable3; end process;

end VAR

14 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Example of a process using Signals


architecture SIGN of EXAMPLE is signal TRIGGER, RESULT: integer := 0; signal signal1: integer :=1; signal signal2: integer :=2; signal signal3: integer :=3; begin process begin wait on TRIGGER; signal1 <= signal2; signal2 <= signal1 + signal3; signal3 <= signal2; RESULT <= signal1 + signal2 + signal3; end process; end SIGN;

In the first case, the variables variable1, variable2 and variable3 are computed sequentially and their values updated instantaneously after the TRIGGER signal arrives. Next, the RESULT, which is a signal, is computed using the new values of the variables and updated a time delta after TRIGGER arrives. This results in the following values (after a time TRIGGER): variable1 = 2, variable2 = 5 (=2+3), variable3= 5. Since RESULT is a signal it will be computed at the time TRIGGER and updated at the time TRIGGER + Delta. Its value will be RESULT=12. On the other hand, in the second example, the signals will be computed at the time TRIGGER. All of these signals are computed at the same time, using the old values of signal1, 2 and 3. All the signals will be updated at Delta time after the TRIGGER has arrived. Thus the signals will have these values: signal1= 2, signal2= 4 (=1+3), signal3=2 and RESULT=6.

15 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Data types Each data object has a type associated with it. The type defines the set of values that the object can have and the set of operations that are allowed on it. The notion of type is key to VHDL since it is a strongly typed language that requires each object to be of a certain type. In general one is not allowed to assign a value of one type to an object of another data type (e.g. assigning an integer to a bit type is not allowed). There are four classes of data types: scalar, composite, access and file types. The scalar types represent a single value and are ordered so that relational operations can be performed on them. The scalar type includes integer, real, and enumerated types of Boolean and Character. Examples of these will be given further on. a. Data Types defined in the Standard Package VHDL has several predefined types in the standard package as shown in the table below. To use this package one has to include the following clause: library std, work; use std.standard.all; Types defined in the Package Standard of the std Library Type bit bit_vector Range of values 0, 1 an array with each element of type bit FALSE, TRUE Example signal A: bit :=1; signal INBUS: bit_vector(7 downto 0); variable TEST: Boolean :=FALSE variable VAL: character :=$;

boolean

character

any legal VHDL character (see package standard); printable characters must be placed between single quotes (e.g. #) read_mode, write_mode, append_mode open_ok, status_error,

file_open_kind

file_open_status

16 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

name_error, mode_error integer range is implementation dependent but includes at least (231 1) to +(231 1) integer starting with 0 up to the max specified in the implementation integer starting from 1 up the max specified in the implementation floating point number in the range of 1.0 x 1038 to +1.0x 1038 (can be implementation dependent. Not supported by the Foundation synthesis program. note, warning, error, failure array of which each element is of variable VAR4: string(1 to 12):= the type character @$#ABC*()_%Z; an integer number of which the range is implementation defined; units can be expressed in sec, ms, us, ns, ps, fs, min and hr. . Not supported by the Foundation synthesis program variable DELAY: time :=5 ns; constant CONST1: integer :=129;

natural

variable VAR1: natural :=2;

positive

variable VAR2: positive :=2;

real

variable VAR3: real :=+64.2E12;

severity_level string

time

b. User-defined Types One can introduce new types by using the type declaration, which names the type and specifies its value range. The syntax is type identifier is type_definition; Here are a few examples of type definitions, Integer types type small_int is range 0 to 1024;
17 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

type my_word_length is range 31 downto 0; subtype data_word is my_word_length range 7 downto 0; A subtype is a subset of a previously defined type. The last example above illustrates the use of subtypes. It defines a type called data_word that is a sybtype of my_word_length of which the range is restricted from 7 to 0. Another example of a subtype is, subtype int_small is integer range -1024 to +1024; Floating-point types

type cmos_level is range 0.0 to 3.3; type pmos_level is range -5.0 to 0.0; type probability is range 0.0 to 1.0; subtype cmos_low_V is cmos_level range 0.0 to +1.8;

Physical types The physical type definition includes a units identifier as follows, type conductance is range 0 to 2E-9 units mho; mmho = 1E-3 mho; umho = 1E-6 mho; nmho = 1E-9 mho; pmho = 1E-12 mho; end units conductance; Here are some object declarations that use the above types, variable BUS_WIDTH: small_int :=24; signal DATA_BUS: my_word_length;

18 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

variable VAR1: cmos_level range 0.0 to 2.5; constant LINE_COND: conductance:= 125 umho; Notice that a space must be left before the unit name. c. Enumerated Types

An enumerated type consists of lists of character literals or identifiers. The enumerated type can be very handy when writing models at an abstract level. The syntax for an enumerated type is, type type_name is (identifier list or character literal); Here are some examples, type my_3values is (0, 1, Z); type PC_OPER is (load, store, add, sub, div, mult, shiftl, shiftr); type hex_digit is (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F); type state_type is (S0, S1, S2, S3); An example of an enumerated type that has been defined in the std_logic_1164 package is the std_ulogic type, defined as follows

type STD_ULOGIC is ( U, X, 0, 1, Z, W, L, H. -); -- uninitialized -- forcing unknown -- forcing 0 -- forcing 1 -- high impedance -- weak unknown -- weak 0 -- weak 1 -- dont care
19 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

In order to use this type one has to include the clause before each entity declaration. library ieee; use ieee.std_logic_1164.all; d. Composite Types: Array Composite data objects consist of a collection of related data elements in the form of an array . Before we can use such objects one has to declare the composite type first. Array Type An array type is declared as follows: type array_name is array (indexing scheme) of element_type;

type MY_WORD is array (15 downto 0) of std_logic; type YOUR_WORD is array (0 to 15) of std_logic; type VAR is array (0 to 7) of integer; type STD_LOGIC_1D is array (std_ulogic) of std_logic; Operators VHDL supports different classes of operators that operate on signals, variables and constants. The different classes of operators are summarized below. Class
1. Logical operators 2. Relational operators 3. Shift operators 4.Addition operators 5. Unary operators 6. Multiplying op. 7. Miscellaneous op. and = sll + + * ** or /= srl = / abs nand < sla & mod not nor <= sra xor > rol xnor >= ror

rem

The order of precedence is the highest for the operators of class 7, followed by class 6 with the lowest precedence for class 1. Unless parentheses are used, the operators with the highest precedence are applied first. Operators of the same class have the same precedence and are applied from left to right in an expression. As an example, consider the following std_ulogic_vectors, X (=010), Y(=10), and Z (10101). The expression

20 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

not X & Y xor Z rol 1 is equivalent to ((not X) & Y) xor (Z rol 1) = ((101) & 10) xor (01011) =(10110) xor (01011) = 11101. The xor is executed on a bit-per-bit basis. Relational operators The relational operators test the relative values of two scalar types and give as result a Boolean output of TRUE or FALSE. Operator = /= < Description Equality Inequality Smaller than Operand Types any type any type scalar or discrete array types scalar or discrete array types scalar or discrete array types scalar or discrete array types Result Type Boolean Boolean Boolean

<=

Smaller than or equal

Boolean

>

Greater than

Boolean

>=

Greater than or equal

Boolean

Shift operators These operators perform a bit-wise shift or rotate operation on a one-dimensional array of elements of the type bit (or std_logic) or Boolean. Operator Description Shift left logical (fill right sll vacated bits with the 0) Operand Type Left: Any one-dimensional array type with elements of type bit or Boolean; Right: integer same as above same as above Result Type Same as left type

srl sla

sra

Shift right logical (fill left vacated bits with 0) Shift left arithmetic (fill right vacated bits with rightmost bit) Shift right arithmetic (fill left

Same as left type Same as left type Same as left

same as above
21

EEE Dept.

JEC, Thrissur

EE09 505

Digital System Design

rol ror

vacated bits with leftmost bit) Rotate left (circular) Rotate right (circular)

type same as above same as above Same as left type Same as left type

Other examples of shift operations are for the bit_vector A = 101001 variable A: bit_vector :=101001; A sll 2 A srl 2 A sla 2 A sra 2 A rol 2 A ror 2 results in results in results in results in results in results in 100100 001010 100111 111010 100110 011010

Addition operators The addition operators are used to perform arithmetic operation (addition and subtraction) on operands of any numeric type. The concatenation (&) operator is used to concatenate two vectors together to make a longer one. In order to use these operators one has to specify the ieee.std_logic_unsigned.all or std_logic_arith package package in addition to the ieee.std_logic_1164 package. Operator Description + & Addition Subtraction Left Operand Type Numeric type Numeric type Right Operand Type Same as left operand Same as left operand Same as left operand Result Type Same type Same type Same array type

Concatenation Array or element type

22 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Unary operators The unary operators + and - are used to specify the sign of a numeric type. Operator + Multiplying operators The multiplying operators are used to perform mathematical functions on numeric types (integer or floating point). Description Identity Negation Operand Type Any numeric type Any numeric type Result Type Same type Same type

Operator

Description

Multiplication

Division

mod rem

Modulus Remainder

Left Operand Type Any integer or floating point Any physical type Any integer or real type Any integer or floating point Any physical type Any physical type Any integer type Any integer type

Right Operand Result Type Type Same type Same type Integer or real type Any physical type Any integer or floating point Any integer or real t ype Same type Same as left Same as right Same type Same as left Integer Same type Same type

The multiplication operator is also defined when one of the operands is a physical type and the other an integer or real type. The remainder (rem) and modulus (mod) are defined as follows: A rem B = A (A/B)*B A mod B = A B * N (in which A/B in an integer) (in which N is an integer)

The result of the rem operator has the sign of its first operand while the result of the mod operators has the sign of the second operand. Some examples of these operators are given below.

23 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

11 rem 4 (-11) rem 4 9 mod 4 7 mod (-4) g.

results in 3 results in -3 results in 1 results in 1 (7 4*2 = -1).

Miscellaneous operators

These are the absolute value and exponentation operators that can be applied to numeric types. The logical negation (not) results in the inverse polarity but the same type. Operator ** abs not Description Exponentiation Absolute value Logical negation Left Operand Right Operand Type Type Integer type Integer type Floating point Integer type Any numeric type Any bit or Boolean type Result Type Same as left Same as left Same type Same type

24 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Sub Programs
A subprogram defines a sequential algorithm that performs a certain computations. Two kinds of sub programs, Function Used for computing a single value. A function executes in zero simulation time. Functions perform sequential computations and return a value as the value of the function. Functions do not change their formal parameters. Function Procedure

General Syntax Function function-name ( signal names: type . ) return return-type is type declarations; constant declarations; variable declarations; function declarations; procedure defintions; begin sequential statements end function-name;

25 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

Example:--Entity decl --Use package-decl --Architecture body Z<= but-not(x,y) --end architecture --------------------------------------------------------------------------------------------------------------------Function but-not (a,b: bit) return bit is begin if b=0 then return a; else return 0; end if; End but-not; Procedure o Procedures perform sequential computations and return values in global objects or by storing values into formal parameters. o Procedure mayor may not execute in zero simulation time, depending upon whether it has wait statement or not. General syntax Function procedure-name ( signal names: type . ) is type declarations; constant declarations;
26 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

variable declarations; function declarations; procedure defintions; begin sequential statements end procedure-name; Example:--Entity decl --Use package-decl --Architecture body begin arith-unit(x,y,add,z1) / Procedure calling --end architecture --------------------------------------------------------------------------------------------------------------------Type op-code(add,sub,mul,div,LE,LT,EQ); procedure arith-unit (a,b: in integer; op: in op-code; z; out integer; zcomp:out boolean) is begin case op is when add=> z: a+b; when sub=> z: a-b; when mul=> z: a*b; when div=> z: a/b; when LE=> zcomp: a<=b; when LT=> zcomp: a<b;

27 EEE Dept. JEC, Thrissur

EE09 505

Digital System Design

when EQ=> zcomp: a=b; end case end arith-unit;

28 EEE Dept. JEC, Thrissur

You might also like