MIPS32 - in VHDL

Ich hab jetzt genau zwei Projekte, genau zwei Projekte, aber die sind mittelfristig. Ich mach den mips32 einfachste Natur, ergänzt um einen Ausgang Port ohne Pipeline, in vhdl und zweitens, wenn ich den stm32 habe, dann ein Portier ich minix zu diesem Computer und der Witz. Bei der Geschichte ist, dass ich für den C Code einen anderen Compiler brauche einen anderes Ziel Format Es sind da allerdings. Assembler Codes enthalten und das zweite ist, dass die Hardware ja teilweise anders ist dass sie zum Beispiel LCD haben, was sogar Farben wiedergibt also Pixel also grafisch und dazu muss man natürlich die entsprechenden Teile im Kernel Schreiben und wenn sie auf dem Stand sind wie ich, dann wissen Sie ja, wo die dann hingehören da wo normalerweise Floppy und so weiter ist, da gehören die dann hin

ich mache jetzt eine neue VHDL Übung, die werde ich für den MIPS32 noch brauchen, ich schreibe jeden Tag ein RS-Latch. Problem, wie ein RS-Latch, funktioniert weiss ich - aber man muss es in VHDL realisieren können. dazu muss es von alleine gehen. Damit fange ich jetzt an, ich habe es ein paar Mal getan.

Es gibt dabei ein paar Dinge, die immer klar sind und ein paar Dinge, die immer unklar sind - zunächst, wenn ich in VHDL Code schreibe, es gibt genau zwei Möglichkeiten

Und ich sage gleich, wenn ich den MIPS32 später mache, dann werde ich beide anwenden. Ich werde zwei verschiedene Formen von Codes schreiben

1.) Die eine ist eine fast reine Schaltungsbeschreibung - sie setzt die Gatter so zusammen, wie man es in der Realität tun würde 2.) die andere ist eine, die alle Vorzüge von VHDL verwendet

Nichts desto trotz, ich finde erstere gut. Einen MIPS32 realisieren ist realativ einfach

Ein RS-Latch auch. Allerdings hakt es hier in VHDL - man weiss ja ein RS-Latch kann zustände annehmen, die es nicht annehmen darf. Das verbietet VHDL

Ich denke ein einfacher MIPS32, lässt sich sehr schnell zusammensetzen, wenn die Komponenten da sind

Mein Ziel ist es nicht nur einen MIPS32, zu realisieren, um zu frieden zu sein, ich habe es geschafft. Genau wie ich bei TTL Gattern Übungen mache, damit es tut und ich nicht irgendein gigantisches Endprodukt habe, was ich letzten Endes selber nicht mehr verstehe, will ich nebenbei VHDL lernen

Das heisst, es geht darum zu lernen, ein RS-Latch jeder Zeit schreiben zu können

Wie immer schreibe ich jetzt zunächst den Code, den ich ëinfach soßchreiben kann, ich ergänze ihn dann.

-- wuerde es funktionieren, w"urde es vereinfacht so aussehen

library ieee;
use ieee.std_logic_1164.all;

entity rs_latch_20241104 is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    qs: inout std_logic
);
end;

architecture behaviour of rs_latch_20241104 is
begin
    q <= (r nor qs);
    qs <= (s nor q);
end;
Weiter:
library ieee;
use ieee.std_logic_1164.all;

entity rs_latch_20241104 is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    qs: inout std_logic
);
end;

architecture behaviour of rs_latch_20241104 is
begin
    q <= (r nor qs);
    qs <= (s nor q);
end;

library ieee;
use ieee.std_logic_1164.all;

entity rs_latch_20241104_testbench is
port (
    q: inout std_logic
);
end;

architecture behaviour of rs_latch_20241104_testbench is
    component rs_latch_20241104
    port (
        r: in std_logic;
        s: in std_logic;
        q: inout std_logic;
        qs: inout std_logic
    );
    end component;
    signal r, s:  std_logic;
