OpenCores
URL https://opencores.org/ocsvn/p9813_rgb_led_string_driver/p9813_rgb_led_string_driver/trunk

Subversion Repositories p9813_rgb_led_string_driver

[/] [p9813_rgb_led_string_driver/] [trunk/] [rtl/] [VHDL/] [function_pack.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jclaytons
-- A package containing various conversion functions
2
--
3
 
4
library ieee;
5
use ieee.std_logic_1164.all;
6
use ieee.numeric_std.all;
7
use ieee.math_real.all;
8
use std.textio.all;
9
 
10
package function_pack is
11
 
12
------------------------------------------------------------------------------------
13
-- function calls
14
------------------------------------------------------------------------------------
15
    function char2u(in_char : character) return unsigned;
16
    function str2u(in_string : string; out_size:integer) return unsigned;
17
    function asciichar2u2(d:character) return unsigned; -- Loosely based on code in Thesis by Rudi Rughoonundon, 11-1-1996
18
    function str2u(s: string) return unsigned;
19
    function u_reverse(in_vect : unsigned) return unsigned;
20
    function u_recursive_parity ( x : unsigned ) return std_logic;
21
    function bit_width (maxval : integer) return integer;
22
    function bit_width (maxval : real) return integer;
23
    function timer_width (maxval : integer) return integer;
24
    function timer_width (maxval : real) return integer;
25
 
26
end function_pack;
27
 
28
 
29
package body function_pack is
30
 
31
------------------------------------------------------------------------------------
32
-- 
33
------------------------------------------------------------------------------------
34
    function char2u(in_char : character) return unsigned is
35
 
36
    variable out_vec : unsigned(3 downto 0);
37
 
38
    begin
39
      case in_char is
40
        when '0' => out_vec := "0000";
41
        when '1' => out_vec := "0001";
42
        when '2' => out_vec := "0010";
43
        when '3' => out_vec := "0011";
44
        when '4' => out_vec := "0100";
45
        when '5' => out_vec := "0101";
46
        when '6' => out_vec := "0110";
47
        when '7' => out_vec := "0111";
48
        when '8' => out_vec := "1000";
49
        when '9' => out_vec := "1001";
50
        when 'A' | 'a' => out_vec := "1010";
51
        when 'B' | 'b' => out_vec := "1011";
52
        when 'C' | 'c' => out_vec := "1100";
53
        when 'D' | 'd' => out_vec := "1101";
54
        when 'E' | 'e' => out_vec := "1110";
55
        when 'F' | 'f' => out_vec := "1111";
56
        when others =>
57
          out_vec := "0000";
58
      end case;
59
      return out_vec;
60
    end char2u;
61
 
62
------------------------------------------------------------------------------------
63
-- 
64
------------------------------------------------------------------------------------
65
 
66
    function str2u(in_string : string; out_size:integer) return unsigned is
67
 
68
    variable uval   : unsigned(out_size-1 downto 0);
69
    variable nibble : unsigned(3 downto 0);
70
    begin
71
      uval := (others=>'0');
72
      for j in in_string'range loop
73
        uval(uval'length-1 downto 4) := uval(uval'length-5 downto 0);
74
        uval(3 downto 0) := char2u(in_string(j));
75
      end loop;
76
      return uval;
77
    end str2u;
78
 
79
------------------------------------------------------------------------------------
80
-- 
81
------------------------------------------------------------------------------------
82
 
83
function asciichar2u2(d:character) return unsigned is
84
  variable dout : unsigned(0 to 7);
85
  variable ascii_int : integer := 0;
86
  variable val : integer := 0;
87
begin
88
  -- Get integer value of the character
89
  ascii_int := character'pos(d);
90
  for index in dout'range loop
91
    val := ascii_int rem 2;
92
    ascii_int := ascii_int/2;
93
    if val=0 then
94
      dout(dout'high-index):='0';
95
    else
96
      dout(dout'high-index):='1';
97
    end if;
98
  end loop;
99
 
100
  return dout;
101
end asciichar2u2;
102
 
103
------------------------------------------------------------------------------------
104
-- 
105
------------------------------------------------------------------------------------
106
 
107
-- converts a string into std_logic_vector
108
 
109
function str2u(s: string) return unsigned is
110
  variable uv: unsigned(8*s'high-1 downto 0);
111
  variable k: integer;
112
begin
113
   k := s'high-s'low;
114
  for i in s'range loop
115
--    uv(8*k+7 downto 8*k) := unsigned(chartobyte(s(i)));
116
    uv(8*k+7 downto 8*k) := asciichar2u2(s(i));
117
    k      := k - 1;
118
  end loop;
119
  return uv;
120
end str2u;
121
 
122
------------------------------------------------------------------------------------
123
-- Bit Reverses the input vector
124
------------------------------------------------------------------------------------
125
 
126
  function u_reverse(in_vect : unsigned) return unsigned is
127
  variable i      : integer;
128
  variable o_vect : unsigned(in_vect'length-1 downto 0);
129
 
130
  begin
131
 
132
  for i in in_vect'length-1 downto 0 loop
133
    o_vect(in_vect'length-1-i) := in_vect(i);
134
  end loop;
135
 
136
  return(o_vect);
137
 
138
  end u_reverse;
139
 
140
------------------------------------------------------------------------------------
141
-- 
142
------------------------------------------------------------------------------------
143
--* Title           :  TEST_PARITY
144
--* Filename & Ext  :  test_parity.vhdl
145
--* Author          :  David Bishop X-66788
146
--* Created         :  3/18/97
147
--* Version         :  1.2
148
--* Revision Date   :  97/04/15
149
--* SCCSid          :  1.2 04/15/97 test_parity.vhdl
150
--* WORK Library    :  testchip
151
--* Mod History     :  
152
--* Description     :  This is a parity generator which is written recursively
153
--*                 :  It is designed to test the ability of Simulation and
154
--*                 :  Synthesis tools to check this capability.
155
--* Known Bugs      :  
156
--* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
157
 
158
 
159
  function u_recursive_parity ( x : unsigned ) return std_logic is
160
    variable Upper, Lower : std_logic;
161
    variable Half : integer;
162
    variable BUS_int : unsigned( x'length-1 downto 0 );
163
    variable Result : std_logic;
164
  begin
165
    BUS_int := x;
166
    if ( BUS_int'length = 1 ) then
167
      Result := BUS_int ( BUS_int'left );
168
    elsif ( BUS_int'length = 2 ) then
169
      Result := BUS_int ( BUS_int'right ) xor BUS_int ( BUS_int'left );
170
    else
171
      Half := ( BUS_int'length + 1 ) / 2 + BUS_int'right;
172
      Upper := u_recursive_parity ( BUS_int ( BUS_int'left downto Half ));
173
      Lower := u_recursive_parity ( BUS_int ( Half - 1 downto BUS_int'right ));
174
      Result := Upper xor Lower;
175
    end if;
176
    return Result;
177
  end;
178
 
179
------------------------------------------------------------------------------------
180
-- 
181
------------------------------------------------------------------------------------
182
 
183
    function bit_width (maxval : integer) return integer is
184
 
185
    variable w : integer;
186
    begin
187
      if (maxval<2) then
188
        w := 1;
189
      else
190
        w := integer(ceil(log2(real(maxval))));
191
      end if;
192
 
193
      return  w;
194
    end bit_width;
195
 
196
------------------------------------------------------------------------------------
197
-- 
198
------------------------------------------------------------------------------------
199
 
200
    function bit_width (maxval : real) return integer is
201
 
202
    variable w : integer;
203
    begin
204
      if (maxval<2.0) then
205
        w := 1;
206
      else
207
        w := integer(ceil(log2(maxval)));
208
      end if;
209
 
210
      return  w;
211
    end bit_width;
212
 
213
------------------------------------------------------------------------------------
214
-- Timer width differs from bit width in the following way:
215
--   Bit width gives a vector large enough to have maxval different states, but
216
--   timer width gives a vector large enough to hold the quantity maxval.
217
--
218
-- The difference is critical when using timers, since they often count down from
219
-- the initial value, and trigger timeout at a value of 1...  So for maxval equal
220
-- to a power of two, an extra bit must be reserved.  This is done by adding one
221
-- to the maxval input...
222
------------------------------------------------------------------------------------
223
 
224
    function timer_width (maxval : integer) return integer is
225
 
226
    variable w : integer;
227
    begin
228
      if (maxval<2) then
229
        w := 1;
230
      else
231
        w := integer(ceil(log2(real(maxval+1))));
232
      end if;
233
 
234
      return  w;
235
    end timer_width;
236
 
237
------------------------------------------------------------------------------------
238
-- 
239
------------------------------------------------------------------------------------
240
 
241
    function timer_width (maxval : real) return integer is
242
 
243
    variable w : integer;
244
    begin
245
      if (maxval<2.0) then
246
        w := 1;
247
      else
248
        w := integer(ceil(log2(maxval+1.0)));
249
      end if;
250
 
251
      return  w;
252
    end timer_width;
253
 
254
 
255
end function_pack;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.