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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [or1200/] [rtl/] [verilog/] [or1200_fpu_addsub.v] - Blame information for rev 310

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

Line No. Rev Author Line
1 258 julius
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  or1200_fpu_addsub                                           ////
4
////                                                              ////
5
////  This file is part of the OpenRISC 1200 project              ////
6
////  http://opencores.org/project,or1k                           ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  addition/subtraction entity for the addition/subtraction    ////
10
////  unit                                                        ////
11
////                                                              ////
12
////  To Do:                                                      ////
13
////                                                              ////
14
////                                                              ////
15
////  Author(s):                                                  ////
16
////      - Original design (FPU100) -                            ////
17
////        Jidan Al-eryani, jidan@gmx.net                        ////
18
////      - Conv. to Verilog and inclusion in OR1200 -            ////
19
////        Julius Baxter, julius@opencores.org                   ////
20
////                                                              ////
21
//////////////////////////////////////////////////////////////////////
22
//
23
//  Copyright (C) 2006, 2010
24
//
25
//      This source file may be used and distributed without        
26
//      restriction provided that this copyright statement is not   
27
//      removed from the file and that any derivative work contains 
28
//      the original copyright notice and the associated disclaimer.
29
//                                                           
30
//              THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     
31
//      EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   
32
//      TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   
33
//      FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      
34
//      OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         
35
//      INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    
36
//      (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   
37
//      GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        
38
//      BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  
39
//      LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  
40
//      (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  
41
//      OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         
42
//      POSSIBILITY OF SUCH DAMAGE. 
43
//
44
 
45
module or1200_fpu_addsub(
46
                 clk_i,
47
                 fpu_op_i,
48
                 fracta_i,
49
                 fractb_i,
50
                 signa_i,
51
                 signb_i,
52
                 fract_o,
53
                 sign_o);
54
 
55
 
56
   parameter FP_WIDTH = 32;
57
   parameter MUL_SERIAL = 0; // 0 for parallel multiplier, 1 for serial
58
   parameter MUL_COUNT = 11; //11 for parallel multiplier, 34 for serial
59
   parameter FRAC_WIDTH = 23;
60
   parameter EXP_WIDTH = 8;
61
   parameter ZERO_VECTOR = 31'd0;
62
   parameter INF = 31'b1111111100000000000000000000000;
63
   parameter QNAN = 31'b1111111110000000000000000000000;
64
   parameter SNAN = 31'b1111111100000000000000000000001;
65
 
66
   input clk_i;
67
   input fpu_op_i;
68
   input [FRAC_WIDTH+4:0] fracta_i;
69
   input [FRAC_WIDTH+4:0] fractb_i;
70
   input                  signa_i;
71
   input                  signb_i;
72
   output reg [FRAC_WIDTH+4:0] fract_o;
73
   output reg                  sign_o;
74
 
75
   wire [FRAC_WIDTH+4:0]       s_fracta_i;
76
   wire [FRAC_WIDTH+4:0]       s_fractb_i;
77
   wire [FRAC_WIDTH+4:0]       s_fract_o;
78
   wire                        s_signa_i, s_signb_i, s_sign_o;
79
   wire                        s_fpu_op_i;
80
 
81
   wire                        fracta_gt_fractb;
82
   wire                        s_addop;
83
 
84
   assign s_fracta_i = fracta_i;
85
   assign s_fractb_i = fractb_i;
86
   assign s_signa_i  = signa_i;
87
   assign s_signb_i  = signb_i;
88
   assign s_fpu_op_i = fpu_op_i;
89
 
90
   always @(posedge clk_i)
91
     begin
92
        fract_o <= s_fract_o;
93
        sign_o <= s_sign_o;
94
     end
95
 
96
   assign fracta_gt_fractb = s_fracta_i > s_fractb_i;
97
 
98
   // check if its a subtraction or an addition operation
99
   assign s_addop = ((s_signa_i ^ s_signb_i) & !s_fpu_op_i) |
100
                    ((s_signa_i ^~ s_signb_i) & s_fpu_op_i);
101
 
102
   // sign of result
103
   assign s_sign_o = ((s_fract_o == 28'd0) & !(s_signa_i & s_signb_i)) ? 0 :
104
                     (!s_signa_i & (!fracta_gt_fractb & (fpu_op_i^s_signb_i)))|
105
                     (s_signa_i & (fracta_gt_fractb | (fpu_op_i^s_signb_i)));
106
 
107
   // add/substract
108
   assign s_fract_o = s_addop ?
109
                      (fracta_gt_fractb ? s_fracta_i - s_fractb_i :
110
                       s_fractb_i - s_fracta_i) :
111
                      s_fracta_i + s_fractb_i;
112
 
113
 
114
endmodule // or1200_fpu_addsub
115
 
116
 
117
 

powered by: WebSVN 2.1.0

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