Re: MIPS auf Xilinx FPGA

library ieee;
use ieee.std_logic_1164.all;

entity mycounter is
port
(
    q0, q1, q2, q3: inout bit;
    clk: inout bit
);
end;

entity FA is
port
(
    a, b: in bit;
    c: out bit;
    uin: in bit;
    uout: out bit
);
end;

entity ripple_carry_adder is
port
(
    a0, a1, a2, a3: in bit;
    b0, b1, b2, b3: in bit;
    c0, c1, c2, c3: out bit;
    uin: in bit;  -- carry in
    uout: out bit  -- carry out
);
end;

entity my_rs_latch is
port
(
    r, s: in bit;
    q1, q2: inout bit
);
end;

entity clock_state_controlled_rs_latch is
port (
    s, r: in bit;
    c: inout bit;
    q1, q2: inout bit
);
end;

entity clock_state_controlled_d_latch is
port (
    d: in bit;
    c: inout bit;
    q1, q2: inout bit
);
end;

entity ms_d_flip_flop is
port (
    d: in bit;
    q: inout bit;
    c: inout bit
);
end;

entity reg is
port
(
    d0, d1, d2, d3: in bit;
    q0, q1, q2, q3: inout bit;
    c: inout bit
);
end;

architecture Behavioral of my_rs_latch is
begin
    q1 <= (not r) nor q2;
    q2 <= (not s) nor q1;
end Behavioral;

architecture Behavioral of clock_state_controlled_rs_latch is
    component my_rs_latch
    port
    (
        r, s: in bit;
        q1, q2: inout bit
    );
    end component;
    signal s1, r1: bit;
begin
    r1 <= r and c;
    s1 <= s and c;
    rs: my_rs_latch port map (r=>r1, s=>s1, q1=>q1, q2=>q2);
end Behavioral;

architecture Behavioral of clock_state_controlled_d_latch is
    component clock_state_controlled_rs_latch
    port
    (
        r: in bit;
        s: in bit;
        q1, q2: inout bit;
        c: inout bit
    );
    end component;
    signal notd: bit;
begin
    notd <= d;
    rs: clock_state_controlled_rs_latch port map (r=>d, s=>notd, q1=>q1, q2=>q2, c=>c);
end Behavioral;

architecture Behavioral of ms_d_flip_flop is
    component clock_state_controlled_d_latch
    port
    (
        d: in bit;
        q1, q2: inout bit;
        c: inout bit
    );
    end component;
    signal notc, d1: bit;
begin
    dlatch1: clock_state_controlled_d_latch port map (d=>d, q1=>d1, c=>c);
    notc <= not c;
    dlatch2: clock_state_controlled_d_latch port map (d=>d1, q1=>q, c=>c);
end Behavioral;

architecture Behavioral of reg is
    component ms_d_flip_flop is
    port
    (
        d: in bit;
        q: inout bit;
        c: inout bit
    );
    end component;
begin
    bit1: ms_d_flip_flop port map (d=>d0, q=>q0, c=>c);
    bit2: ms_d_flip_flop port map (d=>d1, q=>q1, c=>c);
    bit3: ms_d_flip_flop port map (d=>d2, q=>q2, c=>c);
    bit4: ms_d_flip_flop port map (d=>d3, q=>q3, c=>c);
end;

architecture Behavioral of FA is
begin
    c <= a xor b xor uin;
    uout <= (a and b) or ((a or b) and uin);
end;

architecture Behavioral of ripple_carry_adder is
    component FA
    port
    (
        a, b: in bit;
        c: out bit;
        uin: in bit;
        uout: out bit
    );
    end component;
    signal  u0, u1, u2: bit;
begin
    fa1: FA port map (a => a0, b => b0, c => c0, uin => uin, uout => u0);
    fa2: FA port map (a => a1, b => b1, c => c1, uin => u0, uout => u1);
    fa3: FA port map (a => a2, b => b2, c => c2, uin => u1, uout => u2);
    fa4: FA port map (a => a3, b => b3, c => c3, uin => u2, uout => uout);
