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

Subversion Repositories cpu_lecture

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /cpu_lecture/trunk/src
    from Rev 20 to Rev 21
    Reverse comparison

Rev 20 → Rev 21

/alu.vhd
57,21 → 57,36
A(4) or A(5) or A(6) or A(7));
end;
 
function cy(D, R, S: std_logic) return std_logic is
function cy_add(Rd, Rr, R: std_logic) return std_logic is
begin
return (D and R) or (D and not S) or (R and not S);
return (Rd and Rr) or (Rd and (not R)) or ((not R) and Rr);
end;
 
function ov(D, R, S: std_logic) return std_logic is
function ov_add(Rd, Rr, R: std_logic) return std_logic is
begin
return (D and R and (not S)) or ((not D) and (not R) and S);
return (Rd and Rr and (not R)) or ((not Rd) and (not Rr) and R);
end;
 
function si(D, R, S: std_logic) return std_logic is
function si_add(Rd, Rr, R: std_logic) return std_logic is
begin
return S xor ov(D, R, S);
return R xor ov_add(Rd, Rr, R);
end;
 
function cy_sub(Rd, Rr, R: std_logic) return std_logic is
begin
return ((not Rd) and Rr) or (Rr and R) or (R and (not Rd));
end;
 
function ov_sub(Rd, Rr, R: std_logic) return std_logic is
begin
return (Rd and (not Rr) and (not R)) or ((not Rd) and Rr and R);
end;
 
function si_sub(Rd, Rr, R: std_logic) return std_logic is
begin
return R xor ov_sub(Rd, Rr, R);
end;
 
signal L_ADC_DR : std_logic_vector( 7 downto 0); -- D + R + Carry
signal L_ADD_DR : std_logic_vector( 7 downto 0); -- D + R
signal L_ADIW_D : std_logic_vector(15 downto 0); -- D + IMM
129,21 → 144,21
case I_ALU_OP is
when ALU_ADC =>
L_DOUT <= L_ADC_DR & L_ADC_DR;
Q_FLAGS(0) <= cy(L_D8(7), L_RI8(7), L_ADC_DR(7)); -- Carry
Q_FLAGS(1) <= ze(L_ADC_DR); -- Zero
Q_FLAGS(2) <= L_ADC_DR(7); -- Negative
Q_FLAGS(3) <= ov(L_D8(7), L_RI8(7), L_ADC_DR(7)); -- Overflow
Q_FLAGS(4) <= si(L_D8(7), L_RI8(7), L_ADC_DR(7)); -- Signed
Q_FLAGS(5) <= cy(L_D8(3), L_RI8(3), L_ADC_DR(3)); -- Halfcarry
Q_FLAGS(0) <= cy_add(L_D8(7), L_RI8(7), L_ADC_DR(7));-- Carry
Q_FLAGS(1) <= ze(L_ADC_DR); -- Zero
Q_FLAGS(2) <= L_ADC_DR(7); -- Negative
Q_FLAGS(3) <= ov_add(L_D8(7), L_RI8(7), L_ADC_DR(7));-- Overflow
Q_FLAGS(4) <= si_add(L_D8(7), L_RI8(7), L_ADC_DR(7));-- Signed
Q_FLAGS(5) <= cy_add(L_D8(3), L_RI8(3), L_ADC_DR(3));-- Halfcarry
 
