1


2

 Copyright (C) 1996 Morgan Kaufmann Publishers, Inc

3


4

 This file is part of VESTs (Vhdl tESTs).

5


6

 VESTs is free software; you can redistribute it and/or modify it

7

 under the terms of the GNU General Public License as published by the

8

 Free Software Foundation; either version 2 of the License, or (at

9

 your option) any later version.

10


11

 VESTs is distributed in the hope that it will be useful, but WITHOUT

12

 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

13

 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License

14

 for more details.

15


16

 You should have received a copy of the GNU General Public License

17

 along with VESTs; if not, write to the Free Software Foundation,

18

 Inc., 59 Temple Place, Suite 330, Boston, MA 021111307 USA

19


20

 

21



22

 $Id: ch_09_fg_09_03.vhd,v 1.2 20011026 16:29:34 paw Exp $

23

 $Revision: 1.2 $

24



25

 

26


27

package cpu_types is

28


29

constant word_size : positive := 16;

30

constant address_size : positive := 32;

31


32

subtype word is bit_vector(word_size  1 downto 0);

33

subtype address is bit_vector(address_size  1 downto 0);

34


35

type status_value is ( halted, idle, fetch, mem_read, mem_write,

36

io_read, io_write, int_ack );

37


38

end package cpu_types;

39


40


41


42

package bit_vector_unsigned_arithmetic is

43


44

function "+" ( bv1, bv2 : bit_vector ) return bit_vector;

45


46

end package bit_vector_unsigned_arithmetic;

47


48


49

package body bit_vector_unsigned_arithmetic is

50


51

function "+" ( bv1, bv2 : bit_vector ) return bit_vector is

52


53

alias norm1 : bit_vector(1 to bv1'length) is bv1;

54

alias norm2 : bit_vector(1 to bv2'length) is bv2;

55


56

variable result : bit_vector(1 to bv1'length);

57

variable carry : bit := '0';

58


59

begin

60

if bv1'length /= bv2'length then

61

report "arguments of different length" severity failure;

62

else

63

for index in norm1'reverse_range loop

64

result(index) := norm1(index) xor norm2(index) xor carry;

65

carry := ( norm1(index) and norm2(index) )

66

or ( carry and ( norm1(index) or norm2(index) ) );

67

end loop;

68

end if;

69

return result;

70

end function "+";

71


72

end package body bit_vector_unsigned_arithmetic;

73


74


75


76


77

 code from book

78


79

package DMA_controller_types_and_utilities is

80


81

alias word is work.cpu_types.word;

82

alias address is work.cpu_types.address;

83

alias status_value is work.cpu_types.status_value;

84


85

alias "+" is work.bit_vector_unsigned_arithmetic."+"

86

[ bit_vector, bit_vector return bit_vector ];

87


88

 . . .

89


90

end package DMA_controller_types_and_utilities;

91


92

 end code from book

93

