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/] [gaisler/] [vlog/] [RF_components1.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
/******************************************************************
2
 *                                                                *
3
 *    Author: Liwei                                               *
4
 *                                                                *
5
 *    This file is part of the "mips789" project.                 *
6
 *    Downloaded from:                                            *
7
 *    http://www.opencores.org/pdownloads.cgi/list/mips789        *
8
 *                                                                *
9
 *    If you encountered any problem, please contact me via       *
10
 *    Email:mcupro@opencores.org  or mcupro@163.com               *
11
 *                                                                *
12
 ******************************************************************/
13
 
14
`include "mips789_defs.v"
15
module ext(
16
        input [31:0] ins_i ,
17
        output reg [31:0] res ,
18
        input [2:0]ctl
19
    );
20
 
21
    wire [25:0] instr25_0;
22
    assign instr25_0 = ins_i[25:0] ;
23
 
24
    wire[15:0] sign = {16{instr25_0[15]}};
25
 
26
    always @ (*)
27
    case (ctl)
28
        `EXT_SIGN    :res ={sign,instr25_0[15:0]};//sign
29
        `EXT_UNSIGN  :res ={16'b0,instr25_0[15:0]};//zeroext
30
        `EXT_J       :res ={4'b0,instr25_0[25:0],2'b0};//jmp
31
        `EXT_B       :res ={sign[13:0],instr25_0[15:0],2'B0};//branch
32
        `EXT_SA      :res ={27'b0,instr25_0[10:6]} ;//sll,srl
33
        `EXT_S2H     :res ={instr25_0[15:0],16'B0};//shift to high
34
        default: res=32'bx;
35
    endcase
36
endmodule
37
 
38
 
39
module compare (
40
        input [31:0] s,
41
        input [31:0] t,
42
        input [2:0]ctl,
43
        output reg res
44
    );
45
    always @ (*)
46
    case  (ctl)
47
        `CMP_BEQ:   res = (s==t);
48
        `CMP_BNE:   res = (s!=t);
49
        `CMP_BLTZ:  res = s[31];
50
        `CMP_BGTZ:  res = ~s[31] && (|s[30:0]);
51
        `CMP_BLEZ:  res = s[31] |(~|s);
52
        `CMP_BGEZ:  res = ~s[31];
53
        default res=1'Bx;
54
    endcase
55
endmodule
56
 
57
 
58
module pc_gen(
59
        input [2:0]ctl,
60
        input hold,
61
        input clk,
62
        output reg   [31:0]pc_next,
63
                  output reg   branch,
64
        input [3:0] pc_prectl,
65
        input check,
66
        input [31:0]s,
67
        input [31:0]pc,
68
        input [31:0]zz_spc,
69
        input [31:0]imm
70
    );
71
 
72
    wire [32:0] br_addr = pc-4 + imm ;
73
    always @ (*)
74
        if(pc_prectl == `PC_IGN )
75
        begin
76
            case (ctl)
77
                `PC_RET         :begin  pc_next = zz_spc ; branch=1; end
78
                `PC_J           :begin  pc_next ={pc[31:28],imm[27:0]}; branch=1; end
79
                `PC_JR          :begin  pc_next = s; branch=1; end
80
                `PC_BC          :begin  pc_next = (check)?({br_addr[31:0]}):(pc+4);
81
                                                                                if (check == 1'b1)
82
                                                                                        branch=1;
83
                                                                                else
84
                                                                                        branch=0;
85
                                                                        end
86
             default
87
                         /* `PC_NEXT    :*/begin        pc_next = pc + 4 ;  branch=0; end
88
            endcase
89
        end
90
        else
91
        begin
92
            case (pc_prectl)
93
                `PC_KEP         : pc_next=pc;
94
 //               `PC_IRQ       : pc_next=irq;
95
             default
96
                         /* `PC_RST     : pc_next='d0;*/
97
                  pc_next =0;
98
            endcase
99
        end
100
 
101
endmodule
102
 
103
 
104
 
105
module reg_array(
106
        data,
107
        wraddress,
108
        rdaddress_a,
109
        rdaddress_b,
110
        wren,
111
        clock,
112
        qa,
113
        qb,
114
        rd_clk_cls,
115
    //    bank_sel
116
    );
117
 
118
    input       [31:0]  data;
119
    input       [4:0]  wraddress;
120
    input       [4:0]  rdaddress_a;
121
    input       [4:0]  rdaddress_b;
122
   // input bank_sel;
123
    input rd_clk_cls;
124
    input       wren;
125
 
126
    reg [31:0]  r_data;
127
    reg [4:0]  r_wraddress;
128
    reg [4:0]  r_rdaddress_a;
129
    reg [4:0]  r_rdaddress_b;
130
 
131
    reg r_wren;
132
    input       clock;
133
    output      [31:0]  qa;
134
    output      [31:0]  qb;
135
    reg [31:0]reg_bank[0:31];
136
 
137
    integer i;
138
    initial
139
    begin
140
        for(i=0;i<32;i=i+1)
141
            reg_bank[i]=0;
142
    end
143
 
144
    always@(posedge clock)
145
    begin
146
        r_data <=data;
147
        r_wraddress<=wraddress;
148
        r_wren<=wren;
149
    end
150
 
151
            always@(posedge clock)
152
        if (~rd_clk_cls)
153
        begin
154
            r_rdaddress_a <=rdaddress_a;
155
            r_rdaddress_b <=rdaddress_b;
156
        end
157
 
158
    always@(posedge clock)
159
        if (r_wren)
160
            reg_bank[r_wraddress] <= r_data ;
161
 
162
    assign qa=(r_rdaddress_a[4:0]==0)?0:
163
           ((r_wraddress==r_rdaddress_a)&&(1==r_wren))?r_data:
164
           reg_bank[r_rdaddress_a];
165
 
166
    assign qb=(r_rdaddress_b[4:0]==0)?0:
167
           ((r_wraddress==r_rdaddress_b)&&(1==r_wren))?r_data:
168
           reg_bank[r_rdaddress_b];
169
 
170
endmodule

powered by: WebSVN 2.1.0

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