-- 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;