begin
    rs: rs_latch_20241104 PORT MAP (r=>r, s=>s, q=>q);
end;
Und noch weiter:
library ieee;
use ieee.std_logic_1164.all;

entity rs_latch_20241104 is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    qs: inout std_logic
);
end;

architecture behaviour of rs_latch_20241104 is
begin
    q <= (r nor qs);
    qs <= (s nor q);
end;

library ieee;
use ieee.std_logic_1164.all;

entity rs_latch_20241104_testbench is
port (
    q: inout std_logic
);
end;

architecture behaviour of rs_latch_20241104_testbench is
    component rs_latch_20241104
    port (
        r: in std_logic;
        s: in std_logic;
        q: inout std_logic;
        qs: inout std_logic
    );
    end component;
    signal r, s: std_logic;
begin
    rs: rs_latch_20241104 PORT MAP (r=>r, s=>s, q=>q);
    r <= '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;
    s <= '0' after 0 ns, '0' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' after 40 ns, '1' after 50 ns, '0' after 60 ns;
end;

Es ist etwas seltsames passiert, seltsamer weise, ich weiss nicht, woher die angeblichen Fehler stammen, die dann entstehen, wahrscheinlich sind sie eine Erfindung durch einen selber, die bei ihrer ersten Erfindung gegen sich selbst, immer mehr fehler erzeugen, so, dass das Problem am Ende wird, wie es nicht ist, denn

david@work:~$ ghdl -a rslatch20241104_002.vhdl
david@work:~$ ghdl -r rs_latch_20241104_testbench --wave=wave.ghw
david@work:~$ gtkwave wave.ghw
Das Programm liess sich problemlos übersetzen. Frage: Lässt sich das Programm auch darstellen, mit gtkwave?

Antwort: Ja

ich bin aber noch vorsichtig, ob es seinen Zustand wirklich behält und wir haben noch ein Problem

Das Latch ist am Anfang in einem undefinierbaren Zustand. Es lässt sich zwar so übersetzen - aber: wenn wir das zu Registern nachher zusammenbauen, gibt es später fehler und der Prozessor tut erst mal gar nicht. Weil er in diesem Zustand ist

Wir müssten, wenn wir nicht die Prozesse mit conditions usw. von VHDL nutzen wollen, wenigstens ein Bit in alle Latches schlussendlich einsetzen,mit der alle geresettet werden

Image Screenshot_20241104_092139

Image Screenshot_20241104_092647

Image Screenshot_20241104_100135

library ieee;
use ieee.std_logic_1164.all;

entity rs_latch_20241104 is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    qs: inout std_logic
);
end;

architecture behaviour of rs_latch_20241104 is
begin
    q <= (r nor qs);
    qs <= (s nor q);
end;

library ieee;
use ieee.std_logic_1164.all;

entity rs_latch_20241104_testbench is
port (
    q: inout std_logic
);
end;

architecture behaviour of rs_latch_20241104_testbench is
    component rs_latch_20241104
    port (
        r: in std_logic;
        s: in std_logic;
        q: inout std_logic;
        qs: inout std_logic
    );
    end component;
    signal r, s: std_logic;
begin
    rs: rs_latch_20241104 PORT MAP (r=>r, s=>s, q=>q);
    r <= '0' after 0 ns, '0' after 10 ns, '1' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '0' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns;
    s <= '0' after 0 ns, '0' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' after 40 ns, '1' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns;
end;

Das Latch hat seinen Zustand behalten und funktioniert perfekt. Ich werde es zu den täglichen Übungen tun. Und ich werde nicht auf den MIPS32, hin arbeiten Wenn die übung oft genug geschehen ist, werde ich sie ergänzen, dieselbe Übung, aber daraus wird ein Taktgesteuertes RS-Latch, daraus ein D-Latch. Das findet unabhängig vom MIPS32, statt Der Fehler in der Zukunft wird jetzt noch vernachlässigt.