blob: 16a40ccba870a88d430ae58667d4f06ec0574cc2 (
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
|
-- Author: Patrick Lehmann
-- License: MIT
--
-- A generic counter module used in the StopWatch example.
--
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
-- Useful utility functions and types.
package Utilities is
type freq is range integer'low to integer'high units
Hz;
kHz = 1000 Hz;
MHz = 1000 kHz;
GHz = 1000 MHz;
THz = 1000 GHz;
end units;
-- deferred constant
constant IS_SIMULATION : boolean;
function ite(condition : boolean; ThenValue : integer; ElseValue : integer) return integer;
function log2(Value : positive) return positive;
function bin2onehot(binary : std_logic_vector; bits : natural := 0) return std_logic_vector;
function bin2onehot(binary : unsigned; bits : natural := 0) return std_logic_vector;
function to_index(value : unsigned; max : positive) return natural;
function to_index(value : natural; max : positive) return natural;
end package;
package body Utilities is
function simulation return boolean is
variable result : boolean := FALSE;
begin
-- synthesis translate_off
result := TRUE;
-- synthesis translate_on
return result;
end function;
-- deferred constant initialization
constant IS_SIMULATION : boolean := simulation;
function ite(condition : boolean; ThenValue : integer; ElseValue : integer) return integer is
begin
if condition then
return ThenValue;
else
return ElseValue;
end if;
end function;
function log2(Value : positive) return positive is
variable twosPower : natural := 1;
variable result : natural := 0;
begin
while (twosPower < Value) loop
twosPower := twosPower * 2;
result := result + 1;
end loop;
return result;
end function;
function bin2onehot(binary : std_logic_vector; bits : natural := 0) return std_logic_vector is
begin
return bin2onehot(unsigned(binary), bits);
end function;
function bin2onehot(binary : unsigned; bits : natural := 0) return std_logic_vector is
variable result : std_logic_vector(2**binary'length - 1 downto 0) := (others => '0');
begin
result(to_integer(binary)) := '1';
if (bits = 0) then
return result;
else
return result(bits - 1 downto 0);
end if;
end function;
function to_index(value : unsigned; max : positive) return natural is
begin
return to_index(to_integer(value), max);
end function;
function to_index(value : natural; max : positive) return natural is
begin
if (value <= max) then
return value;
else
return max;
end if;
-- return minimum(value, max);
end function;
end package body;
|