-- Author: M. Gomez
-- Date : 10/29/1999
-- Rev No: 1.1
-- File : alu.vhdl
-- Following is the alu entity declaration and
-- architectural definition
--
USE work.arm7_pkg.ALL;
USE work.arm7_time_pkg.ALL;
ENTITY alu IS
GENERIC ( Tp : time );
PORT (
alu_bus : OUT data_t;
cc : OUT cc_t;
a_bus : IN data_t;
b_bus : IN data_t;
d_bus : IN data_t;
cin : IN io;
alu_ctrl : IN alu_ctrl_t);
END ENTITY alu;
ARCHITECTURE behav OF alu IS
SIGNAL mux_bus : data_t;
BEGIN
WITH alu_ctrl.b_bus_ctrl
mux_bus <= b_bus WHEN (alu_ctrl.b_bus_ctrl = b_bus) ELSE
d_bus;
WITH alu_ctrl SELECT
(carry, alu_bus) <= ('0' & a) + ('0' & mux_bus) WHEN add ELSE
<= ('0' & a) + ('0' & mux_bus) + carryVector WHEN adc ELSE
<= ('0' & a) - ('0' & mux_bus) WHEN sub ELSE
<= ('0' & a) - ('0' & mux_bus) - carryVector WHEN sbc ELSE
<= ('0' & mux_bus) - ('0' & a_bus) WHEN rsb ELSE
<= ('0' & a_bus) AND ('0' & mux_bus) WHEN andr ELSE
<= ('0' & a_bus) XOR ('0' & mux_bus) WHEN eor ELSE
<= ('0' & a_bus) OR ('0' & mux_bus) WHEN orr ELSE
<= ('0' & a_bus) WHEN passA ELSE
<= ('0' & b_bus) WHEN passB ELSE
<= ('0' & d_bus) WHEN passInst;
neg <= alu_bus(alu_bus'left);
ovr <= '1' WHEN ('1' = (NOT alu_bus(alu_bus'left)) AND a_bus(a_bus'left) AND b_bus(b_bus'left))) ELSE
'1' WHEN ('1' = ( alu_bus(alu_bus'left)) AND NOT a_bus(a_bus'left) AND NOT b_bus(b_bus'left))) ELSE
'0' WHEN ('1' = ( alu_bus(alu_bus'left)) AND a_bus(a_bus'left) AND b_bus(b_bus'left))) ELSE
'0' WHEN ('1' = (NOT alub_bus(alu_bus'left)) AND NOT a_bus(a_bus'left) AND NOT b_bus(b_bus'left))) ELSE
'x';
ovr <= a_bus
WHEN rsb =>
WHEN andr =>
WHEN eor =>
WHEN orr =>
WHEN passA =>
WHEN passB =>
WHEN passInst =>
END CASE alu_ctrl;
END ARCHITECTURE behav;