Beruflich Dokumente
Kultur Dokumente
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.
.
by
Saurabh Sunil Bengali
Computer Engineering
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
31
33
34
35
38
ix
39
40
40
41
41
42
43
43
44
45
46
47
48
50
50
51
51
52
52
53
54
54
55
55
57
58
59
60
61
62
63
64
64
65
65
67
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.
Squaring Similar to multiplication 8 bit, 16 bit and 23 bit i.e. single precision
squaring hardware design are implemented and 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.
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.
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
7
8
56
7 -3
8 -2
5/ 6
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
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
103
95
9785
=
=
103 +3
95 -5
98 -15
97 / 100 -15
9785
121
93
11253
=
=
=
121 +21
93 -7
114 -147
112 / 200 147
112 / 53
11253
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
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
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
Sub-Normal
Multiplication of remainders contains fewer digits.
9988
9991
99790108
9998
9991
9979
-0012
-0009
0108
11
Super-Normal
Multiplication of remainders contains more digits.
112
998
111776
=
=
112
998
110
-888
-002
1776
110 + 1 / 776
111776
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
43 -07
49 -01
42 07
42 / 07
2107
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
Base = 10 4 = 40
k=4
43
49
52
=
=
=
Initial Base = 10
+3
+9
27
52 4 +2 / 7
208 + 2 /7
2107
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:
248
245
60760
=
=
=
=
248 -2
245 -5
243 010
243 / 4 / 010
60.75 / 010
60 / 750 + 010
60760
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
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 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
1 8 5 4 8 9 2 3
4 6 5 2 1
------------------------------------------2 3 2 0 1 0 2 3
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.
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
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
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
21
110 / 23
8
1
9
1
1
1
0/
1
2
3
P1
M1 = 1 + 1 = 2
9
1
1
1
0/
1
2
M1 = 1 + 1 = 2
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
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
23
8
1
9
1
1
1
0/
1
2
2
3
10
3
1
10
0
1
1
6
1
7
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
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
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
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
6. Remainder 38 - 62 = 26
5
1
2
1
1
1
13 / 3 = 4 R 1
12 41 22 = 4
4/3
=1R1
5
1
9
3
3
3
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
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.
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
1
0
1
0
0
1
1
0
0
1
0
0
1
0
0
0
31
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
32
33
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
34
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.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
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
38
8000
7000
Area square um
6000
5000
4000
VedicVedic
3000
VedicWallace
2000
DesignWare
1000
0
8bit
16bit
23bit
Multiplication Width
Area square um
1000
800
600
400
200
0
0
10
12
Delay ns
VedicWallace
VedicVedic
DesignWare
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
8000
7000
6000
5000
4000
3000
2000
1000
0
0
10
15
20
Delay ns
VedicWallace
DesignWare
VedicVedic
40
Power uW
1400
1200
VedicVedic
1000
800
VedicWallace
600
DesignWare
400
200
0
8 bits
16 bits
23 bits
Bit Width
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
1200
Power uW
1000
800
600
400
200
0
0
10
15
Delay ns
VedicWallace
DesignWare
VedicVedic
42
2000
Power uW
1500
1000
500
0
0
10
15
20
Delay ns
VedicWallace
DesignWare
VedicVedic
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.
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
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 =
=
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
Critical Delay
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
47
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.
X7
X6
X5
X4
X3
X2
X1
X0
Y7
Y6
Y5
Y4
Y3
Y2
Y1
Y0
48
X7
X6
X5
X4
X3
X2
X1
X0
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.
49
80
70
60
50
VedicVedic
40
VedicWallace
30
DesignWare
20
10
0
8bit
16bit
23bit
Bit Width
Area square um
4500
4000
3500
3000
2500
VedicVedic
2000
VedicWallace
1500
DesignWare
1000
500
0
8 bits
16 bits
23 bits
Bit Width
50
Area square um
900
800
700
600
500
400
300
200
100
0
Delay ns
VedicVedic
DesignWare
VedicWallace
3500
Area square um
3000
2500
2000
1500
1000
500
0
0
Delay ns
VedicWallace
DesignWare
VedicVedic
51
Area square um
5000
4000
3000
2000
1000
0
0
10
12
Delay ns
VedicWallace
DesignWare
VedicVedic
52
1600
1400
1200
1000
VedicVedic
800
VedicWallace
600
DesignWare
400
200
0
8 bits
16 bits
23 bits
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
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
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
1=
1
R
1
0
Quotient
Remainder
0
0
1
0
0
0
0
1
0
1
0
0
0
1
0
1
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.
1=
0
R
1
0
1
0
1
1
1
0
0
0
cp = 1
Partial Dividend = 00
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
10
59
1=
0
R
0
0
0
0
1
0
-1
1
0
1
1
1
0
0
0
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.
60
0
0
0
0
1
0
-1
0
0
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.
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.
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
62
mm square
Vedic
DesignWare
8 bits
Width
Area square um
1800
1600
1400
1200
1000
800
600
400
200
0
0
10
15
20
25
30
Delay ns
Vedic
DesignWare
63
uW
400
300
vedic
200
DesignWare
100
0
8 bits
Width
600
Power uW
500
400
300
200
100
0
0
10
15
20
25
30
Delay ns
Vedic
DesignWare
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.
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
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 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.
67
.
After substitution the rotation matrix becomes
If the values of
given by
factor K can be precomputed and it depends on the number of iterations. Its value is given
as
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.
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.
to
from the
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.
) 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
70
=
After rearranging
and
B(x2,y2)
f(x2)
f(x)
C(x,y)
A(x1,y1)
f(x1)
x2
x1
) , B(
) and C(
can be
71
and f(x) as .
) as x=
and f( ) =
and
as
) 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.
and L2 =
and 1 at
; similarly L2 is 0 at
and 1 at
72
Y
f(x2)
f(x1)
L2
L1
x1
x2
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
74
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
75
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
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.
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
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
Area square um
10000
8000
6000
4000
2000
0
10
15
20
25
30
Delay ns
Vedic
DesignWare
80
1200
Area square um
1000
800
600
400
200
0
0
10
Axis Title
Vedic
DesignWare
10000
8000
6000
4000
2000
0
0
10
15
20
25
30
Delay ns
Vedic
DesignWare
81
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
82
3500
Power uW
3000
2500
2000
1500
1000
500
0
0
10
15
20
25
30
Delay ns
Vedic
DesignWare
Power uW
300
250
200
150
100
50
0
0
10
Delay
Vedic
DesignWare
83
3500
Power uW
3000
2500
2000
1500
1000
500
0
0
10
15
20
25
30
Delay ns
Vedic
DesignWare
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
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
87
88
APPENDIX
89
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
[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
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
[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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
(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
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
[1:0]
[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
110
[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) ;
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
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
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[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
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
[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]
;
;
;
;
;
;
125
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
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
[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
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[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
[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])
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
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
[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]
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
163
[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;
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
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
168
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;
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) ;
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
178
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[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
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[1:0]
[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) ;
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
185
[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]);
);
);
);
);
);
);
);
);
;
;
;
;
;
;
;
;
;
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
192
[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) ;
);
);
);
;
;
;
;
;
;
;
;
;
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];
199
[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
[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
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
[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
reg
reg
reg
reg
reg
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
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
reg
reg
reg
reg
reg
reg
reg
reg
reg
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) ;
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
227
[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) ;
);
);
);
);
);
);
);
);
;
;
;
;
;
;
;
;
;
232
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;
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
[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
240
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];
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
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
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
= 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];
% 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
= 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;
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
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
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
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,:)=
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