OpenCores
URL https://opencores.org/ocsvn/1g_ethernet_dpi/1g_ethernet_dpi/trunk

Subversion Repositories 1g_ethernet_dpi

[/] [1g_ethernet_dpi/] [tags/] [vmblite_base/] [hw/] [src/] [rtl/] [mblite/] [std/] [std_Pkg.vhd] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 kuzmi4
----------------------------------------------------------------------------------------------
2
--
3
--      Input file         : std_Pkg.vhd
4
--      Design name        : std_Pkg
5
--      Author             : Tamar Kranenburg
6
--      Company            : Delft University of Technology
7
--                         : Faculty EEMCS, Department ME&CE
8
--                         : Systems and Circuits group
9
--
10
--      Description        : Package with several standard components.
11
--
12
----------------------------------------------------------------------------------------------
13
 
14
library ieee;
15
use ieee.std_logic_1164.all;
16
use ieee.numeric_std.all;
17
 
18
library std;
19
use std.textio.all; -- string
20
 
21
PACKAGE std_Pkg IS
22
 
23
----------------------------------------------------------------------------------------------
24
-- STANDARD COMPONENTS IN STD_PKG
25
----------------------------------------------------------------------------------------------
26
 
27
    component sram generic
28
    (
29
        FNAME : string;
30
        WIDTH : positive;
31
        SIZE  : positive
32
    );
33
    port
34
    (
35
        dat_o : out std_logic_vector(WIDTH - 1 downto 0);
36
        dat_i : in std_logic_vector(WIDTH - 1 downto 0);
37
        adr_i : in std_logic_vector(SIZE - 1 downto 0);
38
        wre_i : in std_logic;
39
        ena_i : in std_logic;
40
        clk_i : in std_logic
41
    );
42
    end component;
43
 
44
    component sram_4en generic
45
    (
46
        WIDTH : positive;
47
        SIZE  : positive
48
    );
49
    port
50
    (
51
        dat_o : out std_logic_vector(WIDTH - 1 downto 0);
52
        dat_i : in std_logic_vector(WIDTH - 1 downto 0);
53
        adr_i : in std_logic_vector(SIZE - 1 downto 0);
54
        wre_i : in std_logic_vector(3 downto 0);
55
        ena_i : in std_logic;
56
        clk_i : in std_logic
57
    );
58
    end component;
59
 
60
    component dsram generic
61
    (
62
        WIDTH : positive;
63
        SIZE  : positive
64
    );
65
    port
66
    (
67
        dat_o   : out std_logic_vector(WIDTH - 1 downto 0);
68
        adr_i   : in std_logic_vector(SIZE - 1 downto 0);
69
        ena_i   : in std_logic;
70
        dat_w_i : in std_logic_vector(WIDTH - 1 downto 0);
71
        adr_w_i : in std_logic_vector(SIZE - 1 downto 0);
72
        wre_i   : in std_logic;
73
        clk_i   : in std_logic
74
    );
75
    end component;
76
 
77
----------------------------------------------------------------------------------------------
78
-- FUNCTIONS IN STD_PKG
79
----------------------------------------------------------------------------------------------
80
 
81
    function v_or(d : std_logic_vector) return std_logic;
82
    function is_zero(d : std_logic_vector) return std_logic;
83
    function is_not_zero(d : std_logic_vector) return std_logic;
84
    function my_conv_integer(a: std_logic_vector) return integer;
85
    function notx(d : std_logic_vector) return boolean;
86
    function compare(a, b : std_logic_vector) return std_logic;
87
    function multiply(a, b : std_logic_vector) return std_logic_vector;
88
    function sign_extend(value: std_logic_vector; fill: std_logic; size: positive) return std_logic_vector;
89
    function add(a, b : std_logic_vector; ci: std_logic) return std_logic_vector;
90
    function increment(a : std_logic_vector) return std_logic_vector;
91
    function shift(value : std_logic_vector(31 downto 0); shamt: std_logic_vector(4 downto 0); s: std_logic; t: std_logic) return std_logic_vector;
92
    function shift_left(value : std_logic_vector(31 downto 0); shamt : std_logic_vector(4 downto 0)) return std_logic_vector;
93
    function shift_right(value : std_logic_vector(31 downto 0); shamt : std_logic_vector(4 downto 0); padding: std_logic) return std_logic_vector;
94
 
95
end std_Pkg;
96
 
97
PACKAGE BODY std_Pkg IS
98
 
99
-- Unary OR reduction
100
    function v_or(d : std_logic_vector) return std_logic is
101
        variable z : std_logic;
102
    begin
103
        z := '0';
104
        if notx (d) then
105
            for i in d'range loop
106
                z := z or d(i);
107
            end loop;
108
        end if;
109
        return z;
110
    end;
111
 
112
-- Check for ones in the vector
113
    function is_not_zero(d : std_logic_vector) return std_logic is
