Ece IV Fundamentals of HDL 10ec45 Notes
Ece IV Fundamentals of HDL 10ec45 Notes
PART-A
UNIT 1:
Introduction: Why HDL? , A Brief History of HDL, Structure of HDL Module,
Operators, Data types, Types of Descriptions, simulation and synthesis, Brief comparison
of VHDL and Verilog
6 Hours
UNIT 2:
Data –Flow Descriptions: Highlights of Data-Flow Descriptions, Structure of Data-
Flow Description,DataType-Vectors
6 Hours
UNIT 3:
Behavioral Descriptions: Behavioral Description highlights, structure of HDL
behavioral Description, The VHDL variable –Assignment Statement, sequential
statements.
7 Hours
UNIT 4:
Structural Descriptions: Highlights of structural Description, Organization of the
structural Descriptions, Binding, state Machines, Generate, Generic, and Parameter
statements.
7 Hours
PART-B
UNIT 5: Procedures, Tasks, and Functions: Highlights of Procedures, tasks, and
Functions, Procedures and tasks, Functions.
Advanced HDL Descriptions: File Processing, Examples of File Processing
7 Hours
UNIT 6:
Mixed –Type Descriptions: Why Mixed-Type Description? VHDL User-Defined
Types, VHDL Packages, Mixed-Type Description examples
6 Hours
CITSTUDENTS.I Page 1
Fundamentals of HDL 10EC45
UNIT 7:
Mixed –Language Descriptions: Highlights of Mixed-Language Description, How to
invoke One language from the Other, Mixed-language Description Examples, Limitations
of Mixed-Language Description
7 Hours
UNIT 8:
Synthesis Basics: Highlights of Synthesis, Synthesis information from Entity and
Module, Mapping Process and Always in the Hardware Domain.
6 Hours
TEXT BOOKS:
1. HDL Programming (VHDL and Verilog)- Nazeih M.Botros- Dreamtech
Press (Available through John Wiley – India and Thomson Learning) 2006
Edition
REFERENCE BOOKS:
1. Verilog HDL –Samir Palnitkar-Pearson Education
2. VHDL -Douglas perry-Tata McGraw-Hill
3. A Verilog HDL Primer- J.Bhaskar – BS Publications
4. Circuit Design with VHDL-Volnei A.Pedroni-PHI
CITSTUDENTS.I Page 2
Fundamentals of HDL 10EC45
INDEXSHEET
SL.NO TOPIC PAGE NO.
1 University syllabus 1-2
UNIT – 1: Introduction 4-32
01 Assignment Questions 33
UNIT - 2: Data –Flow Descriptions 34-44
01 Assignment Questions 45
UNIT - 3: Behavioral Descriptions 46-71
01 Assignment Questions 72
UNIT - 4: Structural Descriptions 73-121
01 Assignment Questions 122
UNIT - 5: Procedures, Tasks, and Functions 123-181
01 Assignment Questions 182
UNIT - 6: Mixed –Type Descriptions 183-228
01 Assignment Questions 229
UNIT 7: Mixed –Language Descriptions 230-256
01 Assignment Questions 257
UNIT 8: Synthesis Basics 258-287
01 Assignment Questions 288
CITSTUDENTS.I Page 3
Fundamentals of HDL 10EC45
UNIT 1: INTRODUCTION
Recommended readings:
CITSTUDENTS.I Page 4
Fundamentals of HDL 10EC45
UNIT1: INTRODUCTION
Introduction to VHDL:
VHDL stands for VHSIC (Very High Speed Integrated Circuits) Hardware
Description Language. In the mid-1980’s 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 industry’s
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
CITSTUDENTS.I Page 5
Fundamentals of HDL 10EC45
The highest level of abstraction is the behavioral level that describes a system in terms
of what it does (or how it behaves) rather than in terms of its components and
interconnection between them. A behavioral description specifies the relationship
between the input and output signals. This could be a Boolean expression or a more
abstract description such as the Register Transfer or Algorithmic level.
As an example, let us consider a simple circuit that warns car passengers when the door
is open or the seatbelt is not used whenever the car key is inserted in the ignition lock At
the behavioral level this could be expressed as,
Warning = Ignition_on AND ( Door_open OR Seatbelt_off)
The structural level, on the other hand, describes a system as a collection of gates and
components that are interconnected to perform a desired function. A structural
description could be compared to a schematic of interconnected logic gates. It is a
representation that is usually closer to the physical realization of a system. For the
example above, the structural representation is shown in Figure 2 below.
VHDL allows to describe a digital system at the structural or the behavioral level.
The behavioral level can be further divided into two kinds of styles: Data flow and
Sequential. The dataflow representation describes how data moves through the system.
This is typically done in terms of data flow between registers (Register Transfer level).
The data flow model makes use of concurrent statements that are executed in parallel as
soon as data arrives at the input. On the other hand, sequential statements are executed
in the sequence that they are specified.
VHDL allows both concurrent and sequential signal assignments that will determine the
manner in which they are executed.
Mixed level design consists both behavioral and structural design in one block diagram.
(a) Entity
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.
CITSTUDENTS.I Page 6
Fundamentals of HDL 10EC45
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.
CITSTUDENTS.I Page 7
Fundamentals of HDL 10EC45
entity AND3 is
port (in1, in2, in3: in std_logic;
out1: out std_logic);
end AND3;
The entity is called AND3 and has 3 input ports, in1, in2, in3 and one output port, out1
The name AND3 is an identifier. Inputs are denoted by the keyword in, and outputs by
the keyword out. Since VHDL is a strongly typed language, each port has a defined
type. In this case, we specified the std_logic type. This is the preferred type of digital
signals. In contrast to the bit type that can only have the values ‘1’ and ‘0’, the std_logic
and std_ulogic types can have nine values. This is important to describe a digital system
accurately including the binary values 0 and 1, as well as the unknown value X, the
uninitialized value U, “-” for don’t care, Z for high impedance, and several symbols to
CITSTUDENTS.I Page 8
Fundamentals of HDL 10EC45
indicate the signal strength (e.g. L for weak 0, H for weak 1, W for weak unknown -
see section on Enumerated Types). The std_logic type is defined in the std_logic_1164
package of the IEEE library. The type defines the set of values an object can have. This
has the advantage that it helps with the creation of models and helps reduce errors. For
instance, if one tries to assign an illegal value to an object, the compiler will flag the
error.
Example 3:
entity mux4_to_1 is
port (I0,I1,I2,I3: in std_logic;
S: in std_logic_vector(1downto 0);
y: out std_logic);
end mux4_to_1;
Example 4:
D Flip-Flop:
CITSTUDENTS.I Page 9
Fundamentals of HDL 10EC45
entity dff_sr is
port (D,CLK,S,R: in std_logic;
Q,Qb: out std_logic);
end dff_sr;
Architecture body
The architecture body specifies how the circuit operates and how it is implemented. As
discussed earlier, an entity or circuit can be specified in a variety of ways, such as
behavioral, structural (interconnected components), or a combination of the above.
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 types of Architecture are:
(a) The behavioral Model
(b) Structure Model
(c) Mixed Model
(a) Behavioral model
The architecture body for the example of Figure 2, described at the behavioral level, is
given below,
Example 1:
architecture behavioral of BUZZER is
begin
WARNING <= (not DOOR and IGNITION) or (not SBELT and
IGNITION);
end behavioral;
The header line of the architecture body defines the architecture name, e.g.
behavioral, and associates it with the entity, BUZZER. The architecture name can be
any legal identifier. The main body of the architecture starts with the keyword begin and
gives the Boolean expression of the function. We will see later that a behavioral model
can be described in several other ways. The “<=” symbol represents an assignment
operator and assigns the value of the expression on the right to the signal on the left. The
architecture body ends with an end keyword followed by the architecture name.
Example 2:
The behavioral description of a 3 input AND gate is shown below.
entity AND3 is
port (in1, in2, in3: in std_logic;
out1: out std_logic);
end AND3;
architecture behavioral_2 of AND3 is
CITSTUDENTS.I Page 10
Fundamentals of HDL 10EC45
begin
out1 <= in1 and in2 and in3;
end behavioral_2;
Example 3:
entity XNOR2 is
port (A, B: in std_logic;
Z: out std_logic);
end XNOR2;
architecture behavioral_xnor of XNOR2 is
-- signal declaration (of internal signals X, Y)
signal X, Y: std_logic;
begin
X <= A and
B;
Y <= (not A) and (not
B); Z <= X or Y;
End behavioral_xnor;
Example 4:
SR Flip Flop:
entity SRFF is
port (S, R: in std_logic;
Q, Qb: out std_logic);
end SRFF;
architecture behavioral_2 of SRFF is
begin
Q <= NOT (S and Qb);
Qb <= NOT ( R and
Q);
end behavioral_2;
The statements in the body of the architecture make use of logic operators. In addition,
other types of operators including relational, shift, arithmetic are allowed as well.
Concurrency
The signal assignments in the above examples are concurrent statements. This implies
that the statements are executed when one or more of the signals on the right hand side
change their value (i.e. an event occurs on one of the signals).
In general, a change of the current value of a signal is called an event. For instance,
when the input S (in SR FF) changes, the first expression gets evaluated, which changes
the value of Q, change in Q in turn triggers second expression and evaluates Qb. Thus
Q and Qb are updated concurrently.
There may be a propagation delay associated with this change. Digital systems are
basically data-driven and an event which occurs on one signal will lead to an event
on another signal, etc. Hence, the execution of the statements is determined by the
flow of signal values. As a result, the order in which these statements are given does
not matter (i.e., moving the statement for the output Z ahead of that for X and Y does
not change the outcome). This is in contrast to conventional, software programs that
execute the statements in a sequential or procedural manner.
Example 5
architecture CONCURRENT of FULLADDER is
begin
S <= x xor y xor Ci after 5 ns;
CO <= (x and y) or (y and Ci) or (x and Ci) after 3
CITSTUDENTS.I Page 11
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 12
Fundamentals of HDL 10EC45
Two concurrent signal assignment statements describe the model of the entity
FULLADDER.
The symbol <= indicates the signal assignment. This means that the value on the right
side of the symbol is calculated and subsequently assigned to the signal on the left side.
A concurrent signal assignment is executed whenever the value of a signal in the
expression on the right side changes. Due to the fact that all signals used in this example
are declared as ports in the entity declaration the arch_declarative_part remains empty
Event Scheduling:
The mechanism of delaying the new value is called scheduling an event. In the above
example, assignment to signals S and CO does not happen instantly. The after (keyword)
clause delays the assignment of the new value to S and CO by 3 ns.
Example2:
architecture CONCURRENT_VERSION2 of FULLADDER is
signal PROD1, PROD2, PROD3 : bit;
begin
SUM <= A xor B xor C; -- statement 1
CARRY <= PROD1 or PROD2 or PROD3; -- statement 2
PROD1 <= A and B; statement 3
PROD2 <= B -- statement 4
PROD3 <= A and C; statement 5
--
and C;
--
end CONCURRENT_VERSION2;
(a)Concurrent statement: In VHDL With select and When else statements
are called as concurrent statements and they do not require Process
statement
Example 1: VHDL code for 4:1 multiplexor
library ieee;
use ieee.std_logic_1164.all;
entity Mux is
port( I: in std_logic_vector(3 downto 0);
S: in std_logic_vector(1 downto 0);
y: out std_logic);
end Mux;
-- architecture using logic expression
architecture behv1 of Mux is
begin
y<= (not(s(0)) and not(s(1)) and I(0)) or(s(0) and not(s(1))
and I(1)) or (not(s(0)) and s(1) and I(2))or (s(0) and s(1) and
I(3));
end behv1;
-- Architecture using when..else:
architecture behv2 of Mux is
begin
y <= I(0) when S="00" else
I(1) when S="01" else
I(2) when S="10" else
I(3) when S="11" else
‘Z’ ;
CITSTUDENTS.I Page 13
Fundamentals of HDL 10EC45
end behv2;
-- architecture using with select statement
architecture behv3 of Mux is
begin
with s select
y<=i(0) when “00”,
i(1) when “01”,
i(2) when “10”,
i(3) when “11”,
‘Z’ when others;
end behv3;
Note: ‘Z’ high impedence state should be entered in capital Z
Example 2: SR flipflop using when else statement
entity SRFF is
port ( S, R: in bit;
Q, QB: inout bit);
end RSFF;
architecture beh of RSFF is
begin
Q <= Q when S= ‘0’ and R = ‘0’ else
‘0’ when S = ‘0’ and R = ‘1’ else
‘1’ when S = ‘1’ and R = ’0’ else
‘Z’;
QB <= not(Q);
end beh;
The statement WHEN…..ELSE conditions are executed one at a time in sequential order
until the conditions of a statement are met. The first statement that matches the
conditions required assigns the value to the target signal. The target signal for this
example is the local signal Q. Depending on the values of signals S and R, the values
Q,1,0 and Z are assigned to Q.
If more than one statements conditions match, the first statement that matches does
the assign, and the other matching state.
In with …select statement all the alternatives arte checked simultaneously to find a
matching pattern. Therefore the with … select must cover all possible values of
the selector
Structural Descriptions
A description style where different components of an architecture and their
interconnections are specified is known as a VHDL structural description. Initially, these
components are declared and then components' instances are generated or instantiated. At
the same time, signals are mapped to the components' ports in order to connect them like
wires in hardware. VHDL simulator handles component instantiations as concurrent
assignments.
Syntax:
component declaration:
component component_name
[generic (generic_list: type_name [:= expression] {;
generic_list: type_name [:= expression]} );]
[port (signal_list: in|out|inout|buffer type_name {;
signal_list: in|out|inout|buffer type_name} );]
end component;
CITSTUDENTS.I Page 14
Fundamentals of HDL 10EC45
component instantiation:
component_label: component_name port map (signal_mapping);
The mapping of ports to the connecting signals during the instantiation can be done
through the positional notation. Alternatively, it may be done by using the named
notation.
If one of the ports has no signal connected to it (this happens, for example, when there
are unused outputs), a reserved word open may be used.
Example 1:
signal_mapping: declaration_name => signal_name.
entity RSFF is
port ( SET, RESET: in bit;
Q, QBAR: inout bit);
end RSFF;
architecture NETLIST of RSFF
is component NAND2
port (A, B: in bit; C: out bit);
end component;
begin
U1: NAND2 port map (SET, QBAR, Q);
U2: NAND2 port map (Q, RESET,
QBAR); end NETLIST;
--- named notation instantiation: ---
U1: NAND2 port map (A => SET, C => Q, B => QBAR);
The lines between the first and the keyword begin are a component declaration. It
describes the interface of the entity nand_gate that we would like to use as a
component in (or part of) this design. Between the begin and end keywords, the
statements define component instances.
There is an important distinction between an entity, a component, and a component
instance in VHDL.
The entity describes a design interface, the component describes the interface of an entity
that will be used as an instance (or a sub-block), and the component instance is a distinct
copy of the component that has been connected to other parts and signals.
In this example the component nand_gate has two inputs (A and B) and an output ©.
There are two instances of the nand_gate component in this architecture corresponding to
the two nand symbols in the schematic. The first instance refers to the top nand gate in
CITSTUDENTS.I Page 15
Fundamentals of HDL 10EC45
the schematic and the statement is called the component instantiation statement. The
first word of the component instantiation statement (u1:nand2) gives instance a name, u1,
and specifies that it is an instance of the component nand_gate. The next words describes
how the component is connected to the set of the design using the port map clause.
The port map clause specifies what signals of the design should be connected to the
interface of the component in the same order as they are listed in the component
declaration. The interface is specified in order as A, B and then C, so this instance
connects set to A, QBAR to B and Q to C. This corresponds to the way the top gate in the
schematic is connected. The second instance, named n2, connects RESET to A, Q to A,
and QBAR to C of a different instance of the same nand_gate component in the same
manner as shown in the schematic.
The structural description of a design is simply a textual description of a schematic. A list
of components and there connections in any language is also called a netlist. The
structural description of a design in VHDL is one of many means of specifying netlists.
Example 2: Four Bit Adder – Illustrating a structural VHDL model:
CITSTUDENTS.I Page 16
Fundamentals of HDL 10EC45
-- 4-bit adder
library ieee;
use ieee.std_logic_1164.all;
entity FOURBITADD is
port (a, b: in std_logic_vector(3 downto 0);
Cin : in std_logic;
sum: out std_logic_vector (3 downto 0);
Cout: out std_logic);
end FOURBITADD;
architecture fouradder_structure of FOURBITADD
is signal c: std_logic_vector (4 downto 0);
component FULLADDER
port(x, y, ci: in std_logic;
s, co: out std_logic);
end component;
begin
FA0: FULLADDER
port map (a(0), b(0), Cin, sum(0), c(1));
FA1: FULLADDER
port map (a(1), b(1), C(1), sum(1), c(2));
FA2: FULLADDER
port map (a(2), b(2), C(2), sum(2), c(3));
FA3: FULLADDER
port map (a(3), b(3), C(3), sum(3), c(4));
Cout <= c(4);
end fouradder_structure;
We needed to define the internal signals c (4 downto 0) to indicate the nets that
connect the output carry to the input carry of the next full adder. For the first input we
used the input signal Cin. For the last carry we defined c (4) as an internal signal. We
could not use the output signal Cout since VHDL does not allow the use of outputs as
internal signals! For this reason we had to define the internal carry c(4) and assign c(4)
to the output carry signal Cout.
CITSTUDENTS.I Page 17
Fundamentals of HDL 10EC45
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 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.
1. Logic operators
The logic operators (and, or, nand, nor, xor and xnor) are defined for the “bit”,
“boolean”, “std_logic” and “std_ulogic” types and their vectors. They are used to define
Boolean logic expression or to perform bit-per-bit operations on arrays of bits. They
give a result of the same type as the operand (Bit or Boolean). These operators can be
applied to signals, variables and constants.
Notice that the nand and nor operators are not associative. One should use parentheses in
a sequence of nand or nor operators to prevent a syntax error:
X nand Y nand Z will give a syntax error and should be written as (X nand Y) nand Z.
2. Relational operators
The relational operators test the relative values of two scalar types and give as result a
Boolean output of “TRUE” or “FALSE”.
Notice that symbol of the operator “<=” (smaller or equal to) is the same one as the
assignment operator used to assign a value to a signal or variable. In the following
examples the first “<=” symbol is the assignment operator. Some examples of relational
operations are:
variable STS : Boolean;
constant A : integer :=24;
constant B_COUNT : integer :=32;
constant C : integer :=14;
STS <= (A < B_COUNT) ; -- will assign the value “TRUE” to STS
STS <= ((A >= B_COUNT) or (A > C)); -- will result in “TRUE”
STS <= (std_logic (‘1’, ‘0’, ‘1’) < std_logic(‘0’, ‘1’,’1’));--makes STS “FALSE”
type new_std_logic is (‘0’, ‘1’, ‘Z’, ‘-‘);
CITSTUDENTS.I Page 18
Fundamentals of HDL 10EC45
The operand is on the left of the operator and the number (integer) of shifts is on the right
side of the operator. As an example,
variable NUM1 :bit_vector := “10010110”;
NUM1 srl 2;
will result in the number “00100101”.
When a negative integer is given, the opposite action occurs, i.e. a shift to the left will
be a shift to the right. As an example
NUM1 srl –2 would be equivalent to NUM1 sll 2 and give the result “01011000”.
Other examples of shift operations are for the bit_vector A = “101001”
variable A: bit_vector :=”101001”;
CITSTUDENTS.I Page 19
Fundamentals of HDL 10EC45
4. 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.
CITSTUDENTS.I Page 20
Fundamentals of HDL 10EC45
5. Unary operators
The unary operators “+” and “-“ are used to specify the sign of a numeric type.
6. Multiplying operators
The multiplying operators are used to perform mathematical functions on numeric types
(integer or floating point).
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 (in which A/B in an integer)
A mod B = A – B * N (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
CITSTUDENTS.I Page 21
Fundamentals of HDL 10EC45
Enumerated Types:
An Enumerated type is a very powerful tool for abstract modeling. All of the values of an
enumerated type are user defined. These values can be identifiers or single character
literals.
An identifier is like a name, for examples: day, black, x
Character literals are single characters enclosed in quotes, for example: ‘x’, ‘I’, ‘o’
Type Fourval is (‘x’, ‘o’, ‘I’, ‘z’);
Type color is (red, yello, blue, green, orange);
Type Instruction is (add, sub, lda, ldb, sta, stb, outa, xfr);
CITSTUDENTS.I Page 22
Fundamentals of HDL 10EC45
Physical types:
These are used to represent real world physical qualities such as length, mass, time and
current.
Type is range to
Units identifier;
{(identifier=physical literal;)}
end units identifier;
Examples:
(1) Type resistance is range 0 to 1E9
units
ohms;
kohms = 1000ohms;
CITSTUDENTS.I Page 23
Fundamentals of HDL 10EC45
Mohms = 1000kohms;
end units;
(2) Type current is range 0 to 1E9
units
na;
ua = 1000na;
ma = 1000ua;
a = 1000ma;
end units;
Composite Types:
Composite types consist of array and record
types. x Array types are groups of elements of
same type
x Record allow the grouping of elements of different types
x Arrays are used for modeling linear structures such as ROM, RAM
x Records are useful for modeling data packets, instruction etc.
x A composite type can have a value belonging to either a scalar type, composite type
or an access type.
Array Type:
Array type groups are one or more elements of the same type together as a single object.
Each element of the array can be accessed by one or more array indices.
Type data-bus is array (0to 31) of BIT;
Variable x: data-bus;
Variable y: bit;
Y := x(0);
Y := x(15);
Type address_word is array(0 to 63) of BIT;
Type data_word is array(7 downto 0) of std_logic;
Type ROM is array(0 to 255) of data_word;
We can declare array objects of type mentioned above as follows:
Variable ROM_data: ROM;
Signal Address_bus: Address_word;
Signal word: data_word;
Elements of an array can be accessed by specifying the index values into the array.
X<= Address_bus(25); transfers 26th element of array Address_bus to X.
Y := ROM_data(10)(5); transfers the value of 5th element in 10th row.
Multi dimentional array types may also be defined with two or more dimensions. The
following example defines a two-dimensional array variable, which is a matrix of
integers with four rows and three columns:
Type matrix4x3 is array (1 to 4, 1 to 3) of integer;
Variable matrixA: matrix4x3 := ((1,2,3), (4,5,6), (7,8,9), (10,11,12));
Variable m:integer;
The viable matrixA, will be initialized to
123
456
789
10 11 12
The array element matrixA(3,2) references the element in the third row and second
column, which has a value of 8.
CITSTUDENTS.I Page 24
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 25
Fundamentals of HDL 10EC45
Record Type:
Record Types group objects of many types together as a single object. Each element of
the record can be accessed by its field name.
Record elements can include elements of any type including arrays and records.
Elements of a record can be of the same type or different types.
Example:
Type optype is (add, sub, mpy, div, cmp);
Type instruction is
Record
Opcode : optype;
Src : integer;
Dst : integer;
End record;
module module_name(signal_names)
Signal_type signal_names;
Signal_type signal_names;
Aasign statements
Assign statements
Endmodule_name
Verilog Ports:
Input: The port is only an input port.I. In any assignment statement, the
port should appear only on the right hand side of the statement
Output: The port is an output port. The port can appear on either side of
the assignment statement.
Inout: The port can be used as both an input & output. The inout represents
a bidirectional bus.
Verilog Value Set:
0 represents low logic level or false condition
Verilog Operators
Operators in Verilog are the same as operators in programming languages. They take two
values and compare or operate on them to yield a new result. Nearly all the operators in
Verilog are exactly the same as the ones in the C programming language.
CITSTUDENTS.I Page 26
Fundamentals of HDL 10EC45
Operator Operation
Operator Type
Symbol Performed
Arithmetic * Multiply
/ Division
+ Addition
- Subtraction
% Modulus
+ Unary plus
i Unary minus
Relational > Greater than
< Less Than
Greater than or equal to
>=
CITSTUDENTS.I Page 27
Fundamentals of HDL 10EC45
^~ Bitwise xnor
~^ Bitwise xnor
Concatenation {}
Examples:
x = y + z; //x will get the value of y added to the value of z
x = 1 >> 6; //x will get the value of 1 shifted right by 5 positions
x = !y //x will get the value of y inverted. If y is 1, x is 0 and vise versa
Nets (ii)
A
Y
B
wire Y; // declaration
assign Y = A & B;
A
Y
B wand Y; // declaration
assign Y = A;
assign Y = B;
CITSTUDENTS.I Page 28
Fundamentals of HDL 10EC45
wor Y; // declaration
assign Y = A;
assign Y = B;
dr
A Y
tri Y; // declaration
assign Y = (dr) ? A : z;
Registers:
CITSTUDENTS.I Page 29
Fundamentals of HDL 10EC45
busB[1] = busA[3];
busB[2] = busA[2];
busB[3] = busA[1];
busB[4] = busA[0];
CITSTUDENTS.I Page 30
Fundamentals of HDL 10EC45
Parameters:
Parameters represents global constants.They are declared by the predefined
word parameter.
module comp_genr(X,Y,XgtY,XltY,XeqY);
parameter N = 3;
input [ N :0] X,Y;
output XgtY,XltY,XeqY;
wire [N:0] sum,Yb;
CITSTUDENTS.I Page 31
Fundamentals of HDL 10EC45
\t tab
CITSTUDENTS.I Page 32
Fundamentals of HDL 10EC45
%% %
\\ \
\“ “
Styles(Types) of Descriptions:
Behavioral Descriptions
Structural Descriptions
Switch – Level Descriptions
Data – Flow Descriptions
Mixed Type Descriptions
Behavioral Descriptions:
VHDL Behavioral description
entity half_add is
port (I1, I2 : in bit; O1, O2 : out bit);
end half_add;
architecture behave_ex of half_add is
--The architecture consists of a process construct
begin
process (I1, I2)
--The above statement is process
statement O1 <= I1 xor I2 after 10 begin
ns;
O2 <= I1 and I2 after 10 ns;
end process;
end behave_ex;
Verilog behavioral Description:
module half_add (I1, I2, O1, O2);
input I1, I2;
output O1, O2;
reg O1, O2;
always @(I1, I2)
//The above abatement is always
//The module consists of always construct
begin
#10 O1 = I1 ^ I2;
#10 O2 = I1& I2;
end
endmodule
VHDL Structural Descriptions:
entity system is
port (a, b : in bit;
sum, cout : out bit);
end system;
architecture struct_exple of system
is component xor2
--The above statement is a component
statement port(I1, I2 : in bit;
O1 : out bit);
CITSTUDENTS.I Page 33
Fundamentals of HDL 10EC45
end component;
component and2
port(I1, I2 : in bit;
O1 : out bit);
end component;
begin
X1 : xor2 port map (a, b, sum);
A1 : and2 port map (a, b, cout);
end struct_exple;
Verilog Structural Description:
module system(a, b, sum, cout);
input a, b;
output sum, cout;
xor X1(sum, a, b);
//The above statement is EXCLUSIVE-OR gate
and a1(cout, a, b);
//The above statement is AND gate
endmodule
Switch Level Descriptions:
VHDL Description:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Inverter is
Port (y : out std_logic; a: in std_logic
); end Inverter;
architecture Invert_switch of Inverter
is component nmos
--nmos is one of the key words for switch-
level. port (O1: out std_logic; I1, I2 : in
std_logic); end component;
component pmos
--pmos is one of the key words for switch-
level. port (O1: out std_logic ;I1, I2 : in
std_logic); end component;
for all: pmos use entity work. mos
(pmos_behavioral); for all: nmos use entity work.
mos (nmos_behavioral);
--The above two statements are referring to a package mos
--See details in Chapter 5
constant vdd: std_logic := '1';
constant gnd : std_logic:= '0';
begin
p1 : pmos port map (y, vdd, a);
n1: nmos port map (y, gnd, a);
end Invert_switch;
CITSTUDENTS.I Page 34
Fundamentals of HDL 10EC45
begin
s <= a xor b;
c <= a and
b;
end HA_DtFl;
Verilog Data – Flow Description:
module halfadder (a,b,s,c);
input a;
input b;
output s;
output c;
assign s = a ^ b;
assign c = a &
b;
endmodule
Comparision of VHDL & Verilog:
Data Types
VHDL: Types are in built in or the user can create and define them.User defined
types give the user a tool to write the code effectively. VHDL supports
multidimensional array and physical type.
Verilog: Verilog data types are simple & easy to use. There are no user defined types.
Ease of Learning
VHDL:Hard to learn because of its rigid type requirements.
Verilog: Easy to learn,Verilog users just write the module without worrying about
what Library or package should be attached.
Libraries and Packages
VHDL:Libraries and packages can be attached to the standard VHDL
package.Packages can include procedures and functions, & the package can be made
available to any module that needs to use it.
CITSTUDENTS.I Page 35
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 36
Fundamentals of HDL 10EC45
Operators
VHDL:An extensive set of operators is available in VHDL,but it does not have
predefined unary operators.
Verilog: An extensive set of operators is also available in verilog. It also has
predefined unary operators.
Procedures and Tasks
VHDL:Concurrent procedure calls are allowed. This allows a function to be written
inside the procedure’s body.This feature may contribute to an easier way to describe a
complex system.
Verilog:Concurrent task calls are allowed.Functions are not allowed to be written in
the task’s body.
CITSTUDENTS.I Page 37
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
1) Explain entity and architecture with an example
2) Explain structure of verilog module with an example
3) Explain VHDL operators in detail.
4) Explain verilog operators in detail.
5) Explain how data types are classified in HDL. Mention the advantages of VHDL
data types over verilog.
6) Mention the types of HDL descriptions. Explain dataflow and behavioral descriptions
CITSTUDENTS.I Page 38
Fundamentals of HDL 10EC45
Recommended readings:
CITSTUDENTS.I Page 39
Fundamentals of HDL 10EC45
Verilog Description
module system (I1, I2, O1, O2);
input I1, I2;
output O1, O2;
/*by default all the above inputs and outputs are 1-bit signals.*/
CITSTUDENTS.I Page 40
Fundamentals of HDL 10EC45
Examples:
constant RISE_FALL_TME: time := 2 ns;
constant DELAY1: time := 4 ns;
CITSTUDENTS.I Page 41
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux2x1 is
port (A, B, SEL, Gbar : in
std_logic; Y : out std_logic);
end mux2x1;
CITSTUDENTS.I Page 42
Fundamentals of HDL 10EC45
output Y;
wire S1, S2, S3, S4, S5;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mult_arry is
port (a, b : in std_logic_vector(1 downto 0);
P : out std_logic_vector (3 downto 0));
end mult_arry;
CITSTUDENTS.I Page 43
Fundamentals of HDL 10EC45
end MULT_DF;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity D_Latch is
port (D, E : in std_logic;
Q, Qbar : buffer std_logic);
-- Q and Qbar are declared as buffer because they act as
--both input and output, they appear on the right and left
--hand side of signal assignment statements. inout or
-- linkage could have been used instead of
buffer. end D_Latch;
CITSTUDENTS.I Page 44
Fundamentals of HDL 10EC45
end DL_DtFl;
time Delay_EorD = 9;
time Delay_inv = 1;
assign #Delay_EorD Qbar = ~((E & D) |
(~E & Q));
assign #Delay_inv Q = ~ Qbar;
endmodule
HDL Code of a 2x2 Magnitude Comparator—VHDL and Verilog:
entity COMPR_2 is
port (x, y : in std_logic_vector(1 downto 0); xgty,
xlty : buffer std_logic; xeqy : out std_logic);
end COMPR_2;
CITSTUDENTS.I Page 45
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity adders_RL is
port (x, y : in std_logic_vector (2 downto 0);
cin : in std_logic;
sum : out std_logic_vector (2 downto 0);
cout : out std_logic);
end adders_RL;
begin
sum(0) <= (x(0) xor y(0)) xor cin after 2*delay_gt;
2*delay_gt;
CITSTUDENTS.I Page 46
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 47
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 48
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 49
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 50
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
1) With illustrations briefly discuss
i) Signal declaration & assignment statements
ii) Concurrent signal assignment statements &
iii) Constant declaration & assignment statements.
2) Explain how an object that has a width of more than 1 bit is declared in HDL
using vector data types. Give examples.
3) Explain signal declaration & signal assignment statements with relevant examples.
4) Write a data – flow description (in both VHDL & Verilog) for a full adder with
active high enable.
5) Write HDL codes for 2X2 bit combinational array multiplier.
6) How do you assign delay to a signal assignment statement? Explain with an
example in VHDL & verilog
7) What is a vector? Give an example for VHDL & verilog vector data types.
8) With the help of a truth table and K – maps write Boolean expression for a 2-
bit magnitude comparator, write VHDL/ verilog code
9) What are the data types available in VHDL?
10) Write a HDL Code of a 2x1 Multiplexer
CITSTUDENTS.I Page 51
Fundamentals of HDL 10EC45
Recommended readings:
CITSTUDENTS.I Page 52
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 53
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 54
Fundamentals of HDL 10EC45
s2 and s3. All the signals will be updated at Delta time after the TRIGGER has arrived.
Thus the signals will have these values: s1= 2, s2= 4 (ie 1(old value of s1) +3), s3=2(old
value of s2) and RESULT=6 ie (1+2+3)
CITSTUDENTS.I Page 55
Fundamentals of HDL 10EC45
begin
[sequential_statements]
wait ...; -- at least one wait
statement [sequential_statements]
end process [proc_label];
The structure of a process statement is similar to the structure of an architecture.
In the proc_declarativ_part various types, constants and variables can be declared;
functions and procedures can be defined. The sequential_statement_part contains the
description of the process functionality with ordered sequential statements.
Sensitivity:
The process statement can have an explicit sensitivity list. The list defines the signal that
cause the statements inside the process statement to execute whenever one or more
elements of the list change value.
When the program flow reaches the last sequential statement, the process becomes
suspended, until another event occurs on a signal that is sensitive.
Following are the sequential statements:
if-elsif-else statement:
This branching statement is equivalent to the ones found in other programming
languages
Syntax:
if condition then
sequential_statements
{elsif condition then
sequential_statements}
[else
sequential_statements]
end if;
Example1: if statement(without else) and a common use of the VHDL attribute.
count: process (x)
variable cnt : integer :=0 ;
begin
if (x='1' and x'last_value='0') then
cnt:=cnt+1;
end if;
end process;
This if statement has two main parts, the condition and the statement body. A condition is
any boolean expression (an expression that evaluates to TRUE and FALSE, such as
expressions using relational operators). The condition in the example uses the attribute
last_value, which is used to determine the last value that a signal had. Attributes can be
used to obtain a lot of auxiliary information about signals.
The execution of the if statement begins by evaluating the condition. If the condition
evaluates to the value TRUE then the statements in the statement body will be executed.
Otherwise, execution will continue after the end if and the statement body of the if
statement is skipped. Thus, the assignment statement in this example is executed every
time there is a rising edge on the signal x, counting the number of rising edges.
Example 2: D flip flop
model library ieee ;
use ieee.std_logic_1164.all;
entity dff is
port( data_in: in
std_logic; clock: in
std_logic;
CITSTUDENTS.I Page 56
Fundamentals of HDL 10EC45
data_out:
); out std_logic
end dff;
architecture behv of dff is
begin
process(clock)
begin
-- clock rising edge
if (clock='1' and clock'event) then
data_out <= data_in;
end if;
end process;
end behv;
clock='1' and clock'event – This condition becomes true, when there is a event on the
clock and clock state is equal to one i.e. rising edge of the clock.
clock'event – Event is an attribute on the signal to check whether any change in the
signal is present.
case statement:
This statement is also identical to switch statement found in C programming
language.
Syntax:
case expression is
{when choices => sequential_statements}
[when others => sequential_statements]
end case;
The case statement selects one of the branches of execution based on the value of
expression.
Choices may be expressed as single value or as a range of values.
Either all possible values of expression must be covered with choices or the case
statement has to be completed with an others branch.
Example1: VHDL code for 4:1 MUX (using case statement)
library ieee;
use ieee.std_logic_1164.all;
entity mux is
Port ( i : in std_logic_vector(3 downto 0);
s : in std_logic_vector(1 downto 0);
y : out std_logic);
end mux;
architecture Behavioral of mux is
begin
process(s,i)
begin
case s is
when "00"=> y<=i(0);
when "01"=> y<=i(1);
when "10"=> y<=i(2);
when "11"=> y<=i(3);
when others =>y<='Z';
end case ;
end process;
CITSTUDENTS.I Page 57
Fundamentals of HDL 10EC45
end Behavioral;
Loop statement
Loop statement is a conventional loop structure found in other programming
languages.
Syntax for while loop:
while condition loop | --controlled by condition
Example:
X<=1; sum<=1;
While (x<10) loop
sum <=sum*2;
x<=x+1;
end loop;
Syntax for for loop:
for identifier in value1 to|downto value2 loop | --with
counter
In the for loop the counter identifier is automatically declared. It is handled as a
local variable within the loop statement. Assigning a value to identifier or reading
it outside the loop is not possible. The for statement is used to execute a list of
statements several times.
Example 1: four bit parallel adder using for loop
library ieee;
use ieee.std_logic_1164.all;
entity FOURBITADD is
port (a, b: in std_logic_vector(3 downto 0);
Cin : in std_logic;
sum: out std_logic_vector (3 downto 0);
Cout: out std_logic);
end FOURBITADD;
architecture fouradder_loop of FOURBITADD is
signal ct: std_logic_vector(4 downto 0);
begin
process(a,b,cin)
begin
ct(0)<= cin;
for i in 0 to 3 loop
s(i)<=a(i) xor b(i) xor ct(i);
ct(i+1)<= (a(i) and b(i)) or (a(i) and ct(i)) or (b(i) and ct(i));
end loop;
cout<= ct(4);
end process;
end fouradder_loop;
Syntax for unconditional loop:
loop
sequential_statements
exit when (condition);
end loop [loop_label];
Exit statement allows the user to terminate the loop.
Next, Exit, Wait and Assert statements
next and exit statement:
With these two statements a loop iteration can be terminated before reaching the keyword
CITSTUDENTS.I Page 58
Fundamentals of HDL 10EC45
end loop.
With next the remaining sequential statements of the loop are skipped and the next
iteration is started at the beginning of the loop.
The exit directive skips the remaining statements and all remaining loop iterations.
Syntax:
next [loop_label][when condition];
exit [loop_label][when condition];
Example for next statement:
Process (a, b)
Begin
for i in 0 to 15
loop if (i = 7 ) then
next;
else
q(i)<=a(i) AND b(i);
end if;
end loop;
end process;
The loop statement logically ands array of a and b bits. And transfers result to q. This
behavior continues except for 7th element. When i=7 the execution starts from next
iteration. The statements after next are not executed for current iteration.
Example for Exit statement:
Sum:=1;
L3: Loop
Sum:=sum*10;
If sum>100 then
Exit L3;
End if;
End loop L3;
Exit statement provides termination for unconditional loop depending on
condition.
wait statement:
This statements may only be used in processes without a sensitivity_list. The purpose of
the wait statement is to control activation and suspension of the process.
Syntax:
wait on signal_names
wait until condition
wait for time_expression];
The arguments of the wait statement have the following interpretations:
1. wait on signal_names: The process gets suspended at this line until there is an
event on at least one signal in the list signal_names. The signal_names are separated by
commas; brackets are not used. It can be compared to the sensitivity_list of the
process statement.
Example 1: D flip flop model using wait
statement library ieee ;
use ieee.std_logic_1164.all;
entity dff is
port(reset, d: in
std_logic; clock: in
std_logic;
q: out std_logic
);
end dff;
architecture behv of dff is
CITSTUDENTS.I Page 59
Fundamentals of HDL 10EC45
begin
process
begin
--asynchronous reset input
if (reset=’0’) then q<=’0’;
-- clock rising edge
elsif (clock='1' and clock'event) then
q <= d;
end if;
wait on reset,clock;
end process;
end behv;
The statements within the process body are executed only when there
is an event on reset or event on clock.
2. wait until condition: The process gets suspended until the condition becomes true.
Example (synchronous reset input)
Process
Begin
Wait until clock=’1’ and clock’event
If (reset=’0’) then
Q<=’0’;
Else q<=d;
End if;
End process;
When the rising edge of the clock occurs, the Reset signal is tested
first. If Reset is 0, d is assigned to q output.
3. wait for time_expression: The process becomes suspended for the time specified
by
time_expression.
Process
Begin
A<=’0’; Wait for 5ns;
A<=’1’; Wait for 5ns;
End process;
In the above statement, it generates a clock for 5ns low state and 5ns high state.
4. wait without any argument: The process gets suspended until the end of
the simulation.
assertion statement:
Generating error or warning messages is possible also within the process environment.
Syntax:
assert condition
[report string_expr]
[severity failure|error|warning|note];
Example:
In JK or D Flip flop, if both asynchronous inputs Set and Reset are at logical 0 state,
changes output q an qb both to be at 1 and 1 which is the violation of Boolean law. This
condition can be verified by assert statement.
Assert (Set=’1’ or Reset = ‘1’)
Report “Set and Reset both are 0”
Severity ERROR;
If we wish to check D input has stabilized before the clock input changes, then assert
statement can be used as shown.
CITSTUDENTS.I Page 60
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 61
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 62
Fundamentals of HDL 10EC45
begin
if Gbar = '0' then
if SEL = '1'
then
temp := B;
else
temp := A;
end if;
Y <= temp;
else
Y <= 'Z';
end if;
end process;
end MUX_bh;
CITSTUDENTS.I Page 63
Fundamentals of HDL 10EC45
Y = 1'bz;
else
begin
if (SEL)
Y = B;
/* This is a procedural assignment. Procedural assignments
are used to assign values to variables declared as regs
(as Y here in this module). Procedural statements have
to appear inside always, blocks, initial, tasks, or functions*/
else
Y = A;
end
end
endmodule
HDL Description of a 2x1 Multiplexer Using ELSE-IF—VHDL and Verilog
CITSTUDENTS.I Page 64
Fundamentals of HDL 10EC45
endmodule
Behavioral Description of a Latch Using Variable and Signal Assignments
CITSTUDENTS.I Page 65
Fundamentals of HDL 10EC45
entity DLTCH_var is
port (d, E : in bit; Q, Qb : out bit);
-- Since we are using type bit, no need for attaching a Library.
-- If we use std_logic, we should attach the IEEE Library.
end DLTCH_var;
architecture DLCH_VAR of DLTCH_var is
begin
VAR : process (d, E)
variable temp1, temp2 : bit;
begin
if E = '1' then
temp1 := d; -- Variable assignment statement.
temp2 := not temp1; -- Variable assignment
statement.
end if;
Qb <= temp2; -- Value of temp2 is passed to Qb
Q <= temp1; -- Value of temp1 is passed to Q
end process VAR;
end DLCH_VAR;
VHDL Code for Behavioral Description of D-Latch Using Signal-Assignment
Statements
entity Dltch_sig is
port (d, E : in bit; Q : buffer bit; Qb : out bit);
--Q is declared as a buffer because it is an input/output
--signal; it appears on both the left and right
-- hand sides of assignment
--statements.
end Dltch_sig;
architecture DL_sig of Dltch_sig
is begin
process (d, E)
begin
if E = '1' then
Q <= d; -- signal assignment
Qb <= not Q; -- signal
assignment
end if;
end process;
end DL_sig;
CITSTUDENTS.I Page 66
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 67
Fundamentals of HDL 10EC45
end JK_BEH;
endmodule
Behavioral description of a 3-bit binary counter with active high synchronous clear
CITSTUDENTS.I Page 68
Fundamentals of HDL 10EC45
HDL Code for a 3-Bit Binary Counter Using the Case Statement
end ctr_case;
output [2:0] q;
reg [2:0] q;
initial /* The initial procedure is to force the counter
to start from initial count q=110 */
CITSTUDENTS.I Page 69
Fundamentals of HDL 10EC45
q = 3'b101;
always @ (posedge clk)
begin
if (clr == 0)
begin
case (q)
3'd0 : q = 3'd1;
3'd1 : q = 3'd2;
3'd2 : q = 3'd3;
3'd3 : q = 3'd4;
3'd4 : q = 3'd5;
3'd5 : q = 3'd6;
3'd6 : q = 3'd7;
3'd7 : q = 3'd0;
endcase
end
else
q = 3'b000;
end
endmodule
Behavioral Description of a 4-bit positive Edge – Triggered counter
HDL Code for a 4-Bit Counter with Synchronous Clear—VHDL and Verilog
CITSTUDENTS.I Page 70
Fundamentals of HDL 10EC45
result := result + 1;
-- change integer to binary
for j in 0 to 3 loop
if (result MOD 2 = 1) then
temp (j) := '1';
else temp (j) := '0';
end if;
-- integer division by 2
result := result/2;
end loop;
else temp := "0000";
end if;
q <= temp;
end if;
end process ct;
end CTR_LOP;
CITSTUDENTS.I Page 71
Fundamentals of HDL 10EC45
end
end
else q = 4'b0000;
end
endmodule
end CNTR_Hold;
architecture CNTR_Hld of CNTR_Hold is
begin
ct : process (clk)
variable temp : std_logic_vector
(3 downto 0) := "0000";
-- temp is initialized to 0 so count starts at 0
variable result : integer := 0;
begin
if rising_edge (clk) then
result := 0;
-- change binary to integer
lop1 : for i in 0 to 3 loop
if temp(i) = '1' then
result := result +
2**i; end if;
end loop;
-- increment result to describe a counter
result := result + 1;
-- change integer to binary
lop2 : for i in 0 to 3 loop
-- exit the loop if hold = 1
exit when hold = '1';
-- “when” is a predefined word
if (result MOD 2 = 1) then
temp (i) := '1';
else
temp (i) := '0';
end if;
CITSTUDENTS.I Page 72
Fundamentals of HDL 10EC45
--Successive division by 2
result := result/2;
end loop;
q <= temp;
end if;
end process ct;
end CNTR_Hld;
for (i = 0; i <= 3; i = i + 1)
begin
if (q[i] == 1)
result = result + 2**i;
end
result = result + 1;
for (i = 0; i <= 3; i = i + 1)
begin
if (hold == 1)
i = 4; //4 is out of range, exit.
else
begin
if (result %2 == 1)
q[i] = 1;
else
q[i] = 0;
result = result/2;
end
end end
endmodule
CITSTUDENTS.I Page 73
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 74
Fundamentals of HDL 10EC45
Booth Algorithm:
CITSTUDENTS.I Page 75
Fundamentals of HDL 10EC45
case temp is
when "10" => sum (7 downto 4) :=
sum (7 downto 4) + Y1;
when "01" => sum (7 downto 4) :=
sum (7 downto 4) + Y;
when others => null;
end case;
sum := sum srl 1; --This is a logical
--shift of one position to the
right sum (7) := sum(6);
E1(0) := x(i);
end loop;
if (y = "1000") then
sum := - sum;
end if;
z <= sum;
end process;
end booth_4;
CITSTUDENTS.I Page 76
Fundamentals of HDL 10EC45
Y1 = - Y;
case (temp)
2'd2 : Z [7 : 4] = Z [7 : 4] + Y1;
2'd1 : Z [7 : 4] = Z [7 : 4] + Y;
default : begin
end endcase
Z = Z >> 1;
/*The above statement is a logical shift of one position to
the right*/
Z[7] = Z[6];
/*The above two statements perform arithmetic shift
where the sign of the number is preserved after the shift. */
E1 = X[i];
end
if (Y == 4'd8)
begin
Z = - Z;
end
end
endmodule
CITSTUDENTS.I Page 77
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
1) Write behavioral description of half adder in VHDL and verilog with
propagation delay of 5nsec. Discuss the important features of their description in
VHDL and verilog
2) Explain the structure of various loop statements in HDL with examples
3) Explain verilog Repeat and Forever statements with an example
4) Explain different loop statements in
5) Explain IF and CASE statements with examples
6) Explain Booth algorithm with a flow chart. Write VHDL or verilog description for
4X4 bit booth algorithm.
7) Write VHDL code for a D-latch using variable assignment & signal assignment
statements with simulation waveforms clearly distinguish between the two
statements.
8) Write a behavioral description of D- Latch using variable & signal assign
9) What is HDL? Why do you need it
CITSTUDENTS.I Page 78
Fundamentals of HDL 10EC45
Recommended readings:
CITSTUDENTS.I Page 79
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 80
Fundamentals of HDL 10EC45
endmodule
CITSTUDENTS.I Page 81
Fundamentals of HDL 10EC45
entity half_add is
port (a, b : in std_logic; S, C : out
std_logic); end half_add;
BINDING
Binding (linking) segment1 in HDL code to segment2 makes all information in
segment2.
Binding Between a Library and Component in VHDL
CITSTUDENTS.I Page 82
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 83
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity bind1 is
port (I1 : in std_logic; O1 : out
std_logic); end bind1;
architecture inv_0 of bind1 is
begin
O1 <= not I1; --This is an inverter with zero delay
end inv_0;
library IEEE;
CITSTUDENTS.I Page 84
Fundamentals of HDL 10EC45
use IEEE.STD_LOGIC_1164.ALL;
entity bind2 is
port (I1, I2 : in std_logic; O1 : out std_logic);
end bind2;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity bind3 is
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end bind3;
CITSTUDENTS.I Page 85
Fundamentals of HDL 10EC45
component or2
port (I1, I2 : in std_logic; O1 : out
std_logic); end component;
component Inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
CITSTUDENTS.I Page 86
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 87
Fundamentals of HDL 10EC45
entity bind2 is
port (I1, I2 : in std_logic; O1 : out std_logic);
end bind2;
--Add the following architecture to
--the entity bind2 of Listing 4.8
architecture bufif1 of bind2 is
begin
buf : process (I1, I2)
variable tem : std_logic;
begin
if (I2 ='1') then
tem := I1;
else
tem := 'Z';
end if;
O1 <= tem;
end process buf;
end bufif1;
HDL Description of a 2x4 Decoder with Tri-State Output—VHDL and Verilog
entity decoder2x4 is
port (I : in std_logic_vector(1 downto 0); Enable : in
std_logic; D : out std_logic_vector (3 downto 0));
end decoder2x4;
CITSTUDENTS.I Page 88
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 89
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity bind22 is
Port (I1, I2 : in std_logic; O1, O2 : out std_logic);
end bind22;
architecture HA of bind22 is
component xor2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
CITSTUDENTS.I Page 90
Fundamentals of HDL 10EC45
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
begin
HA1 : HA port map (y, cin, s0, c0);
HA2 : HA port map (x, s0, sum, c1);
r1 : or2 port map (c0, c1, carry);
end full_add;
CITSTUDENTS.I Page 91
Fundamentals of HDL 10EC45
end SR_latch;
CITSTUDENTS.I Page 92
Fundamentals of HDL 10EC45
entity D_Latch is
port (D, E : in std_logic; Q, Qbar : buffer std_logic);
end D_Latch;
CITSTUDENTS.I Page 93
Fundamentals of HDL 10EC45
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component nor2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
for all : and2 use entity work.bind2 (and2_4);
for all : nor2 use entity work.bind2 (nor2_4);
for all : inv use entity work.bind1 (inv_1);
signal Eb, s1, s2 : std_logic;
begin
a1 : and2 port map (D, E, s1);
a2 : and2 port map (Eb, Q, s2);
in1 : inv port map (E, Eb);
in2 : inv port map (Qbar, Q);
n2 : nor2 port map (s1, s2, Qbar);
end D_latch_str;
CITSTUDENTS.I Page 94
Fundamentals of HDL 10EC45
entity D_FFMaster is
Port (D, clk : in std_logic; Q, Qbar : buffer std_logic);
end D_FFMaster;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
component D_latch
port (I1, I2 : in std_logic; O1, O2 : buffer std_logic);
CITSTUDENTS.I Page 95
Fundamentals of HDL 10EC45
end component;
for all : D_latch use entity work.bind22
(D_latch); for all : inv use entity work.bind1
(inv_1);
signal clkb, clk2, Q0, Qb0 : std_logic;
begin
D0 : D_latch port map (D, clkb, Q0, Qb0);
D1 : D_latch port map (Q0, clk2, Q, Qbar);
in1 : inv port map (clk, clkb);
in2 : inv port map (clkb,
clk2); end D_FF;
CITSTUDENTS.I Page 96
Fundamentals of HDL 10EC45
entity JK_FF is
port (J, K, clk : in std_logic; Q, Qbar : buffer std_logic);
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component or2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
component D_flip
CITSTUDENTS.I Page 97
Fundamentals of HDL 10EC45
input D, clk;
output Q, Qbar;
wire clkb, clk2, Q0, Qb0;
not #1 (clkb, clk);
not #1 (clk2, clkb);
D_latch D0 (D, clkb, Q0, Qb0);
D_latch D1 (Q0, clk2, Q, Qbar);
endmodule
CITSTUDENTS.I Page 98
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page 99
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity three_bit_adder is
port(x, y : in std_logic_vector (2 downto 0);
cin : in std_logic; sum : out std_logic_vector (2 downto 0);
cout : out std_logic);
end three_bit_adder;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
endmodule
Structural Description of a 3-bit Magnitude Comparator Using 3-Bit Adder
entity three_bit_cmpare is
port (X, Y : in std_logic_vector (2 downto 0);
xgty, xlty, xeqy : buffer std_logic);
end three_bit_cmpare;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
component full_adder
--The current module could have been linked to the 3-bit adders
--designed in Listing 4.18 instead of linking to
--F0, F1, and F2, as was done here.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
FIGURE4.15 K – maps
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity memory is
port (Sel, RW, Din : in std_logic; O1: buffer std_logic );
end memory;
component and3
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end component;
component inv
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
component or2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component bufif1
port (I1, I2 : in std_logic; O1 : out
std_logic); end component;
component SR_Latch
port (I1, I2 : in std_logic; O1, O2 : buffer std_logic);
end component;
for all : and3 use entity work.bind3
(and3_0); for all : inv use entity work.bind1
(inv_0); for all : or2 use entity work.bind2
(or2_0); for all : bufif1 use entity work.bind2
(bufif1);
for all : SR_Latch use entity work.bind22 (SR_Latch);
signal RWb, Dinb, S, S1, R, O11, Q : std_logic;
begin
in1 : inv port map (RW, RWb);
in2 : inv port map (Din, Dinb);
a1 : and3 port map (Sel, RWb, Din, S); a2
: and3 port map (Sel, RWb, Dinb, R); SR1
: SR_Latch port map (S, R, Q, open);
--open is a predefined word;
--it indicates that the port is left open.
a3 : and3 port map (Sel, RW, Q, S1);
or1 : or2 port map (S1, S, O11);
buf1 : bufif1 port map (O11, Sel, O1);
end memory_str;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
STATE MACHINES
FIGURE 4.17 Logic symbol of a 3-bit counter with active low clear.
FIGURE 4.18 State diagram of a 3-bit counter with active low clear.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
FIGURE 4.20 Logic diagram of a 3-bit synchronous counter with active low clear using
JK master- slave flip – flops.
***Begin Listing***
VHDL 3-Bit Synchronous Counter Using JK Master-Slave Flip-Flops
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity countr_3 is
port(clk, clrbar : in std_logic;
q, qb : buffer std_logic_vector(2 downto 0));
end countr_3;
component JK_FF
port (I1, I2, I3 : in std_logic; O1, O2 : buffer std_logic);
end component;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component or2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Figure 4.21 simulation waveform of a 3-bit synchronous counter with active low clear.
Structural Description of a 3-Bit Synchronous Even Counter with active High Hold
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
HDL Description of a 3-Bit Synchronous Even Counter with Hold—VHDL and Verilog
entity CTR_EVEN is
port (H, clk : in std_logic;
Q, Qbar : buffer std_logic_vector (2 downto 0));
end CTR_EVEN;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component or2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component and3
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end component;
component or3
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end component;
component D_FF
port (I1, I2 : in std_logic; O1, O2 : buffer std_logic);
end component;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
input H, clk;
output [2:0] Q, Qbar;
D_FFMaster DFF0 (1'b0, clk, Q[0], Qbar[0]);
not (Hbar, H);
and (a1, Qbar[1], Hbar);
and (a2, H, Q[1], Qbar[0]);
or (OR1, a1, a2);
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
clr =0 clr= 0
00 01 11 10 00 01 11 10
0 02
00 1 1 1 1 00 1 1 1 1
01 1 1 1 1 01 1 1 1 1
11 1 1 1 1 11 1 1 1 1
10 1 1 1 1 10 1 1 1 1
JO KO
clr =0 clr = 0
00 01 11 10
00 01 11 10
02
-- r:-- 1--.----.-
--
00 1I
I
0 I 1 I 1
I I 00 1I 0 0 11-
I
I
I
I I
-
1I I
01
--J 0 I 1
I 1I
"'-I- I I
:
r,--- -tn
01 1I 0 0
11
-
---1 ..I
- -J
11 0
I I I
1:
I
11 0
---
11 0
I I
1 1II
10 0 :
'- I1 I
- -'-- '-- I
-- 10 0 :1
--
1 I 0
J1 K1
clr = 0 clr = 0
00 01 11 10 00 01 11 10
2 0 2
00 1 0 0 0 00 0 0 0 0
01 1 0 0 0 01 0 0 0 0
11 0 0 1 0 11 0 0 0 0
10 0 0 1 0 10 0 0 0 0
J2 K2
FIGURE 4.28 K-maps of a 3-bit synchronous up/down counter.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
***Begin Listing***
VHDL 3-Bit Synchronous Up/Down Counter with Clear and Terminal Count
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity up_down is
port (clr, Dir, clk : in std_logic; TC : out std_logic;
Q, Qbar : buffer std_logic_vector (2 downto 0));
end up_down;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component or2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component and3
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end component;
component JK_FF
port (I1, I2, I3 : in std_logic; O1, O2 : buffer std_logic);
end component;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
-- For an8 and an9, we could have used 5-input and gate;
-- but two and gates with a reasonable number of
-- fan-in (three-input) is preferred. Same
-- argument for an10 and an11*/
an10 : and3 port map (clrbar, Q(0), Q(1), S(10));
an11 : and3 port map (Dir, Q(2), s(10), S(11));
r6 : or2 port map (s(9), s(11), TC);
end Ctr_updown;
/* For an8 and an9, a five-input and gate could have been used;
but two and gates with a reasonable number of fan-in
(three-input) is preferred. Same argument for an10 and an11*/
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity decade_ctr is
port (clk : in std_logic;
Q, Qbar : buffer std_logic_vector (3 downto 0);
TC : out std_logic);
end decade_ctr;
component buf
port (I1 : in std_logic; O1 : out
std_logic); end component;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component and3
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end component;
component and4
port (I1, I2, I3, I4 : in std_logic; O1 : out std_logic);
end component;
component or2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component or3
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end component;
component D_FF
port (I1, I2 : in std_logic; O1, O2 : buffer std_logic);
end component;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
endmodule
entity compr_genr is
generic (N : integer := 3);
component full_adder
port (I1, I2, I3 : in std_logic; O1, O2 : out std_logic);
end component;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
component nor2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
signal sum, Yb : std_logic_vector (N downto 0);
signal carry, eq : std_logic_vector (N + 1 downto 0);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
generate
genvar i;
for (i = 0; i <= N; i = i +
1) begin : u
not (Yb[i], Y[i]);
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end Word_generate;
parameter N = 7;
input [N:0] Data_in;
input sel, R_W;
output [N:0] Data_out;
generate
genvar i;
for (i = 0; i <= N; i = i + 1)
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin : u
memory M1 (sel, R_W, Data_in [i], Data_out[i]);
end
endgenerate
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Recommended readings:
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Often the algorithmic model becomes so large that it needs to be split into distinct code
segments. And many a times a set of statements need to be executed over and over again
in different parts of the model. Splitting the model into subprograms is a programming
practice that makes understanding of concepts in VHDL to be simpler. Like other
programming languages, VHDL provides subprogram facilities in the form of procedures
and functions. The features of subprograms are such that they can be written once and
called many times. They can be recursive and thus can be repeated from within the scope.
The major difference between procedure and function is that the function has a return
statement but a procedure does not have a return statement.
Types Of Subprograms
The variables, constants and signals specified in the subprogram declaration are called
formal parameters._
The variables, constants and signals specified in the subprogram call are called actual
parameters.
Formal parameters act as place holders for actual parameters.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Functions
A function call is the subprogram of the form that returns a value. It can also be defined
as a subprogram that either defines a algorithm for computing values or describes a
behavior. The important feature of the function is that they are used as expressions that
return values of specified type. This is the main difference from another type of
subprogram: procedures, which are used as statements. The results return by a function
can be either scalar or complex type.
Function Syntax
Functions can be either pure (default) or impure. Pure functions always return the same
value for the same set of actual parameters. Impure functions may return different values
for the same set of parameters. Additionally an impure function may have side effects
like updating objects outside their scope, which is not allowed in pure function.
The function definition consists of two parts:
1) Function declaration: this consists of the name, parameter list and type of
values returned by function
Functional Declaration:
The function declaration can be preceded by an optional reserved word pure or impure,
denoting the character of the function. If the reserved word is omitted it is assumed to be
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
pure by default.
The function name (id), which appears after the reserved word function can either be an
identifier or an operator symbol. Specification of new functions for existing operators is
allowed in VHDL and is called OPERATOR OVERLOADING.
The parameters of the function are by definition INPUTS and therefore they do not need
to have the mode (direction) explicitly specified. Only constants, signals and files can be
function parameters .The object class is specified by using the reserved words (constant,
signal or file respectively) preceding the parameter name. If no reserved word is used, it
is assumed that the parameter is a CONSTANT.
In case of signal parameters the attributes of the signal are passed into the function,
except for `STABLE, `QUIET, `TRANSACTION and `DELAYED, which may not be
accessed within the function.
Variable class is NOT allowed since the result of operations could be different when
different instantiations are executed. If a file parameter is used, it is necessary to specify
the type of data appearing in the opened file.
Function Body:
Function body contains a sequence of statements that specify the algorithm to be realized
within the function. When the function is called, the sequence of statements is executed..
A function body consists of two parts: declarations and sequential statements. At the end
of the function body, the reserved word END can be followed by an optional reserved
word FUNCTION and the function name.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Example 1
· The first function name above is called func_1, it has three parameters A,B and
X, all of the REAL types and returns a value also of REAL type.
· The second function defines a new algorithm for executing multiplication. Note
that the operator is enclosed in double quotes and plays the role of the function
name.
· The third is based on the signals as input parameters, which is denoted by the
reserved word signal preceding the parameters.
· The fourth function declaration is a part of the function checking for end of file,
consisting of natural numbers. Note that the parameter list uses the Boolean type
declaration.
Example 2
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
The case statement has been used to realize the function algorithm. The formal
parameter appearing in the declaration part is the value constant, which is a parameter
of the std_logic_vector type. This function returns a value of the same type.
The formal parameters: A, B and X are constants of the real type. The value returned
by this function is a result of calculating the A*X**2+B expression and it is also of
the real type.
Procedure
A procedure is a subprogram that defined as algorithm for computing values or exhibiting
behavior. Procedure call is a statement which encapsulates a collection of sequential
statements into a single statement. It may zero or more values .it may execute in zero or
more simulation time.
· Procedure declarations can be nested Allows for recursive calls
· Procedures can call other procedures
· Procedure must be declared before use. It can be declared in any place where
declarations are allowed, however the place of declaration determines the
scope
· Cannot be used on right side of signal assignment expression since doesn’t
return value
Procedure Syntax.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
The procedure declaration consists of the procedure name and the formal parameter
list. In the procedure specification, the identifier and optional formal parameter list
follow the reserved word procedure (example 1)
Objects classes CONSTANTS, VARIABLES, SIGNALS, and files can be used as
formal parameters. The class of each parameter is specified by the appropriate reserve
word, unless the default class can be assumed. In case of constants variables and
signals, the parameter mode determines the direction of the information flow and it
decides which formal parameters can be read or written inside the procedure.
Parameters of the file type have no mode assigned.
There are three modes available: in, out and inout. When in mode is declared and
object class is not defined, then by default it is assumed that the object is a
CONSTANT. In case of inout and out modes, the default class is VARIABLE. When
a procedure is called formal parameters are substituted by actual parameters, if a
formal parameter is a constant, then actual parameter must be an expression. In case
of formal parameters such as signal, variable and file, the actual parameters such as
class. Example 2 presents several procedure declarations with parameters of different
classes and modes. A procedure can be declared without any parameters.
Procedure Body
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
The above procedure declaration has two formal parameters: bi-directional X and Y
of real type.
Example 2
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Procedure proc_1 has two formal parameters: the first one is a constant and it is in the
mode in and of the integer type, the second one is an output variable of the integer
type.
Procedure proc_2 has only one parameter, which is a bi-directional signal of type
std_logic.
Procedure Call
Tasks (Verilog)
Tasks are Verilog subprograms. They can be implemented to execute specified routines
repeatedly. The format in which the task is written can be divided into two parts: the
declaration and the body of the task. In the declaration, the name of the task is specified,
and the outputs and inputs of the task are listed. An example of task declaration is:
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
task addr;
output cc,dd;
input aa,bb;
addr is the name(identifier) of the task. The outputs are cc and dd, and the inputs are
aa and bb, task is a predefined word. The body of the task shows the relationship
between the outputs and the inputs. An example of the body a task is:
begin
cc = aa ^ bb;
…………….
end
endtask
The body of the task cannot include always or initial. A task must be called within the
behavioral statement always or initial. An example of calling the task addr is as follows.
……………..
always @ ( a, b)
begin
addr(c,d,a,b);
end
addr is the name of the task,and inputs a and b are passed to aa and bb. The outputs of the
task cc and dd, after execution, are passed to c and d,respectively.
HDL Description of a Full Adder Using Procedure and Task—VHDL and Verilog
entity full_add is
port (x, y, cin : in std_logic; sum, cout : out std_logic);
end full_add;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
end two_halfs;
task Haddr;
//This task describes the half adder
output sh, ch;
input ah, bh;
begin
sh = ah ^ bh;
ch = ah & bh;
end
endtask
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
endmodule
HDL Description of an N-Bit Ripple Carry Adder Using Procedure and Task—
VHDL and Verilog
entity adder_ripple is
generic (N : integer := 3);
port (x, y : in std_logic_vector (N downto 0);
cin : in std_logic;
sum : out std_logic_vector (N downto 0);
cout : out std_logic);
end adder_ripple;
begin
addrpl : process (x, y, cin)
variable c1, c2, tem1, tem2 : std_logic;
variable cint : std_logic_vector (N+1 downto
0); variable sum1 : std_logic_vector (N downto
0); begin
cint(0) := cin;
for i in 0 to N loop
Faddr (sum1(i), cint(i+1), x(i), y(i), cint(i));
--The above statement is a call to the procedure
Faddr end loop;
sum <= sum1;
cout <= cint(N+1);
end process;
end adder;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
cint[0] = cin;
for (i = 0; i <= N; i = i + 1)
begin
Faddr (sum[i], cint[i+1], x[i], y[i], cint[i]);
//The above statement is a call to task Faddr
end
cout = cint[N+1];
end
task Faddr;
//The task describes a full
adder output sf, cof;
input af, bf, cinf;
begin
sf = af ^ bf ^ cinf;
cof = (af & bf) | (af & cinf) | (bf &
cinf); end
endtask
endmodule
HDL Code for Converting an Unsigned Binary to an Integer Using Procedure and
Task—VHDL and Verilog
***Begin Listing***
VHDL: Converting an Unsigned Binary to an Integer Using Procedure
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all; --This Library is for type “unsigned”
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity Bin_Int is
generic (N : natural := 3);
port (X_bin : unsigned (N downto 0);
Y_int : out natural; Z : out
std_logic);
--Y is always positive
end Bin_Int;
result := 0;
for i in bin'Range loop
begin
process (X_bin)
variable tem : natural;
begin
bti (X_bin, tem, Z);
Y_int <= tem;
end process;
end convert;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
task bti;
parameter P = N;
output integer
int; output Z;
input N;
input [P:0] bin;
integer i, result;
begin
int = 0;
//change binary to integer
for (i = 0; i <= P; i = i +
1) begin
if (bin[i] == 1)
int = int + 2**i;
end
if (int == 0)
Z = 1'b1;
else
Z = 1'b0;
end
endtask
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
HDL Code for Converting a Fraction Binary to Real Using Procedure and Task—
VHDL and Verilog
entity Bin_real is
generic (N : integer := 3);
port (X_bin : in std_logic_vector (0 to N); Y : out real);
end Bin_real;
flt := 0.0;
rl : for i in N downto 0 loop
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
always @ (X_bin)
begin
binfloat (X_bin, Z);
end
task binfloat;
parameter P = N;
input [0:P] a;
output real float;
integer i;
begin
float = 0.0;
for (i = 0; i <= P; i = i + 1)
begin
if (a[i] == 1)
endmodule
HDL Code for Converting an Unsigned Integer to Binary Using Procedure and
Task—VHDL and Verilog
entity Int_Bin is
generic (N : integer := 3);
port (X_bin : out std_logic_vector (N downto 0);
Y_int : in integer;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
if (int MOD 2 = 0) then
--The above statement checks int to see if it is even.
flag <= '1';
else
flag <= '0';
end if;
for i in 0 to N loop
if (int MOD 2 = 1)
then bin (i) := '1';
else
bin (i) := '0';
end if;
begin
process (Y_int)
variable tem : std_logic_vector (N downto 0);
variable tem_int : integer ;
begin
tem_int := Y_int;
itb (tem, flag_even, N, tem_int);
X_bin <= tem;
end process;
end convert;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
***Begin Verilog***
Verilog: Converting an Unsigned Integer to Binary Using Task
module Int_Bin (X_bin, flag_even, Y_int );
parameter N = 3;
output [N:0] X_bin;
output flag_even;
input [N:0] Y_int;
reg [N:0] X_bin;
reg flag_even;
always @ (Y_int)
begin
itb (Y_int, N, X_bin, flag_even);
end
task itb;
parameter P = N;
input integer int;
input N;
output [P:0] bin;
output flag;
integer j;
begin
if (int %2 == 0)
//The above statement checks int to see if it is
even. flag = 1'b1;
else
flag = 1'b0;
for (j = 0; j <= P; j = j + 1)
begin
if (int %2 == 1)
bin[j] = 1;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
else
bin[j] = 0;
int = int/2;
end
end
endtask
endmodule
HDL Code for Converting a Signed Binary to Integer Using Procedure and Task—
VHDL and Verilog.
entity signed_btoIn is
generic (N : integer := 3);
port (X_bin : in signed (N downto 0); Y_int : out
integer; even_parity : out std_logic );
end signed_btoIn;
integer;
int : out integer; signal even : out std_logic) is
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
result := 0;
for i in 0 to M loop if
binsg(i) = '1' then
result := result + 2**i;
parity := parity + 1;
end if;
end loop;
end sbti;
begin
process (X_bin)
variable tem :
integer;
begin
sbti (X_bin, N, tem,
even_parity); Y_int <= tem;
end process;
end convert;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
parameter N = 3;
input signed [N:0] X_bin;
output integer Y_int;
output even_parity;
reg even_parity;
always @ (X_bin)
begin
sbti (Y_int, even_parity, N, X_bin);
end
task sbti;
parameter P = N;
output integer int;
output even;
input N;
input [P:0] bin;
integer i;
reg parity;
begin
int = 0;
parity = 0;
//change binary to integer
for (i = 0; i <= P; i = i + 1)
begin
if (bin[i] == 1)
begin
int = int + 2**i;
parity = parity + 1;
end
end
if ((parity % 2) ==
1) even = 0;
else
even = 1;
if (bin [P] == 1)
int = int - 2**(P+1);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end
endtask
endmodule
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
entity signed_IntToBin is
generic (N : integer := 3);
port (X_bin : out signed (N downto 0); Y_int : in integer);
end signed_IntToBin;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
else
temp_int := int;
end if;
for i in 0 to M loop
if (temp_int MOD 2 = 1) then
bin (i) := '1';
else
bin (i) := '0';
end if;
--integer division by 2
temp_int := temp_int/2;
end loop;
begin
process (Y_int)
variable tem : signed (N downto 0);
begin
sitb(tem, N, Y_int);
X_bin <=
tem; end
process;
end convert;
HDL Code for Signed Vector Multiplication Using Procedure and Task—VHDL
and Verilog
entity Vector_Booth is
generic (N : integer := 3);
port (a0, a1, a2, b0, b1, b2 : in signed (N downto 0);
d : out signed (3*N downto 0));
end Vector_Booth;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
sum := -sum;
end if;
Z := sum;
end booth;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
for i in 0 to M loop
if (temp_int MOD 2 = 1)
then bin (i) := '1';
else
bin (i) := '0';
end if;
temp_int :=
temp_int/2; end loop;
if (flag = '1') then
sbin := -bin;
else
sbin := bin;
end if;
end sitb;
begin
result := 0;
for i in 0 to M loop if
binsg(i) = '1' then
result := result + 2**i;
end if;
end loop;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
process (a0, b0, a1, b1, a2, b2)
variable tem0, tem1, tem2 : signed ((2*N + 1) downto 0);
variable d_temp : signed (3*N downto 0);
variable temi0, temi1, temi2, temtotal : integer;
begin
--Find the partial products a0b0, a1b1, a2b2
booth (a0, b0, tem0);
booth (a1, b1, tem1);
booth (a2, b2, tem2);
d <= d_temp;
end process;
end multiply;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
task booth;
input signed [3:0] X, Y;
output signed [7:0] Z;
reg signed [7:0] Z;
reg [1:0] temp;
integer i;
reg E1;
reg [3:0] Y1;
begin
Z = 8'd0;
E1 = 1'd0;
for (i = 0; i < 4; i = i +
1) begin
temp = {X[i], E1}; //This is catenation
Y1 = -Y; //Y1 is the 2' complement of Y
case (temp)
2'd2 : Z [7:4] = Z [7:4] + Y1;
2'd1 : Z [7:4] = Z [7:4] + Y;
default : begin
end endcase
Z = Z >> 1; /*This is a logical shift of one position to
the right*/
Z[7] = Z[6];
/*The above two statements perform arithmetic
shift where the sign of the number is preserved
after the shift.*/
E1 = X[i];
end
if (Y == 4'b1000) Z = -Z;
*/ end
endtask
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Figure 6.8 Relationship between the substrate concentration S and rate of reaction V.
HDL Description for Enzyme Activity Using Procedure and Task—VHDL and
Verilog
entity enzyme_beh is
port (S : in std_logic_vector (3 downto 0);
v : out std_logic_vector (3 downto 0);
M : in std_logic_vector(3 downto 0));
end enzyme_beh;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
temp := int;
for j in 0 to 3 loop
if (temp MOD 2 = 1) then
bin (j) := '1';
else bin (j) := '0';
end if;
temp := temp/2;
end loop;
end itb;
Procedure rti (r : in real; int : out integer) is
temp := r;
while temp >= 0.5 loop
intg := intg + 1;
temp := r - 1.0 * intg ;
end loop;
int := intg;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end rti;
begin
P1 : process(S, M)
Variable S1, M1, v1 : integer;
Variable vr, vq4, vmax : real;
variable tem : std_logic_vector (3 downto
0); begin
bti (S, s1); bti (M,
m1); vmax := 1.0;
vr := vmax*(1.0 *S1) / (S1 * 1.0 + M1 * 1.0);
vq4 := vr * 2**4;
rti (vq4, v1);
itb (v1, tem);
v <= tem;
end process P1;
end enzyme;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
task rti;
/* This task can be replaced by just one statement, v1= r.
Verilog, in contrast to VHDL, can handle different
types of the assignment statement. Verilog finds the
equivalent integer value v1 for the real r. The task has
been designed here only to match the VHDL procedure rti. */
input real r;
output [3:0] v1;
real temp;
begin
temp = r;
v1 = 4'b0000;
while (temp >= 0.5)
begin
v1 = v1 + 1;
temp = r - 1.0 *
v1; end end
endtask
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Func_exm is
port (a1, b1 : in std_logic; d1 : out
std_logic); end Func_exm;
begin
process (a1, b1)
begin
d1 <= exp (a1, b1);
--The above statement is a function
call end process;
end Behavioral;
function exp ;
input a, b;
begin
exp = a ^ b;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end
endfunction
endmodule
HDL Function to Find the Greater of Two Signed Numbers—VHDL and Verilog
entity greater_2 is
port (x, y :in signed (3 downto 0); z :out signed (3 downto 0));
end greater_2;
begin
process (x,
y) begin
z <= grt (x, y); --This is a function
call. end process;
end greater_2;
always @ (x, y)
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
z = grt (x, y); //This is a function
call. end
begin
if (a >=
b) grt = a;
else
grt = b; end
endfunction
endmodule
entity segma is
port (x : in std_logic_vector (0 to 3);
y: out std_logic_vector (15 downto 0));
end segma;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
for i in 0 to 3 loop
for i in 0 to N loop
if (temp_int MOD 2 = 1) then
bin(i) := '1';
else bin(i) := '0';
end if;
temp_int := temp_int/2;
end loop;
end itb;
variable z1 : real;
variable intgr : integer;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
begin
tem := exp(x);
y <= tem;
end process sg1;
end segm_beh;
y = exp (x);
end
integer i;
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
float = 0.0;
for (i = 0; i <= 3; i = i + 1)
begin
if (a[i] == 1)
end
endfunction
begin
rti = r;
end
endfunction
function [15:0] exp;
input [0:3] a;
real z1;
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
VHDL Code for Reading and Processing a Text File Containing Integers
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
entity FREAD_INTG is
port (START : in std_logic;
z, z1, z2, z3 : out integer);
end FREAD_INTG;
process (START)
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
--Read the first line of the file and store the line in temp
readline (infile, temp);
-- temp now has the data: 12 -3 5
-- Read the first integer (12) from the line temp and store it
--in the integer variable count.
read (temp, count);
--Read the first integer of the second line and store it in count
read (temp, count);
end FILE_BEHAVIOR;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
entity FREAD_REAL is
port (START : in std_logic;
z, z1, z2, z3 : out real);
end FREAD_REAL;
process (START)
file infile : text;
variable fstatus : file_open_status;
variable count : real;
--Variable count has to be of type real
variable temp : line;
begin
-- Read a line
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
--read another
number read (temp,
count);
--multiply by 5
z1 <= 5.0 * count;
--read another
number read (temp,
count);
--multiply by 3
z2 <= 3.0 * count;
end FILE_BEHAVIOR;
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
entity FREAD_character is
port (START : in std_logic;
z, z1, z2, z3 : out character);
end FREAD_character;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
process (START)
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
file_open (fstatus, infile, "file_chr.txt", read_mode);
end FILE_BEHAVIOR;
VHDL Code for Writing Integers to a File
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
entity FWRITE_INT is
port (START : in std_logic;
z, z1, z2, z3 : in integer);
end FWRITE_INT;
process (START)
file outfile : text;
variable fstatus : file_open_status;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
file_open (fstatus, outfile, "Wfile_int.txt", write_mode);
--The generated file "Wfile_int.txt" is in
--the same directory as this VHDL module
file_close(outfile);
end process;
end FILE_BEHAVIOR;
OUTPUT
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package array_pkg is
constant N : integer := 4;
--N+1 is the number of elements in the
array. subtype wordChr is character;
type string_chr is array (N downto 0) of wordChr;
end array_pkg;
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
entity FILE_CHARCTR is
port (START : in std_logic; z : out string_chr);
end FILE_CHARCTR;
process (START)
file infile : text;
variable fstatus : file_open_status;
variable count : string_chr;
variable temp : line;
begin
file_open (fstatus, infile, "myfile1.txt", read_mode);
readline (infile, temp);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
file_close (infile);
end process;
end FILE_BEHAVIOR;
package array_pkg is
constant N : integer := 4;
--N+1 is the number of elements in the
array. subtype wordChr is character;
type string_chr is array (N downto 0) of wordChr;
end array_pkg;
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
use work.array_pkg.all;
end SMALLEST_CHRCTR;
begin
process (START)
file infile : text;
variable fstatus : file_open_status;
variable count, smallest :
string_chr := ('z ', 'z ', 'z ', 'z ', 'z ');
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
file_open (fstatus, infile, "f_smallest.txt", read_mode);
while (count /= ('E', 'N', 'D', ' ', ' ')) loop
readline (infile, temp);
end BEHAVIOR_SMALLEST;
After execution,the output Z is equal to “ADA”.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
use IEEE.STD_LOGIC_1164.all;
package array_pkg is
constant N : integer := 4;
--N+1 is the number of elements in the
array. subtype wordChr is character;
type string_chr is array (N downto 0) of wordChr;
end array_pkg;
entity OPCODES is
port (assmbly_code : in string_chr; z : out string_chr;
z1 : out integer);
end OPCODES;
begin
process (assmbly_code)
file infile : text;
begin
file_open (fstatus, infile, "cods.txt",
-– while loop could have been used instead of for loop. See
-- Exercise 8.3
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
exit;
else if (i > 7)then
report ("ERROR: CODE COULD NOT BE FOUND");
z <= ('E', 'R', 'R', 'O', 'R');
z1 <= -1;
end if;
end if;
end loop;
file_close(infile);
end process;
end BEHAVIOR;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
package array_pkg is
constant N : integer := 4;M
--N+1 is the number of elements in the
array. subtype wordChr is character;
type string_chr is array (N downto 0) of wordChr;
end array_pkg;
library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
use work.array_pkg.all;
end ASSMBLR;
process (START)
file infile : text;
file outfile : text;
begin
file_open (fstatus, infile, "asm.txt", read_mode);
write_mode);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
-- are stored.
for i in 0 to 11 loop
--while-loop could have been used instead of for-loop.
else
read (regstr, addr);
write (regstw, ctr);
write (regstw, " ");
ctr := ctr + 1;
case temp is
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end if;
end loop;
file_close(infile);
file_close (outfile);
end process;
end BEHAVIOR_ASSM;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
b = 2 * a;
end
initial
begin
ch1 = $fopen("file4.txt");
end
endmodule
end record;
end package weather_fcst;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity WEATHER_FRCST is
port (Day_in : in weekdays; unit_in : in string (1 to 3);
out_temperature : out real;
out_unit : out string (1 to 3);
out_day : out weekdays; out_cond : out cast);
-- Type string is a
predefined end
WEATHER_FRCST;
begin
case Day_in is
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
temp.tempr := 37.2;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
11) Write a HDL Code for Signed Vector Multiplication Using Procedure and Task
12) Write a HDL Description for Enzyme Activity Using Procedure and Task
16) Write a VHDL Code for Reading a Text File Containing Real Numbers
17) Write a VHDL Code for Writing Integers to a File
18) Write a VHDL Code for Reading a String of Characters into an Array
19) Write a Verilog Code for Storing b = 2a in file4.txt
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Recommended readings:
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
An Enumerated type is a very powerful tool for abstract modeling. All of the values of an
enumerated type are user defined. These values can be identifiers or single character
literals.
An identifier is like a name, for examples: day, black, x
Character literals are single characters enclosed in quotes, for example: ‘x’, ‘I’, ‘o’
Type Fourval is (‘x’, ‘o’, ‘I’, ‘z’);
Type color is (red, yello, blue, green, orange);
Type Instruction is (add, sub, lda, ldb, sta, stb, outa, xfr);
Real type example:
Type input level is range -10.0 to +10.0
Type probability is range 0.0 to 1.0;
Type W_Day is (MON, TUE, WED, THU, FRI, SAT, SUN);
type dollars is range 0 to 10;
variable day: W_Day;
variable Pkt_money:Dollars;
Case Day is
When TUE => pkt_money:=6;
When MON OR WED=> Pkt_money:=2;
When others => Pkt_money:=7;
End case;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
VHDL PACKAGES
· Packages are useful in organizing the data and the subprograms declared in
the model
· VHDL also has predefined packages. These predefined packages include all of
the predefined types and operators available in VHDL.
· In VHDL a package is simply a way of grouping a collections of related
declarations that serve a common purpose. This can be a set of subprograms
that provide operations on a particular type of data, or it can be a set of
declarations that are required to modify the design
· Packages separate the external view of the items they declare from the
implementation of the items. The external view is specified in the package
declaration and the implementation is defined in the separate package
body.
· Packages are design unit similar to entity declarations and architecture
bodies. They can be put in library and made accessible to other units through
use and library clauses
· Access to members declared in the package is through using its selected name
Library_name.package_name.item_name
· Aliases can be used to allow shorter names for accessing declared items
Two Components to Packages
· Package declaration---_The visible part available to other modules
· Package body --_The hidden part
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Package declaration
The Packages declaration is used to specify the external view of the items. The syntax
rule for the package declaration is as follows.
· The identifier provides the name of the package. This name can be used any
where in the model to identify the model
· The package declarations includes a collection of declaration such as
_ Type
_ Subtypes
_ Constants
_ Signal
_ Subprogram declarations etc
_ Aliases
_ components
The above declarations are available for the user of the packages.
The following are the advantages of the usage of packages
.
· All the declarations are available to all models that use a package.
· Many models can share these declarations. Thus, avoiding the need to
rewrite these declarations for every model.
The following are the points to be remembered on the package declaration
· A package is a separate form of design unit, along with entity and
architecture bodies.
· It is separately analyzed and placed in their working library.
· Any model can access the items declared in the package by referring the
name of the declared item.
Package declaration syntax
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
logically static.
Subprograms in the package declaration
· Procedures and functions can be declared in the package declaration
· Only the design model that uses the package can access the
subprograms declared in the package declarations.
· The subprogram declaration includes only the information contained in the
header.
· This does not specify the body of the subprogram. The package declaration
provides information regarding the external view of the subprogram without
the implementation details. This is called information hiding.
· For every subprogram declaration there must be subprogram body in the
package body. The subprograms present in the package body but not
declared in the package declaration can’t be accessed by the design models.
Package body
Each package declaration that includes a subprogram or a deferred constant must
have package body to fill the missing information. But the package body is not
required when the package declaration contains only type, subtype, signal or fully
specified constants. It may contain additional declarations which are local to the
package body but cannot declare signals in body. Only one package body per
package declaration is allowed.
Point to remember:
· The package body starts with the key word package body
· The identifier of the package body follows the keyword
· The items declared in the package body must include full declarations of
all subprograms declared in the corresponding package declarations. These
full declarations must include subprogram headers as it appears in the
package declarations. This means that the names, modes typed and the
default values of each parameters must be repeated in exactly the same
manner. In this regard two variations are allowed:
_ A numerical literal may be written differently for example; in a
different base provided it has the same value.
_ A simple name consisting just of an identifier can be replaced by a
selected name, provided it refers to the same item.
· A deferred constant declared in the package declaration must have its
value specified in the package body by declaration in the package body
· A package body may include additional types, subtypes, constants and
subprograms. These items are included to implement the subprogram
defined in the package declaration. The items declared in the package
declaration
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library ieee;_
use ieee.std_logic_1164.all;
package bit_pack is
function add4(add1 ,add2:std_logic_vector (3 downto 0);
carry: std_logic ) return std_logic_vector;
end package bit_pack;
package body bit_pack is _
function add4(add1 ,add2: std_logic_vector (3 downto 0);
carry: std_logic ) return std_logic_vector is
variable cout,cin: std_logic;
variable ret_val : std_logic_vector (4 downto 0);
begin
cin:= carry;
ret_val:="00000" ;
for i in 0 to 3 loop
ret_val(i) := add1(i) xor add2(i) xor cin;
cout:= (add1(i) and add2(i)) or (add1(i) and cin) or (add2(i) and cin);
cin:= cout; end
loop;
ret_val(4):=cout;
return ret_val;
end add4;
1. Program to add two four bit vectors using functions written in package ‘bit_pack’ .
library ieee;_
use ieee.std_logic_1164.all;
use work.bit_pack.all;
entity addfour is
port ( a: in STD_LOGIC_VECTOR (3 downto 0);
b: in STD_LOGIC_VECTOR (3 downto 0);
cin: in STD_LOGIC;
sum: out STD_LOGIC_VECTOR (4 downto 0) );
end addfour;
architecture addfour of addfour is
begin
sum<= add4(a,b,cin);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end addfour;
HDL Code for Finding the Greatest Element of an Array—VHDL and Verilog
constant M : integer := 3;
--M+1 is the number of bits of each element
--of the array.
subtype wordN is std_logic_vector (M downto
0); type strng is array (N downto 0) of wordN;
end array_pkg;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.array_pkg.all;
-- The above statement makes the package array_pkg visible in
-- this module.
entity array1 is
generic (N : integer :=4; M : integer := 3);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
grtst := "0000";
else
report "grtst is greater than a";
z <= grtst;
end process com;
end max;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
else
$display (" grtst is greater than a");
program end
end
endmodule
package booth_pkg is
constant N : integer := 4;
--N + 1 is the number of elements in the array.
constant M: integer := 3;
--M + 1 is the number of bits of each element
--of the array.
end booth_pkg;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
then sum := -
sum;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end if;
Z := sum;
end booth;
end booth_pkg;
entity vecor_multply is
generic (N : integer := 4; M : integer := 3);
--N + 1 is the number of elements in the array; M + 1 is the
--number of bits of each element.
Port (a, b : in strng; d : out signed (3*N downto 0));
end vecor_multply;
is begin
process (a, b)
variable temp : signed (7 downto 0);
variable temp5 : signed (3*N downto 0) :=
"0000000000000"; begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
for i in 0 to 4 loop
booth(a(i), b(i), temp);
end multply;
always @ (start)
begin
a[0] = 4'b1100;
a[1] = 4'b0000;
a[2] = 4'b1001;
a[3] = 4'b0011;
a[4] = 4'b1111;
b[0] = 4'b1010;
b[1] = 4'b0011;
b[2] = 4'b0111;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
b[3] = 4'b1000;
b[4] = 4'b1000;
d = 0;
for (i = 0; i <= N; i = i + 1)
begin
booth (a[i], b[i], temp);
d = d + temp;
end
end
task booth;
input signed [3:0] X, Y;
output signed [7:0] Z;
reg signed [7:0] Z;
reg [1:0] temp;
integer i;
reg E1;
reg [3:0] Y1;
begin
Z = 8'd0;
E1 = 1'd0;
for (i = 0; i < 4; i = i +
1) begin
temp = {X[i], E1}; //This is catenation
Y1 = -Y; //Y1 is the 2'complement of Y
case (temp)
2'd2 : Z[7:4] = Z[7:4] + Y1;
2'd1 : Z[7:4] = Z[7:4] + Y;
default : begin end
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
endcase
Z = Z >> 1;
/*The above statement is a logical shift
of one position to the right*/
Z[7] = Z[6];
/*The above two statements perform arithmetic shift
where the sign of the number is preserved after the shift.
*/
E1 = X[i];
end
if (Y == 4'b1000)
Z = -Z;
end
endtask
endmodule
VHDL Two-Dimensional Array
library IEEE;
use IEEE.STD_LOGIC_1164.all;
constant N : integer := 4;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end twodm_array;
entity two_array is
Port (N, M : integer; z : out integer);
end two_array;
begin
com : process (N, M)
variable t : integer;
constant y : strng2 := ((7, 6, 5, 4, 3), (6, 7, 8, 9, 10),
(30, 31, 32, 33, 34), (40, 41, 42, 43, 44),
(50, 51, 52, 53, 54));
begin
t := y (N)(M);
--Look at the simulation output to identify
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
package twodm_array is
constant N : integer := 4;
-- N+1 is the number of elements in the array.
-- This is an NxN matrix with N rows and N columns.
subtype wordg is integer;
type strng1 is array (N downto 0) of wordg;
type strng2 is array (N downto 0) of strng1;
end twodm_array;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
com : process (x, y)
variable t : integer := 0;
begin
for i in 0 to 4 loop
for j in 0 to 4 loop
t := x(i)(j) + y(i)
(j); z(i)(j) <= t;
end loop;
end loop;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end TO_UNSIGN;
end codes_Arithm;
entity ALU_mixed is
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
case opc is
when mul =>
a3 := a1 * a2;
temp := TO_UNSIGN(a3);
--The function "TO_UNSIGN" is a user-defined function
--written in the user-defined package "codes_arithm."
when divide =>
a3 := a1 / a2;
temp := TO_UNSIGN(a3);
end case;
z <= temp;
end process;
end ALU_mixed;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
reg [5:0] z;
wire [5:0] temp1;
wire [2:0] g, p;
wire c0, c1;
temp1)
begin
case (opc)
mul : z = a * b;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
add : z = temp1;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
divide : z = a / b;
nop : z = z;
endcase
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
constant M : integer := 7;
--M+1 is the number of bits of each element
--of the array.
subtype wordN is std_logic_vector (M downto
0); type strng is array (N downto 0) of wordN;
end array_pkg;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use work.array_pkg.all;
entity memory16x8 is
generic (N : integer := 15; M : integer := 7);
--N+1 is the number of words in the memory; M+1 is the
--number of bits of each word.
Port (Memory : inout strng; CS : in std_logic;
ABUS : in unsigned (3 downto 0);
Data_in : in std_logic_vector (7 downto
0); R_WRbar : in std_logic;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
A := TO_INTEGER (ABUS);
-- TO_INTEGER is a built-in function
end if;
else
Data_out <= "ZZZZZZZZ";
--The above statement describes high
impedance. end if;
end SRAM;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
if (CS == 1'b1)
begin
if (R_WRbar ==
1'b0) begin
Memory [ABUS] = Data_in;
end
else
Data_out = Memory [ABUS];
end
else
Data_out = 8'bZZZZZZZZ;
//The above statement describes high impedance
end
endmodule
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
-- Now we use the package to write the code for the state machine.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.types.all;
entity state_machine is
port (A, clk : in std_logic; pres_st : buffer states;
Z : out std_logic);
end state_machine;
is begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Z <= '0';
else
present := state3;
Z <= '0';
end if;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
input A, clk;
output [1:0] pres_st;
output Z;
reg Z;
initial
begin
pres_st = 2'b00;
end
always @ (posedge clk)
begin
case (pres_st)
`state0 :
begin
if (A == 1)
begin
present = `state1;
Z = 1'b0;
end
else
begin
present = `state0;
Z = 1'b1;
end
end
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
`state1 :
begin
if (A == 1)
begin
present = `state2;
Z = 1'b0;
end
else
begin
present = `state3;
Z = 1'b0;
end
end
`state2 :
begin
if (A == 1)
begin
present = `state3;
Z = 1'b1;
end
else
begin
present = `state0;
Z = 1'b0;
end
end
`state3 :
begin
if (A == 1)
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
present = `state0;
Z = 1'b0;
end
else
begin
present = `state2;
Z = 1'b0;
end
end
endcase
pres_st = present;
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
package Comp_Pkg is
constant N: integer := 15;
--N+1 is the number of elements in the
array. constant M : integer := 7;
--M+1 is the number of bits of each element
--of the array.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end Comp_Pkg;
entity computer_basic is
end computer_basic;
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
case pres_st is
when state0 =>
next_st := state1;
--This is fetch
cycle AR := PC;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
case IR is
when "111" =>
--The op code is CLA
ACL <= "00000000";
next_st := state0;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
//The above statement can be written using the reduction XOR as:
//assign z = ^ ACL[6:0];
if (Reset ==
1'b1) begin
pres_st = state0;
Reset = 1'b0;
PC = 4'd0;
Memory [0] = 8'hE0; Memory [1] = 8'h29;
Memory [2] = 8'h8A; Memory [3] = 8'h4B;
Memory [4] = 8'h6C; Memory [5] = 8'h8D;
Memory [6] = 8'hCE; Memory [7] = 8'hA0;
Memory [8] = 8'h00; Memory [9] = 8'h0C;
Memory [10] = 8'h05; Memory [11] =
8'h04; Memory [12] = 8'h09; Memory [13]
= 8'h03; Memory [14] = 8'h09;
Memory [15] = 8'h07;
end
case (pres_st)
state0 :
begin
next_st = state1;
AR = PC;
end
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
state1 :
//This is fetch cycle
begin
next_st = state2;
DR = Memory [AR];
end
state2 :
//This is fetch cycle
begin
next_st = state3;
PC = PC + 1;
IR = DR [7:5];
AR = DR [3:0];
end
state3 :
//This is execute cycle
begin
case (IR)
3'd7 :
//The op code is CLA
begin
ACL = 8'd0;
next_st = state0;
end
3'd1 :
//The op code is
ADD begin
DR = Memory [AR];
ACL = ACL + DR;
next_st = state0;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end
3'd2 :
//The op code is MULT
begin
DR = Memory [AR];
PR = ACL * DR;
ACL = PR [7:0];
ACH = PR [15:8];
next_st = state0;
end
3'd3 :
//The op code is DIVID
begin
DR = Memory [AR];
ACL = ACL / DR;
next_st = state0;
end
3'd4 :
//The op code is
XOR begin
DR = Memory [AR];
ACL = ACL ^ DR;
next_st = state0;
end
3'd6 :
//The op code is
NAND begin
DR = Memory [AR];
ACL = ~(ACL & DR);
next_st = state0;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end
3'd5 :
//The op code is PRITY
begin
ACL[7] = z;
next_st = state0;
end
3'd0 :
//The op code is
HALT begin
next_st = state3;
end
default :
begin
end
endcase
end
default :
begin
end
endcase
pres_st = next_st;
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Recommended readings:
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
Facts
x To write HDL code in mixed-language, the simulator used with the HDL package
should be able to handle a mixed-language environment.
x In the mixed-language environment, both VHDL and Verilog module files are
made visible to the simulator.
x In the mixed-language environment, both VHDL and Verilog Libraries are made
visible to the simulator.
x Mixed-language environment has many limitations; but the development of
simulators that can handle mixed-language environments with minima;
constraints is underway. One of these major constraints is that a VHDL module
can only invoke the entire Verilog module; and a Verilog module can only
invoke a VHDL entity. For example, we cannot invoke a VHDL procedure from
a Verilog module.
x Mixed – language description can combine the advantages of both VHDL and
Verilog in one module. For example, VHDL has more-extensive file operations
than Verilog, including write and read. By writing mixed-language, we can use
the VHDL file operations in a Verilog module.
When writing VHDL code, you can invoke (import) a Verilog module; if you are
writing Verilog code, you can invoke (import) a VHDL entity. The process is similar
in concept to invoking procedures, functions, tasks and packages. For example, by
instantiating a VHDL package in a Verilog module, the contents of this package are
made visible to the module. Similarly, by invoking a Verilog module in a VHDL
module, all information in the Verilog module is made visible to the VHDL module.
In Verilog,module instantiates a module with the same name as the VHDL entity; the
parameters of the module should match the type and port directions of the entity.
VHDL ports that can be mapped to Verilog modules are:in,out and inout; buffer is not
allowed. Only the entire VHDL entity can be made visible to the Verilog module.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
…………
endmodule
library ieee;
use ieee.std_logic_1164.all;
entity VHD_enty is
port( x, y : in std_logic;
o1,o2 : out std_logic;
end VHD_enty;
architecture VHD_enty of VHD_enty is
begin
…………
end VHD_enty;
In the VHDL module, we declare a component with the same name as the Verilog
module we want to invoke the name and port modes of the component should be
identical to the name and input/output modes of the Verilog module.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use ieee.std_logic_1164.all;
entity HA is
--For correct binding between this VHDL code and the above Verilog
--code, the entity has to be named HA
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- This is a VHDL data-flow code for a 3-bit carry-lookahead adder
entity adders_RL is
port (x, y : in std_logic_vector (2 downto
0); cin : in std_logic;
sum : out std_logic_vector (2 downto 0);
cout : out std_logic);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end adders_RL;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity full_add is
Port (X, Y, cin : in std_logic; sum, cout : out std_logic);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
--The above five “for” statements are to bind the inv, and3,
--and2, or3, and or4 with the architecture beh_vhdl.
--See Chapter 4, “Structural Descriptions.”
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity bind2 is
port (I1, I2 : in std_logic; O1 : out std_logic);
end bind2;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity bind3 is
port (I1, I2, I3 : in std_logic; O1 : out std_logic);
end bind3;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity bind4 is
Port (I1, I2, I3, I4 : in std_logic; O1 : out std_logic);
end bind4;
architecture or4_0 of bind4 is
begin
O1 <= I1 or I2 or I3 or I4;
end or4_0;
Mixed-Language Description of a Master-Slave D Flip-Flop
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity D_Latch is
--The entity has the same name as the calling Verilog module
end D_Latch;
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
generate
genvar i;
for (i = 0; i <= N; i = i + 1)
begin : u
end
endgenerate
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity FULL_ADDER is
Port (A, B, cin : in std_logic; sum_1, cout : out std_logic);
end FULL_ADDER;
case y is
when "000" => sum_1 <= '0'; cout <= '0';
when "110" => sum_1 <= '0'; cout <= '1';
when "101" => sum_1 <= '0'; cout <= '1';
when "011" => sum_1 <= '0'; cout <= '1';
when "111" => sum_1 <= '1'; cout <= '1';
when others => sum_1 <= '1'; cout <= '0';
--Others here refer to 100, 001, 010
end case;
end process;
end beh_vhdl;
Invoking a Verilog Module from a VHDL Module
We can instantiate a Verilog module from a VHDL module by instantiating a component
in the VHDL module that has the same name and ports as the Verilog module. The
Verilog module should be the only construct that has the same name as the component.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity andgate is
port (a, b : in std_logic; c : out
std_logic); end andgate;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
g1 : and2 port map (a, b, c);
end andgate;
input x, y;
output z;
assign z = x & y;
endmodule
Mixed-Language Description of a JK Flip-Flop
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity JK_FF is
Port (Jx, Kx, clk, clx : in std_logic; Qx, Qxbar : out
std_logic);
end JK_FF;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
jk1 : jk_verilog port map (Jx, Kx, clk, clx, Qx, Qxbar);
end JK_FF;
input j, k, ck,
clear; output q, qb;
--The input and output ports match those of the
--VHDL component, jk_verilog
reg q, qb;
reg [1:0]
JK;
always @ (posedge ck, clear)
begin
if (clear == 1)
begin
q = 1'b0;
qb = 1'b1;
end
else
begin
JK = {j, k};
case (JK)
2'd0 : q = q;
2'd1 : q = 0;
2'd2 : q = 1;
2'd3 : q = ~q;
endcase
qb = ~q;
end
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity countr_3 is
port (clk, clrbar : in std_logic;
q, qb : inout std_logic_vector (2 downto 0));
end countr_3;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
component JK_FF
port (I1, I2, I3 : in std_logic; O1, O2 : inout std_logic);
end component;
component inv
port (I1 : in std_logic; O1 : out
std_logic); end component;
component and2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
component or2
port (I1, I2 : in std_logic; O1 : out std_logic);
end component;
signal J1, K1, J2, K2, clr, clrb1, s1, high : std_logic;
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
input I1;
output O1;
assign O1 = ~I1;
endmodule
JK = {I1, I2};
case (JK)
2'd0 : O1 = O1;
2'd1 : O1 = 0;
2'd2 : O1 = 1;
2'd3 : O1 = ~O1;
endcase
O2 = ~O1;
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
FIGURE 9.10 Logic diagram of an n-bit synchronous counter with ripple-carry out.
Mixed-Language Description of an N-Bit Asynchronous Counter
entity asynch_ctrMx is
Generic (N : integer := 3);
is component jkff is
--This is a JK flip-flop with a clear bound to Verilog module jkff
component andgate is
--This is a three-input AND gate bound to Verilog module andgate
signal h, l : std_logic;
signal s : std_logic_vector (N downto 0);
signal s1 : std_logic_vector (N downto 0);
signal C_tem : std_logic_vector (N-1 downto 0);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
h <= '1';
l <= '0';
s <= (C_tem & clk);
JK = {j,k};
case (JK)
2'd0 : q = q;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
2'd1 : q = 0;
2'd2 : q = 1;
2'd3 : q = ~q;
endcase
qb = ~q;
end
end
endmodule
entity mux2x1_mxd is
Port (a, b, Sel, E : in std_logic; ybar : out
std_logic); end mux2x1_mxd;
is component nmos_verlg
--This component, after linking to a Verilog module, behaves as an
--nmos switch
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end component;
component pmos_verlg
--This component, after linking to a Verilog module, behaves as a
--pmos switch
begin
vdd <= '1';
gnd <= '0';
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
vdd, b);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end mux2x1switch;
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity P_encodr is
Port (X : in std_logic_vector (3 downto
0); Y : out std_logic_vector (3 downto
0));
end P_encodr;
is component cas_x
--The name of the component is identical to the name of the
--Verilog module
end component;
begin
end P_encodr;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
input [3:0] a;
output [3:0] b;
reg [3:0] b;
always @ (a)
begin
casex (a)
4'bxxx1 : b =
4'd1; 4'bxx10 : b
= 4'd2; 4'bx100 :
b = 4'd4;
4'b1000 : b = 4'd8;
default : b = 4'd0;
endcase
end
endmodule
entity Filter_draw is
Port (w, w_ctoff : in std_logic_vector (3 downto 0);
Hw_vhd : out std_logic_vector (7 downto 0));
end Filter_draw;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
result := 0;
lop1 : for i in a' range loop
if a(i) = '1' then
result := result + 2**i;
end if;
end loop;
return result;
end TO_Intgr;
component flter_RC
--The name of the component is the same name as the
“flter_RC”
--Verilog module
begin
--Files can take integer, real, or character;
--they cannot take std-logic-vector; so convert to integer.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
writeline (outfile,
temp); write (temp, "
");
file_close (outfile);
Hw_vhd <= Hw_tmp;
end process fl;
end Filter_draw;
O1);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
x Not all VHDL data types are supported in mixed-language description. Only bit,
bit_vector, std_logic, std_ulogic, std_logic_vector and std_ulogic_vector are
supported.
x The VHDL port type buffer is not supported.
x Only a VHDL component construct can invoke a Verilog module. We cannot
invoke a Verilog module from any other construct in the VHDL module.
x A Verilog module can only invoke a VHDL entity. It cannot invoke any other
construct in the VHDL module, such as a procedure or function.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
HIGHLIGHTS OF SYNTHESIS
Synthesis converts HDL behavioral code into logical gates or components. These logical
gates and components can be downloaded into an electronic chip.
Facts
x Synthesis maps between the simulation (software) domain and the hardware
domain.
x Synthesis can be viewed as reverse engineering. The user is provided with the
behavioral code and is asked to develop the logic diagram.
x Not all HDL statements can be mapped into the hardware domain. The hardware
domain is limited to signals that can take zeros, ones or that are left open. The
hardware domain cannot differentiate, for example, between signals and variables,
as does the simulation (software) domain.
x To successfully synthesize behavior code into a certain electronic chip, the
mapping has to conform to the requirements and constraints imposed by the
electronic chip vendor.
x Several synthesis packages are available on the market. These packages can take
behavior code, map it, and produce a net list that is downloaded into the chip.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
x Two synthesizers may synthesize the same code using a different number of the
same gates. This is due to the different approaches taken by the two synthesizers
to map the code.
Synthesis steps
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity system1 is
port ( a, b : in bit; d : out bit);
end system1;
system1 has two input signals,each of 1 bit and one output signal of 1 bit.Each signal can
take 0(low) or 1(high).
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
entity SIGNA_ASSN is
port (X : in bit; Y : out bit);
end SIGNA_ASSN;
P1 : process (X)
begin
Y <= X;
end process P1;
end BEHAVIOR;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
FIGURE 10.14 Gate – level synthesis (a) Logic symbol (b) Gate-level logic diagram.
VHDL Code for a Signal-Assignment Statement, Y = 2 * X + 3—VHDL and Verilog
entity sign_assn2 is
port (X : in unsigned (1 downto 0);
Y : out unsigned (3 downto 0));
end ASSN2;
[I adjusted the name of the entity to be the same as the Verilog]
architecture BEHAVIOR of sign_assn2 is
begin
P1 : process (X)
begin
Y <= 2 * X + 3;
end process P1;
end BEHAVIOR;
begin
Y = 2 * X + 3;
end
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
endmodule
FIGURE 10.15 Gate – level synthesis (a) Logic symbol (b) Gate-level logic diagram.
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library ieee;
use ieee.std_logic_1164.all;
entity parity_even is
port (x : in std_logic_vector (3 downto 0);
C : out std_logic);
end parity_even;
P1 : process (x)
variable c1 : std_logic;
begin
c1 := (x(0) xor x(1)) xor (x(2) xor
x(3)); C <= c1;
end process P1;
end behav_prti;
FIGURE 10.15 Gate – level synthesis (a) Logic symbol (b) Gate-level logic diagram.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
FIGURE 10.17 Gate – level synthesis (a) Logic symbol (b) Gate-level logic diagram.
Mapping Logical Operators—VHDL and Verilog
entity decod_var is
port (a : in std_logic_vector (1 downto 0);
D : out std_logic_vector (3 downto 0));
end decod_var;
begin
dec : process (a)
variable a0bar, a1bar : std_logic;
begin
a0bar := not a(0);
a1bar := not a(1);
D(0) <= not (a0bar and a1bar);
D(1) <= not (a0bar and a(1));
D(2) <= not (a(0) and a1bar);
D(3) <= not (a(0) and a(1));
end process dec;
end Behavioral;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
output [3:0] D;
reg a0bar, a1bar;
reg [3:0] D;
always @ (a)
begin
a0bar = ~ a[0];
a1bar = ~ a[1];
D[0] = ~ (a0bar & a1bar);
D[1] = ~ (a0bar & a[1]);
D[2] = ~ (a[0] & a1bar);
D[3] = ~ (a[0] & a[1]);
end
endmodule
FIGURE 10.18 Gate – level synthesis (a) Logic symbol (b) Gate-level logic diagram.
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
a) VHDL Description
process (a, x)
begin
if (a = '1') then
Y <= X;
else
Y <= '0';
end if;
end process;
b) Verilog description
always @ (a, X)
begin
if (a == 1'b1)
Y = X;
else
Y = 1'b0;
end
a) VHDL Description
b) Verilog Description
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
else
Y = X1;
end
entity IF_st is
port (a : in std_logic_vector (2 downto 0); Y : out Boolean);
end IF_st;
1'b1;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
else
Y = 1'b0;
end
endmodule
entity elseif is
port (BP : in natural range 0 to 7;
ADH : out natural range 0 to 15);
end;
ADHP : process(BP)
variable resADH : natural := 0;
begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity If_store is
port (a, X : in std_logic; Y : out std_logic);
end If_store;
is begin
process (a, X)
begin
if (a = '1')
then Y <= X;
end if;
end process;
end If_store;
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
package weather_fcst is
Type unit is (cent, half, offset);
library ieee;
use ieee.std_logic_1164.all;
use work.weather_fcst.all;
entity weather is
port (a : in unit; tempr : in integer range 0 to
15; z : out integer range 0 to 15);
end weather;
is begin
else
z_tem := 15;
end if;
z <= z_tem;
end process T;
end weather;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
1'b1 : d = a -
b; endcase
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end
endmodule
endcase
end
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package types is
type states is (state0, state1, state2, state3);
end;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.types.all;
entity state_machine is
port (A, clk : in std_logic; pres_st : buffer states;
Z : out std_logic);
end state_machine;
is begin
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
begin
if (clk = '1' and clk'event) then
--clock’event is an attribute to the signal clk; the above if
-- Boolean expression means the positive edge of clk
case pres_st is
when state0 =>
if A ='1' then
present := state1;
Z <= '0';
else
present := state0;
Z <= '1';
end if;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
else
present := state2;
Z <= '1';
end if;
end case;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
b) Verilog Description
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity listing10_32 is
end listing10_32;
architecture listing10_32 of listing10_32
is begin
shfl : process (a, c)
variable result, j : integer;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
result := 0;
lop1 : for i in 0 to 3 loop
if a(i) = '1' then
result := result + 2**i;
end if;
end loop;
if result > c then
lop2 : for i in 0 to 3 loop
j := (i + 2) mod 4;
temp (j) := a(i);
end loop;
else
lop3 : for i in 0 to 3 loop
j := (i + 1) mod 4;
temp (j) := a(i);
end loop;
end if;
b <= temp;
end process
shfl;
end listing10_32;
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
task xor_synth;
output d;
input a, b;
begin
d = a ^ b;
end
endtask
endmodule
An Example of a Procedure
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Int_Bin is
generic (N : integer := 3);
port (X_bin : out std_logic_vector (N downto 0);
Y_int : in integer;
flag_even : out std_logic);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
end Int_Bin;
begin
if (int MOD 2 = 0) then
flag <= '1';
else
flag <= '0';
end if;
for i in 0 to N loop
if (int MOD 2 = 1)
then bin (i) := '1';
else
bin (i) := '0';
end if;
int := int / 2;
end loop;
end itb;
begin
process (Y_int)
variable tem : std_logic_vector (N downto 0);
variable tem_int : integer;
begin
tem_int := Y_int;
itb (tem, flag_even, N, tem_int);
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
X_bin <=
tem; end
process;
end convert;
function andopr;
input a, b;
begin
andopr = a ^ b;
end
endfunction
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
input [2:0] x;
output [3:0] y;
reg [3:0] y;
always @ (x)
begin
y = fn
(x); end
if (a <= 4)
fn = 2 * a + 5;
end
endfunction
endmodule
CITSTUDENTS.I Page
Fundamentals of HDL 10EC45
ASSIGNMENT QUESTIONS
1) Discuss some of the important facts related to synthesis. 7 Marks
2) Discuss synthesis information from entity with examples.8 Marks
3) Describe synthesis information extraction from entity and module with examples.
10 Marks
4) Explain mapping the signal – assignment and variable assignment
statements to Gate-level with suitable examples. 10 Marks
5) Explain extraction of synthesis information from entity. 4 Marks
6) With an example explain verilog synthesis information extraction from
module inputs and outputs. 4 Marks
7) Write VHDL/verilog code for signal assignment statement Y = (2*X+3) for an
entity with one input X of 2-bits and one output Y of 4-bits. Show mapping of
this signal assignment to gate level. 12 Marks
CITSTUDENTS.I Page