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

Subversion Repositories rv01_riscv_core

[/] [rv01_riscv_core/] [trunk/] [VHDL/] [RV01_lzdu.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 madsilicon
-----------------------------------------------------------------
2
--                                                             --
3
-----------------------------------------------------------------
4
--                                                             --
5
-- Copyright (C) 2015 Stefano Tonello                          --
6
--                                                             --
7
-- This source file may be used and distributed without        --
8
-- restriction provided that this copyright statement is not   --
9
-- removed from the file and that any derivative work contains --
10
-- the original copyright notice and the associated disclaimer.--
11
--                                                             --
12
-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY         --
13
-- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   --
14
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   --
15
-- FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      --
16
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         --
17
-- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    --
18
-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   --
19
-- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        --
20
-- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  --
21
-- LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  --
22
-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  --
23
-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         --
24
-- POSSIBILITY OF SUCH DAMAGE.                                 --
25
--                                                             --
26
-----------------------------------------------------------------
27
 
28
---------------------------------------------------------------
29
-- 32-bit leading 0's detector
30
---------------------------------------------------------------
31
 
32
library IEEE;
33
use IEEE.std_logic_1164.all;
34
use IEEE.numeric_std.all;
35
 
36
library WORK;
37
--use work.RV01_CONSTS_PKG.all;
38
--use work.RV01_TYPES_PKG.all;
39
use WORK.RV01_FUNCS_PKG.all;
40
--use WORK.RV01_ARITH_PKG.all;
41
 
42
entity RV01_LZD32 is
43
  generic(
44
    WIDTH : natural := 32
45
  );
46
  port(
47
    A_i : in std_logic_vector(WIDTH-1 downto 0);
48
 
49
    CNT_o : out std_logic_vector(6-1 downto 0)
50
  );
51
end RV01_LZD32;
52
 
53
architecture ARC of RV01_LZD32 is
54
 
55
  constant MAXZ : natural := 32;
56
  constant ONE : unsigned(WIDTH-1 downto 0) := to_unsigned(1,WIDTH);
57
 
58
  function CHK(
59
    U : unsigned(WIDTH-1 downto 0);
60
    N : natural range 0 to WIDTH-1
61
  ) return std_logic is
62
  begin
63
    if((U srl N) = ONE) then
64
      return('1');
65
    else
66
      return('0');
67
    end if;
68
  end function;
69
 
70
  signal CNT : natural range 0 to WIDTH;
71
 
72
begin
73
 
74
  process(A_i)
75
    variable TMP : std_logic_vector(MAXZ-1 downto 0);
76
  begin
77
    for i in 0 to MAXZ-1 loop
78
      TMP(i) := CHK(to_unsigned(A_i),i);
79
    end loop;
80
    case TMP is
81
      when "10000000000000000000000000000000"=> CNT <= 0;
82
      when "01000000000000000000000000000000"=> CNT <= 1;
83
      when "00100000000000000000000000000000"=> CNT <= 2;
84
      when "00010000000000000000000000000000"=> CNT <= 3;
85
      when "00001000000000000000000000000000"=> CNT <= 4;
86
      when "00000100000000000000000000000000"=> CNT <= 5;
87
      when "00000010000000000000000000000000"=> CNT <= 6;
88
      when "00000001000000000000000000000000"=> CNT <= 7;
89
      when "00000000100000000000000000000000"=> CNT <= 8;
90
      when "00000000010000000000000000000000"=> CNT <= 9;
91
      when "00000000001000000000000000000000"=> CNT <= 10;
92
      when "00000000000100000000000000000000"=> CNT <= 11;
93
      when "00000000000010000000000000000000"=> CNT <= 12;
94
      when "00000000000001000000000000000000"=> CNT <= 13;
95
      when "00000000000000100000000000000000"=> CNT <= 14;
96
      when "00000000000000010000000000000000"=> CNT <= 15;
97
      when "00000000000000001000000000000000"=> CNT <= 16;
98
      when "00000000000000000100000000000000"=> CNT <= 17;
99
      when "00000000000000000010000000000000"=> CNT <= 18;
100
      when "00000000000000000001000000000000"=> CNT <= 19;
101
      when "00000000000000000000100000000000"=> CNT <= 20;
102
      when "00000000000000000000010000000000"=> CNT <= 21;
103
      when "00000000000000000000001000000000"=> CNT <= 22;
104
      when "00000000000000000000000100000000"=> CNT <= 23;
105
      when "00000000000000000000000010000000"=> CNT <= 24;
106
      when "00000000000000000000000001000000"=> CNT <= 25;
107
      when "00000000000000000000000000100000"=> CNT <= 26;
108
      when "00000000000000000000000000010000"=> CNT <= 27;
109
      when "00000000000000000000000000001000"=> CNT <= 28;
110
      when "00000000000000000000000000000100"=> CNT <= 29;
111
      when "00000000000000000000000000000010"=> CNT <= 30;
112
      when "00000000000000000000000000000001"=> CNT <= 31;
113
      when others => CNT <= 32;
114
    end case;
115
  end process;
116
 
117
  CNT_o <= to_std_logic_vector(to_unsigned(CNT,6));
118
 
119
end ARC;

powered by: WebSVN 2.1.0

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