blob: 2b366418e58e3b3f7d716d73a4d4613b267c35ee (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
-- EMACS settings: -*- tab-width: 2; indent-tabs-mode: t -*-
-- vim: tabstop=2:shiftwidth=2:noexpandtab
-- kate: tab-width 2; replace-tabs off; indent-width 2;
-- =============================================================================
-- Authors: Patrick Lehmann
--
-- Package: Math extension package.
--
-- Description:
-- -------------------------------------
-- This package provides additional math functions.
--
-- License:
-- =============================================================================
-- Copyright 2007-2015 Technische Universitaet Dresden - Germany,
-- Chair of VLSI-Design, Diagnostics and Architecture
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
-- =============================================================================
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
library PoC;
use PoC.utils.all;
package math is
-- figurate numbers
function squareNumber(N : natural) return natural;
function cubicNumber(N : natural) return natural;
function triangularNumber(N : natural) return natural;
-- coefficients
-- binomial coefficient (N choose K)
function binomialCoefficient(N : positive; K : positive) return positive;
-- greatest common divisor (gcd)
function greatestCommonDivisor(N1 : positive; N2 : positive) return positive;
-- least common multiple (lcm)
function leastCommonMultiple(N1 : positive; N2 : positive) return positive;
end package;
package body math is
-- figurate numbers
function squareNumber(N : natural) return natural is
begin
return N*N;
end function;
function cubicNumber(N : natural) return natural is
begin
return N*N*N;
end function;
function triangularNumber(N : natural) return natural is
variable T : natural;
begin
return (N * (N + 1) / 2);
end function;
-- coefficients
function binomialCoefficient(N : positive; K : positive) return positive is
variable Result : positive;
begin
Result := 1;
for i in 1 to K loop
Result := Result * (((N + 1) - i) / i);
end loop;
return Result;
end function;
-- greatest common divisor (gcd)
function greatestCommonDivisor(N1 : positive; N2 : positive) return positive is
variable M1 : positive;
variable M2 : natural;
variable Remainer : natural;
begin
M1 := imax(N1, N2);
M2 := imin(N1, N2);
while M2 /= 0 loop
Remainer := M1 mod M2;
M1 := M2;
M2 := Remainer;
end loop;
return M1;
end function;
-- least common multiple (lcm)
function leastCommonMultiple(N1 : positive; N2 : positive) return positive is
begin
return ((N1 * N2) / greatestCommonDivisor(N1, N2));
end function;
end package body;
|