Root/lm32/logic/sakc/rtl/lm32/lm32_adder.v

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// =============================================================================
23
24`include "lm32_include.v"
25
26/////////////////////////////////////////////////////
27// Module interface
28/////////////////////////////////////////////////////
29
30module lm32_adder (
31    // ----- Inputs -------
32    adder_op_x,
33    adder_op_x_n,
34    operand_0_x,
35    operand_1_x,
36    // ----- Outputs -------
37    adder_result_x,
38    adder_carry_n_x,
39    adder_overflow_x
40    );
41
42/////////////////////////////////////////////////////
43// Inputs
44/////////////////////////////////////////////////////
45
46input adder_op_x; // Operating to perform, 0 for addition, 1 for subtraction
47input adder_op_x_n; // Inverted version of adder_op_x
48input [`LM32_WORD_RNG] operand_0_x; // Operand to add, or subtract from
49input [`LM32_WORD_RNG] operand_1_x; // Opearnd to add, or subtract by
50
51/////////////////////////////////////////////////////
52// Outputs
53/////////////////////////////////////////////////////
54
55output [`LM32_WORD_RNG] adder_result_x; // Result of addition or subtraction
56wire [`LM32_WORD_RNG] adder_result_x;
57output adder_carry_n_x; // Inverted carry
58wire adder_carry_n_x;
59output adder_overflow_x; // Indicates if overflow occured, only valid for subtractions
60reg adder_overflow_x;
61    
62/////////////////////////////////////////////////////
63// Internal nets and registers
64/////////////////////////////////////////////////////
65
66wire a_sign; // Sign (i.e. positive or negative) of operand 0
67wire b_sign; // Sign of operand 1
68wire result_sign; // Sign of result
69
70/////////////////////////////////////////////////////
71// Instantiations
72/////////////////////////////////////////////////////
73
74lm32_addsub addsub (
75    // ----- Inputs -----
76    .DataA (operand_0_x),
77    .DataB (operand_1_x),
78    .Cin (adder_op_x),
79    .Add_Sub (adder_op_x_n),
80    // ----- Ouputs -----
81    .Result (adder_result_x),
82    .Cout (adder_carry_n_x)
83    );
84
85/////////////////////////////////////////////////////
86// Combinational Logic
87/////////////////////////////////////////////////////
88
89// Extract signs of operands and result
90
91assign a_sign = operand_0_x[`LM32_WORD_WIDTH-1];
92assign b_sign = operand_1_x[`LM32_WORD_WIDTH-1];
93assign result_sign = adder_result_x[`LM32_WORD_WIDTH-1];
94
95// Determine whether an overflow occured when performing a subtraction
96
97always @*
98begin
99    // +ve - -ve = -ve -> overflow
100    // -ve - +ve = +ve -> overflow
101    if ( (!a_sign & b_sign & result_sign)
102         || (a_sign & !b_sign & !result_sign)
103        )
104        adder_overflow_x = `TRUE;
105    else
106        adder_overflow_x = `FALSE;
107end
108    
109endmodule
110
111

Archive Download this file

Branches:
master



interactive