Tue, 08 Mar 2011 09:59:34 +0000
add licenses
1 // =============================================================================
2 // COPYRIGHT NOTICE
3 // Copyright 2006 (c) Lattice Semiconductor Corporation
4 // ALL RIGHTS RESERVED
5 // This confidential and proprietary software may be used only as authorised by
6 // a licensing agreement from Lattice Semiconductor Corporation.
7 // The entire notice above must be reproduced on all authorized copies and
8 // copies may only be made to the extent permitted by a licensing agreement from
9 // Lattice Semiconductor Corporation.
10 //
11 // Lattice Semiconductor Corporation TEL : 1-800-Lattice (USA and Canada)
12 // 5555 NE Moore Court 408-826-6000 (other locations)
13 // Hillsboro, OR 97124 web : http://www.latticesemi.com/
14 // U.S.A email: techsupport@latticesemi.com
15 // ============================================================================/
16 // FILE DETAILS
17 // Project : LatticeMico32
18 // File : lm32_adder.v
19 // Title : Integer adder / subtractor with comparison flag generation
20 // Dependencies : lm32_include.v
21 // Version : 6.1.17
22 // : Initial Release
23 // Version : 7.0SP2, 3.0
24 // : No Change
25 // Version : 3.1
26 // : No Change
27 // =============================================================================
29 `include "lm32_include.v"
31 /////////////////////////////////////////////////////
32 // Module interface
33 /////////////////////////////////////////////////////
35 module lm32_adder (
36 // ----- Inputs -------
37 adder_op_x,
38 adder_op_x_n,
39 operand_0_x,
40 operand_1_x,
41 // ----- Outputs -------
42 adder_result_x,
43 adder_carry_n_x,
44 adder_overflow_x
45 );
47 /////////////////////////////////////////////////////
48 // Inputs
49 /////////////////////////////////////////////////////
51 input adder_op_x; // Operating to perform, 0 for addition, 1 for subtraction
52 input adder_op_x_n; // Inverted version of adder_op_x
53 input [`LM32_WORD_RNG] operand_0_x; // Operand to add, or subtract from
54 input [`LM32_WORD_RNG] operand_1_x; // Opearnd to add, or subtract by
56 /////////////////////////////////////////////////////
57 // Outputs
58 /////////////////////////////////////////////////////
60 output [`LM32_WORD_RNG] adder_result_x; // Result of addition or subtraction
61 wire [`LM32_WORD_RNG] adder_result_x;
62 output adder_carry_n_x; // Inverted carry
63 wire adder_carry_n_x;
64 output adder_overflow_x; // Indicates if overflow occured, only valid for subtractions
65 reg adder_overflow_x;
67 /////////////////////////////////////////////////////
68 // Internal nets and registers
69 /////////////////////////////////////////////////////
71 wire a_sign; // Sign (i.e. positive or negative) of operand 0
72 wire b_sign; // Sign of operand 1
73 wire result_sign; // Sign of result
75 /////////////////////////////////////////////////////
76 // Instantiations
77 /////////////////////////////////////////////////////
79 lm32_addsub addsub (
80 // ----- Inputs -----
81 .DataA (operand_0_x),
82 .DataB (operand_1_x),
83 .Cin (adder_op_x),
84 .Add_Sub (adder_op_x_n),
85 // ----- Ouputs -----
86 .Result (adder_result_x),
87 .Cout (adder_carry_n_x)
88 );
90 /////////////////////////////////////////////////////
91 // Combinational Logic
92 /////////////////////////////////////////////////////
94 // Extract signs of operands and result
96 assign a_sign = operand_0_x[`LM32_WORD_WIDTH-1];
97 assign b_sign = operand_1_x[`LM32_WORD_WIDTH-1];
98 assign result_sign = adder_result_x[`LM32_WORD_WIDTH-1];
100 // Determine whether an overflow occured when performing a subtraction
102 always @(*)
103 begin
104 // +ve - -ve = -ve -> overflow
105 // -ve - +ve = +ve -> overflow
106 if ( (!a_sign & b_sign & result_sign)
107 || (a_sign & !b_sign & !result_sign)
108 )
109 adder_overflow_x = `TRUE;
110 else
111 adder_overflow_x = `FALSE;
112 end
114 endmodule