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

Subversion Repositories cpu16

[/] [cpu16/] [trunk/] [alu.v] - Rev 2

Compare with Previous | Blame | View Log

module alu (
	a,
	b,
	c_in,
	func,
	result,
	n,
	v,
	z,
	c
	);
 
	input [15:0] a,b;
	input c_in;
	input [2:0] func;
	output [15:0] result;
	output n,v,z,c;
 
	reg [15:0] addsub_result;
	reg addsub_c;
	reg addsub_v;
	always @(*)
		if ( func[1])
			{ addsub_c, addsub_result } = a + b + (c_in&func[0]);
		else
			{ addsub_c, addsub_result } = a - b - (c_in&func[0]);
 
	// overflow calculation
	always @(*)
		addsub_v = a[15] ^ b[15] ^ addsub_c ^ addsub_result[15];
 
	reg [15:0] logic_result;
	always @(*)
		case (func[1:0])
			2'd0 : logic_result = a;		// maps to subtract
			2'd1 : logic_result = a&b;
			2'd2 : logic_result = a|b;
			2'd3 : logic_result = a^b;
		endcase
 
	reg [15:0] result;
	always @(*)
		if ( func[2])
			result = logic_result;
		else
			result = addsub_result;
 
	reg n,v,z,c;
	always @(*)
		casex (func)
			3'b0xx,	// sub/sbc/add/adc
			3'b100 : begin	// cmp
				n = addsub_result[15];
				v = addsub_v;
				z = ~|addsub_result;
				c = addsub_c;
				end
			default : begin
				n = logic_result[15];
				v = 1'b0;
				z = ~|logic_result;
				c = 1'b0;
				end
		endcase
 
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.