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

Subversion Repositories fluid_core_2

[/] [fluid_core_2/] [trunk/] [rtl/] [int_ALU.v] - Rev 2

Compare with Previous | Blame | View Log

//////////////////////////////////////////////////////////////////////
////                                                              ////
//// Copyright (C) 2014-2015 Azmath Moosa                         ////
////                                                              ////
//// This source file may be used and distributed without         ////
//// restriction provided that this copyright statement is not    ////
//// removed from the file and that any derivative work contains  ////
//// the original copyright notice and the associated disclaimer. ////
////                                                              ////
//// This source file is free software; you can redistribute it   ////
//// and/or modify it under the terms of the GNU Lesser General   ////
//// Public License as published by the Free Software Foundation; ////
//// either version 3 of the License, or (at your option) any     ////
//// later version.                                               ////
////                                                              ////
//// This source is distributed in the hope that it will be       ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
//// PURPOSE.  See the GNU Lesser General Public License for more ////
//// details.                                                     ////
////                                                              ////
//// You should have received a copy of the GNU Lesser General    ////
//// Public License along with this source; if not, download it   ////
//// from http://www.opencores.org/lgpl.shtml                     ////
////                                                              ////
//////////////////////////////////////////////////////////////////////
`timescale 1ns / 1ps
`include "Configuration.v"
 
module int_ALU(
	input [0:`mod_sel_msb] Module,
	input [0:`operation_msb] Operation,
	input [0:`dpw] OP1,
	input [0:`dpw] OP2,
	output [0:`dpw] Result,
	output [0:3] Flag,
	input [0:3] prev_Flag
    );
 
	wire en;
	assign en = (Module==`int_ALU);
 
	wire [0:`dpw] OP1_;
	assign OP1_ = (~OP1 + `dpw'b01);
 
	reg [0:`dpw] result_buff;
	reg C,Z,S,O;
	 //----[C|Z|S|O]------// 
 
	initial begin
		{C,Z,S,O} = {0,0,0,0};
		result_buff = 0;		
	end
	always@(*) begin
 
		if (en) begin
			case (Operation)
			`ADD: {C,result_buff} <= OP1 + OP2;
			`SUB: {C,result_buff} <= OP2 + OP1_;
			`ADC: {C,result_buff} <= OP1 + OP2 + prev_Flag[0];
			`SBC: {C,result_buff} <= OP2 + OP1_ + prev_Flag[0];
			`AND: result_buff <= OP1 & OP2;
			`OR: 	result_buff <= OP1 | OP2;
			`XOR: result_buff <= OP1 ^ OP2;
			endcase
 
			S <= result_buff[0];
			O <= OP1_[0]^OP2[0]^result_buff[0]^C;
			Z <= result_buff == 0;
 
		end		
	end
 
	assign Result = en ? result_buff : 'bz;
	assign Flag = {C,Z,S,O};
endmodule
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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