Blankets consist of subsets (blocks) of cubes
denoted by line numbers from Table 1. The first
block in each blanket includes cubes which contain
“0” or “–” in place of variable x
i
, cubes in the second
block have value “1” or “–” in place of variable x
i
.
The input blanket for the subset V is then obtained as
an intersection (*) of two-block blankets (5
):
V
=
2 *
3 *
4 =
={1, 2, 3; 3, 7; 1, 2; 4; 6, 7; 5; 4, 6}.
(6)
The main task in a serial decomposition of a
function F with given sets U and V is to find a
blanket
G
by merging blocks of
V
as much as
possible. A condition for two blocks be mergeable is
given in (Brzozowski et al., 1997). We can create
mergeable classes of blocks, preferably maximal
classes with minimal cardinality that cover all the
blocks. In our example seven compatible classes in
blanket
V
can be merged to four blocks of
G1
G1
={1, 2, 3, 7; 4, 6; 6, 7; 5}, (7)
and encoded arbitrarily with two bits - G1 outputs,
see Table 2. The minimal cardinality of
G1
ensures
that parameter k in Fig. 1 is as small as possible. Let
us note that all relevant min-terms of G1 must be
covered in the cube table as well. Function G1 in our
example is specified by four cubes (7) in Table 2.
Table 2: Cube specification of function G1.
block
V
block
G1
x
2
x
3
x
4
G1
1 1, 2, 3, 1, 2, 3, 7 0 0 0 00
2 3, 7 1, 2, 3, 7 0 0 1 00
3 1, 2 1, 2, 3, 7 0 1 0 00
4 4 4, 6 0 1 1 11
5 6, 7 6, 7 1 0 1 10
6 5 5 1 1 0 01
7 4, 6 4, 6 1 1 1 11
To construct function H1, we need two more
blankets:
U
=
1 = {1, 3, 4, 5, 6, 7; 2, 3, 4 5, 6}.
U
*
G1
= {1, 3, 7; 5; 6, 7; 4, 6; 2, 3; 5; 6; 4, 6}.
(8)
The truth table of function H1 is given in Table 3.
In the 2
nd
decomposition step we could apply the
same procedure to function G1, removing variable x
2
and looking for the input blanket
V
for the subset V
= {x
3
, x
4
}, and so on. Fig.2. shows the iterative
decomposition up to the last variable x
4
. The original
function F can be implemented as a cascade of
LUTs generating functions H
i
. We call this cascade
with one variable per LUT the generic cascade. To
reduce the cascade length and thus the overall serial
access to LUTs, we can combine several consecutive
LUTs into a single LUT. For example, function F in
Fig.2 can be implemented as two LUTs, each with 8
words 2 bit wide, specified by functions G1 and H1.
Table 3: The truth table of function H1.
1
*
G1
x
1
G1 H1
1, 3, 7 0 0 0 1 1
5 0 0 1 0 0
6, 7 0 1 0 1 1
4, 6 0 1 1 0 1
2, 3 1 0 0 1 0
5 1 0 1 0 0
6 1 1 0 1
4, 6 1 1 1 0 1
H1
G1
H2
G2
H3
G3
H4
F
x
1
x
2
x
3
x
4
F = H1 (x
1
, G1)
G1= H2 (x
2
, G2)
G2 = H3 (x
3
, G3)
G3 = H4 (x
4
)
Figure 2: Disjunctive decomposition of multiple output
Boolean function F of 4 variables.
LUT cascade composed of p-input/q-output LUTs
can be implemented by storing all LUTs in one
memory. Cascaded LUTs are accessed one by one
under a supervision of a controller. Outputs from the
previous LUT and external input(s) address together
the next LUT, until the last LUT is reached. LUTs
are stored in a RAM and can be changed at will.
Even if the memory is accessed once for each LUT
in the cascade, operation is approximately ten times
faster than branching programs (Sasao et al., 2001).
The most important characteristics of logic
functions targeted for cascade implementation is
their profile. It is cardinality of blanket
Gi
along the
LUT cascade. The random functions have the profile
(the upper bound) in the shape of a mountain peak
with slope that rises as powers of 2 at the beginning
of the cascade and descending much faster as 2
k
-
powers of R at its end. E.g. the function
implemented as a case study (n = 13 inputs, m = 8
outputs, see Appendix) has had a profile
2, 4, 8, 14, 25, 41, 62, 81, 88, 103, 90, 77, 256
(9)
The log
2
of these values give the number of binary
values transferred between neighbor LUTs. To
minimize the total size of all LUTs in a cascade, it is
thus necessary
1. to minimize the values in the profile
2. to combine consecutive LUTs in an optimal way.
As regards the first option, the program tool
EasilyReprogrammableembeddedLogicControl
473