The Student's Guide to VHDL

Peter J. Ashenden


If you detect an error, I would be pleased to hear about it. You can send email to me at I will add errata to this list and acknowledge you as the finder. However, before sending an erratum, please check to make sure it's not already on the list.


Errata for the first and subsequent printings

You can tell which printing of the book you have by looking at the copyright page overleaf from the title page.  Below the line "Printed in the United States of America" is a line with one or more double-digit and single-digit numbers.  The rightmost double-digit number is the year of printing, and the rightmost single-digit number is the printing number.  For example, the line
02   01   00   99   98     5   4   3   2   1
indicates the first printing (in 1998).

From: Graham Minchin <>

On page 43, Figure 2-4: the line from "record types" to "constrained array types" should be from "array types" to "constrained array types."

From: Neil Boroky at The University of Adelaide

In Figure 5-10 on page 120: the labelling of the fourth and fifth delta cycles should be "0 + 3 delta" and "0 + 4 delta" respectively.

From: John A. Rupf, Ph.D. <>

On page 34: In the EBNF syntax rules for floating_type_definition and physical_type_definition, replace the character "~" with the symbol "<="' (the "is defined to be" symbol).

On page 35: In the type definition for length, the correct number of um per mil is 25.4.  However, VHDL requires the multiple in a secondary units definition to be an integer.  Thus we cannot change 254 um to 25.4 um in this context.  Instead, change the type declaration to the following:

    type length is range 0 to 1E9
        um;               -- primary unit: micron
        mm = 1000 um;     -- metric units
        m = 1000 mm;
        inch = 25400 um;  -- imperial units
        foot = 12 inch;
      end units length;

Also, in the examples of physical literals at the bottom of page 35, delete "450 mil", and insert "2 foot" at the end of the line.

From: Todd Salter <>

In Exercise 11 on page 79: The problem statement requires you to develop a model with an input of an enumeration type.  This requires an entity declaration with an input port of the enumeration type.  The only way an enumeration type can be made visible at the point of a port declaration is to declare the enumeration type in a package.  However, packages are not introduced until a later chapter.

To avoid this difficulty, change the problem statement as follows:

Develop a model for a floating-point arithmetic unit with data inputs x and y, data output z and function code inputs f1 and f0 of type bit.  Function codes f1 = '0' and f0 = '0' produce addition; f1 = '0' and f0 = '1' produce subtraction of y from x; f1 = '1' and f0 = '0' produce multiplication; and f1 = '1' and f0 = '1' produce division of x by y.

In the solution to Exercise 3 on page 294: The exit statement should exit from all of the nested loops.  Label the outermost loop with the label "search_loop", and change the exit statement to refer to this label.  The corrected code is:

    search_loop : for side in 0 to 1 loop
        for track in 0 to 79 loop
           for sector in 0 to 17 loop
              if ... then
                  exit search_loop;

From Tom Haas <>

In the subsection "Overloading Operator Symbols" on pages 185-187:  There is no mention that the syntax rule for function names is extended beyond that shown on page 179.  Thus the use of operator symbols as function names appears to be inconsistent with the rules for forming identifiers, described on page 18.

To avoid this confusion, insert the following sentence on page 185 before the last sentence ("Our bit-vector addition function..."):

The extended syntax rules for subprogram declarations are shown in Appendix C.

From Gary M Beihl <>

In Exercise 31 on page 157: A concurrent assertion statement in the entity declaration cannot read the output port, and so cannot perform the required verification.  Instead, the concurrent assertion statement must be included in the architecture body and use intermediate signals declared in the architecture body.  The problem statement should be amended by replacing "Augment the entity declaration by including" with "Include".

From Duane Clark <>

In Exercise 7 on page 52, the expression B"100010" sra 2 & X"2C" is syntactically correct, but semantically incorrect.  The operator "&" has higher precedence than "sra", but has the wrong type of operands.  The expression should be replaced with:

(B"100010" sra 2) & X"2C"
Then, in the answer for this expression on page 292, the expression should be corrected in the same way and the result should be B"11100000101100".