Sie sind auf Seite 1von 286

ABSTRACT

BENGALI, SAURABH SUNIL. Vedic Mathematics and Its Applications in Computer


Arithmetic. (Under the direction of Dr. Paul Franzon).

Multiplication and Division are most basic and frequently used operations in a CPU. These
operations also form the basis for other complex operations. With ever increasing need for
faster clock frequency it becomes imperative to have faster arithmetic unit. In this work a
new system of Mathematics Vedic Mathematics is used to implement operations. Vedic
Mathematics is based on 16 formulas with the purpose of simplification of lengthy and
cumbersome mathematics. Vedic mathematics contains multiple algorithms for one
operation. In the current work these algorithms are evaluated for their suitability in binary
arithmetic. Suitable algorithms are implemented for Multiplication, Squaring and Division in
Verilog. Multiplication and Squaring are further used in design of Sine and Cosine function
implementations.
.

Vedic Mathematics and Its Applications in Computer Arithmetic

by
Saurabh Sunil Bengali

A thesis submitted to the Graduate Faculty of


North Carolina State University
in partial fulfillment of the
requirements for the degree of
Master of Science

Computer Engineering

Raleigh, North Carolina


2011

APPROVED BY:

_______________________________
Dr. Alexander Dean

______________________________
Dr. Eric Rotenberg

________________________________
Dr. Paul Franzon
Committee Chair

DEDICATION
This thesis is dedicated to my parents.

ii

BIOGRAPHY
Saurabh Sunil Bengali was born on 18th December 1985, in Nashik, India. He received his
Bachelor of Engineering degree from Pune University in 2007. After working in IIT,
Mumbai as Research Assistant, he joined North Carolina State University for Graduate
Studies. He is pursuing his research under Dr. Paul Franzon.

iii

ACKNOWLEDGMENTS
First and foremost, I would like to thank my parents, sister and brother-in-law for their
constant encouragement. I would also like to thank Prachiti Sakhalkar, without her support it
would have been impossible to reach where I stand today. It was great experience to work
with Dr. Paul Franzon. I would like to thank him for the faith he showed in my work. I would
also like to thank Dr. Eric Rotenberg and Dr. Alexander Dean for their support not only as
committee member but also as great instructors.
I would also like to thank Sagar Chinchani, Nidhi Pathak and Swanand Patil for their support
and encouragement.

iv

TABLE OF CONTENTS
LIST OF TABLES .
LIST OF FIGURES ...
Chapter 1
Introduction ...
1.1 Motivation ...
1.2 Goal of this Work
1.3 Related Work ...
1.4 Organization
Chapter 2
Vedic Mathematics
2.1 Revival
2.2 16 Sutras and Up-sutras ...
2.3 Decimal Multiplication
2.3.1 Nikhilam Sutra ..
2.3.2 Anurupyena ...
2.3.3 Urdhva-tiryagbhyam .
2.4 Decimal Squaring .
2.5 Decimal Division ..
2.5.1 Nikhilam
2.5.2 Dhwajanka
Chapter 3
Multiplication and Squaring ..
3.1 Binary Multiplication - Urdhva-tiryagbhyam .
3.1.1 Algorithm ..
3.1.2 Comparison of Vedic and Conventional Multiplier ..
3.2 Combining Partial Products .
3.2.1 Wallace Tree ..
3.2.2 Vedic Wallace .
3.2.3 Vedic Vedic .
3.3 Comparison with DesignWare .
3.3.1 DesignWare Implementation
3.3.2 Timing
3.3.3 Area Comparison ...
3.3.4 Power Comparison .
3.4 Analysis ...
3.4.1 Critical Path Analysis for 4 bit Multiplier .
3.5 Binary Squaring Dwandwayoga ...
3.5.1 Algorithm
3.5.2 Example of Squaring ..
3.6 Comparison with DesignWare Multiplier .......

viii
ix
1
1
1
2
2
3
4
4
4
4
6
6
12
15
19
20
21
26
30
30
30
30
31
33
33
35
36
36
36
37
39
42
44
44
49
49
49
50

3.6.1 Timing .
3.6.2 Area Comparison
3.6.3 Power Comparison ..
Chapter 4
Division ..
4.1 Binary Nikhilam ...
4.2 Binary Dhwajanka ...
4.2.1 Algorithm
4.2.2 Limitations and Solutions ...
4.2.2.1 Negative Subtraction .
4.2.2.2 Correct Remainder .
4.2.2.3 Partial remainder overflow
4.3 Comparison with DesignWare .
4.3.1 Timing .
4.3.2 Area .
4.3.3 Power ..
Chapter 5
Trigonometric Functions ...
5.1 Taylor Series
5.2 CORDIC Algorithm .
5.3 Polynomial Approximation and Interpolation .
Chapter 6
Polynomial Approximation and Interpolation ...
6.1 Newton Interpolation ..
6.1.1 First-order Newton Polynomials .
6.1.2 Second-order Newton Polynomials
6.2 Lagrange Interpolating Polynomials
6.2.1 Lagrange First order ...
6.2.2 Lagrange Second order ..
6.3 Approximation .
6.3.1 Legendre .
6.3.2 Chebyshev Polynomials ..
6.3.3 Minimax Polynomial ..
6.3.4 Polyfit function ...
6.4 Comparison of methods for Sine .
6.5 Comparison of methods for Cosine .
6.6 Comparison with DesignWare .
6.6.1 Timing .
6.6.2 Area Comparison
6.6.3 Power Comparison ..
Chapter 7
Summary and Future Work ...

50
51
53
42
56
56
58
58
59
59
61
62
63
63
64
65
51
66
66
68
70
56
56
71
71
72
73
73
74
74
76
76
77
77
77
77
79
79
79
82
85
85

vi

7.1 Summary .
7.2 Future Work
REFERENCES .
APPENDIX ..
APPENDIX A Verilog Code for Multiplication ...
APPENDIX B Verilog Code for Squaring
APPENDIX C Verilog Code for Sine and Cosine
APPENDIX D Verilog Code for Division
APPENDIX E MATLAB codes for coefficient comparison ...

85
85
86
89
90
126
164
237
246

vii

LIST OF TABLES
Table 2.1 Duplexes of Numbers19

viii

LIST OF FIGURES
Figure 2.1 Example of Nikhilam ....
Figure 2.2 Example of Nikhilam
Figure 2.3 Example of Nikhilam
Figure 2.4 Example of Nikhilam ....
Figure 2.5 Example of Nikhilam
Figure 2.6 Example of Nikhilam
Figure 2.7 Example of Nikhilam
Figure 2.8 Normal Example of Nikhilam ...
Figure 2.9 Sub-Normal Example of Nikhilam ...
Figure 2.10 Super-Normal Example of Nikhilam ..
Figure 2.11 First Example of Anurupyena .
Figure 2.12 Second Example of Anurupyena
Figure 2.13 Third Example of Anurupyena ...
Figure 2.14 Forth Example of Anurupyena ...
Figure 2.15 Multiplication of two fourth degree polynomials ..
Figure 2.16 Vertically Crosswise First Cross Product ...
Figure 2.17 Vertically Crosswise Intermediate Cross Product ..
Figure 2.18 Vertically Crosswise Intermediate Cross Product ..
Figure 2.19 Different Cross Products of Two Numbers
Figure 2.20 Addition of Cross Products
Figure 2.21 Complete Example of Squaring ..
Figure 2.22 Process of Nikhilam for Division ...
Figure 2.23 Process of Nikhilam for Division ...
Figure 2.24 Process of Nikhilam for Division ...
Figure 2.25 Process of Nikhilam for Division ...
Figure 2.26 Process of Nikhilam for Division ...
Figure 2.27 Another method to get quotient ..
Figure 2.28 Example of Nikhilam for Non Suitable Numbers ...
Figure 2.29 Setup for Division ...
Figure 2.30 Complete Example of Dhwajanka ..
Figure 2.31 Complete Example of Dhwajanka ..
Figure 2.32 Complete Example of Dhwajanka ..
Figure 2.33 Complete Example of Dhwajanka ..

7
8
9
9
9
10
10
11
11
12
13
14
14
15
15
16
16
16
18
18
20
22
22
23
23
24
24
25
26
26
27
28
29

Figure 3.1 Urdhva-tiryagbhyam Complete Example .


Figure 3.2 Conventional Cross Product Addition ..
Figure 3.3 Full Adder.
Figure 3.4 Wallace tree reduction ..
Figure 3.5 Comparison of Multiplication for delay ...

31
33
34
35
38

ix

Figure 3.6 Improvement over DesignWare ...


Figure 3.7 Comparison of Multiplier Area (Minimum Delay) ..
Figure 3.8 Area for 8 bit multiplier relaxed designs ..
Figure 3.9 Area for 16 bit multiplier relaxed designs
Figure 3.10 Area for 23 bit multiplier relaxed designs ..
Figure 3.11 Comparison of Total Power for multipliers
Figure 3.12 Power dissipation for 8 bit multiplier relaxed designs ...
Figure 3.13 Power dissipation for 16 bit multiplier relaxed designs .....
Figure 3.14 Power dissipation for 23 bit multiplier relaxed designs .....
Figure 3.15 4x4 Multiplication using Wallace tree Addition
Figure 3.16 Block level structure of a 4x4 multiplier by Wallace tree reduction ..
Figure 3.17 Multiplication by Vedic Mathematics ....
Figure 3.18 Figure 3.18 - Block level structure of a 4x4 multiplier by Vedic reduction ..
Figure 3.19 Cross Product for Multiplication
Figure 3.20 Cross Product for Squaring
Figure 3.21 Comparison of Square for delay
Figure 3.22 Comparison of Area for Square (Minimum Delay) ..
Figure 3.23 Area comparison for relaxed 8 bit designs of square ....
Figure 3.24 Area comparison for relaxed 16 bit designs of square ..
Figure 3.25 Area comparison for relaxed 23 bit designs of square ..
Figure 3.26 Comparison of Power for Square ..
Figure 3.27 Total Power comparison for relaxed 8 bit designs of square ....
Figure 3.28 Total Power comparison for relaxed 16 bit designs of square ..
Figure 3.29 Total Power comparison for relaxed 23 bit designs of square ..

39
40
40
41
41
42
43
43
44
45
46
47
48
50
50
51
51
52
52
53
54
54
55
55

Figure 4.1 Complete Example of Nikhilam for Division ..


Figure 4.2 Complete Example of Dhwajanka
Figure 4.3 Dhwajanka Problem of recalculation
Figure 4.4 Dhwajanka Solution of recalculation
Figure 4.5 Dhwajanka Problem of Negative Quotient ...
Figure 4.6 Dhwajanka Solution for Negative Quotient ..
Figure 4.7 Comparison of Division for Delay ...
Figure 4.8 Comparison of Division for Area .....
Figure 4.9 Area comparison of relaxed division ........
Figure 4.10 Comparison of Division for Power .....
Figure 4.11 Comparison of Power for relaxed designs ..

57
58
59
60
61
62
63
64
64
65
65

Figure 5.1 Terms Required by Taylor Series .

67

Figure 6.1 First Order Newton Polynomial .


Figure 6.2 First Order Lagrange Polynomial .
Figure 6.3 Comparisons of Sine and Cosine with DesignWare for Cycle Time ...
Figure 6.4 Comparison of Sine with DesignWare for Area ...
Figure 6.5 Comparison of Cosine with DesignWare for Area .......................
Figure 6.6 Area Comparison for Relaxed designs of 8 bit Sine
Figure 6.7 Area Comparison for Relaxed designs of 16 bit Sine ..
Figure 6.8 Area Comparison for Relaxed designs of 8 bit Cosine ....
Figure 6.9 Area Comparison for Relaxed designs of 16 bit Cosine ..
Figure 6.10 Comparison of Sine with DesignWare for Area .....
Figure 6.11 Comparison of Cosine with DesignWare for Area .
Figure 6.12 Area Comparison for Relaxed designs of 8 bit Sine ..
Figure 6.13 Area Comparison for Relaxed designs of 16 bit Sine ....
Figure 6.14 Area Comparison for Relaxed designs of 8 bit Cosine ..
Figure 6.15 Area Comparison for Relaxed designs of 16 bit Cosine

72
74
79
80
80
80
81
82
82
82
83
83
84
84

xi

Chapter 1
Introduction
1.1 Motivation
As a student in India, Vedic Mathematics is a name which is heard many times with
reference to the techniques for solving mathematics problem mentally. One of the main
purposes of Vedic mathematics is to transform the tedious calculations into simpler, orally
manageable operation without much help of pen and paper. Any ordinary human can perform
mental operations for very small magnitude of numbers and hence Vedic mathematics
provides techniques to solve operations with large magnitude of numbers easily. Vedic
mathematics provides more than one method for basic operations like multiplication and
division. For each operation there is at least one generic method provided along with some
methods which are directed towards specific cases simplifying the calculations further.
Todays CPUs are increasingly working on higher frequencies with reduction in size of
transistor. Arithmetic and Logic Unit - ALU is one of the most important and critical blocks
in CPU. Hence it is imperative to have fast and efficient ALU. Division is the most time
consuming amongst the basic mathematical calculation. In todays computing technology
functions like Sine and Cosine are also frequently required and are implemented in hardware.
With these considerations, it is always important to have fast and efficient mechanism to
implement mathematical functions. Vedic mathematics provides algorithms to simplify the
mathematics and hence is perfect solution for the problem stated.

1.2 Goal of this work


The goal of this work is to understand and implement the formulas of Vedic Mathematics for
binary numbers and assess their use in Computer Arithmetic. The different mathematical
functions explored are

Multiplication 8 bit, 16 bit and 23 bit multiplication are implemented and


synthesized, timing, area and power of the hardware designed is evaluated.

Squaring Similar to multiplication 8 bit, 16 bit and 23 bit i.e. single precision
squaring hardware design are implemented and evaluated.

Sine and Cosine functions are implemented by polynomial approximation and


interpolation method and performance is observed.

Division algorithm for a 16 by 8 bit division is implemented in Verilog and


performance is evaluated.

All the above implementations are compared against Synopsys DesignWare blocks which are
highly optimized, ready to use functional block. 45nm PDK is used to implement both Vedic
designs and DesignWare blocks.

1.3 Related Work


Many have proposed the use of Vedic mathematics methods for multiplication, but many of
them restrict the implementation to 8 bits. [15] Implements a 2, 3, 4 and 8 bit multipliers by
Nikhilam formula and also concludes that multiplication by generic formula Urdhvatiryagbhyam is slower because of the structure. [16] Argues that there is no difference
between multiplication done by Vedic and conventional method. [17] Implements Complex

number multiplier using Vedic mathematics methods and concludes that it is suitable for high
speed complex arithmetic circuits. [18] Implements cubing circuit by Anurupyena formula by
different structures for 8 bit and infers Vedic carry save cubing is best. [13] Uses Vedic
Mathematics formula for 22 multiplication and uses it as a block in higher width
multiplication, for synthesis XC2S100-5tq144 was used. It can be observed that all the
previous work is related to only multiplication and most of the multipliers are implemented
using formula Nikhilam or Anurupyena a corollary of Nikhilam with all multiplier
implementation done for 8 bits or lower. [19] And [20] use multiplication in applications
such as FFT and elliptic curve cryptography.

1.4 Organization
This thesis is divided in to 7 chapters. Chapter 2 discusses different Vedic mathematics
algorithms available for Multiplication, Squaring and Division for decimal numbers. Then
next chapters focus on each of the function. Chapter 3 focuses on multiplication and squaring
as they are closely related. Chapter 4 talks about binary division and problems associated
with implementation of algorithms in hardware. Chapter 5 discusses methods available for
Sine and Cosine and concludes Polynomial Approximation and Interpolation is better suited
for implementation of Sine and Cosine functions. Chapter 6 introduces to different methods
for Polynomial Interpolation and Approximation and also results obtained in comparing
those methods. Chapter 7 is dedicated for summary and future work.

Chapter 2
Vedic Mathematics
The word Vedas which literarily means knowledge has derivational meaning as principle
and limitless store-house of all knowledge. The word Veda also refers to the sacred ancient
Hindu literature which is divided into four volumes. Vedas are considered to be one of the
oldest forms of written records by man. Vedas initially were passed from previous
generations to next orally. Later they were transcribed in Sanskrit. A survey of all scripts
available of Vedas across different part of India showed no slightest difference in them.
Vedas include information from many subjects from religion, medicine, architecture,
astronomy, mathematics etc .

2.1 Revival
A scholar from India Shri Bharati Krishna Tirthaji after careful study of appendix of one of
the Vedas Atharvaveda, reconstructed a mathematical system based on the formulas in it.
The main purpose of the system was to use some techniques to solve the lengthy
mathematics orally or with minimum space utilization on paper. The system of Vedic
mathematics is based on 16 Sutras formulas and 13 Up-sutras or Corollaries.

2.2 16 sutras and Up-sutras


Entire mechanics of Vedic mathematics is based on 16 sutras formulas and 13 up-sutras
meaning corollaries.
Sutras

1. Ekadhikena Purvena
2. Nikhilam Navatascharamam Dashatah
3. Urdhva-tiryagbhyam
4. Paravartya Yojayet
5. Shunyam Samyasamucchaye
6. Anurupye Sunyamanyat
7. Sankalana vyavakalanabhyam
8. Puranaprranabhyam
9. Calana Kalanabhyam
10. Yavadunam
11. Vyastisamashtih
12. Sheshanynkena Charmena
13. Sopantyadvayamantyam
14. Ekanyunena Purvena
15. Ginitasamucchayah
16. Gunaksamucchayah
Up-sutras
1. Anurupyena
2. Shishyate Sheshsamjnah
3. Adyamadye Nantyamantyena
4. Kevalaih Saptakam Gunyat
5. Vestanam

6. Yavadunam Tavadunam
7. Yavadunam Tavadunikutya Varganka ch Yojayet
8. Antyayordhshakepi
9. Antyatoreva
10. Samucchayagunitah
11. Lopanasthapanabhyam
12. Vilokanam
13. Gunitasamucchyah Samucchayagunitah

2.3 Decimal Multiplication


In Vedic mathematics there are 3 methods to implement multiplication. Out of three there is
one generic method which can be applied to all cases whereas other two are for special cases
which are simpler to deal with. As the main purpose of Vedic Mathematics is to be able to
solve complex calculations by simple techniques which can be done mentally, these Vedic
formulas require dealing with very small numbers. The formulas being very short their
practical application becomes very simple.

2.3.1 Nikhilam Sutra


First formula under consideration is Nikhilam Navatascharam Dashtah which means all from
9 and last from 10. The detailed explanation for the procedure is as follows. We will start
from the simple multiplication of 7 x 8 and then move to gradually move towards bigger
numbers.

7
8
56

7 -3
8 -2
5/ 6

Figure 2.1 - Example of Nikhilam

1. Take the base of calculation as power of 10 which is nearest to the multiplicands say
M and N. In case considered above it is, say B, 10.
2. Subtract base B from each multiplicand and note two remainders as say m and n. In
this case they are -3 and -2 respectively.
3. The product will have two parts. Here they are shown by separator /. Right part is
obtained by multiplication of two remainders namely m and n
R=mxn
Here 2 x 3 = 6
4. Left part can be obtained by various methods as follows.
a. Subtract base B from the sum of two multiplicands M and N
L = M + N -10
Here 7 + 8 10 = 5
b. Add the sum of two remainders, m and n from base B
L = 10 + m + n
Here 10 2 3 = 5
c. Cross add remainder with multiplicand which is either M+n or N+m
L = M + n or L = N + m

Here 8 - 3 = 5 or 7 2 = 5
5. The answer is obtained by just concatenating left and right part as LR, here 56.
Though this method is applicable to all cases its improvement over conventional
multiplication largely depends on closeness of multiplicands to the power of 10.
The algebraic illustration of this method is as follows

Here x acts as base B which is decided at the start of process.


In this method product ab is restricted to the number of digits equal to the power by which 10
has to be raised to get base. If the product has more digits then the extra digits are added to
the left had side. In the following illustration as the base in 10, hence allowed digits on right
is limited to 1. But as there are 2 digits extra digit is added on left side to get the correct
answer.

5
6
30

5
6
1

5
4
20

=
1+2/0
=
30
Figure 2.2 - Example of Nikhilam
Nikhilam Sutra can be used for numbers which are more than base without any limitation. An
illustration is as follows

103
105
10815

103
105
108
=

+3
+5
15

10815

Figure 2.3 - Example of Nikhilam


In above two cases product ab is positive and hence if it has more digits then the extra digits
are added to the left part. This can be further extended to multiply two numbers which are on
opposite sides of base. In this scenario product is negative and hence correct carry has to be
subtracted from left side to make right side positive within the digit limit according to the
base. In the illustration below left product is -15; to make it positive 1 is shifted from right.

103
95
9785
=
=

103 +3
95 -5
98 -15
97 / 100 -15
9785

Figure 2.4 - Example of Nikhilam


Another illustration of similar case

121
93
11253
=
=
=

121 +21
93 -7
114 -147
112 / 200 147
112 / 53
11253

Figure 2.5 - Example of Nikhilam

One more case needs to be considered, just as the process multiplication of remainders
constituting the right part of the product could contain more digits than permissible, and it
may similarly yield a product of remainders with digits less than specified digits. This could
be easily dealt with by adding appropriate number of zeros.
Illustration

101
102
10302
=
=

101
102
103

+1
+2
2

103 / 02
10302

Figure 2.6 - Example of Nikhilam

Here product has only one digit which is less that the required digits as 2. One 0 is added to
the product to make it a 2 digit number and correct answer is obtained by combining two
products. Another illustration is shown below.

97
97
9409
=
=

97
97
94

-3
-3
9

94 / 09
9409

Figure 2.7 - Example of Nikhilam

10

The formula becomes more evident when used for numbers containing larger digits. All the
digits from 9 and last from 10 help us to find the remainders quickly. Depending upon the
digits in remainder which can fall in any one category of normal, sub-normal and supernormal any case can be solved to get the correct answer.
Normal
In the following illustration remainder for first multiplier is obtained by subtracting all digits
from 9 but last digit from 10

9
8
1

9
2
7

82413
99999
8241217587
=

9
4
5

9
1
8
82413
99999
82412

10
3
7
-17587
-00001
17587

8241217587

Figure 2.8 - Normal Example of Nikhilam

Sub-Normal
Multiplication of remainders contains fewer digits.

9988
9991
99790108

9998
9991
9979

-0012
-0009
0108

Figure 2.9 - Sub-Normal Example of Nikhilam

11

Super-Normal
Multiplication of remainders contains more digits.

112
998
111776
=
=

112
998
110

-888
-002
1776

110 + 1 / 776
111776

Figure 2.10 - Super-Normal Example of Nikhilam

2.3.2 Anurupyena
The reduction in calculation for the multiplication by Nikhilam solely depends on closeness
of multiplicands, if not both at least one, to the base which has to be power of 10. In case
both the multiplicands are not near power of 10, two large remainders are obtained and their
multiplication is not a straightforward task. Vedic mathematics has a corollary Anurupyena
to deal with such cases. Anurupyena means proportionality. In application sense it means
while consideration the base and calculation of left part of multiplication, a rational
proportionality can be used to reduce the calculations. In other words, while calculating the
remainders from multiplicands a base can be chosen as some rational multiple of power of 10
such that multiplication of remainders becomes simple. In turn, while calculating the right
part of multiplication same proportionality needs to be considered to calculate correct
answer. For example, if a suitable base was found to be k times power of 10, right part has to
be multiplied by k times to calculate answer. Suppose we have to multiply 43 by 49, by
Nikhilam formula, this multiplication translates into multiplication 57 51 for the left part
and right part also has two bigger numbers to deal with. This happens as both multiplicands

12

are far away from power of 10, here 100. With some observation we can say that base 50
could be effective as it is closer to at least one of the multiplicand, here it is closer to both.
With this corollary we make the base suitable by some multiple of power of 10. Here the
multiple is . While calculating left part this constant has to be multiplied with number
obtained by cross adding multiplicand with remainder.
Illustration
43 x 49

Base 100 = 50

43
49
2107

Initial Base = 100

43 -07
49 -01
42 07

42 / 07

2107

Figure 2.11 - First Example of Anurupyena


The procedure is as follows
1. Choose working base conveniently by multiplying power of 10 by a rational number,
say k. Here k = 100 / 50 = 1/2
2. Calculate remainders using the base as numbers minus base.
43 50 = -07
49 50 = -01
3. Cross add number and remainder to get the left part of product
43 01 = 42
4. Multiply k to this obtained left part to get the final left part of the answer
42 = 21

13

5. Concatenate left part with right part which is obtained by multiplication of remainders
21 / 07 = 2107
Note While concatenation all rules stated in previous section regarding sub-normal, supernormal product should be followed.
Correct answer can be obtained by different choices of base. If we assumed initial base as 10,
and base for calculation as 50 then k = 50 / 10 = 5
Base = 10 5 = 50

k=5

43
49
42
=
=
=

Initial Base = 10

-7
-1
7
42 5 / 7
210 /7
2107

Figure 2.12 - Second Example of Anurupyena

Base = 10 4 = 40

k=4

43
49
52
=
=
=

Initial Base = 10

+3
+9
27
52 4 +2 / 7
208 + 2 /7
2107

Figure 2.13 - Third Example of Anurupyena

14

Note If multiplication of proportionality constant and left part of product does not result in
whole number fraction is shifted to right part by multiplying it to original base.
Illustration:

Original Base: 1000 New Base = 1000 /4 = 250

248
245
60760
=
=
=
=

248 -2
245 -5
243 010
243 / 4 / 010
60.75 / 010
60 / 750 + 010
60760

Figure 2.14 - Forth Example of Anurupyena

2.3.3 Urdhva-tiryagbhyam
As seen in previous two sections the Nikhilam and Anurupyena are for special cases, whereas
Urdhva-tiryagbhyam is general formula applicable to all. Its algebraic principle is based on
multiplication of polynomials. Consider we want to multiply two 4th degree polynomials
Ax4 + Bx3 + Cx2 + Dx + E
Zx4 + Yx3 + Xx2 + Wx + V
AZ x8 + (AY+BZ) x7 + (AX+BY+CZ) x6 + (AW+BX+CY+DZ) x5 +
(AV+BW+CX+DY+EZ) x4 + (BV+CW+DX+EY) x3 + (CV+DW+XE) x2 + (DV+EW) x +
EV
Figure 2.15 - Multiplication of two fourth degree polynomials

15

Highest degree coefficient can be obtained by multiplication of two highest degree


coefficients of individual polynomial namely A and Z. A next degree coefficient is obtained
by addition of cross multiplication of coefficients of 4 th degree and 3rd degree of other
polynomials. It means A which is 4th degree coefficient of polynomial-1 is multiplied by 3rd
degree coefficient of polynomial-2 is added to 4th degree coefficient of polynomial-2
multiplied by 3rd degree coefficient of polynomial-1 to get (AY+BZ).
A

Figure 2.16 - Vertically Crosswise First Cross Product


Similar logic of cross multiplication and addition can be extended till all 5 coefficients of
both polynomials are used as follows. Every iteration gives a coefficient of product.
A

Figure 2.17 - Vertically Crosswise Intermediate Cross Product


In this iteration, coefficient of degree 4 of product is obtained. For next iteration we drop A
and Z which are the highest degree polynomial coefficients. The resulting operation gives
coefficient of the degree 3 of multiplication of polynomials. As follows
A

Figure 2.18 - Vertically Crosswise Intermediate Cross Product

16

Continuing with this process last coefficient is obtained by multiplication of 0 th degree terms
of both polynomials as E*V. This process can be done is both ways as it is symmetric. In
summary the process can be stated as, process of addition of product of coefficients of two
polynomials in crosswise manner with increase and then decrease in number of coefficients
from left to right with crosswise meaning product of coefficients for one polynomial going
rightwards while for other leftwards.
Any decimal number can be thought as a polynomial with unknown or x equal to 10. Being
said that, formula stated above can be utilized to calculate product of two decimal numbers.
Each digit of decimal number is though as coefficient of power of 10. Only restriction in this
case is each cross product should be only one digit, if not it is added to the next power of 10.
Below illustration will make this point clear.
Suppose we want to multiply two numbers 3451 and 6723. Cross-products are obtained as
follows.

17

Cross product 1 = 18
3
4
5
1

Cross product 2 = 21 + 24 = 45
3
4
5
1

Cross product 3 = 6 +28 +30 = 64


3
4
5
1

Cross product 4 = 9 + 8 + 35 + 6 = 58
3
4
5
1

Cross product 5 = 12 + 10 +7 = 29
3
4
5
1

Cross product 6 = 10 + 2 = 12
3
4
5
1

Cross product 7 = 3
3
4
5

Figure 2.19 - Different Cross Products of Two Numbers

All cross products are combined as follows


18 / 45 / 64 / 58 / 29 / 12 / 3 =

1 8 5 4 8 9 2 3
4 6 5 2 1
------------------------------------------2 3 2 0 1 0 2 3

Figure 2.20 - Addition of Cross Products

As each cross product field can contain only one digit, extra digit is passed to next cross
product field. If the addition of cross product and borrowed digit in more than 9, again the
extra digit is passed to next cross product. Here if we start from right, 3 is kept as it is. Out of
12, 2 is kept and 1 is passed to next cross product where 29 + 1 = 30; out of which 0 is kept
and 3 is passed. 58+3 = 61, 1 is kept and 6 is passed. 64 + 6 = 70; 0 is kept and 7 is passed.

18

45 + 7 = 52. After keeping 2, 5 passed to next cross product. 18 being last 5 is added to it and
that forms the highest 2 digits of number. Hence the product is 23201023. Also same answer
can be obtained if normal addition of two numbers is done after arranging cross products as
shown on right.

2.4 Decimal Squaring


Decimal squaring is achieved very quickly for formula Dwandwayoga which means
duplex. Duplex of a digit is obtained by multiplication with itself, i.e. duplex of a will be a 2.
Duplex of two digit numbers is obtained by doubling their product, duplex of ab is 2ab.
Duplex of three digit number is obtained by addition of square of middle digit and twice
product of first and second. So abc will have duplex (2ac + b2).
Illustration:
Table 2.1 - Duplexes of Numbers
Number
4

Duplex
16

43

2*4*3 = 24

182

2*1*2 + 82 = 68

3824
10934

2*3*4 + 2*8*2 = 56
2*1*4 + 2*0*3 + 92
= 8 + 0 + 81 = 89
23456789 2*2*9 + 2*3*8 + 2*4*7 + 2*5*6
= 36 + 48 + 56 + 60 = 190
33
2*3*3 = 18

It can be observed that calculating duplex is based on Urdhva-tiryagbhyam. To obtain the


square of a number, duplexes are calculated starting from a digit on right or left then

19

proceeding leftwards or rightwards to add digits while determining duplex and adding the
duplexes similar to the addition of cross-products described. Figure 2.21 shows complete
illustration.
324512 = 1053067401
Duplexes
No
Duplex
3
9
32
12
324
24+4 = 28
3245
30 +16 = 46
32451
6+20+16 = 42
2451
4+40 = 44
451
8+25 = 33
51
10
1
1
9/12/28/46/42/44/33/10/1

9 2 8 6 2 4 3 0 1
1 2 4 4 4 3 1
----------------------------------------------1 0 5 3 0 6 7 4 0 1

Figure 2.21 - Complete Example of Squaring

2.5 Decimal Division


In this section techniques regarding division will be discussed. Similar to
multiplication Vedic mathematics has 3 different formulas to make division simpler. First
formula Nikhilam is a special case formula for numbers which are near power of 10.
Paravartaya improves over Nikhilam to solve a larger class of problem, whereas Dhwajanka
is a generic method applicable to all.

20

2.5.1 Nikhilam
The process for Nikhilam Sutra is as follows
1. Calculate base as power of 10 and nearest to divisor, say base B.
2. Subtract divisor from base calculated above, say deficit D.
3. As division yields remainder with maximum number of digits same as number of
digits in divisor, represent dividend in two different numbers separated by a separator
/ with right part containing number of digits equal to number of digits in divisor
from unit place and left part consisting rest of the digits.
4. Now multiply deficit with first digit of dividend from left say M1, call product as P1
and place it below starting from second digit towards right. Add second digit of
dividend with the digit below it of multiplication M1.
5. Now multiply deficit D with M1 and align the product, say P2, starting from third
digit of dividend. To get next multiplier digit add third digit of dividend second digit
of first product P1 and first digit of product P2.
6. Repeat this procedure for number of times equal to digits in left part of the dividend.
7. Add Products Px with dividend to get quotient and remainder on left and right hands
side of separator respectively. Addition should be carried out separately for left and
right part separated by separator.
Illustration:
11023 / 89

123

Remainder 76

1. Base B = 100 (Power of 10 nearest to 89)


2. Deficit D = 100-89 = 11

21

3. As divisor is 2 digits wide, we separate dividend 11023 in 2 parts. Right part


contain 2 digits same as digits of divisor and rest in left part
11023 =

110 / 23
8
1

9
1

1
1

0/
1
2

3
P1

M1 = 1 + 1 = 2

Figure 2.22 - Process of Nikhilam for Division

4. In this step multiply D = 11 to 1 which is first digit from left of dividend.


Product is aligned from the second digit of dividend as shown. Next multiplier
m1 is obtained by adding 1 second digit of dividend and 1 first digit of
product P1
M1 = 1 + 1 = 2
5. P2 = M1 * divisor. And aligned with third digit of dividend.
8
1

9
1

1
1

0/
1
2

M1 = 1 + 1 = 2

Figure 2.23 - Process of Nikhilam for Division

6. Continue with the procedure till product of divisor and multiplier align with
right part. This matches with correct answer.

22

8
1

9
1

1
1

0/
1
2

2
3

M2 = 0 + 1 +2 = 3
1

Quotient = 123
Remainder = 76

Figure 2.24 - Process of Nikhilam for Division

Additional Notes
If after addition right part which is remainder is more than the divisor, subtract divisor from
right part to make it below divisor and add 1 to left part.
Illustration
8
1

9
1

1
1

0/
1
2

2
3

Quotient = 123 + 1 = 124


Remainder = 96 - 89 = 7

Figure 2.25 - Process of Nikhilam for Division

A carry generated at right part can be treated in two ways.


1. Subtract divisor as shown above.
2. Add deficit corresponding to the carry and add carry to left part.

23

8
1

9
1

1
1

0/
1
2

2
3

10

Quotient = 123 + 1 = 124


Remainder = 106 - 89 = 17

Figure 2.26 - Process of Nikhilam for Division

3
1

10

0
1
1

6
1
7

Figure 2.27 - Another method to get quotient


Further Note If addition of dividend digit and multiplication digits is more than 10 then the
extra carry goes to higher digits.These digits needs to be taken care of as if they are part of
dividend. Following example will make it clear.

24

4
5

1
9

4
15
1
10
3
5
9

58

81
3

25
37

45
8

5
2

6
1

1
27
8
18
6
9
5

45

5
1

7
8

9
0

8
8

0
1

17
7
5
13
3
5
9

8
8

1
2

9
4

8
8

2
2

4
7

8
8

2
2

7
9

8
8

2
3

9
0

7
7

7
9

3
2

7
15
25
5
10
17

8
27
5
5
18
3

5
5
5
5

3
3
9
2
2
9
1
45
55
5
25
35
5
15
22
2
10
14
4
5
9

5
5
5
5
5
81
6
6
45
1
1
27
8
8
18
6
6
9
5

95/41 = 2 R 14

Quotient = 830 + 2 = 832

Figure 2.28 - Example of Nikhilam for Non Suitable Numbers

It can be observed that if the procedure becomes extra-ordinarily long which is even more
than the conventional method. In such cases Anurupyena Proportion formula seen in
multiplication can be utilized. Vedic mathematics provides another formula Paravartaya
which can deal with such scenario.

25

2.5.2 Dhwajanka
Vedic mathematics describes a method called Dhwajanka On the top of the flag which is a
generalized formula for division. It is based on the formula Urdhva-tiryagbhyam. As seen
earlier any decimal number can be represented as polynomial with variable x substituted for
10. Suppose we want to divide 64119 by 234 both numbers can be represented in polynomial
form as 6x4 + 4x3 + x2 + x + 9 and 2x2 + 3x + 4 respectively. In the first step to match 6x4, 2x2
is multiplied with 3x2. Other terms in divisor polynomial are multiplied with 3x2 which is
subtracted from dividend polynomial. Again after subtraction divisor is multiplied with -2x to
make cubic term 0. In this process it can be observed that divisor and quotient coefficients
are multiplied and added similar to Urdhva-tiryagbhyam. Dhwajanka process is based on this
fact. The actual process of division is performed as follows
1. The divisor and dividend are arranged in the form shown below. Only leftmost digit
of divisor is left aside. Dividend is separated in two sections right part consisting
number of digits equal to digits in divisor. Divisor is represented by d, dividend by X
and quotient by A.

dn-1 dn-2

d1

d0

Xk

Xk-1 Xk-2

Xn

A1

A0

Xn-1

..

X1

dn
Ak-n Ak-n-1

Figure 2.29 - Setup for Division

26

2. Only first digit of dividend is divided by the left out digit, quotient and remainder of
this division are noted.
3. During next iteration remainder from previous iteration is used with next digit of
dividend. Quotient digits and dividend digits without leftmost digit are multiplied in
vertically and crosswise manner. This product is subtracted from number formed by
combination of remainder and digit of remainder.
4. Number left after subtraction in step 3 is divided by left out digit of divisor quotient is
noted and remainder is prefixed with rest of the digits of dividend.
5. This process is continued till same number of quotient digits equal to digits in left
part of dividend is obtained.
6. Remainder is obtained by subtraction of right part of dividend prefixed by last
remainder and cross multiplication of quotient and divisor.
Illustration:
75218 / 52 = 1446

Remainder = 38 12 = 26

5
2

2
3

1
4

8
3

Figure 2.30 - Complete Example of Dhwajanka

1. Divisor 52 is separated as leftmost digit 5 and rest digits, here 2. As rest digits in
divisor contain only one digit, dividend is represented as 7512 left /quotient part
and 8 as right/remainder part.

27

2. First digit of dividend 7 is divided by 5, quotient 1 is represented as first digit of


quotient with remainder 2 as prefix of other dividend digits.
3. Next iteration combination of remainder 2 and second digit of dividend which 5 as 25
is formed. Cross multiplication of quotient and rest digits of divisor is calculated
which 1 2 = 2 is subtracted from 25. 25 - 2 = 23. 23 are divided by 5 giving quotient
4 and remainder 3.
4. Next iteration. 32 8 = 24. 24 / 5 = quotient 4 remainder 4.
5.

Next iteration. 41 8 = 33. 33 / 5 = quotient 6 remainder 3.

6. Remainder 38 - 62 = 26

5
1

2
1

1
1

Figure 2.31 - Complete Example of Dhwajanka


7 / 3 = 2 R1
15 21 = 13

13 / 3 = 4 R 1

12 41 22 = 4

4/3

=1R1

Remainder = 139 10 (11 + 42) 21 = 139 92 = 47


Illustration

5
1

9
3

3
3

Figure 2.32 - Complete Example of Dhwajanka

28

In the example above as first digit of dividend 1 is smaller than 4, first digit of quotient is 0.
Also during calculation of third digit of quotient 38 38 37 yields 38 24 21 = -7
which is not acceptable. Hence correct way to solve this is during previous division quotient
should be taken as 2 which results in remainder of 7 and forms next divisor as 78 instead of
38 and hence can proceed with normal procedure.

5
1

9
3

8
7

9
8

Figure 2.33 - Complete Example of Dhwajanka


Remainder = 920 10 (88 + 72) 78 = 920 -780 -56 = 84
Also while calculation of last digit of quotient 78 28 -73 = 41. 41 / 4 = 10 R1 but with 1,
remainder of division would be negative. To keep the legal remainder, quotient is taken as 8
with which correct quotient and remainder are obtained.

29

Chapter 3
Multiplication and Squaring

After dealing with algorithms available in Vedic mathematics for decimal numbers, this
chapter will consider multiplication of binary number system. Vedic Mathematics, as
described previously, has three methods Nikhilam, Anurupyena and Urdhva-tiryagbhyam.
Considering the binary number system, Nikhilam is not universal method for binary numbers
similar to decimal numbers as one multiplier has to be near power of 2. Anurupyena, which
gives solution of this problem, is again not a good choice for binary numbers. Anurupyena
requires multiplication or division of divisor by a suitable proportionality constant to make it
closer to base which is power of 2 in binary number system. Hence proportionality constant
has to other than power of 2, and division of this number with one multiplier makes this
process unrewarding over conventional methods. Hence, Urdhva-tiryagbhyam, which is
universal method for multiplication is chosen for implementation.

3.1 Binary Multiplication - Urdhva-tiryagbhyam


3.1.1 Algorithm
In binary system only 0 and 1 are used hence multiplication in Urdhva-tiryagbhyam or
vertically-crosswise formula is replaced by AND logic. Each AND will be a bit wide and
these bits are added together to generate cross-product. Rules for vertically-crosswise
multiplication remains same as starting from MSBs Most Significant Bit, of both
multiplicands considered for first cross product. Then increasing one bit in each further

30

calculation with cross product taken for bits of multiplicands till all bits are used. Further
dropping bits from MSB process of cross-product is continued till only LSB is used for
cross-product. In binary number system the maximum width of cross-product depends on
width of multiplicands. For example, in 8 bit multiplication maximum cross-product width
will be log28 + 1 = 4. In 16 bit it will be 5 and in 23 bits it will be 5 again.
1
1
Cross products
1
1 0
1
1 1
1
0 1

1
1

1
1

0
1

1
0

1
0
0

1
0
1

1
0
0

0
1

1
0

1
0

1
0

1
0
0

1
1
1

1
0

1
0
0

1
1
1

1
1
0

1
0

1
0

1
0

1
0

1
1

0
1
0

1
0
1

1
0
0

0
1

1
0

1
0

1
0
0

1
0
1

1
0

1
0

1
0

1
0
0

1
1
1

1
0
0

1
1
1

1
1
0

1
1
1

1
1
0

0
1
0

1
1
0

1
1
0

0
1
0

0
1
0

0
1

0
1

0
1

0
1
0

0
1

1
0
1
1
1

1
1
0

1
1

1
1

1
1

0
1

1
0
0

1
0
1

1
0
0

1
1
1

1
1

0
1

1
0

1
0

1
0
0

1
1
0

1
0

1
0

1
0
0

1
1
1

1
1
0

1
0
0

1
1
1

1
1
1

1
1
1

Combining Cross Products

1
0

1
0
0

1
1
0

0
1
0

0
1
0
0
0

Figure 3.1 - Urdhva-tiryagbhyam Complete Example

31

3.1.2 Comparison of Vedic and Conventional Multiplier


In this section comparison between Vedic multiplier by Urdhva-tiryagbhyam and
conventional multiplier is made. Conventional multiplier of width N x N will generate N
number of partial products with each product containing N bits with 0 to 7 zeros added at the
end. Vedic method generates (2N - 1) cross products of different widths which when
combined forms (log2N + 1) partial products for N bit multiplier. In case of number of partial
products there is significant decrease in number for Vedic Mathematics. But partial products
generated in case of conventional multipliers are just by AND one multiplier by digits of
another multiplier, whereas in case of Vedic, partial products are obtained after cross
products are generated which requires some logic. Hence in Vedic mathematics delay for
partial products is equal to adder delay. Critical path would consist of adders adding
maximum number of bits in cross product. In all cases it will be the cross product in which
all bits of multipliers are considered. Different techniques are used to combine these partial
products efficiently to reduce the total time required for multiplication. One such technique
Wallace tree addition is discussed in next section.

1
0

0
1
0

1
0
0
1

1
1
0
0
0

1
1
0
0
0
0

1
1
0
0
0
0
0

1
1
0
0
0
0
1
1

1
1
1
1
0
0
0
0
0
1
0

0
1
1
0
0
0
0
1
0

1
0
0
0
0
0
1
1

1
0
0
0
0
1
1

1
0
0
0
1
1

1
0
0
1
1

1
1
1
1

1
1
1

Figure 3.2 - Conventional Cross Product Addition

32

3.2 Combining Partial Products


Combining partial products is the most critical part in any multiplier which decides the
performance of it. Different types of adders like Carry Save adders (CSA) or Carry Lookahead Adders (CLA) are used frequently. To further improve the performance more
parallelism is achieved by combining three or more partial products at a time until two are
left and then to add these two partial products to get the final answer. This technique is called
as Wallace tree adder.

3.2.1 Wallace tree


Wallace tree in simplest sense is a full adder which combines 3 bits to produce a carry and a
sum which can be seen as a 3 bit to 2 bit reduction. The 3 bits added are at the same power of
2 in any binary number whereas the two bit output produced has one bit at same power of 2
as input but one bit is at 1 power above. In combining large partial products this technique is
used in which 3 bits at same power of 2 of different partial products can be combined in
parallel. With these techniques 3 partial products can be combined to form 2. If there are
more than 3 partial products then multiple stages Wallace adder has to be used.

33

Figure 3.3 - Full Adder

Consider a 4x4 multiplier, which will have 4 four bit wide partial products. In the diagram
below we can see that 3 partial products are combined to form 2 and later again combined
with 4th to make 2 partial products. It can also be observed that in all cases a full adder
cannot be used hence a half adder has to be used to combine partial products. Full adder
which is a 3:2 -reduction, half adders and 4:2 compressors are common in different
configurations of Wallace tree.

x
x
x

x
x
x
x

x
x
x
x
x

x
x
x
x
x
x
x
x
x

x
x
x
x
x

x
x
x
x

x
x
x

x
x

Figure 3.4 - Wallace tree reduction

34

In Vedic mathematics sutra Urdhva-tiryagbhyam for N N multiplier, 2N -1 cross-product


are generated. As seen earlier, cross-products process is similar to first AND logic and then
addition of these bits to form cross-product. Starting from first number of bits is cross
product increases till N and then again decreases to 1. Hence these products have widths
from l to (log2 N + 1). Partial products are formed by combining bits at same power of 2 of
all cross-products. This forms (log2 N + 1) partial products. There are two ways by which
these partial products can be combined.

3.2.2 Vedic Wallace


If Wallace tree structure with full and half adder is used then the class of multiplier is named
as Vedic Wallace multiplier. This type of multiplier essentially defers from conventional
multiplier in the way the different bits are combined to form the final answer. 8, 16, and 23
bit multiplier are designed in Verilog with Vedic Wallace structure with each of them
customized to that particular width of multiplication to achieve high performance. These
multipliers are designed as combinational blocks similar to equivalent DesignWare blocks.
Each of these designed are synthesized with Synopsys in two ways 1. To achieve the highest
possible clock frequency with which they work 2. Relaxed clock frequency to check the area
generated. Power analysis is done in both cases. Results are as follows.

3.2.3 Vedic Vedic


Another way to combine the cross-products is to continue the methodology described in
Urdhva-tiryagbhyam. In this all the bits which are at same power of 2 are combined until

35

each addition of bits result into two bit numbers which results in two partial products. This
class of multipliers is named as Vedic-Vedic multipliers. Similar to previous class of
multipliers 8, 16, and 23 bit multiplier are designed in Verilog and synthesized with
Synopsys. Each of these designed are synthesized with Synopsys in two ways 1. To achieve
the highest possible clock frequency with which they work 2. Relaxed clock frequency to
check the area generated. Power analysis is done in both cases. Results are discussed in next
sections.

3.3 Comparison with DesignWare


3.3.1 DesignWare Implementation
DesignWare uses AND logic for generating partial products, sometimes different algorithms
of Booth encoding is used. Carry-save addition or Cary-Propagate addition is used depending
on the constraints. If Radix-4 Booth encoding is used it is used on one of the multipliers to
reduce partial products. Area of medium to large sized multipliers is reduced due to small
adder tree also delay is marginally affected but can only improve slightly [27]. Radix-8
encoding further helps to reduce area in case of large multipliers but delay slightly increases
due to complexity. Depending on constraints 4 to 2 Compressor Cells, Carry Select Adder
cells etc. are used.

3.3.2 Timing
Timing analysis was done by Synopsys tools. Design was compiled by reducing the clock
period by 0.4ns, 0.2ns or 0.1 ns successively to achieve fastest possible clock speed.

36

Following graph shows the minimum clock period achieved for 8, 16 and 23 bits of
multiplication for Vedic Mathematics and DesignWare. Vedic mathematics designs had 2
different structures as discussed previously, namely Vedic-Wallace and Vedic-Vedic.

80
70
60

Delay ns

50
VedicVedic

40

VedicWallace
30

DesignWare

20
10
0
8bit

16bit

23bit

Multiplication Width

Figure 3.5 - Comparison of multiplication for delay

It can be observed that both the Vedic methods have less delay than corresponding
DesignWare block. Except for 16bit multiplication Vedic-Vedic structure has lower cycle
time than Vedic-Wallace. The percentage improvement can be seen in following graph. The
analysis for improvement over DesignWare is presented in section 3.4.1.

37

12

PERCENTAGE

10

8
VedicVedic

VedicWallace
4
2
0
8bit

16bit

23bit

Figure 3.6 - Improvement over DesignWare

3.3.3 Area Comparison


Following graph compares the area of DesignWare, Vedic-Wallace and Vedic-Vedic
multiplier for 8, 16, and 23 bits at maximum possible clock frequency. Scatter plots of area
for 8 bit, 16 bit and 23 bit multipliers is shown in Figure - 3.8, Figure - 3.9 and Figure - 3.10
respectively. 8 bit multiplier Vedic-Vedic structure results in maximum area for minimum
delay and DesignWare results in least. But as the designs are relaxed all the area approaches
same value. In contrary 16 bit and 23 bit area of DesignWare is significantly lower than
Vedic-Vedic or Vedic-Wallace structures.

38

8000
7000
Area square um

6000
5000
4000

VedicVedic

3000

VedicWallace

2000

DesignWare

1000
0
8bit

16bit

23bit

Multiplication Width

Figure 3.7 - Comparison of Multiplier for Area (Minimum Delay)

Area square um

1000
800
600

400
200
0
0

10

12

Delay ns
VedicWallace

VedicVedic

DesignWare

Figure 3.8 - Area for 8 bit multiplier relaxed designs

39

Area square um

4000
3500
3000
2500
2000
1500
1000
500
0
0

10

12

14

16

Delay ns
VedicWallace

DesignWare

VedicVedic

Area square um

Figure 3.9 - Area for 16 bit multiplier relaxed designs

8000
7000
6000
5000
4000
3000
2000
1000
0
0

10

15

20

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.10 - Area for 23 bit multiplier relaxed designs

40

3.3.4 Power Comparison


Following graph depicts the total power dissipation for different configurations, except 16 bit
multiplication where power dissipation is almost same for all, Vedic-Vedic shows more
power dissipation than Vedic-Wallace and DesignWare.
2000
1800
1600

Power uW

1400
1200
VedicVedic

1000
800

VedicWallace

600

DesignWare

400
200
0
8 bits

16 bits

23 bits

Bit Width

Figure 3.11 - Comparison of Total Power for multipliers

Following figure shows scatter plots for total power dissipation for relaxed designs for 8 , 16
and 23 bits. For all three cases of bit width, at minimum delay Vedic algorithms shows more
dissipation but relaxed designed approach to one value.

41

250

Area uW

200
150
100

50
0
0

10

12

Delay ns
VedicVedic

VedicWallace

DesignWare

Figure 3.12 - Power dissipation for 8 bit multiplier relaxed designs

1200

Power uW

1000
800
600
400
200
0
0

10

15

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.13 - Power dissipation for 16 bit multiplier relaxed designs

42

2000

Power uW

1500

1000
500
0
0

10

15

20

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.14 - Power dissipation for 23 bit multiplier relaxed designs

3.4 Analysis
Wallace tree addition makes use of full adder extensively for reducing partial products.
Figure 3.3 shows a gate level diagram of a full adder. It can be observed that to generation of
sum has to pass through two XOR gates and is inherently slower than generation of carry.

3.4.1 Critical Path Analysis of a 4 bit multiplier


In this section comparison between critical path in 4 bit conventional and Vedic multiplier is
done. In a 4 bit multiplier 4 partial products will be generated, in the diagram below named
as P0 to P3.

43

P0
P1
P2
P3

x
x
x

x
x
x

x
x
x
x

x
x
x
x
x

x
x
x

x
x
x

x
x
x

x
x
x
x
x
x
x
x
x
x
x
x

x
x
x
x
x

x
x
x
x

x
x
x

x
x

Figure 3.15 - 4x4 Multiplication using Wallace tree Addition

In above multiplier a 3:2 reduction is used. After first level of Wallace tree 4 partial products
are reduced to 3 partial products. As there are 4 bits to combine at power 23, in first level
only 3 can be combined leaving fourth for next level. It is shown in blue background. This
extra bit is combined in next level of reduction. After this level only 2 partial products are
left and hence added together to get final answer. The block level diagram of the process is
shown below with critical path marked in red. Delay in critical path in terms of half and full
adder delays are as follows.
Delay =
=

FAS + FAS + HAC + FAC + FAC + FAS


3 FAS + 2 FAC + HAC

Where FAS = Full Adder Carry, FAC = Full Adder Carry, HAC = Half Adder Carry,
HAS = Half Adder Sum, FA = Full Adder and HA = Half Adder.

44

Figure 3.16 - Block level structure of a 4x4 multiplier by Wallace tree reduction

In case of Vedic mathematics as bits at same power of two are added in one level. Hence 4
bits which are at power 23 are added together to get a 3 bit sum. The MSB of this sum is at
power 25. If we compare the combination of partial product in Vedic and conventional the
extra bit is at power 5 in Vedic compared to at power 3 for conventional. This carry
forwarding is achieved with extra delay of a Half Adder Sum (HAS). Multiplication with
Vedic structure is shown below. Figure 3.16 shows the critical path in red.

45

P0
P1
P2
P3

x
x
x
x
x
x

x
x
x

x
x
x
x
x
x
x
x

x
x
x
x
x

x
x
x
x

x
x
x

x
x
x
x
x

x
x
x
x
x
x
x
x

x
x

x
x
x

x
x
x

Figure 3.17 - Multiplication by Vedic Mathematics

Critical Delay

HAS + HAC + HAS + HAS + HAS + FAC + FAC + FAS

2 FAC + FAS + 3HAS + HAC

After comparing this with critical delay of conventional multiplier and cancelling equal terms
we get 2 FAS Full Adder Sums for conventional against 3 HAS - Half Adder Sums for
Vedic. In terms of XOR gate this delay corresponds to 22 = 4 XOR gate delay for
conventional against 31 = 3 XOR gate delay for Vedic multiplier. This analysis shows that
4 bit Vedic multiplier has less carry propagation delay than Wallace tree multiplier. Also for

46

4 bit design there is no difference between Vedic-Vedic and Vedic-Wallace structures.


Depending upon the number of bits in multiplication Vedic mathematics structure and
Wallace tree structure critical path varies and hence there is variable improvement in VedicVedic and Vedic-Wallace structure over DesignWare.

Figure 3.18 - Block level structure of a 4x4 multiplier by Vedic reduction

47

3.5 Binary Squaring Dwandwayoga


Vedic Mathematics has a special formula which can be applied to all cases. It is a special
case of formula based on Urdhva-tiryagbhyam as squaring is special case of multiplication.
As seen earlier in case of Vedic multiplication calculation of cross-product containing all
digits of both multiplier results in critical path. With the formula for Squaring the entire
process of cross-product is made simpler and hence squaring can be achieved more
efficiently.

3.5.1 Algorithm
As described in Chapter 2, Dwandwayoga or Duplex formula describes how duplexes should
be calculated from the number to be squared. In case of binary numbers similar logic is
extended. In multiplication to get the cross-product which includes all digits of N x N
multiplication, number of digits required to be added was N. In case of Dwandwayoga this is
N/2.

3.5.2 Example of Squaring


Consider an example of 8 bit multiplication and 8 bit squaring

X7

X6

X5

X4

X3

X2

X1

X0

Y7

Y6

Y5

Y4

Y3

Y2

Y1

Y0

Cross-product = X7Y0 + X6Y1 + X5Y2 + X4Y3 + X3Y4 + X2Y5 + X1Y6 + X0Y7

48

Figure 3.19 - Cross Product for Multiplication

X7

X6

X5

X4

X3

X2

X1

X0

D8 = {X7X0 + X6X1 + X5X2 + X4X3, 0}

Figure 3.20 - Cross Product for Squaring

From the two figures it is evident that square has huge advantage over multiplication as the
critical cross-product now contains 4 instead of 8 bit addition. This will significantly improve
the maximum clock frequency with which it can work.

3.6 Comparison with DesignWare Multiplier


3.6.1 Timing
As compared to DesignWare multiplier both Vedic structures for square show significant
improvement.

49

80
70

Delay (0.1 ns)

60
50
VedicVedic

40

VedicWallace

30

DesignWare

20
10
0
8bit

16bit

23bit

Bit Width

Figure 3.21 - Comparison of Square for delay

3.6.2 Area Comparison


5000

Area square um

4500

4000
3500
3000
2500

VedicVedic

2000

VedicWallace

1500

DesignWare

1000
500
0
8 bits

16 bits

23 bits

Bit Width

Figure 3.22 - Comparison of Area for Square (Minimum Delay)

50

Area square um

900
800
700
600
500
400
300
200
100
0

Delay ns
VedicVedic

DesignWare

VedicWallace

Figure 3.23 - Area comparison for relaxed 8 bit designs of square

3500

Area square um

3000
2500
2000
1500
1000
500
0
0

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.24 - Area comparison for relaxed 16 bit designs of square

51

Area square um

5000
4000
3000
2000

1000
0
0

10

12

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.25 - Area comparison for relaxed 23 bit designs of square

3.6.3 Power Comparison


As expected power dissipation is more for DesignWare multiplier and for relaxed designs as
well power dissipation continues to be more.

52

1600
1400
1200
1000
VedicVedic

800

VedicWallace

600

DesignWare

400
200
0
8 bits

16 bits

23 bits

Figure 3.26 - Comparison of Power for Square

200

Power uW

150
100
50
0
0

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.27 - Total Power comparison for relaxed 8 bit designs of square

53

1200

Power uW

1000
800

600
400
200
0
0

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.28 - Total Power comparison for relaxed 16 bit designs of square

1600

1400
Power uW

1200
1000
800
600
400
200
0
0

10

12

Delay ns
VedicWallace

DesignWare

VedicVedic

Figure 3.29 - Total Power comparison for relaxed 23 bit designs of square

54

Chapter4
Division
In this chapter algorithms explained in chapter 2 for division will be extended for binary
arithmetic. The algorithms will be compared to conventional algorithm which is considered
as restoring algorithm and/or Non-restoring algorithm of division. In restoring algorithm
shifted divisor is repeatedly subtracted from dividend and result of subtraction is stored
temporarily. The algorithm can be formulated as [2].
N = QD + R
Where N dividend, D is divisor, Q is quotient and R is remainder.
Restoring Algorithm
1. R(m) = N

m as width of N

2. Repeat for i from m-1 to 0


Z = R(i+1) - D2i
If Z 0

then Q(i) = 1, R(i) = Z

Else Q(i) = 0, R(i) = R(i+1)


DesignWare implements restoring algorithm for its division block. For restoring algorithm
worse case N subtractions has to be performed to get N digits of quotient. Each subtraction is
equal to width of divisor.

4.1 Binary Nikhilam


Nikhilam formula is a special case formula for decimal numbers but applicability to general
binary numbers is checked here.

55

Base
1
Deficit

0
0

0
1

0
1

0
1

1
0

0
1

0
1

1)
1

1
0

0
1
0
0

1
1
1
1
0

1
0

1
1
1
1
1
0
0 1000

1
1
1
1
0

1
1
1

1
0

0
1
1
11

0
1
1
1

1
0

1
0
10

1
1
1

0
1
0

1
1
0

0
0
1

1
1
0

0
1
1

0
1
1

0
1
0
1

Figure 4.1 - Complete Example of Nikhilam for Division

It can be seen that Nikhilam proves too lengthy as in some cases the process requires more
steps than conventional division. Hence it is not pursued for implementation.

56

4.2 Binary Dhwajanka


In this section Dhwajanka sutra will be discussed from binary numbers perspective. Detailed
algorithm is explained in Chapter 2. Here changes for binary number system will be
discussed.
4.2.1 Algorithm
1

1=

1
R

1
0

Quotient
Remainder

0
0

1
0

0
0

0
1

0
1

0
0

0
1

0
1

Figure 4.2 - Complete Example of Dhwajanka

In binary number system, similar to decimal system, MSB of divisor is kept aside and
remaining digits are used for cross-products. As digits in binary can only be 0 or 1, the
process of Dhwajanka becomes simpler as division has to be carried out with 1 always.
Hence MSB of dividend becomes the MSB of quotient. Cross-product is taken between
quotient and rest bits. Again, in cross-product digits being only 0 and 1 multiplication is
replaced by AND logic. After the addition of cross-product of bits the sum is subtracted from
combination of previous remainder and next digit of dividend. In the example above first bit
of quotient is equal to MSB of dividend and hence the remainder is 0. This 0 is combined
with next digit of dividend 1, to form 01. Cross-product of quotient and rest bits of divisor

57

gives 1 as only one bit in quotient at this point of the process. Cross-product is subtracted
from partial dividend 01 to get 0. Now when 0 is divided by 1 we get quotient 0 and
remainder 0. Quotient 0 of this partial division forms the next bit of quotient and remainder
as next prefix. In short, Dhwajanka formula for binary is further simplified by the nature of
the binary numbers.
Despite being very easy to solve by Dhwajanka, there are some limitations of the process
which will be described in next section.

4.2.2 Limitations and Solutions


A combinational model of this process was designed in Verilog. The reason to choose
combinational method was to compare it with equivalent DesignWare block and a sequential
model will require varying number of clock cycles to finish the division depending on the
input dividend and divisor. The nature of problem in building the combinational model and
respective solutions on them are described in next sections.

4.2.2.1 Negative Subtraction


1

1=

0
R

1
0

1
0

1
1

1
0

0
0

cp = 1
Partial Dividend = 00

Figure 4.3 - Dhwajanka Problem of recalculation

58

During the calculation of third bit of quotient partial dividend is 0 and cross-product is 0
which results in negative 1 as partial dividend which is unacceptable according to algorithm.
Solution for this is given as recalculate previous iteration with smaller quotient digit to result
in sufficiently large partial remainder. In this case previous quotient bit being 0, it cannot be
further reduced to make remainder bigger. Hence former to this iteration has to be
recalculated shown below.
1

1=

0
R

0
1

0
1

1
1

1
0

1
1

1
0

1
1

Remainder = 1111 - 1000 - 100 -1

10

Figure 4.4 - Dhwajanka Solution of recalculation

In case of combinational design reiteration would result in feedback loop which is


unacceptable and in sequential design this would lead to a design which is data dependant
and hence undesirable. Solution on this is to allow bits of quotient as well as partial
remainders to be negative. This obviously is an overhead of calculation as the state of each
bit of quotient and partial remainders has to be maintained, but this enables us to build a
combinational design. The complete illustration is as follows.

59

1=

0
R

0
0

0
0

1
0

-1

1
0

1
1

1
0

0
0

Figure 4.5 - Dhwajanka Problem of Negative Quotient

During the calculations of third bit of quotient partial dividend 00 is subtracted by crossproduct 01 to get quotient as -1 and next partial remainder as 0. If the subtraction is more
than 1 then both the quotient bit and partial remainder would be negative.

4.2.2.2 Correct Remainder


There is another problem in the illustration above. While calculating the remainder we
subtract cross-products from right part of dividend prefixed with last partial remainder.
Cross-product consists of rest digits of divisor and quotient with first cross-product contains
all bits and is also shifted left by one less than bits in rest digits of divisor. If any crossproduct is negative then it is added. If last partial remainder is negative then right part of
dividend becomes inherently negative. After all the calculations for remainder if it is more
than divisor or less than zero it is illegal. Also, it is imperative to have legal remainder to get
correct quotient. In the illustration above calculations for remainder are as follows.

60

0
0

0
0

1
0

-1

0
0

Remainder = 0111 - (-100) - (10) =


0111 + 100 + 10 = 1101
Correct Remainder = 1101 - 1011 = 0010
Quotient = 1000 - 10 = 0110
Correct Quotient = 0110 + 0001 = 0111

Figure 4.6 - Dhwajanka Solution for Negative Quotient

Correct remainder is obtained by subtracting divisor from remainder. If the subtraction gives
remainder more than divisor, process is repeated. Above correct remainder is obtained by
subtracting divisor once, so correct quotient is obtained by adding 1.

4.2.2.3 Partial remainder overflow


As the width of dividend and divisor increases, in some cases it is observed that last partial
remainder is itself a large number which when combined with right part of dividend becomes
a number which may sometimes exceed the width of dividend or divisor itself. This results in
large correction logic and hence is undesirable. There can be different approaches to deal
with this like checking the correctness of remainder after every 3-4 bit calculation of
quotient, use of sequential design model. To check correctness of remainder after every 3-4
bits can work for combinational design but has huge overhead of calculation partial quotient
repeatedly and again results is considerably large logic. As seen previously sequential model
results in a design which would depend on data to calculate the answer.

61

A C code was written to test different approaches described above. It is also observed that
this overflow of last partial remainder is also coupled with wrong MSB chosen and large
number of negative bits followed to correct it. Hence simplest way to solve this problem is to
always get the MSB correct. This can be easily done by comparing dividend and divisor to
decide MSB. With some C simulation it was observed that choosing correct MSB
considerably reduces the magnitude of last partial remainder and in turn smaller logic for
correction.

4.3 Comparison with DesignWare

cycle TIme in ns

4.3.1 Timing
20.5
20
19.5
19
18.5
18
17.5
17
16.5
16
15.5

Vedic
DesignWare

16 / 8 bit
Divider width

Figure 4.7 - Comparison of Division for Delay

62

4.3.2 Area Comparison


Vedic divider has lower area for fastest designs. But as designs are relaxed DesignWare area
reduces faster than Vedic divider and reasonably relaxed designs DesignWare area becomes

mm square

lower than Vedic Divider.


1800
1600
1400
1200
1000
800
600
400
200
0

Vedic
DesignWare

8 bits
Width

Area square um

Figure 4.8 - Comparison of Division for Area

1800
1600
1400
1200
1000
800
600
400
200
0
0

10

15

20

25

30

Delay ns

Vedic

DesignWare

Figure 4.9 - Area comparison of relaxed division

63

4.3.3 Power Comparison


Similar to area, power dissipation for Vedic is lower than DesignWare but as the designs are
relaxed DesignWare power becomes less than Vedic Designs.
600
500

uW

400
300

vedic

200

DesignWare

100
0
8 bits
Width

Figure 4.10 - Comparison of Division for Power

600

Power uW

500
400
300
200
100
0
0

10

15

20

25

30

Delay ns
Vedic

DesignWare

Figure 4.11 - Comparison of Power for relaxed designs

64

Chapter 5
Trigonometric Functions
This chapter will be dedicated to the discussion of different methods available for calculation
of trigonometric functions in hardware. There are four different methods discussed in this
chapter out of which one was selected for implementation. Selection criteria mainly focus on
time for evaluation, memory requirements and complexity of hardware. Methods discussed
here are Taylor Series, Euler Method, CORDIC Algorithm and Polynomial Approximation.
As sine and cosine functions are periodic in almost all methods the functions are calculated
for the quarter wave period which is [0, ]. Also input angle in considered in radians.

5.1 Taylor Series


Taylor series represents a function as infinite sum of terms evaluated at a point. For sine and
cosine the Taylor series expansion is as follows.

This is special form of Taylor series and is called as Maclaurin series. Accuracy of the result
depends on the number of terms used for calculation. In the range [0, ] except the term x2 all
other terms are less than 1 and rapidly diminish. As the x is smaller quicker it gets
diminished and vice versa. Hence angle

would require maximum number of terms to

65

calculate. Many times a range reduction method is used to reduce the number of terms.
Trigonometric identities such as

With this the range [0, ] is reduced to [0, ] but with extra multiplication as well as
evaluation of both sine and cosine.

Figure 5.1 - Terms Required by Taylor Series

Figure above compared the terms required for Taylor series for the calculation of Sine and
Cosine of angle . As any other term being smaller than that would diminish faster than
this graph represents the maximum terms required to achieve required accuracy. Graph also

66

shows error bounds for different widths of output. The green, cyan and magenta are error
bounds for 8, 16 and 23 bits respectively. From the graph we can conclude that for 8 bit
accuracy 4 terms are needed whereas for 16 and 23 bits 6 and 7 terms are required
respectively. Also as the terms for sine and cosine contain alternate powers of x odd for
sine and even for cosine the actual power of input angle required for different resolution is
higher. For 8 bits sine and cosine require power of input as 7 and 6, for 16 bits 11 and 10 and
for 23 bits 13 and 12. As the degree goes higher it becomes increasingly difficult to calculate
the power. And hence hardware required to calculate is uneconomical.

5.2 CORDIC Algorithm


The CORDIC (coordinate rotation digital computer) method is a successive approximation
algorithm that is useful for calculating the trigonometric functions Sine and Cosine.
Conceptually the algorithm can be explained as rotation of a unit vector by the angle of
which sine and cosine values are to be calculated. This rotation is achieved in steps. In the
first step the vector will be rotated by /4 counterclockwise. Depending upon the desired
angle the vector is rotated by successive smaller angles clockwise or counterclockwise. After
the rotation the y co-ordinate of vector gives Sine value whereas x co-ordinate gives Cosine
of angle. Mathematically algorithm is as follows
Consider a unit vector v represented as v =
matrix R =

. When this is multiplied by the rotation

we get co-ordinate of vector as sine and cosine values. Sine and

67

Cosine can be represented in terms of tangent function as

.
After substitution the rotation matrix becomes
If the values of

are constrained to be power of 2, then multiplication by the rotation

matrix R can be converted to shifting and multiplication by a scale factor. Constraining by


power of 2, results in values of

given by

I from 0 to number of iterations. Scale

factor K can be precomputed and it depends on the number of iterations. Its value is given
as

. Despite its simplicity, it encounters the disadvantage of large number of

iterations, which impedes the speed performance in practical implementations [6]. In each
iteration one bit of accuracy is obtained and hence for 8, 16 or 23 bit resolution those many
numbers of iterations are required.
Table lookup is also one of the methods which are used for calculation of functions. This
method suggests storing all possible values of the function for every input argument. The
entries needs to be stored are exponentially proportional to the power of two. Also each entry
needs to be output resolution wide. Though this method could be attractive for very small
resolutions it is impractical as the resolution required increases.

5.3 Polynomial Approximation and Interpolation


Polynomial approximation is one of the fastest methods available for calculation of any
function with minimal memory requirement. In the area of mathematics it is been researched

68

from long time. For n given points there exists a unique polynomial of degree n-1 or less
which passes through these points. Higher degree polynomials are required to achieve higher
accuracy. But to save the calculation of higher power a method called as piecewise
approximation or piecewise interpolation is implemented. In this method entire function to be
approximated is divided into small regions for which the polynomials are found. These
polynomials have small degree and hence approximation of function can be calculated
quickly. Hence this method is most suited to calculate sine and cosine functions. Number of
sections required depends upon the accuracy needed. There are different first and second
order methods which can be implemented to calculate the coefficients. More regarding this
technique will be discussed in next chapter.
DesignWare provides different block for trigonometric calculation. To achieve high
performance they are based on fast carry look-ahead architecture [25]. DesignWare blocks
take input as multiplier of and find sine and cosine of angle formed by multiplication of
input and . Based upon the width of function required different polynomials approximations
are used. If width required is less than or equal to 8, sine or cosine values are directly
decoded from input else linear, quadratic or cubic polynomial interpolation of quarter wave
of sine / cosine is implemented.

69

Chapter 6
Polynomial Approximation and Interpolation
Interpolating means that the function passes through all the given points and does its best
between them. Approximating means only that the function is close to all the given points.
There are two common methods used for Interpolation.

6.1 Newton Interpolation


Newton formula being an interpolation formula gives polynomial passing through given n
points. The general form of Newton Polynomial is given as

to

from the

coefficients of n-1 degree polynomial. These coefficients are obtained

by simple calculations from the co-ordinates of points. Sometimes Newton polynomials are
also called as Forward Difference Polynomials because of the way of calculation of these
coefficients.

6.1.1 first-order Newton Polynomials


First order polynomial is a straight line passing through two points. If the two points are
A(

) and B (

). Consider a point C(x, y) between the two points A and B. Now the

slope of line AC is same as slope of line CB. Slope of line is given as difference in y coordinates of points

divided by difference of x co-ordinates. If two slopes are equated

following equation is obtained.


Slope of AC = Slope CB

70

=
After rearranging

Hence the coefficients are

and

Second Order Polynomial

B(x2,y2)

f(x2)
f(x)
C(x,y)

A(x1,y1)

f(x1)

x2

x1

Figure 6.1 First Order Newton Polynomial

6.1.2 Second order Newton Polynomial takes the form

With three given points as A(

) , B(

) and C(

). Above equation being a

second-order would be a parabola passing through points. The coefficients

can be

71

obtained by substituting x from the equation by

and f(x) as .

by substituting second point ( ,

) as x=

and f( ) =

and

as

After substituting third point ( ,

) as x=

and f( ) =

with

and

It can be observed that for first and second order Newton polynomial

can be obtained

.
,

is obtained as

are found to

be identical. This is one of the advantages of Newton Polynomials that as the points are
added only the higher coefficients needs to be calculated.

6.2 Lagrange Interpolating Polynomials


Lagrange is particular form of polynomials and need no prior calculations for coefficients to
represent it in its form.

6.2.1 Lagrange First order


Lagrange polynomial can be thought of as the weighted average of the two values that are
connected by straight line [28].

L1 and L2 are weighting coefficients. L1 is 0 at


. Hence L1 =

and L2 =

and 1 at

; similarly L2 is 0 at

and 1 at

. After substituting these values in above equation we

get Lagrange first order polynomial as

72

Y
f(x2)

f(x1)

L2

L1

x1

x2

Figure 6.2 - First Order Lagrange Polynomial


6.2.2 Lagrange Second order
The same strategy can be extended to fit three points to form equation of parabola. In this
case similar to first-order equation, weighted addition of three parabolas will be used to get
the final equation as follows.

73

6.3 Approximation
Polynomial approximation as name suggests is the estimation of a polynomial which need
not pass through the given points for which polynomial has to be found. Suppose we want to
approximate a function f by a polynomial P on the interval [a, b]. There are two types of
approximations namely least square approximation and least maximum approximation. Least
square approximation minimizes the average error whereas least maximum approximation
minimizes the worst case error. The difference between two type results in the way distance
is defined. For least square approximation the distance is

Where w(x) is the weight function. For least maximum approximation the distance is

In next few sections two methods for least square polynomial approximation Legendre and
Chebyshev will be discussed. Also one method minimax which is least maximum
approximation is discussed. MATLAB provides a function polyfit which takes degree as
input argument and calculates a least square polynomial of degree n.
The procedure to compute the polynomial is as follows [5].
1. Build a sequence Tm (m
and

) of polynomials such that Tm is of degree m

. Such polynomials are called as orthogonal polynomials.

Orthogonal polynomials can be used to make the polynomial coefficients


uncorrelated, to minimize the error of approximation, and to minimize the sensitivity
of calculations to round off error [7].

74

2. Compute the coefficients

3. Compute polynomial
P=
Where

6.3.1 Legendre
Legendre polynomials are defined over interval [-1, 1] and have weight function w(x) = 1.
Sequence Tm of Legendre polynomial are defined as

Values of scalar product

75

6.3.2 Chebyshev Polynomials


Weight function
Defined in interval [-1, 1] and sequences are defined as

Values of scalar product are defined as

6.3.3 Minimax Polynomial


Minimax is a least maximum approximation. The minimax polynomial can be computed
analytically up to n = 1. For higher order a numerical method Remez has to be employed [8].
MAPLE 14 was used to calculate coefficients of Minimax polynomials

6.3.4 Polyfit function


p = polyfit(x,y,n)

finds the coefficients of a polynomial p(x) of degree n that fits the

data, p(x(i)) to y(i), in a least squares sense. The result p is a row vector of length n+1
containing the polynomial coefficients in descending powers [9]. The polyfit M-file forms
the Vandermonde matrix, , whose elements are powers of x [9].

76

6.4 Comparison of methods for sine


Two methods of interpolation Newton and Lagrange and 2 methods of approximation
Legendre and Chebyshev were implemented in MATLAB. MATLAB polyfit function and
MAPLE minimax functions are used as two more methods. All six methods were used
successively to calculate coefficients for increasingly smaller section of Sine functions. With
minimum of 2 sections coefficients were calculated till desired accuracy was reached. For a 8
bit result maximum error allowed was 1/256 and for 16 bit error should be less than 1/65536.
As the angle and coefficients themselves can have 8 or 16 bits for respective error bounds,
error was again calculated with truncated coefficients for all possible angle values. Numbers
of sections were increased till all possible values of angle have error less than specified. To
simplify the choosing of coefficient number of sections were only allowed to be power of 2.
Hence the sections required to achieve the error bound were increased to nearest power of
two. Following graph shows the calculation of number of sections for one method.

6.5 Comparison of methods for cosine


Two methods of interpolation Newton and Lagrange and 2 methods of approximation
Legendre and Chebyshev were implemented in MATLAB. MATLAB polyfit function and
MAPLE minimax functions were used as two more methods to calculaye coefficients. All six
methods were used successively to calculate coefficients for increasingly smaller section of
Cosine functions. With minimum of 2 sections coefficients were calculated till desired
accuracy was reached. For 8 bit result maximum error allowed was 1/256 and for 16 bit error
should be less than 1/65536. As the angle and coefficients themselves can have 8 or 16 bits

77

for respective error bounds, error was again calculated with truncated coefficients for all
possible angle values. Numbers of sections were increased till all possible values of angle
have error less than specified. To simplify the choosing of coefficient number of sections
were only allowed to be power of 2. Hence the sections required to achieve the error bound
were increased to nearest power of two. Following graph shows the calculation of number of
sections for one method. Following figure shows the comparison of Vedic and DesignWare
division for 16 by 8 bits. The division essentially producing 8 bits of quotients, provided
divisor is smaller than dividend. Vedic division performs better than DesignWare.

6.6 Comparison with DW


6.6.1 Timing Comparison
Despite the use of Vedic multiplier and square designs in Sine and Cosine, DesignWare
outperforms Vedic designs except for 8 bit Sine.
14
12
cycle time ns

10
8
Vedic

DesignWare

4
2
0
Sin 8 bit

Sin 16 bit

Cos 8 bit

Cos 16 bit

Axis Title

Figure 6.3 Comparisons of Sine and Cosine with DesignWare for Cycle Time

78

6.6.2 Area Comparison


As observed in the graph Vedic implementation of Sine and Cosine have significantly higher
area and Power. It reflects that DesignWare blocks implement these functions more
efficiently despite the use of Vedic multipliers.

12000

10000

9000
10000

8000
7000

8000

6000
6000
4000

Vedic

5000

Vedic

DesignWare

4000

DesignWare

3000
2000

2000

1000

0
8 bits

16 bits

8 bits

16 bits

Figure 6.4 - Comparison of Sine with DesignWare for Area. Figure 6.5 - Comparison of
Cosine with DesignWare for Area

79

Area square um

900
800
700
600
500
400
300
200
100
0
0

10

Delay ns
Vedic

DesignWare

Figure 6.6 - Area Comparison for Relaxed designs of 8 bit Sine


12000

Area square um

10000
8000
6000
4000
2000
0

10

15

20

25

30

Delay ns
Vedic

DesignWare

Figure 6.7 - Area Comparison for Relaxed designs of 16 bit Sine

80

1200
Area square um

1000
800

600
400
200
0
0

10

Axis Title
Vedic

DesignWare

Figure 6.8 - Area Comparison for Relaxed designs of 8 bit Cosine


Area square um

10000

8000
6000
4000
2000
0
0

10

15

20

25

30

Delay ns

Vedic

DesignWare

Figure 6.9 - Area Comparison for Relaxed designs of 16 bit Cosine

81

6.6.3 Power Comparison


Power dissipation results are similar to area, DesignWare block for both 8 bit and 16 bit
design show lesser power dissipation.
3500

3500

3000

3000

2500

2500

2000

2000
Vedic

1500

Vedic
1500

DesignWare

1000

1000

500

500

DesignWare

0
8 bits

16 bits

8 bits

16 bits

Figure 6.10 - Comparison of Sine with DesignWare for Area. Figure 6.11 - Comparison
of Cosine with DesignWare for Area

250

Power uW

200
150
100
50
0
0

10

Delay ns
Vedic

DesignWare

Figure 6.12 - Area Comparison for Relaxed designs of 8 bit Sine

82

3500

Power uW

3000
2500
2000
1500
1000
500
0
0

10

15

20

25

30

Delay ns
Vedic

DesignWare

Figure 6.13 - Area Comparison for Relaxed designs of 16 bit Sine


350

Power uW

300
250
200
150
100
50
0
0

10

Delay
Vedic

DesignWare

Figure 6.14 - Area Comparison for Relaxed designs of 8 bit Cosine

83

3500

Power uW

3000
2500
2000
1500
1000
500
0
0

10

15

20

25

30

Delay ns
Vedic

DesignWare

Figure 6.15 - Area Comparison for Relaxed designs of 16 bit Cosine

84

Chapter 7
Summary and Future Work
7.1 Summary
Multiplication, Squaring, Division, Sine and Cosine Vedic algorithms were designed in
Verilog and compared to DesignWare block with criteria as cycle time, area and power. It is
observed that Vedic multiplication performs better than DesignWare for cycle time, but has
significantly larger area. Square outperforms DesignWare multiplication in all categories as it
reduces the partial products itself. Though Sine for 8 bit performs better for cycle time and 8
bit Cosine matches the performance with DesignWare other two functional implementations
16 bit Sine and 16 bit Cosine are significantly slower and less efficient than DesignWare.
Division proves to be better in all three criteria cycle time, area and power. Hence it can be
concluded that basic mathematical functions can effectively be implemented with Vedic
Mathematics algorithms

7.2 Future Work


In the work presented, some aspects of Vedic mathematics were touched but there are more
formulas needs to be explored like square root. There is further scope to improve
implementation of Sine and Cosine to match or better the performance of DesignWare as
Vedic multipliers have potential to outperform DesignWare. Multiplication and Division
have innumerable applications which can be implemented using Vedic Mathematics.
Floating Point Vedic Processor could be a good extension of this wotk.

85

REFERENCES
[1] Jagadguru Swami Sri Bharati Krisna Tirthaji Maharaja,Vedic mathematics, Motilal
Banarsidass Publishers Pvt Ltd,Delhi, 2009
[2] Fast 32-bit Division on the DSP56800E Minimized non-restoring division algorithm.
David Baca. Beyond Bits Article 07.
[3] Fast Trigonometric Functions using Intels SSE2 Instructions, Lars Nylard and Mark
Snyder.
[4] Amos Gilat, Vish Subramaniam. Numerical Methods for Engineers and Scientists, John
Wiley & Sons Inc, 2011.
[5] Jean- Michel Muller, Elementary Functions Algorithms and Implementation,
Birkhauser, 1997.
[6] Mixed-Scaling-Rotation CORDIC (MSR-CORDIC) Algorithm and Architecture for
High-Performance Vector Rotational DSP applications Chih-Hsiu Lin and An-Yeu Wu.
[7] Polynomial Approximation Gordon K. Smyth in Encyclopedia of Biostatistics (ISBN
0471 975761) Edited by Peter Armitage and Theodore Colton John Wiley & Sons, Ltd,
Chichester, 1998.
[8] L. Veidinger, On the numerical determination of the best approximations in the
Chebychev sense, Numerische Mathematik, vol. 2, pp. 99105,1960.
[9] MATHWORKS. [Online]. Available:
http://www.mathworks.com/help/techdoc/ref/polyfit.html
[10] MATLAB version 7.8.0.347 R2009a, Massachusetts: The Math Works Inc., 2009.
[11] Laurence V Faucett, Applied Numerical Analysis Using Matlab Second Edition,
Prentice Hall,2008.
[12] Synopsys DesignWare Library Documents [Online]
http://www.synopsys.com/dw/buildingblock.php.
[13] Shamim Akhter, VHDL Implementation of Fast NxN Multiplier Based on Vedic
Mathematics, 2007 IEEE.

86

[14] M.E.Paramasivam, Dr.R.S.Sabeenian, An Efficient Bit Reduction Binary


Multiplication Algorithm using Vedic Methods, 2010 IEEE 2nd International Advance
Computing Conference.
[15] Honey Durga Tiwari, Ganzorig Gankhuyag, Chan Mo Kim, Yong Beom Cho,
Multiplier design based on ancient Indian Vedic Mathematics, 2008 International SoC
Design Conference.
[16] Parth Mehta, Dhanashri Gawali, Conventional versus Vedic mathematical method for
Hardware implementation of a multiplier, 2009 International Conference on Advances in
Computing, Control, and Telecommunication Technologies.
[17] Prabir Saha, Arindam Banerjee, Partha Bhattacharyya, Anup Dandapat, High Speed
ASIC Design of Complex Multiplier Using Vedic Mathematics, Proceeding of the 2011
IEEE Students' Technology Symposium 14-16 January, 2011, lIT Kharagpur.
[18] Ramalatha M, Thanushkodi K, Deena Dayalan K, Dharani P, A Novel Time and
Energy Efficient Cubing Circuit using Vedic Mathematics for Finite Field Arithmetic, 2009
International Conference on Advances in Recent Technologies in Communication and
Computing.
[19] Anvesh Kumar, Ashish Raman, Dr. R.K. Sarin, Dr. Arun Khosla, Small area
Reconfigurable FFT Design by Vedic Mathematics, 2010 IEEE.
[20] Himanshu Thapliyal, M.B Srinivas, An Efficient Method of Elliptic Curve Encryption
Using Ancient Indian Vedic Mathematics, 2005 IEEE.
[21] Vitit Kantabutra, On Hardware for Computing Exponential and Trigonometric
Functions, 1996 IEEE.
[22] Vassilis Paliouras, Konstantina Karagianni, Thanos Stouraitis, A Floating-Point
Processor for Fast and Accurate Sine/Cosine Evaluation, IEEE Transactions on Circuits and
Systems II : Analog and Digital Signal Processing, VOL. 47, NO. 5, MAY 2000.
[23] Chih-Hsiu Lin and An-Yeu Wu, Mixed-Scaling-Rotation CORDIC (MSR-CORDIC)
Algorithm and Architecture for High-Performance Vector Rotational DSP Applications,
IEEE Transactions on Circuits and Systems -I: REGULAR PAPERS, VOL. 52, NO. 11,
NOVEMBER 2005.
[24] Taek-Jun Kwon, Jeff Sondeen, Jeff Draper, Floating-Point Division and Square Root
using a Taylor-Series Expansion Algorithm, 2007 IEEE.

87

[25] Synopsys Inc. [Online]


https://www.synopsys.com/dw/doc.php/doc/dwf/datasheets/trig_overview.pdf
[26] Synopsys Inc. [Online]
https://www.synopsys.com/dw/doc.php/doc/dwf/manuals/dwbb_quickref.pdf
[27] Synopsys Inc. [Online]
https://www.synopsys.com/dw/doc.php/doc/dwf/manuals/dwbb_appnotes.pdf
[28] Chapra, Steven C. Applied numerical methods with MATLAB for engineers and
scientists, McGraw-Hill Higher Education, 2008.

88

APPENDIX

89

APPENDIX A Verilog Code for Multiplication


8 bit Vedic-Vedic
module mult_VV_8 (
input
[7:0] x,
input [7:0] y,
input clk,
output reg [15:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0] dup2;
[1:0] dup3;
[2:0] dup4;
[2:0] dup5;
[2:0] dup6;
[2:0] dup7;
[3:0] dup8;
[2:0] dup9;
[2:0] dup10;
[2:0] dup11;
[2:0] dup12;
[1:0] dup13;
[1:0] dup14;
dup15;

always@(*) begin
dup1 = (x[7]&y[7]);
dup2 = ((x[7]&y[6])+(x[6]&y[7])) ;
dup3 = ((x[7]&y[5])+(x[6]&y[6])) + ((x[5]&y[7])) ;
dup4 = ( ((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ;
dup5 = ( ((x[7]&y[3])+(x[6]&y[4])) + ((x[5]&y[5])+(x[4]&y[6])) ) + (
((x[3]&y[7])) ) ;
dup6 = ( ((x[7]&y[2])+(x[6]&y[3])) + ((x[5]&y[4])+(x[4]&y[5])) ) + (
((x[3]&y[6])+(x[2]&y[7])) ) ;
dup7 = ( ((x[7]&y[1])+(x[6]&y[2])) + ((x[5]&y[3])+(x[4]&y[4])) ) + (
((x[3]&y[5])+(x[2]&y[6])) + ((x[1]&y[7])) ) ;
dup8 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup9 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup10 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup11 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup12 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup13 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup14 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup15 = (x[0]&y[0]);
end

90

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;

always@(*) begin
levela1= (dup1 + dup2[1]) ;
levela2= ( (dup2[0] + dup3[1]) + (dup4[2]) ) ;
levela3= ( (dup3[0] + dup4[1]) + (dup5[2]) ) ;
levela4= ( (dup4[0] + dup5[1]) + (dup6[2]) ) ;
levela5= ( (dup5[0] + dup6[1]) + (dup7[2] + dup8[3]) ) ;
levela6= ( (dup6[0] + dup7[1]) + (dup8[2]) ) ;
levela7= ( (dup7[0] + dup8[1]) + (dup9[2]) ) ;
levela8= ( (dup8[0] + dup9[1]) + (dup10[2]) ) ;
levela9= ( (dup9[0] + dup10[1]) + (dup11[2]) ) ;
levela10= ( (dup10[0] + dup11[1]) + (dup12[2]) ) ;
levela11= (dup11[0] + dup12[1]) ;
levela12= (dup12[0] + dup13[1]) ;
levela13= (dup13[0] + dup14[1]) ;
levela14= (dup14[0]) ;
levela15= dup15 ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;

always@(*) begin

91

levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= ( (levela3[0] + levela4[1]) + (levela5[2]) ) ;
levelb5= (levela4[0] + levela5[1]) ;
levelb6= (levela5[0] + levela6[1]) ;
levelb7= (levela6[0] + levela7[1]) ;
levelb8= (levela7[0] + levela8[1]) ;
levelb9= (levela8[0] + levela9[1]) ;
levelb10= (levela9[0] + levela10[1]) ;
levelb11= (levela10[0] + levela11[1]) ;
levelb12= (levela11[0] + levela12[1]) ;
levelb13= (levela12[0] + levela13[1]) ;
levelb14= (levela13[0]) ;
levelb15= levela14;
levelb16= levela15;
end
wire [15:0] p1,p2;
assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14,levelb15,levelb16};
assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],4'b0000};
always@(posedge clk)
//cla
p = p1 + p2;
endmodule
16 bit Vedic-Vedic
module mult_VV_16 (
input
[15:0] x,
input [15:0]
y,
input clk,
output reg [31:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;

92

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;

always@(*) begin
dup1 = (x[15]&y[15]);
dup2 = ((x[15]&y[14])+(x[14]&y[15])) ;
dup3 = ((x[15]&y[13])+(x[14]&y[14])) + ((x[13]&y[15])) ;
dup4 = ( ((x[15]&y[12])+(x[14]&y[13])) + ((x[13]&y[14])+(x[12]&y[15])) )
;
dup5 = ( ((x[15]&y[11])+(x[14]&y[12])) + ((x[13]&y[13])+(x[12]&y[14])) )
+ ( ((x[11]&y[15])) ) ;
dup6 = ( ((x[15]&y[10])+(x[14]&y[11])) + ((x[13]&y[12])+(x[12]&y[13])) )
+ ( ((x[11]&y[14])+(x[10]&y[15])) ) ;
dup7 = ( ((x[15]&y[9])+(x[14]&y[10])) + ((x[13]&y[11])+(x[12]&y[12])) ) +
( ((x[11]&y[13])+(x[10]&y[14])) + ((x[9]&y[15])) ) ;
dup8 = ( ( ((x[15]&y[8])+(x[14]&y[9])) + ((x[13]&y[10])+(x[12]&y[11])) )
+ ( ((x[11]&y[12])+(x[10]&y[13])) + ((x[9]&y[14])+(x[8]&y[15])) ) ) ;
dup9 = ( ( ((x[15]&y[7])+(x[14]&y[8])) + ((x[13]&y[9])+(x[12]&y[10])) ) +
( ((x[11]&y[11])+(x[10]&y[12])) + ((x[9]&y[13])+(x[8]&y[14])) ) ) + ( (
((x[7]&y[15])) ) ) ;
dup10 = ( ( ((x[15]&y[6])+(x[14]&y[7])) + ((x[13]&y[8])+(x[12]&y[9])) ) +
( ((x[11]&y[10])+(x[10]&y[11])) + ((x[9]&y[12])+(x[8]&y[13])) ) ) + ( (
((x[7]&y[14])+(x[6]&y[15])) ) ) ;
dup11 = ( ( ((x[15]&y[5])+(x[14]&y[6])) + ((x[13]&y[7])+(x[12]&y[8])) ) +
( ((x[11]&y[9])+(x[10]&y[10])) + ((x[9]&y[11])+(x[8]&y[12])) ) ) + ( (
((x[7]&y[13])+(x[6]&y[14])) + ((x[5]&y[15])) ) ) ;
dup12 = ( ( ((x[15]&y[4])+(x[14]&y[5])) + ((x[13]&y[6])+(x[12]&y[7])) ) +
( ((x[11]&y[8])+(x[10]&y[9])) + ((x[9]&y[10])+(x[8]&y[11])) ) ) + ( (
((x[7]&y[12])+(x[6]&y[13])) + ((x[5]&y[14])+(x[4]&y[15])) ) ) ;
dup13 = ( ( ((x[15]&y[3])+(x[14]&y[4])) + ((x[13]&y[5])+(x[12]&y[6])) ) +
( ((x[11]&y[7])+(x[10]&y[8])) + ((x[9]&y[9])+(x[8]&y[10])) ) ) + ( (
((x[7]&y[11])+(x[6]&y[12])) + ((x[5]&y[13])+(x[4]&y[14])) ) + (
((x[3]&y[15])) ) ) ;

93

dup14 = ( ( ((x[15]&y[2])+(x[14]&y[3])) + ((x[13]&y[4])+(x[12]&y[5])) ) +


( ((x[11]&y[6])+(x[10]&y[7])) + ((x[9]&y[8])+(x[8]&y[9])) ) ) + ( (
((x[7]&y[10])+(x[6]&y[11])) + ((x[5]&y[12])+(x[4]&y[13])) ) + (
((x[3]&y[14])+(x[2]&y[15])) ) ) ;
dup15 = ( ( ((x[15]&y[1])+(x[14]&y[2])) + ((x[13]&y[3])+(x[12]&y[4])) ) +
( ((x[11]&y[5])+(x[10]&y[6])) + ((x[9]&y[7])+(x[8]&y[8])) ) ) + ( (
((x[7]&y[9])+(x[6]&y[10])) + ((x[5]&y[11])+(x[4]&y[12])) ) + (
((x[3]&y[13])+(x[2]&y[14])) + ((x[1]&y[15])) ) ) ;
dup16 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup17 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup18 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup19 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup20 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup21 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup22 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup23 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup24 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup25 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup26 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup27 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup28 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup29 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup30 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup31 = (x[0]&y[0]);
end
reg
reg
reg

[1:0] levela1;
[1:0] levela2;
[1:0] levela3;

94

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;

always@(*) begin
levela1= (dup1 + dup2[1]) ;
levela2= ( (dup2[0] + dup3[1]) + (dup4[2]) ) ;
levela3= ( (dup3[0] + dup4[1]) + (dup5[2]) ) ;
levela4= ( (dup4[0] + dup5[1]) + (dup6[2]) ) ;
levela5= ( (dup5[0] + dup6[1]) + (dup7[2] + dup8[3]) ) ;
levela6= ( (dup6[0] + dup7[1]) + (dup8[2] + dup9[3]) ) ;
levela7= ( (dup7[0] + dup8[1]) + (dup9[2] + dup10[3]) ) ;
levela8= ( (dup8[0] + dup9[1]) + (dup10[2] + dup11[3]) ) ;
levela9= ( (dup9[0] + dup10[1]) + (dup11[2] + dup12[3]) ) ;
levela10= ( (dup10[0] + dup11[1]) + (dup12[2] + dup13[3]) ) ;
levela11= ( (dup11[0] + dup12[1]) + (dup13[2] + dup14[3]) ) ;
levela12= ( (dup12[0] + dup13[1]) + (dup14[2] + dup15[3])) + ((dup16[4]) )
;
levela13= ( (dup13[0] + dup14[1]) + (dup15[2] + dup16[3]) ) ;
levela14= ( (dup14[0] + dup15[1]) + (dup16[2] + dup17[3]) ) ;
levela15= ( (dup15[0] + dup16[1]) + (dup17[2] + dup18[3]) ) ;
levela16= ( (dup16[0] + dup17[1]) + (dup18[2] + dup19[3]) ) ;
levela17= ( (dup17[0] + dup18[1]) + (dup19[2] + dup20[3]) ) ;
levela18= ( (dup18[0] + dup19[1]) + (dup20[2] + dup21[3]) ) ;
levela19= ( (dup19[0] + dup20[1]) + (dup21[2] + dup22[3]) ) ;
levela20= ( (dup20[0] + dup21[1]) + (dup22[2] + dup23[3]) ) ;
levela21= ( (dup21[0] + dup22[1]) + (dup23[2] + dup24[3]) ) ;

95

levela22=
levela23=
levela24=
levela25=
levela26=
levela27=
levela28=
levela29=
levela30=
levela31=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

( (dup22[0] + dup23[1])
( (dup23[0] + dup24[1])
( (dup24[0] + dup25[1])
( (dup25[0] + dup26[1])
( (dup26[0] + dup27[1])
(dup27[0] + dup28[1]) ;
(dup28[0] + dup29[1]) ;
(dup29[0] + dup30[1]) ;
(dup30[0]) ;
(dup31) ;

[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]

+
+
+
+
+

(dup24[2])
(dup25[2])
(dup26[2])
(dup27[2])
(dup28[2])

)
)
)
)
)

;
;
;
;
;

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;

always@(*) begin
levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= ( (levela3[0] + levela4[1])
levelb5= ( (levela4[0] + levela5[1])
levelb6= ( (levela5[0] + levela6[1])
levelb7= ( (levela6[0] + levela7[1])

+
+
+
+

(levela5[2])
(levela6[2])
(levela7[2])
(levela8[2])

)
)
)
)

;
;
;
;

96

levelb8= ( (levela7[0] + levela8[1]) + (levela9[2]) ) ;


levelb9= ( (levela8[0] + levela9[1]) + (levela10[2]) ) ;
levelb10= ( (levela9[0] + levela10[1]) + (levela11[2]) ) ;
levelb11= ( (levela10[0] + levela11[1]) + (levela12[2]) ) ;
levelb12= ( (levela11[0] + levela12[1]) + (levela13[2]) ) ;
levelb13= ( (levela12[0] + levela13[1]) + (levela14[2]) ) ;
levelb14= ( (levela13[0] + levela14[1]) + (levela15[2]) ) ;
levelb15= ( (levela14[0] + levela15[1]) + (levela16[2]) ) ;
levelb16= ( (levela15[0] + levela16[1]) + (levela17[2]) ) ;
levelb17= ( (levela16[0] + levela17[1]) + (levela18[2]) ) ;
levelb18= ( (levela17[0] + levela18[1]) + (levela19[2]) ) ;
levelb19= ( (levela18[0] + levela19[1]) + (levela20[2]) ) ;
levelb20= ( (levela19[0] + levela20[1]) + (levela21[2]) ) ;
levelb21= (levela20[0] + levela21[1]) ;
levelb22= (levela21[0] + levela22[1]) ;
levelb23= (levela22[0] + levela23[1]) ;
levelb24= (levela23[0] + levela24[1]) ;
levelb25= (levela24[0] + levela25[1]) ;
levelb26= (levela25[0] + levela26[1]) ;
levelb27= (levela26[0] + levela27[1]) ;
levelb28= (levela27[0] + levela28[1]) ;
levelb29= (levela28[0] + levela29[1]) ;
levelb30= (levela29[0]) ;
levelb31= (levela30) ;
levelb32= (levela31) ;
end
wire [31:0] p1,p2;
assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14[0],levelb15[0],levelb16[0],levelb17[0],levelb18[0],levelb19[0],level
b20[0],
levelb21[0],levelb22[0],levelb23[0],levelb24[0],levelb25[0],levelb26
[0],levelb27[0],levelb28[0],levelb29[0],levelb30,levelb31,levelb32};
assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],levelb14[1]
,levelb15[1],levelb16[1],levelb17[1],levelb18[1],levelb19[1],levelb20[1],l
evelb21[1],levelb22[1],levelb23[1],levelb24[1],levelb25[1],levelb26[1],lev
elb27[1],levelb28[1],levelb29[1],4'b0000};
always@(posedge clk)
//infer cla
p = p1 + p2;
endmodule
23 bit Vedic-Vedic
module mult_VV_23 (
input
[22:0] x,
input [22:0]
y,

97

input clk,
output reg

[45:0] p

);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;
dup33;
dup34;
dup35;
dup36;
dup37;
dup38;
dup39;
dup40;
dup41;
dup42;
dup43;
dup44;
dup45;
dup46;

always@(*) begin
dup1 = (x[22]&y[22]);

98

dup2 = ((x[22]&y[21])+(x[21]&y[22])) ;
dup3 = ((x[22]&y[20])+(x[21]&y[21])) + ((x[20]&y[22])) ;
dup4 = ( ((x[22]&y[19])+(x[21]&y[20])) + ((x[20]&y[21])+(x[19]&y[22])) )
;
dup5 = ( ((x[22]&y[18])+(x[21]&y[19])) + ((x[20]&y[20])+(x[19]&y[21])) )
+ ( ((x[18]&y[22])) ) ;
dup6 = ( ((x[22]&y[17])+(x[21]&y[18])) + ((x[20]&y[19])+(x[19]&y[20])) )
+ ( ((x[18]&y[21])+(x[17]&y[22])) ) ;
dup7 = ( ((x[22]&y[16])+(x[21]&y[17])) + ((x[20]&y[18])+(x[19]&y[19])) )
+ ( ((x[18]&y[20])+(x[17]&y[21])) + ((x[16]&y[22])) ) ;
dup8 = ( ( ((x[22]&y[15])+(x[21]&y[16])) + ((x[20]&y[17])+(x[19]&y[18]))
) + (((x[18]&y[19])+(x[17]&y[20])) + ((x[16]&y[21])+(x[15]&y[22])) ) ) ;
dup9 = ( ( ((x[22]&y[14])+(x[21]&y[15])) + ((x[20]&y[16])+(x[19]&y[17]))
) + (((x[18]&y[18])+(x[17]&y[19])) + ((x[16]&y[20])+(x[15]&y[21])) ) ) + (
( ((x[14]&y[22])) ) ) ;
dup10 = ( ( ((x[22]&y[13])+(x[21]&y[14])) + ((x[20]&y[15])+(x[19]&y[16]))
) + ( ((x[18]&y[17])+(x[17]&y[18])) + ((x[16]&y[19])+(x[15]&y[20])) ) ) +
( ( ((x[14]&y[21])+(x[13]&y[22])) ) ) ;
dup11 = ( ( ((x[22]&y[12])+(x[21]&y[13])) + ((x[20]&y[14])+(x[19]&y[15]))
) + ( ((x[18]&y[16])+(x[17]&y[17])) + ((x[16]&y[18])+(x[15]&y[19])) ) ) +
( ( ((x[14]&y[20])+(x[13]&y[21])) + ((x[12]&y[22])) ) ) ;
dup12 = ( ( ((x[22]&y[11])+(x[21]&y[12])) + ((x[20]&y[13])+(x[19]&y[14]))
) + ( ((x[18]&y[15])+(x[17]&y[16])) + ((x[16]&y[17])+(x[15]&y[18])) ) ) +
( ( ((x[14]&y[19])+(x[13]&y[20])) + ((x[12]&y[21])+(x[11]&y[22])) ) ) ;
dup13 = ( ( ((x[22]&y[10])+(x[21]&y[11])) + ((x[20]&y[12])+(x[19]&y[13]))
) + ( ((x[18]&y[14])+(x[17]&y[15])) + ((x[16]&y[16])+(x[15]&y[17])) ) ) +
( ( ((x[14]&y[18])+(x[13]&y[19])) + ((x[12]&y[20])+(x[11]&y[21])) ) + (
((x[10]&y[22])) ) ) ;
dup14 = ( ( ((x[22]&y[9])+(x[21]&y[10])) + ((x[20]&y[11])+(x[19]&y[12]))
) + (((x[18]&y[13])+(x[17]&y[14])) + ((x[16]&y[15])+(x[15]&y[16])) ) ) + (
( ((x[14]&y[17])+(x[13]&y[18])) + ((x[12]&y[19])+(x[11]&y[20])) ) + (
((x[10]&y[21])+(x[9]&y[22])) ) ) ;
dup15 = ( ( ((x[22]&y[8])+(x[21]&y[9])) + ((x[20]&y[10])+(x[19]&y[11])) )
+ ( ((x[18]&y[12])+(x[17]&y[13])) + ((x[16]&y[14])+(x[15]&y[15])) ) ) + (
( ((x[14]&y[16])+(x[13]&y[17])) + ((x[12]&y[18])+(x[11]&y[19])) ) + (
((x[10]&y[20])+(x[9]&y[21])) + ((x[8]&y[22])) ) ) ;
dup16 = ( ( ( ((x[22]&y[7])+(x[21]&y[8])) + ((x[20]&y[9])+(x[19]&y[10]))
) + (((x[18]&y[11])+(x[17]&y[12])) + ((x[16]&y[13])+(x[15]&y[14])) ) ) + (
( ((x[14]&y[15])+(x[13]&y[16])) + ((x[12]&y[17])+(x[11]&y[18])) ) + (
((x[10]&y[19])+(x[9]&y[20])) + ((x[8]&y[21])+(x[7]&y[22])) ) ) ) ;
dup17 = ( ( ( ((x[22]&y[6])+(x[21]&y[7])) + ((x[20]&y[8])+(x[19]&y[9])) )
+ ( ((x[18]&y[10])+(x[17]&y[11])) + ((x[16]&y[12])+(x[15]&y[13])) ) ) + (
( ((x[14]&y[14])+(x[13]&y[15])) + ((x[12]&y[16])+(x[11]&y[17])) ) + (
((x[10]&y[18])+(x[9]&y[19])) + ((x[8]&y[20])+(x[7]&y[21])) ) ) ) + ( ( (
((x[6]&y[22])) ) ) ) ;
dup18 = ( ( ( ((x[22]&y[5])+(x[21]&y[6])) + ((x[20]&y[7])+(x[19]&y[8])) )
+ ( ((x[18]&y[9])+(x[17]&y[10])) + ((x[16]&y[11])+(x[15]&y[12])) ) ) + ( (
((x[14]&y[13])+(x[13]&y[14])) + ((x[12]&y[15])+(x[11]&y[16])) ) + (
((x[10]&y[17])+(x[9]&y[18])) + ((x[8]&y[19])+(x[7]&y[20])) ) ) ) + ( ( (
((x[6]&y[21])+(x[5]&y[22])) ) ) ) ;
dup19 = ( ( ( ((x[22]&y[4])+(x[21]&y[5])) + ((x[20]&y[6])+(x[19]&y[7])) )
+ ( ((x[18]&y[8])+(x[17]&y[9])) + ((x[16]&y[10])+(x[15]&y[11])) ) ) + ( (
((x[14]&y[12])+(x[13]&y[13])) + ((x[12]&y[14])+(x[11]&y[15])) ) + (

99

((x[10]&y[16])+(x[9]&y[17])) + ((x[8]&y[18])+(x[7]&y[19])) ) ) ) + ( ( (
((x[6]&y[20])+(x[5]&y[21])) +((x[4]&y[22])) ) ) ) ;
dup20 = ( ( ( ((x[22]&y[3])+(x[21]&y[4])) + ((x[20]&y[5])+(x[19]&y[6]))
+ ( ((x[18]&y[7])+(x[17]&y[8])) + ((x[16]&y[9])+(x[15]&y[10])) ) ) + ( (
((x[14]&y[11])+(x[13]&y[12])) + ((x[12]&y[13])+(x[11]&y[14])) ) + (
((x[10]&y[15])+(x[9]&y[16])) + ((x[8]&y[17])+(x[7]&y[18])) ) ) ) + ( ( (
((x[6]&y[19])+(x[5]&y[20])) + ((x[4]&y[21])+(x[3]&y[22])) ) ) ) ;
dup21 = ( ( ( ((x[22]&y[2])+(x[21]&y[3])) + ((x[20]&y[4])+(x[19]&y[5]))
+ ( ((x[18]&y[6])+(x[17]&y[7])) + ((x[16]&y[8])+(x[15]&y[9])) ) ) + ( (
((x[14]&y[10])+(x[13]&y[11])) + ((x[12]&y[12])+(x[11]&y[13])) ) + (
((x[10]&y[14])+(x[9]&y[15])) + ((x[8]&y[16])+(x[7]&y[17])) ) ) ) + ( ( (
((x[6]&y[18])+(x[5]&y[19])) + ((x[4]&y[20])+(x[3]&y[21])) ) + (
((x[2]&y[22])) ) ) ) ;
dup22 = ( ( ( ((x[22]&y[1])+(x[21]&y[2])) + ((x[20]&y[3])+(x[19]&y[4]))
+ ( ((x[18]&y[5])+(x[17]&y[6])) + ((x[16]&y[7])+(x[15]&y[8])) ) ) + ( (
((x[14]&y[9])+(x[13]&y[10])) + ((x[12]&y[11])+(x[11]&y[12])) ) + (
((x[10]&y[13])+(x[9]&y[14])) + ((x[8]&y[15])+(x[7]&y[16])) ) ) ) + ( ( (
((x[6]&y[17])+(x[5]&y[18])) + ((x[4]&y[19])+(x[3]&y[20])) ) + (
((x[2]&y[21])+(x[1]&y[22])) ) ) ) ;
dup23 = ( ( ( ((x[22]&y[0])+(x[21]&y[1])) + ((x[20]&y[2])+(x[19]&y[3]))
+ ( ((x[18]&y[4])+(x[17]&y[5])) + ((x[16]&y[6])+(x[15]&y[7])) ) ) + ( (
((x[14]&y[8])+(x[13]&y[9])) + ((x[12]&y[10])+(x[11]&y[11])) ) + (
((x[10]&y[12])+(x[9]&y[13])) + ((x[8]&y[14])+(x[7]&y[15])) ) ) ) + ( ( (
((x[6]&y[16])+(x[5]&y[17])) + ((x[4]&y[18])+(x[3]&y[19])) ) + (
((x[2]&y[20])+(x[1]&y[21])) + ((x[0]&y[22])) ) ) ) ;
dup24 = ( ( ( ((x[21]&y[0])+(x[20]&y[1])) + ((x[19]&y[2])+(x[18]&y[3]))
+ ( ((x[17]&y[4])+(x[16]&y[5])) + ((x[15]&y[6])+(x[14]&y[7])) ) ) + ( (
((x[13]&y[8])+(x[12]&y[9])) + ((x[11]&y[10])+(x[10]&y[11])) ) + (
((x[9]&y[12])+(x[8]&y[13])) + ((x[7]&y[14])+(x[6]&y[15])) ) ) ) + ( ( (
((x[5]&y[16])+(x[4]&y[17])) + ((x[3]&y[18])+(x[2]&y[19])) ) + (
((x[1]&y[20])+(x[0]&y[21])) ) ) ) ;
dup25 = ( ( ( ((x[20]&y[0])+(x[19]&y[1])) + ((x[18]&y[2])+(x[17]&y[3]))
+ ( ((x[16]&y[4])+(x[15]&y[5])) + ((x[14]&y[6])+(x[13]&y[7])) ) ) + ( (
((x[12]&y[8])+(x[11]&y[9])) + ((x[10]&y[10])+(x[9]&y[11])) ) + (
((x[8]&y[12])+(x[7]&y[13]))+ ((x[6]&y[14])+(x[5]&y[15])) ) ) ) + ( ( (
((x[4]&y[16])+(x[3]&y[17])) + ((x[2]&y[18])+(x[1]&y[19])) ) + (
((x[0]&y[20])) ) ) ) ;
dup26 = ( ( ( ((x[19]&y[0])+(x[18]&y[1])) + ((x[17]&y[2])+(x[16]&y[3]))
+ ( ((x[15]&y[4])+(x[14]&y[5])) + ((x[13]&y[6])+(x[12]&y[7])) ) ) + ( (
((x[11]&y[8])+(x[10]&y[9])) + ((x[9]&y[10])+(x[8]&y[11])) ) + (
((x[7]&y[12])+(x[6]&y[13])) + ((x[5]&y[14])+(x[4]&y[15])) ) ) ) + ( ( (
((x[3]&y[16])+(x[2]&y[17])) + ((x[1]&y[18])+(x[0]&y[19])) ) ) ) ;
dup27 = ( ( ( ((x[18]&y[0])+(x[17]&y[1])) + ((x[16]&y[2])+(x[15]&y[3]))
+ ( ((x[14]&y[4])+(x[13]&y[5])) + ((x[12]&y[6])+(x[11]&y[7])) ) ) + ( (
((x[10]&y[8])+(x[9]&y[9])) + ((x[8]&y[10])+(x[7]&y[11])) ) + (
((x[6]&y[12])+(x[5]&y[13])) +((x[4]&y[14])+(x[3]&y[15])) ) ) ) + ( ( (
((x[2]&y[16])+(x[1]&y[17])) + ((x[0]&y[18])) ) ) ) ;
dup28 = ( ( ( ((x[17]&y[0])+(x[16]&y[1])) + ((x[15]&y[2])+(x[14]&y[3]))
+ ( ((x[13]&y[4])+(x[12]&y[5])) + ((x[11]&y[6])+(x[10]&y[7])) ) ) + ( (
((x[9]&y[8])+(x[8]&y[9])) + ((x[7]&y[10])+(x[6]&y[11])) ) + (
((x[5]&y[12])+(x[4]&y[13])) + ((x[3]&y[14])+(x[2]&y[15])) ) ) ) + ( ( (
((x[1]&y[16])+(x[0]&y[17])) ) ) ) ;

100

dup29 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3])) )


+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) + ( ( (
((x[0]&y[16])) ) ) ) ;
dup30 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup31 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup32 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup33 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup34 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup35 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup36 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup37 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup38 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup39 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup40 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup41 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup42 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup43 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup44 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup45 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]

levela1;
levela2;
levela3;
levela4;
levela5;

101

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]

levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;
levela32;
levela33;
levela34;
levela35;
levela36;
levela37;
levela38;
levela39;
levela40;
levela41;
levela42;
levela43;
levela44;
levela45;

always@(*) begin
levela1= (dup1 + dup2[1]) ;
levela2= ( (dup2[0] + dup3[1]) + (dup4[2]) ) ;
levela3= ( (dup3[0] + dup4[1]) + (dup5[2]) ) ;
levela4= ( (dup4[0] + dup5[1]) + (dup6[2]) ) ;
levela5= ( (dup5[0] + dup6[1]) + (dup7[2] + dup8[3]) ) ;
levela6= ( (dup6[0] + dup7[1]) + (dup8[2] + dup9[3]) ) ;
levela7= ( (dup7[0] + dup8[1]) + (dup9[2] + dup10[3]) ) ;
levela8= ( (dup8[0] + dup9[1]) + (dup10[2] + dup11[3]) ) ;
levela9= ( (dup9[0] + dup10[1]) + (dup11[2] + dup12[3]) ) ;

102

levela10=
levela11=
levela12=
;
levela13=
;
levela14=
;
levela15=
;
levela16=
;
levela17=
;
levela18=
;
levela19=
;
levela20=
;
levela21=
;
levela22=
;
levela23=
;
levela24=
;
levela25=
;
levela26=
;
levela27=
levela28=
levela29=
levela30=
levela31=
levela32=
levela33=
levela34=
levela35=
levela36=
levela37=
levela38=
levela39=
levela40=
levela41=
levela42=
levela43=
levela44=
levela45=
end

( (dup10[0] + dup11[1]) + (dup12[2] + dup13[3]) ) ;


( (dup11[0] + dup12[1]) + (dup13[2] + dup14[3]) ) ;
( (dup12[0] + dup13[1]) + (dup14[2] + dup15[3])) + ((dup16[4]) )
( (dup13[0] + dup14[1]) + (dup15[2] + dup16[3])) + ((dup17[4]) )
( (dup14[0] + dup15[1]) + (dup16[2] + dup17[3])) + ((dup18[4]) )
( (dup15[0] + dup16[1]) + (dup17[2] + dup18[3])) + ((dup19[4]) )
( (dup16[0] + dup17[1]) + (dup18[2] + dup19[3])) + ((dup20[4]) )
( (dup17[0] + dup18[1]) + (dup19[2] + dup20[3])) + ((dup21[4]) )
( (dup18[0] + dup19[1]) + (dup20[2] + dup21[3])) + ((dup22[4]) )
( (dup19[0] + dup20[1]) + (dup21[2] + dup22[3])) + ((dup23[4]) )
( (dup20[0] + dup21[1]) + (dup22[2] + dup23[3])) + ((dup24[4]) )
( (dup21[0] + dup22[1]) + (dup23[2] + dup24[3])) + ((dup25[4]) )
( (dup22[0] + dup23[1]) + (dup24[2] + dup25[3])) + ((dup26[4]) )
( (dup23[0] + dup24[1]) + (dup25[2] + dup26[3])) + ((dup27[4]) )
( (dup24[0] + dup25[1]) + (dup26[2] + dup27[3])) + ((dup28[4]) )
( (dup25[0] + dup26[1]) + (dup27[2] + dup28[3])) + ((dup29[4]) )
( (dup26[0] + dup27[1]) + (dup28[2] + dup29[3])) + ((dup30[4]) )
( (dup27[0] + dup28[1])
( (dup28[0] + dup29[1])
( (dup29[0] + dup30[1])
( (dup30[0] + dup31[1])
( (dup31[0] + dup32[1])
( (dup32[0] + dup33[1])
( (dup33[0] + dup34[1])
( (dup34[0] + dup35[1])
( (dup35[0] + dup36[1])
( (dup36[0] + dup37[1])
( (dup37[0] + dup38[1])
( (dup38[0] + dup39[1])
( (dup39[0] + dup40[1])
( (dup40[0] + dup41[1])
(dup41[0] + dup42[1]) ;
(dup42[0] + dup43[1]) ;
(dup43[0] + dup44[1]) ;
(dup44[0]) ;
(dup45[0]) ;

+
+
+
+
+
+
+
+
+
+
+
+
+
+

(dup29[2] + dup30[3])
(dup30[2] + dup31[3])
(dup31[2] + dup32[3])
(dup32[2] + dup33[3])
(dup33[2] + dup34[3])
(dup34[2] + dup35[3])
(dup35[2] + dup36[3])
(dup36[2] + dup37[3])
(dup37[2] + dup38[3])
(dup38[2]) ) ;
(dup39[2]) ) ;
(dup40[2]) ) ;
(dup41[2]) ) ;
(dup42[2]) ) ;

)
)
)
)
)
)
)
)
)

;
;
;
;
;
;
;
;
;

103

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;
levelb34;
levelb35;
levelb36;
levelb37;
levelb38;
levelb39;
levelb40;
levelb41;
levelb42;
levelb43;
levelb44;
levelb45;
levelb46;

always@(*) begin
levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= ( (levela3[0] + levela4[1]) + (levela5[2]) ) ;
levelb5= ( (levela4[0] + levela5[1]) + (levela6[2]) ) ;

104

levelb6= ( (levela5[0] + levela6[1]) + (levela7[2]) ) ;


levelb7= ( (levela6[0] + levela7[1]) + (levela8[2]) ) ;
levelb8= ( (levela7[0] + levela8[1]) + (levela9[2]) ) ;
levelb9= ( (levela8[0] + levela9[1]) + (levela10[2]) ) ;
levelb10= ( (levela9[0] + levela10[1]) + (levela11[2]) ) ;
levelb11= ( (levela10[0] + levela11[1]) + (levela12[2]) ) ;
levelb12= ( (levela11[0] + levela12[1]) + (levela13[2]) ) ;
levelb13= ( (levela12[0] + levela13[1]) + (levela14[2]) ) ;
levelb14= ( (levela13[0] + levela14[1]) + (levela15[2]) ) ;
levelb15= ( (levela14[0] + levela15[1]) + (levela16[2]) ) ;
levelb16= ( (levela15[0] + levela16[1]) + (levela17[2]) ) ;
levelb17= ( (levela16[0] + levela17[1]) + (levela18[2]) ) ;
levelb18= ( (levela17[0] + levela18[1]) + (levela19[2]) ) ;
levelb19= ( (levela18[0] + levela19[1]) + (levela20[2]) ) ;
levelb20= ( (levela19[0] + levela20[1]) + (levela21[2]) ) ;
levelb21= ( (levela20[0] + levela21[1]) + (levela22[2]) ) ;
levelb22= ( (levela21[0] + levela22[1]) + (levela23[2]) ) ;
levelb23= ( (levela22[0] + levela23[1]) + (levela24[2]) ) ;
levelb24= ( (levela23[0] + levela24[1]) + (levela25[2]) ) ;
levelb25= ( (levela24[0] + levela25[1]) + (levela26[2]) ) ;
levelb26= ( (levela25[0] + levela26[1]) + (levela27[2]) ) ;
levelb27= ( (levela26[0] + levela27[1]) + (levela28[2]) ) ;
levelb28= ( (levela27[0] + levela28[1]) + (levela29[2]) ) ;
levelb29= ( (levela28[0] + levela29[1]) + (levela30[2]) ) ;
levelb30= ( (levela29[0] + levela30[1]) + (levela31[2]) ) ;
levelb31= ( (levela30[0] + levela31[1]) + (levela32[2]) ) ;
levelb32= ( (levela31[0] + levela32[1]) + (levela33[2]) ) ;
levelb33= ( (levela32[0] + levela33[1]) + (levela34[2]) ) ;
levelb34= ( (levela33[0] + levela34[1]) + (levela35[2]) ) ;
levelb35= (levela34[0] + levela35[1]) ;
levelb36= (levela35[0] + levela36[1]) ;
levelb37= (levela36[0] + levela37[1]) ;
levelb38= (levela37[0] + levela38[1]) ;
levelb39= (levela38[0] + levela39[1]) ;
levelb40= (levela39[0] + levela40[1]) ;
levelb41= (levela40[0] + levela41[1]) ;
levelb42= (levela41[0] + levela42[1]) ;
levelb43= (levela42[0] + levela43[1]) ;
levelb44= (levela43[0]) ;
levelb45= (levela44) ;
levelb46= (levela45) ;
end
wire [45:0] p1,p2;
assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14[0],levelb15[0],levelb16[0],levelb17[0],levelb18[0],levelb19[0],level
b20[0],levelb21[0],levelb22[0],levelb23[0],levelb24[0],levelb25[0],levelb2
6[0],levelb27[0],levelb28[0],levelb29[0],levelb30[0],levelb31[0],levelb32[
0],levelb33[0],levelb34[0],levelb35[0],levelb36[0],levelb37[0],levelb38[0]
,levelb39[0],levelb40[0],levelb41[0],levelb42[0],levelb43[0],levelb44,leve
lb45,levelb46};

105

assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],levelb14[1]
,levelb15[1],levelb16[1],levelb17[1],levelb18[1],levelb19[1],levelb20[1],l
evelb21[1],levelb22[1],levelb23[1],levelb24[1],levelb25[1],levelb26[1],lev
elb27[1],levelb28[1],levelb29[1],levelb30[1],levelb31[1],levelb32[1],level
b33[1],levelb34[1],levelb35[1],levelb36[1],levelb37[1],levelb38[1],levelb3
9[1],levelb40[1],levelb41[1],levelb42[1],levelb43[1],4'b0000};
always@(posedge clk) begin
//infer CLA
p[45:4] = p1[45:4] + p2[45:4];
p[3:0] = p1[3:0];
end
endmodule
8 bit Vedic-Wallace
module mult_VW_8 (
input
[7:0] x,
input [7:0] y,
input clk,
output reg [15:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0] dup2;
[1:0] dup3;
[2:0] dup4;
[2:0] dup5;
[2:0] dup6;
[2:0] dup7;
[3:0] dup8;
[2:0] dup9;
[2:0] dup10;
[2:0] dup11;
[2:0] dup12;
[1:0] dup13;
[1:0] dup14;
dup15;

always@(*) begin
dup1 = (x[7]&y[7]);
dup2 = ((x[7]&y[6])+(x[6]&y[7])) ;
dup3 = ((x[7]&y[5])+(x[6]&y[6])) +
dup4 = ( ((x[7]&y[4])+(x[6]&y[5]))
dup5 = ( ((x[7]&y[3])+(x[6]&y[4]))
((x[3]&y[7])) ) ;
dup6 = ( ((x[7]&y[2])+(x[6]&y[3]))
((x[3]&y[6])+(x[2]&y[7])) ) ;

((x[5]&y[7])) ;
+ ((x[5]&y[6])+(x[4]&y[7])) ) ;
+ ((x[5]&y[5])+(x[4]&y[6])) ) + (
+ ((x[5]&y[4])+(x[4]&y[5])) ) + (

106

dup7 = ( ((x[7]&y[1])+(x[6]&y[2])) + ((x[5]&y[3])+(x[4]&y[4])) ) + (


((x[3]&y[5])+(x[2]&y[6])) + ((x[1]&y[7])) ) ;
dup8 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup9 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup10 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup11 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup12 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup13 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup14 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup15 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;

always@(*) begin
levela1= ( dup1 + dup2[1] ) ;
levela2= ( dup2[0] + dup3[1] + dup4[2] ) ;
levela3= ( dup3[0] + dup4[1] + dup5[2] ) ;
levela4= ( dup4[0] + dup5[1] + dup6[2] ) ;
levela5= ( dup5[0] + dup6[1] + dup7[2] ) ;
levela6= ( dup6[0] + dup7[1] + dup8[2] ) ;
levela7= ( dup7[0] + dup8[1] + dup9[2] ) ;
levela8= ( dup8[0] + dup9[1] + dup10[2] ) ;
levela9= ( dup9[0] + dup10[1] + dup11[2] ) ;
levela10= ( dup10[0] + dup11[1] + dup12[2] ) ;
levela11= (dup11[0] + dup12[1]) ;
levela12= (dup12[0] + dup13[1]) ;
levela13= (dup13[0] + dup14[1]) ;
levela14= (dup14[0]) ;
levela15= dup15 ;
end
reg
reg
reg

[1:0]
[1:0]

levelb1;
levelb2;
levelb3;

107

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;

always@(*) begin
levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= (levela3[0] + levela4[1]) ;
levelb5= (levela4[0] + levela5[1]) ;
levelb6= (levela5[0] + levela6[1]) +(dup8[3]);
levelb7= (levela6[0] + levela7[1]) ;
levelb8= (levela7[0] + levela8[1]) ;
levelb9= (levela8[0] + levela9[1]) ;
levelb10= (levela9[0] + levela10[1]) ;
levelb11= (levela10[0] + levela11[1]) ;
levelb12= (levela11[0] + levela12[1]) ;
levelb13= (levela12[0] + levela13[1]) ;
levelb14= (levela13[0]) ;
levelb15= levela14;
levelb16= levela15;
end
wire [15:0] p1,p2;
assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14,levelb15,levelb16};
assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],4'b0000};
always@(posedge clk)
//cla
p = p1 + p2;
endmodule
16 bit Vedic-Wallace
module mult_VW_16 (
input
[15:0]

x,

108

input [15:0]
y,
input clk,
output reg [31:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;

always@(*) begin
dup1 = (x[15]&y[15]);
dup2 = ((x[15]&y[14])+(x[14]&y[15])) ;
dup3 = ((x[15]&y[13])+(x[14]&y[14])) + ((x[13]&y[15])) ;
dup4 = ( ((x[15]&y[12])+(x[14]&y[13])) + ((x[13]&y[14])+(x[12]&y[15])) )
;
dup5 = ( ((x[15]&y[11])+(x[14]&y[12])) + ((x[13]&y[13])+(x[12]&y[14])) )
+ ( ((x[11]&y[15])) ) ;
dup6 = ( ((x[15]&y[10])+(x[14]&y[11])) + ((x[13]&y[12])+(x[12]&y[13])) )
+ ( ((x[11]&y[14])+(x[10]&y[15])) ) ;
dup7 = ( ((x[15]&y[9])+(x[14]&y[10])) + ((x[13]&y[11])+(x[12]&y[12])) ) +
( ((x[11]&y[13])+(x[10]&y[14])) + ((x[9]&y[15])) ) ;
dup8 = ( ( ((x[15]&y[8])+(x[14]&y[9])) + ((x[13]&y[10])+(x[12]&y[11])) )
+ ( ((x[11]&y[12])+(x[10]&y[13])) + ((x[9]&y[14])+(x[8]&y[15])) ) ) ;

109

dup9 = ( ( ((x[15]&y[7])+(x[14]&y[8])) + ((x[13]&y[9])+(x[12]&y[10])) ) +


( ((x[11]&y[11])+(x[10]&y[12])) + ((x[9]&y[13])+(x[8]&y[14])) ) ) + ( (
((x[7]&y[15])) ) ) ;
dup10 = ( ( ((x[15]&y[6])+(x[14]&y[7])) + ((x[13]&y[8])+(x[12]&y[9])) ) +
( ((x[11]&y[10])+(x[10]&y[11])) + ((x[9]&y[12])+(x[8]&y[13])) ) ) + ( (
((x[7]&y[14])+(x[6]&y[15])) ) ) ;
dup11 = ( ( ((x[15]&y[5])+(x[14]&y[6])) + ((x[13]&y[7])+(x[12]&y[8])) ) +
( ((x[11]&y[9])+(x[10]&y[10])) + ((x[9]&y[11])+(x[8]&y[12])) ) ) + ( (
((x[7]&y[13])+(x[6]&y[14])) + ((x[5]&y[15])) ) ) ;
dup12 = ( ( ((x[15]&y[4])+(x[14]&y[5])) + ((x[13]&y[6])+(x[12]&y[7])) ) +
( ((x[11]&y[8])+(x[10]&y[9])) + ((x[9]&y[10])+(x[8]&y[11])) ) ) + ( (
((x[7]&y[12])+(x[6]&y[13])) + ((x[5]&y[14])+(x[4]&y[15])) ) ) ;
dup13 = ( ( ((x[15]&y[3])+(x[14]&y[4])) + ((x[13]&y[5])+(x[12]&y[6])) ) +
( ((x[11]&y[7])+(x[10]&y[8])) + ((x[9]&y[9])+(x[8]&y[10])) ) ) + ( (
((x[7]&y[11])+(x[6]&y[12])) + ((x[5]&y[13])+(x[4]&y[14])) ) + (
((x[3]&y[15])) ) ) ;
dup14 = ( ( ((x[15]&y[2])+(x[14]&y[3])) + ((x[13]&y[4])+(x[12]&y[5])) ) +
( ((x[11]&y[6])+(x[10]&y[7])) + ((x[9]&y[8])+(x[8]&y[9])) ) ) + ( (
((x[7]&y[10])+(x[6]&y[11])) + ((x[5]&y[12])+(x[4]&y[13])) ) + (
((x[3]&y[14])+(x[2]&y[15])) ) ) ;
dup15 = ( ( ((x[15]&y[1])+(x[14]&y[2])) + ((x[13]&y[3])+(x[12]&y[4])) ) +
( ((x[11]&y[5])+(x[10]&y[6])) + ((x[9]&y[7])+(x[8]&y[8])) ) ) + ( (
((x[7]&y[9])+(x[6]&y[10])) + ((x[5]&y[11])+(x[4]&y[12])) ) + (
((x[3]&y[13])+(x[2]&y[14])) + ((x[1]&y[15])) ) ) ;
dup16 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup17 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup18 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup19 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup20 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup21 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup22 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup23 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;

110

dup24 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3]))


((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup25 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) )
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup26 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) )
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup27 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) )
((x[0]&y[4])) ) ;
dup28 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) )
dup29 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup30 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup31 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

) + (
+ (
+ (
+ (
;

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;

111

levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] ) ;
levela28=
( dup28[0] + dup29[1] ) ;
levela29=
( dup29[0] + dup30[1] ) ;
levela30=
( dup30[0] ) ;
levela31=
( dup31) ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;

112

reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;
levelb13=
( levela12[0] + levela13[1] + levela12a[0] ) ;
levelb14=
( levela13[0] + levela14[1] + dup16[3] ) ;
levelb15=
( levela14[0] + levela15[1] + dup17[3] ) ;
levelb16=
( levela15[0] + levela16[1] + dup18[3] ) ;
levelb17=
( levela16[0] + levela17[1] + dup19[3] ) ;
levelb18=
( levela17[0] + levela18[1] + dup20[3] ) ;
levelb19=
( levela18[0] + levela19[1] + dup21[3] ) ;
levelb20=
( levela19[0] + levela20[1] + dup22[3] ) ;
levelb21=
( levela20[0] + levela21[1] + dup23[3] ) ;
levelb22=
( levela21[0] + levela22[1] + dup24[3] ) ;
levelb23= (levela22[0] + levela23[1]) ;
levelb24= (levela23[0] + levela24[1]) ;
levelb25= (levela24[0] + levela25[1]) ;
levelb26= (levela25[0] + levela26[1]) ;
levelb27= (levela26[0] + levela27[1]) ;
levelb28= (levela27[0] + levela28[1]) ;
levelb29= (levela28[0] + levela29[1]) ;
levelb30= (levela29[0]) ;
levelb31= (levela30) ;
levelb32= (levela31) ;
end
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;

113

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );
levelc8=
( levelb8[0] + levelb9[1] );
levelc9=
( levelb9[0] + levelb10[1] );
levelc10=
( levelb10[0] + levelb11[1] );
levelc11=
( levelb11[0] + levelb12[1] );
levelc12=
( levelb12[0] + levelb13[1] + levela12a[1]);
levelc13=
( levelb13[0] + levelb14[1] );
levelc14=
( levelb14[0] + levelb15[1] );
levelc15=
( levelb15[0] + levelb16[1] );
levelc16=
( levelb16[0] + levelb17[1] );
levelc17=
( levelb17[0] + levelb18[1] );
levelc18=
( levelb18[0] + levelb19[1] );
levelc19=
( levelb19[0] + levelb20[1] );
levelc20=
( levelb20[0] + levelb21[1] );
levelc21=
( levelb21[0] + levelb22[1] );
levelc22=
(levelb22[0] + levelb23[1]) ;
levelc23=
(levelb23[0] + levelb24[1]) ;
levelc24=
(levelb24[0] + levelb25[1]) ;
levelc25=
(levelb25[0] + levelb26[1]) ;
levelc26=
(levelb26[0] + levelb27[1]) ;

114

levelc27=
levelc28=
levelc29=
levelc30=
levelc31=
levelc32=
end

(levelb27[0] + levelb28[1]) ;
(levelb28[0] + levelb29[1]) ;
(levelb29[0]) ;
(levelb30) ;
(levelb31) ;
(levelb32) ;

wire [31:0] p1,p2;


assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],
levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc26
[0],levelc27[0],levelc28[0],levelc29[0],levelc30,levelc31,levelc32};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],4'b0000};
always@(posedge clk)
//infer csa
p = p1 + p2;
endmodule
23 bit Vedic-Wallace
module mult_VW_23 (
input
[22:0] x,
input [22:0]
y,
input clk,
output reg [45:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;

115

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[3:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;
dup33;
dup34;
dup35;
dup36;
dup37;
dup38;
dup39;
dup40;
dup41;
dup42;
dup43;
dup44;
dup45;

always@(*) begin
dup1 = (x[22]&y[22]);
dup2 = ((x[22]&y[21])+(x[21]&y[22])) ;
dup3 = ((x[22]&y[20])+(x[21]&y[21])) + ((x[20]&y[22])) ;
dup4 = ( ((x[22]&y[19])+(x[21]&y[20])) + ((x[20]&y[21])+(x[19]&y[22])) )
;
dup5 = ( ((x[22]&y[18])+(x[21]&y[19])) + ((x[20]&y[20])+(x[19]&y[21])) )
+ ( ((x[18]&y[22])) ) ;
dup6 = ( ((x[22]&y[17])+(x[21]&y[18])) + ((x[20]&y[19])+(x[19]&y[20])) )
+ ( ((x[18]&y[21])+(x[17]&y[22])) ) ;
dup7 = ( ((x[22]&y[16])+(x[21]&y[17])) + ((x[20]&y[18])+(x[19]&y[19])) )
+ ( ((x[18]&y[20])+(x[17]&y[21])) + ((x[16]&y[22])) ) ;
dup8 = ( ( ((x[22]&y[15])+(x[21]&y[16])) + ((x[20]&y[17])+(x[19]&y[18]))
) + (((x[18]&y[19])+(x[17]&y[20])) + ((x[16]&y[21])+(x[15]&y[22])) ) ) ;
dup9 = ( ( ((x[22]&y[14])+(x[21]&y[15])) + ((x[20]&y[16])+(x[19]&y[17]))
) + (((x[18]&y[18])+(x[17]&y[19])) + ((x[16]&y[20])+(x[15]&y[21])) ) ) + (
( ((x[14]&y[22])) ) ) ;
dup10 = ( ( ((x[22]&y[13])+(x[21]&y[14])) + ((x[20]&y[15])+(x[19]&y[16]))
) + ( ((x[18]&y[17])+(x[17]&y[18])) + ((x[16]&y[19])+(x[15]&y[20])) ) ) +
( ( ((x[14]&y[21])+(x[13]&y[22])) ) ) ;

116

dup11 = ( ( ((x[22]&y[12])+(x[21]&y[13])) + ((x[20]&y[14])+(x[19]&y[15]))


) + ( ((x[18]&y[16])+(x[17]&y[17])) + ((x[16]&y[18])+(x[15]&y[19])) ) ) +
( ( ((x[14]&y[20])+(x[13]&y[21])) + ((x[12]&y[22])) ) ) ;
dup12 = ( ( ((x[22]&y[11])+(x[21]&y[12])) + ((x[20]&y[13])+(x[19]&y[14]))
) + ( ((x[18]&y[15])+(x[17]&y[16])) + ((x[16]&y[17])+(x[15]&y[18])) ) ) +
( ( ((x[14]&y[19])+(x[13]&y[20])) + ((x[12]&y[21])+(x[11]&y[22])) ) ) ;
dup13 = ( ( ((x[22]&y[10])+(x[21]&y[11])) + ((x[20]&y[12])+(x[19]&y[13]))
) + ( ((x[18]&y[14])+(x[17]&y[15])) + ((x[16]&y[16])+(x[15]&y[17])) ) ) +
( ( ((x[14]&y[18])+(x[13]&y[19])) + ((x[12]&y[20])+(x[11]&y[21])) ) + (
((x[10]&y[22])) ) ) ;
dup14 = ( ( ((x[22]&y[9])+(x[21]&y[10])) + ((x[20]&y[11])+(x[19]&y[12]))
) + (((x[18]&y[13])+(x[17]&y[14])) + ((x[16]&y[15])+(x[15]&y[16])) ) ) + (
( ((x[14]&y[17])+(x[13]&y[18])) + ((x[12]&y[19])+(x[11]&y[20])) ) + (
((x[10]&y[21])+(x[9]&y[22])) ) ) ;
dup15 = ( ( ((x[22]&y[8])+(x[21]&y[9])) + ((x[20]&y[10])+(x[19]&y[11])) )
+ ( ((x[18]&y[12])+(x[17]&y[13])) + ((x[16]&y[14])+(x[15]&y[15])) ) ) + (
( ((x[14]&y[16])+(x[13]&y[17])) + ((x[12]&y[18])+(x[11]&y[19])) ) + (
((x[10]&y[20])+(x[9]&y[21])) + ((x[8]&y[22])) ) ) ;
dup16 = ( ( ( ((x[22]&y[7])+(x[21]&y[8])) + ((x[20]&y[9])+(x[19]&y[10]))
) + (((x[18]&y[11])+(x[17]&y[12])) + ((x[16]&y[13])+(x[15]&y[14])) ) ) + (
( ((x[14]&y[15])+(x[13]&y[16])) + ((x[12]&y[17])+(x[11]&y[18])) ) + (
((x[10]&y[19])+(x[9]&y[20])) + ((x[8]&y[21])+(x[7]&y[22])) ) ) ) ;
dup17 = ( ( ( ((x[22]&y[6])+(x[21]&y[7])) + ((x[20]&y[8])+(x[19]&y[9])) )
+ ( ((x[18]&y[10])+(x[17]&y[11])) + ((x[16]&y[12])+(x[15]&y[13])) ) ) + (
( ((x[14]&y[14])+(x[13]&y[15])) + ((x[12]&y[16])+(x[11]&y[17])) ) + (
((x[10]&y[18])+(x[9]&y[19])) + ((x[8]&y[20])+(x[7]&y[21])) ) ) ) + ( ( (
((x[6]&y[22])) ) ) ) ;
dup18 = ( ( ( ((x[22]&y[5])+(x[21]&y[6])) + ((x[20]&y[7])+(x[19]&y[8])) )
+ ( ((x[18]&y[9])+(x[17]&y[10])) + ((x[16]&y[11])+(x[15]&y[12])) ) ) + ( (
((x[14]&y[13])+(x[13]&y[14])) + ((x[12]&y[15])+(x[11]&y[16])) ) + (
((x[10]&y[17])+(x[9]&y[18])) + ((x[8]&y[19])+(x[7]&y[20])) ) ) ) + ( ( (
((x[6]&y[21])+(x[5]&y[22])) ) ) ) ;
dup19 = ( ( ( ((x[22]&y[4])+(x[21]&y[5])) + ((x[20]&y[6])+(x[19]&y[7])) )
+ ( ((x[18]&y[8])+(x[17]&y[9])) + ((x[16]&y[10])+(x[15]&y[11])) ) ) + ( (
((x[14]&y[12])+(x[13]&y[13])) + ((x[12]&y[14])+(x[11]&y[15])) ) + (
((x[10]&y[16])+(x[9]&y[17])) + ((x[8]&y[18])+(x[7]&y[19])) ) ) ) + ( ( (
((x[6]&y[20])+(x[5]&y[21])) +((x[4]&y[22])) ) ) ) ;
dup20 = ( ( ( ((x[22]&y[3])+(x[21]&y[4])) + ((x[20]&y[5])+(x[19]&y[6])) )
+ ( ((x[18]&y[7])+(x[17]&y[8])) + ((x[16]&y[9])+(x[15]&y[10])) ) ) + ( (
((x[14]&y[11])+(x[13]&y[12])) + ((x[12]&y[13])+(x[11]&y[14])) ) + (
((x[10]&y[15])+(x[9]&y[16])) + ((x[8]&y[17])+(x[7]&y[18])) ) ) ) + ( ( (
((x[6]&y[19])+(x[5]&y[20])) + ((x[4]&y[21])+(x[3]&y[22])) ) ) ) ;
dup21 = ( ( ( ((x[22]&y[2])+(x[21]&y[3])) + ((x[20]&y[4])+(x[19]&y[5])) )
+ ( ((x[18]&y[6])+(x[17]&y[7])) + ((x[16]&y[8])+(x[15]&y[9])) ) ) + ( (
((x[14]&y[10])+(x[13]&y[11])) + ((x[12]&y[12])+(x[11]&y[13])) ) + (
((x[10]&y[14])+(x[9]&y[15])) + ((x[8]&y[16])+(x[7]&y[17])) ) ) ) + ( ( (
((x[6]&y[18])+(x[5]&y[19])) + ((x[4]&y[20])+(x[3]&y[21])) ) + (
((x[2]&y[22])) ) ) ) ;
dup22 = ( ( ( ((x[22]&y[1])+(x[21]&y[2])) + ((x[20]&y[3])+(x[19]&y[4])) )
+ ( ((x[18]&y[5])+(x[17]&y[6])) + ((x[16]&y[7])+(x[15]&y[8])) ) ) + ( (
((x[14]&y[9])+(x[13]&y[10])) + ((x[12]&y[11])+(x[11]&y[12])) ) + (
((x[10]&y[13])+(x[9]&y[14])) + ((x[8]&y[15])+(x[7]&y[16])) ) ) ) + ( ( (

117

((x[6]&y[17])+(x[5]&y[18])) + ((x[4]&y[19])+(x[3]&y[20])) ) + (
((x[2]&y[21])+(x[1]&y[22])) ) ) ) ;
dup23 = ( ( ( ((x[22]&y[0])+(x[21]&y[1])) + ((x[20]&y[2])+(x[19]&y[3]))
+ ( ((x[18]&y[4])+(x[17]&y[5])) + ((x[16]&y[6])+(x[15]&y[7])) ) ) + ( (
((x[14]&y[8])+(x[13]&y[9])) + ((x[12]&y[10])+(x[11]&y[11])) ) + (
((x[10]&y[12])+(x[9]&y[13])) + ((x[8]&y[14])+(x[7]&y[15])) ) ) ) + ( ( (
((x[6]&y[16])+(x[5]&y[17])) + ((x[4]&y[18])+(x[3]&y[19])) ) + (
((x[2]&y[20])+(x[1]&y[21])) + ((x[0]&y[22])) ) ) ) ;
dup24 = ( ( ( ((x[21]&y[0])+(x[20]&y[1])) + ((x[19]&y[2])+(x[18]&y[3]))
+ ( ((x[17]&y[4])+(x[16]&y[5])) + ((x[15]&y[6])+(x[14]&y[7])) ) ) + ( (
((x[13]&y[8])+(x[12]&y[9])) + ((x[11]&y[10])+(x[10]&y[11])) ) + (
((x[9]&y[12])+(x[8]&y[13])) + ((x[7]&y[14])+(x[6]&y[15])) ) ) ) + ( ( (
((x[5]&y[16])+(x[4]&y[17])) + ((x[3]&y[18])+(x[2]&y[19])) ) + (
((x[1]&y[20])+(x[0]&y[21])) ) ) ) ;
dup25 = ( ( ( ((x[20]&y[0])+(x[19]&y[1])) + ((x[18]&y[2])+(x[17]&y[3]))
+ ( ((x[16]&y[4])+(x[15]&y[5])) + ((x[14]&y[6])+(x[13]&y[7])) ) ) + ( (
((x[12]&y[8])+(x[11]&y[9])) + ((x[10]&y[10])+(x[9]&y[11])) ) + (
((x[8]&y[12])+(x[7]&y[13]))+ ((x[6]&y[14])+(x[5]&y[15])) ) ) ) + ( ( (
((x[4]&y[16])+(x[3]&y[17])) + ((x[2]&y[18])+(x[1]&y[19])) ) + (
((x[0]&y[20])) ) ) ) ;
dup26 = ( ( ( ((x[19]&y[0])+(x[18]&y[1])) + ((x[17]&y[2])+(x[16]&y[3]))
+ ( ((x[15]&y[4])+(x[14]&y[5])) + ((x[13]&y[6])+(x[12]&y[7])) ) ) + ( (
((x[11]&y[8])+(x[10]&y[9])) + ((x[9]&y[10])+(x[8]&y[11])) ) + (
((x[7]&y[12])+(x[6]&y[13])) + ((x[5]&y[14])+(x[4]&y[15])) ) ) ) + ( ( (
((x[3]&y[16])+(x[2]&y[17])) + ((x[1]&y[18])+(x[0]&y[19])) ) ) ) ;
dup27 = ( ( ( ((x[18]&y[0])+(x[17]&y[1])) + ((x[16]&y[2])+(x[15]&y[3]))
+ ( ((x[14]&y[4])+(x[13]&y[5])) + ((x[12]&y[6])+(x[11]&y[7])) ) ) + ( (
((x[10]&y[8])+(x[9]&y[9])) + ((x[8]&y[10])+(x[7]&y[11])) ) + (
((x[6]&y[12])+(x[5]&y[13])) +((x[4]&y[14])+(x[3]&y[15])) ) ) ) + ( ( (
((x[2]&y[16])+(x[1]&y[17])) + ((x[0]&y[18])) ) ) ) ;
dup28 = ( ( ( ((x[17]&y[0])+(x[16]&y[1])) + ((x[15]&y[2])+(x[14]&y[3]))
+ ( ((x[13]&y[4])+(x[12]&y[5])) + ((x[11]&y[6])+(x[10]&y[7])) ) ) + ( (
((x[9]&y[8])+(x[8]&y[9])) + ((x[7]&y[10])+(x[6]&y[11])) ) + (
((x[5]&y[12])+(x[4]&y[13])) + ((x[3]&y[14])+(x[2]&y[15])) ) ) ) + ( ( (
((x[1]&y[16])+(x[0]&y[17])) ) ) ) ;
dup29 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3]))
+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) + ( ( (
((x[0]&y[16])) ) ) ) ;
dup30 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3]))
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup31 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) )
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup32 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) )
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;

118

dup33 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +


( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup34 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup35 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup36 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup37 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup38 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup39 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup40 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup41 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup42 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup43 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup44 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup45 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;
levela14;
levela14a;
levela15;
levela15a;
levela16;
levela16a;
levela17;

119

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela17a;
levela18;
levela18a;
levela19;
levela19a;
levela20;
levela20a;
levela21;
levela21a;
levela22;
levela22a;
levela23;
levela23a;
levela24;
levela24a;
levela25;
levela25a;
levela26;
levela26a;
levela27;
levela28;
levela29;
levela30;
levela31;
levela32;
levela33;
levela34;
levela35;
levela36;
levela37;
levela38;
levela39;
levela40;
levela41;
levela42;
levela43;
levela44;
levela45;

always@(*) begin
levela1= dup1 + dup2[1] ;
levela2= dup2[0] + dup3[1] + dup4[2] ;
levela3= dup3[0] + dup4[1] + dup5[2] ;
levela4= dup4[0] + dup5[1] + dup6[2] ;
levela5= dup5[0] + dup6[1] + dup7[2] ;
levela6= dup6[0] + dup7[1] + dup8[2] ;
levela7= dup7[0] + dup8[1] + dup9[2] ;
levela8= dup8[0] + dup9[1] + dup10[2] ;
levela9= dup9[0] + dup10[1] + dup11[2] ;
levela10= dup10[0] + dup11[1] + dup12[2] ;
levela11= dup11[0] + dup12[1] + dup13[2] ;
levela12= dup12[0] + dup13[1] + dup14[2] ;
levela12a= dup15[3] + dup16[4] ;

120

levela13= dup13[0] + dup14[1] + dup15[2]


levela13a= dup16[3] + dup17[4] ;
levela14= dup14[0] + dup15[1] + dup16[2]
levela14a= dup17[3] + dup18[4] ;
levela15= dup15[0] + dup16[1] + dup17[2]
levela15a= dup18[3] + dup19[4] ;
levela16= dup16[0] + dup17[1] + dup18[2]
levela16a= dup19[3] + dup20[4] ;
levela17= dup17[0] + dup18[1] + dup19[2]
levela17a= dup20[3] + dup21[4] ;
levela18= dup18[0] + dup19[1] + dup20[2]
levela18a= dup21[3] + dup22[4] ;
levela19= dup19[0] + dup20[1] + dup21[2]
levela19a= dup22[3] + dup23[4] ;
levela20= dup20[0] + dup21[1] + dup22[2]
levela20a= dup23[3] + dup24[4] ;
levela21= dup21[0] + dup22[1] + dup23[2]
levela21a= dup24[3] + dup25[4] ;
levela22= dup22[0] + dup23[1] + dup24[2]
levela22a= dup25[3] + dup26[4] ;
levela23= dup23[0] + dup24[1] + dup25[2]
levela23a= dup26[3] + dup27[4] ;
levela24= dup24[0] + dup25[1] + dup26[2]
levela24a= dup27[3] + dup28[4] ;
levela25= dup25[0] + dup26[1] + dup27[2]
levela25a= dup28[3] + dup29[4] ;
levela26= dup26[0] + dup27[1] + dup28[2]
levela26a= dup29[3] + dup30[4] ;
levela27= dup27[0] + dup28[1] + dup29[2]
levela28= dup28[0] + dup29[1] + dup30[2]
levela29= dup29[0] + dup30[1] + dup31[2]
levela30= dup30[0] + dup31[1] + dup32[2]
levela31= dup31[0] + dup32[1] + dup33[2]
levela32= dup32[0] + dup33[1] + dup34[2]
levela33= dup33[0] + dup34[1] + dup35[2]
levela34= dup34[0] + dup35[1] + dup36[2]
levela35= dup35[0] + dup36[1] + dup37[2]
levela36= dup36[0] + dup37[1] + dup38[2]
levela37= dup37[0] + dup38[1] + dup39[2]
levela38= dup38[0] + dup39[1] + dup40[2]
levela39= dup39[0] + dup40[1] + dup41[2]
levela40= dup40[0] + dup41[1] + dup42[2]
levela41= dup41[0] + dup42[1] ;
levela42= dup42[0] + dup43[1] ;
levela43= dup43[0] + dup44[1] ;
levela44= dup44[0] ;
levela45= dup45 ;
end
reg
reg
reg

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

[1:0] levelb1;
[1:0] levelb2;
[1:0] levelb3;

121

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

always@(*)
levelb1= (
levelb2= (
levelb3= (
levelb4= (
levelb5= (
levelb6= (
levelb7= (
levelb8= (
levelb9= (

levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;
levelb34;
levelb35;
levelb36;
levelb37;
levelb38;
levelb39;
levelb40;
levelb41;
levelb42;
levelb43;
levelb44;
levelb45;

begin
levela1[0]
levela2[0]
levela3[0]
levela4[0]
levela5[0]
levela6[0]
levela7[0]
levela8[0]
levela9[0]

+
+
+
+
+
+
+
+
+

levela2[1] ) ;
levela3[1] ) ;
levela4[1] ) ;
levela5[1] ) ;
levela6[1] + dup8[3] ) ;
levela7[1] + dup9[3] ) ;
levela8[1] + dup10[3] ) ;
levela9[1] + dup11[3] ) ;
levela10[1] + dup12[3] ) ;

122

levelb10=
levelb11=
levelb12=
levelb13=
levelb14=
levelb15=
levelb16=
levelb17=
levelb18=
levelb19=
levelb20=
levelb21=
levelb22=
levelb23=
levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
levelb33=
levelb34=
levelb35=
levelb36=
levelb37=
levelb38=
levelb39=
levelb40=
levelb41=
levelb42=
levelb43=
levelb44=
levelb45=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

( levela10[0]
( levela11[0]
( levela12[0]
( levela13[0]
( levela14[0]
( levela15[0]
( levela16[0]
( levela17[0]
( levela18[0]
( levela19[0]
( levela20[0]
( levela21[0]
( levela22[0]
( levela23[0]
( levela24[0]
( levela25[0]
( levela26[0]
( levela27[0]
( levela28[0]
( levela29[0]
( levela30[0]
( levela31[0]
( levela32[0]
( levela33[0]
( levela34[0]
( levela35[0]
( levela36[0]
( levela37[0]
( levela38[0]
( levela39[0]
( levela40[0]
( levela41[0]
( levela42[0]
levela43[0] ;
levela44 ;
levela45 ;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

levela11[1] + dup13[3] ) ;
levela12[1] + dup14[3] ) ;
levela13[1] + levela12a[0]
levela14[1] + levela13a[0]
levela15[1] + levela14a[0]
levela16[1] + levela15a[0]
levela17[1] + levela16a[0]
levela18[1] + levela17a[0]
levela19[1] + levela18a[0]
levela20[1] + levela19a[0]
levela21[1] + levela20a[0]
levela22[1] + levela21a[0]
levela23[1] + levela22a[0]
levela24[1] + levela23a[0]
levela25[1] + levela24a[0]
levela26[1] + levela25a[0]
levela27[1] + levela26a[0]
levela28[1] + dup30[3] ) ;
levela29[1] + dup31[3] ) ;
levela30[1] + dup32[3] ) ;
levela31[1] + dup33[3] ) ;
levela32[1] + dup34[3] ) ;
levela33[1] + dup35[3] ) ;
levela34[1] + dup36[3] ) ;
levela35[1] + dup37[3] ) ;
levela36[1] + dup38[3] ) ;
levela37[1]) ;
levela38[1]) ;
levela39[1]) ;
levela40[1]) ;
levela41[1]) ;
levela42[1]) ;
levela43[1]) ;

)
)
)
)
)
)
)
)
)
)
)
)
)
)
)

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;

123

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;
levelc33;
levelc34;
levelc35;
levelc36;
levelc37;
levelc38;
levelc39;
levelc40;
levelc41;
levelc42;
levelc43;
levelc44;
levelc45;
levelc46;

always@(*) begin
levelc1= levela1[1] | levelb1[1];
levelc2= levelb1[0] + levelb2[1] ;
levelc3= levelb2[0] + levelb3[1] ;
levelc4= levelb3[0] + levelb4[1] ;
levelc5= levelb4[0] + levelb5[1] ;
levelc6= levelb5[0] + levelb6[1] ;
levelc7= levelb6[0] + levelb7[1] ;
levelc8=
levelb7[0] + levelb8[1] ;
levelc9=
levelb8[0] + levelb9[1] ;
levelc10=
levelb9[0] + levelb10[1]
levelc11= levelb10[0] + levelb11[1]
levelc12= levelb11[0] + levelb12[1]
levelc13= levelb12[0] + levelb13[1]
levelc14= levelb13[0] + levelb14[1]
levelc15= levelb14[0] + levelb15[1]
levelc16= levelb15[0] + levelb16[1]
levelc17= levelb16[0] + levelb17[1]
levelc18= levelb17[0] + levelb18[1]
levelc19= levelb18[0] + levelb19[1]
levelc20= levelb19[0] + levelb20[1]

;
;
+
+
+
+
+
+
+
+
+

levela12a[1]
levela13a[1]
levela14a[1]
levela15a[1]
levela16a[1]
levela17a[1]
levela18a[1]
levela19a[1]
levela20a[1]

;
;
;
;
;
;
;
;
;

124

levelc21= levelb20[0]
levelc22= levelb21[0]
levelc23= levelb22[0]
levelc24= levelb23[0]
levelc25= levelb24[0]
levelc26= levelb25[0]
levelc27= levelb26[0]
levelc28= levelb27[0]
levelc29= levelb28[0]
levelc30= levelb29[0]
levelc31= levelb30[0]
levelc32= levelb31[0]
levelc33= levelb32[0]
levelc34= levelb33[0]
levelc35= levelb34[0]
levelc36= levelb35[0]
levelc37= levelb36[0]
levelc38= levelb37[0]
levelc39= levelb38[0]
levelc40= levelb39[0]
levelc41= levelb40[0]
levelc42= levelb41[0]
levelc43= levelb42[0]
levelc44= levelb43 ;
levelc45= levelb44 ;
levelc46= levelb45 ;
end

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
;

levelb21[1]
levelb22[1]
levelb23[1]
levelb24[1]
levelb25[1]
levelb26[1]
levelb27[1]
levelb28[1]
levelb29[1]
levelb30[1]
levelb31[1]
levelb32[1]
levelb33[1]
levelb34[1]
levelb35[1]
levelb36[1]
levelb37[1]
levelb38[1]
levelb39[1]
levelb40[1]
levelb41[1]
levelb42[1]

+
+
+
+
+
+
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

levela21a[1]
levela22a[1]
levela23a[1]
levela24a[1]
levela25a[1]
levela26a[1]

;
;
;
;
;
;

wire [45:0] p1,p2;


assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31[0],levelc32[
0],levelc33[0],levelc34[0],levelc35[0],levelc36[0],levelc37[0],levelc38[0]
,levelc39[0],levelc40[0],levelc41[0],levelc42[0],levelc43,levelc44,levelc4
5,levelc46};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],levelc31[1],levelc32[1],level
c33[1],levelc34[1],levelc35[1],levelc36[1],levelc37[1],levelc38[1],levelc3
9[1],levelc40[1],levelc41[1],levelc42[1],5'b00000};
always@(posedge clk) begin
//infer CLA
p[45:5] = p1[45:5] + p2[45:5];
p[4:0]
= p1[4:0];
end
endmodule

125

APPENDIX B Verilog Code for Squaring


8 bit Vedic-Vedic
module square_vv_8 (
input
[7:0] x,
input clk,
output reg [15:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0] dup2;
[1:0] dup3;
[2:0] dup4;
[1:0] dup41;
[2:0] dup5;
[1:0] dup51;
[2:0] dup6;
[1:0] dup61;
[2:0] dup7;
[1:0] dup71;
[3:0] dup8;
[2:0] dup81;
[2:0] dup9;
[1:0] dup91;
[2:0] dup10;
[1:0] dup101;
[2:0] dup11;
[1:0] dup111;
[2:0] dup12;
[1:0] dup121;
[1:0] dup13;
[1:0] dup14;
dup15;

always@(*) begin
dup1 =
(x[7]&x[7]);
dup2 =
{(x[7]&x[6]),1'b0} ;
dup3 =
{(x[7]&x[5]),x[6]};
dup41
=
(x[7]&x[4])+(x[6]&x[5]);
dup4 =
{dup41,1'b0};
dup51
=
((x[7]&x[3])+(x[6]&x[4]));
dup5 =
{dup51,x[5]};
dup61
=
(x[7]&x[2])+(x[6]&x[3])+(x[5]&x[4]);
dup6 =
{dup61,1'b0};
dup71
=
(x[7]&x[1])+(x[6]&x[2])+(x[5]&x[3]);
dup7 =
{dup71,x[4]};
dup81
=
((x[7]&x[0])+(x[6]&x[1])) + ((x[5]&x[2])+(x[4]&x[3]));
dup8 =
{dup81,1'b0};
dup91
=
(x[6]&x[0])+(x[5]&x[1]) + (x[4]&x[2]);
dup9 =
{dup91,x[3]};
dup101
=
(x[5]&x[0]) + (x[4]&x[1]) + (x[3]&x[2]);
dup10
=
{dup101,1'b0};
dup111
=
(x[4]&x[0])+(x[3]&x[1]);

126

dup11 =
dup121
dup12 =
dup13
dup14
dup15
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

{dup111,x[2]};
=
(x[3]&x[0])+(x[2]&x[1]);
{dup121,1'b0};
=
{(x[2]&x[0]),x[1]};
=
{(x[1]&x[0]),1'b0};
=
x[0];
levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;

always@(*) begin
levela1= (dup1 + dup2[1]) ;
levela2= ( (dup2[0] + dup3[1]) + (dup4[2]) ) ;
levela3= ( (dup3[0] + dup4[1]) + (dup5[2]) ) ;
levela4= ( (dup4[0] + dup5[1]) + (dup6[2]) ) ;
levela5= ( (dup5[0] + dup6[1]) + (dup7[2] + dup8[3]) ) ;
levela6= ( (dup6[0] + dup7[1]) + (dup8[2]) ) ;
levela7= ( (dup7[0] + dup8[1]) + (dup9[2]) ) ;
levela8= ( (dup8[0] + dup9[1]) + (dup10[2]) ) ;
levela9= ( (dup9[0] + dup10[1]) + (dup11[2]) ) ;
levela10= ( (dup10[0] + dup11[1]) + (dup12[2]) ) ;
levela11= (dup11[0] + dup12[1]) ;
levela12= (dup12[0] + dup13[1]) ;
levela13= (dup13[0] + dup14[1]) ;
levela14= (dup14[0]) ;
levela15= dup15 ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;

127

reg
reg
reg
reg
reg

[1:0]
[1:0]

levelb12;
levelb13;
levelb14;
levelb15;
levelb16;

always@(*) begin
levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= ( (levela3[0] + levela4[1]) + (levela5[2]) ) ;
levelb5= (levela4[0] + levela5[1]) ;
levelb6= (levela5[0] + levela6[1]) ;
levelb7= (levela6[0] + levela7[1]) ;
levelb8= (levela7[0] + levela8[1]) ;
levelb9= (levela8[0] + levela9[1]) ;
levelb10= (levela9[0] + levela10[1]) ;
levelb11= (levela10[0] + levela11[1]) ;
levelb12= (levela11[0] + levela12[1]) ;
levelb13= (levela12[0] + levela13[1]) ;
levelb14= (levela13[0]) ;
levelb15= levela14;
levelb16= levela15;
end
wire [15:0] p1,p2;
assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14,levelb15,levelb16};
assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],4'b0000};
always@(posedge clk) begin
//infer CLA
p[15:4] = p1[15:4] + p2[15:4];
p[3:0] = p1[3:0];
end
endmodule
8 bit Vedic-Wallace
module square_vw_8 (
input
[7:0] x,
input clk,
output reg [15:0] p
);
reg dup1;
reg [1:0] dup2;

128

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0] dup3;
[2:0] dup4;
[1:0] dup41;
[2:0] dup5;
[1:0] dup51;
[2:0] dup6;
[1:0] dup61;
[2:0] dup7;
[1:0] dup71;
[3:0] dup8;
[2:0] dup81;
[2:0] dup9;
[1:0] dup91;
[2:0] dup10;
[1:0] dup101;
[2:0] dup11;
[1:0] dup111;
[2:0] dup12;
[1:0] dup121;
[1:0] dup13;
[1:0] dup14;
dup15;

always@(*) begin
dup1 =
(x[7]&x[7]);
dup2 =
{(x[7]&x[6]),1'b0} ;
dup3 =
{(x[7]&x[5]),x[6]};
dup41
=
(x[7]&x[4])+(x[6]&x[5]);
dup4 =
{dup41,1'b0};
dup51
=
((x[7]&x[3])+(x[6]&x[4]));
dup5 =
{dup51,x[5]};
dup61
=
(x[7]&x[2])+(x[6]&x[3])+(x[5]&x[4]);
dup6 =
{dup61,1'b0};
dup71
=
(x[7]&x[1])+(x[6]&x[2])+(x[5]&x[3]);
dup7 =
{dup71,x[4]};
dup81
=
((x[7]&x[0])+(x[6]&x[1])) + ((x[5]&x[2])+(x[4]&x[3]));
dup8 =
{dup81,1'b0};
dup91
=
(x[6]&x[0])+(x[5]&x[1]) + (x[4]&x[2]);
dup9 =
{dup91,x[3]};
dup101
=
(x[5]&x[0]) + (x[4]&x[1]) + (x[3]&x[2]);
dup10
=
{dup101,1'b0};
dup111
=
(x[4]&x[0])+(x[3]&x[1]);
dup11 =
{dup111,x[2]};
dup121
=
(x[3]&x[0])+(x[2]&x[1]);
dup12 =
{dup121,1'b0};
dup13
=
{(x[2]&x[0]),x[1]};
dup14
=
{(x[1]&x[0]),1'b0};
dup15
=
x[0];
end
reg
reg
reg

[1:0]
[1:0]
[1:0]

levela1;
levela2;
levela3;

129

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;

always@(*) begin
levela1= ( dup1 + dup2[1] ) ;
levela2= ( dup2[0] + dup3[1] + dup4[2] ) ;
levela3= ( dup3[0] + dup4[1] + dup5[2] ) ;
levela4= ( dup4[0] + dup5[1] + dup6[2] ) ;
levela5= ( dup5[0] + dup6[1] + dup7[2] ) ;
levela6= ( dup6[0] + dup7[1] + dup8[2] ) ;
levela7= ( dup7[0] + dup8[1] + dup9[2] ) ;
levela8= ( dup8[0] + dup9[1] + dup10[2] ) ;
levela9= ( dup9[0] + dup10[1] + dup11[2] ) ;
levela10= ( dup10[0] + dup11[1] + dup12[2] ) ;
levela11= (dup11[0] + dup12[1]) ;
levela12= (dup12[0] + dup13[1]) ;
levela13= (dup13[0] + dup14[1]) ;
levela14= (dup14[0]) ;
levela15= dup15 ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;

always@(*) begin
levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= (levela3[0] + levela4[1]) ;

130

levelb5= (levela4[0] + levela5[1]) ;


levelb6= (levela5[0] + levela6[1]) +(dup8[3]);
levelb7= (levela6[0] + levela7[1]) ;
levelb8= (levela7[0] + levela8[1]) ;
levelb9= (levela8[0] + levela9[1]) ;
levelb10= (levela9[0] + levela10[1]) ;
levelb11= (levela10[0] + levela11[1]) ;
levelb12= (levela11[0] + levela12[1]) ;
levelb13= (levela12[0] + levela13[1]) ;
levelb14= (levela13[0]) ;
levelb15= levela14;
levelb16= levela15;
end
wire [15:0] p1,p2;
assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14,levelb15,levelb16};
assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],4'b0000};
always@(posedge clk) begin
//infer CLA
p[15:4] = p1[15:4] + p2[15:4];
p[3:0] = p1[3:0];
end
endmodule
16 bit Vedic-Vedic
module square_vv_16 (
input
[15:0] x,
input clk,
output reg [31:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;

131

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]
[1:0]

dup31;
dup41;
dup51;
dup61;
dup71;
dup81;
dup91;
dup101;
dup111;
dup121;
dup131;
dup141;
dup151;
dup161;
dup171;
dup181;
dup191;
dup201;
dup211;
dup221;
dup231;
dup241;
dup251;
dup261;
dup271;
dup281;

always@(*) begin
dup1 =
x[15];
dup2 =
{(x[15]&x[14]),1'b0};
dup3 =
{(x[15]&x[13]),x[14]};
dup41
=
(x[15]&x[12])+(x[14]&x[13]);
dup4 =
{dup41,1'b0};
dup51
=
(x[15]&x[11])+(x[14]&x[12]);
dup5 =
{dup51,x[13]};
dup61
=
(x[15]&x[10])+(x[14]&x[11])+(x[13]&x[12]);
dup6 =
{dup61,1'b0};
dup71
=
(x[15]&x[9])+(x[14]&x[10])+(x[13]&x[11]);

132

dup7 =
{dup71,x[12]};
dup81
=
((x[15]&x[8])+(x[14]&x[9])) +
((x[13]&x[10])+(x[12]&x[11]));
dup8 =
{dup81,1'b0};
dup91
=
((x[15]&x[7])+(x[14]&x[8])) +
((x[13]&x[9])+(x[12]&x[10]));
dup9 =
{dup91,x[11]};
dup101
=
((x[15]&x[6])+(x[14]&x[7])) +
((x[13]&x[8])+(x[12]&x[9])) + (x[11]&x[10]);
dup10 =
{dup101,1'b0};
dup111
=
((x[15]&x[5])+(x[14]&x[6])) +
((x[13]&x[7])+(x[12]&x[8])) + (x[11]&x[9]);
dup11 =
{dup111,x[10]};
dup121
=
((x[15]&x[4])+(x[14]&x[5])) +
((x[13]&x[6])+(x[12]&x[7]))+ ((x[11]&x[8])+(x[10]&x[9]));
dup12 =
{dup121,1'b0};
dup131
=
((x[15]&x[3])+(x[14]&x[4])) +
((x[13]&x[5])+(x[12]&x[6]))+ ((x[11]&x[7])+(x[10]&x[8]));
dup13 =
{dup131,x[9]};
dup141
=
(((x[15]&x[2])+(x[14]&x[3])) +
((x[13]&x[4])+(x[12]&x[5])) ) + (((x[11]&x[6])+(x[10]&x[7])) +
(x[9]&x[8]));
dup14 =
{dup141,1'b0};
dup151
=
(((x[15]&x[1])+(x[14]&x[2])) +
((x[13]&x[3])+(x[12]&x[4])) ) + (((x[11]&x[5])+(x[10]&x[6])) +
(x[9]&x[7]));
dup15 =
{dup151,x[8]};
dup161
=
( ((x[15]&x[0])+(x[14]&x[1])) +
((x[13]&x[2])+(x[12]&x[3]))) + ( ((x[11]&x[4])+(x[10]&x[5])) +
((x[9]&x[6])+(x[8]&x[7])) );
dup16 =
{dup161,1'b0};
dup171
=
( ((x[14]&x[0])+(x[13]&x[1])) +
((x[12]&x[2])+(x[11]&x[3])) ) + (((x[10]&x[4])+(x[9]&x[5])) +
(x[8]&x[6]));
dup17 =
{dup171,x[7]};
dup181
=
( ((x[13]&x[0])+(x[12]&x[1])) +
((x[11]&x[2])+(x[10]&x[3])) ) + ((x[9]&x[4])+(x[8]&x[5])+(x[7]&x[6]));
dup18 =
{dup181,1'b0};
dup191
=
( ((x[12]&x[0])+(x[11]&x[1])) +
((x[10]&x[2])+(x[9]&x[3])) ) + ((x[8]&x[4])+(x[7]&x[5]));
dup19 =
{dup191,x[6]};
dup201
=
( ((x[11]&x[0])+(x[10]&x[1])) +
((x[9]&x[2])+(x[8]&x[3])) ) + ((x[7]&x[4]) + (x[6]&x[5]));
dup20 =
{dup201,1'b0};
dup211
=
( ((x[10]&x[0])+(x[9]&x[1])) + ((x[8]&x[2])+(x[7]&x[3]))
) + (x[6]&x[4]);
dup21 =
{dup211,x[5]};
dup221
=
((x[9]&x[0])+(x[8]&x[1])) +
((x[7]&x[2])+(x[6]&x[3])+(x[5]&x[4]));
dup22 =
{dup221,1'b0};
dup231
=
((x[8]&x[0])+(x[7]&x[1])) + ((x[6]&x[2])+(x[5]&x[3]));
dup23 =
{dup231,x[4]};
dup241
=
((x[7]&x[0])+(x[6]&x[1]))+((x[5]&x[2])+(x[4]&x[3]));

133

dup24 =
dup251
dup25 =
dup261
dup26 =
dup271
dup27 =
dup281
dup28 =
dup29
dup30
dup31
end

{dup241,1'b0};
=
(x[6]&x[0])+(x[5]&x[1])+(x[4]&x[2]);
{dup251,x[3]};
=
(x[5]&x[0])+(x[4]&x[1])+(x[3]&x[2]);
{dup261,1'b0};
=
(x[4]&x[0])+(x[3]&x[1]);
{dup271,x[2]};
=
(x[3]&x[0])+(x[2]&x[1]);
{dup281,1'b0};
=
{(x[2]&x[0]),x[1]};
=
{(x[1]&x[0]),1'b0};
=
x[0];

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

always@(*) begin
levela1= (dup1 + dup2[1]) ;
levela2= ( (dup2[0] + dup3[1])
levela3= ( (dup3[0] + dup4[1])
levela4= ( (dup4[0] + dup5[1])
levela5= ( (dup5[0] + dup6[1])

+
+
+
+

(dup4[2]) ) ;
(dup5[2]) ) ;
(dup6[2]) ) ;
(dup7[2] + dup8[3]) ) ;

134

levela6= ( (dup6[0] + dup7[1]) + (dup8[2] + dup9[3]) ) ;


levela7= ( (dup7[0] + dup8[1]) + (dup9[2] + dup10[3]) ) ;
levela8= ( (dup8[0] + dup9[1]) + (dup10[2] + dup11[3]) ) ;
levela9= ( (dup9[0] + dup10[1]) + (dup11[2] + dup12[3]) ) ;
levela10= ( (dup10[0] + dup11[1]) + (dup12[2] + dup13[3]) ) ;
levela11= ( (dup11[0] + dup12[1]) + (dup13[2] + dup14[3]) ) ;
levela12= ( (dup12[0] + dup13[1]) + (dup14[2] + dup15[3])) + ((dup16[4]) )
;
levela13= ( (dup13[0] + dup14[1]) + (dup15[2] + dup16[3]) ) ;
levela14= ( (dup14[0] + dup15[1]) + (dup16[2] + dup17[3]) ) ;
levela15= ( (dup15[0] + dup16[1]) + (dup17[2] + dup18[3]) ) ;
levela16= ( (dup16[0] + dup17[1]) + (dup18[2] + dup19[3]) ) ;
levela17= ( (dup17[0] + dup18[1]) + (dup19[2] + dup20[3]) ) ;
levela18= ( (dup18[0] + dup19[1]) + (dup20[2] + dup21[3]) ) ;
levela19= ( (dup19[0] + dup20[1]) + (dup21[2] + dup22[3]) ) ;
levela20= ( (dup20[0] + dup21[1]) + (dup22[2] + dup23[3]) ) ;
levela21= ( (dup21[0] + dup22[1]) + (dup23[2] + dup24[3]) ) ;
levela22= ( (dup22[0] + dup23[1]) + (dup24[2]) ) ;
levela23= ( (dup23[0] + dup24[1]) + (dup25[2]) ) ;
levela24= ( (dup24[0] + dup25[1]) + (dup26[2]) ) ;
levela25= ( (dup25[0] + dup26[1]) + (dup27[2]) ) ;
levela26= ( (dup26[0] + dup27[1]) + (dup28[2]) ) ;
levela27= (dup27[0] + dup28[1]) ;
levela28= (dup28[0] + dup29[1]) ;
levela29= (dup29[0] + dup30[1]) ;
levela30= (dup30[0]) ;
levela31= (dup31) ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;

135

reg
reg
reg
reg
reg
reg
reg
reg

[2:0]
[2:0]
[2:0]
[2:0]
[1:0]

levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;

always@(*) begin
levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= ( (levela3[0] + levela4[1]) + (levela5[2]) ) ;
levelb5= ( (levela4[0] + levela5[1]) + (levela6[2]) ) ;
levelb6= ( (levela5[0] + levela6[1]) + (levela7[2]) ) ;
levelb7= ( (levela6[0] + levela7[1]) + (levela8[2]) ) ;
levelb8= ( (levela7[0] + levela8[1]) + (levela9[2]) ) ;
levelb9= ( (levela8[0] + levela9[1]) + (levela10[2]) ) ;
levelb10= ( (levela9[0] + levela10[1]) + (levela11[2]) ) ;
levelb11= ( (levela10[0] + levela11[1]) + (levela12[2]) ) ;
levelb12= ( (levela11[0] + levela12[1]) + (levela13[2]) ) ;
levelb13= ( (levela12[0] + levela13[1]) + (levela14[2]) ) ;
levelb14= ( (levela13[0] + levela14[1]) + (levela15[2]) ) ;
levelb15= ( (levela14[0] + levela15[1]) + (levela16[2]) ) ;
levelb16= ( (levela15[0] + levela16[1]) + (levela17[2]) ) ;
levelb17= ( (levela16[0] + levela17[1]) + (levela18[2]) ) ;
levelb18= ( (levela17[0] + levela18[1]) + (levela19[2]) ) ;
levelb19= ( (levela18[0] + levela19[1]) + (levela20[2]) ) ;
levelb20= ( (levela19[0] + levela20[1]) + (levela21[2]) ) ;
levelb21= (levela20[0] + levela21[1]) ;
levelb22= (levela21[0] + levela22[1]) ;
levelb23= (levela22[0] + levela23[1]) ;
levelb24= (levela23[0] + levela24[1]) ;
levelb25= (levela24[0] + levela25[1]) ;
levelb26= (levela25[0] + levela26[1]) ;
levelb27= (levela26[0] + levela27[1]) ;
levelb28= (levela27[0] + levela28[1]) ;
levelb29= (levela28[0] + levela29[1]) ;
levelb30= (levela29[0]) ;
levelb31= (levela30) ;
levelb32= (levela31) ;
end
wire [31:0] p1,p2;
assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14[0],levelb15[0],levelb16[0],levelb17[0],levelb18[0],levelb19[0],level
b20[0],
levelb21[0],levelb22[0],levelb23[0],levelb24[0],levelb25[0],levelb26
[0],levelb27[0],levelb28[0],levelb29[0],levelb30,levelb31,levelb32};

136

assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],levelb14[1]
,levelb15[1],levelb16[1],levelb17[1],levelb18[1],levelb19[1],levelb20[1],l
evelb21[1],levelb22[1],levelb23[1],levelb24[1],levelb25[1],levelb26[1],lev
elb27[1],levelb28[1],levelb29[1],4'b0000};
always@(posedge clk) begin
//infer cla
p[31:4] = p1[31:4] + p2[31:4];
p[3:0] = p1[3:0];
end
endmodule
16 bit Vedic-Wallace
module square_vw_16 (
input
[15:0] x,
input clk,
output reg [31:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;

137

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]
[1:0]

dup41;
dup51;
dup61;
dup71;
dup81;
dup91;
dup101;
dup111;
dup121;
dup131;
dup141;
dup151;
dup161;
dup171;
dup181;
dup191;
dup201;
dup211;
dup221;
dup231;
dup241;
dup251;
dup261;
dup271;
dup281;

always@(*) begin
dup1 =
x[15];
dup2 =
{(x[15]&x[14]),1'b0};
dup3 =
{(x[15]&x[13]),x[14]};
dup41
=
(x[15]&x[12])+(x[14]&x[13]);
dup4 =
{dup41,1'b0};
dup51
=
(x[15]&x[11])+(x[14]&x[12]);
dup5 =
{dup51,x[13]};
dup61
=
(x[15]&x[10])+(x[14]&x[11])+(x[13]&x[12]);
dup6 =
{dup61,1'b0};
dup71
=
(x[15]&x[9])+(x[14]&x[10])+(x[13]&x[11]);
dup7 =
{dup71,x[12]};
dup81
=
((x[15]&x[8])+(x[14]&x[9])) +
((x[13]&x[10])+(x[12]&x[11]));
dup8 =
{dup81,1'b0};
dup91
=
((x[15]&x[7])+(x[14]&x[8])) +
((x[13]&x[9])+(x[12]&x[10]));
dup9 =
{dup91,x[11]};
dup101
=
((x[15]&x[6])+(x[14]&x[7])) +
((x[13]&x[8])+(x[12]&x[9])) + (x[11]&x[10]);
dup10 =
{dup101,1'b0};
dup111
=
((x[15]&x[5])+(x[14]&x[6])) +
((x[13]&x[7])+(x[12]&x[8])) + (x[11]&x[9]);
dup11 =
{dup111,x[10]};
dup121
=
((x[15]&x[4])+(x[14]&x[5])) +
((x[13]&x[6])+(x[12]&x[7]))+ ((x[11]&x[8])+(x[10]&x[9]));
dup12 =
{dup121,1'b0};

138

dup131
=
((x[15]&x[3])+(x[14]&x[4])) +
((x[13]&x[5])+(x[12]&x[6]))+ ((x[11]&x[7])+(x[10]&x[8]));
dup13 =
{dup131,x[9]};
dup141
=
(((x[15]&x[2])+(x[14]&x[3])) +
((x[13]&x[4])+(x[12]&x[5])) ) + (((x[11]&x[6])+(x[10]&x[7])) +
(x[9]&x[8]));
dup14 =
{dup141,1'b0};
dup151
=
(((x[15]&x[1])+(x[14]&x[2])) +
((x[13]&x[3])+(x[12]&x[4])) ) + (((x[11]&x[5])+(x[10]&x[6])) +
(x[9]&x[7]));
dup15 =
{dup151,x[8]};
dup161
=
( ((x[15]&x[0])+(x[14]&x[1])) +
((x[13]&x[2])+(x[12]&x[3]))) + ( ((x[11]&x[4])+(x[10]&x[5])) +
((x[9]&x[6])+(x[8]&x[7])) );
dup16 =
{dup161,1'b0};
dup171
=
( ((x[14]&x[0])+(x[13]&x[1])) +
((x[12]&x[2])+(x[11]&x[3])) ) + (((x[10]&x[4])+(x[9]&x[5])) +
(x[8]&x[6]));
dup17 =
{dup171,x[7]};
dup181
=
( ((x[13]&x[0])+(x[12]&x[1])) +
((x[11]&x[2])+(x[10]&x[3])) ) + ((x[9]&x[4])+(x[8]&x[5])+(x[7]&x[6]));
dup18 =
{dup181,1'b0};
dup191
=
( ((x[12]&x[0])+(x[11]&x[1])) +
((x[10]&x[2])+(x[9]&x[3])) ) + ((x[8]&x[4])+(x[7]&x[5]));
dup19 =
{dup191,x[6]};
dup201
=
( ((x[11]&x[0])+(x[10]&x[1])) +
((x[9]&x[2])+(x[8]&x[3])) ) + ((x[7]&x[4]) + (x[6]&x[5]));
dup20 =
{dup201,1'b0};
dup211
=
( ((x[10]&x[0])+(x[9]&x[1])) + ((x[8]&x[2])+(x[7]&x[3]))
) + (x[6]&x[4]);
dup21 =
{dup211,x[5]};
dup221
=
((x[9]&x[0])+(x[8]&x[1])) +
((x[7]&x[2])+(x[6]&x[3])+(x[5]&x[4]));
dup22 =
{dup221,1'b0};
dup231
=
((x[8]&x[0])+(x[7]&x[1])) + ((x[6]&x[2])+(x[5]&x[3]));
dup23 =
{dup231,x[4]};
dup241
=
((x[7]&x[0])+(x[6]&x[1]))+((x[5]&x[2])+(x[4]&x[3]));
dup24 =
{dup241,1'b0};
dup251
=
(x[6]&x[0])+(x[5]&x[1])+(x[4]&x[2]);
dup25 =
{dup251,x[3]};
dup261
=
(x[5]&x[0])+(x[4]&x[1])+(x[3]&x[2]);
dup26 =
{dup261,1'b0};
dup271
=
(x[4]&x[0])+(x[3]&x[1]);
dup27 =
{dup271,x[2]};
dup281
=
(x[3]&x[0])+(x[2]&x[1]);
dup28 =
{dup281,1'b0};
dup29
=
{(x[2]&x[0]),x[1]};
dup30
=
{(x[1]&x[0]),1'b0};
dup31
=
x[0];
end
reg
reg

[1:0] levela1;
[1:0] levela2;

139

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;

140

levela20=
levela21=
levela22=
levela23=
levela24=
levela25=
levela26=
levela27=
levela28=
levela29=
levela30=
levela31=
end

(
(
(
(
(
(
(
(
(
(
(
(

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

dup20[0]
dup21[0]
dup22[0]
dup23[0]
dup24[0]
dup25[0]
dup26[0]
dup27[0]
dup28[0]
dup29[0]
dup30[0]
dup31) ;

+
+
+
+
+
+
+
+
+
+
)

dup21[1]
dup22[1]
dup23[1]
dup24[1]
dup25[1]
dup26[1]
dup27[1]
dup28[1]
dup29[1]
dup30[1]
;

+
+
+
+
+
+
+
)
)
)

dup22[2]
dup23[2]
dup24[2]
dup25[2]
dup26[2]
dup27[2]
dup28[2]
;
;
;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1])
levelb3=
( levela2[0] + levela3[1])
levelb4=
( levela3[0] + levela4[1])
levelb5=
( levela4[0] + levela5[1])

)
)
)
)
)
)
)

;
;
;
;
;
;
;

;
;
;
;

141

levelb6=
levelb7=
levelb8=
levelb9=
levelb10=
levelb11=
levelb12=
levelb13=
levelb14=
levelb15=
levelb16=
levelb17=
levelb18=
levelb19=
levelb20=
levelb21=
levelb22=
levelb23=
levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

( levela5[0] + levela6[1] + dup8[3] ) ;


( levela6[0] + levela7[1] + dup9[3] ) ;
( levela7[0] + levela8[1] + dup10[3] ) ;
( levela8[0] + levela9[1] + dup11[3] ) ;
( levela9[0] + levela10[1] + dup12[3] ) ;
( levela10[0] + levela11[1] + dup13[3] ) ;
( levela11[0] + levela12[1] + dup14[3] ) ;
( levela12[0] + levela13[1] + levela12a[0] ) ;
( levela13[0] + levela14[1] + dup16[3] ) ;
( levela14[0] + levela15[1] + dup17[3] ) ;
( levela15[0] + levela16[1] + dup18[3] ) ;
( levela16[0] + levela17[1] + dup19[3] ) ;
( levela17[0] + levela18[1] + dup20[3] ) ;
( levela18[0] + levela19[1] + dup21[3] ) ;
( levela19[0] + levela20[1] + dup22[3] ) ;
( levela20[0] + levela21[1] + dup23[3] ) ;
( levela21[0] + levela22[1] + dup24[3] ) ;
(levela22[0] + levela23[1]) ;
(levela23[0] + levela24[1]) ;
(levela24[0] + levela25[1]) ;
(levela25[0] + levela26[1]) ;
(levela26[0] + levela27[1]) ;
(levela27[0] + levela28[1]) ;
(levela28[0] + levela29[1]) ;
(levela29[0]) ;
(levela30) ;
(levela31) ;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;

142

reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );
levelc8=
( levelb8[0] + levelb9[1] );
levelc9=
( levelb9[0] + levelb10[1] );
levelc10=
( levelb10[0] + levelb11[1] );
levelc11=
( levelb11[0] + levelb12[1] );
levelc12=
( levelb12[0] + levelb13[1] + levela12a[1]);
levelc13=
( levelb13[0] + levelb14[1] );
levelc14=
( levelb14[0] + levelb15[1] );
levelc15=
( levelb15[0] + levelb16[1] );
levelc16=
( levelb16[0] + levelb17[1] );
levelc17=
( levelb17[0] + levelb18[1] );
levelc18=
( levelb18[0] + levelb19[1] );
levelc19=
( levelb19[0] + levelb20[1] );
levelc20=
( levelb20[0] + levelb21[1] );
levelc21=
( levelb21[0] + levelb22[1] );
levelc22=
(levelb22[0] + levelb23[1]) ;
levelc23=
(levelb23[0] + levelb24[1]) ;
levelc24=
(levelb24[0] + levelb25[1]) ;
levelc25=
(levelb25[0] + levelb26[1]) ;
levelc26=
(levelb26[0] + levelb27[1]) ;
levelc27=
(levelb27[0] + levelb28[1]) ;
levelc28=
(levelb28[0] + levelb29[1]) ;
levelc29=
(levelb29[0]) ;
levelc30=
(levelb30) ;
levelc31=
(levelb31) ;
levelc32=
(levelb32) ;
end
wire [31:0] p1,p2;
assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],

143

levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc26
[0],levelc27[0],levelc28[0],levelc29[0],levelc30,levelc31,levelc32};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],4'b0000};
always@(posedge clk) begin
//infer CLA
p[31:4] = p1[31:4] + p2[31:4];
p[3:0] = p1[3:0];
end
endmodule
23 bit Vedic-Vedic
module square_vv_23 (
input
[22:0] x,
input clk,
output reg [45:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;

144

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]

dup30;
dup31;
dup32;
dup33;
dup34;
dup35;
dup36;
dup37;
dup38;
dup39;
dup40;
dup41;
dup42;
dup43;
dup44;
dup45;
dup46;
dup410;
dup51;
dup61;
dup71;
dup81;
dup91;
dup101;
dup111;
dup121;
dup131;
dup141;
dup151;
dup161;
dup171;
dup181;
dup191;
dup201;
dup211;
dup221;
dup231;
dup241;
dup251;
dup261;
dup271;
dup281;
dup291;
dup301;
dup311;
dup321;
dup331;
dup341;
dup351;
dup361;
dup371;
dup381;

145

reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]

dup391;
dup401;
dup411;
dup421;

always@(*) begin
dup1 =
x[22];
dup2 =
{(x[22]&x[21]),1'b0};
dup3 =
{(x[22]&x[20]),x[21]};
dup410
=
(x[22]&x[19])+(x[21]&x[20]);
dup4 =
{dup410,1'b0};
dup51
=
(x[22]&x[18])+(x[21]&x[19]);
dup5 =
{dup51,x[20]};
dup61
=
(x[22]&x[17])+(x[21]&x[18])+(x[20]&x[19]);
dup6 =
{dup61,1'b0};
dup71
=
(x[22]&x[16])+(x[21]&x[17])+(x[20]&x[18]);
dup7 =
{dup71,x[19]};
dup81
=
((x[22]&x[15])+(x[21]&x[16])) +
((x[20]&x[17])+(x[19]&x[18]));
dup8 =
{dup81,1'b0};
dup91
=
((x[22]&x[14])+(x[21]&x[15])) +
((x[20]&x[16])+(x[19]&x[17]));
dup9 =
{dup91,x[18]};
dup101
=
((x[22]&x[13])+(x[21]&x[14])) +
((x[20]&x[15])+(x[19]&x[16])+(x[18]&x[17]));
dup10 =
{dup101,1'b0};
dup111
=
((x[22]&x[12])+(x[21]&x[13])) +
((x[20]&x[14])+(x[19]&x[15])+(x[18]&x[16]));
dup11 =
{dup111,x[17]};
dup121
=
((x[22]&x[11])+(x[21]&x[12])) +
((x[20]&x[13])+(x[19]&x[14])) + ((x[18]&x[15])+(x[17]&x[16]));
dup12 =
{dup121,1'b0};
dup131
=
((x[22]&x[10])+(x[21]&x[11])) +
((x[20]&x[12])+(x[19]&x[13]))+((x[18]&x[14])+(x[17]&x[15]));
dup13 =
{dup131,x[16]};
dup141
=
(((x[22]&x[9])+(x[21]&x[10])) +
((x[20]&x[11])+(x[19]&x[12]))) + (((x[18]&x[13])+(x[17]&x[14])) +
(x[16]&x[15]));
dup14 =
{dup141,1'b0};
dup151
=
(((x[22]&x[8])+(x[21]&x[9])) +
((x[20]&x[10])+(x[19]&x[11]))) + (((x[18]&x[12])+(x[17]&x[13])) +
(x[16]&x[14]));
dup15 =
{dup151,x[15]};
dup161
=
(((x[22]&x[7])+(x[21]&x[8])) +
((x[20]&x[9])+(x[19]&x[10]))) + (((x[18]&x[11])+(x[17]&x[12])) +
((x[16]&x[13])+(x[15]&x[14])));
dup16 =
{dup161,1'b0};
dup171
=
(((x[22]&x[6])+(x[21]&x[7])) +
((x[20]&x[8])+(x[19]&x[9]))) + (((x[18]&x[10])+(x[17]&x[11])) +
((x[16]&x[12])+(x[15]&x[13])));
dup17 =
{dup171,x[14]};

146

dup181
=
((((x[22]&x[5])+(x[21]&x[6])) +
((x[20]&x[7])+(x[19]&x[8]))) + (((x[18]&x[9])+(x[17]&x[10])) +
((x[16]&x[11])+(x[15]&x[12])))) + (x[14]&x[13]);
dup18 =
{dup181,1'b0};
dup191
=
((((x[22]&x[4])+(x[21]&x[5])) +
((x[20]&x[6])+(x[19]&x[7]))) + (((x[18]&x[8])+(x[17]&x[9])) +
((x[16]&x[10])+(x[15]&x[11])))) + (x[14]&x[12]);
dup19 =
{dup191,x[13]};
dup201
=
((((x[22]&x[3])+(x[21]&x[4])) +
((x[20]&x[5])+(x[19]&x[6]))) + (((x[18]&x[7])+(x[17]&x[8])) +
((x[16]&x[9])+(x[15]&x[10])))) + ((x[14]&x[11])+(x[13]&x[12]));
dup20 =
{dup201,1'b0};
dup211
=
((((x[22]&x[2])+(x[21]&x[3])) +
((x[20]&x[4])+(x[19]&x[5]))) + (((x[18]&x[6])+(x[17]&x[7])) +
((x[16]&x[8])+(x[15]&x[9])))) + ((x[14]&x[10])+(x[13]&x[11]));
dup21 =
{dup211,x[12]};
dup221
=
((((x[22]&x[1])+(x[21]&x[2])) +
((x[20]&x[3])+(x[19]&x[4]))) + (((x[18]&x[5])+(x[17]&x[6])) +
((x[16]&x[7])+(x[15]&x[8])))) +
((x[14]&x[9])+(x[13]&x[10])+(x[12]&x[11]));
dup22 =
{dup221,1'b0};
dup231
=
((((x[22]&x[0])+(x[21]&x[1])) +
((x[20]&x[2])+(x[19]&x[3]))) + (((x[18]&x[4])+(x[17]&x[5])) +
((x[16]&x[6])+(x[15]&x[7])))) + ((x[14]&x[8])+(x[13]&x[9])+(x[12]&x[10]));
dup23 =
{dup231,x[11]};
dup241
=
((((x[21]&x[0])+(x[20]&x[1])) +
((x[19]&x[2])+(x[18]&x[3]))) + (((x[17]&x[4])+(x[16]&x[5])) +
((x[15]&x[6])+(x[14]&x[7])))) + ((x[13]&x[8])+(x[12]&x[9])+(x[11]&x[10]));
dup24 =
{dup241,1'b0};
dup251
=
((((x[20]&x[0])+(x[19]&x[1])) +
((x[18]&x[2])+(x[17]&x[3]))) + (((x[16]&x[4])+(x[15]&x[5])) +
((x[14]&x[6])+(x[13]&x[7])))) + ((x[12]&x[8])+(x[11]&x[9]));
dup25 =
{dup251,x[10]};
dup261
=
((((x[19]&x[0])+(x[18]&x[1])) +
((x[17]&x[2])+(x[16]&x[3]))) + (((x[15]&x[4])+(x[14]&x[5])) +
((x[13]&x[6])+(x[12]&x[7])))) + ((x[11]&x[8])+(x[10]&x[9]));
dup26 =
{dup261,1'b0};
dup271
=
((((x[18]&x[0])+(x[17]&x[1])) +
((x[16]&x[2])+(x[15]&x[3]))) + (((x[14]&x[4])+(x[13]&x[5])) +
((x[12]&x[6])+(x[11]&x[7])))) + (x[10]&x[8]);
dup27 =
{dup271,x[9]};
dup281
=
((((x[17]&x[0])+(x[16]&x[1])) +
((x[15]&x[2])+(x[14]&x[3]))) + (((x[13]&x[4])+(x[12]&x[5])) +
((x[11]&x[6])+(x[10]&x[7])))) + (x[9]&x[8]);
dup28 =
{dup281,1'b0};
dup291
=
(((x[16]&x[0])+(x[15]&x[1])) +
((x[14]&x[2])+(x[13]&x[3]))) + (((x[12]&x[4])+(x[11]&x[5])) +
((x[10]&x[6])+(x[9]&x[7])));
dup29 =
{dup291,x[8]};
dup301
=
(((x[15]&x[0])+(x[14]&x[1])) +
((x[13]&x[2])+(x[12]&x[3]))) + (((x[11]&x[4])+(x[10]&x[5])) +
((x[9]&x[6])+(x[8]&x[7])));
dup30 =
{dup301,1'b0};

147

dup311
=
(((x[14]&x[0])+(x[13]&x[1])) +
((x[12]&x[2])+(x[11]&x[3]))) + ((x[10]&x[4])+(x[9]&x[5])+(x[8]&x[6]));
dup31 =
{dup311,x[7]};
dup321
=
(((x[13]&x[0])+(x[12]&x[1])) +
((x[11]&x[2])+(x[10]&x[3]))) + ((x[9]&x[4])+(x[8]&x[5])+(x[7]&x[6]));
dup32 =
{dup321,1'b0};
dup331
=
(((x[12]&x[0])+(x[11]&x[1])) +
((x[10]&x[2])+(x[9]&x[3]))) + ((x[8]&x[4])+(x[7]&x[5]));
dup33 =
{dup331,x[6]};
dup341
=
(((x[11]&x[0])+(x[10]&x[1])) +
((x[9]&x[2])+(x[8]&x[3]))) + ((x[7]&x[4])+(x[6]&x[5]));
dup34 =
{dup341,1'b0};
dup351
=
(((x[10]&x[0])+(x[9]&x[1])) + ((x[8]&x[2])+(x[7]&x[3])))
+ (x[6]&x[4]);
dup35 =
{dup351,x[5]};
dup361
=
(((x[9]&x[0])+(x[8]&x[1])) + ((x[7]&x[2])+(x[6]&x[3])))
+ (x[5]&x[4]);
dup36 =
{dup361,1'b0};
dup371
=
((x[8]&x[0])+(x[7]&x[1])) + ((x[6]&x[2])+(x[5]&x[3]));
dup37 =
{dup371,x[4]};
dup381
=
((x[7]&x[0])+(x[6]&x[1])) + ((x[5]&x[2])+(x[4]&x[3]));
dup38 =
{dup381,1'b0};
dup391
=
((x[6]&x[0])+(x[5]&x[1])) + (x[4]&x[2]);
dup39 =
{dup391,x[3]};
dup401
=
((x[5]&x[0])+(x[4]&x[1])) + (x[3]&x[2]);
dup40 =
{dup401,1'b0};
dup411
=
(x[4]&x[0])+(x[3]&x[1]);
dup41 =
{dup411,x[2]};
dup421
=
(x[3]&x[0])+(x[2]&x[1]);
dup42 =
{dup421,1'b0};
dup43
=
{(x[2]&x[0]),x[1]};
dup44
=
{(x[1]&x[0]),1'b0};
dup45
=
x[0];
end

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela13;
levela14;
levela15;
levela16;

148

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]

levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;
levela32;
levela33;
levela34;
levela35;
levela36;
levela37;
levela38;
levela39;
levela40;
levela41;
levela42;
levela43;
levela44;
levela45;

always@(*) begin
levela1= (dup1 + dup2[1]) ;
levela2= ( (dup2[0] + dup3[1]) + (dup4[2]) ) ;
levela3= ( (dup3[0] + dup4[1]) + (dup5[2]) ) ;
levela4= ( (dup4[0] + dup5[1]) + (dup6[2]) ) ;
levela5= ( (dup5[0] + dup6[1]) + (dup7[2] + dup8[3]) ) ;
levela6= ( (dup6[0] + dup7[1]) + (dup8[2] + dup9[3]) ) ;
levela7= ( (dup7[0] + dup8[1]) + (dup9[2] + dup10[3]) ) ;
levela8= ( (dup8[0] + dup9[1]) + (dup10[2] + dup11[3]) ) ;
levela9= ( (dup9[0] + dup10[1]) + (dup11[2] + dup12[3]) ) ;
levela10= ( (dup10[0] + dup11[1]) + (dup12[2] + dup13[3]) ) ;
levela11= ( (dup11[0] + dup12[1]) + (dup13[2] + dup14[3]) ) ;
levela12= ( (dup12[0] + dup13[1]) + (dup14[2] + dup15[3])) + ((dup16[4])
;
levela13= ( (dup13[0] + dup14[1]) + (dup15[2] + dup16[3])) + ((dup17[4])
;
levela14= ( (dup14[0] + dup15[1]) + (dup16[2] + dup17[3])) + ((dup18[4])
;
levela15= ( (dup15[0] + dup16[1]) + (dup17[2] + dup18[3])) + ((dup19[4])
;

)
)
)
)

149

levela16=
;
levela17=
;
levela18=
;
levela19=
;
levela20=
;
levela21=
;
levela22=
;
levela23=
;
levela24=
;
levela25=
;
levela26=
;
levela27=
levela28=
levela29=
levela30=
levela31=
levela32=
levela33=
levela34=
levela35=
levela36=
levela37=
levela38=
levela39=
levela40=
levela41=
levela42=
levela43=
levela44=
levela45=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

( (dup16[0] + dup17[1]) + (dup18[2] + dup19[3])) + ((dup20[4]) )


( (dup17[0] + dup18[1]) + (dup19[2] + dup20[3])) + ((dup21[4]) )
( (dup18[0] + dup19[1]) + (dup20[2] + dup21[3])) + ((dup22[4]) )
( (dup19[0] + dup20[1]) + (dup21[2] + dup22[3])) + ((dup23[4]) )
( (dup20[0] + dup21[1]) + (dup22[2] + dup23[3])) + ((dup24[4]) )
( (dup21[0] + dup22[1]) + (dup23[2] + dup24[3])) + ((dup25[4]) )
( (dup22[0] + dup23[1]) + (dup24[2] + dup25[3])) + ((dup26[4]) )
( (dup23[0] + dup24[1]) + (dup25[2] + dup26[3])) + ((dup27[4]) )
( (dup24[0] + dup25[1]) + (dup26[2] + dup27[3])) + ((dup28[4]) )
( (dup25[0] + dup26[1]) + (dup27[2] + dup28[3])) + ((dup29[4]) )
( (dup26[0] + dup27[1]) + (dup28[2] + dup29[3])) + ((dup30[4]) )
( (dup27[0] + dup28[1])
( (dup28[0] + dup29[1])
( (dup29[0] + dup30[1])
( (dup30[0] + dup31[1])
( (dup31[0] + dup32[1])
( (dup32[0] + dup33[1])
( (dup33[0] + dup34[1])
( (dup34[0] + dup35[1])
( (dup35[0] + dup36[1])
( (dup36[0] + dup37[1])
( (dup37[0] + dup38[1])
( (dup38[0] + dup39[1])
( (dup39[0] + dup40[1])
( (dup40[0] + dup41[1])
(dup41[0] + dup42[1]) ;
(dup42[0] + dup43[1]) ;
(dup43[0] + dup44[1]) ;
(dup44[0]) ;
(dup45[0]) ;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

+
+
+
+
+
+
+
+
+
+
+
+
+
+

(dup29[2] + dup30[3])
(dup30[2] + dup31[3])
(dup31[2] + dup32[3])
(dup32[2] + dup33[3])
(dup33[2] + dup34[3])
(dup34[2] + dup35[3])
(dup35[2] + dup36[3])
(dup36[2] + dup37[3])
(dup37[2] + dup38[3])
(dup38[2]) ) ;
(dup39[2]) ) ;
(dup40[2]) ) ;
(dup41[2]) ) ;
(dup42[2]) ) ;

)
)
)
)
)
)
)
)
)

;
;
;
;
;
;
;
;
;

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;

150

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;
levelb34;
levelb35;
levelb36;
levelb37;
levelb38;
levelb39;
levelb40;
levelb41;
levelb42;
levelb43;
levelb44;
levelb45;
levelb46;

always@(*) begin
levelb1= (levela1[1]) ;
levelb2= (levela1[0] + levela2[1]) ;
levelb3= (levela2[0] + levela3[1]) ;
levelb4= ( (levela3[0] + levela4[1]) + (levela5[2]) ) ;
levelb5= ( (levela4[0] + levela5[1]) + (levela6[2]) ) ;
levelb6= ( (levela5[0] + levela6[1]) + (levela7[2]) ) ;
levelb7= ( (levela6[0] + levela7[1]) + (levela8[2]) ) ;
levelb8= ( (levela7[0] + levela8[1]) + (levela9[2]) ) ;
levelb9= ( (levela8[0] + levela9[1]) + (levela10[2]) ) ;
levelb10= ( (levela9[0] + levela10[1]) + (levela11[2]) ) ;
levelb11= ( (levela10[0] + levela11[1]) + (levela12[2]) ) ;
levelb12= ( (levela11[0] + levela12[1]) + (levela13[2]) ) ;
levelb13= ( (levela12[0] + levela13[1]) + (levela14[2]) ) ;
levelb14= ( (levela13[0] + levela14[1]) + (levela15[2]) ) ;
levelb15= ( (levela14[0] + levela15[1]) + (levela16[2]) ) ;

151

levelb16=
levelb17=
levelb18=
levelb19=
levelb20=
levelb21=
levelb22=
levelb23=
levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
levelb33=
levelb34=
levelb35=
levelb36=
levelb37=
levelb38=
levelb39=
levelb40=
levelb41=
levelb42=
levelb43=
levelb44=
levelb45=
levelb46=
end

( (levela15[0] + levela16[1])
( (levela16[0] + levela17[1])
( (levela17[0] + levela18[1])
( (levela18[0] + levela19[1])
( (levela19[0] + levela20[1])
( (levela20[0] + levela21[1])
( (levela21[0] + levela22[1])
( (levela22[0] + levela23[1])
( (levela23[0] + levela24[1])
( (levela24[0] + levela25[1])
( (levela25[0] + levela26[1])
( (levela26[0] + levela27[1])
( (levela27[0] + levela28[1])
( (levela28[0] + levela29[1])
( (levela29[0] + levela30[1])
( (levela30[0] + levela31[1])
( (levela31[0] + levela32[1])
( (levela32[0] + levela33[1])
( (levela33[0] + levela34[1])
(levela34[0] + levela35[1]) ;
(levela35[0] + levela36[1]) ;
(levela36[0] + levela37[1]) ;
(levela37[0] + levela38[1]) ;
(levela38[0] + levela39[1]) ;
(levela39[0] + levela40[1]) ;
(levela40[0] + levela41[1]) ;
(levela41[0] + levela42[1]) ;
(levela42[0] + levela43[1]) ;
(levela43[0]) ;
(levela44) ;
(levela45) ;

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

(levela17[2])
(levela18[2])
(levela19[2])
(levela20[2])
(levela21[2])
(levela22[2])
(levela23[2])
(levela24[2])
(levela25[2])
(levela26[2])
(levela27[2])
(levela28[2])
(levela29[2])
(levela30[2])
(levela31[2])
(levela32[2])
(levela33[2])
(levela34[2])
(levela35[2])

)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

wire [45:0] p1,p2;


assign p1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14[0],levelb15[0],levelb16[0],levelb17[0],levelb18[0],levelb19[0],level
b20[0],levelb21[0],levelb22[0],levelb23[0],levelb24[0],levelb25[0],levelb2
6[0],levelb27[0],levelb28[0],levelb29[0],levelb30[0],levelb31[0],levelb32[
0],levelb33[0],levelb34[0],levelb35[0],levelb36[0],levelb37[0],levelb38[0]
,levelb39[0],levelb40[0],levelb41[0],levelb42[0],levelb43[0],levelb44,leve
lb45,levelb46};
assign p2 =
{levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb8
[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],levelb14[1]
,levelb15[1],levelb16[1],levelb17[1],levelb18[1],levelb19[1],levelb20[1],l
evelb21[1],levelb22[1],levelb23[1],levelb24[1],levelb25[1],levelb26[1],lev
elb27[1],levelb28[1],levelb29[1],levelb30[1],levelb31[1],levelb32[1],level
b33[1],levelb34[1],levelb35[1],levelb36[1],levelb37[1],levelb38[1],levelb3
9[1],levelb40[1],levelb41[1],levelb42[1],levelb43[1],4'b0000};
always@(posedge clk)

begin

152

//infer cla
p[45:4] = p1[45:4] + p2[45:4];
p[3:0] = p1[3:0];
end
endmodule
23 bit Vedic-Wallace
module square_vw_23 (
input
[22:0] x,
input clk,
output reg [45:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;
dup33;
dup34;
dup35;
dup36;
dup37;
dup38;
dup39;

153

reg
reg
reg
reg
reg
reg

[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]
[1:0]

dup40;
dup41;
dup42;
dup43;
dup44;
dup45;
dup410;
dup51;
dup61;
dup71;
dup81;
dup91;
dup101;
dup111;
dup121;
dup131;
dup141;
dup151;
dup161;
dup171;
dup181;
dup191;
dup201;
dup211;
dup221;
dup231;
dup241;
dup251;
dup261;
dup271;
dup281;
dup291;
dup301;
dup311;
dup321;
dup331;
dup341;
dup351;
dup361;
dup371;
dup381;
dup391;
dup401;
dup411;
dup421;

always@(*) begin
dup1 =
x[22];
dup2 =
{(x[22]&x[21]),1'b0};
dup3 =
{(x[22]&x[20]),x[21]};

154

dup410
=
(x[22]&x[19])+(x[21]&x[20]);
dup4 =
{dup410,1'b0};
dup51
=
(x[22]&x[18])+(x[21]&x[19]);
dup5 =
{dup51,x[20]};
dup61
=
(x[22]&x[17])+(x[21]&x[18])+(x[20]&x[19]);
dup6 =
{dup61,1'b0};
dup71
=
(x[22]&x[16])+(x[21]&x[17])+(x[20]&x[18]);
dup7 =
{dup71,x[19]};
dup81
=
((x[22]&x[15])+(x[21]&x[16])) +
((x[20]&x[17])+(x[19]&x[18]));
dup8 =
{dup81,1'b0};
dup91
=
((x[22]&x[14])+(x[21]&x[15])) +
((x[20]&x[16])+(x[19]&x[17]));
dup9 =
{dup91,x[18]};
dup101
=
((x[22]&x[13])+(x[21]&x[14])) +
((x[20]&x[15])+(x[19]&x[16])+(x[18]&x[17]));
dup10 =
{dup101,1'b0};
dup111
=
((x[22]&x[12])+(x[21]&x[13])) +
((x[20]&x[14])+(x[19]&x[15])+(x[18]&x[16]));
dup11 =
{dup111,x[17]};
dup121
=
((x[22]&x[11])+(x[21]&x[12])) +
((x[20]&x[13])+(x[19]&x[14])) + ((x[18]&x[15])+(x[17]&x[16]));
dup12 =
{dup121,1'b0};
dup131
=
((x[22]&x[10])+(x[21]&x[11])) +
((x[20]&x[12])+(x[19]&x[13]))+((x[18]&x[14])+(x[17]&x[15]));
dup13 =
{dup131,x[16]};
dup141
=
(((x[22]&x[9])+(x[21]&x[10])) +
((x[20]&x[11])+(x[19]&x[12]))) + (((x[18]&x[13])+(x[17]&x[14])) +
(x[16]&x[15]));
dup14 =
{dup141,1'b0};
dup151
=
(((x[22]&x[8])+(x[21]&x[9])) +
((x[20]&x[10])+(x[19]&x[11]))) + (((x[18]&x[12])+(x[17]&x[13])) +
(x[16]&x[14]));
dup15 =
{dup151,x[15]};
dup161
=
(((x[22]&x[7])+(x[21]&x[8])) +
((x[20]&x[9])+(x[19]&x[10]))) + (((x[18]&x[11])+(x[17]&x[12])) +
((x[16]&x[13])+(x[15]&x[14])));
dup16 =
{dup161,1'b0};
dup171
=
(((x[22]&x[6])+(x[21]&x[7])) +
((x[20]&x[8])+(x[19]&x[9]))) + (((x[18]&x[10])+(x[17]&x[11])) +
((x[16]&x[12])+(x[15]&x[13])));
dup17 =
{dup171,x[14]};
dup181
=
((((x[22]&x[5])+(x[21]&x[6])) +
((x[20]&x[7])+(x[19]&x[8]))) + (((x[18]&x[9])+(x[17]&x[10])) +
((x[16]&x[11])+(x[15]&x[12])))) + (x[14]&x[13]);
dup18 =
{dup181,1'b0};
dup191
=
((((x[22]&x[4])+(x[21]&x[5])) +
((x[20]&x[6])+(x[19]&x[7]))) + (((x[18]&x[8])+(x[17]&x[9])) +
((x[16]&x[10])+(x[15]&x[11])))) + (x[14]&x[12]);
dup19 =
{dup191,x[13]};
dup201
=
((((x[22]&x[3])+(x[21]&x[4])) +
((x[20]&x[5])+(x[19]&x[6]))) + (((x[18]&x[7])+(x[17]&x[8])) +
((x[16]&x[9])+(x[15]&x[10])))) + ((x[14]&x[11])+(x[13]&x[12]));

155

dup20 =
{dup201,1'b0};
dup211
=
((((x[22]&x[2])+(x[21]&x[3])) +
((x[20]&x[4])+(x[19]&x[5]))) + (((x[18]&x[6])+(x[17]&x[7])) +
((x[16]&x[8])+(x[15]&x[9])))) + ((x[14]&x[10])+(x[13]&x[11]));
dup21 =
{dup211,x[12]};
dup221
=
((((x[22]&x[1])+(x[21]&x[2])) +
((x[20]&x[3])+(x[19]&x[4]))) + (((x[18]&x[5])+(x[17]&x[6])) +
((x[16]&x[7])+(x[15]&x[8])))) +
((x[14]&x[9])+(x[13]&x[10])+(x[12]&x[11]));
dup22 =
{dup221,1'b0};
dup231
=
((((x[22]&x[0])+(x[21]&x[1])) +
((x[20]&x[2])+(x[19]&x[3]))) + (((x[18]&x[4])+(x[17]&x[5])) +
((x[16]&x[6])+(x[15]&x[7])))) + ((x[14]&x[8])+(x[13]&x[9])+(x[12]&x[10]));
dup23 =
{dup231,x[11]};
dup241
=
((((x[21]&x[0])+(x[20]&x[1])) +
((x[19]&x[2])+(x[18]&x[3]))) + (((x[17]&x[4])+(x[16]&x[5])) +
((x[15]&x[6])+(x[14]&x[7])))) + ((x[13]&x[8])+(x[12]&x[9])+(x[11]&x[10]));
dup24 =
{dup241,1'b0};
dup251
=
((((x[20]&x[0])+(x[19]&x[1])) +
((x[18]&x[2])+(x[17]&x[3]))) + (((x[16]&x[4])+(x[15]&x[5])) +
((x[14]&x[6])+(x[13]&x[7])))) + ((x[12]&x[8])+(x[11]&x[9]));
dup25 =
{dup251,x[10]};
dup261
=
((((x[19]&x[0])+(x[18]&x[1])) +
((x[17]&x[2])+(x[16]&x[3]))) + (((x[15]&x[4])+(x[14]&x[5])) +
((x[13]&x[6])+(x[12]&x[7])))) + ((x[11]&x[8])+(x[10]&x[9]));
dup26 =
{dup261,1'b0};
dup271
=
((((x[18]&x[0])+(x[17]&x[1])) +
((x[16]&x[2])+(x[15]&x[3]))) + (((x[14]&x[4])+(x[13]&x[5])) +
((x[12]&x[6])+(x[11]&x[7])))) + (x[10]&x[8]);
dup27 =
{dup271,x[9]};
dup281
=
((((x[17]&x[0])+(x[16]&x[1])) +
((x[15]&x[2])+(x[14]&x[3]))) + (((x[13]&x[4])+(x[12]&x[5])) +
((x[11]&x[6])+(x[10]&x[7])))) + (x[9]&x[8]);
dup28 =
{dup281,1'b0};
dup291
=
(((x[16]&x[0])+(x[15]&x[1])) +
((x[14]&x[2])+(x[13]&x[3]))) + (((x[12]&x[4])+(x[11]&x[5])) +
((x[10]&x[6])+(x[9]&x[7])));
dup29 =
{dup291,x[8]};
dup301
=
(((x[15]&x[0])+(x[14]&x[1])) +
((x[13]&x[2])+(x[12]&x[3]))) + (((x[11]&x[4])+(x[10]&x[5])) +
((x[9]&x[6])+(x[8]&x[7])));
dup30 =
{dup301,1'b0};
dup311
=
(((x[14]&x[0])+(x[13]&x[1])) +
((x[12]&x[2])+(x[11]&x[3]))) + ((x[10]&x[4])+(x[9]&x[5])+(x[8]&x[6]));
dup31 =
{dup311,x[7]};
dup321
=
(((x[13]&x[0])+(x[12]&x[1])) +
((x[11]&x[2])+(x[10]&x[3]))) + ((x[9]&x[4])+(x[8]&x[5])+(x[7]&x[6]));
dup32 =
{dup321,1'b0};
dup331
=
(((x[12]&x[0])+(x[11]&x[1])) +
((x[10]&x[2])+(x[9]&x[3]))) + ((x[8]&x[4])+(x[7]&x[5]));
dup33 =
{dup331,x[6]};
dup341
=
(((x[11]&x[0])+(x[10]&x[1])) +
((x[9]&x[2])+(x[8]&x[3]))) + ((x[7]&x[4])+(x[6]&x[5]));

156

dup34 =
{dup341,1'b0};
dup351
=
(((x[10]&x[0])+(x[9]&x[1])) + ((x[8]&x[2])+(x[7]&x[3])))
+ (x[6]&x[4]);
dup35 =
{dup351,x[5]};
dup361
=
(((x[9]&x[0])+(x[8]&x[1])) + ((x[7]&x[2])+(x[6]&x[3])))
+ (x[5]&x[4]);
dup36 =
{dup361,1'b0};
dup371
=
((x[8]&x[0])+(x[7]&x[1])) + ((x[6]&x[2])+(x[5]&x[3]));
dup37 =
{dup371,x[4]};
dup381
=
((x[7]&x[0])+(x[6]&x[1])) + ((x[5]&x[2])+(x[4]&x[3]));
dup38 =
{dup381,1'b0};
dup391
=
((x[6]&x[0])+(x[5]&x[1])) + (x[4]&x[2]);
dup39 =
{dup391,x[3]};
dup401
=
((x[5]&x[0])+(x[4]&x[1])) + (x[3]&x[2]);
dup40 =
{dup401,1'b0};
dup411
=
(x[4]&x[0])+(x[3]&x[1]);
dup41 =
{dup411,x[2]};
dup421
=
(x[3]&x[0])+(x[2]&x[1]);
dup42 =
{dup421,1'b0};
dup43
=
{(x[2]&x[0]),x[1]};
dup44
=
{(x[1]&x[0]),1'b0};
dup45
=
x[0];
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;
levela14;
levela14a;
levela15;
levela15a;
levela16;
levela16a;
levela17;
levela17a;
levela18;
levela18a;
levela19;
levela19a;
levela20;

157

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela20a;
levela21;
levela21a;
levela22;
levela22a;
levela23;
levela23a;
levela24;
levela24a;
levela25;
levela25a;
levela26;
levela26a;
levela27;
levela28;
levela29;
levela30;
levela31;
levela32;
levela33;
levela34;
levela35;
levela36;
levela37;
levela38;
levela39;
levela40;
levela41;
levela42;
levela43;
levela44;
levela45;

always@(*) begin
levela1= dup1 + dup2[1] ;
levela2= dup2[0] + dup3[1] + dup4[2] ;
levela3= dup3[0] + dup4[1] + dup5[2] ;
levela4= dup4[0] + dup5[1] + dup6[2] ;
levela5= dup5[0] + dup6[1] + dup7[2] ;
levela6= dup6[0] + dup7[1] + dup8[2] ;
levela7= dup7[0] + dup8[1] + dup9[2] ;
levela8= dup8[0] + dup9[1] + dup10[2] ;
levela9= dup9[0] + dup10[1] + dup11[2] ;
levela10= dup10[0] + dup11[1] + dup12[2]
levela11= dup11[0] + dup12[1] + dup13[2]
levela12= dup12[0] + dup13[1] + dup14[2]
levela12a= dup15[3] + dup16[4] ;
levela13= dup13[0] + dup14[1] + dup15[2]
levela13a= dup16[3] + dup17[4] ;
levela14= dup14[0] + dup15[1] + dup16[2]
levela14a= dup17[3] + dup18[4] ;

;
;
;
;
;

158

levela15= dup15[0] + dup16[1] + dup17[2]


levela15a= dup18[3] + dup19[4] ;
levela16= dup16[0] + dup17[1] + dup18[2]
levela16a= dup19[3] + dup20[4] ;
levela17= dup17[0] + dup18[1] + dup19[2]
levela17a= dup20[3] + dup21[4] ;
levela18= dup18[0] + dup19[1] + dup20[2]
levela18a= dup21[3] + dup22[4] ;
levela19= dup19[0] + dup20[1] + dup21[2]
levela19a= dup22[3] + dup23[4] ;
levela20= dup20[0] + dup21[1] + dup22[2]
levela20a= dup23[3] + dup24[4] ;
levela21= dup21[0] + dup22[1] + dup23[2]
levela21a= dup24[3] + dup25[4] ;
levela22= dup22[0] + dup23[1] + dup24[2]
levela22a= dup25[3] + dup26[4] ;
levela23= dup23[0] + dup24[1] + dup25[2]
levela23a= dup26[3] + dup27[4] ;
levela24= dup24[0] + dup25[1] + dup26[2]
levela24a= dup27[3] + dup28[4] ;
levela25= dup25[0] + dup26[1] + dup27[2]
levela25a= dup28[3] + dup29[4] ;
levela26= dup26[0] + dup27[1] + dup28[2]
levela26a= dup29[3] + dup30[4] ;
levela27= dup27[0] + dup28[1] + dup29[2]
levela28= dup28[0] + dup29[1] + dup30[2]
levela29= dup29[0] + dup30[1] + dup31[2]
levela30= dup30[0] + dup31[1] + dup32[2]
levela31= dup31[0] + dup32[1] + dup33[2]
levela32= dup32[0] + dup33[1] + dup34[2]
levela33= dup33[0] + dup34[1] + dup35[2]
levela34= dup34[0] + dup35[1] + dup36[2]
levela35= dup35[0] + dup36[1] + dup37[2]
levela36= dup36[0] + dup37[1] + dup38[2]
levela37= dup37[0] + dup38[1] + dup39[2]
levela38= dup38[0] + dup39[1] + dup40[2]
levela39= dup39[0] + dup40[1] + dup41[2]
levela40= dup40[0] + dup41[1] + dup42[2]
levela41= dup41[0] + dup42[1] ;
levela42= dup42[0] + dup43[1] ;
levela43= dup43[0] + dup44[1] ;
levela44= dup44[0] ;
levela45= dup45 ;
end
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;

159

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;
levelb34;
levelb35;
levelb36;
levelb37;
levelb38;
levelb39;
levelb40;
levelb41;
levelb42;
levelb43;
levelb44;
levelb45;

always@(*) begin
levelb1= ( levela1[0] +
levelb2= ( levela2[0] +
levelb3= ( levela3[0] +
levelb4= ( levela4[0] +
levelb5= ( levela5[0] +
levelb6= ( levela6[0] +
levelb7= ( levela7[0] +
levelb8= ( levela8[0] +
levelb9= ( levela9[0] +
levelb10= ( levela10[0]
levelb11= ( levela11[0]
levelb12= ( levela12[0]
levelb13= ( levela13[0]

levela2[1] ) ;
levela3[1] ) ;
levela4[1] ) ;
levela5[1] ) ;
levela6[1] + dup8[3] ) ;
levela7[1] + dup9[3] ) ;
levela8[1] + dup10[3] ) ;
levela9[1] + dup11[3] ) ;
levela10[1] + dup12[3] ) ;
+ levela11[1] + dup13[3] ) ;
+ levela12[1] + dup14[3] ) ;
+ levela13[1] + levela12a[0] ) ;
+ levela14[1] + levela13a[0] ) ;

160

levelb14=
levelb15=
levelb16=
levelb17=
levelb18=
levelb19=
levelb20=
levelb21=
levelb22=
levelb23=
levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
levelb33=
levelb34=
levelb35=
levelb36=
levelb37=
levelb38=
levelb39=
levelb40=
levelb41=
levelb42=
levelb43=
levelb44=
levelb45=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

( levela14[0]
( levela15[0]
( levela16[0]
( levela17[0]
( levela18[0]
( levela19[0]
( levela20[0]
( levela21[0]
( levela22[0]
( levela23[0]
( levela24[0]
( levela25[0]
( levela26[0]
( levela27[0]
( levela28[0]
( levela29[0]
( levela30[0]
( levela31[0]
( levela32[0]
( levela33[0]
( levela34[0]
( levela35[0]
( levela36[0]
( levela37[0]
( levela38[0]
( levela39[0]
( levela40[0]
( levela41[0]
( levela42[0]
levela43[0] ;
levela44 ;
levela45 ;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

levela15[1] + levela14a[0]
levela16[1] + levela15a[0]
levela17[1] + levela16a[0]
levela18[1] + levela17a[0]
levela19[1] + levela18a[0]
levela20[1] + levela19a[0]
levela21[1] + levela20a[0]
levela22[1] + levela21a[0]
levela23[1] + levela22a[0]
levela24[1] + levela23a[0]
levela25[1] + levela24a[0]
levela26[1] + levela25a[0]
levela27[1] + levela26a[0]
levela28[1] + dup30[3] ) ;
levela29[1] + dup31[3] ) ;
levela30[1] + dup32[3] ) ;
levela31[1] + dup33[3] ) ;
levela32[1] + dup34[3] ) ;
levela33[1] + dup35[3] ) ;
levela34[1] + dup36[3] ) ;
levela35[1] + dup37[3] ) ;
levela36[1] + dup38[3] ) ;
levela37[1]) ;
levela38[1]) ;
levela39[1]) ;
levela40[1]) ;
levela41[1]) ;
levela42[1]) ;
levela43[1]) ;

)
)
)
)
)
)
)
)
)
)
)
)
)

;
;
;
;
;
;
;
;
;
;
;
;
;

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;

161

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;
levelc33;
levelc34;
levelc35;
levelc36;
levelc37;
levelc38;
levelc39;
levelc40;
levelc41;
levelc42;
levelc43;
levelc44;
levelc45;
levelc46;

always@(*) begin
levelc1= levela1[1] | levelb1[1];
levelc2= levelb1[0] + levelb2[1] ;
levelc3= levelb2[0] + levelb3[1] ;
levelc4= levelb3[0] + levelb4[1] ;
levelc5= levelb4[0] + levelb5[1] ;
levelc6= levelb5[0] + levelb6[1] ;
levelc7= levelb6[0] + levelb7[1] ;
levelc8=
levelb7[0] + levelb8[1] ;
levelc9=
levelb8[0] + levelb9[1] ;
levelc10=
levelb9[0] + levelb10[1]
levelc11= levelb10[0] + levelb11[1]
levelc12= levelb11[0] + levelb12[1]
levelc13= levelb12[0] + levelb13[1]
levelc14= levelb13[0] + levelb14[1]
levelc15= levelb14[0] + levelb15[1]
levelc16= levelb15[0] + levelb16[1]
levelc17= levelb16[0] + levelb17[1]
levelc18= levelb17[0] + levelb18[1]
levelc19= levelb18[0] + levelb19[1]
levelc20= levelb19[0] + levelb20[1]
levelc21= levelb20[0] + levelb21[1]
levelc22= levelb21[0] + levelb22[1]
levelc23= levelb22[0] + levelb23[1]

;
;
+
+
+
+
+
+
+
+
+
+
+
+

levela12a[1]
levela13a[1]
levela14a[1]
levela15a[1]
levela16a[1]
levela17a[1]
levela18a[1]
levela19a[1]
levela20a[1]
levela21a[1]
levela22a[1]
levela23a[1]

;
;
;
;
;
;
;
;
;
;
;
;

162

levelc24= levelb23[0]
levelc25= levelb24[0]
levelc26= levelb25[0]
levelc27= levelb26[0]
levelc28= levelb27[0]
levelc29= levelb28[0]
levelc30= levelb29[0]
levelc31= levelb30[0]
levelc32= levelb31[0]
levelc33= levelb32[0]
levelc34= levelb33[0]
levelc35= levelb34[0]
levelc36= levelb35[0]
levelc37= levelb36[0]
levelc38= levelb37[0]
levelc39= levelb38[0]
levelc40= levelb39[0]
levelc41= levelb40[0]
levelc42= levelb41[0]
levelc43= levelb42[0]
levelc44= levelb43 ;
levelc45= levelb44 ;
levelc46= levelb45 ;
end

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
;

levelb24[1]
levelb25[1]
levelb26[1]
levelb27[1]
levelb28[1]
levelb29[1]
levelb30[1]
levelb31[1]
levelb32[1]
levelb33[1]
levelb34[1]
levelb35[1]
levelb36[1]
levelb37[1]
levelb38[1]
levelb39[1]
levelb40[1]
levelb41[1]
levelb42[1]

+ levela24a[1]
+ levela25a[1]
+ levela26a[1]
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

;
;
;

wire [45:0] p1,p2;


assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31[0],levelc32[
0],levelc33[0],levelc34[0],levelc35[0],levelc36[0],levelc37[0],levelc38[0]
,levelc39[0],levelc40[0],levelc41[0],levelc42[0],levelc43,levelc44,levelc4
5,levelc46};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],levelc31[1],levelc32[1],level
c33[1],levelc34[1],levelc35[1],levelc36[1],levelc37[1],levelc38[1],levelc3
9[1],levelc40[1],levelc41[1],levelc42[1],5'b00000};
always@(posedge clk) begin
//infer cla
p[45:5] = p1[45:5] + p2[45:5];
p[4:0] = p1[4:0];
end
endmodule

163

APPENDIX C Verilog Code for Sine and Cosine


8 bit Sine
module sin_vv_8 (
input
[9:0] angle,
input clk,
output reg [9:0] sina
);
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter

[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]

s01
s11
s21
s31
s41
s51
s61
s71
s81
s91
sa1
sb1
sc1
sd1
se1
sf1

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

9'b000010000;
9'b000000000;
9'b000000001;
9'b000000011;
9'b000000111;
9'b000001101;
9'b000010101;
9'b000100000;
9'b000101110;
9'b000111111;
9'b001010100;
9'b001101100;
9'b010000111;
9'b010100110;
9'b011000111;
9'b011101101;

reg [8:0] coeffo;


reg [8:0] coefft;
reg [16:0] p;
reg [7:0] rangle;
always@(*) begin
case (angle[8])
1'b0: rangle
1'b1: rangle
endcase
end
always@(*) begin
case(rangle[7:4])
4'h0: begin coefft
4'h1: begin coefft
4'h2: begin coefft
4'h3: begin coefft
4'h4: begin coefft
4'h5: begin coefft
4'h6: begin coefft
4'h7: begin coefft
4'h8: begin coefft
4'h9: begin coefft
4'ha: begin coefft
4'hb: begin coefft
4'hc: begin coefft

parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter

[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]

s02
s12
s22
s32
s42
s52
s62
s72
s82
s92
sa2
sb2
sc2
sd2
se2
sf2

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

9'b110010010;
9'b110001111;
9'b110000111;
9'b101111100;
9'b101101100;
9'b101011000;
9'b101000100;
9'b100101010;
9'b100001110;
9'b011110000;
9'b011001110;
9'b010101011;
9'b010000111;
9'b001100001;
9'b000111100;
9'b000010100;

= angle[7:0];
= ~(angle[7:0]);

=
=
=
=
=
=
=
=
=
=
=
=
=

s01;
s11;
s21;
s31;
s41;
s51;
s61;
s71;
s81;
s91;
sa1;
sb1;
sc1;

coeffo
coeffo
coeffo
coeffo
coeffo
coeffo
coeffo
coeffo
coeffo
coeffo
coeffo
coeffo
coeffo

=
=
=
=
=
=
=
=
=
=
=
=
=

s02;
s12;
s22;
s32;
s42;
s52;
s62;
s72;
s82;
s92;
sa2;
sb2;
sc2;

end
end
end
end
end
end
end
end
end
end
end
end
end

164

4'hd: begin coefft = sd1; coeffo = sd2; end


4'he: begin coefft = se1; coeffo = se2; end
4'hf: begin coefft = sf1; coeffo = sf2; end
endcase
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0] dup2;
[1:0] dup3;
[2:0] dup4;
[2:0] dup5;
[2:0] dup6;
[2:0] dup7;
[3:0] dup8;
[3:0] dup9;
[2:0] dup10;
[2:0] dup11;
[2:0] dup12;
[2:0] dup13;
[1:0] dup14;
[1:0] dup15;
dup16;

always@(*) begin
dup1 = (coeffo[8]&rangle[7]);
dup2 = ((coeffo[8]&rangle[6])+(coeffo[7]&rangle[7])) ;
dup3 = ((coeffo[8]&rangle[5])+(coeffo[7]&rangle[6])) +
((coeffo[6]&rangle[7])) ;
dup4 = ( ((coeffo[8]&rangle[4])+(coeffo[7]&rangle[5])) +
((coeffo[6]&rangle[6])+(coeffo[5]&rangle[7])) ) ;
dup5 = ( ((coeffo[8]&rangle[3])+(coeffo[7]&rangle[4])) +
((coeffo[6]&rangle[5])+(coeffo[5]&rangle[6])) ) + (
((coeffo[4]&rangle[7])) ) ;
dup6 = ( ((coeffo[8]&rangle[2])+(coeffo[7]&rangle[3])) +
((coeffo[6]&rangle[4])+(coeffo[5]&rangle[5])) ) + (
((coeffo[4]&rangle[6])+(coeffo[3]&rangle[7])) ) ;
dup7 = ( ((coeffo[8]&rangle[1])+(coeffo[7]&rangle[2])) +
((coeffo[6]&rangle[3])+(coeffo[5]&rangle[4])) ) + (
((coeffo[4]&rangle[5])+(coeffo[3]&rangle[6])) + ((coeffo[2]&rangle[7])) )
;
dup8 = ( ( ((coeffo[8]&rangle[0])+(coeffo[7]&rangle[1])) +
((coeffo[6]&rangle[2])+(coeffo[5]&rangle[3])) ) + (
((coeffo[4]&rangle[4])+(coeffo[3]&rangle[5])) +
((coeffo[2]&rangle[6])+(coeffo[1]&rangle[7])) ) ) ;
dup9 = ( ( ((coeffo[7]&rangle[0])+(coeffo[6]&rangle[1])) +
((coeffo[5]&rangle[2])+(coeffo[4]&rangle[3])) ) + (
((coeffo[3]&rangle[4])+(coeffo[2]&rangle[5])) +
((coeffo[1]&rangle[6])+(coeffo[0]&rangle[7])) ) ) ;
dup10 = ( ((coeffo[6]&rangle[0])+(coeffo[5]&rangle[1])) +
((coeffo[4]&rangle[2])+(coeffo[3]&rangle[3])) ) + (

165

((coeffo[2]&rangle[4])+(coeffo[1]&rangle[5])) + ((coeffo[0]&rangle[6])) )
;
dup11 = ( ((coeffo[5]&rangle[0])+(coeffo[4]&rangle[1])) +
((coeffo[3]&rangle[2])+(coeffo[2]&rangle[3])) ) + (
((coeffo[1]&rangle[4])+(coeffo[0]&rangle[5])) ) ;
dup12 = ( ((coeffo[4]&rangle[0])+(coeffo[3]&rangle[1])) +
((coeffo[2]&rangle[2])+(coeffo[1]&rangle[3])) ) + (
((coeffo[0]&rangle[4])) ) ;
dup13 = ( ((coeffo[3]&rangle[0])+(coeffo[2]&rangle[1])) +
((coeffo[1]&rangle[2])+(coeffo[0]&rangle[3])) ) ;
dup14 = ((coeffo[2]&rangle[0])+(coeffo[1]&rangle[1])) +
((coeffo[0]&rangle[2])) ;
dup15 = ((coeffo[1]&rangle[0])+(coeffo[0]&rangle[1])) ;
dup16 = (coeffo[0]&rangle[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levela1;
[1:0]
levela2;
[2:0]
levela3;
[2:0]
levela4;
[2:0]
levela5;
[2:0]
levela6;
[2:0]
levela7;
[2:0]
levela8;
[2:0]
levela9;
[1:0]
levela10;
[1:0]
levela11;
[1:0]
levela12;
[1:0]
levela13;
[1:0] levela14;
[1:0] levela15;
levela16;
levela17;

always@(*) begin
levela1 = coefft[8];
levela2 = (dup1 + dup2[1]) + (coefft[7]) ;
levela3 = (dup2[0] + dup3[1]) + (dup4[2]+coefft[6]);
levela4 = ( (dup3[0] + dup4[1]) + (dup5[2] + coefft[5])) ;
levela5 = ( (dup4[0] + dup5[1]) + (dup6[2] + coefft[4])) ;
levela6 = ( (dup5[0] + dup6[1]) + (dup7[2] + dup8[3]) + coefft[3]) ;
levela7 = ( (dup6[0] + dup7[1]) + (dup8[2] + coefft[2]) +dup9[3]) ;
levela8 = ( (dup7[0] + dup8[1]) + (dup9[2] + coefft[1])) ;
levela9 = (dup8[0] + dup9[1]) + (dup10[2] + coefft[0]) ;
levela10 = ( (dup9[0] + dup10[1]) + (dup11[2]) ) ;
levela11 = ( (dup10[0] + dup11[1]) + (dup12[2]) ) ;
levela12 = (dup11[0] + dup12[1]+dup13[2]) ;
levela13 = (dup12[0] + dup13[1]) ;
levela14 = (dup13[0] + dup14[1]) ;
levela15 = (dup14[0] + dup15[1]) ;
levela16 = dup15[0] ;
levela17 = dup16;

166

end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0] levelb1;
[1:0]
levelb2;
[1:0]
levelb3;
[1:0]
levelb4;
[1:0]
levelb5;
[1:0]
levelb6;
[1:0]
levelb7;
[1:0]
levelb8;
[1:0]
levelb9;
[1:0]
levelb10;
[1:0]
levelb11;
[1:0]
levelb12;
[1:0]
levelb13;
[1:0] levelb14;
levelb15;
levelb16;
levelb17;

always@(*) begin
levelb1= (levela1 + levela2[1]);
levelb2= (levela2[0] + levela3[1]);
levelb3= (levela3[0] + levela4[1]);
levelb4= levela4[0] + levela5[1] + levela6[2];
levelb5= levela5[0] + levela6[1] + levela7[2];
levelb6= (levela6[0] + levela7[1]) ;
levelb7= (levela7[0] + levela8[1]) ;
levelb8= (levela8[0] + levela9[1]) ;
levelb9= (levela9[0] + levela10[1]) ;
levelb10= (levela10[0] + levela11[1]) ;
levelb11= (levela11[0] + levela12[1]) ;
levelb12= (levela12[0] + levela13[1]) ;
levelb13= (levela13[0] + levela14[1]);
levelb14= (levela14[0] + levela15[1]) ;
levelb15= levela15[0];
levelb16 = levela16;
levelb17 = levela17;
end
wire [17:0] p1,p2;
assign p1 =
{levelb1[1],levelb1[0],levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6
[0],levelb7[0],levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],l
evelb13[0],levelb14[0],levelb15,levelb16,levelb17};
assign p2 =
{1'b0,levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],le
velb8[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],levelb
14[1],4'b0000};
always@(*) begin

167

// infer cla
p[16:4] = p1[17:4] + p2[17:4];
p[3:0] = p1[3:0];
end
always@(posedge clk) begin
sina[8:0] = p[16:8];
sina[9] = angle[9];
end
endmodule
16 bit Sine
module get_quadrant(
input [17:0] angle,
output reg [15:0] rangle,
output reg sign
);
always@(*) begin
case (angle[16])
1'b0: rangle = angle[15:0];
1'b1: rangle = ~(angle[15:0]);
endcase
end
always@(*) begin
if(angle[17]==1'b1) begin
if(angle[16:0]==17'h00000)
sign = 1'b0;
else
sign = 1'b1;
end
else begin
sign = 1'b0;
end
end
endmodule
module get_coeffs_sin16 (
input [15:0] angle,
output reg [15:0] co1,
output reg [17:0] co2,
output reg [16:0] co3
);
parameter [15:0] c10 = 16'b0000000000000000;
18'b011001001001110011; parameter [16:0] c30
parameter [15:0] c11 = 16'b0000000000011111;
18'b011001011001001100; parameter [16:0] c31
parameter [15:0] c12 = 16'b0000000010011000;
18'b011001110111100100; parameter [16:0] c32
parameter [15:0] c13 = 16'b0000000110100011;
18'b011010100100000001; parameter [16:0] c33

parameter [17:0] c20 =


= 17'b00000111110010011;
parameter [17:0] c21 =
= 17'b00010111000110111;
parameter [17:0] c22 =
= 17'b00100110011000010;
parameter [17:0] c23 =
= 17'b00110101001011100;

168

parameter [15:0] c14 = 16'b0000001101101100;


18'b011011011101010000; parameter [16:0] c34
parameter [15:0] c15 = 16'b0000011000010111;
18'b011100100001100001; parameter [16:0] c35
parameter [15:0] c16 = 16'b0000100110110101;
18'b011101101110110010; parameter [16:0] c36
parameter [15:0] c17 = 16'b0000111001001001;
18'b011111000010100010; parameter [16:0] c37
parameter [15:0] c18 = 16'b0001001111000001;
18'b100000011010000111; parameter [16:0] c38
parameter [15:0] c19 = 16'b0001100111110111;
18'b100001110010100001; parameter [16:0] c39
parameter [15:0] c1a = 16'b0010000010101101;
18'b100011001000100000; parameter [16:0] c3a
parameter [15:0] c1b = 16'b0010011110010001;
18'b100100011000110000; parameter [16:0] c3b
parameter [15:0] c1c = 16'b0010111000111000;
18'b100101011111110101; parameter [16:0] c3c
parameter [15:0] c1d = 16'b0011010000100100;
18'b100110011010001100; parameter [16:0] c3d
parameter [15:0] c1e = 16'b0011100011000000;
18'b100111000100011100; parameter [16:0] c3e
parameter [15:0] c1f = 16'b0011101101100100;
18'b100111011011000111; parameter [16:0] c3f

always@(*) begin
case (angle[15:12])
4'h0: begin co1=c10;
4'h1: begin co1=c11;
4'h2: begin co1=c12;
4'h3: begin co1=c13;
4'h4: begin co1=c14;
4'h5: begin co1=c15;
4'h6: begin co1=c16;
4'h7: begin co1=c17;
4'h8: begin co1=c18;
4'h9: begin co1=c19;
4'ha: begin co1=c1a;
4'hb: begin co1=c1b;
4'hc: begin co1=c1c;
4'hd: begin co1=c1d;
4'he: begin co1=c1e;
4'hf: begin co1=c1f;
endcase
end

co2=c20;
co2=c21;
co2=c22;
co2=c23;
co2=c24;
co2=c25;
co2=c26;
co2=c27;
co2=c28;
co2=c29;
co2=c2a;
co2=c2b;
co2=c2c;
co2=c2d;
co2=c2e;
co2=c2f;

co3=c30;
co3=c31;
co3=c32;
co3=c33;
co3=c34;
co3=c35;
co3=c36;
co3=c37;
co3=c38;
co3=c39;
co3=c3a;
co3=c3b;
co3=c3c;
co3=c3d;
co3=c3e;
co3=c3f;

parameter [17:0] c24 =


= 17'b01000011100001000;
parameter [17:0] c25 =
= 17'b01010001001010010;
parameter [17:0] c26 =
= 17'b01011110000011010;
parameter [17:0] c27 =
= 17'b01101010000001101;
parameter [17:0] c28 =
= 17'b01110100111110110;
parameter [17:0] c29 =
= 17'b01111110110011111;
parameter [17:0] c2a =
= 17'b10000111011010110;
parameter [17:0] c2b =
= 17'b10001110101110011;
parameter [17:0] c2c =
= 17'b10010100101010000;
parameter [17:0] c2d =
= 17'b10011001001001011;
parameter [17:0] c2e =
= 17'b10011100001011001;
parameter [17:0] c2f =
= 17'b10011101101100010;

end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end

endmodule
module square_sin_16 (
input
[15:0] x,
output reg [15:0] p1,

169

output reg

[15:0] p2

);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;

[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]

dup31;
dup41;
dup51;
dup61;
dup71;
dup81;
dup91;
dup101;
dup111;
dup121;
dup131;
dup141;
dup151;
dup161;
dup171;
dup181;
dup191;
dup201;
dup211;
dup221;

170

reg
reg
reg
reg
reg
reg

[2:0]
[2:0]
[1:0]
[1:0]
[1:0]
[1:0]

dup231;
dup241;
dup251;
dup261;
dup271;
dup281;

always@(*) begin
dup1 =
x[15];
dup2 =
{(x[15]&x[14]),1'b0};
dup3 =
{(x[15]&x[13]),x[14]};
dup41
=
(x[15]&x[12])+(x[14]&x[13]);
dup4 =
{dup41,1'b0};
dup51
=
(x[15]&x[11])+(x[14]&x[12]);
dup5 =
{dup51,x[13]};
dup61
=
(x[15]&x[10])+(x[14]&x[11])+(x[13]&x[12]);
dup6 =
{dup61,1'b0};
dup71
=
(x[15]&x[9])+(x[14]&x[10])+(x[13]&x[11]);
dup7 =
{dup71,x[12]};
dup81
=
((x[15]&x[8])+(x[14]&x[9])) +
((x[13]&x[10])+(x[12]&x[11]));
dup8 =
{dup81,1'b0};
dup91
=
((x[15]&x[7])+(x[14]&x[8])) +
((x[13]&x[9])+(x[12]&x[10]));
dup9 =
{dup91,x[11]};
dup101
=
((x[15]&x[6])+(x[14]&x[7])) +
((x[13]&x[8])+(x[12]&x[9])) + (x[11]&x[10]);
dup10 =
{dup101,1'b0};
dup111
=
((x[15]&x[5])+(x[14]&x[6])) +
((x[13]&x[7])+(x[12]&x[8])) + (x[11]&x[9]);
dup11 =
{dup111,x[10]};
dup121
=
((x[15]&x[4])+(x[14]&x[5])) +
((x[13]&x[6])+(x[12]&x[7]))+ ((x[11]&x[8])+(x[10]&x[9]));
dup12 =
{dup121,1'b0};
dup131
=
((x[15]&x[3])+(x[14]&x[4])) +
((x[13]&x[5])+(x[12]&x[6]))+ ((x[11]&x[7])+(x[10]&x[8]));
dup13 =
{dup131,x[9]};
dup141
=
(((x[15]&x[2])+(x[14]&x[3])) +
((x[13]&x[4])+(x[12]&x[5])) ) + (((x[11]&x[6])+(x[10]&x[7])) +
(x[9]&x[8]));
dup14 =
{dup141,1'b0};
dup151
=
(((x[15]&x[1])+(x[14]&x[2])) +
((x[13]&x[3])+(x[12]&x[4])) ) + (((x[11]&x[5])+(x[10]&x[6])) +
(x[9]&x[7]));
dup15 =
{dup151,x[8]};
dup161
=
( ((x[15]&x[0])+(x[14]&x[1])) +
((x[13]&x[2])+(x[12]&x[3]))) + ( ((x[11]&x[4])+(x[10]&x[5])) +
((x[9]&x[6])+(x[8]&x[7])) );
dup16 =
{dup161,1'b0};
dup171
=
( ((x[14]&x[0])+(x[13]&x[1])) +
((x[12]&x[2])+(x[11]&x[3])) ) + (((x[10]&x[4])+(x[9]&x[5])) +
(x[8]&x[6]));
dup17 =
{dup171,x[7]};

171

dup181
=
( ((x[13]&x[0])+(x[12]&x[1])) +
((x[11]&x[2])+(x[10]&x[3])) ) + ((x[9]&x[4])+(x[8]&x[5])+(x[7]&x[6]));
dup18 =
{dup181,1'b0};
dup191
=
( ((x[12]&x[0])+(x[11]&x[1])) +
((x[10]&x[2])+(x[9]&x[3])) ) + ((x[8]&x[4])+(x[7]&x[5]));
dup19 =
{dup191,x[6]};
dup201
=
( ((x[11]&x[0])+(x[10]&x[1])) +
((x[9]&x[2])+(x[8]&x[3])) ) + ((x[7]&x[4]) + (x[6]&x[5]));
dup20 =
{dup201,1'b0};
dup211
=
( ((x[10]&x[0])+(x[9]&x[1])) + ((x[8]&x[2])+(x[7]&x[3]))
) + (x[6]&x[4]);
dup21 =
{dup211,x[5]};
dup221
=
((x[9]&x[0])+(x[8]&x[1])) +
((x[7]&x[2])+(x[6]&x[3])+(x[5]&x[4]));
dup22 =
{dup221,1'b0};
dup231
=
((x[8]&x[0])+(x[7]&x[1])) + ((x[6]&x[2])+(x[5]&x[3]));
dup23 =
{dup231,x[4]};
dup241
=
((x[7]&x[0])+(x[6]&x[1]))+((x[5]&x[2])+(x[4]&x[3]));
dup24 =
{dup241,1'b0};
dup251
=
(x[6]&x[0])+(x[5]&x[1])+(x[4]&x[2]);
dup25 =
{dup251,x[3]};
dup261
=
(x[5]&x[0])+(x[4]&x[1])+(x[3]&x[2]);
dup26 =
{dup261,1'b0};
dup271
=
(x[4]&x[0])+(x[3]&x[1]);
dup27 =
{dup271,x[2]};
dup281
=
(x[3]&x[0])+(x[2]&x[1]);
dup28 =
{dup281,1'b0};
dup29
=
{(x[2]&x[0]),x[1]};
dup30
=
{(x[1]&x[0]),1'b0};
dup31
=
x[0];
end
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]

levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;

172

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] ) ;
levela28=
( dup28[0] + dup29[1] ) ;
levela29=
( dup29[0] + dup30[1] ) ;
levela30=
( dup30[0] ) ;
levela31=
( dup31) ;
end
reg
reg
reg
reg

levelb1;
[1:0] levelb2;
[1:0] levelb3;
[1:0] levelb4;

173

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;
levelb13=
( levela12[0] + levela13[1] + levela12a[0] ) ;
levelb14=
( levela13[0] + levela14[1] + dup16[3] ) ;
levelb15=
( levela14[0] + levela15[1] + dup17[3] ) ;
levelb16=
( levela15[0] + levela16[1] + dup18[3] ) ;
levelb17=
( levela16[0] + levela17[1] + dup19[3] ) ;
levelb18=
( levela17[0] + levela18[1] + dup20[3] ) ;
levelb19=
( levela18[0] + levela19[1] + dup21[3] ) ;
levelb20=
( levela19[0] + levela20[1] + dup22[3] ) ;
levelb21=
( levela20[0] + levela21[1] + dup23[3] ) ;
levelb22=
( levela21[0] + levela22[1] + dup24[3] ) ;
levelb23= (levela22[0] + levela23[1]) ;

174

levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

(levela23[0] + levela24[1])
(levela24[0] + levela25[1])
(levela25[0] + levela26[1])
(levela26[0] + levela27[1])
(levela27[0] + levela28[1])
(levela28[0] + levela29[1])
(levela29[0]) ;
(levela30) ;
(levela31) ;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

;
;
;
;
;
;

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );

175

levelc8=
levelc9=
levelc10=
levelc11=
levelc12=
levelc13=
levelc14=
levelc15=
levelc16=
levelc17=
levelc18=
levelc19=
levelc20=
levelc21=
levelc22=
levelc23=
levelc24=
levelc25=
levelc26=
levelc27=
levelc28=
levelc29=
levelc30=
levelc31=
levelc32=
end

( levelb8[0] + levelb9[1] );
( levelb9[0] + levelb10[1] );
( levelb10[0] + levelb11[1] );
( levelb11[0] + levelb12[1] );
( levelb12[0] + levelb13[1] + levela12a[1]);
( levelb13[0] + levelb14[1] );
( levelb14[0] + levelb15[1] );
( levelb15[0] + levelb16[1] );
( levelb16[0] + levelb17[1] );
( levelb17[0] + levelb18[1] );
( levelb18[0] + levelb19[1] );
( levelb19[0] + levelb20[1] );
( levelb20[0] + levelb21[1] );
( levelb21[0] + levelb22[1] );
(levelb22[0] + levelb23[1]) ;
(levelb23[0] + levelb24[1]) ;
(levelb24[0] + levelb25[1]) ;
(levelb25[0] + levelb26[1]) ;
(levelb26[0] + levelb27[1]) ;
(levelb27[0] + levelb28[1]) ;
(levelb28[0] + levelb29[1]) ;
(levelb29[0]) ;
(levelb30) ;
(levelb31) ;
(levelb32) ;

wire [31:0] pl,pm;


assign pl =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],
levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc26
[0],levelc27[0],levelc28[0],levelc29[0],levelc30,levelc31,levelc32};
assign pm =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],4'b0000};
reg [31:0] p;
always@(*) begin
// infer cla
p[31:4] = pl[31:4] + pm[31:4];
p[3:0] = p1[3:0];
p1 = p[31:16];
p2 = p[15:0];
end
endmodule

176

module mult_VW_18(
input
[17:0] x,
input [15:0]
y,
output reg [33:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;
dup33;

always@(*) begin
dup1 = (x[17]&y[15]);
dup2 = ((x[17]&y[14])+(x[16]&y[15])) ;
dup3 = ((x[17]&y[13])+(x[16]&y[14])) + ((x[15]&y[15])) ;
dup4 = ( ((x[17]&y[12])+(x[16]&y[13])) + ((x[15]&y[14])+(x[14]&y[15])) )
;
dup5 = ( ((x[17]&y[11])+(x[16]&y[12])) + ((x[15]&y[13])+(x[14]&y[14])) )
+ ( ((x[13]&y[15])) ) ;
dup6 = ( ((x[17]&y[10])+(x[16]&y[11])) + ((x[15]&y[12])+(x[14]&y[13])) )
+ ( ((x[13]&y[14])+(x[12]&y[15])) ) ;
dup7 = ( ((x[17]&y[9])+(x[16]&y[10])) + ((x[15]&y[11])+(x[14]&y[12])) ) +
( ((x[13]&y[13])+(x[12]&y[14])) + ((x[11]&y[15])) ) ;

177

dup8 = ( ( ((x[17]&y[8])+(x[16]&y[9])) + ((x[15]&y[10])+(x[14]&y[11])) )


+ ( ((x[13]&y[12])+(x[12]&y[13])) + ((x[11]&y[14])+(x[10]&y[15])) ) ) ;
dup9 = ( ( ((x[17]&y[7])+(x[16]&y[8])) + ((x[15]&y[9])+(x[14]&y[10])) ) +
( ((x[13]&y[11])+(x[12]&y[12])) + ((x[11]&y[13])+(x[10]&y[14])) ) ) + ( (
((x[9]&y[15])) ) ) ;
dup10 = ( ( ((x[17]&y[6])+(x[16]&y[7])) + ((x[15]&y[8])+(x[14]&y[9])) ) +
( ((x[13]&y[10])+(x[12]&y[11])) + ((x[11]&y[12])+(x[10]&y[13])) ) ) + ( (
((x[9]&y[14])+(x[8]&y[15])) ) ) ;
dup11 = ( ( ((x[17]&y[5])+(x[16]&y[6])) + ((x[15]&y[7])+(x[14]&y[8])) ) +
( ((x[13]&y[9])+(x[12]&y[10])) + ((x[11]&y[11])+(x[10]&y[12])) ) ) + ( (
((x[9]&y[13])+(x[8]&y[14])) + ((x[7]&y[15])) ) ) ;
dup12 = ( ( ((x[17]&y[4])+(x[16]&y[5])) + ((x[15]&y[6])+(x[14]&y[7])) ) +
( ((x[13]&y[8])+(x[12]&y[9])) + ((x[11]&y[10])+(x[10]&y[11])) ) ) + ( (
((x[9]&y[12])+(x[8]&y[13])) + ((x[7]&y[14])+(x[6]&y[15])) ) ) ;
dup13 = ( ( ((x[17]&y[3])+(x[16]&y[4])) + ((x[15]&y[5])+(x[14]&y[6])) ) +
( ((x[13]&y[7])+(x[12]&y[8])) + ((x[11]&y[9])+(x[10]&y[10])) ) ) + ( (
((x[9]&y[11])+(x[8]&y[12])) + ((x[7]&y[13])+(x[6]&y[14])) ) + (
((x[5]&y[15])) ) ) ;
dup14 = ( ( ((x[17]&y[2])+(x[16]&y[3])) + ((x[15]&y[4])+(x[14]&y[5])) ) +
( ((x[13]&y[6])+(x[12]&y[7])) + ((x[11]&y[8])+(x[10]&y[9])) ) ) + ( (
((x[9]&y[10])+(x[8]&y[11])) + ((x[7]&y[12])+(x[6]&y[13])) ) + (
((x[5]&y[14])+(x[4]&y[15])) ) ) ;
dup15 = ( ( ((x[17]&y[1])+(x[16]&y[2])) + ((x[15]&y[3])+(x[14]&y[4])) ) +
( ((x[13]&y[5])+(x[12]&y[6])) + ((x[11]&y[7])+(x[10]&y[8])) ) ) + ( (
((x[9]&y[9])+(x[8]&y[10])) + ((x[7]&y[11])+(x[6]&y[12])) ) + (
((x[5]&y[13])+(x[4]&y[14])) + ((x[3]&y[15])) ) ) ;
dup16 = ( ( ( ((x[17]&y[0])+(x[16]&y[1])) + ((x[15]&y[2])+(x[14]&y[3])) )
+ ( ((x[13]&y[4])+(x[12]&y[5])) + ((x[11]&y[6])+(x[10]&y[7])) ) ) + ( (
((x[9]&y[8])+(x[8]&y[9])) + ((x[7]&y[10])+(x[6]&y[11])) ) + (
((x[5]&y[12])+(x[4]&y[13])) + ((x[3]&y[14])+(x[2]&y[15])) ) ) ) ;
dup17 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3])) )
+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) ;
dup18 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup19 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup20 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup21 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup22 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;

178

dup23 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (


((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup24 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup25 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup26 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup27 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup28 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup29 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup30 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup31 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup32 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup33 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;
levela14;
levela14a;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;

179

reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela28;
levela29;
levela30;
levela31;
levela32;
levela33;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela13a = ( dup16[3] + dup17[4] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela14a = ( dup17[3] + dup18[4] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] + dup29[2]) ;
levela28=
( dup28[0] + dup29[1] + dup30[2]) ;
levela29=
( dup29[0] + dup30[1] ) ;
levela30=
( dup30[0] + dup31[1]) ;
levela31=
( dup31[0] + dup32[1]) ;
levela32=
( dup32[0]);
levela33=
( dup33);
end
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;

180

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;
levelb34;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;
levelb13=
( levela12[0] + levela13[1] + levela12a[0] ) ;
levelb14=
( levela13[0] + levela14[1] + levela13a[0] ) ;
levelb15=
( levela14[0] + levela15[1] + levela14a[0] ) ;
levelb16=
( levela15[0] + levela16[1] + dup18[3] ) ;
levelb17=
( levela16[0] + levela17[1] + dup19[3] ) ;
levelb18=
( levela17[0] + levela18[1] + dup20[3] ) ;
levelb19=
( levela18[0] + levela19[1] + dup21[3] ) ;
levelb20=
( levela19[0] + levela20[1] + dup22[3] ) ;
levelb21=
( levela20[0] + levela21[1] + dup23[3] ) ;
levelb22=
( levela21[0] + levela22[1] + dup24[3] ) ;
levelb23= (levela22[0] + levela23[1] + dup25[3]) ;

181

levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
levelb33=
levelb34=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

(levela23[0] + levela24[1] + dup26[3]) ;


(levela24[0] + levela25[1]) ;
(levela25[0] + levela26[1]) ;
(levela26[0] + levela27[1]) ;
(levela27[0] + levela28[1]) ;
(levela28[0] + levela29[1]) ;
(levela29[0] +levela30[1]) ;
(levela30[0] +levela31[1]) ;
(levela31[0]+levela32[1]) ;
(levela32[0]) ;
(levela33) ;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;
levelc33;
levelc34;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;

182

levelc4=
levelc5=
levelc6=
levelc7=
levelc8=
levelc9=
levelc10=
levelc11=
levelc12=
levelc13=
levelc14=
levelc15=
levelc16=
levelc17=
levelc18=
levelc19=
levelc20=
levelc21=
levelc22=
levelc23=
levelc24=
levelc25=
levelc26=
levelc27=
levelc28=
levelc29=
levelc30=
levelc31=
levelc32=
levelc33=
levelc34=
end

( levelb4[0] + levelb5[1]) ;
( levelb5[0] + levelb6[1] );
( levelb6[0] + levelb7[1] );
( levelb7[0] + levelb8[1] );
( levelb8[0] + levelb9[1] );
( levelb9[0] + levelb10[1] );
( levelb10[0] + levelb11[1] );
( levelb11[0] + levelb12[1] );
( levelb12[0] + levelb13[1] + levela12a[1]);
( levelb13[0] + levelb14[1] + levela13a[1]);
( levelb14[0] + levelb15[1] + levela14a[1]);
( levelb15[0] + levelb16[1] );
( levelb16[0] + levelb17[1] );
( levelb17[0] + levelb18[1] );
( levelb18[0] + levelb19[1] );
( levelb19[0] + levelb20[1] );
( levelb20[0] + levelb21[1] );
( levelb21[0] + levelb22[1] );
(levelb22[0] + levelb23[1]) ;
(levelb23[0] + levelb24[1]) ;
(levelb24[0] + levelb25[1]) ;
(levelb25[0] + levelb26[1]) ;
(levelb26[0] + levelb27[1]) ;
(levelb27[0] + levelb28[1]) ;
(levelb28[0] + levelb29[1]) ;
(levelb29[0] + levelb30[1]) ;
(levelb30[0] + levelb31[1]) ;
(levelb31[0] + levelb32[1]) ;
(levelb32[0]) ;
(levelb33) ;
(levelb34) ;

wire [33:0] p1,p2;


assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31[0],levelc32,
levelc33,levelc34};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],levelc31[1],4'b0000};
always@(*) begin
//infer cla
p[33:4] = p1[33:4] + p2[33:4];
p[3:0] = p1[3:0];

183

end
endmodule
module mult_M17 (
input
[16:0] x,
input [15:0]
y,
output reg [32:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;

always@(*) begin
dup1 = (x[16]&y[15]);
dup2 = ((x[16]&y[14])+(x[15]&y[15])) ;
dup3 = ((x[16]&y[13])+(x[15]&y[14])) +
dup4 = ( ((x[16]&y[12])+(x[15]&y[13]))
;
dup5 = ( ((x[16]&y[11])+(x[15]&y[12]))
+ ( ((x[12]&y[15])) ) ;
dup6 = ( ((x[16]&y[10])+(x[15]&y[11]))
+ ( ((x[12]&y[14])+(x[11]&y[15])) ) ;

((x[14]&y[15])) ;
+ ((x[14]&y[14])+(x[13]&y[15])) )
+ ((x[14]&y[13])+(x[13]&y[14])) )
+ ((x[14]&y[12])+(x[13]&y[13])) )

184

dup7 = ( ((x[16]&y[9])+(x[15]&y[10])) + ((x[14]&y[11])+(x[13]&y[12])) ) +


( ((x[12]&y[13])+(x[11]&y[14])) + ((x[10]&y[15])) ) ;
dup8 = ( ( ((x[16]&y[8])+(x[15]&y[9])) + ((x[14]&y[10])+(x[13]&y[11])) )
+ ( ((x[12]&y[12])+(x[11]&y[13])) + ((x[10]&y[14])+(x[9]&y[15])) ) ) ;
dup9 = ( ( ((x[16]&y[7])+(x[15]&y[8])) + ((x[14]&y[9])+(x[13]&y[10])) ) +
( ((x[12]&y[11])+(x[11]&y[12])) + ((x[10]&y[13])+(x[9]&y[14])) ) ) + ( (
((x[8]&y[15])) ) ) ;
dup10 = ( ( ((x[16]&y[6])+(x[15]&y[7])) + ((x[14]&y[8])+(x[13]&y[9])) ) +
( ((x[12]&y[10])+(x[11]&y[11])) + ((x[10]&y[12])+(x[9]&y[13])) ) ) + ( (
((x[8]&y[14])+(x[7]&y[15])) ) ) ;
dup11 = ( ( ((x[16]&y[5])+(x[15]&y[6])) + ((x[14]&y[7])+(x[13]&y[8])) ) +
( ((x[12]&y[9])+(x[11]&y[10])) + ((x[10]&y[11])+(x[9]&y[12])) ) ) + ( (
((x[8]&y[13])+(x[7]&y[14])) + ((x[6]&y[15])) ) ) ;
dup12 = ( ( ((x[16]&y[4])+(x[15]&y[5])) + ((x[14]&y[6])+(x[13]&y[7])) ) +
( ((x[12]&y[8])+(x[11]&y[9])) + ((x[10]&y[10])+(x[9]&y[11])) ) ) + ( (
((x[8]&y[12])+(x[7]&y[13])) + ((x[6]&y[14])+(x[5]&y[15])) ) ) ;
dup13 = ( ( ((x[16]&y[3])+(x[15]&y[4])) + ((x[14]&y[5])+(x[13]&y[6])) ) +
( ((x[12]&y[7])+(x[11]&y[8])) + ((x[10]&y[9])+(x[9]&y[10])) ) ) + ( (
((x[8]&y[11])+(x[7]&y[12])) + ((x[6]&y[13])+(x[5]&y[14])) ) + (
((x[4]&y[15])) ) ) ;
dup14 = ( ( ((x[16]&y[2])+(x[15]&y[3])) + ((x[14]&y[4])+(x[13]&y[5])) ) +
( ((x[12]&y[6])+(x[11]&y[7])) + ((x[10]&y[8])+(x[9]&y[9])) ) ) + ( (
((x[8]&y[10])+(x[7]&y[11])) + ((x[6]&y[12])+(x[5]&y[13])) ) + (
((x[4]&y[14])+(x[3]&y[15])) ) ) ;
dup15 = ( ( ((x[16]&y[1])+(x[15]&y[2])) + ((x[14]&y[3])+(x[13]&y[4])) ) +
( ((x[12]&y[5])+(x[11]&y[6])) + ((x[10]&y[7])+(x[9]&y[8])) ) ) + ( (
((x[8]&y[9])+(x[7]&y[10])) + ((x[6]&y[11])+(x[5]&y[12])) ) + (
((x[4]&y[13])+(x[3]&y[14])) + ((x[2]&y[15])) ) ) ;
dup16 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3])) )
+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) ;
dup17 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup18 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup19 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup20 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup21 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;

185

dup22 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (


((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup23 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup24 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup25 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup26 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup27 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup28 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup29 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup30 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup31 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup32 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[1:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;

186

reg
reg
reg
reg

[1:0] levela29;
[1:0] levela30;
[1:0] levela31;
levela32;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela13a = ( dup16[3] + dup17[4] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] + dup29[2]) ;
levela28=
( dup28[0] + dup29[1] ) ;
levela29=
( dup29[0] + dup30[1] ) ;
levela30=
( dup30[0] + dup31[1] ) ;
levela31=
( dup31[0]) ;
levela32=
( dup32) ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;

187

reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;
levelb13=
( levela12[0] + levela13[1] + levela12a[0] ) ;
levelb14=
( levela13[0] + levela14[1] + levela13a[0] ) ;
levelb15=
( levela14[0] + levela15[1] + dup17[3] ) ;
levelb16=
( levela15[0] + levela16[1] + dup18[3] ) ;
levelb17=
( levela16[0] + levela17[1] + dup19[3] ) ;
levelb18=
( levela17[0] + levela18[1] + dup20[3] ) ;
levelb19=
( levela18[0] + levela19[1] + dup21[3] ) ;
levelb20=
( levela19[0] + levela20[1] + dup22[3] ) ;
levelb21=
( levela20[0] + levela21[1] + dup23[3] ) ;
levelb22=
( levela21[0] + levela22[1] + dup24[3] ) ;
levelb23=
(levela22[0] + levela23[1] + dup25[3]) ;
levelb24=
(levela23[0] + levela24[1]) ;
levelb25=
(levela24[0] + levela25[1]) ;
levelb26=
(levela25[0] + levela26[1]) ;
levelb27=
(levela26[0] + levela27[1]) ;

188

levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
levelb33=
end

(levela27[0] + levela28[1])
(levela28[0] + levela29[1])
(levela29[0] + levela30[1])
(levela30[0] + levela31[1])
(levela31[0]) ;
(levela32) ;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;
levelc33;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

;
;
;
;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );
levelc8=
( levelb8[0] + levelb9[1] );
levelc9=
( levelb9[0] + levelb10[1] );

189

levelc10=
levelc11=
levelc12=
levelc13=
levelc14=
levelc15=
levelc16=
levelc17=
levelc18=
levelc19=
levelc20=
levelc21=
levelc22=
levelc23=
levelc24=
levelc25=
levelc26=
levelc27=
levelc28=
levelc29=
levelc30=
levelc31=
levelc32=
levelc33=
end

( levelb10[0] + levelb11[1]
( levelb11[0] + levelb12[1]
( levelb12[0] + levelb13[1]
( levelb13[0] + levelb14[1]
( levelb14[0] + levelb15[1]
( levelb15[0] + levelb16[1]
( levelb16[0] + levelb17[1]
( levelb17[0] + levelb18[1]
( levelb18[0] + levelb19[1]
( levelb19[0] + levelb20[1]
( levelb20[0] + levelb21[1]
( levelb21[0] + levelb22[1]
(levelb22[0] + levelb23[1])
(levelb23[0] + levelb24[1])
(levelb24[0] + levelb25[1])
(levelb25[0] + levelb26[1])
(levelb26[0] + levelb27[1])
(levelb27[0] + levelb28[1])
(levelb28[0] + levelb29[1])
(levelb29[0] + levelb30[1])
(levelb30[0] + levelb31[1])
(levelb31[0]) ;
(levelb32) ;
(levelb33) ;

);
);
+ levela12a[1]);
+ levela13a[1]);
);
);
);
);
);
);
);
);
;
;
;
;
;
;
;
;
;

wire [32:0] p1,p2;


assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31,levelc32,lev
elc33};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],4'b0000};
always@(*) begin
// infer cla
p[32:4] = p1[32:4] + p2[32:4];
p[3:0] = p1[3:0];
end
endmodule
module mult_L17 (
input
[16:0] x,
input [15:0]
y,

190

output reg

[16:0] p

);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;

always@(*) begin
dup1 = (x[16]&y[15]);
dup2 = ((x[16]&y[14])+(x[15]&y[15])) ;
dup3 = ((x[16]&y[13])+(x[15]&y[14])) + ((x[14]&y[15])) ;
dup4 = ( ((x[16]&y[12])+(x[15]&y[13])) + ((x[14]&y[14])+(x[13]&y[15])) )
;
dup5 = ( ((x[16]&y[11])+(x[15]&y[12])) + ((x[14]&y[13])+(x[13]&y[14])) )
+ ( ((x[12]&y[15])) ) ;
dup6 = ( ((x[16]&y[10])+(x[15]&y[11])) + ((x[14]&y[12])+(x[13]&y[13])) )
+ ( ((x[12]&y[14])+(x[11]&y[15])) ) ;
dup7 = ( ((x[16]&y[9])+(x[15]&y[10])) + ((x[14]&y[11])+(x[13]&y[12])) ) +
( ((x[12]&y[13])+(x[11]&y[14])) + ((x[10]&y[15])) ) ;
dup8 = ( ( ((x[16]&y[8])+(x[15]&y[9])) + ((x[14]&y[10])+(x[13]&y[11])) )
+ ( ((x[12]&y[12])+(x[11]&y[13])) + ((x[10]&y[14])+(x[9]&y[15])) ) ) ;
dup9 = ( ( ((x[16]&y[7])+(x[15]&y[8])) + ((x[14]&y[9])+(x[13]&y[10])) ) +
( ((x[12]&y[11])+(x[11]&y[12])) + ((x[10]&y[13])+(x[9]&y[14])) ) ) + ( (
((x[8]&y[15])) ) ) ;

191

dup10 = ( ( ((x[16]&y[6])+(x[15]&y[7])) + ((x[14]&y[8])+(x[13]&y[9])) ) +


( ((x[12]&y[10])+(x[11]&y[11])) + ((x[10]&y[12])+(x[9]&y[13])) ) ) + ( (
((x[8]&y[14])+(x[7]&y[15])) ) ) ;
dup11 = ( ( ((x[16]&y[5])+(x[15]&y[6])) + ((x[14]&y[7])+(x[13]&y[8])) ) +
( ((x[12]&y[9])+(x[11]&y[10])) + ((x[10]&y[11])+(x[9]&y[12])) ) ) + ( (
((x[8]&y[13])+(x[7]&y[14])) + ((x[6]&y[15])) ) ) ;
dup12 = ( ( ((x[16]&y[4])+(x[15]&y[5])) + ((x[14]&y[6])+(x[13]&y[7])) ) +
( ((x[12]&y[8])+(x[11]&y[9])) + ((x[10]&y[10])+(x[9]&y[11])) ) ) + ( (
((x[8]&y[12])+(x[7]&y[13])) + ((x[6]&y[14])+(x[5]&y[15])) ) ) ;
dup13 = ( ( ((x[16]&y[3])+(x[15]&y[4])) + ((x[14]&y[5])+(x[13]&y[6])) ) +
( ((x[12]&y[7])+(x[11]&y[8])) + ((x[10]&y[9])+(x[9]&y[10])) ) ) + ( (
((x[8]&y[11])+(x[7]&y[12])) + ((x[6]&y[13])+(x[5]&y[14])) ) + (
((x[4]&y[15])) ) ) ;
dup14 = ( ( ((x[16]&y[2])+(x[15]&y[3])) + ((x[14]&y[4])+(x[13]&y[5])) ) +
( ((x[12]&y[6])+(x[11]&y[7])) + ((x[10]&y[8])+(x[9]&y[9])) ) ) + ( (
((x[8]&y[10])+(x[7]&y[11])) + ((x[6]&y[12])+(x[5]&y[13])) ) + (
((x[4]&y[14])+(x[3]&y[15])) ) ) ;
dup15 = ( ( ((x[16]&y[1])+(x[15]&y[2])) + ((x[14]&y[3])+(x[13]&y[4])) ) +
( ((x[12]&y[5])+(x[11]&y[6])) + ((x[10]&y[7])+(x[9]&y[8])) ) ) + ( (
((x[8]&y[9])+(x[7]&y[10])) + ((x[6]&y[11])+(x[5]&y[12])) ) + (
((x[4]&y[13])+(x[3]&y[14])) + ((x[2]&y[15])) ) ) ;
dup16 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3])) )
+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) ;
dup17 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup18 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup19 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup20 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup21 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup22 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup23 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup24 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;

192

dup25 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3]))


((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup26 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) )
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup27 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) )
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup28 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) )
((x[0]&y[4])) ) ;
dup29 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) )
dup30 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup31 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup32 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[1:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]

) + (
+ (
+ (
+ (
;

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;
levela32;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;

193

levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela13a = ( dup16[3] + dup17[4] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] + dup29[2]) ;
levela28=
( dup28[0] + dup29[1] ) ;
levela29=
( dup29[0] + dup30[1] ) ;
levela30=
( dup30[0] + dup31[1] ) ;
levela31=
( dup31[0]) ;
levela32=
( dup32) ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;

194

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;
levelb13=
( levela12[0] + levela13[1] + levela12a[0] ) ;
levelb14=
( levela13[0] + levela14[1] + levela13a[0] ) ;
levelb15=
( levela14[0] + levela15[1] + dup17[3] ) ;
levelb16=
( levela15[0] + levela16[1] + dup18[3] ) ;
levelb17=
( levela16[0] + levela17[1] + dup19[3] ) ;
levelb18=
( levela17[0] + levela18[1] + dup20[3] ) ;
levelb19=
( levela18[0] + levela19[1] + dup21[3] ) ;
levelb20=
( levela19[0] + levela20[1] + dup22[3] ) ;
levelb21=
( levela20[0] + levela21[1] + dup23[3] ) ;
levelb22=
( levela21[0] + levela22[1] + dup24[3] ) ;
levelb23=
(levela22[0] + levela23[1] + dup25[3]) ;
levelb24=
(levela23[0] + levela24[1]) ;
levelb25=
(levela24[0] + levela25[1]) ;
levelb26=
(levela25[0] + levela26[1]) ;
levelb27=
(levela26[0] + levela27[1]) ;
levelb28=
(levela27[0] + levela28[1]) ;
levelb29=
(levela28[0] + levela29[1]) ;
levelb30=
(levela29[0] + levela30[1]) ;
levelb31=
(levela30[0] + levela31[1]) ;
levelb32=
(levela31[0]) ;
levelb33=
(levela32) ;
end

195

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;
levelc33;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );
levelc8=
( levelb8[0] + levelb9[1] );
levelc9=
( levelb9[0] + levelb10[1] );
levelc10=
( levelb10[0] + levelb11[1] );
levelc11=
( levelb11[0] + levelb12[1] );
levelc12=
( levelb12[0] + levelb13[1] + levela12a[1]);
levelc13=
( levelb13[0] + levelb14[1] + levela13a[1]);
levelc14=
( levelb14[0] + levelb15[1] );
levelc15=
( levelb15[0] + levelb16[1] );
levelc16=
( levelb16[0] + levelb17[1] );
levelc17=
( levelb17[0] + levelb18[1] );
levelc18=
( levelb18[0] + levelb19[1] );

196

levelc19=
levelc20=
levelc21=
levelc22=
levelc23=
levelc24=
levelc25=
levelc26=
levelc27=
levelc28=
levelc29=
levelc30=
levelc31=
levelc32=
levelc33=
end

( levelb19[0] + levelb20[1]
( levelb20[0] + levelb21[1]
( levelb21[0] + levelb22[1]
(levelb22[0] + levelb23[1])
(levelb23[0] + levelb24[1])
(levelb24[0] + levelb25[1])
(levelb25[0] + levelb26[1])
(levelb26[0] + levelb27[1])
(levelb27[0] + levelb28[1])
(levelb28[0] + levelb29[1])
(levelb29[0] + levelb30[1])
(levelb30[0] + levelb31[1])
(levelb31[0]) ;
(levelb32) ;
(levelb33) ;

);
);
);
;
;
;
;
;
;
;
;
;

wire [32:0] p1,p2;


reg [32:0] p3;
assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31,levelc32,lev
elc33};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],4'b0000};
always@(*) begin
// infer cla
p3[32:4] = p1[32:4] + p2[32:4];
p3[3:0] = p1[3:0];
p = p3[32:16];
end
endmodule
module combine_sin16 (
input
[32:0] a,
input
[16:0] b,
input
[33:0] c,
input
[15:0] d,
input clk,
input sign,
output reg [17:0] p
);

197

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
e33;

e1;
e2;
e3;
e4;
e5;
e6;
e7;
e8;
e9;
e10;
e11;
e12;
e13;
e14;
e15;
e16;
e17;
e18;
e19;
e20;
e21;
e22;
e23;
e24;
e25;
e26;
e27;
e28;
e29;
e30;
e31;
e32;

always@(*) begin
e1 = a[0] + b[0];
e2 = a[1] + b[1];
e3 = a[2] + b[2];
e4 = a[3] + b[3];
e5 = a[4] + b[4];
e6 = a[5] + b[5];
e7 = a[6] + b[6];
e8 = a[7] + b[7];
e9 = a[8] + b[8];
e10 = a[9] + b[9];
e11 = a[10] + b[10];
e12 = a[11] + b[11];
e13 = a[12] + b[12];
e14 = a[13] + b[13];
e15 = a[14] + b[14];
e16 = a[15] + b[15];
e17 = a[16] + b[16] + d[0];

198

e18
e19
e20
e21
e22
e23
e24
e25
e26
e27
e28
e29
e30
e31
e32
e33
end

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

a[17] + d[1];
a[18] + d[2];
a[19] + d[3];
a[20] + d[4];
a[21] + d[5];
a[22] + d[6];
a[23] + d[7];
a[24] + d[8];
a[25] + d[9];
a[26] + d[10];
a[27] +d[11];
a[28] + d[12];
a[29] + d[13];
a[30] + d[14];
a[31] + d[15];
a[32];

reg [33:0] p1,p2;


reg [34:0] p4,p3;
always@(*) begin
//infer cla
p1 =
{1'b0,e33,e32[0],e31[0],e30[0],e29[0],e28[0],e27[0],e26[0],e25[0],e24[0],e
23[0],e22[0],e21[0],e20[0],e19[0],e18[0],e17[0],e16[0],e15[0],e14[0],e13[0
],e12[0],e11[0],e10[0],e9[0],e8[0],e7[0],e6[0],e5[0],e4[0],e3[0],e2[0],e1[
0]};
p2 =
{e32[1],e31[1],e30[1],e29[1],e28[1],e27[1],e26[1],e25[1],e24[1],e23[1],e22
[1],e21[1],e20[1],e19[1],e18[1],e17[1],e16[1],e15[1],e14[1],e13[1],e12[1],
e11[1],e10[1],e9[1],e8[1],e7[1],e6[1],e5[1],e4[1],e3[1],e2[1],e1[1],1'b0};
p3 = p1+p2;
p4 = c-p3;
end
always@(posedge clk) begin
p[16:0] = p4[32:16];
p[17] = sign;
end
endmodule
module counter(
input clock,
input [17:0] angle,
output [17:0] sina
);
wire [15:0] angsqm;
wire [15:0] angsql;

199

wire [15:0] co1;


wire [17:0] co2;
wire [16:0] co3;
wire
wire
wire
wire
wire

[32:0] a;
[16:0] b;
[33:0] c;
[15:0] rangle;
sign;

get_quadrant quad(.angle(angle),.rangle(rangle),.sign(sign));
square_sin_16 sq_angle (.x(rangle),.p1(angsqm),.p2(angsql));
get_coeffs_sin16 get_co(.angle(rangle),.co1(co1),.co2(co2),.co3(co3));
mult_M17 angle_sqm_co (.x(co3),.y(angsqm),.p(a));
mult_L17 angle_sql_co (.x(co3),.y(angsql),.p(b));
mult_VW_18 angle_co (.x(co2),.y(rangle),.p(c));
combine_sin16
comb(.a(a),.b(b),.c(c),.d(co1),.p(sina),.clk(clock),.sign(sign));
endmodule
8 bit Cosine
module counter (
input
[9:0] angle,
input clock,
output reg [9:0] cosa
);
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter

[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]

reg
reg
reg
reg
reg

coeffo;
coefft;
p;
rangle;

[8:0]
[8:0]
[8:0]
[7:0]
sign;

s01
s11
s21
s31
s41
s51
s61
s71
s81
s91
sa1
sb1
sc1
sd1
se1
sf1

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

9'b000010000;
9'b000111010;
9'b001100001;
9'b010000111;
9'b010101011;
9'b011001110;
9'b011101111;
9'b100001110;
9'b100101010;
9'b101000100;
9'b101011000;
9'b101101011;
9'b101111011;
9'b110000110;
9'b110001101;
9'b110010010;

parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter
parameter

[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]
[8:0]

s02
s12
s22
s32
s42
s52
s62
s72
s82
s92
sa2
sb2
sc2
sd2
se2
sf2

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

9'b100000000;
9'b100000011;
9'b100001000;
9'b100001111;
9'b100011000;
9'b100100011;
9'b100101111;
9'b100111100;
9'b101001010;
9'b101011000;
9'b101100110;
9'b101110011;
9'b101111110;
9'b110000111;
9'b110001110;
9'b110010000;

200

always@(*) begin
if((angle[9]^angle[8])==1'b1) begin
if(angle[8:0]==9'h100)
sign = 1'b0;
else
sign = 1'b1;
end
else begin
sign = 1'b0;
end
end
always@(*) begin
if(angle[8]==1'b1)
rangle = ~(angle[7:0]);
else
rangle = (angle[7:0]);
end
always@(*) begin
case(rangle[7:4])
4'h0: begin coeffo = s01; coefft
4'h1: begin coeffo = s11; coefft
4'h2: begin coeffo = s21; coefft
4'h3: begin coeffo = s31; coefft
4'h4: begin coeffo = s41; coefft
4'h5: begin coeffo = s51; coefft
4'h6: begin coeffo = s61; coefft
4'h7: begin coeffo = s71; coefft
4'h8: begin coeffo = s81; coefft
4'h9: begin coeffo = s91; coefft
4'ha: begin coeffo = sa1; coefft
4'hb: begin coeffo = sb1; coefft
4'hc: begin coeffo = sc1; coefft
4'hd: begin coeffo = sd1; coefft
4'he: begin coeffo = se1; coefft
4'hf: begin coeffo = sf1; coefft
endcase
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

s02;
s12;
s22;
s32;
s42;
s52;
s62;
s72;
s82;
s92;
sa2;
sb2;
sc2;
sd2;
se2;
sf2;

end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end

dup1;
[1:0] dup2;
[1:0] dup3;
[2:0] dup4;
[2:0] dup5;
[2:0] dup6;
[2:0] dup7;
[3:0] dup8;
[3:0] dup9;
[2:0] dup10;
[2:0] dup11;
[2:0] dup12;
[2:0] dup13;
[1:0] dup14;

201

reg [1:0] dup15;


reg dup16;
always@(*) begin
dup1 = (coeffo[8]&rangle[7]);
dup2 = ((coeffo[8]&rangle[6])+(coeffo[7]&rangle[7])) ;
dup3 = ((coeffo[8]&rangle[5])+(coeffo[7]&rangle[6])) +
((coeffo[6]&rangle[7])) ;
dup4 = ( ((coeffo[8]&rangle[4])+(coeffo[7]&rangle[5])) +
((coeffo[6]&rangle[6])+(coeffo[5]&rangle[7])) ) ;
dup5 = ( ((coeffo[8]&rangle[3])+(coeffo[7]&rangle[4])) +
((coeffo[6]&rangle[5])+(coeffo[5]&rangle[6])) ) + (
((coeffo[4]&rangle[7])) ) ;
dup6 = ( ((coeffo[8]&rangle[2])+(coeffo[7]&rangle[3])) +
((coeffo[6]&rangle[4])+(coeffo[5]&rangle[5])) ) + (
((coeffo[4]&rangle[6])+(coeffo[3]&rangle[7])) ) ;
dup7 = ( ((coeffo[8]&rangle[1])+(coeffo[7]&rangle[2])) +
((coeffo[6]&rangle[3])+(coeffo[5]&rangle[4])) ) + (
((coeffo[4]&rangle[5])+(coeffo[3]&rangle[6])) + ((coeffo[2]&rangle[7])) )
;
dup8 = ( ( ((coeffo[8]&rangle[0])+(coeffo[7]&rangle[1])) +
((coeffo[6]&rangle[2])+(coeffo[5]&rangle[3])) ) + (
((coeffo[4]&rangle[4])+(coeffo[3]&rangle[5])) +
((coeffo[2]&rangle[6])+(coeffo[1]&rangle[7])) ) ) ;
dup9 = ( ( ((coeffo[7]&rangle[0])+(coeffo[6]&rangle[1])) +
((coeffo[5]&rangle[2])+(coeffo[4]&rangle[3])) ) + (
((coeffo[3]&rangle[4])+(coeffo[2]&rangle[5])) +
((coeffo[1]&rangle[6])+(coeffo[0]&rangle[7])) ) ) ;
dup10 = ( ((coeffo[6]&rangle[0])+(coeffo[5]&rangle[1])) +
((coeffo[4]&rangle[2])+(coeffo[3]&rangle[3])) ) + (
((coeffo[2]&rangle[4])+(coeffo[1]&rangle[5])) + ((coeffo[0]&rangle[6])) )
;
dup11 = ( ((coeffo[5]&rangle[0])+(coeffo[4]&rangle[1])) +
((coeffo[3]&rangle[2])+(coeffo[2]&rangle[3])) ) + (
((coeffo[1]&rangle[4])+(coeffo[0]&rangle[5])) ) ;
dup12 = ( ((coeffo[4]&rangle[0])+(coeffo[3]&rangle[1])) +
((coeffo[2]&rangle[2])+(coeffo[1]&rangle[3])) ) + (
((coeffo[0]&rangle[4])) ) ;
dup13 = ( ((coeffo[3]&rangle[0])+(coeffo[2]&rangle[1])) +
((coeffo[1]&rangle[2])+(coeffo[0]&rangle[3])) ) ;
dup14 = ((coeffo[2]&rangle[0])+(coeffo[1]&rangle[1])) +
((coeffo[0]&rangle[2])) ;
dup15 = ((coeffo[1]&rangle[0])+(coeffo[0]&rangle[1])) ;
dup16 = (coeffo[0]&rangle[0]);
end
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levela1;
levela2;
levela3;
levela4;
levela5;

202

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
levela6;
[2:0]
levela7;
[2:0]
levela8;
[1:0]
levela9;
[1:0]
levela10;
[1:0]
levela11;
[1:0]
levela12;
[1:0]
levela13;
[1:0] levela14;
levela15;
levela16;

always@(*) begin
levela1 = (dup1 + dup2[1]);
levela2 = (dup2[0] + dup3[1] + dup4[2]) ;
levela3 = (dup3[0] + dup4[1] + dup5[2]);
levela4 = (dup4[0] + dup5[1] + dup6[2]);
levela5 = (dup5[0] + dup6[1] + dup7[2]);
levela6 = (dup6[0] + dup7[1] + dup8[2]);
levela7 = (dup7[0] + dup8[1]) + (dup9[2] + dup8[3]);
levela8 = (dup8[0] + dup9[1]) + (dup10[2] + dup9[3]);
levela9 = (dup9[0] + dup10[1] + dup11[2]) ;
levela10 = (dup10[0] + dup11[1] +dup12[2]) ;
levela11 = (dup11[0] + dup12[1]+dup13[2]) ;
levela12 = (dup12[0] + dup13[1]) ;
levela13 = (dup13[0] + dup14[1]) ;
levela14 = (dup14[0] + dup15[1]) ;
levela15 = dup15[0] ;
levela16 = dup16;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0] levelb1;
[1:0]
levelb2;
[1:0]
levelb3;
[1:0]
levelb4;
[1:0]
levelb5;
[1:0]
levelb6;
[1:0]
levelb7;
[1:0]
levelb8;
[1:0]
levelb9;
[1:0]
levelb10;
[1:0]
levelb11;
[1:0]
levelb12;
[1:0]
levelb13;
[1:0] levelb14;
levelb15;
levelb16;
levelb17;

always@(*) begin
levelb1= levela1[1];

203

levelb2= (levela1[0] + levela2[1]);


levelb3= (levela2[0] + levela3[1]);
levelb4= (levela3[0] + levela4[1]);
levelb5= levela4[0] + levela5[1];
levelb6= levela5[0] + levela6[1] + levela7[2];
levelb7= (levela6[0] + levela7[1] + levela8[2]) ;
levelb8= (levela7[0] + levela8[1]) ;
levelb9= (levela8[0] + levela9[1]) ;
levelb10= (levela9[0] + levela10[1]) ;
levelb11= (levela10[0] + levela11[1]) ;
levelb12= (levela11[0] + levela12[1]) ;
levelb13= (levela12[0] + levela13[1]) ;
levelb14= (levela13[0] + levela14[1]);
levelb15= levela14[0];
levelb16= levela15;
levelb17 = levela16;
end
wire [16:0] q1,q2;
reg [16:0] q;
reg [8:0] s;
assign q1 =
{levelb1,levelb2[0],levelb3[0],levelb4[0],levelb5[0],levelb6[0],levelb7[0]
,levelb8[0],levelb9[0],levelb10[0],levelb11[0],levelb12[0],levelb13[0],lev
elb14[0],levelb15,levelb16,levelb17};
assign q2
={levelb2[1],levelb3[1],levelb4[1],levelb5[1],levelb6[1],levelb7[1],levelb
8[1],levelb9[1],levelb10[1],levelb11[1],levelb12[1],levelb13[1],levelb14[1
],4'b0000};
always@(*) begin
//infer DW01_add
q[16:4] = q1[16:4]+q2[16:4];
q[3:0] = q1[3:0];
p = coefft-(q[16:8]);
end
always@(posedge clock) begin
cosa[8:0] = p;
cosa[9] = sign;
end
endmodule
16 bit Cosine
module get_quadrant(
input [17:0] angle,
output reg [15:0] rangle,
output reg sign
);
always@(*) begin

204

case (angle[16])
1'b0: rangle = angle[15:0];
1'b1: rangle = ~(angle[15:0]);
endcase
end
always@(*) begin
if((angle[17]^angle[16])==1'b1) begin
if(angle[16:0]==17'h10000)
sign = 1'b0;
else
sign = 1'b1;
end
else begin
sign = 1'b0;
end
end
endmodule
module square_cos_16 (
input
[15:0] x,
output reg [15:0] p1,
output reg [15:0] p2
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;

205

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0] dup29;
[1:0] dup30;
[1:0]
[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]
[1:0]

dup31;
dup41;
dup51;
dup61;
dup71;
dup81;
dup91;
dup101;
dup111;
dup121;
dup131;
dup141;
dup151;
dup161;
dup171;
dup181;
dup191;
dup201;
dup211;
dup221;
dup231;
dup241;
dup251;
dup261;
dup271;
dup281;

always@(*) begin
dup1 =
x[15];
dup2 =
{(x[15]&x[14]),1'b0};
dup3 =
{(x[15]&x[13]),x[14]};
dup41
=
(x[15]&x[12])+(x[14]&x[13]);
dup4 =
{dup41,1'b0};
dup51
=
(x[15]&x[11])+(x[14]&x[12]);
dup5 =
{dup51,x[13]};
dup61
=
(x[15]&x[10])+(x[14]&x[11])+(x[13]&x[12]);
dup6 =
{dup61,1'b0};
dup71
=
(x[15]&x[9])+(x[14]&x[10])+(x[13]&x[11]);
dup7 =
{dup71,x[12]};
dup81
=
((x[15]&x[8])+(x[14]&x[9])) +
((x[13]&x[10])+(x[12]&x[11]));
dup8 =
{dup81,1'b0};
dup91
=
((x[15]&x[7])+(x[14]&x[8])) +
((x[13]&x[9])+(x[12]&x[10]));
dup9 =
{dup91,x[11]};
dup101
=
((x[15]&x[6])+(x[14]&x[7])) +
((x[13]&x[8])+(x[12]&x[9])) + (x[11]&x[10]);
dup10 =
{dup101,1'b0};
dup111
=
((x[15]&x[5])+(x[14]&x[6])) +
((x[13]&x[7])+(x[12]&x[8])) + (x[11]&x[9]);
dup11 =
{dup111,x[10]};

206

dup121
=
((x[15]&x[4])+(x[14]&x[5])) +
((x[13]&x[6])+(x[12]&x[7]))+ ((x[11]&x[8])+(x[10]&x[9]));
dup12 =
{dup121,1'b0};
dup131
=
((x[15]&x[3])+(x[14]&x[4])) +
((x[13]&x[5])+(x[12]&x[6]))+ ((x[11]&x[7])+(x[10]&x[8]));
dup13 =
{dup131,x[9]};
dup141
=
(((x[15]&x[2])+(x[14]&x[3])) +
((x[13]&x[4])+(x[12]&x[5])) ) + (((x[11]&x[6])+(x[10]&x[7])) +
(x[9]&x[8]));
dup14 =
{dup141,1'b0};
dup151
=
(((x[15]&x[1])+(x[14]&x[2])) +
((x[13]&x[3])+(x[12]&x[4])) ) + (((x[11]&x[5])+(x[10]&x[6])) +
(x[9]&x[7]));
dup15 =
{dup151,x[8]};
dup161
=
( ((x[15]&x[0])+(x[14]&x[1])) +
((x[13]&x[2])+(x[12]&x[3]))) + ( ((x[11]&x[4])+(x[10]&x[5])) +
((x[9]&x[6])+(x[8]&x[7])) );
dup16 =
{dup161,1'b0};
dup171
=
( ((x[14]&x[0])+(x[13]&x[1])) +
((x[12]&x[2])+(x[11]&x[3])) ) + (((x[10]&x[4])+(x[9]&x[5])) +
(x[8]&x[6]));
dup17 =
{dup171,x[7]};
dup181
=
( ((x[13]&x[0])+(x[12]&x[1])) +
((x[11]&x[2])+(x[10]&x[3])) ) + ((x[9]&x[4])+(x[8]&x[5])+(x[7]&x[6]));
dup18 =
{dup181,1'b0};
dup191
=
( ((x[12]&x[0])+(x[11]&x[1])) +
((x[10]&x[2])+(x[9]&x[3])) ) + ((x[8]&x[4])+(x[7]&x[5]));
dup19 =
{dup191,x[6]};
dup201
=
( ((x[11]&x[0])+(x[10]&x[1])) +
((x[9]&x[2])+(x[8]&x[3])) ) + ((x[7]&x[4]) + (x[6]&x[5]));
dup20 =
{dup201,1'b0};
dup211
=
( ((x[10]&x[0])+(x[9]&x[1])) + ((x[8]&x[2])+(x[7]&x[3]))
) + (x[6]&x[4]);
dup21 =
{dup211,x[5]};
dup221
=
((x[9]&x[0])+(x[8]&x[1])) +
((x[7]&x[2])+(x[6]&x[3])+(x[5]&x[4]));
dup22 =
{dup221,1'b0};
dup231
=
((x[8]&x[0])+(x[7]&x[1])) + ((x[6]&x[2])+(x[5]&x[3]));
dup23 =
{dup231,x[4]};
dup241
=
((x[7]&x[0])+(x[6]&x[1]))+((x[5]&x[2])+(x[4]&x[3]));
dup24 =
{dup241,1'b0};
dup251
=
(x[6]&x[0])+(x[5]&x[1])+(x[4]&x[2]);
dup25 =
{dup251,x[3]};
dup261
=
(x[5]&x[0])+(x[4]&x[1])+(x[3]&x[2]);
dup26 =
{dup261,1'b0};
dup271
=
(x[4]&x[0])+(x[3]&x[1]);
dup27 =
{dup271,x[2]};
dup281
=
(x[3]&x[0])+(x[2]&x[1]);
dup28 =
{dup281,1'b0};
dup29
=
{(x[2]&x[0]),x[1]};
dup30
=
{(x[1]&x[0]),1'b0};
dup31
=
x[0];
end

207

reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;

208

levela16=
levela17=
levela18=
levela19=
levela20=
levela21=
levela22=
levela23=
levela24=
levela25=
levela26=
levela27=
levela28=
levela29=
levela30=
levela31=
end

(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

dup16[0]
dup17[0]
dup18[0]
dup19[0]
dup20[0]
dup21[0]
dup22[0]
dup23[0]
dup24[0]
dup25[0]
dup26[0]
dup27[0]
dup28[0]
dup29[0]
dup30[0]
dup31) ;

+
+
+
+
+
+
+
+
+
+
+
+
+
+
)

dup17[1]
dup18[1]
dup19[1]
dup20[1]
dup21[1]
dup22[1]
dup23[1]
dup24[1]
dup25[1]
dup26[1]
dup27[1]
dup28[1]
dup29[1]
dup30[1]
;

+
+
+
+
+
+
+
+
+
+
+
)
)
)

dup18[2]
dup19[2]
dup20[2]
dup21[2]
dup22[2]
dup23[2]
dup24[2]
dup25[2]
dup26[2]
dup27[2]
dup28[2]
;
;
;

)
)
)
)
)
)
)
)
)
)
)

;
;
;
;
;
;
;
;
;
;
;

always@(*) begin
levelb1=
( levela1[1]) ;

209

levelb2=
levelb3=
levelb4=
levelb5=
levelb6=
levelb7=
levelb8=
levelb9=
levelb10=
levelb11=
levelb12=
levelb13=
levelb14=
levelb15=
levelb16=
levelb17=
levelb18=
levelb19=
levelb20=
levelb21=
levelb22=
levelb23=
levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

( levela1[0] + levela2[1]) ;
( levela2[0] + levela3[1]) ;
( levela3[0] + levela4[1]) ;
( levela4[0] + levela5[1]) ;
( levela5[0] + levela6[1] + dup8[3] ) ;
( levela6[0] + levela7[1] + dup9[3] ) ;
( levela7[0] + levela8[1] + dup10[3] ) ;
( levela8[0] + levela9[1] + dup11[3] ) ;
( levela9[0] + levela10[1] + dup12[3] ) ;
( levela10[0] + levela11[1] + dup13[3] ) ;
( levela11[0] + levela12[1] + dup14[3] ) ;
( levela12[0] + levela13[1] + levela12a[0] ) ;
( levela13[0] + levela14[1] + dup16[3] ) ;
( levela14[0] + levela15[1] + dup17[3] ) ;
( levela15[0] + levela16[1] + dup18[3] ) ;
( levela16[0] + levela17[1] + dup19[3] ) ;
( levela17[0] + levela18[1] + dup20[3] ) ;
( levela18[0] + levela19[1] + dup21[3] ) ;
( levela19[0] + levela20[1] + dup22[3] ) ;
( levela20[0] + levela21[1] + dup23[3] ) ;
( levela21[0] + levela22[1] + dup24[3] ) ;
(levela22[0] + levela23[1]) ;
(levela23[0] + levela24[1]) ;
(levela24[0] + levela25[1]) ;
(levela25[0] + levela26[1]) ;
(levela26[0] + levela27[1]) ;
(levela27[0] + levela28[1]) ;
(levela28[0] + levela29[1]) ;
(levela29[0]) ;
(levela30) ;
(levela31) ;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;

210

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );
levelc8=
( levelb8[0] + levelb9[1] );
levelc9=
( levelb9[0] + levelb10[1] );
levelc10=
( levelb10[0] + levelb11[1] );
levelc11=
( levelb11[0] + levelb12[1] );
levelc12=
( levelb12[0] + levelb13[1] + levela12a[1]);
levelc13=
( levelb13[0] + levelb14[1] );
levelc14=
( levelb14[0] + levelb15[1] );
levelc15=
( levelb15[0] + levelb16[1] );
levelc16=
( levelb16[0] + levelb17[1] );
levelc17=
( levelb17[0] + levelb18[1] );
levelc18=
( levelb18[0] + levelb19[1] );
levelc19=
( levelb19[0] + levelb20[1] );
levelc20=
( levelb20[0] + levelb21[1] );
levelc21=
( levelb21[0] + levelb22[1] );
levelc22=
(levelb22[0] + levelb23[1]) ;
levelc23=
(levelb23[0] + levelb24[1]) ;
levelc24=
(levelb24[0] + levelb25[1]) ;
levelc25=
(levelb25[0] + levelb26[1]) ;
levelc26=
(levelb26[0] + levelb27[1]) ;
levelc27=
(levelb27[0] + levelb28[1]) ;
levelc28=
(levelb28[0] + levelb29[1]) ;
levelc29=
(levelb29[0]) ;
levelc30=
(levelb30) ;
levelc31=
(levelb31) ;
levelc32=
(levelb32) ;
end
wire [31:0] pl,pm;
assign pl =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]

211

,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],
levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc26
[0],levelc27[0],levelc28[0],levelc29[0],levelc30,levelc31,levelc32};
assign pm =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],4'b0000};
reg [31:0] p;
always@(*) begin
p[31:4] = pl[31:4] + pm[31:4];
p[3:0] = pl[3:0];
p1 = p[31:16];
p2 = p[15:0];
end
endmodule
module mult_M17 (
input
[16:0] x,
input [15:0]
y,
output reg [32:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;

212

reg
reg
reg
reg
reg
reg

[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup27;
dup28;
dup29;
dup30;
dup31;
dup32;

always@(*) begin
dup1 = (x[16]&y[15]);
dup2 = ((x[16]&y[14])+(x[15]&y[15])) ;
dup3 = ((x[16]&y[13])+(x[15]&y[14])) + ((x[14]&y[15])) ;
dup4 = ( ((x[16]&y[12])+(x[15]&y[13])) + ((x[14]&y[14])+(x[13]&y[15])) )
;
dup5 = ( ((x[16]&y[11])+(x[15]&y[12])) + ((x[14]&y[13])+(x[13]&y[14])) )
+ ( ((x[12]&y[15])) ) ;
dup6 = ( ((x[16]&y[10])+(x[15]&y[11])) + ((x[14]&y[12])+(x[13]&y[13])) )
+ ( ((x[12]&y[14])+(x[11]&y[15])) ) ;
dup7 = ( ((x[16]&y[9])+(x[15]&y[10])) + ((x[14]&y[11])+(x[13]&y[12])) ) +
( ((x[12]&y[13])+(x[11]&y[14])) + ((x[10]&y[15])) ) ;
dup8 = ( ( ((x[16]&y[8])+(x[15]&y[9])) + ((x[14]&y[10])+(x[13]&y[11])) )
+ ( ((x[12]&y[12])+(x[11]&y[13])) + ((x[10]&y[14])+(x[9]&y[15])) ) ) ;
dup9 = ( ( ((x[16]&y[7])+(x[15]&y[8])) + ((x[14]&y[9])+(x[13]&y[10])) ) +
( ((x[12]&y[11])+(x[11]&y[12])) + ((x[10]&y[13])+(x[9]&y[14])) ) ) + ( (
((x[8]&y[15])) ) ) ;
dup10 = ( ( ((x[16]&y[6])+(x[15]&y[7])) + ((x[14]&y[8])+(x[13]&y[9])) ) +
( ((x[12]&y[10])+(x[11]&y[11])) + ((x[10]&y[12])+(x[9]&y[13])) ) ) + ( (
((x[8]&y[14])+(x[7]&y[15])) ) ) ;
dup11 = ( ( ((x[16]&y[5])+(x[15]&y[6])) + ((x[14]&y[7])+(x[13]&y[8])) ) +
( ((x[12]&y[9])+(x[11]&y[10])) + ((x[10]&y[11])+(x[9]&y[12])) ) ) + ( (
((x[8]&y[13])+(x[7]&y[14])) + ((x[6]&y[15])) ) ) ;
dup12 = ( ( ((x[16]&y[4])+(x[15]&y[5])) + ((x[14]&y[6])+(x[13]&y[7])) ) +
( ((x[12]&y[8])+(x[11]&y[9])) + ((x[10]&y[10])+(x[9]&y[11])) ) ) + ( (
((x[8]&y[12])+(x[7]&y[13])) + ((x[6]&y[14])+(x[5]&y[15])) ) ) ;
dup13 = ( ( ((x[16]&y[3])+(x[15]&y[4])) + ((x[14]&y[5])+(x[13]&y[6])) ) +
( ((x[12]&y[7])+(x[11]&y[8])) + ((x[10]&y[9])+(x[9]&y[10])) ) ) + ( (
((x[8]&y[11])+(x[7]&y[12])) + ((x[6]&y[13])+(x[5]&y[14])) ) + (
((x[4]&y[15])) ) ) ;
dup14 = ( ( ((x[16]&y[2])+(x[15]&y[3])) + ((x[14]&y[4])+(x[13]&y[5])) ) +
( ((x[12]&y[6])+(x[11]&y[7])) + ((x[10]&y[8])+(x[9]&y[9])) ) ) + ( (
((x[8]&y[10])+(x[7]&y[11])) + ((x[6]&y[12])+(x[5]&y[13])) ) + (
((x[4]&y[14])+(x[3]&y[15])) ) ) ;
dup15 = ( ( ((x[16]&y[1])+(x[15]&y[2])) + ((x[14]&y[3])+(x[13]&y[4])) ) +
( ((x[12]&y[5])+(x[11]&y[6])) + ((x[10]&y[7])+(x[9]&y[8])) ) ) + ( (
((x[8]&y[9])+(x[7]&y[10])) + ((x[6]&y[11])+(x[5]&y[12])) ) + (
((x[4]&y[13])+(x[3]&y[14])) + ((x[2]&y[15])) ) ) ;
dup16 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3])) )
+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) ;
dup17 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;

213

dup18 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +


( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup19 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup20 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup21 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup22 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup23 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup24 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup25 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup26 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup27 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup28 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup29 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup30 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup31 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup32 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[1:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;

214

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]

levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;
levela32;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela13a = ( dup16[3] + dup17[4] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] + dup29[2]) ;
levela28=
( dup28[0] + dup29[1] ) ;
levela29=
( dup29[0] + dup30[1] ) ;

215

levela30=
levela31=
levela32=
end

( dup30[0] + dup31[1] ) ;
( dup31[0]) ;
( dup32) ;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;

216

levelb13=
levelb14=
levelb15=
levelb16=
levelb17=
levelb18=
levelb19=
levelb20=
levelb21=
levelb22=
levelb23=
levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
levelb33=
end

( levela12[0] + levela13[1] + levela12a[0] ) ;


( levela13[0] + levela14[1] + levela13a[0] ) ;
( levela14[0] + levela15[1] + dup17[3] ) ;
( levela15[0] + levela16[1] + dup18[3] ) ;
( levela16[0] + levela17[1] + dup19[3] ) ;
( levela17[0] + levela18[1] + dup20[3] ) ;
( levela18[0] + levela19[1] + dup21[3] ) ;
( levela19[0] + levela20[1] + dup22[3] ) ;
( levela20[0] + levela21[1] + dup23[3] ) ;
( levela21[0] + levela22[1] + dup24[3] ) ;
(levela22[0] + levela23[1] + dup25[3]) ;
(levela23[0] + levela24[1]) ;
(levela24[0] + levela25[1]) ;
(levela25[0] + levela26[1]) ;
(levela26[0] + levela27[1]) ;
(levela27[0] + levela28[1]) ;
(levela28[0] + levela29[1]) ;
(levela29[0] + levela30[1]) ;
(levela30[0] + levela31[1]) ;
(levela31[0]) ;
(levela32) ;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

217

reg
reg
reg
reg

[1:0] levelc30;
levelc31;
levelc32;
levelc33;

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );
levelc8=
( levelb8[0] + levelb9[1] );
levelc9=
( levelb9[0] + levelb10[1] );
levelc10=
( levelb10[0] + levelb11[1] );
levelc11=
( levelb11[0] + levelb12[1] );
levelc12=
( levelb12[0] + levelb13[1] + levela12a[1]);
levelc13=
( levelb13[0] + levelb14[1] + levela13a[1]);
levelc14=
( levelb14[0] + levelb15[1] );
levelc15=
( levelb15[0] + levelb16[1] );
levelc16=
( levelb16[0] + levelb17[1] );
levelc17=
( levelb17[0] + levelb18[1] );
levelc18=
( levelb18[0] + levelb19[1] );
levelc19=
( levelb19[0] + levelb20[1] );
levelc20=
( levelb20[0] + levelb21[1] );
levelc21=
( levelb21[0] + levelb22[1] );
levelc22=
(levelb22[0] + levelb23[1]) ;
levelc23=
(levelb23[0] + levelb24[1]) ;
levelc24=
(levelb24[0] + levelb25[1]) ;
levelc25=
(levelb25[0] + levelb26[1]) ;
levelc26=
(levelb26[0] + levelb27[1]) ;
levelc27=
(levelb27[0] + levelb28[1]) ;
levelc28=
(levelb28[0] + levelb29[1]) ;
levelc29=
(levelb29[0] + levelb30[1]) ;
levelc30=
(levelb30[0] + levelb31[1]) ;
levelc31=
(levelb31[0]) ;
levelc32=
(levelb32) ;
levelc33=
(levelb33) ;
end
wire [32:0] p1,p2;
assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31,levelc32,lev
elc33};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]

218

,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],4'b0000};
always@(*) begin
p[32:4] = p1[32:4] + p2[32:4];
p[3:0] = p1[3:0];
end
endmodule
module mult_L17 (
input
[16:0] x,
input [15:0]
y,
output reg [16:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;

always@(*) begin
dup1 = (x[16]&y[15]);
dup2 = ((x[16]&y[14])+(x[15]&y[15])) ;
dup3 = ((x[16]&y[13])+(x[15]&y[14])) + ((x[14]&y[15])) ;

219

dup4 = ( ((x[16]&y[12])+(x[15]&y[13])) + ((x[14]&y[14])+(x[13]&y[15])) )


;
dup5 = ( ((x[16]&y[11])+(x[15]&y[12])) + ((x[14]&y[13])+(x[13]&y[14])) )
+ ( ((x[12]&y[15])) ) ;
dup6 = ( ((x[16]&y[10])+(x[15]&y[11])) + ((x[14]&y[12])+(x[13]&y[13])) )
+ ( ((x[12]&y[14])+(x[11]&y[15])) ) ;
dup7 = ( ((x[16]&y[9])+(x[15]&y[10])) + ((x[14]&y[11])+(x[13]&y[12])) ) +
( ((x[12]&y[13])+(x[11]&y[14])) + ((x[10]&y[15])) ) ;
dup8 = ( ( ((x[16]&y[8])+(x[15]&y[9])) + ((x[14]&y[10])+(x[13]&y[11])) )
+ ( ((x[12]&y[12])+(x[11]&y[13])) + ((x[10]&y[14])+(x[9]&y[15])) ) ) ;
dup9 = ( ( ((x[16]&y[7])+(x[15]&y[8])) + ((x[14]&y[9])+(x[13]&y[10])) ) +
( ((x[12]&y[11])+(x[11]&y[12])) + ((x[10]&y[13])+(x[9]&y[14])) ) ) + ( (
((x[8]&y[15])) ) ) ;
dup10 = ( ( ((x[16]&y[6])+(x[15]&y[7])) + ((x[14]&y[8])+(x[13]&y[9])) ) +
( ((x[12]&y[10])+(x[11]&y[11])) + ((x[10]&y[12])+(x[9]&y[13])) ) ) + ( (
((x[8]&y[14])+(x[7]&y[15])) ) ) ;
dup11 = ( ( ((x[16]&y[5])+(x[15]&y[6])) + ((x[14]&y[7])+(x[13]&y[8])) ) +
( ((x[12]&y[9])+(x[11]&y[10])) + ((x[10]&y[11])+(x[9]&y[12])) ) ) + ( (
((x[8]&y[13])+(x[7]&y[14])) + ((x[6]&y[15])) ) ) ;
dup12 = ( ( ((x[16]&y[4])+(x[15]&y[5])) + ((x[14]&y[6])+(x[13]&y[7])) ) +
( ((x[12]&y[8])+(x[11]&y[9])) + ((x[10]&y[10])+(x[9]&y[11])) ) ) + ( (
((x[8]&y[12])+(x[7]&y[13])) + ((x[6]&y[14])+(x[5]&y[15])) ) ) ;
dup13 = ( ( ((x[16]&y[3])+(x[15]&y[4])) + ((x[14]&y[5])+(x[13]&y[6])) ) +
( ((x[12]&y[7])+(x[11]&y[8])) + ((x[10]&y[9])+(x[9]&y[10])) ) ) + ( (
((x[8]&y[11])+(x[7]&y[12])) + ((x[6]&y[13])+(x[5]&y[14])) ) + (
((x[4]&y[15])) ) ) ;
dup14 = ( ( ((x[16]&y[2])+(x[15]&y[3])) + ((x[14]&y[4])+(x[13]&y[5])) ) +
( ((x[12]&y[6])+(x[11]&y[7])) + ((x[10]&y[8])+(x[9]&y[9])) ) ) + ( (
((x[8]&y[10])+(x[7]&y[11])) + ((x[6]&y[12])+(x[5]&y[13])) ) + (
((x[4]&y[14])+(x[3]&y[15])) ) ) ;
dup15 = ( ( ((x[16]&y[1])+(x[15]&y[2])) + ((x[14]&y[3])+(x[13]&y[4])) ) +
( ((x[12]&y[5])+(x[11]&y[6])) + ((x[10]&y[7])+(x[9]&y[8])) ) ) + ( (
((x[8]&y[9])+(x[7]&y[10])) + ((x[6]&y[11])+(x[5]&y[12])) ) + (
((x[4]&y[13])+(x[3]&y[14])) + ((x[2]&y[15])) ) ) ;
dup16 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3])) )
+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) ;
dup17 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup18 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup19 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup20 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (

220

((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup21 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup22 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;
dup23 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3])) ) + (
((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup24 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3])) ) + (
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup25 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3])) ) + (
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup26 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) ) + (
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup27 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) ) + (
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup28 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) ) + (
((x[0]&y[4])) ) ;
dup29 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) ) ;
dup30 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup31 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup32 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[1:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;

221

reg
reg
reg
reg
reg
reg
reg
reg
reg

[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]

levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;
levela32;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela13a = ( dup16[3] + dup17[4] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] + dup29[2]) ;
levela28=
( dup28[0] + dup29[1] ) ;
levela29=
( dup29[0] + dup30[1] ) ;
levela30=
( dup30[0] + dup31[1] ) ;
levela31=
( dup31[0]) ;
levela32=
( dup32) ;
end
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;

222

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;
levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;
levelb13=
( levela12[0] + levela13[1] + levela12a[0] ) ;
levelb14=
( levela13[0] + levela14[1] + levela13a[0] ) ;
levelb15=
( levela14[0] + levela15[1] + dup17[3] ) ;
levelb16=
( levela15[0] + levela16[1] + dup18[3] ) ;
levelb17=
( levela16[0] + levela17[1] + dup19[3] ) ;
levelb18=
( levela17[0] + levela18[1] + dup20[3] ) ;
levelb19=
( levela18[0] + levela19[1] + dup21[3] ) ;
levelb20=
( levela19[0] + levela20[1] + dup22[3] ) ;
levelb21=
( levela20[0] + levela21[1] + dup23[3] ) ;
levelb22=
( levela21[0] + levela22[1] + dup24[3] ) ;

223

levelb23=
levelb24=
levelb25=
levelb26=
levelb27=
levelb28=
levelb29=
levelb30=
levelb31=
levelb32=
levelb33=
end

(levela22[0] + levela23[1] + dup25[3]) ;


(levela23[0] + levela24[1]) ;
(levela24[0] + levela25[1]) ;
(levela25[0] + levela26[1]) ;
(levela26[0] + levela27[1]) ;
(levela27[0] + levela28[1]) ;
(levela28[0] + levela29[1]) ;
(levela29[0] + levela30[1]) ;
(levela30[0] + levela31[1]) ;
(levela31[0]) ;
(levela32) ;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;
levelc33;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;

224

levelc5=
levelc6=
levelc7=
levelc8=
levelc9=
levelc10=
levelc11=
levelc12=
levelc13=
levelc14=
levelc15=
levelc16=
levelc17=
levelc18=
levelc19=
levelc20=
levelc21=
levelc22=
levelc23=
levelc24=
levelc25=
levelc26=
levelc27=
levelc28=
levelc29=
levelc30=
levelc31=
levelc32=
levelc33=
end

( levelb5[0] + levelb6[1] );
( levelb6[0] + levelb7[1] );
( levelb7[0] + levelb8[1] );
( levelb8[0] + levelb9[1] );
( levelb9[0] + levelb10[1] );
( levelb10[0] + levelb11[1] );
( levelb11[0] + levelb12[1] );
( levelb12[0] + levelb13[1] + levela12a[1]);
( levelb13[0] + levelb14[1] + levela13a[1]);
( levelb14[0] + levelb15[1] );
( levelb15[0] + levelb16[1] );
( levelb16[0] + levelb17[1] );
( levelb17[0] + levelb18[1] );
( levelb18[0] + levelb19[1] );
( levelb19[0] + levelb20[1] );
( levelb20[0] + levelb21[1] );
( levelb21[0] + levelb22[1] );
(levelb22[0] + levelb23[1]) ;
(levelb23[0] + levelb24[1]) ;
(levelb24[0] + levelb25[1]) ;
(levelb25[0] + levelb26[1]) ;
(levelb26[0] + levelb27[1]) ;
(levelb27[0] + levelb28[1]) ;
(levelb28[0] + levelb29[1]) ;
(levelb29[0] + levelb30[1]) ;
(levelb30[0] + levelb31[1]) ;
(levelb31[0]) ;
(levelb32) ;
(levelb33) ;

wire [32:0] p1,p2;


reg [32:0] p3;
assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31,levelc32,lev
elc33};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],4'b0000};
always@(*) begin
//infer cla
p3[32:4] = p1[32:4] + p2[32:4];
p3[3:0] = p1[3:0];
p = p3[32:16];

225

end
endmodule
module mult_Co17 (
input
[16:0] x,
input [15:0]
y,
output reg [32:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

dup1;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]

dup2;
dup3;
dup4;
dup5;
dup6;
dup7;
dup8;
dup9;
dup10;
dup11;
dup12;
dup13;
dup14;
dup15;
dup16;
dup17;
dup18;
dup19;
dup20;
dup21;
dup22;
dup23;
dup24;
dup25;
dup26;
dup27;
dup28;
dup29;
dup30;
dup31;
dup32;

always@(*) begin
dup1 = (x[16]&y[15]);
dup2 = ((x[16]&y[14])+(x[15]&y[15])) ;
dup3 = ((x[16]&y[13])+(x[15]&y[14])) + ((x[14]&y[15])) ;
dup4 = ( ((x[16]&y[12])+(x[15]&y[13])) + ((x[14]&y[14])+(x[13]&y[15])) )
;
dup5 = ( ((x[16]&y[11])+(x[15]&y[12])) + ((x[14]&y[13])+(x[13]&y[14])) )
+ ( ((x[12]&y[15])) ) ;
dup6 = ( ((x[16]&y[10])+(x[15]&y[11])) + ((x[14]&y[12])+(x[13]&y[13])) )
+ ( ((x[12]&y[14])+(x[11]&y[15])) ) ;
dup7 = ( ((x[16]&y[9])+(x[15]&y[10])) + ((x[14]&y[11])+(x[13]&y[12])) ) +
( ((x[12]&y[13])+(x[11]&y[14])) + ((x[10]&y[15])) ) ;

226

dup8 = ( ( ((x[16]&y[8])+(x[15]&y[9])) + ((x[14]&y[10])+(x[13]&y[11])) )


+ ( ((x[12]&y[12])+(x[11]&y[13])) + ((x[10]&y[14])+(x[9]&y[15])) ) ) ;
dup9 = ( ( ((x[16]&y[7])+(x[15]&y[8])) + ((x[14]&y[9])+(x[13]&y[10])) ) +
( ((x[12]&y[11])+(x[11]&y[12])) + ((x[10]&y[13])+(x[9]&y[14])) ) ) + ( (
((x[8]&y[15])) ) ) ;
dup10 = ( ( ((x[16]&y[6])+(x[15]&y[7])) + ((x[14]&y[8])+(x[13]&y[9])) ) +
( ((x[12]&y[10])+(x[11]&y[11])) + ((x[10]&y[12])+(x[9]&y[13])) ) ) + ( (
((x[8]&y[14])+(x[7]&y[15])) ) ) ;
dup11 = ( ( ((x[16]&y[5])+(x[15]&y[6])) + ((x[14]&y[7])+(x[13]&y[8])) ) +
( ((x[12]&y[9])+(x[11]&y[10])) + ((x[10]&y[11])+(x[9]&y[12])) ) ) + ( (
((x[8]&y[13])+(x[7]&y[14])) + ((x[6]&y[15])) ) ) ;
dup12 = ( ( ((x[16]&y[4])+(x[15]&y[5])) + ((x[14]&y[6])+(x[13]&y[7])) ) +
( ((x[12]&y[8])+(x[11]&y[9])) + ((x[10]&y[10])+(x[9]&y[11])) ) ) + ( (
((x[8]&y[12])+(x[7]&y[13])) + ((x[6]&y[14])+(x[5]&y[15])) ) ) ;
dup13 = ( ( ((x[16]&y[3])+(x[15]&y[4])) + ((x[14]&y[5])+(x[13]&y[6])) ) +
( ((x[12]&y[7])+(x[11]&y[8])) + ((x[10]&y[9])+(x[9]&y[10])) ) ) + ( (
((x[8]&y[11])+(x[7]&y[12])) + ((x[6]&y[13])+(x[5]&y[14])) ) + (
((x[4]&y[15])) ) ) ;
dup14 = ( ( ((x[16]&y[2])+(x[15]&y[3])) + ((x[14]&y[4])+(x[13]&y[5])) ) +
( ((x[12]&y[6])+(x[11]&y[7])) + ((x[10]&y[8])+(x[9]&y[9])) ) ) + ( (
((x[8]&y[10])+(x[7]&y[11])) + ((x[6]&y[12])+(x[5]&y[13])) ) + (
((x[4]&y[14])+(x[3]&y[15])) ) ) ;
dup15 = ( ( ((x[16]&y[1])+(x[15]&y[2])) + ((x[14]&y[3])+(x[13]&y[4])) ) +
( ((x[12]&y[5])+(x[11]&y[6])) + ((x[10]&y[7])+(x[9]&y[8])) ) ) + ( (
((x[8]&y[9])+(x[7]&y[10])) + ((x[6]&y[11])+(x[5]&y[12])) ) + (
((x[4]&y[13])+(x[3]&y[14])) + ((x[2]&y[15])) ) ) ;
dup16 = ( ( ( ((x[16]&y[0])+(x[15]&y[1])) + ((x[14]&y[2])+(x[13]&y[3])) )
+ ( ((x[12]&y[4])+(x[11]&y[5])) + ((x[10]&y[6])+(x[9]&y[7])) ) ) + ( (
((x[8]&y[8])+(x[7]&y[9])) + ((x[6]&y[10])+(x[5]&y[11])) ) + (
((x[4]&y[12])+(x[3]&y[13])) + ((x[2]&y[14])+(x[1]&y[15])) ) ) ) ;
dup17 = ( ( ( ((x[15]&y[0])+(x[14]&y[1])) + ((x[13]&y[2])+(x[12]&y[3])) )
+ ( ((x[11]&y[4])+(x[10]&y[5])) + ((x[9]&y[6])+(x[8]&y[7])) ) ) + ( (
((x[7]&y[8])+(x[6]&y[9])) + ((x[5]&y[10])+(x[4]&y[11])) ) + (
((x[3]&y[12])+(x[2]&y[13])) + ((x[1]&y[14])+(x[0]&y[15])) ) ) ) ;
dup18 = ( ( ((x[14]&y[0])+(x[13]&y[1])) + ((x[12]&y[2])+(x[11]&y[3])) ) +
( ((x[10]&y[4])+(x[9]&y[5])) + ((x[8]&y[6])+(x[7]&y[7])) ) ) + ( (
((x[6]&y[8])+(x[5]&y[9])) + ((x[4]&y[10])+(x[3]&y[11])) ) + (
((x[2]&y[12])+(x[1]&y[13])) + ((x[0]&y[14])) ) ) ;
dup19 = ( ( ((x[13]&y[0])+(x[12]&y[1])) + ((x[11]&y[2])+(x[10]&y[3])) ) +
( ((x[9]&y[4])+(x[8]&y[5])) + ((x[7]&y[6])+(x[6]&y[7])) ) ) + ( (
((x[5]&y[8])+(x[4]&y[9])) + ((x[3]&y[10])+(x[2]&y[11])) ) + (
((x[1]&y[12])+(x[0]&y[13])) ) ) ;
dup20 = ( ( ((x[12]&y[0])+(x[11]&y[1])) + ((x[10]&y[2])+(x[9]&y[3])) ) +
( ((x[8]&y[4])+(x[7]&y[5])) + ((x[6]&y[6])+(x[5]&y[7])) ) ) + ( (
((x[4]&y[8])+(x[3]&y[9])) + ((x[2]&y[10])+(x[1]&y[11])) ) + (
((x[0]&y[12])) ) ) ;
dup21 = ( ( ((x[11]&y[0])+(x[10]&y[1])) + ((x[9]&y[2])+(x[8]&y[3])) ) + (
((x[7]&y[4])+(x[6]&y[5])) + ((x[5]&y[6])+(x[4]&y[7])) ) ) + ( (
((x[3]&y[8])+(x[2]&y[9])) + ((x[1]&y[10])+(x[0]&y[11])) ) ) ;
dup22 = ( ( ((x[10]&y[0])+(x[9]&y[1])) + ((x[8]&y[2])+(x[7]&y[3])) ) + (
((x[6]&y[4])+(x[5]&y[5])) + ((x[4]&y[6])+(x[3]&y[7])) ) ) + ( (
((x[2]&y[8])+(x[1]&y[9])) + ((x[0]&y[10])) ) ) ;

227

dup23 = ( ( ((x[9]&y[0])+(x[8]&y[1])) + ((x[7]&y[2])+(x[6]&y[3]))


((x[5]&y[4])+(x[4]&y[5])) + ((x[3]&y[6])+(x[2]&y[7])) ) ) + ( (
((x[1]&y[8])+(x[0]&y[9])) ) ) ;
dup24 = ( ( ((x[8]&y[0])+(x[7]&y[1])) + ((x[6]&y[2])+(x[5]&y[3]))
((x[4]&y[4])+(x[3]&y[5])) + ((x[2]&y[6])+(x[1]&y[7])) ) ) + ( (
((x[0]&y[8])) ) ) ;
dup25 = ( ( ((x[7]&y[0])+(x[6]&y[1])) + ((x[5]&y[2])+(x[4]&y[3]))
((x[3]&y[4])+(x[2]&y[5])) + ((x[1]&y[6])+(x[0]&y[7])) ) ) ;
dup26 = ( ((x[6]&y[0])+(x[5]&y[1])) + ((x[4]&y[2])+(x[3]&y[3])) )
((x[2]&y[4])+(x[1]&y[5])) + ((x[0]&y[6])) ) ;
dup27 = ( ((x[5]&y[0])+(x[4]&y[1])) + ((x[3]&y[2])+(x[2]&y[3])) )
((x[1]&y[4])+(x[0]&y[5])) ) ;
dup28 = ( ((x[4]&y[0])+(x[3]&y[1])) + ((x[2]&y[2])+(x[1]&y[3])) )
((x[0]&y[4])) ) ;
dup29 = ( ((x[3]&y[0])+(x[2]&y[1])) + ((x[1]&y[2])+(x[0]&y[3])) )
dup30 = ((x[2]&y[0])+(x[1]&y[1])) + ((x[0]&y[2])) ;
dup31 = ((x[1]&y[0])+(x[0]&y[1])) ;
dup32 = (x[0]&y[0]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[1:0]
[3:0]
[1:0]
[3:0]
[3:0]
[4:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[3:0]
[2:0]
[2:0]
[2:0]
[2:0]
[1:0]
[1:0]
[1:0]

) + (
) + (
) + (
+ (
+ (
+ (
;

levela1;
levela2;
levela3;
levela4;
levela5;
levela6;
levela7;
levela8;
levela9;
levela10;
levela11;
levela12;
levela12a;
levela13;
levela13a;
levela14;
levela15;
levela16;
levela17;
levela18;
levela19;
levela20;
levela21;
levela22;
levela23;
levela24;
levela25;
levela26;
levela27;
levela28;
levela29;
levela30;
levela31;

228

reg

levela32;

always@(*) begin
levela1=
( dup1 + dup2[1]) ;
levela2=
( dup2[0] + dup3[1] + dup4[2] ) ;
levela3=
( dup3[0] + dup4[1] + dup5[2] ) ;
levela4=
( dup4[0] + dup5[1] + dup6[2] ) ;
levela5=
( dup5[0] + dup6[1] + dup7[2] ) ;
levela6=
( dup6[0] + dup7[1] + dup8[2] ) ;
levela7=
( dup7[0] + dup8[1] + dup9[2] ) ;
levela8=
( dup8[0] + dup9[1] + dup10[2] ) ;
levela9=
( dup9[0] + dup10[1] + dup11[2] ) ;
levela10=
( dup10[0] + dup11[1] + dup12[2] ) ;
levela11=
( dup11[0] + dup12[1] + dup13[2] ) ;
levela12=
( dup12[0] + dup13[1] + dup14[2] ) ;
levela12a = ( dup15[3] + dup16[4] ) ;
levela13=
( dup13[0] + dup14[1] + dup15[2] ) ;
levela13a = ( dup16[3] + dup17[4] ) ;
levela14=
( dup14[0] + dup15[1] + dup16[2] ) ;
levela15=
( dup15[0] + dup16[1] + dup17[2] ) ;
levela16=
( dup16[0] + dup17[1] + dup18[2] ) ;
levela17=
( dup17[0] + dup18[1] + dup19[2] ) ;
levela18=
( dup18[0] + dup19[1] + dup20[2] ) ;
levela19=
( dup19[0] + dup20[1] + dup21[2] ) ;
levela20=
( dup20[0] + dup21[1] + dup22[2] ) ;
levela21=
( dup21[0] + dup22[1] + dup23[2] ) ;
levela22=
( dup22[0] + dup23[1] + dup24[2] ) ;
levela23=
( dup23[0] + dup24[1] + dup25[2] ) ;
levela24=
( dup24[0] + dup25[1] + dup26[2] ) ;
levela25=
( dup25[0] + dup26[1] + dup27[2] ) ;
levela26=
( dup26[0] + dup27[1] + dup28[2] ) ;
levela27=
( dup27[0] + dup28[1] + dup29[2]) ;
levela28=
( dup28[0] + dup29[1] ) ;
levela29=
( dup29[0] + dup30[1] ) ;
levela30=
( dup30[0] + dup31[1] ) ;
levela31=
( dup31[0]) ;
levela32=
( dup32) ;
end
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb1;
levelb2;
levelb3;
levelb4;
levelb5;
levelb6;
levelb7;
levelb8;
levelb9;
levelb10;
levelb11;
levelb12;
levelb13;

229

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

levelb14;
levelb15;
levelb16;
levelb17;
levelb18;
levelb19;
levelb20;
levelb21;
levelb22;
levelb23;
levelb24;
levelb25;
levelb26;
levelb27;
levelb28;
levelb29;
levelb30;
levelb31;
levelb32;
levelb33;

always@(*) begin
levelb1=
( levela1[1]) ;
levelb2=
( levela1[0] + levela2[1]) ;
levelb3=
( levela2[0] + levela3[1]) ;
levelb4=
( levela3[0] + levela4[1]) ;
levelb5=
( levela4[0] + levela5[1]) ;
levelb6=
( levela5[0] + levela6[1] + dup8[3] ) ;
levelb7=
( levela6[0] + levela7[1] + dup9[3] ) ;
levelb8=
( levela7[0] + levela8[1] + dup10[3] ) ;
levelb9=
( levela8[0] + levela9[1] + dup11[3] ) ;
levelb10=
( levela9[0] + levela10[1] + dup12[3] ) ;
levelb11=
( levela10[0] + levela11[1] + dup13[3] ) ;
levelb12=
( levela11[0] + levela12[1] + dup14[3] ) ;
levelb13=
( levela12[0] + levela13[1] + levela12a[0] ) ;
levelb14=
( levela13[0] + levela14[1] + levela13a[0] ) ;
levelb15=
( levela14[0] + levela15[1] + dup17[3] ) ;
levelb16=
( levela15[0] + levela16[1] + dup18[3] ) ;
levelb17=
( levela16[0] + levela17[1] + dup19[3] ) ;
levelb18=
( levela17[0] + levela18[1] + dup20[3] ) ;
levelb19=
( levela18[0] + levela19[1] + dup21[3] ) ;
levelb20=
( levela19[0] + levela20[1] + dup22[3] ) ;
levelb21=
( levela20[0] + levela21[1] + dup23[3] ) ;
levelb22=
( levela21[0] + levela22[1] + dup24[3] ) ;
levelb23=
(levela22[0] + levela23[1] + dup25[3]) ;
levelb24=
(levela23[0] + levela24[1]) ;
levelb25=
(levela24[0] + levela25[1]) ;
levelb26=
(levela25[0] + levela26[1]) ;
levelb27=
(levela26[0] + levela27[1]) ;
levelb28=
(levela27[0] + levela28[1]) ;
levelb29=
(levela28[0] + levela29[1]) ;
levelb30=
(levela29[0] + levela30[1]) ;
levelb31=
(levela30[0] + levela31[1]) ;

230

levelb32=
levelb33=
end

(levela31[0]) ;
(levela32) ;

reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

levelc1;
levelc2;
levelc3;
levelc4;
levelc5;
levelc6;
levelc7;
levelc8;
levelc9;
levelc10;
levelc11;
levelc12;
levelc13;
levelc14;
levelc15;
levelc16;
levelc17;
levelc18;
levelc19;
levelc20;
levelc21;
levelc22;
levelc23;
levelc24;
levelc25;
levelc26;
levelc27;
levelc28;
levelc29;
levelc30;
levelc31;
levelc32;
levelc33;

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

always@(*) begin
levelc1=
( levelb1 | levelb2[1]) ;
levelc2=
( levelb2[0] + levelb3[1]) ;
levelc3=
( levelb3[0] + levelb4[1]) ;
levelc4=
( levelb4[0] + levelb5[1]) ;
levelc5=
( levelb5[0] + levelb6[1] );
levelc6=
( levelb6[0] + levelb7[1] );
levelc7=
( levelb7[0] + levelb8[1] );
levelc8=
( levelb8[0] + levelb9[1] );
levelc9=
( levelb9[0] + levelb10[1] );
levelc10=
( levelb10[0] + levelb11[1] );
levelc11=
( levelb11[0] + levelb12[1] );
levelc12=
( levelb12[0] + levelb13[1] + levela12a[1]);
levelc13=
( levelb13[0] + levelb14[1] + levela13a[1]);

231

levelc14=
levelc15=
levelc16=
levelc17=
levelc18=
levelc19=
levelc20=
levelc21=
levelc22=
levelc23=
levelc24=
levelc25=
levelc26=
levelc27=
levelc28=
levelc29=
levelc30=
levelc31=
levelc32=
levelc33=
end

( levelb14[0] + levelb15[1]
( levelb15[0] + levelb16[1]
( levelb16[0] + levelb17[1]
( levelb17[0] + levelb18[1]
( levelb18[0] + levelb19[1]
( levelb19[0] + levelb20[1]
( levelb20[0] + levelb21[1]
( levelb21[0] + levelb22[1]
(levelb22[0] + levelb23[1])
(levelb23[0] + levelb24[1])
(levelb24[0] + levelb25[1])
(levelb25[0] + levelb26[1])
(levelb26[0] + levelb27[1])
(levelb27[0] + levelb28[1])
(levelb28[0] + levelb29[1])
(levelb29[0] + levelb30[1])
(levelb30[0] + levelb31[1])
(levelb31[0]) ;
(levelb32) ;
(levelb33) ;

);
);
);
);
);
);
);
);
;
;
;
;
;
;
;
;
;

wire [32:0] p1,p2;


assign p1 =
{levelc1,levelc2[0],levelc3[0],levelc4[0],levelc5[0],levelc6[0],levelc7[0]
,levelc8[0],levelc9[0],levelc10[0],levelc11[0],levelc12[0],levelc13[0],lev
elc14[0],levelc15[0],levelc16[0],levelc17[0],levelc18[0],levelc19[0],level
c20[0],levelc21[0],levelc22[0],levelc23[0],levelc24[0],levelc25[0],levelc2
6[0],levelc27[0],levelc28[0],levelc29[0],levelc30[0],levelc31,levelc32,lev
elc33};
assign p2 =
{levelc2[1],levelc3[1],levelc4[1],levelc5[1],levelc6[1],levelc7[1],levelc8
[1],levelc9[1],levelc10[1],levelc11[1],levelc12[1],levelc13[1],levelc14[1]
,levelc15[1],levelc16[1],levelc17[1],levelc18[1],levelc19[1],levelc20[1],l
evelc21[1],levelc22[1],levelc23[1],levelc24[1],levelc25[1],levelc26[1],lev
elc27[1],levelc28[1],levelc29[1],levelc30[1],4'b0000};
always@(*) begin
p[32:4] = p1[32:4] + p2[32:4];
p[3:0] = p1[3:0];
end
endmodule
module get_coeffs_cos16 (
input [15:0] angle,
output reg [16:0] co1,
output reg [16:0] co2,
output reg [16:0] co3
);
parameter [16:0] c10 = 17'b10000000000000000; parameter [16:0] c20 =
17'b00000000000000011; parameter [16:0] c30 = 17'b10011101101100000;

232

parameter [16:0] c11 =


17'b00000000001101011;
parameter [16:0] c12 =
17'b00000000111110100;
parameter [16:0] c13 =
17'b00000010101011000;
parameter [16:0] c14 =
17'b00000101101001100;
parameter [16:0] c15 =
17'b00011001010011001;
parameter [16:0] c16 =
17'b00010000101100001;
parameter [16:0] c17 =
17'b00011001010011001;
parameter [16:0] c18 =
17'b00100100010000111;
parameter [16:0] c19 =
17'b00110001101111101;
parameter [16:0] c1a =
17'b01000001110110101;
parameter [16:0] c1b =
17'b01010100101001100;
parameter [16:0] c1c =
17'b01101010000111111;
parameter [16:0] c1d =
17'b10000010001110010;
parameter [16:0] c1e =
17'b10011100110100011;
parameter [16:0] c1f =
17'b10111001101110101;
always@(*) begin
case (angle[15:12])
4'h0: begin co1=c10;
4'h1: begin co1=c11;
4'h2: begin co1=c12;
4'h3: begin co1=c13;
4'h4: begin co1=c14;
4'h5: begin co1=c15;
4'h6: begin co1=c16;
4'h7: begin co1=c17;
4'h8: begin co1=c18;
4'h9: begin co1=c19;
4'ha: begin co1=c1a;
4'hb: begin co1=c1b;
4'hc: begin co1=c1c;
4'hd: begin co1=c1d;
4'he: begin co1=c1e;
4'hf: begin co1=c1f;
endcase
end

17'b10000000000000011;
parameter [16:0] c31 =
17'b10000000000011100;
parameter [16:0] c32 =
17'b10000000001101110;
parameter [16:0] c33 =
17'b10000000100101110;
parameter [16:0] c34 =
17'b10000001010011100;
parameter [16:0] c35 =
17'b10000010100001010;
parameter [16:0] c36 =
17'b10000100011001111;
parameter [16:0] c37 =
17'b10000111001001100;
parameter [16:0] c38 =
17'b10001010111100010;
parameter [16:0] c39 =
17'b10001111111110101;
parameter [16:0] c3a =
17'b10010110011100010;
parameter [16:0] c3b =
17'b10011110011111110;
parameter [16:0] c3c =
17'b10101000010010011;
parameter [16:0] c3d =
17'b10110011111011001;
parameter [16:0] c3e =
17'b11000001011110011;
parameter [16:0] c3f =

co2=c20;
co2=c21;
co2=c22;
co2=c23;
co2=c24;
co2=c25;
co2=c26;
co2=c27;
co2=c28;
co2=c29;
co2=c2a;
co2=c2b;
co2=c2c;
co2=c2d;
co2=c2e;
co2=c2f;

co3=c30;
co3=c31;
co3=c32;
co3=c33;
co3=c34;
co3=c35;
co3=c36;
co3=c37;
co3=c38;
co3=c39;
co3=c3a;
co3=c3b;
co3=c3c;
co3=c3d;
co3=c3e;
co3=c3f;

parameter [16:0] c21 =


17'b10011100000100011;
parameter [16:0] c22 =
17'b10011001000111101;
parameter [16:0] c23 =
17'b10010100101001001;
parameter [16:0] c24 =
17'b10001110101111010;
parameter [16:0] c25 =
17'b10000111011010110;
parameter [16:0] c26 =
17'b01111110110011111;
parameter [16:0] c27 =
17'b01110100111110110;
parameter [16:0] c28 =
17'b01101010000001101;
parameter [16:0] c29 =
17'b01011110000011010;
parameter [16:0] c2a =
17'b01010001001010110;
parameter [16:0] c2b =
17'b01000011100000011;
parameter [16:0] c2c =
17'b00110101001100001;
parameter [16:0] c2d =
17'b00100110010111001;
parameter [16:0] c2e =
17'b00010111001010101;
parameter [16:0] c2f =
17'b00000111110000000;

end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end

233

endmodule
module combine_cos16 (
input
[32:0] a,
input
[16:0] b,
input
[32:0] c,
input
[16:0] d,
input clk,
input sign,
output reg [17:0] p
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]

e1;
e2;
e3;
e4;
e5;
e6;
e7;
e8;
e9;
e10;
e11;
e12;
e13;
e14;
e15;
e16;
e17;
e18;
e19;
e20;
e21;
e22;
e23;
e24;
e25;
e26;
e27;
e28;
e29;
e30;
e31;
e32;
e33;

always@(*) begin
e1 = a[0] + b[0] +c[0];
e2 = a[1] + b[1] +c[1];
e3 = a[2] + b[2]+c[2];
e4 = a[3] + b[3]+c[3];
e5 = a[4] + b[4]+c[4];

234

e6 = a[5] + b[5]+c[5];
e7 = a[6] + b[6]+c[6];
e8 = a[7] + b[7]+c[7];
e9 = a[8] + b[8]+c[8];
e10 = a[9] + b[9]+c[9];
e11 = a[10] + b[10]+c[10];
e12 = a[11] + b[11]+c[11];
e13 = a[12] + b[12]+c[12];
e14 = a[13] + b[13]+c[13];
e15 = a[14] + b[14]+c[14];
e16 = a[15] + b[15]+c[15];
e17 = a[16] + b[16] + c[16];
e18 = a[17] + c[17];
e19 = a[18] + c[18];
e20 = a[19] + c[19];
e21 = a[20] + c[20];
e22 = a[21] + c[21];
e23 = a[22] + c[22];
e24 = a[23] + c[23];
e25 = a[24] + c[24];
e26 = a[25] + c[25];
e27 = a[26] + c[26];
e28 = a[27] +c[27];
e29 = a[28] + c[28];
e30 = a[29] + c[29];
e31 = a[30] + c[30];
e32 = a[31] + c[31];
e33 = a[32] + c[32];
end
reg [33:0] p1,p2;
reg [33:0] p3;
always@(*) begin
p1 =
{1'b0,e33[0],e32[0],e31[0],e30[0],e29[0],e28[0],e27[0],e26[0],e25[0],e24[0
],e23[0],e22[0],e21[0],e20[0],e19[0],e18[0],e17[0],e16[0],e15[0],e14[0],e1
3[0],e12[0],e11[0],e10[0],e9[0],e8[0],e7[0],e6[0],e5[0],e4[0],e3[0],e2[0],
e1[0]};
p2 =
{e33[1],e32[1],e31[1],e30[1],e29[1],e28[1],e27[1],e26[1],e25[1],e24[1],e23
[1],e22[1],e21[1],e20[1],e19[1],e18[1],e17[1],e16[1],e15[1],e14[1],e13[1],
e12[1],e11[1],e10[1],e9[1],e8[1],e7[1],e6[1],e5[1],e4[1],e3[1],e2[1],e1[1]
,1'b0};
p3 = p1+p2;
end
always@(posedge clk) begin
p[16:0] = d - (p3[32:16]);
p[17] = sign;
end
endmodule

235

module counter(
input clock,
input [17:0] angle,
output [17:0] cosa
);
wire
wire
wire
wire
wire
wire
wire
wire
wire
wire

[15:0]
[15:0]
[16:0]
[16:0]
[16:0]
[32:0]
[16:0]
[32:0]

angsqm;
angsql;
co1;
co2;
co3;

[15:0]

a;
b;
c;
sign;
rangle;

get_quadrant
cosquad(.angle(angle),.rangle(rangle),.sign(sign));
square_cos_16 sq_angle (.x(rangle),.p1(angsqm),.p2(angsql));
get_coeffs_cos16 get_co(.angle(rangle),.co1(co1),.co2(co2),.co3(co3));
mult_M17 angle_sqm_co (.x(co3),.y(angsqm),.p(a));
mult_L17 angle_sql_co (.x(co3),.y(angsql),.p(b));
mult_Co17 angle_co (.x(co2),.y(rangle),.p(c));
combine_cos16
comb(.a(a),.b(b),.c(c),.d(co1),.p(cosa),.clk(clock),.sign(sign));
endmodule

236

APPENDIX D Verilog code for Division


module counter(
input [7:0] x,
input [7:0] d,
input clock,
output reg [7:0] a
);
reg
reg
reg
reg
reg
reg
reg
reg
reg
reg

[7:0] pa;
yf;
a7;
a6;
a5;
a4;
a3;
a2;
a1;
a0;

reg
reg
reg
reg
reg
reg
reg
reg

nega7;
nega6;
nega5;
nega4;
nega3;
nega2;
nega1;
nega0;

reg
reg
reg
reg
reg
reg
reg
reg
reg

y7;
y6;
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]

reg
reg
reg
reg
reg
reg
reg
reg
reg

negy7;
negy6;
[1:0] negy5;
[1:0] negy4;
[2:0] negy3;
[2:0] negy2;
[2:0] negy1;
[2:0] negy0;
[3:0] negy;

y5;
y4;
y3;
y2;
y1;
y0;
y;

237

reg
reg
reg
reg
reg
reg
reg
reg

cpp7
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]

;
cpp6
cpp5
cpp4
cpp3
cpp2
cpp1
cpp0

;
;
;
;
;
;
;

reg
reg
reg
reg
reg
reg
reg
reg

cpn7
[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]
[3:0]

;
cpn6
cpn5
cpn4
cpn3
cpn2
cpn1
cpn0

;
;
;
;
;
;
;

reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]

pos7
pos6
pos5
pos4
pos3
pos2
pos1
pos0

;
;
;
;
;
;
;
;

reg
reg
reg
reg
reg
reg
reg
reg

[1:0]
[2:0]
[2:0]
[3:0]
[3:0]
[3:0]
[3:0]
[4:0]

neg7
neg6
neg5
neg4
neg3
neg2
neg1
neg0

;
;
;
;
;
;
;
;

always@(*) begin
if(x>d) begin a7 = 1'b1; y6 = 1'b0; end
else begin a7 = 1'b0; y6 = 1'b1; end
end
always@(*) begin
if((~y6)&(~x[6])&(d[6])) begin
a6 = 1'b0; nega6 = 1'b0;
y5 = 2'b00; negy5 = 2'b01;
end
else begin
if((~y6)&(~x[6])&(~d[6])) begin
a6 = 1'b0; nega6 = 1'b0;
y5 = 2'b00; negy5 = 2'b00;

238

end
else begin
if((~y6)&(x[6])&(~d[6])) begin
a6 = 1'b1; nega6 = 1'b0;
y5 = 2'b00; negy5 = 2'b00;
end
else begin
if((~y6)&(x[6])&(d[6])) begin
a6 = 1'b0; nega6 = 1'b0;
y5 = 2'b00; negy5 = 2'b00;
end
else begin
a6 = 1'b1; nega6 = 1'b0;
y5 = {x[6],~x[6]}; negy5 = 2'b00;
end
end
end
end
end
always@(*) begin
cpp5 = (a6&d[6]) + (a7&d[5]);
cpn5 = (nega6&d[6]) ;
pos5 = {y5,x[5]} + cpn5;
neg5 = {negy5,1'b0} + cpp5;
if(pos5==neg5) begin
a5 = 1'b0; y4 = 2'b00;
nega5 = 1'b0; negy4 = 2'b00;
end
else begin
if((pos5)>(neg5)) begin
y4 = (pos5)-(neg5) - 1'b1; a5 = 1'b1;
negy4 = 2'b00; nega5 = 1'b0;
end
else begin
negy4 = neg5 - pos5 - 1'b1; a5 = 1'b0;
y4 = 2'b00; nega5 = 1'b1;
end
end
end
always@(*) begin
cpp4 = (a5&d[6])+(a6&d[5]) + (a7&d[4]);
cpn4 = (nega5&d[6])+(nega6&d[5]);
pos4 = {y4,x[4]} + cpn4;
neg4 = {negy4,1'b0} + cpp4;
if(pos4==neg4) begin
a4 = 1'b0; y3 = 2'b00;
nega4 = 1'b0; negy3 = 2'b00;
end
else begin
if(pos4>neg4) begin

239

y3 = pos4 - neg4- 1'b1; a4 = 1'b1;


negy3 = 3'b000; nega4 = 1'b0;
end
else begin
negy3 = neg4 - pos4- 1'b1; a4 = 1'b0;
y3 = 3'b000; nega4 = 1'b1;
end
end
end
always@(*) begin
cpp3 = (((a4&d[6])) + ((a5&d[5]))) + ((a6&d[4]) + (a7&d[3]));
cpn3 = (((nega4&d[6])) + ((nega5&d[5]))) + ((nega6&d[4]) );
pos3 = {y3,x[3]} + cpn3;
neg3 = {negy3,1'b0} + cpp3;
if(pos3==neg3) begin
a3 = 1'b0; y2 = 2'b00;
nega3 = 1'b0; negy2 = 2'b00;
end
else begin
if(pos3>neg3) begin
y2 = pos3 - neg3- 1'b1; a3 = 1'b1;
negy2 = 3'b000; nega3 = 1'b0;
end
else begin
negy2 = neg3 - pos3- 1'b1; a3 = 1'b0;
y2 = 3'b000; nega3 = 1'b1;
end
end
end
always@(*) begin
cpp2 = ((a3&d[6])+(a4&d[5])+(a5&d[4]))+((a6&d[3]) + (a7&d[2]));
cpn2 = ((nega3&d[6])+(nega4&d[5])+(nega5&d[4]))+((nega6&d[3]));
pos2 = {y2,x[2]} + cpn2;
neg2 = {negy2,1'b0} + cpp2;
if(pos2==neg2) begin
a2 = 1'b0; y1 = 2'b00;
nega2 = 1'b0; negy1 = 2'b00;
end
else begin
if(pos2>neg2) begin
y1 = pos2 - neg2- 1'b1; a2 = 1'b1;
negy1 = 3'b000; nega2 = 1'b0;
end
else begin
negy1 = neg2 - pos2- 1'b1; a2 = 1'b0;
y1 = 3'b000; nega2 = 1'b1;
end
end
end
always@(*) begin

240

cpp1 = ((a2&d[6])+(a3&d[5])+(a4&d[4]))+((a5&d[3])+(a6&d[2]) + (a7&d[1]));


cpn1 =
((nega2&d[6])+(nega3&d[5])+(nega4&d[4]))+((nega5&d[3])+(nega6&d[2]));
pos1 = {y1,x[1]} + cpn1;
neg1 = {negy1,1'b0} + cpp1;
if(pos1==neg1) begin
a1 = 1'b0; y0 = 2'b00;
nega1 = 1'b0; negy0 = 2'b00;
end
else begin
if(pos1>neg1) begin
y0 = pos1 - neg1- 1'b1; a1 = 1'b1;
negy0 = 3'b000; nega1 = 1'b0;
end
else begin
negy0 = neg1 - pos1- 1'b1; a1 = 1'b0;
y0 = 3'b000; nega1 = 1'b1;
end
end
end
always@(*) begin
cpp0 = (a1&d[6]) +((a2&d[5])+(a3&d[4])+(a4&d[3]))+((a5&d[2]) + (a6&d[1]) +
(a7&d[0]));
cpn0 = (nega1&d[6])
+((nega2&d[5])+(nega3&d[4])+(nega4&d[3]))+((nega5&d[2]) + (nega6&d[1]));
pos0 = {y0,x[0]} + cpn0;
neg0 = {negy0,1'b0} + cpp0;
if(pos0==neg0) begin
a0 = 1'b0; y = 4'b0000; //yf=1'b0;
nega0 = 1'b0; negy = 4'b0000;
end
else begin
if(pos0>neg0) begin
y = pos0 - neg0- 1'b1; a0 = 1'b1; //yf=1'b0;
negy = 4'b0000; nega0 = 1'b0;
end
else begin
negy = neg0 - pos0 - 1'b1; a0 = 1'b0;
y = 4'b0000; nega0 = 1'b1; //yf = 1'b1;
end
end
end
always@(y or negy) begin
if(negy>4'b0000)
yf = 1'b1;
else
yf = 1'b0;
end
reg rem1;

241

reg
reg
reg
reg
reg
reg

[1:0]
[1:0]
[2:0]
[2:0]
[2:0]
[2:0]

rem2;
rem3;
rem4;
rem5;
rem6;
rem7;

always@(*) begin
rem1 = a0&d[0];
rem2 = (a1&d[0])+(a0&d[1]);
rem3 = (a2&d[0])+(a1&d[1])+(a0&d[2]);
rem4 = (a3&d[0])+(a2&d[1])+(a1&d[2])+(a0&d[3]);
rem5 = (a4&d[0])+(a3&d[1])+(a2&d[2])+(a1&d[3])+(a0&d[4]);
rem6 = (a5&d[0])+(a4&d[1])+(a3&d[2])+(a2&d[3])+(a1&d[4])+(a0&d[5]);
rem7 =
(a6&d[0])+(a5&d[1])+(a4&d[2])+(a3&d[3])+(a2&d[4])+(a1&d[5])+(a0&d[6]);
end
reg
reg
reg
reg
reg
reg
reg

nrem1;
[1:0] nrem2;
[1:0] nrem3;
[2:0] nrem4;
[2:0] nrem5;
[2:0] nrem6;
[2:0] nrem7;

always@(*) begin
nrem1 = nega0&d[0];
nrem2 = (nega1&d[0])+(nega0&d[1]);
nrem3 = (nega2&d[0])+(nega1&d[1])+(nega0&d[2]);
nrem4 = (nega3&d[0])+(nega2&d[1])+(nega1&d[2])+(nega0&d[3]);
nrem5 = (nega4&d[0])+(nega3&d[1])+(nega2&d[2])+(nega1&d[3])+(nega0&d[4]);
nrem6 =
(nega5&d[0])+(nega4&d[1])+(nega3&d[2])+(nega2&d[3])+(nega1&d[4])+(nega0&d[
5]);
nrem7 =
(nega6&d[0])+(nega5&d[1])+(nega4&d[2])+(nega3&d[3])+(nega2&d[4])+(nega1&d[
5])+(nega0&d[6]);
end
reg
reg
reg
reg
reg
reg
reg
reg
reg

q1;
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
q8;
q9;

q2;
q3;
q4;
q5;
q6;
q7;

242

always@(*) begin
q1 =
q2 =
q3 =
q4 =
q5 =
q6 =
q7 =
q8 =
q9 =
end

rem7[2];
rem7[1] +
rem7[0] +
rem6[0] +
rem5[0] +
rem4[0] +
rem3[0] +
rem2[0];
rem1;

reg
reg
reg
reg
reg
reg
reg
reg
reg

negq1;
[1:0] negq2;
[1:0] negq3;
[1:0] negq4;
[1:0] negq5;
[1:0] negq6;
[1:0] negq7;
negq8;
negq9;

rem6[2];
rem6[1] + rem5[2];
rem5[1] + rem4[2];
rem4[1];
rem3[1];
rem2[1];

always@(*) begin
negq1 = nrem7[2];
negq2 = nrem7[1] +
negq3 = nrem7[0] +
negq4 = nrem6[0] +
negq5 = nrem5[0] +
negq6 = nrem4[0] +
negq7 = nrem3[0] +
negq8 = nrem2[0];
negq9 = nrem1;
end

nrem6[2];
nrem6[1] + nrem5[2];
nrem5[1] + nrem4[2];
nrem4[1];
nrem3[1];
nrem2[1];

reg [8:0] p1;


reg [8:0] p2;
reg [9:0] p;
always@(*) begin
p1 = {q1,q2[0],q3[0],q4[0],q5[0],q6[0],q7[0],q8,q9};
p2 = {q2[1],q3[1],q4[1],q5[1],q6[1],q7[1],3'b000};
p = p1+p2;
end
reg [8:0] negp1;
reg [8:0] negp2;
reg [9:0] negp;
always@(*) begin
negp1 =
{negq1,negq2[0],negq3[0],negq4[0],negq5[0],negq6[0],negq7[0],negq8,negq9};
negp2 = {negq2[1],negq3[1],negq4[1],negq5[1],negq6[1],negq7[1],3'b000};

243

negp = negp1+negp2;
end
reg [8:0] t;
reg tp;
always@(*) begin
if(negp>=p) begin
tp = 1'b1;
t = negp-p;
end
else
begin
t = p-negp;
tp = 1'b0;
end
end
reg [10:0]r;
reg [10:0]s;
reg sign;
reg sum;
always@(*) begin
case({yf,tp})
2'b00:
begin
if(t>{y,7'b0000000}) begin
sign = 1'b1;
s=t-{y,7'b0000000};
end
else begin
sign = 1'b0;
s={y,7'b0000000}-t;
end
2'b10:

end
begin
if(t>{negy,7'b0000000}) begin
sign = 1'b0;
s=t-{y,7'b0000000};
end
else begin
sign = 1'b1;
s={negy,7'b0000000}-t;
end
end

2'b01:begin
sign = 1'b0;
s=t+{y,7'b0000000};
end
2'b11:
begin
sign = 1'b1;
s=t+{negy,7'b0000000};

244

end
endcase
end
always@(*)begin
if(sign==1'b0) begin
if(s>d) sum=1'b1;
else sum = 1'b0;
end
else begin
sum =1'b1;
end
end
always@(*) begin
if(sign==1'b1)
//infer cla
pa = {a7,a6,a5,a4,a3,a2,a1,a0} {2'b00,nega5,nega4,nega3,nega2,nega1,nega0} - sum;
else
//infer cla
pa = {a7,a6,a5,a4,a3,a2,a1,a0} {2'b00,nega5,nega4,nega3,nega2,nega1,nega0} + sum;
end
always@(posedge clock) begin
// infer cla
a <= pa;
end
endmodule

245

APPENDIX E MATLAB code for calculation of Coefficients


NEWTON Linear Interpolation
format('short');
maxsec = 16;
bits = 8;
truncate = 2^bits;
e = 1/256;
coeffs = zeros(maxsec,maxsec-1,2);
opc = zeros(2,maxsec,maxsec);
percent = zeros(1,maxsec);
percentc = zeros(1,maxsec);
percentb = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
A0 = (round( truncate * points))/truncate;
fx = sin(points);
for i=1:sections
display(i);
display('coeffs');
% Calculating Coeffs
coeffs(1,sections,i) = (fx(i+1)-fx(i))/(points(i+1)-points(i));
display(coeffs(1,sections,i));
% Truncation to represent in 8 bits
A0 = (round( truncate * coeffs(1,sections,i)))/truncate;
% Calculating Coeffs
coeffs(2,sections,i) = fx(i) - points(i)*coeffs(1,sections,i);
% Truncation to represent in 8 bits
A1 = (round( truncate * coeffs(2,sections,i)))/truncate;
B1 = A1;
B0 = (sin(points(i+1))-B1)/points(i+1);
B0 = (round( truncate * B0))/truncate;
chkpts = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(chkpts);
newtonsin = chkpts*coeffs(1,sections,i)+coeffs(2,sections,i);
newtonsinb = chkpts*A0+A1;
newtonsinc = chkpts*B0+B1;
err = newtonsin - chksin;
errb = newtonsinb - chksin;
errc = newtonsinc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;

246

end
end
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = B1;
opc(2,i,sections) = B0;
end
%hold on;
%plot(badpoints);
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Newton Degree One');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(3);
bar3(badpoints);
title('Newton Degree One - Points exceeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','14','15','16');
%hold off;
Newton Quadratic Interpolation
format('long');
maxsec = 16;
bits = 16;
truncate = 2^bits;
e = 1/truncate;
%n = length(x) ;
%if length(y)~= n, error('x and y must be of same length'); end
coeffs = zeros(3,maxsec-1,maxsec);
coeffs2 = zeros(3,maxsec-1,maxsec);
percent = zeros(1,maxsec);
percent2 = zeros(1,maxsec);
percent3 = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpoints2 = zeros(maxsec,maxsec);
badpoints3 = zeros(maxsec,maxsec);
opc = zeros(3,maxsec,maxsec);
for sections=2:(maxsec)

247

points = linspace(0,pi/2,(sections+1));
for i=1:sections
quadpoints = linspace(points(i),points(i+1),3);
fx = sin(quadpoints);
% Calculating Coeffs
coeffs(1,sections,i) = fx(1);
coeffs(2,sections,i) = (fx(2)-fx(1))/(quadpoints(2)-quadpoints(1));
coeffs(3,sections,i) = (((fx(3)-fx(2))/(quadpoints(3)-quadpoints(2)))((fx(2)-fx(1))/(quadpoints(2)-quadpoints(1))))/(quadpoints(3)quadpoints(1));
A0 = coeffs(1,sections,i) - coeffs(2,sections,i)*quadpoints(1) +
coeffs(3,sections,i)*quadpoints(1)*quadpoints(2);
A1 = coeffs(2,sections,i) - quadpoints(1)*coeffs(3,sections,i) quadpoints(2)*coeffs(3,sections,i);
A2 = coeffs(3,sections,i);
B0 = (round( truncate * A0))/truncate;
B1 = (round( truncate * A1))/truncate;
B2 = (round( truncate * A2))/truncate;
C0 = B0;
C1 = B1;
C2 = (sin(quadpoints(2)) - C1*quadpoints(2) C0)/(quadpoints(2)*quadpoints(2));
C2 = (round( truncate * C2))/truncate;
chkpts = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(chkpts);
newtonsin = A0 + A1*chkpts + A2*(chkpts.*chkpts);
newtonsin2 = B0 + B1*chkpts + B2*(chkpts.*chkpts);
newtonsin3 = C0 + C1*chkpts + C2*(chkpts.*chkpts);
err = newtonsin - chksin;
err2 = newtonsin2 - chksin;
err3 = newtonsin3 - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(err2(k))>e
badpoints2(sections,i) = badpoints2(sections,i)+1;
end
end
for k=1:el
if abs(err3(k))>e
badpoints3(sections,i) = badpoints3(sections,i)+1;
end
end
opc(1,i,sections) = C0; %0

248

opc(2,i,sections) = C1; %1
opc(3,i,sections) = C2; %2
end
%hold on;
%plot(badpoints);
percent(1,sections) = sum(badpoints(sections,:)) * 100 /truncate;
percent2(1,sections) = sum(badpoints2(sections,:))* 100 /truncate;
percent3(1,sections) = sum(badpoints3(sections,:))* 100 /truncate;
end
figure(1);
per = [percent;percent2;percent3];
bar(per');
title('Newton Degree Two');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(3);
bar3(badpoints');
title('Newton Degree Two - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
%hold off;
Lagrange Linear Interpolation
format('long');
maxsec = 16;
bits = 8;
truncate = 2^bits;
e = 1/256;
%n = length(x) ;
%if length(y)~= n, error('x and y must be of same length'); end
coeffs = zeros(maxsec,maxsec-1,2);
opc = zeros(2,maxsec,maxsec);
percent = zeros(1,maxsec);
percentc = zeros(1,maxsec);
percentb = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
fx = sin(points);
for i=1:sections
% Calculating Coeffs
coeffs(1,sections,i) = (fx(i))/(points(i+1)-points(i));
coeffs(2,sections,i) = (fx(i+1))/(points(i+1)-points(i));

249

A0 = points(i+1) * coeffs(1,sections,i) points(i)*coeffs(2,sections,i);


A1 = coeffs(2,sections,i) - coeffs(1,sections,i);
B0 = (round( truncate * A0))/truncate;
B1 = (round( truncate * A1))/truncate;
C0 = B0;
C1 = (sin(points(i+1))-C0)/points(i+1);
C1 = (round( truncate * C1))/truncate;
chkpts = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(chkpts);
lagransin = A0 + A1 * chkpts;%(points(i+1)chkpts)*coeffs(1,sections,i)+ (chkpts-points(i))*coeffs(2,sections,i);
lagransinb = B0 + B1 * chkpts;
lagransinc = C0 + C1 * chkpts;
err = lagransin - chksin;
errb = lagransinb - chksin;
errc = lagransinc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = B1;
opc(2,i,sections) = B0;
end
percent(1,sections) = sum(badpoints(sections,:))*100/truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100/truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100/truncate;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Lagrange Degree One');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(3);

250

bar3(badpoints);
title('Lagrange Degree One - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
%hold off;
Lagrange Quadratic Interpolation
format('short');
maxsec = 16;
bits = 16;
truncate = 2^bits;
e = 1/truncate;
%n = length(x) ;
%if length(y)~= n, error('x and y must be of same length'); end
coeffs = zeros(3,maxsec-1,maxsec);
percent = zeros(1,maxsec);
percent2 = zeros(1,maxsec);
percent3 = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpoints2 = zeros(maxsec,maxsec);
badpoints3 = zeros(maxsec,maxsec);
opc = zeros(3,maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
for i=1:sections
quadpoints = linspace(points(i),points(i+1),3);
fx = sin(quadpoints);
% Calculating Coeffs
coeffs(1,sections,i) = fx(1)/((quadpoints(1)quadpoints(2))*(quadpoints(1)-quadpoints(3)));
coeffs(2,sections,i) = fx(2)/((quadpoints(2)quadpoints(1))*(quadpoints(2)-quadpoints(3)));
coeffs(3,sections,i) = fx(3)/((quadpoints(3)quadpoints(1))*(quadpoints(3)-quadpoints(2)));
% Truncation to represent in 8 bits
A0 =
((coeffs(1,sections,i)*quadpoints(2)*quadpoints(3))+(coeffs(2,sections,i)*
quadpoints(1)*quadpoints(3))+(coeffs(3,sections,i)*quadpoints(1)*quadpoint
s(2)));
A1 = (-1)*(coeffs(1,sections,i))*(quadpoints(2)+quadpoints(3))(coeffs(2,sections,i))*(quadpoints(1)+quadpoints(3))(coeffs(3,sections,i))*(quadpoints(2)+quadpoints(1));
A2 = coeffs(1,sections,i)+coeffs(2,sections,i)+coeffs(3,sections,i);
B0 = (round( truncate * A0))/truncate;
B1 = (round( truncate * A1))/truncate;
B2 = (round( truncate * A2))/truncate;

251

chkpts = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(chkpts);
C0 = B0;
C1 = B1;
C2 = (sin(quadpoints(2)) - C1*quadpoints(2) C0)/(quadpoints(2)*quadpoints(2));
C2 = (round( truncate * C2))/truncate;
lagrangesin = A0 + A1*chkpts + A2*(chkpts.*chkpts);
lagrangesin2 = B0 + B1*chkpts + B2*(chkpts.*chkpts);
lagrangesin3 = C0 + C1*chkpts + C2*(chkpts.*chkpts);
err = lagrangesin - chksin;
err2 = lagrangesin2 - chksin;
err3 = lagrangesin3 - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(err2(k))>e
badpoints2(sections,i) = badpoints2(sections,i)+1;
end
end
for k=1:el
if abs(err3(k))>e
badpoints3(sections,i) = badpoints3(sections,i)+1;
end
end
opc(1,i,sections) = C0; %0
opc(2,i,sections) = C1; %1
opc(3,i,sections) = C2; %2
end
%hold on;
%plot(badpoints);
percent(1,sections) = sum(badpoints(sections,:))* 100 /truncate;
percent2(1,sections) = sum(badpoints2(sections,:))* 100 /truncate;
percent3(1,sections) = sum(badpoints3(sections,:))* 100 /truncate;
end
per = [percent; percent2; percent3];
figure(1);
bar(per');
title('Lagrange Degree Two');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(3);
bar3(badpoints');
title('Lagrange Degree two - Points exeeding error by sections');

252

ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
%hold off;
Legendre Linear Approximation
%Legendre Polynomial Approximation
format('long');
maxsec = 16; % maximum segments
bits = 8; % resolution
truncate = 2^bits;
pts = [];
e = 1/256; % error bound
coeffs = zeros(maxsec,maxsec-1,2);
percent = zeros(1,maxsec);
percentb = zeros(1,maxsec);
percentc = zeros(1,maxsec);
opc = zeros(2,maxsec,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
%npts = linspace(0,pi/2,(sections+1));
fx = sin(points);
cchksin = [];
clegens = [];
for i=1:sections
bma = points(i+1) - points(i);
apb = points(i+1) + points(i);
mpt = apb/2;
syms x;
fxT0 = double(int(sin(((bma*x/2) + (apb/2))),-1,1)); %
points(i),points(i+1)
fxT1 = double(int((x*sin((bma*x/2) + (apb/2))),-1,1));
T0T0
T1T1
a0 =
a1 =

= 2;
= 2/3;
fxT0/T0T0;
fxT1/T1T1;

legpoints = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(legpoints);
% These are coeffients after transforming it back
A0 = a0 - a1*(apb/bma);
A1 = 2*a1/bma;

253

%A2 = 6*a2/((points(i+1)-points(i))^2);
C0 = (round( truncate * A0))/truncate;
C1 = (round( truncate * A1))/truncate;
B0 = A0;
B1 = (sin(mpt) - B0)/mpt;
B1 = (round( truncate * B1))/truncate;
legens = A0 + A1*legpoints;
legensb = C0 + C1*legpoints;
legensc = B0 + B1*legpoints;
cchksin = [cchksin chksin]; %Accumulating points from different
segments for plotting
clegens = [clegens legens];
% following secions calculates how many points are above error bound
err = legens - chksin;
errb = legensb - chksin;
errc = legensc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = B1;
opc(2,i,sections) = B0;
end
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Legendre Degree One');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(2);
bar3(badpoints');

254

title('Legendre Degree One - Points exeeding error by sections');


ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
Legendre Quadratic Interpolation
%Legendre Polynomial Approximation
format('long');
maxsec = 16; % maximum segments
bits = 16; % resolution
truncate = 2^bits;
pts = [];
e = 1/truncate; % error bound
coeffs = zeros(maxsec,maxsec-1,2);
percent = zeros(1,maxsec);
percentb = zeros(1,maxsec);
percentc = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
opc = zeros(3,maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
fx = sin(points);
%cchksin = [];
%clegens = [];
for i=1:sections
bma = points(i+1) - points(i);
apb = points(i+1) + points(i);
mpt = apb/2;
syms x;
fxT0 = double(int(sin(((bma*x/2) + (apb/2))),-1,1)); %
points(i),points(i+1)
fxT1 = double(int((x*sin((bma*x/2) + (apb/2))),-1,1));
fxT2 = double(int(((1.5*(x^2)-0.5)*sin((bma*x/2) + (apb/2))),-1,1));
T0T0
T1T1
T2T2
a0 =
a1 =
a2 =

= 2;
= 2/3;
= 2/5;
fxT0/T0T0;
fxT1/T1T1;
fxT2/T2T2;

legpoints = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(legpoints);
% These are coeffients after transforming it back

255

A0 = a0 - a2/2 - a1*((points(i+1)+points(i))/(points(i+1)-points(i)))
+ (((points(i+1)+points(i))/(points(i+1)-points(i)))^2)*(1.5*a2);
A1 = (2*a1/(points(i+1)-points(i))) (6*a2*(points(i+1)+points(i))/((points(i+1)-points(i))^2));
A2 = 6*a2/((points(i+1)-points(i))^2);
B0 = (round( truncate * A0))/truncate;
B1 = (round( truncate * A1))/truncate;
B2 = (round( truncate * A2))/truncate;
C0 = B0;
C1 = B1;
C2 = (sin(points(i+1)) - A0 A1*points(i+1))/(points(i+1)*points(i+1));
C2 = (round( truncate * C2))/truncate;
legens = A0 + A1*legpoints + A2*(legpoints.*legpoints);
legensb = B0 + B1*legpoints + B2*(legpoints.*legpoints);
legensc = C0 + C1*legpoints + C2*(legpoints.*legpoints);
%
cchksin = [cchksin chksin];
segments for plotting
%
clegens = [clegens legens];

%Accumulating points from different

% following secions calculates how many points are above error bound
err = legens - chksin;
errb = legensb - chksin;
errc = legensc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
for k=1:el
if abs(err(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = C0; %0
opc(2,i,sections) = C1; %1
opc(3,i,sections) = C2; %2
end
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
% figure(sections);

256

%
%
%
%

hold on;
plot(clegens,'red');
plot(cchksin,'green');
hold off;

end
figure(1);
per = [percent;percentb;percentc];
figure(1);
bar(per');
title('Legendre Degree Two');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(3);
bar3(badpoints');
title('Legendre Degree two - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
Chebyshev Linear Approximation
%Legendre Polynomial Approximation
format('long');
maxsec = 16; % maximum segments
bits = 9; % resolution
truncate = 2^bits;
pts = [];
e = 1/256; % error bound
coeffs = zeros(maxsec,maxsec-1,2);
percent = zeros(1,maxsec);
percentb = zeros(1,maxsec);
percentc = zeros(1,maxsec);
opc = zeros(2,maxsec,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
%npts = linspace(0,pi/2,(sections+1));
fx = sin(points);
cchksin = [];
clegens = [];
for i=1:sections
bma = points(i+1) - points(i);
apb = points(i+1) + points(i);
mpt = apb/2;
syms x;
fxT0 = quad(@(x)chebyweight(x,points(i),points(i+1)),-1,1);

257

fxT1 = quad(@(x)chebyweight1(x,points(i),points(i+1)),-1,1);
T0T0
T1T1
a0 =
a1 =

= pi;
= pi/2;
fxT0/T0T0;
fxT1/T1T1;

legpoints = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(legpoints);
% These are coeffients after transforming it back
A0 = a0 - a1*(apb/bma);
A1 = 2*a1/bma;
%A2 = 6*a2/((points(i+1)-points(i))^2);
C0 = A0;
C1 = A1;
A0 = (round( truncate * A0))/truncate;
A1 = (round( truncate * A1))/truncate;
B0 = A0;
B1 = (sin(mpt) - B0)/mpt;
B1 = (round( truncate * B1))/truncate;
legensb = A0 + A1*legpoints;
legensc = B0 + B1*legpoints;
legens = C0 + C1*legpoints;
cchksin = [cchksin chksin]; %Accumulating points from different
segments for plotting
clegens = [clegens legens];
% following secions calculates how many points are above error bound
err = legens - chksin;
errb = legensb - chksin;
errc = legensc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end

258

end
opc(1,i,sections) = C0;
opc(2,i,sections) = C1;
end
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
% figure(sections);
% hold on;
% plot(clegens,'red');
% plot(cchksin,'green');
% hold off;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Chebyshev Degree One');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(2);
bar3(badpoints');
title('Chebyshev Degree One - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections 2','3','4','5','6','7','8','9','10','11','12');
Chebyshev Quadratic Approximation
%Legendre Polynomial Approximation
format('long');
maxsec = 16; % maximum segments
bits = 16; % resolution
truncate = 2^bits;
pts = [];
e = 1/truncate; % error bound
coeffs = zeros(maxsec,maxsec-1,2);
percent = zeros(1,maxsec);
percentb = zeros(1,maxsec);
percentc = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
opc = zeros(3,maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
%npts = linspace(0,pi/2,(sections+1));
fx = sin(points);
cchksin = [];
clegens = [];
for i=1:sections

259

bma = points(i+1) - points(i);


apb = points(i+1) + points(i);
mpt = apb/2;
%syms x;
fxT0 = quadgk(@(x)chebyweight(x,points(i),points(i+1)),-1,1);
fxT1 = quadgk(@(x)chebyweight1(x,points(i),points(i+1)),-1,1);
fxT2 = quadgk(@(x)chebyweight2(x,points(i),points(i+1)),-1,1);
T0T0
T1T1
T2T2
a0 =
a1 =
a2 =

= pi;
= pi/2;
= pi/2;
fxT0/T0T0;
fxT1/T1T1;
fxT2/T2T2;

legpoints = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(legpoints);
% These are coeffients after transforming it back
A0 = a0 - a1*(apb/bma) + 2*a2*((apb*apb)/(bma*bma)) - a2;
A1 = (2*a1/bma) - (8*a2*(apb)/(bma^2));
A2 = 8*a2/(bma^2);
B0 = (round( truncate * A0))/truncate;
B1 = (round( truncate * A1))/truncate;
B2 = (round( truncate * A2))/truncate;
C0
C1
C2
C2

=
=
=
=

B0;
B1;
(sin(mpt) - A0 - A1*mpt)/(mpt^2);
(round( truncate * C2))/truncate;

cheby = A0 + A1*legpoints + A2*(legpoints.*legpoints);


chebyb = B0 + B1*legpoints + B2*(legpoints.*legpoints);
chebyc = C0 + C1*legpoints + C2*(legpoints.*legpoints);
%cchksin = [cchksin chksin]; %Accumulating points from different
segments for plotting
%clegens = [clegens legens];
% following secions calculates how many points are above error bound
err = cheby - chksin;
errb = chebyb - chksin;
errc = chebyc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end

260

for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = C0; %0
opc(2,i,sections) = C1; %1
opc(3,i,sections) = C2; %2
end
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Chebyshev Degree Two');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(2);
bar3(badpoints');
title('Chebyshev Degree Two - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
function y = chebyweight(x,a,b)
bma = b-a;
apb = a+b;
y = sin(((bma*x/2) + (apb/2)))./((1-x.^2).^0.5);
function y = chebyweight2(x,a,b)
bma = b-a;
apb = a+b;
y = ((2*(x.^2)-1).*sin(((bma*x/2) + (apb/2))))./((1-x.^2).^0.5);
function y = chebyweight2(x,a,b)
bma = b-a;
apb = a+b;
y = ((2*(x.^2)-1).*sin(((bma*x/2) + (apb/2))))./((1-x.^2).^0.5);
Minimax Linear Approximation
For Minimax polynomials coefficients were obtained from MAPLE ans MATLAB
was used to compare performance.

261

maxsec = 16;
c = zeros(maxsec,maxsec,2);
c(2,1,:) = [0.0045143153 0.9549296584];
c(2,2,:) = [0.1460430454 0.6990570274];
c(3,1,:) = [0.0045143153 0.9549296584];
c(3,2,:) = [0.1460430454 0.6990570274];
c(3,3,:) = [0.6145348811 0.2558726299];
c(4,1,:) = [0.0019197428 0.9744953583];
c(4,2,:) = [0.0636095915 0.8261372737];
c(4,3,:) =[0.2815530818 0.5520072784];
c(4,4,:) =[0.7049412612 0.1938391787];
c(5,1,:) =[0.0009865442 0.9836316429];
c(5,2,:) =[0.0330503062 0.8873469245];
c(5,3,:) =[0.1496773894 0.7042025066];
c(5,4,:) =[0.3883842277 0.4521258403];
c(5,5,:) =[0.7613627212 0.1557919469];
c(6,1,:) =[0.0005720625 0.9886159298];
c(6,2,:) =[0.0192792799 0.9212433880];
c(6,3,:) =[0.0883924269 0.7910896314];
c(6,4,:) =[0.2337454281 0.6070244241];
c(6,5,:) =[0.4703759748 0.3815915055];
c(6,6,:) =[0.7997959647 0.1301537562];
c(7,1,:) =[0.0003606850 0.9916285843];
c(7,2,:) =[0.0121992568 0.9419041864];
c(7,3,:) =[0.0563456530 0.8449487795];
c(7,4,:) =[0.1506885578 0.7056241125];
c(7,5,:) =[0.3079442970 0.5309165064];
c(7,6,:) =[0.5341412352 0.3295865299];
c(7,7,:) =[0.8276195242 0.1117297086];
c(8,1,:) =[0.00024182034 0.9935868512];
c(8,2,:) =[0.0081980078 0.9554038656];
c(8,3,:) =[0.0380457784 0.8805052453];
c(8,4,:) =[0.1024885458 0.7717693023];
c(8,5,:) =[0.2115168996 0.6333746977];
c(8,6,:) =[0.3715435095 0.4706398589];
c(8,7,:) =[0.5847490630 0.2898185942];
c(8,8,:) =[0.8486782925 0.09785976320];
c(9,1,:) =[0.00016992950 0.9949307700];
c(9,2,:) =[0.0057700071 0.9647003021];
c(9,3,:) =[0.0268652570 0.9051579036];
c(9,4,:) =[0.0727289277 0.8181127402];
c(9,5,:) =[0.1511059200 0.7062096352];
c(9,6,:) =[0.2676983516 0.5728487078];
c(9,7,:) =[0.4257465631 0.4220820626];
c(9,8,:) =[0.6257245405 0.2584906673];
c(9,9,:) =[0.8651651898 0.08704516407];
c(10,1,:) =[0.00012392625 0.9958927352];
c(10,2,:) =[0.0042127501 0.9713705509];
c(10,3,:) =[0.0196603774 0.9229299999];
c(10,4,:) =[0.0534119306 0.8517638491];
c(10,5,:) =[0.1115003728 0.7596244456];
c(10,6,:) =[0.1987278915 0.6487805672];

262

c(10,7,:) =[0.3183940974 0.5219615579];


c(10,8,:) =[0.4720806253 0.3822901227];
c(10,9,:) =[0.6595006828 0.2332054357];
c(10,10,:) =[0.8784199908 0.07837845704];
c(11,1,:) =[0.00009313412 0.9966048394];
c(11,2,:) =[0.0031686712 0.9763168388];
c(11,3,:) =[0.0148132659 0.9361538429];
c(11,4,:)=[0.0403484070 0.8769334543];
c(11,5,:) = [0.0845247777 0.7998612295];
c(11,6,:) =[0.1513174651 0.7065061366];
c(11,7,:) =[0.2437457432 0.5987686162];
c(11,8,:) =[0.3637224524 0.4788418935];
c(11,9,:) =[0.5119378120 0.3491673306];
c(11,10,:) =[0.6877815966 0.2123847279];
c(11,11,:) =[0.8893065588 0.07127858463];
c(12,1,:) =[0.00007175251 0.9971466574];
c(12,2,:) =[0.0024427766 0.9800852016];
c(12,3,:) =[0.0114347163 0.9462542163];
c(12,4,:) =[0.0312074334 0.8962325591];
c(12,5,:) =[0.0655491917 0.8308761141];
c(12,6,:) =[0.1177406254 0.7513031486];
c(12,7,:) =[0.1904323690 0.6588751778];
c(12,8,:) =[0.2855390602 0.5551736704];
c(12,9,:) =[0.4041525366 0.4419729872];
c(12,10,:) =[0.5464766265 0.3212100237];
c(12,11,:) =[0.7117854485 0.1949510676];
c(12,12,:) =[0.8984065835 0.06535644470];
c(13,1,:) =[0.00005644480 0.9975684412];
c(13,2,:) =[0.0019225918 0.9830216471];
c(13,3,:) =[0.0090088730 0.9541401837];
c(13,4,:) =[0.0246245955 0.9113452078];
c(13,5,:) =[0.0518289233 0.8552607668];
c(13,6,:) =[0.0933378615 0.7867046977];
c(13,7,:) =[0.1514392190 0.7066767027];
c(13,8,:) =[0.2279170529 0.6163437702];
c(13,9,:) =[0.3239872784 0.5170231575];
c(13,10,:) =[0.4402459444 0.4101631830];
c(13,11,:) =[0.5766314221 0.2973221054];
c(13,12,:) =[0.7324014785 0.1801454019];
c(13,13,:) =[0.9061259238 0.06034177281];
c(14,1,:) =[0.00004519891 0.9979031901];
c(14,2,:) =[0.0015401493 0.9853539785];
c(14,3,:) =[0.0072226492 0.9604133689];
c(14,4,:) =[0.0197661900 0.9233950039];
c(14,5,:) =[0.0416709812 0.8747644110];
c(14,6,:) =[0.0751987022 0.8151331482];
c(14,7,:) =[0.1223121228 0.7452511129];
c(14,8,:) =[0.1846204270 0.6659971126];
c(14,9,:) =[0.2633312886 0.5783678123];
c(14,10,:) =[0.3592106420 0.4834652012];
c(14,11,:) =[0.4725509705 0.3824827342];
c(14,12,:) =[0.6031487856 0.2766903248];
c(14,13,:) =[0.7502918211 0.1674183740];

263

c(14,14,:) =[0.9127562953
c(15,1,:) =[0.00003675234
c(15,2,:) =[0.0012527331
c(15,3,:) =[0.0058786110
c(15,4,:) =[0.0161037326
c(15,5,:) =[0.0339943900
c(15,6,:) =[0.0614470062
c(15,7,:) =[0.1001444057
c(15,8,:) =[0.1515156396
c(15,9,:) =[0.2167000248
c(15,10,:) =[0.2965160113
c(15,11,:) =[0.3914354229
c(15,12,:) =[0.5015635384
c(15,13,:) =[0.6266253897
c(15,14,:) =[0.7659585671
c(15,15,:) =[0.9185127230
c(16,1,:) =[0.00003028568
c(16,2,:) =[0.0010325810
c(16,3,:) =[0.0048480978
c(16,4,:) =[0.0132914106
c(16,5,:) =[0.0280877911
c(16,6,:) =[0.0508389395
c(16,7,:) =[0.0829907400
c(16,8,:) =[0.1258032969
c(16,9,:) =[0.1803236807
c(16,10,:) =[0.2473617888
c(16,11,:) =[0.3274696894
c(16,12,:) =[0.4209247696
c(16,13,:) =[0.5277169635
c(16,14,:) =[0.6475402790
c(16,15,:) =[0.7797887850
c(16,16,:) =[0.9235571709

0.05604104007];
0.9981732974];
0.9872371019];
0.9654845300];
0.9331539076];
0.8905994559];
0.8382874100];
0.7767909119];
0.7067837301];
0.6290328777];
0.5443902094];
0.4537830883];
0.3582042247];
0.2587008006];
0.1563629965];
0.05231204660];
0.9983943929];
0.9887793092];
0.9696417402];
0.9411659912];
0.9036262990];
0.8573841918];
0.8028850062];
0.7406535989];
0.6712892926];
0.5954601034];
0.5138963078];
0.4273834099];
0.3367545767];
0.2428826127];
0.1466715564];
0.04904797295];

format('long');
bits = 9; % resolution
truncate = 2^bits;
pts = [];
e = 1/256; % error bound
percent = zeros(1,maxsec);
percentb = zeros(1,maxsec);
percentc = zeros(1,maxsec);
percentd = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
badpointsd = zeros(maxsec,maxsec);
opc = zeros(2,maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
%cchksin = [];
%clegens = [];
for i=1:sections

264

midp = (points(i+1)+ points(i)) /2;


legpoints = linspace(points(i),points(i+1),(truncate/sections));
legens = c(sections,i,1) + c(sections,i,2)*legpoints;
A0 = (round( truncate * c(sections,i,1)))/truncate;
A1 = (round( truncate * c(sections,i,2)))/truncate;
%
cchksin = [cchksin chksin]; %Accumulating points from
different segments for plotting
%
clegens = [clegens legens];
legensb = A0 + A1*legpoints;
B0 = A0;
B1 = (sin(points(i)) - B0)/points(i);
C0 = B0;
C1 = (sin(midp) - C0)/midp;
legensc = B0 + B1*legpoints;
legensd = C0 + C1*legpoints;
chksin = sin(legpoints);
% following secions calculates how many points are above error
bound
err = legens - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
errb = legensb - chksin;
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
errc = legensc - chksin;
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
errd = legensd - chksin;
for k=1:el
if abs(errd(k))>e
badpointsd(sections,i) = badpointsd(sections,i)+1;
end
end
opc(1,i,sections) = C0;
opc(2,i,sections) = C1;
end
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
percentd(1,sections) = sum(badpointsd(sections,:))*100 /truncate;
% figure(sections);

265

%
%
%
%

hold on;
plot(clegens,'red');
plot(cchksin,'green');
hold off;

end
figure(1);
per = [percent;percentb;percentd];
bar(per');
title('Minimax Degree One (9bit)');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(2);
bar3(badpoints');
title('Minimax Degree One (9bit) - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
Quadratic Minimax
maxsec = 16;
c = zeros(maxsec,maxsec,3);
c(2,1,:) = [-0.00230969982 1.054078221 -0.1882870487];
c(2,2,:) = [-0.1495096719 1.446473285 -0.4545823566];
c(3,1,:) = [-0.000719129696 1.024952764 -0.1284881387];
c(3,2,:) = [-0.600834546 1.252476607 -0.351036567];
c(3,3,:) = [-0.1917000478 1.512032780 -0.4795330088];
c(4,1,:) = [-0.000308613443 1.014219412 -0.09715402873];
c(4,2,:) = [-0.02785736474 1.153415744 -0.2766713110];
c(4,3,:) = [-0.1104409546 1.365919668 -0.4140682014];
c(4,4,:) = [-0.2087844974 1.536801984 -0.4884314125];
c(5,1,:) = [-0.000159258418 1.009155087 -0.07801639689];
c(5,2,:) = [-0.01487432390 1.101650294 -0.2264124108];
c(5,3,:) = [-0.0640768839 1.258863080 -0.3526456429];
c(5,4,:) = [-0.1438931476 1.429790400 -0.4443596570];
c(5,5,:) = [-0.2172604427 1.548690388 -0.4925794855];
c(6,1,:) = [-0.000092557171 1.006378378 -0.06514669048];
c(6,2,:) = [-0.00880259453 1.071913700 -0.1910004345];
c(6,3,:) = [-0.03953223018 1.189378298 -0.3038378236];
c(6,4,:) = [-0.0957186779 1.333110215 -0.3959691988];
c(6,5,:) = [-0.1659861917 1.468343927 -0.4611160598];
c(6,6,:) = [-0.2220560775 1.555286699 -0.4948405853];
c(7,1,:) = [-0.0000584365271 1.004695330 -0.05590886418];
c(7,2,:) = [-0.00561783854 1.053424869 -0.1649230895];
c(7,3,:) = [-0.02584365190 1.143470704 -0.2656673850];
c(7,4,:) = [-0.0651850668 1.260627286 -0.3530900157];
c(7,5,:) = [-0.1208100114 1.385095029 -0.4228072624];
c(7,6,:) = [-0.1810465832 1.493171554 -0.4713232832];
c(7,7,:) = [-0.2250263273 1.559319774 -0.4962066251];
c(8,1,:) = [-0.0000392130885 1.003599425 -0.04895938545];
c(8,2,:) = [-0.003796062922 1.041198033 -0.1449966750];

266

c(8,3,:) = [-0.01773068550 1.112023327 -0.2354618244];


c(8,4,:) = [-0.0458524969 1.207611956 -0.3168783106];
c(8,5,:) = [-0.0882902988 1.315955037 -0.3861173462];
c(8,6,:) = [-0.1402851421 1.422279997 -0.4405181273];
c(8,7,:) = [-0.1916807433 1.510026087 -0.4779901160];
c(8,8,:) = [-0.2269911549 1.561963242 -0.4970943128];
c(9,1,:) = [-0.0000275720254 1.002846464 -0.04354331292];
c(9,2,:) = [-0.002681818060 1.032711589 -0.1293068973];
c(9,3,:) = [-0.01265543176 1.089701122 -0.2111415576];
c(9,4,:) = [-0.03327123080 1.168472605 -0.2865607893];
c(9,5,:) = [-0.0656421110 1.261353884 -0.3532730184];
c(9,6,:) = [-0.1080301847 1.358736619 -0.4092512300];
c(9,7,:) = [-0.1554323028 1.449574443 -0.4527945645];
c(9,8,:) = [-0.1994336884 1.521964418 -0.4825800218];
c(9,9,:) = [-0.2283574929 1.563788894 -0.4977033981];
c(10,1,:) = [-0.0000201164018 1.002307070 -0.03920434723];
c(10,2,:) = [-0.001963261025 1.026589309 -0.1166477006];
c(10,3,:) = [-0.00933203947 1.073350263 -0.1912188006];
c(10,4,:) = [-0.02481731912 1.139056976 -0.2610814596];
c(10,5,:) = [-0.0497809117 1.218592700 -0.3245154275];
c(10,6,:) = [-0.0838416473 1.305469034 -0.3799587498];
c(10,7,:) = [-0.1245725924 1.392097240 -0.4260462304];
c(10,8,:) = [-0.1673321085 1.470109304 -0.4616430506];
c(10,9,:) = [-0.2052451754 1.530717579 -0.4858727321];
c(10,10,:)= [-0.2293456373 1.565102172 -0.4981393175];
c(11,1,:) = [-0.0000151228686 1.001907546 -0.03565065382];
c(11,2,:) = [-0.001479601216 1.022031538 -0.1062262170];
c(11,3,:) = [-0.00707058665 1.061044986 -0.1746393208];
c(11,4,:) = [-0.01896075730 1.116520743 -0.2394972718];
c(11,5,:) = [-0.03848638078 1.184921702 -0.2994797494];
c(11,6,:) = [-0.0658736886 1.261721817 -0.3533656835];
c(11,7,:) = [-0.1000233892 1.341562031 -0.4000581127];
c(11,8,:) = [-0.1383660377 1.418436644 -0.4386065152];
c(11,9,:) = [-0.1767982309 1.485904752 -0.4682261636];
c(11,10,:)= [-0.2097064715 1.537320691 -0.4883141151];
c(11,11,:)= [-0.2300831987 1.566078231 -0.4984619797];
c(12,1,:) = [-0.0000116538013 1.001603429 -0.03268697523];
c(12,2,:) = [-0.001142352548 1.018549018 -0.09750164250];
c(12,3,:) = [-0.00548098853 1.051567076 -0.1606480297];
c(12,4,:) = [-0.01479028948 1.098936286 -0.2210456847];
c(12,5,:) = [-0.03028610211 1.158136364 -0.2776611868];
c(12,6,:) = [-0.0524520050 1.225920444 -0.3295258294];
c(12,7,:) = [-0.0808860046 1.298408854 -0.3757521944];
c(12,8,:) = [-0.1141866776 1.371202032 -0.4155493360];
c(12,9,:) = [-0.1498848488 1.439509869 -0.4482363157];
c(12,10,:)= [-0.1844254027 1.498294323 -0.4732538559];
c(12,11,:)= [-0.2132021963 1.542421877 -0.4901739228];
c(12,12,:)= [-0.2306483874 1.566823548 -0.4987075315];
c(13,1,:) = [-0.0000091693089 1.001366608 -0.03017777226];
c(13,2,:) = [-0.000900134844 1.015829242 -0.09009325695];
c(13,3,:) = [-0.004332318142 1.044119782 -0.1486949791];
c(13,4,:) = [-0.01174711649 1.084984208 -0.2051283937];
c(13,5,:) = [-0.02421652078 1.136579765 -0.2585705744];

267

c(13,6,:) =
c(13,7,:) =
c(13,8,:) =
c(13,9,:) =
c(13,10,:)=
c(13,11,:)=
c(13,12,:)=
c(13,13,:)=
c(14,1,:) =
c(14,2,:) =
c(14,3,:) =
c(14,4,:) =
c(14,5,:) =
c(14,6,:) =
c(14,7,:) =
c(14,8,:) =
c(14,9,:) =
c(14,10,:)=
c(14,11,:)=
c(14,12,:)=
c(14,13,:)=
c(14,14,:)=
c(15,1,:) =
c(15,2,:) =
c(15,3,:) =
c(15,4,:) =
c(15,5,:) =
c(15,6,:) =
c(15,7,:) =
c(15,8,:) =
c(15,9,:) =
c(15,10,:)=
c(15,11,:)=
c(15,12,:)=
c(15,13,:)=
c(15,14,:)=
c(15,15,:)=
c(16,1,:) =
c(16,2,:) =
c(16,3,:) =
c(16,4,:) =
c(16,5,:) =
c(16,6,:) =
c(16,7,:) =
c(16,8,:) =
c(16,9,:) =
c(16,10,:)=
c(16,11,:)=
c(16,12,:)=
c(16,13,:)=
c(16,14,:)=
c(16,15,:)=
c(16,16,:)=

[-0.04231450571 1.196520016 -0.3082422143];


[-0.0660069480 1.261933472 -0.3534189886];
[-0.0945644809 1.329534590 -0.3934421187];
[-0.1265020630 1.395705684 -0.4277279775];
[-0.1595482990 1.456588066 -0.4557766019];
[-0.1906467143 1.508180509 -0.4771789835];
[-0.2159903081 1.546443051 -0.4916230479];
[-0.2310907016 1.567405148 -0.4988986123];
[-0.00000734353092 1.001178605 -0.02802603397];
[-0.000721743271 1.013665224 -0.08372565829];
[-0.003482298283 1.038166078 -0.1383723839];
[-0.00947816962 1.073746305 -0.1912789965];
[-0.01964189901 1.119028200 -0.2417801648];
[-0.03455821195 1.172220246 -0.2892408073];
[-0.0543839456 1.231155005 -0.3330640792];
[-0.0787818243 1.293335223 -0.3726988768];
[-0.1068704828 1.355987318 -0.4076467705];
[-0.1371927342 1.416121307 -0.4374682704];
[-0.1677036571 1.470596097 -0.4617883547];
[-0.1957795889 1.516188988 -0.4803011884];
[-0.2182486148 1.549668148 -0.4927739790];
[-0.2314434385 1.567867818 -0.4990502571];
[-0.00000597193624 1.001026875 -0.02616050598];
[-0.000587489797 1.011915559 -0.07819489799];
[-0.002840172151 1.033334170 -0.1293725703];
[-0.00775396538 1.064571742 -0.1791328097];
[-0.01613615328 1.104578114 -0.2269304326];
[-0.02854537971 1.151983190 -0.2722417582];
[-0.0452325843 1.205122158 -0.3145703462];
[-0.0660905811 1.262066281 -0.3534524358];
[-0.0906138296 1.320658779 -0.3884620266];
[-0.1178697398 1.378555258 -0.4192155469];
[-0.1464826022 1.433268045 -0.4453760542];
[-0.1746309870 1.482213752 -0.4666569300];
[-0.2000591480 1.522763322 -0.4828250197];
[-0.2201027001 1.552293795 -0.4937031979];
[-0.2317292388 1.568241898 -0.4991726141];
[-0.00000492163782 1.000902655 -0.02452767990];
[-0.000484539386 1.010481029 -0.07334682471];
[-0.002346261808 1.029360457 -0.1214595995];
[-0.00642141907 1.056990749 -0.1684026520];
[-0.01340851464 1.092557694 -0.2137238949];
[-0.02382461860 1.134996180 -0.2569868598];
[-0.03796118706 1.183007409 -0.2977749010];
[-0.0558454336 1.235079978 -0.3356952070];
[-0.0772082785 1.289514538 -0.3703825848];
[-0.1014597819 1.344451693 -0.4015029760];
[-0.1276728302 1.397902770 -0.4287566743];
[-0.1545756899 1.447783024 -0.4518812121];
[-0.1805538830 1.491946840 -0.4706538882];
[-0.2036616632 1.528224433 -0.4848939147];
[-0.2216431986 1.554459577 -0.4944641650];
[-0.2319640204 1.568548639 -0.4992727663];

268

format('long');
bits = 16; % resolution
truncate = 2^bits;
pts = [];
e = 1/truncate; % error bound
percent = zeros(1,maxsec);
percentb = zeros(1,maxsec);
percentc = zeros(1,maxsec);
percentd = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
badpointsd = zeros(maxsec,maxsec);
opc = zeros(3,maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
%cchksin = [];
%clegens = [];
for i=1:sections
mpt = (points(i+1)+ points(i)) /2;
legpoints = linspace(points(i),points(i+1),(truncate/sections));
legens = c(sections,i,1) + c(sections,i,2)*legpoints +
c(sections,i,3)*(legpoints.*legpoints);
A0 = (round( truncate * c(sections,i,1)))/truncate;
A1 = (round( truncate * c(sections,i,2)))/truncate;
A2 = (round( truncate * c(sections,i,3)))/truncate;
%
cchksin = [cchksin chksin]; %Accumulating points from
different segments for plotting
%
clegens = [clegens legens];
legensb = A0 + A1*legpoints + A2*(legpoints.*legpoints);
B0 = A0;
B1 = A1;
B2 = (sin(points(i+1)) -c(sections,i,1) c(sections,i,2)*points(i+1))/(points(i+1)*points(i+1));
B2 = (round( truncate * B2))/truncate;
C0 = B0;
C1 = B1;
C2 = (sin(mpt) - C0 -C1*mpt)/(mpt^2);
C2 = (round( truncate * C2))/truncate;
%legensc = B0 + B1*legpoints + B2*(legpoints.*legpoints);
legensc = C0 + C1*legpoints+ C2*(legpoints.*legpoints);
chksin = sin(legpoints);
% following secions calculates how many points are above error
bound
err = legens - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end

269

end
errb = legensb - chksin;
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
errc = legensc - chksin;
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = C0; %0
opc(2,i,sections) = C1; %1
opc(3,i,sections) = C2; %2
end
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
percentd(1,sections) = sum(badpointsd(sections,:))*100 /truncate;
% figure(sections);
% hold on;
% plot(clegens,'red');
% plot(cchksin,'green');
% hold off;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Minimax Degree One');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(2);
bar3(badpoints');
title('Minimax Degree One - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
Polyfit function fo Linear approximation
format('long');
maxsec = 128;
bits = 16;
truncate = 2^bits;
e = 1/(2^bits);
coeffs = zeros(maxsec,maxsec-1,2);
percent = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);

270

percentc = zeros(1,maxsec);
badpointsc = zeros(maxsec,maxsec);
percentb = zeros(1,maxsec);
badpointsb = zeros(maxsec,maxsec);
opc = zeros(2,maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
fx = sin(points);
for i=1:sections
intpoints = linspace(points(i),points(i+1),(truncate/sections));
y = sin(intpoints);
z = polyfit(intpoints,y,1);
mpt = (points(i+1)+points(i))/2;
coeffs(1,sections,i) = z(1);
%display(coeffs(1,sections,i));
% Truncation to represent in 8 bits
A0 = (round( truncate * coeffs(1,sections,i)))/truncate;
% Calculating Coeffs
coeffs(2,sections,i) = z(2);
% Truncation to represent in 8 bits
A1 = (round( truncate * coeffs(2,sections,i)))/truncate;
B1 = A1;
B0 = (sin(mpt)- B1)/mpt;
B0 = (round( truncate * B0))/truncate;
chkpts = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(chkpts);
lesqsin = coeffs(2,sections,i)+ (chkpts*coeffs(1,sections,i));
lesqsinb = A1+ chkpts*A0;
lesqsinc = B1+ chkpts*B0;
err = lesqsin - chksin;
errb = lesqsinb - chksin;
errc = lesqsinc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = B1;
opc(2,i,sections) = B0;

271

end
%hold on;
%plot(badpoints);
percent(1,sections) = sum(badpoints(sections,:))*100/truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100/truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100/truncate;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Least Square Degree One');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(2);
bar3(badpoints');
title('Least Square Degree One - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
Polyfit function for Quadratic Approximation
%Legendre Polynomial Approximation
format('long');
maxsec = 16;
bits = 16;
truncate = 2^bits;
e = 1/truncate;
coeffs = zeros(3,maxsec,maxsec-1);
percent = zeros(1,maxsec);
percentb = zeros(1,maxsec);
percentc = zeros(1,maxsec);
badpoints = zeros(maxsec,maxsec);
badpointsb = zeros(maxsec,maxsec);
badpointsc = zeros(maxsec,maxsec);
opc = zeros(3,maxsec,maxsec);
for sections=2:(maxsec)
points = linspace(0,pi/2,(sections+1));
for i=1:sections
quadpoints = linspace(points(i),points(i+1),3);
y = sin(quadpoints);
z = polyfit(quadpoints,y,2);
coeffs(1,sections,i) = z(3);
coeffs(2,sections,i) = z(2);
coeffs(3,sections,i) = z(1);
A0 = z(3);
A1 = z(2);

272

A2 = z(1);
B0 = (round( truncate * A0))/truncate;
B1 = (round( truncate * A1))/truncate;
B2 = (round( truncate * A2))/truncate;
C0 = B0;
C1 = B1;
C2 = (sin(quadpoints(2)) - B0 B1*quadpoints(2))/(quadpoints(2)*quadpoints(2));
C2 = (round( truncate * C2))/truncate;
chkpts = linspace(points(i),points(i+1),(truncate/sections));
chksin = sin(chkpts);
leastsqsin =A0+ chkpts*A1+(chkpts.*chkpts)*A2;
leastsqsinb =B0+ chkpts*B1+(chkpts.*chkpts)*B2;
leastsqsinc =C0+ chkpts*C1+(chkpts.*chkpts)*C2;
err = leastsqsin - chksin;
errb = leastsqsinb - chksin;
errc = leastsqsinc - chksin;
el = length(err);
for k=1:el
if abs(err(k))>e
badpoints(sections,i) = badpoints(sections,i)+1;
end
end
for k=1:el
if abs(errb(k))>e
badpointsb(sections,i) = badpointsb(sections,i)+1;
end
end
for k=1:el
if abs(errc(k))>e
badpointsc(sections,i) = badpointsc(sections,i)+1;
end
end
opc(1,i,sections) = C0; %0
opc(2,i,sections) = C1; %1
opc(3,i,sections) = C2; %2
end
percent(1,sections) = sum(badpoints(sections,:))*100 /truncate;
percentb(1,sections) = sum(badpointsb(sections,:))*100 /truncate;
percentc(1,sections) = sum(badpointsc(sections,:))*100 /truncate;
end
figure(1);
per = [percent;percentb;percentc];
bar(per');
title('Least Square Degree Two');
legend('Original','Truncate','Approximate');
xlabel('Number of sections');
ylabel('%points exceeds error');
figure(2);

273

bar3(badpoints');
title('Least Square Degree Two - Points exeeding error by sections');
ylabel('Section Number');
xlabel('Total Sections');
legend('Sections
2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');

274

Das könnte Ihnen auch gefallen