when ALU_ADD =>
L_DOUT <= L_ADD_DR & L_ADD_DR;
Q_FLAGS(0) <= cy(L_D8(7), L_RI8(7), L_ADD_DR(7)); -- Carry
Q_FLAGS(1) <= ze(L_ADD_DR); -- Zero
Q_FLAGS(2) <= L_ADD_DR(7); -- Negative
Q_FLAGS(3) <= ov(L_D8(7), L_RI8(7), L_ADD_DR(7)); -- Overflow
Q_FLAGS(4) <= si(L_D8(7), L_RI8(7), L_ADD_DR(7)); -- Signed
Q_FLAGS(5) <= cy(L_D8(3), L_RI8(3), L_ADD_DR(3)); -- Halfcarry
Q_FLAGS(0) <= cy_add(L_D8(7), L_RI8(7), L_ADD_DR(7));-- Carry
Q_FLAGS(1) <= ze(L_ADD_DR); -- Zero
Q_FLAGS(2) <= L_ADD_DR(7); -- Negative
Q_FLAGS(3) <= ov_add(L_D8(7), L_RI8(7), L_ADD_DR(7));-- Overflow
Q_FLAGS(4) <= si_add(L_D8(7), L_RI8(7), L_ADD_DR(7));-- Signed
Q_FLAGS(5) <= cy_add(L_D8(3), L_RI8(3), L_ADD_DR(3));-- Halfcarry
 
when ALU_ADIW =>
L_DOUT <= L_ADIW_D;
309,12 → 324,12
 
when ALU_SBC =>
L_DOUT <= L_SBC_DR & L_SBC_DR;
Q_FLAGS(0) <= cy(L_SBC_DR(7), L_RI8(7), L_D8(7)); -- Carry
Q_FLAGS(1) <= ze(L_SBC_DR) and I_FLAGS(1); -- Zero
Q_FLAGS(2) <= L_SBC_DR(7); -- Negative
Q_FLAGS(3) <= ov(L_SBC_DR(7), L_RI8(7), L_D8(7)); -- Overflow
Q_FLAGS(4) <= si(L_SBC_DR(7), L_RI8(7), L_D8(7)); -- Signed
Q_FLAGS(5) <= cy(L_SBC_DR(3), L_RI8(3), L_D8(3)); -- Halfcarry
Q_FLAGS(0) <= cy_sub(L_D8(7), L_RI8(7), L_SBC_DR(7));-- Carry
Q_FLAGS(1) <= ze(L_SBC_DR) and I_FLAGS(1); -- Zero
Q_FLAGS(2) <= L_SBC_DR(7); -- Negative
Q_FLAGS(3) <= ov_sub(L_D8(7), L_RI8(7), L_SBC_DR(7));-- Overflow
Q_FLAGS(4) <= si_sub(L_D8(7), L_RI8(7), L_SBC_DR(7));-- Signed
Q_FLAGS(5) <= cy_sub(L_D8(3), L_RI8(3), L_SBC_DR(3));-- Halfcarry
 
when ALU_SBIW =>
L_DOUT <= L_SBIW_D;
340,12 → 355,12
when ALU_SUB =>
L_DOUT <= L_SUB_DR & L_SUB_DR;
Q_FLAGS(0) <= cy(L_SUB_DR(7), L_RI8(7), L_D8(7)); -- Carry
Q_FLAGS(1) <= ze(L_SUB_DR); -- Zero
Q_FLAGS(2) <= L_SUB_DR(7); -- Negative
Q_FLAGS(3) <= ov(L_SUB_DR(7), L_RI8(7), L_D8(7)); -- Overflow
Q_FLAGS(4) <= si(L_SUB_DR(7), L_RI8(7), L_D8(7)); -- Signed
Q_FLAGS(5) <= cy(L_SUB_DR(3), L_RI8(3), L_D8(3)); -- Halfcarry
Q_FLAGS(0) <= cy_sub(L_D8(7), L_RI8(7), L_SUB_DR(7));-- Carry
Q_FLAGS(1) <= ze(L_SUB_DR); -- Zero
Q_FLAGS(2) <= L_SUB_DR(7); -- Negative
Q_FLAGS(3) <= ov_sub(L_D8(7), L_RI8(7), L_SUB_DR(7));-- Overflow
Q_FLAGS(4) <= si_sub(L_D8(7), L_RI8(7), L_SUB_DR(7));-- Signed
Q_FLAGS(5) <= cy_sub(L_D8(3), L_RI8(3), L_SUB_DR(3));-- Halfcarry
 
when ALU_SWAP =>
L_DOUT <= L_SWAP_D & L_SWAP_D;

powered by: WebSVN 2.1.0

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