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

Subversion Repositories hive

[/] [hive/] [trunk/] [v04.05/] [stacks_mux.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 ericw
/*
2
--------------------------------------------------------------------------------
3
 
4
Module : stacks_mux.v
5
 
6
--------------------------------------------------------------------------------
7
 
8
Function:
9
- Output multiplexer for processor stacks.
10
 
11
Instantiates:
12
- (1x) pipe.v
13
 
14
Notes:
15
- Purely combinatorial.
16
 
17
--------------------------------------------------------------------------------
18
*/
19
 
20
module stacks_mux
21
        #(
22
        parameter       integer                                                 DATA_W                  = 32,           // data width
23
        parameter       integer                                                 ADDR_W                  = 16,           // address width (bits)
24
        parameter       integer                                                 IM_W                            = 8,            // immediate width
25
        parameter       integer                                                 STK_W                           = 3             // stack selector width
26
        )
27
        (
28
        // clocks & resets
29
        input                   wire                                                            clk_i,                                          // clock
30
        input                   wire                                                            rst_i,                                          // async. reset, active high
31
        // control I/O
32
        input                   wire    [STK_W-1:0]                              data_sel_a_i,                           // stack selector
33
        input                   wire    [STK_W-1:0]                              data_sel_b_i,                           // stack selector
34
        input                   wire    [STK_W-1:0]                              addr_sel_b_i,                           // stack selector
35
        input                   wire                                                            imda_i,                                         // 1=immediate data
36
        input                   wire                                                            imad_i,                                         // 1=immediate address
37
        // data I/O
38
        input                   wire    [DATA_W-1:0]                     pop_data0_i,                            // stack data
39
        input                   wire    [DATA_W-1:0]                     pop_data1_i,                            // stack data
40
        input                   wire    [DATA_W-1:0]                     pop_data2_i,                            // stack data
41
        input                   wire    [DATA_W-1:0]                     pop_data3_i,                            // stack data
42
        input                   wire    [DATA_W-1:0]                     pop_data4_i,                            // stack data
43
        input                   wire    [DATA_W-1:0]                     pop_data5_i,                            // stack data
44
        input                   wire    [DATA_W-1:0]                     pop_data6_i,                            // stack data
45
        input                   wire    [DATA_W-1:0]                     pop_data7_i,                            // stack data
46
        input                   wire    [IM_W-1:0]                               im_i,                                                   // immediate
47
        //
48
        output          wire    [DATA_W-1:0]                     a_data_o,                                       // results
49
        output          wire    [DATA_W-1:0]                     b_data_o,
50
        output          wire    [ADDR_W-1:0]                     b_addr_o
51
        );
52
 
53
 
54
        /*
55
        ----------------------
56
        -- internal signals --
57
        ----------------------
58
        */
59
        reg                                     [DATA_W-1:0]                     a_data, b_data;
60
        reg                                     [ADDR_W-1:0]                     b_addr;
61
 
62
 
63
 
64
        /*
65
        ================
66
        == code start ==
67
        ================
68
        */
69
 
70
 
71
        // a data mux
72
        always @ ( * ) begin
73
                case ( data_sel_a_i )
74
                        'd0 : a_data <= pop_data0_i;
75
                        'd1 : a_data <= pop_data1_i;
76
                        'd2 : a_data <= pop_data2_i;
77
                        'd3 : a_data <= pop_data3_i;
78
                        'd4 : a_data <= pop_data4_i;
79
                        'd5 : a_data <= pop_data5_i;
80
                        'd6 : a_data <= pop_data6_i;
81
                        'd7 : a_data <= pop_data7_i;
82
                endcase
83
        end
84
 
85
        // b data mux
86
        always @ ( * ) begin
87
                case ( data_sel_b_i )
88
                        'd0 : b_data <= pop_data0_i;
89
                        'd1 : b_data <= pop_data1_i;
90
                        'd2 : b_data <= pop_data2_i;
91
                        'd3 : b_data <= pop_data3_i;
92
                        'd4 : b_data <= pop_data4_i;
93
                        'd5 : b_data <= pop_data5_i;
94
                        'd6 : b_data <= pop_data6_i;
95
                        'd7 : b_data <= pop_data7_i;
96
                endcase
97
        end
98
 
99
        // b address mux
100
        always @ ( * ) begin
101
                case ( addr_sel_b_i )
102
                        'd0 : b_addr <= pop_data0_i[ADDR_W-1:0];
103
                        'd1 : b_addr <= pop_data1_i[ADDR_W-1:0];
104
                        'd2 : b_addr <= pop_data2_i[ADDR_W-1:0];
105
                        'd3 : b_addr <= pop_data3_i[ADDR_W-1:0];
106
                        'd4 : b_addr <= pop_data4_i[ADDR_W-1:0];
107
                        'd5 : b_addr <= pop_data5_i[ADDR_W-1:0];
108
                        'd6 : b_addr <= pop_data6_i[ADDR_W-1:0];
109
                        'd7 : b_addr <= pop_data7_i[ADDR_W-1:0];
110
                endcase
111
        end
112
 
113
        // data
114
        assign a_data_o = a_data;
115
        assign b_data_o = ( imda_i ) ? $signed( im_i ) : $signed( b_data );
116
 
117
        // address
118
        assign b_addr_o = ( imad_i ) ? $signed( im_i ) : $signed( b_addr );
119
 
120
 
121
endmodule

powered by: WebSVN 2.1.0

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