114
        variable z : std_logic_vector(d'range);
115
    begin
116
        z := (others => '0');
117
        if notx(d) then
118
 
119
            if d = z then
120
                return '0';
121
            else
122
                return '1';
123
            end if;
124
 
125
        else
126
            return '0';
127
        end if;
128
    end;
129
 
130
-- Check for ones in the vector
131
    function is_zero(d : std_logic_vector) return std_logic is
132
    begin
133
        return not is_not_zero(d);
134
    end;
135
 
136
    -- rewrite conv_integer to avoid modelsim warnings
137
    function my_conv_integer(a : std_logic_vector) return integer is
138
        variable res : integer range 0 to 2**a'length-1;
139
    begin
140
        res := 0;
141
        if (notx(a)) then
142
            res := to_integer(unsigned(a));
143
        end if;
144
        return res;
145
    end;
146
 
147
    function compare(a, b : std_logic_vector) return std_logic is
148
        variable z : std_logic;
149
    begin
150
        if notx(a & b) and a = b then
151
            return '1';
152
        else
153
            return '0';
154
        end if;
155
    end;
156
 
157
-- Unary NOT X test
158
    function notx(d : std_logic_vector) return boolean is
159
        variable res : boolean;
160
    begin
161
        res := true;
162
-- pragma translate_off
163
        res := not is_x(d);
164
-- pragma translate_on
165
        return (res);
166
    end;
167
 
168
-- -- 32 bit shifter
169
-- -- SYNOPSIS:
170
-- --    value: value to be shifted
171
-- --    shamt: shift amount
172
-- --    s 0 / 1: shift right / left
173
-- --    t 0 / 1: shift logical / arithmetic
174
-- -- PSEUDOCODE (from microblaze reference guide)
175
-- --     if S = 1 then
176
-- --          (rD) = (rA) << (rB)[27:31]
177
-- --     else
178
-- --      if T = 1 then
179
-- --         if ((rB)[27:31]) != 0 then
180
-- --              (rD)[0:(rB)[27:31]-1] = (rA)[0]
181
-- --              (rD)[(rB)[27:31]:31] = (rA) >> (rB)[27:31]
182
-- --         else
183
-- --              (rD) = (rA)
184
-- --      else
185
-- --         (rD) = (rA) >> (rB)[27:31]
186
 
187
    function shift(value: std_logic_vector(31 downto 0); shamt: std_logic_vector(4 downto 0); s: std_logic; t: std_logic) return std_logic_vector is
188
    begin
189
        if s = '1' then
190
            -- left arithmetic or logical shift
191
            return shift_left(value, shamt);
192
        else
193
            if t = '1' then
194
                -- right arithmetic shift
195
                return shift_right(value, shamt, value(31));
196
            else
197
                -- right logical shift
198
                return shift_right(value, shamt, '0');
199
            end if;
200
        end if;
201
    end;
202
 
203
    function shift_left(value: std_logic_vector(31 downto 0); shamt: std_logic_vector(4 downto 0)) return std_logic_vector is
204
        variable result: std_logic_vector(31 downto 0);
205
        variable paddings: std_logic_vector(15 downto 0);
206
    begin
207
        paddings := (others => '0');
208
        result := value;
209
        if (shamt(4) = '1') then result := result(15 downto 0) & paddings(15 downto 0); end if;
210
        if (shamt(3) = '1') then result := result(23 downto 0) & paddings( 7 downto 0); end if;
211
        if (shamt(2) = '1') then result := result(27 downto 0) & paddings( 3 downto 0); end if;
212
        if (shamt(1) = '1') then result := result(29 downto 0) & paddings( 1 downto 0); end if;
213
        if (shamt(0) = '1') then result := result(30 downto 0) & paddings( 0 );         end if;
214
        return result;
215
    end;
216
 
217
    function shift_right(value: std_logic_vector(31 downto 0); shamt: std_logic_vector(4 downto 0); padding: std_logic) return std_logic_vector is
218
        variable result: std_logic_vector(31 downto 0);
219
        variable paddings: std_logic_vector(15 downto 0);
220
    begin
221
        paddings := (others => padding);
222
        result := value;
223
        if (shamt(4) = '1') then result := paddings(15 downto 0) & result(31 downto 16); end if;
224
        if (shamt(3) = '1') then result := paddings( 7 downto 0) & result(31 downto  8); end if;
225
        if (shamt(2) = '1') then result := paddings( 3 downto 0) & result(31 downto  4); end if;
226
        if (shamt(1) = '1') then result := paddings( 1 downto 0) & result(31 downto  2); end if;
227
        if (shamt(0) = '1') then result := paddings( 0 )         & result(31 downto  1); end if;
228
        return result;
229
    end;
230
 
231
    function multiply(a, b: std_logic_vector) return std_logic_vector is
232
        variable x: std_logic_vector (a'length + b'length - 1 downto 0);
233
    begin
234
        x := std_logic_vector(signed(a) * signed(b));
235
        return x(31 downto 0);
236
    end;
237
 
238
    function sign_extend(value: std_logic_vector; fill: std_logic; size: positive) return std_logic_vector is
239
        variable a: std_logic_vector (size - 1 downto 0);
240
    begin
241
        a(size - 1 downto value'length) := (others => fill);
242
        a(value'length - 1 downto 0) := value;
243
        return a;
244
    end;
245
 
246
    function add(a, b : std_logic_vector; ci: std_logic) return std_logic_vector is
247
        variable x : std_logic_vector(a'length + 1 downto 0);
248
    begin
249
        x := (others => '0');
250
        if notx (a & b & ci) then
251
            x := std_logic_vector(signed('0' & a & '1') + signed('0' & b & ci));
252
        end if;
253
        return x(a'length + 1 downto 1);
254
    end;
255
 
256
    function increment(a : std_logic_vector) return std_logic_vector is
257
        variable x : std_logic_vector(a'length-1 downto 0);
258
    begin
259
        x := (others => '0');
260
        if notx (a) then
261
            x := std_logic_vector(signed(a) + 1);
262
        end if;
263
        return x;
264
    end;
265
 
266
end std_Pkg;

powered by: WebSVN 2.1.0

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