Achtung!! Das sind meine eigenen Lösungen, diese müssen nicht korrekt sein.
Aufgabe 1)
gegeben sind 4 * 18x18 signed Multiplizierer die auch noch vorzeichenbehaftet sein sollen.
Aufspliten in:
a0,a1,b0,b1 = 17Bit
sa,sb = 1Bit (Vorzeichenbit)
Kann man das einfach so voneinander trennen?
Die beiden Vorzeichenbits könnte man mit einem XOR verknüpfen und sobald das XOR 1 ergibt muss das Endergebnis Invertiert werden.
Weiter komme ich bei dieser Aufgabe leider nicht, sollte aber Ähnlickeit mit der Übungsaufgabe 2 haben.
Aufgabe 2)
a) x = a AND b
Code: Alles auswählen
SET X /setzt X = 1
A: TST a
JPC B //jump wenn a = 1
RST x //x = 0 wenn a != 1
B: TST b
JPC END //jump wenn b = 1
RST x //x = 0 wenn b != 1
END:
Code: Alles auswählen
SET x //setzt x = 1
A: TST a
JPC END //jump zum ende sobald a = 1
B: TST b
JPC END //jump zum ende sobald b = 1
NOT: RST x
END:
Code: Alles auswählen
SET x //setzt x = 1
A: TST a
JPC B //jump zu B falls a = 1
RST x //setzt x = 0 wenn a = 0
B: TST b
JPC T //jump zu T wenn b = 1
TST x
JPC END //jump zum ende wenn x = 1 => a = 1 und b = 0
R: SET a //Zustand wird nur erreicht wenn a,b = 0,
TST a
JPC END //bedingungsunabhäniger Sprung
T: TST x
JPC NOT //wenn x = 1 => a,b = 1
SET x //Zustand wird nur erreicht wenn: a = 0, b = 1. Setzt x =1
TST x
JPC END //Überspringt NOT
NOT: RST X //Setzt x = 0
END:
//edit
Aufgabe 2)
b)
Code: Alles auswählen
begin
signal flag: std_logic = 0;
signal code_counter : std_logic_vector (15 downto 0);
process(clk, reset)
begin
if reset = '1' then
AI <X> '0');
RnW <= 1;
elseif clk'event and clk = '1' then
if I(17 downto 15) = '00' then
AD <= I(15 downto 0);
Dout <= '0';
RnW <= '0';
AI <= code_counter;
end if;
if I(17 downto 15) = '01' then
AD <= I(15 downto 0);
Dout <= '1';
RnW <= '0';
AI <= code_counter;
end if;
if I(17 downto 15) = '10' then
AD <= I(15 downto 0);
RnW <= '1';
flag <= Din;
AI <= code_counter;
end if;
if I(17 downto 15) = '11' then
if flag = '1' then
AI <= I(15 downto 0);
else
AI <= code_counter;
end if;
code_counter += 1;
end if;
end process;
end behaviour
a)
Ro = 1024 (Konstante)
R2 = 1 (Konstante)
R3 = Index Zahl (i)
R5 = x
R6 = a
R7 = b
Code: Alles auswählen
scalar: R0 = 1024
R2 = 1
R3 = 1024
WHILE: R6 = R3
R7 = R0 + R3
R6 = mem(R6)
R7 = mem(R7)
F6 = F6 * F7
R5 = R5 + R6
R3 = R3 - R2
jmp NZ, END
nop
jmp WHILE
nop
END:
c) Wird noch überarbeitet