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

Subversion Repositories qrisc32

[/] [qrisc32/] [trunk/] [qrisc32_EX.sv] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 vinogradov
//////////////////////////////////////////////////////////////////////////////////////////////
2
//    Project Qrisc32 is risc cpu implementation, purpose is studying
3
//    Digital System Design course at Kyoung Hee University during my PhD earning
4
//    Copyright (C) 2010  Vinogradov Viacheslav
5
//
6
//    This library is free software; you can redistribute it and/or
7
//   modify it under the terms of the GNU Lesser General Public
8
//    License as published by the Free Software Foundation; either
9
//    version 2.1 of the License, or (at your option) any later version.
10
//
11
//    This library is distributed in the hope that it will be useful,
12
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
//    Lesser General Public License for more details.
15
//
16
//    You should have received a copy of the GNU Lesser General Public
17
//    License along with this library; if not, write to the Free Software
18
//    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19
//
20
//
21
//////////////////////////////////////////////////////////////////////////////////////////////
22
 
23
 
24
import risc_pack::*;
25
 
26
module qrisc32_EX(
27
        input                           clk,reset,pipe_stall,
28
        input pipe_struct       pipe_ex_in,
29
        output pipe_struct      pipe_ex_out,
30
 
31
        output bit                      new_address_valid,//to mem stage
32
        output bit[31:0]        new_address//to mem stage
33
        );
34
 
35
import risc_pack::*;
36
 
37
        bit      flagZ_w, flagC_w;
38
        bit      flagZ, flagC;
39
        wire signed[31:0] r2 = pipe_ex_in.val_r2;
40
        wire signed[3:0] inc_r2 = pipe_ex_in.incr_r2;
41
        wire signed[31:0] r2_add = r2 + inc_r2;
42
 
43
        wire[32:0]      summ_result = pipe_ex_in.val_r1 + pipe_ex_in.val_r2;
44
 
45
        pipe_struct     pipe_ex_out_w;
46
 
47
        always_comb
48
        begin
49
                pipe_ex_out_w=pipe_ex_in;
50
                flagZ_w=0;
51
                flagC_w=0;
52
 
53
                if(pipe_ex_in.ldrf_op)
54
                begin
55
                        if(     (pipe_ex_in.jmpz        && flagZ)
56
                                ||      (pipe_ex_in.jmpnz       && ~flagZ)
57
                                ||      (pipe_ex_in.jmpc        && flagC)
58
                                ||      (pipe_ex_in.jmpnc       && ~flagC)
59
                                )
60
                                pipe_ex_out_w.val_dst=pipe_ex_in.val_r1;
61
                        else
62
                                pipe_ex_out_w.val_dst=pipe_ex_in.val_r2;
63
                end
64
                else if(pipe_ex_in.and_op)
65
                begin
66
                        pipe_ex_out_w.val_dst=pipe_ex_in.val_r1 & pipe_ex_in.val_r2;
67
                        flagC_w=0;
68
                        flagZ_w=(pipe_ex_out_w.val_dst==0)?1:0;
69
                end
70
                else if(pipe_ex_in.or_op)
71
                begin
72
                        pipe_ex_out_w.val_dst=pipe_ex_in.val_r1 | pipe_ex_in.val_r2;
73
                        flagC_w=0;
74
                        flagZ_w=(pipe_ex_out_w.val_dst==0)?1:0;
75
                end
76
                else if(pipe_ex_in.xor_op)
77
                begin
78
                        pipe_ex_out_w.val_dst=pipe_ex_in.val_r1 ^ pipe_ex_in.val_r2;
79
                        flagC_w=0;
80
                        flagZ_w=(pipe_ex_out_w.val_dst==0)?1:0;
81
                end
82
                else if(pipe_ex_in.add_op//simple addition operation
83
                                || pipe_ex_in.jmpunc //jump unconditional calculate address = R1+R2(offset)
84
                                //jump conditional calculate address = R1+R2(offset) and check flags
85
                                || pipe_ex_in.jmpz || pipe_ex_in.jmpnz || pipe_ex_in.jmpc || pipe_ex_in.jmpnc)
86
                begin
87
                        {flagC_w,pipe_ex_out_w.val_dst}=summ_result;
88
                        flagZ_w=(pipe_ex_out_w.val_dst==0)?1:0;
89
                end
90
                else if(pipe_ex_in.mul_op)
91
                begin
92
                        {flagC_w,pipe_ex_out_w.val_dst}=pipe_ex_in.val_r1 * pipe_ex_in.val_r2;
93
                        flagZ_w=(pipe_ex_out_w.val_dst==0)?1:0;
94
                end
95
                else if(pipe_ex_in.shl_op)
96
                begin
97
                        {flagC_w,pipe_ex_out_w.val_dst}=pipe_ex_in.val_r1 << pipe_ex_in.val_r2;
98
                        flagZ_w=(pipe_ex_out_w.val_dst==0)?1:0;
99
                end
100
                else if(pipe_ex_in.shr_op)
101
                begin
102
                        {pipe_ex_out_w.val_dst,flagC_w}={pipe_ex_in.val_r1,1'b0 }>> pipe_ex_in.val_r2;
103
                        flagZ_w=(pipe_ex_out_w.val_dst==0)?1:0;
104
                end
105
                else if(pipe_ex_in.cmp_op)
106
                begin
107
                        flagZ_w=(pipe_ex_out_w.val_r1==pipe_ex_out_w.val_r2)?1:0;
108
                        flagC_w=(pipe_ex_out_w.val_r1>=pipe_ex_out_w.val_r2)?0:1;
109
                end
110
                pipe_ex_out_w.val_r2 = (pipe_ex_out_w.incr_r2_enable)?r2_add:pipe_ex_out_w.val_r2;
111
        end
112
 
113
        always@(posedge clk)
114
        begin
115
                flagZ<=
116
                (pipe_ex_in.and_op | pipe_ex_in.or_op | pipe_ex_in.xor_op | pipe_ex_in.add_op
117
                | pipe_ex_in.mul_op | pipe_ex_in.shl_op | pipe_ex_in.shr_op | pipe_ex_in.cmp_op)?flagZ_w:flagZ;
118
 
119
                flagC<=
120
                (pipe_ex_in.and_op | pipe_ex_in.or_op | pipe_ex_in.xor_op | pipe_ex_in.add_op
121
                | pipe_ex_in.mul_op | pipe_ex_in.shl_op | pipe_ex_in.shr_op | pipe_ex_in.cmp_op)?flagC_w:flagC;
122
 
123
                if(pipe_ex_in.jmpunc || (pipe_ex_in.jmpz & flagZ) ||(pipe_ex_in.jmpnz & !flagZ)||
124
                        (pipe_ex_in.jmpc & flagC) ||(pipe_ex_in.jmpnc & !flagC) )
125
                begin
126
                        new_address_valid<=~pipe_ex_in.ldrf_op;
127
                        new_address<=pipe_ex_out_w.val_dst;
128
                end
129
                else
130
                        new_address_valid<=0;
131
 
132
                if(~pipe_stall)
133
                begin
134
                        pipe_ex_out<=pipe_ex_out_w;
135
                        if(pipe_ex_in.read_mem| pipe_ex_in.write_mem)
136
                                pipe_ex_out.val_r1<=summ_result;//address for accessing
137
                end
138
 
139
        end
140
 
141
endmodule

powered by: WebSVN 2.1.0

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