aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/vests/vhdl-93/ashenden/compliant/ch_14_ch_14_01.vhd
blob: e6704b6f5c9a658d253f86a058deac400a265a70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
-- Copyright (C) 1996 Morgan Kaufmann Publishers, Inc

-- This file is part of VESTs (Vhdl tESTs).

-- VESTs is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the
-- Free Software Foundation; either version 2 of the License, or (at
-- your option) any later version. 

-- VESTs is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-- for more details. 

-- You should have received a copy of the GNU General Public License
-- along with VESTs; if not, write to the Free Software Foundation,
-- Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 

-- ---------------------------------------------------------------------
--
-- $Id: ch_14_ch_14_01.vhd,v 1.2 2001-10-26 16:29:35 paw Exp $
-- $Revision: 1.2 $
--
-- ---------------------------------------------------------------------

library ieee;  use ieee.std_logic_1164.all;

               entity buf is
                 port ( a : in std_logic;  y : out std_logic );
               end buf;


               architecture basic of buf is
               begin
                 y <= a;
               end basic;




               library ieee;  use ieee.std_logic_1164.all;

               entity fanout_tree is
                 generic ( height : natural );
                 port ( input : in std_logic;
                        output : out std_logic_vector (0 to 2**height - 1) );
               end fanout_tree;

--------------------------------------------------

               architecture recursive of fanout_tree is

                 component buf
                   port ( a : in std_logic;  y : out std_logic );
                 end component;

                 component fanout_tree
                   generic ( height : natural );
                   port ( input : in std_logic;
                          output : out std_logic_vector (0 to 2**height - 1) );
                 end component;

                 signal buffered_input_0, buffered_input_1 : std_logic;

               begin

                 degenerate_tree : if height = 0 generate
                   output(0) <= input;
                 end generate degenerate_tree;

                 compound_tree : if height > 0 generate

                   buf_0 : buf
                     port map ( a => input, y => buffered_input_0 );

                   -- code from book

                   block_0 : block
                     for subtree_0 : fanout_tree
                       use entity work.fanout_tree(recursive);
                   begin
                     subtree_0 : fanout_tree
                       generic map ( height => height - 1 )
                       port map (  input => buffered_input_0,
                                   output => output(0 to 2**(height - 1) - 1) );
                   end block block_0;

                   -- end code from book

                   buf_1 : buf
                     port map ( a => input, y => buffered_input_1 );

                   block_1 : block
                     for subtree_1 : fanout_tree
                       use entity work.fanout_tree(recursive);
                   begin
                     subtree_1 : fanout_tree
                       generic map ( height => height - 1 )
                       port map ( input => buffered_input_1,
                                  output => output(2**(height - 1) to 2**height - 1) );
                   end block block_1;

                 end generate compound_tree;

               end recursive;




               library ieee;  use ieee.std_logic_1164.all;

               entity ch_14_01 is
               end ch_14_01;


               architecture test of ch_14_01 is

                 component fanout_tree
                   generic ( height : natural );
                   port ( input : in std_logic;
                          output : out std_logic_vector (0 to 2**height - 1) );
                 end component;

                 for clock_buffer_tree : fanout_tree
                   use entity work.fanout_tree(recursive);

                 signal unbuffered_clock : std_logic;
                 signal buffered_clock_array : std_logic_vector(0 to 7);

               begin

                 clock_buffer_tree : fanout_tree
                   generic map ( height => 3 )
                   port map ( input => unbuffered_clock,
                              output => buffered_clock_array );

                 clock_gen : process
                 begin
                   unbuffered_clock <= '1' after 5 ns, '0' after 10 ns;
                   wait for 10 ns;
                 end process clock_gen;

               end test;