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

Subversion Repositories hive

[/] [hive/] [trunk/] [v01.09/] [unused/] [clz.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ericw
/*
2
--------------------------------------------------------------------------------
3
 
4
Module : clz.v
5
 
6
--------------------------------------------------------------------------------
7
 
8
Function:
9
- Count leading zeros.
10
 
11
Instantiates:
12
- (2x) vector_sr.v
13
 
14
Notes:
15
- IN/OUT optionally registered.
16
 
17
--------------------------------------------------------------------------------
18
*/
19
 
20
module clz
21
        #(
22
        parameter       integer                                                 REGS_IN                 = 1,            // in register option
23
        parameter       integer                                                 REGS_OUT                        = 1,            // out register option
24
        parameter       integer                                                 DATA_W                  = 32,           // data width
25
        parameter       integer                                                 CLZ_W                           = 6             // s/b clog2( DATA_W ) + 1;
26
        )
27
        (
28
        // clocks & resets
29
        input                   wire                                                            clk_i,                                          // clock
30
        input                   wire                                                            rst_i,                                          // async. reset, active high
31
        // data I/O
32
        input                   wire    [DATA_W-1:0]                     data_i,                                         // input
33
        output          wire    [CLZ_W-1:0]                              clz_o                                                   // result
34
        );
35
 
36
 
37
        /*
38
        ----------------------
39
        -- internal signals --
40
        ----------------------
41
        */
42
        `include "functions.h"  // for clog2()
43
        //
44
        localparam      integer                                                 LOG2_W                  = clog2( DATA_W );
45
        //
46
        wire                                    [DATA_W-1:0]                     data;
47
        reg                                                                                             all_0;
48
        reg                                     [LOG2_W-1:0]                     hi_1;
49
        wire                                    [CLZ_W-1:0]                              clz;
50
 
51
 
52
        /*
53
        ================
54
        == code start ==
55
        ================
56
        */
57
 
58
 
59
        // optional input regs
60
        vector_sr
61
        #(
62
        .REGS                   ( REGS_IN ),
63
        .DATA_W         ( DATA_W ),
64
        .RESET_VAL      ( 0 )
65
        )
66
        in_regs
67
        (
68
        .clk_i          ( clk_i ),
69
        .rst_i          ( rst_i ),
70
        .data_i         ( data_i ),
71
        .data_o         ( data )
72
        );
73
 
74
 
75
        // looped priority encoder
76
        integer j;
77
        always @ ( posedge clk_i or posedge rst_i ) begin
78
                if ( rst_i ) begin
79
                        hi_1 <= { LOG2_W{ 1'b1 } };
80
                        all_0 <= 'b1;
81
                end else begin
82
                        hi_1 <= { LOG2_W{ 1'b1 } };
83
                        all_0 <= 'b1;
84
                        for ( j = 0; j < DATA_W; j = j + 1 ) begin
85
                                if ( data[j] ) begin
86
                                        hi_1 <= j[LOG2_W-1:0];
87
                                        all_0 <= 'b0;
88
                                end
89
                        end
90
                end
91
        end
92
 
93
        // invert & concat to get zero count
94
        assign clz = { all_0, ~hi_1 };
95
 
96
 
97
        // optional output regs
98
        vector_sr
99
        #(
100
        .REGS                   ( REGS_OUT ),
101
        .DATA_W         ( CLZ_W ),
102
        .RESET_VAL      ( 0 )
103
        )
104
        out_regs
105
        (
106
        .clk_i          ( clk_i ),
107
        .rst_i          ( rst_i ),
108
        .data_i         ( clz ),
109
        .data_o         ( clz_o )
110
        );
111
 
112
 
113
endmodule

powered by: WebSVN 2.1.0

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