end;

architecture Behavioral of mycounter is
    component ripple_carry_adder
    port
    (
        a0, a1, a2, a3: in bit;
        b0, b1, b2, b3: in bit;
        c0, c1, c2, c3: out bit;
        uin: in bit;  -- carry in
        uout: out bit  -- carry out
    );
    end component;
    component reg
    port
    (
        d0, d1, d2, d3: in bit;
        q0, q1, q2, q3: inout bit;
        c: inout bit
    );
    end component;
    signal a0, a1, a2, a3 : bit; -- addierer Eingang1
    signal b0, b1, b2, b3 : bit; -- addierer Eingang2
    signal c0, c1, c2, c3 : bit; -- addierer Ausgang
    signal uin, uout: bit;
begin
        a0 <= '1';
        a1 <= '0';
        a2 <= '0';
        a3 <= '0';
        uin <= '0';
        myreg : reg port map (d0 => c0, d1 => c1, d2 => c2, d3 => c3, q0 => b0, q1 => b1, q2 => b2, q3 => b3, c => clk);
        rpcadd: ripple_carry_adder port map
        (
            a0 => a0, a1 => a1, a2 => a2, a3 => a3,
            b0 => b0, b1 => b1, b2 => b2, b3 => b3,
            c0 => c0, c1 => c1, c2 => c2, c3 => c3,
            uin => uin, uout => uout
        );
        q0 <= c0;
        q1 <= c1;
        q2 <= c2;
        q3 <= c3;
end;

entity testbench is
end entity testbench;

architecture behave of testbench is
    component ripple_carry_adder
    port
    (
        a0, a1, a2, a3: in bit;
        b0, b1, b2, b3: in bit;
        c0, c1, c2, c3: out bit;
        uin: in bit;  -- carry in
        uout: out bit  -- carry out
    );
    end component;

    signal a3, a2, a1, a0 : bit;
    signal b3, b2, b1, b0 : bit;
    signal c3, c2, c1, c0 : bit;
    signal uin : bit;
    signal uout : bit;
begin
    sum: ripple_carry_adder port map (
        a3 => a3, a2 => a2, a1 => a1, a0 => a0,
        b3 => b3, b2 => b2, b1 => b1, b0 => b0,
        c3 => c3, c2 => c2, c1 => c1, c0 => c0,
        uin => uin, uout => uout
    );

    uin <= '0';
    b3 <= '0' after 0 ns;
    b2 <= '1' after 0 ns;
    b1 <= '0' after 0 ns;
    b0 <= '1' after 0 ns;

%     a0 <= '0' after 0 ns, '1' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '1' after 50 ns, '0' after 60 ns, '1' after 70 ns, '0' after 80 ns, '1' after 90 ns, '0' after 100 ns, '1' after 110 ns, '0' after 120 ns, '1' after 130 ns, '0' after 140 ns, '1' after 150 ns;

    a1 <= '0' after 0 ns, '0' after 10 ns, '1' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '1' after 70 ns, '0' after 80 ns, '0' after 90 ns, '1' after 100 ns, '1' after 110 ns, '0' after 120 ns, '0' after 130 ns, '1' after 140 ns, '1' after 150 ns;

    a2 <= '0' after 0 ns, '0' after 10 ns, '0' after 20 ns, '0' after 30 ns, '1' after 40 ns, '1' after 50 ns, '1' after 60 ns, '1' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns, '0' after 110 ns, '1' after 120 ns, '1' after 130 ns, '1' after 140 ns, '1' after 150 ns;

    a3 <= '0' after 0 ns, '0' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' after 40 ns, '0' after 50 ns, '0' after 60 ns, '0' after 70 ns, '1' after 80 ns, '1' after 90 ns, '1' after 100 ns, '1' after 110 ns, '1' after 120 ns, '1' after 130 ns, '1' after 140 ns, '1' after 150 ns;
end architecture behave;