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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [grlib/] [stdlib/] [stdlib.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
------------------------------------------------------------------------------
2
--  This file is a part of the GRLIB VHDL IP LIBRARY
3
--  Copyright (C) 2006, Gaisler Research AB - all rights reserved.
4
--
5
-- ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN 
6
-- ACCORDANCE WITH THE GAISLER LICENSE AGREEMENT AND MUST BE APPROVED 
7
-- IN ADVANCE IN WRITING. 
8
-----------------------------------------------------------------------------
9
-- Package:     stdlib
10
-- File:        stdlib.vhd
11
-- Author:      Jiri Gaisler - Gaisler Research
12
-- Description: Package for common VHDL functions
13
------------------------------------------------------------------------------
14
 
15
library ieee;
16
use ieee.std_logic_1164.all;
17
use ieee.numeric_std.all;
18
-- pragma translate_off
19
use std.textio.all;
20
-- pragma translate_on
21
library grlib;
22
use grlib.version.all;
23
 
24
package stdlib is
25
 
26
constant LIBVHDL_VERSION : integer := grlib_version;
27
constant LIBVHDL_BUILD : integer := grlib_build;
28
-- pragma translate_off
29
constant LIBVHDL_DATE : string := grlib_date;
30
-- pragma translate_on
31
constant zero32 : std_logic_vector(31 downto 0) := (others => '0');
32
constant zero64 : std_logic_vector(63 downto 0) := (others => '0');
33
constant one32  : std_logic_vector(31 downto 0) := (others => '1');
34
 
35
type log2arr is array(0 to 512) of integer;
36
constant log2   : log2arr := (
37
0,0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
38
  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
39
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
40
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
41
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
42
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
43
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
44
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
45
  others => 9);
46
constant log2x  : log2arr := (
47
0,1,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
48
  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
49
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
50
  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
51
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
52
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
53
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
54
  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
55
  others => 9);
56
 
57
function decode(v : std_logic_vector) return std_logic_vector;
58
function genmux(s,v : std_logic_vector) return std_ulogic;
59
function xorv(d : std_logic_vector) return std_ulogic;
60
function orv(d : std_logic_vector) return std_ulogic;
61
function andv(d : std_logic_vector) return std_ulogic;
62
function notx(d : std_logic_vector) return boolean;
63
function notx(d : std_ulogic) return boolean;
64
function "-" (d : std_logic_vector; i : integer) return std_logic_vector;
65
function "-" (i : integer; d : std_logic_vector) return std_logic_vector;
66
function "+" (d : std_logic_vector; i : integer) return std_logic_vector;
67
function "+" (i : integer; d : std_logic_vector) return std_logic_vector;
68
function "-" (d : std_logic_vector; i : std_ulogic) return std_logic_vector;
69
function "+" (d : std_logic_vector; i : std_ulogic) return std_logic_vector;
70
function "-" (a, b : std_logic_vector) return std_logic_vector;
71
function "+" (a, b : std_logic_vector) return std_logic_vector;
72
function "*" (a, b : std_logic_vector) return std_logic_vector;
73
function signed_mul (a, b : std_logic_vector) return std_logic_vector;
74
--function ">" (a, b : std_logic_vector) return boolean;
75
function "<" (i : integer; b : std_logic_vector) return boolean;
76
function conv_integer(v : std_logic_vector) return integer;
77
function conv_integer(v : std_logic) return integer;
78
function conv_std_logic_vector(i : integer; w : integer) return std_logic_vector;
79
function conv_std_logic_vector_signed(i : integer; w : integer) return std_logic_vector;
80
function conv_std_logic(b : boolean) return std_ulogic;
81
 
82
-- Reporting and diagnostics
83
 
84
-- pragma translate_off
85
 
86
function tost(v:std_logic_vector) return string;
87
function tost(v:std_logic) return string;
88
function tost(i : integer) return string;
89
procedure print(s : string);
90
 
91
component report_version
92
  generic (msg1, msg2, msg3, msg4 : string := ""; mdel : integer := 4);
93
end component;
94
 
95
-- pragma translate_on
96
 
97
end;
98
 
99
package body stdlib is
100
 
101
function notx(d : std_logic_vector) return boolean is
102
variable res : boolean;
103
begin
104
  res := true;
105
-- pragma translate_off
106
  res := not is_x(d);
107
-- pragma translate_on
108
  return (res);
109
end;
110
 
111
function notx(d : std_ulogic) return boolean is
112
variable res : boolean;
113
begin
114
  res := true;
115
-- pragma translate_off
116
  res := not is_x(d);
117
-- pragma translate_on
118
  return (res);
119
end;
120
 
121
-- generic decoder
122
 
123
function decode(v : std_logic_vector) return std_logic_vector is
124
variable res : std_logic_vector((2**v'length)-1 downto 0);
125
variable i : integer range res'range;
126
begin
127
  res := (others => '0'); i := 0;
128
  if notx(v) then i := to_integer(unsigned(v)); end if;
129
  res(i) := '1';
130
  return(res);
131
end;
132
 
133
-- generic multiplexer
134
 
135
function genmux(s,v : std_logic_vector) return std_ulogic is
136
variable res : std_logic_vector(v'length-1 downto 0);
137
variable i : integer range res'range;
138
begin
139
  res := v; i := 0;
140
  if notx(s) then i := to_integer(unsigned(s)); end if;
141
  return(res(i));
142
end;
143
 
144
-- vector XOR
145
 
146
function xorv(d : std_logic_vector) return std_ulogic is
147
variable tmp : std_ulogic;
148
begin
149
  tmp := '0';
150
  for i in d'range loop tmp := tmp xor d(i); end loop;
151
  return(tmp);
152
end;
153
 
154
-- vector OR
155
 
156
function orv(d : std_logic_vector) return std_ulogic is
157
variable tmp : std_ulogic;
158
begin
159
  tmp := '0';
160
  for i in d'range loop tmp := tmp or d(i); end loop;
161
  return(tmp);
162
end;
163
 
164
-- vector AND
165
 
166
function andv(d : std_logic_vector) return std_ulogic is
167
variable tmp : std_ulogic;
168
begin
169
  tmp := '1';
170
  for i in d'range loop tmp := tmp and d(i); end loop;
171
  return(tmp);
172
end;
173
 
174
-- unsigned multiplication
175
 
176
function "*" (a, b : std_logic_vector) return std_logic_vector is
177
variable z : std_logic_vector(a'length+b'length-1 downto 0);
178
begin
179
  if notx(a&b) then
180
    return(std_logic_vector(unsigned(a) * unsigned(b)));
181
-- pragma translate_off
182
  else
183
     z := (others =>'X'); return(z);
184
-- pragma translate_on
185
  end if;
186
end;
187
 
188
-- signed multiplication
189
 
190
function signed_mul (a, b : std_logic_vector) return std_logic_vector is
191
variable z : std_logic_vector(a'length+b'length-1 downto 0);
192
begin
193
  if notx(a&b) then
194
    return(std_logic_vector(signed(a) * signed(b)));
195
-- pragma translate_off
196
  else
197
     z := (others =>'X'); return(z);
198
-- pragma translate_on
199
  end if;
200
end;
201
 
202
-- unsigned addition
203
 
204
function "+" (a, b : std_logic_vector) return std_logic_vector is
205
variable x : std_logic_vector(a'length-1 downto 0);
206
variable y : std_logic_vector(b'length-1 downto 0);
207
begin
208
  if notx(a&b) then
209
    return(std_logic_vector(unsigned(a) + unsigned(b)));
210
-- pragma translate_off
211
  else
212
     x := (others =>'X'); y := (others =>'X');
213
     if (x'length > y'length) then return(x); else return(y); end if;
214
-- pragma translate_on
215
  end if;
216
end;
217
 
218
function "+" (i : integer; d : std_logic_vector) return std_logic_vector is
219
variable x : std_logic_vector(d'length-1 downto 0);
220
begin
221
  if notx(d) then
222
    return(std_logic_vector(unsigned(d) + i));
223
-- pragma translate_off
224
  else x := (others =>'X'); return(x);
225
-- pragma translate_on
226
  end if;
227
end;
228
 
229
function "+" (d : std_logic_vector; i : integer) return std_logic_vector is
230
variable x : std_logic_vector(d'length-1 downto 0);
231
begin
232
  if notx(d) then
233
    return(std_logic_vector(unsigned(d) + i));
234
-- pragma translate_off
235
  else x := (others =>'X'); return(x);
236
-- pragma translate_on
237
  end if;
238
end;
239
 
240
function "+" (d : std_logic_vector; i : std_ulogic) return std_logic_vector is
241
variable x : std_logic_vector(d'length-1 downto 0);
242
variable y : std_logic_vector(0 downto 0);
243
begin
244
  y(0) := i;
245
  if notx(d) then
246
    return(std_logic_vector(unsigned(d) + unsigned(y)));
247
-- pragma translate_off
248
  else x := (others =>'X'); return(x);
249
-- pragma translate_on
250
  end if;
251
end;
252
 
253
-- unsigned subtraction
254
 
255
function "-" (a, b : std_logic_vector) return std_logic_vector is
256
variable x : std_logic_vector(a'length-1 downto 0);
257
variable y : std_logic_vector(b'length-1 downto 0);
258
begin
259
  if notx(a&b) then
260
    return(std_logic_vector(unsigned(a) - unsigned(b)));
261
-- pragma translate_off
262
  else
263
     x := (others =>'X'); y := (others =>'X');
264
     if (x'length > y'length) then return(x); else return(y); end if;
265
-- pragma translate_on
266
  end if;
267
end;
268
 
269
function "-" (d : std_logic_vector; i : integer) return std_logic_vector is
270
variable x : std_logic_vector(d'length-1 downto 0);
271
begin
272
  if notx(d) then
273
    return(std_logic_vector(unsigned(d) - i));
274
-- pragma translate_off
275
  else x := (others =>'X'); return(x);
276
-- pragma translate_on
277
  end if;
278
end;
279
 
280
function "-" (i : integer; d : std_logic_vector) return std_logic_vector is
281
variable x : std_logic_vector(d'length-1 downto 0);
282
begin
283
  if notx(d) then
284
    return(std_logic_vector(i - unsigned(d)));
285
-- pragma translate_off
286
  else x := (others =>'X'); return(x);
287
-- pragma translate_on
288
  end if;
289
end;
290
 
291
function "-" (d : std_logic_vector; i : std_ulogic) return std_logic_vector is
292
variable x : std_logic_vector(d'length-1 downto 0);
293
variable y : std_logic_vector(0 downto 0);
294
begin
295
  y(0) := i;
296
  if notx(d) then
297
    return(std_logic_vector(unsigned(d) - unsigned(y)));
298
-- pragma translate_off
299
  else x := (others =>'X'); return(x);
300
-- pragma translate_on
301
  end if;
302
end;
303
 
304
function ">=" (a, b : std_logic_vector) return boolean is
305
begin
306
  return(unsigned(a) >= unsigned(b));
307
end;
308
 
309
function "<" (i : integer; b : std_logic_vector) return boolean is
310
begin
311
  return( i < to_integer(unsigned(b)));
312
end;
313
 
314
function ">" (a, b : std_logic_vector) return boolean is
315
begin
316
  return(unsigned(a) > unsigned(b));
317
end;
318
 
319
function conv_integer(v : std_logic_vector) return integer is
320
begin
321
  if notx(v) then return(to_integer(unsigned(v)));
322
  else return(0); end if;
323
end;
324
 
325
function conv_integer(v : std_logic) return integer is
326
begin
327
  if notx(v) then
328
    if v = '1' then return(1);
329
    else return(0); end if;
330
  else return(0); end if;
331
end;
332
 
333
function conv_std_logic_vector(i : integer; w : integer) return std_logic_vector is
334
variable tmp : std_logic_vector(w-1 downto 0);
335
begin
336
  tmp := std_logic_vector(to_unsigned(i, w));
337
  return(tmp);
338
end;
339
 
340
function conv_std_logic_vector_signed(i : integer; w : integer) return std_logic_vector is
341
variable tmp : std_logic_vector(w-1 downto 0);
342
begin
343
  tmp := std_logic_vector(to_signed(i, w));
344
  return(tmp);
345
end;
346
 
347
function conv_std_logic(b : boolean) return std_ulogic is
348
begin
349
  if b then return('1'); else return('0'); end if;
350
end;
351
 
352
-- pragma translate_off
353
subtype nibble is std_logic_vector(3 downto 0);
354
 
355
function todec(i:integer) return character is
356
begin
357
  case i is
358
  when 0 => return('0');
359
  when 1 => return('1');
360
  when 2 => return('2');
361
  when 3 => return('3');
362
  when 4 => return('4');
363
  when 5 => return('5');
364
  when 6 => return('6');
365
  when 7 => return('7');
366
  when 8 => return('8');
367
  when 9 => return('9');
368
  when others => return('0');
369
  end case;
370
end;
371
 
372
function tohex(n:nibble) return character is
373
begin
374
  case n is
375
  when "0000" => return('0');
376
  when "0001" => return('1');
377
  when "0010" => return('2');
378
  when "0011" => return('3');
379
  when "0100" => return('4');
380
  when "0101" => return('5');
381
  when "0110" => return('6');
382
  when "0111" => return('7');
383
  when "1000" => return('8');
384
  when "1001" => return('9');
385
  when "1010" => return('a');
386
  when "1011" => return('b');
387
  when "1100" => return('c');
388
  when "1101" => return('d');
389
  when "1110" => return('e');
390
  when "1111" => return('f');
391
  when others => return('X');
392
  end case;
393
end;
394
 
395
function tost(v:std_logic_vector) return string is
396
constant vlen : natural := v'length; --'
397
constant slen : natural := (vlen+3)/4;
398
variable vv : std_logic_vector(0 to slen*4-1) := (others => '0');
399
variable s : string(1 to slen);
400
variable nz : boolean := false;
401
variable index : integer := -1;
402
begin
403
  vv(slen*4-vlen to slen*4-1) := v;
404
  for i in 0 to slen-1 loop
405
    if (vv(i*4 to i*4+3) = "0000") and nz and (i /= (slen-1)) then
406
      index := i;
407
    else
408
      nz := false;
409
      s(i+1) := tohex(vv(i*4 to i*4+3));
410
    end if;
411
  end loop;
412
  if ((index +2) = slen) then return(s(slen to slen));
413
  else return(string'("0x") & s(index+2 to slen)); end if; --'
414
end;
415
 
416
function tost(v:std_logic) return string is
417
begin
418
  if to_x01(v) = '1' then return("1"); else return("0"); end if;
419
end;
420
 
421
function tost(i : integer) return string is
422
variable L : line;
423
variable s, x : string(1 to 128);
424
variable n, tmp : integer := 0;
425
begin
426
  tmp := i;
427
  loop
428
    s(128-n) := todec(tmp mod 10);
429
    tmp := tmp / 10;
430
    n := n+1;
431
    if tmp = 0 then exit; end if;
432
  end loop;
433
  x(1 to n) := s(129-n to 128);
434
  return(x(1 to n));
435
end;
436
 
437
procedure print(s : string) is
438
    variable L : line;
439
begin
440
  L := new string'(s); writeline(output, L);
441
end;
442
 
443
-- pragma translate_on
444
end;
445
 
446
 

powered by: WebSVN 2.1.0

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