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

Subversion Repositories tg68kc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 5 to Rev 6
    Reverse comparison

Rev 5 → Rev 6

/tg68kc/trunk/TG68K_ALU.vhd
34,44 → 34,44
DIV_Mode : integer; --0=>16Bit, 1=>32Bit, 2=>switchable with CPU(1), 3=>no DIV,
BarrelShifter :integer --0=>no, 1=>yes, 2=>switchable with CPU(1)
);
port(clk : in std_logic;
Reset : in std_logic;
clkena_lw : in std_logic:='1';
execOPC : in bit;
decodeOPC : in bit;
exe_condition : in std_logic;
exec_tas : in std_logic;
long_start : in bit;
non_aligned : in std_logic;
movem_presub : in bit;
set_stop : in bit;
Z_error : in bit;
rot_bits : in std_logic_vector(1 downto 0);
exec : in bit_vector(lastOpcBit downto 0);
OP1out : in std_logic_vector(31 downto 0);
OP2out : in std_logic_vector(31 downto 0);
reg_QA : in std_logic_vector(31 downto 0);
reg_QB : in std_logic_vector(31 downto 0);
opcode : in std_logic_vector(15 downto 0);
exe_opcode : in std_logic_vector(15 downto 0);
exe_datatype : in std_logic_vector(1 downto 0);
sndOPC : in std_logic_vector(15 downto 0);
last_data_read : in std_logic_vector(15 downto 0);
data_read : in std_logic_vector(15 downto 0);
FlagsSR : in std_logic_vector(7 downto 0);
micro_state : in micro_states;
bf_ext_in : in std_logic_vector(7 downto 0);
bf_ext_out : out std_logic_vector(7 downto 0);
bf_shift : in std_logic_vector(5 downto 0);
bf_width : in std_logic_vector(5 downto 0);
bf_ffo_offset : in std_logic_vector(31 downto 0);
bf_loffset : in std_logic_vector(4 downto 0);
port(clk : in std_logic;
Reset : in std_logic;
clkena_lw : in std_logic:='1';
execOPC : in bit;
decodeOPC : in bit;
exe_condition : in std_logic;
exec_tas : in std_logic;
long_start : in bit;
non_aligned : in std_logic;
movem_presub : in bit;
set_stop : in bit;
Z_error : in bit;
rot_bits : in std_logic_vector(1 downto 0);
exec : in bit_vector(lastOpcBit downto 0);
OP1out : in std_logic_vector(31 downto 0);
OP2out : in std_logic_vector(31 downto 0);
reg_QA : in std_logic_vector(31 downto 0);
reg_QB : in std_logic_vector(31 downto 0);
opcode : in std_logic_vector(15 downto 0);
exe_opcode : in std_logic_vector(15 downto 0);
exe_datatype : in std_logic_vector(1 downto 0);
sndOPC : in std_logic_vector(15 downto 0);
last_data_read : in std_logic_vector(15 downto 0);
data_read : in std_logic_vector(15 downto 0);
FlagsSR : in std_logic_vector(7 downto 0);
micro_state : in micro_states;
bf_ext_in : in std_logic_vector(7 downto 0);
bf_ext_out : out std_logic_vector(7 downto 0);
bf_shift : in std_logic_vector(5 downto 0);
bf_width : in std_logic_vector(5 downto 0);
bf_ffo_offset : in std_logic_vector(31 downto 0);
bf_loffset : in std_logic_vector(4 downto 0);
 
set_V_Flag : buffer bit;
Flags : buffer std_logic_vector(7 downto 0);
c_out : buffer std_logic_vector(2 downto 0);
addsub_q : buffer std_logic_vector(31 downto 0);
ALUout : out std_logic_vector(31 downto 0)
set_V_Flag : buffer bit;
Flags : buffer std_logic_vector(7 downto 0);
c_out : buffer std_logic_vector(2 downto 0);
addsub_q : buffer std_logic_vector(31 downto 0);
ALUout : out std_logic_vector(31 downto 0)
);
end TG68K_ALU;
 
81,143 → 81,140
-- ALU and more
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
signal OP1in : std_logic_vector(31 downto 0);
signal addsub_a : std_logic_vector(31 downto 0);
signal addsub_b : std_logic_vector(31 downto 0);
signal notaddsub_b : std_logic_vector(33 downto 0);
signal add_result : std_logic_vector(33 downto 0);
signal addsub_ofl : std_logic_vector(2 downto 0);
signal opaddsub : bit;
signal c_in : std_logic_vector(3 downto 0);
signal flag_z : std_logic_vector(2 downto 0);
signal set_Flags : std_logic_vector(3 downto 0); --NZVC
signal CCRin : std_logic_vector(7 downto 0);
signal OP1in : std_logic_vector(31 downto 0);
signal addsub_a : std_logic_vector(31 downto 0);
signal addsub_b : std_logic_vector(31 downto 0);
signal notaddsub_b : std_logic_vector(33 downto 0);
signal add_result : std_logic_vector(33 downto 0);
signal addsub_ofl : std_logic_vector(2 downto 0);
signal opaddsub : bit;
signal c_in : std_logic_vector(3 downto 0);
signal flag_z : std_logic_vector(2 downto 0);
signal set_Flags : std_logic_vector(3 downto 0); --NZVC
signal CCRin : std_logic_vector(7 downto 0);
--BCD
signal bcd_pur : std_logic_vector(9 downto 0);
signal bcd_kor : std_logic_vector(8 downto 0);
signal halve_carry : std_logic;
signal Vflag_a : std_logic;
signal bcd_a_carry : std_logic;
signal bcd_a : std_logic_vector(8 downto 0);
signal result_mulu : std_logic_vector(127 downto 0);
signal result_div : std_logic_vector(63 downto 0);
signal set_mV_Flag : std_logic;
signal V_Flag : bit;
signal rot_rot : std_logic;
signal rot_lsb : std_logic;
signal rot_msb : std_logic;
signal rot_X : std_logic;
signal rot_C : std_logic;
signal rot_out : std_logic_vector(31 downto 0);
signal asl_VFlag : std_logic;
signal bit_bits : std_logic_vector(1 downto 0);
signal bit_number : std_logic_vector(4 downto 0);
signal bits_out : std_logic_vector(31 downto 0);
signal one_bit_in : std_logic;
signal bchg : std_logic;
signal bset : std_logic;
signal mulu_sign : std_logic;
signal mulu_signext : std_logic_vector(16 downto 0);
signal muls_msb : std_logic;
signal mulu_reg : std_logic_vector(63 downto 0);
signal FAsign : std_logic;
signal faktorA : std_logic_vector(31 downto 0);
signal faktorB : std_logic_vector(31 downto 0);
signal div_reg : std_logic_vector(63 downto 0);
signal div_quot : std_logic_vector(63 downto 0);
signal div_ovl : std_logic;
signal div_neg : std_logic;
signal div_bit : std_logic;
signal div_sub : std_logic_vector(32 downto 0);
signal div_over : std_logic_vector(32 downto 0);
signal nozero : std_logic;
signal div_qsign : std_logic;
signal divisor : std_logic_vector(63 downto 0);
signal divs : std_logic;
signal signedOP : std_logic;
signal OP1_sign : std_logic;
signal OP2_sign : std_logic;
signal OP2outext : std_logic_vector(15 downto 0);
signal in_offset : std_logic_vector(5 downto 0);
signal datareg : std_logic_vector(31 downto 0);
signal insert : std_logic_vector(31 downto 0);
signal bf_datareg : std_logic_vector(31 downto 0);
signal result : std_logic_vector(39 downto 0);
signal result_tmp : std_logic_vector(39 downto 0);
signal unshifted_bitmask : std_logic_vector(31 downto 0);
signal bf_set1 : std_logic_vector(39 downto 0);
signal inmux0 : std_logic_vector(39 downto 0);
signal inmux1 : std_logic_vector(39 downto 0);
signal inmux2 : std_logic_vector(39 downto 0);
signal inmux3 : std_logic_vector(31 downto 0);
signal shifted_bitmask : std_logic_vector(39 downto 0);
signal bitmaskmux0 : std_logic_vector(37 downto 0);
signal bitmaskmux1 : std_logic_vector(35 downto 0);
signal bitmaskmux2 : std_logic_vector(31 downto 0);
signal bitmaskmux3 : std_logic_vector(31 downto 0);
signal bf_set2 : std_logic_vector(31 downto 0);
signal shift : std_logic_vector(39 downto 0);
signal bf_firstbit : std_logic_vector(5 downto 0);
signal mux : std_logic_vector(3 downto 0);
signal bitnr : std_logic_vector(4 downto 0);
signal mask : std_logic_vector(31 downto 0);
signal mask_not_zero : std_logic;
signal bf_bset : std_logic;
signal bf_NFlag : std_logic;
signal bf_bchg : std_logic;
signal bf_ins : std_logic;
signal bf_exts : std_logic;
signal bf_fffo : std_logic;
signal bf_d32 : std_logic;
signal bf_s32 : std_logic;
signal index : std_logic_vector(4 downto 0);
-- signal i : integer range 0 to 31;
-- signal i : integer range 0 to 31;
-- signal i : std_logic_vector(5 downto 0);
signal bcd_pur : std_logic_vector(9 downto 0);
signal bcd_kor : std_logic_vector(8 downto 0);
signal halve_carry : std_logic;
signal Vflag_a : std_logic;
signal bcd_a_carry : std_logic;
signal bcd_a : std_logic_vector(8 downto 0);
signal result_mulu : std_logic_vector(127 downto 0);
signal result_div : std_logic_vector(63 downto 0);
signal set_mV_Flag : std_logic;
signal V_Flag : bit;
signal rot_rot : std_logic;
signal rot_lsb : std_logic;
signal rot_msb : std_logic;
signal rot_X : std_logic;
signal rot_C : std_logic;
signal rot_out : std_logic_vector(31 downto 0);
signal asl_VFlag : std_logic;
signal bit_bits : std_logic_vector(1 downto 0);
signal bit_number : std_logic_vector(4 downto 0);
signal bits_out : std_logic_vector(31 downto 0);
signal one_bit_in : std_logic;
signal bchg : std_logic;
signal bset : std_logic;
signal mulu_sign : std_logic;
signal mulu_signext : std_logic_vector(16 downto 0);
signal muls_msb : std_logic;
signal mulu_reg : std_logic_vector(63 downto 0);
signal FAsign : std_logic;
signal faktorA : std_logic_vector(31 downto 0);
signal faktorB : std_logic_vector(31 downto 0);
signal div_reg : std_logic_vector(63 downto 0);
signal div_quot : std_logic_vector(63 downto 0);
signal div_ovl : std_logic;
signal div_neg : std_logic;
signal div_bit : std_logic;
signal div_sub : std_logic_vector(32 downto 0);
signal div_over : std_logic_vector(32 downto 0);
signal nozero : std_logic;
signal div_qsign : std_logic;
signal divisor : std_logic_vector(63 downto 0);
signal divs : std_logic;
signal signedOP : std_logic;
signal OP1_sign : std_logic;
signal OP2_sign : std_logic;
signal OP2outext : std_logic_vector(15 downto 0);
 
-- signal hot_bit : std_logic_vector(33 downto 0); simulation error =>
signal hot_bit : std_logic_vector(63 downto 0);
signal hot_msb : std_logic_vector(32 downto 0);
signal vector : std_logic_vector(32 downto 0);
signal result_bs : std_logic_vector(65 downto 0);
signal bit_nr : std_logic_vector(5 downto 0);
signal bit_nr7 : std_logic_vector(6 downto 0);
signal bit_msb : std_logic_vector(5 downto 0);
signal bs_shift : std_logic_vector(5 downto 0);
signal bs_shift_mod : std_logic_vector(5 downto 0);
signal asl_over : std_logic_vector(32 downto 0);
signal asr_sign : std_logic_vector(32 downto 0);
signal msb : std_logic;
signal ring : std_logic_vector(5 downto 0);
signal ALU : std_logic_vector(31 downto 0);
signal BSout : std_logic_vector(31 downto 0);
signal bs_V : std_logic;
signal bs_C : std_logic;
signal bs_X : std_logic;
signal in_offset : std_logic_vector(5 downto 0);
signal datareg : std_logic_vector(31 downto 0);
signal insert : std_logic_vector(31 downto 0);
signal bf_datareg : std_logic_vector(31 downto 0);
signal result : std_logic_vector(39 downto 0);
signal result_tmp : std_logic_vector(39 downto 0);
signal unshifted_bitmask: std_logic_vector(31 downto 0);
signal bf_set1 : std_logic_vector(39 downto 0);
signal inmux0 : std_logic_vector(39 downto 0);
signal inmux1 : std_logic_vector(39 downto 0);
signal inmux2 : std_logic_vector(39 downto 0);
signal inmux3 : std_logic_vector(31 downto 0);
signal shifted_bitmask : std_logic_vector(39 downto 0);
signal bitmaskmux0 : std_logic_vector(37 downto 0);
signal bitmaskmux1 : std_logic_vector(35 downto 0);
signal bitmaskmux2 : std_logic_vector(31 downto 0);
signal bitmaskmux3 : std_logic_vector(31 downto 0);
signal bf_set2 : std_logic_vector(31 downto 0);
signal shift : std_logic_vector(39 downto 0);
signal bf_firstbit : std_logic_vector(5 downto 0);
signal mux : std_logic_vector(3 downto 0);
signal bitnr : std_logic_vector(4 downto 0);
signal mask : std_logic_vector(31 downto 0);
signal mask_not_zero : std_logic;
signal bf_bset : std_logic;
signal bf_NFlag : std_logic;
signal bf_bchg : std_logic;
signal bf_ins : std_logic;
signal bf_exts : std_logic;
signal bf_fffo : std_logic;
signal bf_d32 : std_logic;
signal bf_s32 : std_logic;
signal index : std_logic_vector(4 downto 0);
-- signal i : integer range 0 to 31;
-- signal i : integer range 0 to 31;
-- signal i : std_logic_vector(5 downto 0);
 
-- signal hot_bit : std_logic_vector(33 downto 0); simulation error =>
signal hot_bit : std_logic_vector(63 downto 0);
signal hot_msb : std_logic_vector(32 downto 0);
signal vector : std_logic_vector(32 downto 0);
signal result_bs : std_logic_vector(65 downto 0);
signal bit_nr : std_logic_vector(5 downto 0);
signal bit_nr7 : std_logic_vector(6 downto 0);
signal bit_msb : std_logic_vector(5 downto 0);
signal bs_shift : std_logic_vector(5 downto 0);
signal bs_shift_mod : std_logic_vector(5 downto 0);
signal asl_over : std_logic_vector(32 downto 0);
signal asl_over_xor : std_logic_vector(32 downto 0);
signal asr_sign : std_logic_vector(32 downto 0);
signal msb : std_logic;
signal ring : std_logic_vector(5 downto 0);
signal ALU : std_logic_vector(31 downto 0);
signal BSout : std_logic_vector(31 downto 0);
signal bs_V : std_logic;
signal bs_C : std_logic;
signal bs_X : std_logic;
 
 
BEGIN
-----------------------------------------------------------------------------
-- set OP1in
-----------------------------------------------------------------------------
PROCESS (OP2out, reg_QB, opcode, OP1out, OP1in, exe_datatype, addsub_q, execOPC, exec,
bcd_a, result_mulu, result_div, exe_condition, bf_shift, bf_ffo_offset, mulu_reg, BSout,
Flags, FlagsSR, bits_out, exec_tas, rot_out, exe_opcode, result, bf_fffo, bf_firstbit, bf_datareg)
bcd_a, result_mulu, result_div, exe_condition, bf_shift, bf_ffo_offset, mulu_reg, BSout,
Flags, FlagsSR, bits_out, exec_tas, rot_out, exe_opcode, result, bf_fffo, bf_firstbit, bf_datareg)
BEGIN
ALUout <= OP1in;
ALUout(7) <= OP1in(7) OR exec_tas;
IF exec(opcBFwb)='1' THEN
ALUout <= result(31 downto 0);
-- ALUout <= bf_datareg(31 downto 0);
IF bf_fffo='1' THEN
-- ALUout <= (OTHERS =>'0');
-- ALUout(5 downto 0) <= bf_firstbit + bf_shift;
-- ALUout(5 downto 0) <= bf_firstbit;
ALUout <= bf_ffo_offset - bf_firstbit;
END IF;
END IF;
393,6 → 390,7
-- bcd_pur <= ('0'&OP1out(7 downto 0)&'0') - ('0'&OP2out(7 downto 0)&Flags(4));
bcd_a <= bcd_pur(9 downto 1) - bcd_kor;
END IF;
Vflag_a <= '0'; --nur zum testen
bcd_a_carry <= bcd_pur(9) OR bcd_a(8);
END PROCESS;
718,7 → 716,7
-- Barrel Shifter
-----------------------------------------------------------------------------
process (OP1out, OP2out, opcode, bit_nr, bit_nr7, bit_msb, hot_bit, bs_shift, bs_shift_mod, ring, result_bs, exe_opcode, vector,
rot_bits, Flags, msb, hot_msb, asl_over, ALU, asr_sign, exec)
rot_bits, Flags, msb, hot_msb, asl_over, asl_over_xor, ALU, asr_sign, exec)
begin
ring <= "100000";
IF rot_bits="10" THEN --ROX L/R
780,12 → 778,20
-- calc V-Flag by ASL
hot_msb <= (OTHERS =>'0');
hot_msb(conv_integer(bit_msb)) <= '1';
if bs_shift > ring then
IF bs_shift > ring THEN
bit_msb <= "000000";
else
ELSE
bit_msb <= ring-bs_shift;
end if;
asl_over <= ((('0'&vector(30 downto 0)) XOR ('0'&vector(31 downto 1)))&'0') - ('0'&hot_msb(31 downto 0));
END IF;
asl_over_xor <= (('0'&vector(30 downto 0)) XOR ('0'&vector(31 downto 1)))&msb;
CASE exe_opcode(7 downto 6) IS
WHEN "00" => --Byte
asl_over_xor(8) <= '0';
WHEN "01"|"11" => --Word
asl_over_xor(16) <= '0';
WHEN OTHERS => NULL;
END CASE;
asl_over <= asl_over_xor - ('0'&hot_msb(31 downto 0));
bs_V <= '0';
IF rot_bits="00" AND exe_opcode(8)='1' THEN --ASL
bs_V <= not asl_over(32);
815,16 → 821,16
CASE exe_opcode(7 downto 6) IS
WHEN "00" => --Byte
ALU(7 downto 0) <= result_bs(7 downto 0) OR result_bs(15 downto 8);
bs_C <= ALU(7);
bs_C <= ALU(7);
WHEN "01"|"11" => --Word
ALU(15 downto 0) <= result_bs(15 downto 0) OR result_bs(31 downto 16);
bs_C <= ALU(15);
bs_C <= ALU(15);
WHEN "10" => --Long
ALU <= result_bs(31 downto 0) OR result_bs(63 downto 32);
bs_C <= ALU(31);
bs_C <= ALU(31);
WHEN OTHERS => NULL;
END CASE;
IF exe_opcode(0)='1' THEN --left shift
IF exe_opcode(8)='1' THEN --left shift
bs_C <= ALU(0);
END IF;
ELSIF rot_bits="10" THEN --ROX L/R
853,9 → 859,9
IF(bs_shift = "000000") THEN
IF rot_bits="10" THEN --ROX L/R
bs_C <= Flags(4);
bs_C <= Flags(4);
ELSE
bs_C <= '0';
bs_C <= '0';
END IF;
bs_X <= Flags(4);
bs_V <= '0';
865,7 → 871,6
BSout <= ALU;
asr_sign <= (OTHERS =>'0');
asr_sign(32 downto 1) <= asr_sign(31 downto 0) OR hot_msb(31 downto 0);
-- IF opcode(2 downto 0)="000" AND msb='1' THEN --ASR
IF rot_bits="00" AND exe_opcode(8)='0' AND msb='1' THEN --ASR
BSout <= ALU or asr_sign(32 downto 1);
IF bs_shift > ring THEN
953,9 → 958,9
END IF;
IF rising_edge(clk) THEN
IF Reset='1' THEN
IF Reset='1' THEN
Flags(7 downto 0) <= "00000000";
ELSIF clkena_lw = '1' THEN
ELSIF clkena_lw = '1' THEN
IF exec(directSR)='1' OR set_stop='1' THEN
Flags(7 downto 0) <= data_read(7 downto 0);
END IF;
/tg68kc/trunk/TG68KdotC_Kernel.vhd
1057,29 → 1057,7
alu_bf_shift <= bf_shift;
alu_bf_loffset <= bf_loffset;
alu_bf_ffo_offset <= bf_full_offset+bf_width+1;
-- ELSIF set_exec(exec_BS)='1' THEN
--
---- IF set_exec(exec_BS)='1' THEN
---- alu_width<="001111";
---- alu_bf_loffset <= "000000";
---- END IF;
--
---- alu_bf_shift <= set_rot_cnt;
-- IF opcode(5)='1' THEN
---- next_micro_state <= rota1;
---- set(ld_rot_cnt) <= '1';
---- setstate <= "01";
-- alu_bf_shift <= OP2out(5 downto 0);
-- ELSE
-- alu_bf_shift(2 downto 0) <= opcode(11 downto 9);
-- IF opcode(11 downto 9)="000" THEN
-- alu_bf_shift(5 downto 3) <="001";
-- ELSE
-- alu_bf_shift(5 downto 3) <="000";
-- END IF;
-- END IF;
END IF;
-- byte <= '0';
memread <= "1111";
FC(1) <= NOT setstate(1) OR (PCbase AND NOT setstate(0));
FC(0) <= setstate(1) AND (NOT PCbase OR setstate(0));
1093,9 → 1071,6
state <= "11";
FC(1 downto 0) <= "01";
memmask <= wbmemmask;
-- IF datatype="00" THEN
-- byte <= '1';
-- END IF;
ELSE
state <= setstate;
IF setstate="01" THEN
3016,6 → 2991,9
END IF;
 
WHEN pack1 => -- pack -(Ax),-(Ay)
IF opcode(2 downto 0)="111" THEN
set(use_SP) <= '1';
END IF;
set(hold_ea_data) <= '1';
set(update_ld) <= '1';
setstate <= "10";
3023,6 → 3001,9
next_micro_state <= pack2;
dest_areg <= '1';
WHEN pack2 =>
IF opcode(11 downto 9)="111" THEN
set(use_SP) <= '1';
END IF;
set(hold_ea_data) <= '1';
set_direct_data <= '1';
IF opcode(7 downto 6) = "01" THEN --pack

powered by: WebSVN 2.1.0

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