MIPS32 in VHDL

Post Reply
User avatar
david
Site Admin
Posts: 7
Joined: Fri Sep 13, 2024 9:38 pm

MIPS32 in VHDL

Post by david »

32 Bit Ripple Carry Chain Addierer

Code: Select all

-- (C) David Vajda
-- 32 Bit Ripple Carry Chain Adder / Subtrahierer / Volladdierer
-- 2024-12-02

library ieee;
use ieee.std_logic_1164.all;

entity fulladder is
port (
    a: in std_logic;
    b: in std_logic;
    c: out std_logic;
    s: in std_logic;
    t: out std_logic
);
end;

architecture behaviour of fulladder is
begin
    c <= a xor b xor s;
    t <= (a and b) or ((a or b) and s);
end;

library ieee;
use ieee.std_logic_1164.all;

entity ripplecarrychainadder32 is
port (
    a: in std_logic_vector (31 downto 0);
    b: in std_logic_vector (31 downto 0);
    c: out std_logic_vector (31 downto 0);
    s: in std_logic;
    t: out std_logic
);
end;

architecture behaviour of ripplecarrychainadder32 is
    component fulladder
    port (
        a: in std_logic;
        b: in std_logic;
        c: out std_logic;
        s: in std_logic;
        t: out std_logic
    );
    end component;
    signal x: std_logic_vector (32 downto 0);
begin
        fa_loop: FOR i IN 31 DOWNTO 0 GENERATE
            fa: fulladder PORT MAP (a=>a(i), b=>b(i), c=>c(i), s=>x(i), t=>x(i+1));
        END GENERATE;
        t <= x (32) ;
        x (0) <= s;
    --fa3: fulladder20241128 PORT MAP (a=>a3, b=>b3, c=>c3, s=>s3, t=>t);
    --fa2: fulladder20241128 PORT MAP (a=>a2, b=>b2, c=>c2, s=>s2, t=>s3);
    --fa1: fulladder20241128 PORT MAP (a=>a1, b=>b1, c=>c1, s=>s1, t=>s2);
    --fa0: fulladder20241128 PORT MAP (a=>a0, b=>b0, c=>c0, s=>s, t=>s1);
end;

library ieee;
use ieee.std_logic_1164.all;

entity ripplecarrychainadder32testbench is
port (
    c: out std_logic_vector (31 downto 0);
    t: out std_logic
);
end;


architecture behaviour of ripplecarrychainadder32testbench is
    component ripplecarrychainadder32
    port (
        a: in std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        c: out std_logic_vector (31 downto 0);
        s: in std_logic;
        t: out std_logic
    );
    end component;
    signal a: std_logic_vector (31 downto 0);
    signal b: std_logic_vector (31 downto 0);
    signal s: std_logic;
begin
    rplcadd: ripplecarrychainadder32 PORT MAP (c=>c, b=>b, a=>a, s=>s, t=>t);
    -- 19219 + 14823 = 34042
    -- 0b100101100010011 + 0b11100111100111 = 0b1000010011111010
    a <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 0 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 20 ns;

    b <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','1','1', '1','0','0','1', '1','1','1','0', '0','1','1','1') after 0 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','1','1', '1','0','0','1', '1','1','1','0', '0','1','1','1') after 20 ns;
    s <= '0';
end;
Subtrahierer:

Code: Select all

-- (C) David Vajda
-- 32 Bit Ripple Carry Chain Adder / Subtrahierer / Volladdierer
-- 2024-12-02

library ieee;
use ieee.std_logic_1164.all;

entity fulladder is
port (
    a: in std_logic;
    b: in std_logic;
    c: out std_logic;
    s: in std_logic;
    t: out std_logic
);
end;

architecture behaviour of fulladder is
begin
    c <= a xor b xor s;
    t <= (a and b) or ((a or b) and s);
end;

library ieee;
use ieee.std_logic_1164.all;

entity ripplecarrychainadder32 is
port (
    a: in std_logic_vector (31 downto 0);
    b: in std_logic_vector (31 downto 0);
    c: out std_logic_vector (31 downto 0);
    s: in std_logic;
    t: out std_logic
);
end;

architecture behaviour of ripplecarrychainadder32 is
    component fulladder
    port (
        a: in std_logic;
        b: in std_logic;
        c: out std_logic;
        s: in std_logic;
        t: out std_logic
    );
    end component;
    signal x: std_logic_vector (32 downto 0);
begin
        fa_loop: FOR i IN 31 DOWNTO 0 GENERATE
            fa: fulladder PORT MAP (a=>a(i), b=>b(i), c=>c(i), s=>x(i), t=>x(i+1));
        END GENERATE;
        t <= x (32) ;
        x (0) <= s;
    --fa3: fulladder20241128 PORT MAP (a=>a3, b=>b3, c=>c3, s=>s3, t=>t);
    --fa2: fulladder20241128 PORT MAP (a=>a2, b=>b2, c=>c2, s=>s2, t=>s3);
    --fa1: fulladder20241128 PORT MAP (a=>a1, b=>b1, c=>c1, s=>s1, t=>s2);
    --fa0: fulladder20241128 PORT MAP (a=>a0, b=>b0, c=>c0, s=>s, t=>s1);
end;

library ieee;
use ieee.std_logic_1164.all;

entity ripplecarrychainadder32testbench is
port (
    c: out std_logic_vector (31 downto 0);
    t: out std_logic
);
end;


architecture behaviour of ripplecarrychainadder32testbench is
    component ripplecarrychainadder32
    port (
        a: in std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        c: out std_logic_vector (31 downto 0);
        s: in std_logic;
        t: out std_logic
    );
    end component;
    signal a: std_logic_vector (31 downto 0);
    signal b: std_logic_vector (31 downto 0);
    signal s: std_logic;
begin
    rplcadd: ripplecarrychainadder32 PORT MAP (c=>c, b=>b, a=>a, s=>s, t=>t);
    -- 19219 + 14823 = 34042
    -- 0b100101100010011 + 0b11100111100111 = 0b1000010011111010
    a <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 0 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 20 ns;

    b <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','1','1', '1','0','0','1', '1','1','1','0', '0','1','1','1') after 0 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','1','1', '1','0','0','1', '1','1','1','0', '0','1','1','1') after 20 ns;
    s <= '0';
end;

library ieee;
use ieee.std_logic_1164.all;

entity com32 is
port (
    x: in std_logic_vector (31 downto 0);
    y: out std_logic_vector (31 downto 0)
);
end;

architecture behaviour of com32 is
begin
        com_connect: FOR i IN 31 DOWNTO 0 GENERATE
                y (i) <= not x (i);
        END GENERATE;
end;

library ieee;
use ieee.std_logic_1164.all;

entity neg32 is
port (
    b: out std_logic_vector (31 downto 0);
    a: in std_logic_vector (31 downto 0);
    t: out std_logic
);
end;

architecture behaviour of neg32 is
    component com32
    port (
        x: in std_logic_vector (31 downto 0);
        y: out std_logic_vector (31 downto 0)
    );
    end component;

    component ripplecarrychainadder32
    port (
        a: in std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        c: out std_logic_vector (31 downto 0);
        s: in std_logic;
        t: out std_logic
    );
    end component;
    signal c: std_logic_vector (31 downto 0);
    signal d: std_logic_vector (31 downto 0);
    signal s: std_logic;
begin
    neg32_generate_1: FOR i IN 31 DOWNTO 0 GENERATE
        d (i) <= '0';
    END GENERATE;
    s <= '1';
    com: com32 PORT MAP (x=>a, y=>c);
    add: ripplecarrychainadder32 PORT MAP (b=>d, a=>c, s=>s, t=>t, c=>b);
end;

library ieee;
use ieee.std_logic_1164.all;

entity sub32 is
port (
    a: in std_logic_vector (31 downto 0);
    b: in std_logic_vector (31 downto 0);
    c: out std_logic_vector (31 downto 0);
    t: out std_logic
);
end;

architecture behaviour of sub32 is
    component ripplecarrychainadder32
    port (
        a: in std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        c: out std_logic_vector (31 downto 0);
        s: in std_logic;
        t: out std_logic
    );
    end component;
    component neg32
    port (
        b: out std_logic_vector (31 downto 0);
        a: in std_logic_vector (31 downto 0);
        t: out std_logic
    );
    end component;
    signal x: std_logic_vector (31 downto 0);
    signal s: std_logic;
begin
    neg: neg32 PORT MAP (a=>a, b=>x);
    add: ripplecarrychainadder32 PORT MAP (b=>b, a=>x, c=>c, s=>s, t=>t);
    s <= '0';
end;

library ieee;
use ieee.std_logic_1164.all;

entity sub32testbench is
port (
    c: out std_logic_vector (31 downto 0);
    t: out std_logic
);
end;


architecture behaviour of sub32testbench is
    component sub32
    port (
        a: in std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        c: out std_logic_vector (31 downto 0);
        t: out std_logic
    );
    end component;
    signal a: std_logic_vector (31 downto 0);
    signal b: std_logic_vector (31 downto 0);
    signal s: std_logic;
begin
    sub: sub32 PORT MAP (a=>a, b=>b, c=>c, t=>t);

    a <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 0 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','1','1', '1','0','0','1', '1','1','1','0', '0','1','1','1') after 10 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','1','1', '1','0','0','1', '1','1','1','0', '0','1','1','1') after 20 ns;
    b <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','1','1', '1','0','0','1', '1','1','1','0', '0','1','1','1') after 0 ns,  ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 10 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 20 ns;
    s <= '0' after 0 ns, '1' after 10 ns;
    -- 19219 - 14823 =
end;

19219 - 14823 = 4396 ^= 0x112C
14823 - 19219 = -4396 ^= 0xFFFFFFFFFFFFEED4
Attachments
Screenshot_20241202_090602.png
Screenshot_20241202_090602.png (43.55 KiB) Viewed 72 times
Screenshot_20241202_090658.png
Screenshot_20241202_090658.png (41.92 KiB) Viewed 72 times
Screenshot_20241202_053536.png
Screenshot_20241202_053536.png (44.21 KiB) Viewed 73 times
Screenshot_20241202_053459.png
Screenshot_20241202_053459.png (42.51 KiB) Viewed 73 times
User avatar
david
Site Admin
Posts: 7
Joined: Fri Sep 13, 2024 9:38 pm

Re: MIPS32 in VHDL

Post by david »

als, naechstes brauche ich einen 32x2:1 MUX, kein Problem. Beim Registersatz kaskadiere ich Einen Registersatz mit 2 zu 4. Zu 8...

man braucht keinen komperator - weil vergleiche gibt es nur bei verzweigungsbefehlen sonst machen sie keinen sinn - im gegensatz zu intels - cmp und dann bedingter verzweigung je, jne, jg, jng, ... gibt es bei mips32 breq, brne, brgt, brge .. >, <, =, ... das alles geht mit Subtraktion. Selbst cmp koennte so gemacht werden. Wichtig ist, ob das Ergebnis 0 ist. Dann sind beide operanden gleich, das kann man mit einfachen NOR testen. Bei negativen Ergebnissen werden entsprechend Carry flag und so weiter gesetzt sein. So erreichen wir vergleiche, <, ... durch Subtraktion

Entschuldigung NAND war natuerlich Unsinn, NOR

Code: Select all

OR 
0, 0, 0
0, 1, 1
1, 0, 1
1, 1, 1

Code: Select all

NOR
0, 0, 1
1, 0, 0
0, 1, 0
1, 1, 0
man braucht keinen komperator - weil vergleiche gibt es nur bei verzweigungsbefehlen sonst machen sie keinen sinn - im gegensatz zu intels - cmp und dann bedingter verzweigung je, jne, jg, jng, ... gibt es bei mips32 breq, brne, brgt, brge .. >, <, =, ... das alles geht mit Subtraktion. Selbst cmp koennte so gemacht werden. Wichtig ist, ob das Ergebnis 0 ist. Dann sind beide operanden gleich, das kann man mit einfachen NOR testen. Bei negativen Ergebnissen werden entsprechend Carry flag und so weiter gesetzt sein. So erreichen wir vergleiche, <, ... durch Subtraktion
man braucht NAND eher selten. Man braucht XOR und NOR - NOR um zu gucken, sind alle Null, XOR fuer Paritaet. ist die Paritaet ungerade, dann liefert 0, 0 => 0, und 1, 1 => 0, sonst 1, bei der gerade Paritaet brauchen wir ein invertiertes NOR? Nein, natuerlich nicht. Bei der Ungaraden haengen wir ein weiteres, bit an, ebenso bei der geraden. ein Mal aber gesetzt ein mal nicht

jetzt der MUX auch nicht schwer

32 Bit x 2:1 MUX
heisst es richtig.

viel mehr ausser dem MUX, wir brauchen 4 MUX ausserhalb der ALU und dem Registersatz und diesen ist nicht zu tun. Fuer unseren MIPS32, der Befehlsdekodierer und Funktionsdekodierer, sind lediglich ein Kodierer, der die entsprechenden Steuerbit setzt zum Beispiel fuer die 4 MUX und die ALU und Registersatz, natuerlich brauchen wir Speicher und Programmspeicher, aber das laesst sich mit registern und VHDL Generate und FOR sofort machen. Nicht im Blockschaltbild ist ein E/A Port

es ist ganz einfach von der seriellen Schnittstelle zu TCP/IP zukommen. Damit meine ich kein wenig die Anwendung Schicht aber die zwei unteren Schichten TCP/IP, das geht ganz einfach mit der seriellen Schnittstelle. Sie werden sehen. Ich kann ja ein MIPS 32 in vhdl machen und ich habe eine sehr genauen Vorstellung davon, was eine serielle Schnittstelle ist das habe ich einerseits von den MIPS 32, den ich in vhdl machen will, andererseits auch vom AVR oder überhaupt den sio oder Pio damit ist es kein Problem, nicht mit dem pio aber sio warum? Letztenendes ist Ethernet Ich könnte Ihnen genauso guten Modem nehmen nur eine serielle Schnittstelle, die nicht funktioniert wie die anderen gut und am was unterscheidet eigentlich das ACK/NAK Protokoll des? X-on/x-off Protokoll und dazu noch von dem Hardware nein das ist ganz einfach. Es gibt die Zeichen wenn man den ASC II Code auswendig lernt, dann weiß man, dass es diese Zeichen gibt. Ack/nak dc1 dc3 im entsprechend die Protokolle des bedeutet nichts für die Zeichen. Die werden damit nicht selber synchronisiert weil bei der RS 232 werden immer die Zeichen übertragen. Es ist klar, da steckt im Code wer es benutzt hat wie ich mit dem AVR, der weiß die Zeichen werden sollte so übertragen das dient zur Synchronisierung im gesamten Zeichen Strom wann fängt denn  die Nachricht an. Und wann hört sie auf? hat mit den Zeichen selber nichts zu tun so, das ist das eine. Sie können genauso gut ack/nak nehmen, um zu erkennen hier die Nachricht an hier hört sie auf gut und was macht TCP/IP gut in ihren seriellen Zeichen. Strohm müssen Sie nur noch die Dinge erst mal in Pakete zerlegen und entsprechende Kopf- und Fußzeilen anfügen und die Adressen einfügen. TCP/IP hat mit der Anwendung Schicht nichts zu tun. Lediglich ein Router liegt in der Mitte, und um die Adressierung vorzunehmen, gibt es IP und um es in Pakete zu zerlegen, TCP. Gut das ist in einem seriellen Zeichen Strohm relativ einfach. Sie müssen bloß die Pakete nach unten weiterreichen beziehungsweise die Daten und entsprechende Kopf- und Fußzeilen anfügen. Da man ja auswendig lernt, kann man auswendig lernen. Was sind die Pakete rein kann also das dürfte kein Problem sein.


sie brauchen beim Registersatz MUX und DeMUX
nein sorry das war falsch gemacht, ich brauche keinen DeMUX beim Registersatz - das ist Quatsch, sonst werden alle 0. Das ist nicht richtig, was brauche ich denn? ganz einfach, jedes Register hat ein EN - enable - und nur, wenn EN jeweils vom gesamten Registersatz 1 ist schreibt man rein. Aber wie kann ich die Register unterscheiden, hier brauche ich DeMUX und EN. Ich muss nicht den Datenengang, DeMUX sondern, EN am jeweiligen Register

jetzt kommt, der DeMUX und ich mache beides gleich, fuer eine Auswahl von 5 Bit - fuer 32 - durch kaskadierung

nein sorry das war falsch gemacht, ich brauche keinen DeMUX beim Registersatz - das ist Quatsch, sonst werden alle 0. Das ist nicht richtig, was brauche ich denn? ganz einfach, jedes Register hat ein EN - enable - und nur, wenn EN jeweils vom gesamten Registersatz 1 ist schreibt man rein. Aber wie kann ich die Register unterscheiden, hier brauche ich DeMUX und EN. Ich muss nicht den Datenengang, DeMUX sondern, EN am jeweiligen Register

Das ist logisch, sie muessen EN aktivieren, der gesamte registersatz hat einen. Zusaetzlich haben sie ein Zielregister. Bei dem geht es um den Eingang. Das Zielregister wird mittels globalen EN eingeschaltet, indem man ein AND, vom DeMUX, bei der Auswahl des Zielregisters macht, was wiederum ein bit ergibt, also quasi ein EN. Da kommt ein AND rein
Tristates fuer alle die die lieben und das Wort immer wieder gerne wiederholen. Denen sei gesagt, hier gibt es drei Zustaende
HIGH, LOW, Hochohmig
was ist letzteres. Wenn etwas hochohmig ist, dann ist es, als waere es nicht da. Widerstand der Luft. das brauchen sie, wenn sie mehrere Geraete ohne EN aneinanderschalten und zwar mit Ausgaengen. sie koennn beliebig viel abnehmer an eingaengen haben, an ausgaengen ist es toedlich. Sie duerfen ausgaenge, egal, HIGH, LOW nicht verschalten
Das zu untersuchen ist nicht teil des Themas. Es ist unsachlich, pille palle. Hat mit uns nichts zu tun. Wer davon traeumt liegt falsch. Das gibt es innerhalb des Prozessors nicht, weil hier alles zusammenarbeitet. Wer davon traeumt ist hier falsch
Sie koennen das uebrigens auch gebrauchen, wenn sie denselben Bus als eingabe oder Ausgabe Bus gleichzeitig gebrauchen, etwa bei Ports ausserhalb des Prozessors. Dann koennen sie immer die Eingabe hochohmig machen, die einen anderen Pfad hat, als die ausgabe, wenn die ausgabe aktiv ist und umgekehrt
Aber diese Frage stellen sich hier bitte nur leute, die die nummer fuer die anstaltsleitung suchen, solche gibt es leider, viele, deswegen sage ich das, ich kenne solche, das ist natuerlich abwaegig.

Code: Select all

-- (C) David Vajda
-- 32 Bit x 2:1 MUX
-- 2024-12-02

library ieee;
use ieee.std_logic_1164.all;

entity MUX32_2_1 is
port (
    c: out std_logic_vector (31 downto 0);
    b: in std_logic_vector (31 downto 0);
    a: in std_logic_vector (31 downto 0);
    x: in std_logic
);
end;

architecture behaviour of MUX32_2_1 is
begin
    MUX_generate: FOR i IN 31 DOWNTO 0 GENERATE
        c (i) <= (a (i) and not x) or (b (i) and x);
    END GENERATE;
end;

library ieee;
use ieee.std_logic_1164.all;

entity MUX32_2_1testbench is
port (
    c: out std_logic_vector (31 downto 0)
);
end;

architecture behaviour of MUX32_2_1testbench is
    component MUX32_2_1 is
    port (
        c: out std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        a: in std_logic_vector (31 downto 0);
        x: in std_logic
    );
    end component;
    signal b: std_logic_vector (31 downto 0);
    signal a: std_logic_vector (31 downto 0);
    signal x: std_logic;
begin
    mux: MUX32_2_1 PORT MAP (c=>c, b=>b, a=>a, x=>x);

    a <= ('1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0');
    b <= ('1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0');
    x <= '1' after 0 ns, '0' after 1 ns, '1' after 2 ns, '0' after 3 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity DeMUX32_2_1 is
port (
    c: in std_logic_vector (31 downto 0);
    b: out std_logic_vector (31 downto 0);
    a: out std_logic_vector (31 downto 0);
    x: in std_logic
);
end;

architecture behaviour of DeMUX32_2_1 is
begin
    MUX_generate: FOR i IN 31 DOWNTO 0 GENERATE
        a (i) <= (c (i) and not x);
        b (i) <= (c (i) and x);
    END GENERATE;
end;

library ieee;
use ieee.std_logic_1164.all;

entity DeMUX32_2_1testbench is
port (
    a: out std_logic_vector (31 downto 0);
    b: out std_logic_vector (31 downto 0)
);
end;

architecture behaviour of DeMUX32_2_1testbench is
    component DeMUX32_2_1 is
    port (
        c: in std_logic_vector (31 downto 0);
        b: out std_logic_vector (31 downto 0);
        a: out std_logic_vector (31 downto 0);
        x: in std_logic
    );
    end component;
    signal c: std_logic_vector (31 downto 0);
    signal x: std_logic;
begin
    mux: DeMUX32_2_1 PORT MAP (c=>c, b=>b, a=>a, x=>x);

    c <= ('1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0');
    x <= '1' after 0 ns, '0' after 1 ns, '1' after 2 ns, '0' after 3 ns;
end;

jetzt kommen 5 kaskadierte MUX

Code: Select all

    -- (C) David Vajda
    -- 32 Bit x 2:1 MUX
    -- 2024-12-02

    library ieee;
    use ieee.std_logic_1164.all;

    package MIPS32 is
        type bus2_32 is array (1 downto 0) of std_logic_vector (31 downto 0);
        type bus4_32 is array (1 downto 0) of std_logic_vector (31 downto 0);
    end package;

    library ieee;
    use ieee.std_logic_1164.all;
    library work;
    use work.mips32.all;

    entity MUX32_2_1 is
    port (
        b: out std_logic_vector (31 downto 0);
        a: in bus2_32;
        x: in std_logic
    );
    end;

    architecture behaviour of MUX32_2_1 is
    begin
        MUX_generate: FOR i IN 31 DOWNTO 0 GENERATE
            b (i) <= (a (1)(i) and not x) or (a(0) (i) and x);
        END GENERATE;
    end;

    library ieee;
    use ieee.std_logic_1164.all;
    library work;
    use work.mips32.all;

    entity MUX32_4_1 is
    port (
        b: out std_logic_vector (31 downto 0);
        a: in bus4_32;
        x: in std_logic
    );
    end;

architecture behaviour of MUX32_2_1 is
    component MUX32_2_1
    port (
        b: out std_logic_vector (31 downto 0);
        a: in bus2_32;
        x: in std_logic
    );
    end component;
begin
    MUX_generate: FOR i IN 31 DOWNTO 0 GENERATE
        b (i) <= (a (1)(i) and not x) or (a(0) (i) and x);
    END GENERATE;
end;
Ich habe es wohl falsch gezeigt. Wir brauchen die Dekodierer kein
und demultiplexer was das EN betrifft, aber das lustige ist ja:  doch es geht schon. Das ist genau das, dass es eben schon geht. Wenn wir nämlich genau den DeMUX nehmen und dann an den Eingang eine eins legen und sonst überall null ist
Das, was ich jetzt sagte, stellt meine Intelligenz nicht infrage, weil der Witz ist, ja ein Decoder ist ein Kodierer, der für jede Form von Eingangssignal immer nur je einen Ausgang ein Signal abgeben lässt was Eins ist so, jetzt kann beim Dekoda allerdings jede beliebige Form von Eingangssignal reingehen im Allgemeinen der Unterschied ist, dass der DeMUX konsekutive nummerierte Eingangs Signale hat d.h. ganze Zahlen, und die lassen sich nummerieren die ganze Zahlen und entsprechend dem DeMUX bei dem eine Eins anliegt und sonst überall Null ist
Es besteht manchmal die Verwechslungsgefahr zwischen kodierer, Dekodierer und einem letzten Encoder, Letzteres gebraucht man nicht unbedingt. Der Unterschied ist, der dekodieren ist nicht die inverse Funktion zum Kodierer, das stimmt nicht, sondern hat für einen Ausgang immer nur je ein Signal. Eine Eins, das ist etwas spezielles. Die Umkehrfunktion wäre im Allgemeinen höchstens ein Encoder wenn man so will aber das ist nicht unbedingt richtig
Ich hab mich nicht geirrt mit dem DeMUX keine Sorge. Ist immer noch ein dekoder. der Unterschied ist, dass die Eingangs Signale konsekutiveniert sind. Das ist praktisch das allerdings so zu machen weil das ist genau der selbe Weg nur es lässt sich so realisieren und es ist praktischer so aus einem einzigen Grund man muss halt begreifen, dass dann immer die Signal 1 anliegt, das praktischer das so zu machen weil ein Dekoda lässt sich im Allgemeinen nicht ganz so einfach realisieren. Es ist viel Schreibarbeit ein DeMUX so, wie ich das bisher gemacht habe, eben moscadosiert das entsteht durch das konsekutive nummerierte
Das

Bevor ich jetzt weiter mache, und weiter Suche mache ich heute Abend an dem fpga/vhdl/mips32 weiter jetzt stehen ja gerade an die multiplexer

Das Wort Abel war unsere Zeit damals übrigens gängig, und ich musste sagen, ich hab das nie gelernt. Inzwischen fällt mir auf, wie viele andere wohl auch nicht.

Bei dem Registers Satz bei dem Daten Ausgang 32 Bit bei multiplexer brauche ich wohl doch kein Array, und das aus einem einfachen Grund, aus zwei Registern mit einem multiplexer ein Registersatz von zwei Registern, dann nehme ich zwei solche und habe vier Register, aber da brauche ich kein Bus von jeweils 32 × 32

Demultiplexer brauche ich so nicht. Haben wir ja festgestellt, weil das über en enable geschieht und damit nichts gewonnen wäre, wenn ich das als DeMUX realisieren würde, sonst hätte ich den wert, null, der auch übernommen würde, was er ja nicht soll


Ich muss allerdings den Registersatz sozusagen aus einem Guss machen. Selbstverständlich ist es nicht weil ich muss erst mal darüber nachdenken, wie ich den Registers Satz mache. Der MIPS 32 ist mit dem Block Schalt Bild, was ich habe vollständig beschrieben. Sie dürfen sich nicht in die irre führen lassen der große Blog da oben ist lediglich Kodierer oder Dekodierer das müssen Sie nur ihre Werte umsetzen das ist kein Problem. Es ist allerdings nicht beschrieben, wie der Registers Satz konkret aussieht, innerhalb des Registers Satz also das Block Bild schreibt nicht vor wie ich die mux darin Umsätze ,was wir allerdings wissen müssen. Es gibt zwei Quell Operanden vom Registers Satz. Warum es keinen Sinn macht, die nicht aus einem Guss zu fertigen, weil ich dann noch die en habe für das Zielregister und die würden sonst in der Luft herumhängen dazu kommt, dass ich eben zwei Quell Operanden habe d.h. ich brauche zwei mux gleichzeitig

Also gut multiplexer haben wir bereits ein multiplexer haben. Wir und d Flip Flops haben wir auch bereits. geht's nur noch darum, diese zum Register zu machen das dürfte wie bei dem 32 Bit addiere kein Problem sein und dann geht's drum. Wir brauchen nicht malen Takt. Wir brauchen nicht beides gleichzeitig wie das bei den gekauften so üblich ist oder Sie können auch bei dem gekauften da brauchen Sie nur das CLK benutzen. Manchmal haben die beide sozusagen, aber sie können es CLK für E. N benutzen gut und dann hat sich das ja erledigt Und dann kann man schon mal zwei mit zwei mux die wir ja bereits haben, die einfachen zu einem Registers Satz mit zwei zusammenfassen und die EAN können wir dann bei beiden. Vielleicht führen wir dann doch ein CLK ein, weil sonst immer irgendein aktiviert ist. Wenn nein nein ich hab mich geirrt. Wir brauchen CLK und wir brauchen en der Witz ist, dass wir ja die Auswahl Adresse haben für das Ziel Register.
Und die Auswahl Adresse ist was im Gegensatz zu dem eben DeMUX brauchen wir sozusagen hier das EN aktiviert gut das ist die Adresse unseres Ziel Registers aber wenn wir nur das Ziel Register haben, sozusagen über das Dekoda über die 5 Bit Decoder, dann besteht das Problem, dass wir immer ein Ziel Operanten gleichzeitig aktiv haben. D.h. irgendwo wird reingeschrieben und das wollen wir ja nicht. Wir wollen unter Umständen gar nicht reinschreiben, d.h. wir brauchen hier ein AND und das ist EN dieses ist was sonst? Clk ist, während wir gleichzeitig ein logisches und zu unserem Ziel Register, haben, was kein multiplexer am Eingang ist, sondern eben logisches und mit dem EN, was sonst der Takt ist

So vorstellen Sie haben ein globales E N und das ist nicht jederzeit aktiv an dem Ziel Register liegt so oder so Wert an, wenn sie sich jetzt den einfachsten MIPS 32, wie ich ihn mache vorstellen, dann arbeitet er alles in einem Takt ab. Jeder Befehl dauert einen Takt. Jetzt kann im mips 32 eine fünfstufige Befehlspipeline haben. Auf der anderen Seite, muss nicht in den Registers Satz geschrieben werden. Das Ziel kann genauso gut der Arbeitsspeicher sein also der Datenspeicher ist ja ne Harvard Architektur dann liegt trotzdem ein Wert an dem Ziel Regung. Bistorant wird in den Arbeitsspeicher geschrieben dann würde jetzt trotzdem auch in den Registers Satz geschrieben. Des Befehlsdekoda kann zwar aussuchen, was die Quelle ist am jeweiligen Block. Aber was es nicht kann Es kann die einzelnen Teile, dass sie die Werte übernehmen, also die einzelnen Blöcke nur über das EN am Block sozusagen selber aktivieren. Das andere ist, wenn sie ne fünfstufige Befehlspipeline haben also IF, ID, EX, MEM, W B. Dann wird nur in bestimmten Stufen übernommen, würde das EN nicht existieren dann würde ihn jeder Stufe gleichzeitig einen Wert am Registers Satz übernommen werden.

Jetzt wird es die Aufgabe für heute Abend fange ich einfach an. Ich mach ein Register mit 32 Bit das das hat jetzt erst mal ein EN und dann mache ich ein Registers Satz mit zwei Registern und die haben eben ein en und eine Adresse für das Ziel und zwei mux am Ausgang für den ein Quelloperanten und für den anderen

Zum Beispiel Registers Satz mit zwei Registern haben und dann haben sie eine Adresse mit 1 Bit dies entweder null oder eins. Dann wird entweder in Register null oder in Register eins geschrieben wenn das alles ist. Je nachdem halt ob der Wert an dem Bit eins oder null ist das alles ist und sie kein globales? En haben dann wird in jedem Fall in ein Register geschrieben, weil die Adresse ist entweder null oder eins das geht ja nicht deswegen brauchen Sie globales EN das wird über ein logisches und von dem globalen EN und der Adresse erstellt und das passiert aber erst im Registersatz das ist nicht schon am Register selber vorhanden. Das hat ein einziges CLK was ein EN ist

Code: Select all

-- (C) David Vajda
-- D-FF/32 x 32 Bit Register set MIPS32/2 Src, 1 Dest
-- 2024-11-28/2024-12-04

library ieee;
use ieee.std_logic_1164.all;

entity rslatch is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    p: inout std_logic
);
end;

architecture behaviour of rslatch is
begin
    q   <=  (r nor p);
    p   <=  (s nor q);
end;

library ieee;
use ieee.std_logic_1164.all;

entity clktriggeredrslatch is
port (
    r: in std_logic;
    s: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of clktriggeredrslatch is
    component rslatch
    port (
        r: in std_logic;
        s: in std_logic;
        q: inout std_logic;
        p: inout std_logic
    );
    end component;
    signal e, d: std_logic;
begin
    rs: rslatch PORT MAP (r=>e, s=>d, q=>q);
    d <= c and s;
    e <= c and r;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dlatch is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dlatch is
    component clktriggeredrslatch
    port (
        r: in std_logic;
        s: in std_logic;
        c: in std_logic;
        q: inout std_logic
    );
    end component;
    signal e, f: std_logic;
begin
    clkrs: clktriggeredrslatch PORT MAP (r=>f, s=>e, c=>c, q=>q);

    e <= d;
    f <= not d;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dlatchtestbench is
    component dlatch
    port (
        c: in std_logic;
        d: in std_logic;
        q: inout std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dlatch PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dff is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dff is
    component dlatch
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal e, a, b: std_logic;
begin
    d1: dlatch PORT MAP (c=>a, d=>e, q=>q);
    d2: dlatch PORT MAP (c=>b, d=>d, q=>e);
    a <= not c;
    b <= c;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dfftestbench is
    component dff
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dff PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;
so weit so gut

Code: Select all

-- (C) David Vajda
-- D-FF/32 x 32 Bit Register set MIPS32/2 Src, 1 Dest
-- 2024-11-28/2024-12-04

library ieee;
use ieee.std_logic_1164.all;

entity rslatch is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    p: inout std_logic
);
end;

architecture behaviour of rslatch is
begin
    q   <=  (r nor p);
    p   <=  (s nor q);
end;

library ieee;
use ieee.std_logic_1164.all;

entity clktriggeredrslatch is
port (
    r: in std_logic;
    s: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of clktriggeredrslatch is
    component rslatch
    port (
        r: in std_logic;
        s: in std_logic;
        q: inout std_logic;
        p: inout std_logic
    );
    end component;
    signal e, d: std_logic;
begin
    rs: rslatch PORT MAP (r=>e, s=>d, q=>q);
    d <= c and s;
    e <= c and r;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dlatch is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dlatch is
    component clktriggeredrslatch
    port (
        r: in std_logic;
        s: in std_logic;
        c: in std_logic;
        q: inout std_logic
    );
    end component;
    signal e, f: std_logic;
begin
    clkrs: clktriggeredrslatch PORT MAP (r=>f, s=>e, c=>c, q=>q);

    e <= d;
    f <= not d;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dlatchtestbench is
    component dlatch
    port (
        c: in std_logic;
        d: in std_logic;
        q: inout std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dlatch PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dff is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dff is
    component dlatch
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal e, a, b: std_logic;
begin
    d1: dlatch PORT MAP (c=>a, d=>e, q=>q);
    d2: dlatch PORT MAP (c=>b, d=>d, q=>e);
    a <= not c;
    b <= c;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dfftestbench is
    component dff
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dff PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity reg32 is
port (
    c: in std_logic;
    d: in std_logic_vector (31 downto 0);
    q: out std_logic_vector (31 downto 0)
);
end;

architecture behaviour of reg32 is
    component dff
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal p: std_logic_vector (31 downto 0);
begin
    gen_reg: FOR i in 31 downto 0 generate
        dffx: dff PORT MAP (q=>p(i),d=>d(i),c=>c);
        q(i) <= p (i);
    end generate;
end;
Jetzt der Test, für das 32 mit Register

Übrigens, nachher an dem multiplexer und dem Dekoda sagen wir mal DeMUX immer noch das Problem, dass sie jetzt ABC DE haben bei 5 Bit das macht aber nichts weil wenn der Registersatz mit den 32 Beträge dann erst fertig ist dann können Sie die immer noch einzeln und es sind ja nur 5 Bit das ist kein Problem auf ein Array mit 5 Bit Umsätzen

Code: Select all

-- (C) David Vajda
-- D-FF/32 x 32 Bit Register set MIPS32/2 Src, 1 Dest
-- 2024-11-28/2024-12-04

library ieee;
use ieee.std_logic_1164.all;

entity rslatch is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    p: inout std_logic
);
end;

architecture behaviour of rslatch is
begin
    q   <=  (r nor p);
    p   <=  (s nor q);
end;

library ieee;
use ieee.std_logic_1164.all;

entity clktriggeredrslatch is
port (
    r: in std_logic;
    s: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of clktriggeredrslatch is
    component rslatch
    port (
        r: in std_logic;
        s: in std_logic;
        q: inout std_logic;
        p: inout std_logic
    );
    end component;
    signal e, d: std_logic;
begin
    rs: rslatch PORT MAP (r=>e, s=>d, q=>q);
    d <= c and s;
    e <= c and r;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dlatch is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dlatch is
    component clktriggeredrslatch
    port (
        r: in std_logic;
        s: in std_logic;
        c: in std_logic;
        q: inout std_logic
    );
    end component;
    signal e, f: std_logic;
begin
    clkrs: clktriggeredrslatch PORT MAP (r=>f, s=>e, c=>c, q=>q);

    e <= d;
    f <= not d;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dlatchtestbench is
    component dlatch
    port (
        c: in std_logic;
        d: in std_logic;
        q: inout std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dlatch PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dff is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dff is
    component dlatch
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal e, a, b: std_logic;
begin
    d1: dlatch PORT MAP (c=>a, d=>e, q=>q);
    d2: dlatch PORT MAP (c=>b, d=>d, q=>e);
    a <= not c;
    b <= c;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dfftestbench is
    component dff
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dff PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity reg32 is
port (
    c: in std_logic;
    d: in std_logic_vector (31 downto 0);
    q: out std_logic_vector (31 downto 0)
);
end;

architecture behaviour of reg32 is
    component dff
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal p: std_logic_vector (31 downto 0);
begin
    gen_reg: FOR i in 31 downto 0 generate
        dffx: dff PORT MAP (q=>p(i),d=>d(i),c=>c);
        q(i) <= p (i);
    end generate;
end;

library ieee;
use ieee.std_logic_1164.all;


entity dffregtestbench is
port (
    q: inout std_logic_vector (31 downto 0)
);
end;

architecture behaviour of dffregtestbench is
    component reg32
    port (
        q: out std_logic_vector (31 downto 0);
        d: in std_logic_vector (31 downto 0);
        c: in std_logic
    );
    end component;
    signal d: std_logic_vector (31 downto 0);
    signal c: std_logic;
begin
    r32: reg32 PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 0 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 10 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 20 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 30 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 40 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 50 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 60 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 70 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 80 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 90 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 100 ns;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;
Also das Register tut, wie sie sehen am Test. Was mussten wir beim Testen machen? Wir mussten ja jetzt aus dem 1 Bit Eingabewert beim Register ein 32 Bit Eingabe und Ausgabe Wert machen bis auf bei CLK naja bei einem Bit lauteten konkreter Wert '1' und beim 32 Bit wert sind. 32 Tupel. ('0', '0', ...) wir mussten da einfach ein charakteristischen Wert einsetzen und einmal ein Tupel mit mit dem Wert dem Ganzzahl Wert null und einem anderen und das ergibt es charakteristische Bild hier bei gtkwave

Zwei multiplexer hinten dran, zwei 32:2x1 und eben das en und des regdst das ist ein 5 Bit Wert quasi da steht für Register Destination. Das ist nicht der Eingabe wert beim Ziel Operanten aber das ist die Auswahl von Register Destination. Das müssen wir eben machen und das machen wir auch mit dem demultiplexer wiederum der allerdings dann wie gesagt die Funktion eines Dekoda hat nur das eben bei diesem DeMUX immer der Wert eins anliegt. Dadurch wird es zum Decoder mit konsekutive, nummerierten Zahlen im Gegensatz zum reinen DeMUX so zu sagen, der Eingabewert variieren kann, ist es immer nur eins und wird so zum Dekoda
Eine Rolle spielt bei diesem MIPS 32, dass sie den Ausgabe Operanten also dass sie das, was zum Beispiel in die ALU dann reingehen nicht abschalten können brauchen Sie nicht weil in die alu wird so oder sowas reingehen. Die Frage ist übernehmen Sie überhaupt den Wert von der alu des Macht eben der Befehl dekodierer und ebenso liegt am Registers Satz an beiden Quellen Operanten immer ein Wert an. Es ist halt die Frage, ob die übernommen wird aber sie schalten das nicht am Ausgang. Ab den Unterschied muss man begreifen.

Code: Select all

library ieee;
use ieee.std_logic_1164.all;
entity registerset2_32 is
port (
    srcdata1: out std_logic_vector (31 downto 0);
    srcdata2: out std_logic_vector (31 downto 0);
    destdata: in std_logic_vector (31 downto 0);
    regsrc1: in std_logic_vector (4 downto 0);
    regsrc2: in std_logic_vector (4 downto 0);
    regdest: in std_logic_vector (4 downto 0);
    en: in std_logic;
);
end;
Letzter Beitrag so muss halt die Entity aussehen von einem 2 x 32 Beta Registers, Satz und jetzt brauchen wir Komponenten einmal den mux und einmal die des Register als Komponente und dann müssen wir die Komponenten sozusagen real werden lassen als zwei mux und dann nebenbei noch zwei Register, wobei das nichts miteinander zu tun haben. Die Register, die werden sich verdoppeln. Die Mux werden auch mehr durch die kaskadierung. Aber die mux sind ja in dem Fall nur zwei, weil sie zwei Quelloperanten haben

War jetzt so gesehen eben der Fehler drin aber das ist jetzt kein Problem. Ich bin jetzt schon bei der Architektur also das zu verbinden. Der Fehler war jetzt jetzt hatten wir 5 Bit für das Quellregister Auswahl und für die Ziel Register, das sind jetzt noch keine 5 Bit, weil das ist ja ein 2x32 und nicht 32x32 das kommt ja erst nachher die werden wir dann nachher weiter verbinden und deswegen haben wir bisher nur ein einziges Bild zur Auswahl. Das ist entweder null oder eins. Entweder das ist ein Register oder andere Register und deswegen ist es bisher nicht fünf bitte stimmte nicht

Code: Select all

library ieee;
use ieee.std_logic_1164.all;

entity registerset2_32 is
port (
    srcdata1: out std_logic_vector (31 downto 0);
    srcdata2: out std_logic_vector (31 downto 0);
    destdata: in std_logic_vector (31 downto 0);
    regsrc1: in std_logic;
    regsrc2: in std_logic;
    regdest: in std_logic;
    en: in std_logic
);
end;

architecture behaviour of registerset2_32 is
    component reg32
    port (
        c: in std_logic;
        d: in std_logic_vector (31 downto 0);
        q: out std_logic_vector (31 downto 0)
    );
    end component;
    component MUX32_2_1 is
    port (
        c: out std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        a: in std_logic_vector (31 downto 0);
        x: in std_logic
    );
    end component;
    signal q1: std_logic_vector (31 downto 0);
    signal q2: std_logic_vector (31 downto 0);
    signal c1, c2: std_logic;
begin
    reg1: reg32 PORT MAP (q=>q1,d=>destdata,c=>c1);
    reg2: reg32 PORT MAP (q=>q2,d=>destdata,c=>c2);
    srcmux1: MUX32_2_1 PORT MAP (a=>q1, b=>q2, c=>srcdata1, x=>regsrc1);
    srcmux2: MUX32_2_1 PORT MAP (a=>q1, b=>q2, c=>srcdata2, x=>regsrc2);
    c1 <= en and regdest;
    c2 <= en and not regdest;
end;
Probieren, dazu Test zu schreiben können wir mal probieren wenn wir Lust dazu haben ein bisschen umständlich, dass wir sozusagen einmal in sein Register schreiben einmal in das andere und dann wählen wir aus welches Register wir meinen und dann gucken wir, ob der Wert darin gespeichert bleibt und wenn wir das andere Register auswählen, ob der Wert dann auch gespeichert bleibtgehe jetzt erst mal davon aus, dass das stimmt

Code: Select all

-- (C) David Vajda
-- D-FF/32 x 32 Bit Register set MIPS32/2 Src, 1 Dest
-- 2024-11-28/2024-12-04

library ieee;
use ieee.std_logic_1164.all;

entity rslatch is
port (
    r: in std_logic;
    s: in std_logic;
    q: inout std_logic;
    p: inout std_logic
);
end;

architecture behaviour of rslatch is
begin
    q   <=  (r nor p);
    p   <=  (s nor q);
end;

library ieee;
use ieee.std_logic_1164.all;

entity clktriggeredrslatch is
port (
    r: in std_logic;
    s: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of clktriggeredrslatch is
    component rslatch
    port (
        r: in std_logic;
        s: in std_logic;
        q: inout std_logic;
        p: inout std_logic
    );
    end component;
    signal e, d: std_logic;
begin
    rs: rslatch PORT MAP (r=>e, s=>d, q=>q);
    d <= c and s;
    e <= c and r;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dlatch is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dlatch is
    component clktriggeredrslatch
    port (
        r: in std_logic;
        s: in std_logic;
        c: in std_logic;
        q: inout std_logic
    );
    end component;
    signal e, f: std_logic;
begin
    clkrs: clktriggeredrslatch PORT MAP (r=>f, s=>e, c=>c, q=>q);

    e <= d;
    f <= not d;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dlatchtestbench is
    component dlatch
    port (
        c: in std_logic;
        d: in std_logic;
        q: inout std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dlatch PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dff is
port (
    d: in std_logic;
    c: in std_logic;
    q: inout std_logic
);
end;

architecture behaviour of dff is
    component dlatch
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal e, a, b: std_logic;
begin
    d1: dlatch PORT MAP (c=>a, d=>e, q=>q);
    d2: dlatch PORT MAP (c=>b, d=>d, q=>e);
    a <= not c;
    b <= c;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dfftestbench is
    component dff
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal d, c: std_logic;
begin
    dl: dff PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= '1' after 0 ns, '1' after 10 ns, '0' after 20 ns, '0' after 30 ns, '0' 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;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity reg32 is
port (
    c: in std_logic;
    d: in std_logic_vector (31 downto 0);
    q: out std_logic_vector (31 downto 0)
);
end;

architecture behaviour of reg32 is
    component dff
    port (
        q: inout std_logic;
        d: in std_logic;
        c: in std_logic
    );
    end component;
    signal p: std_logic_vector (31 downto 0);
begin
    gen_reg: FOR i in 31 downto 0 generate
        dffx: dff PORT MAP (q=>p(i),d=>d(i),c=>c);
        q(i) <= p (i);
    end generate;
end;

library ieee;
use ieee.std_logic_1164.all;


entity dffregtestbench is
port (
    q: inout std_logic_vector (31 downto 0)
);
end;

architecture behaviour of dffregtestbench is
    component reg32
    port (
        q: out std_logic_vector (31 downto 0);
        d: in std_logic_vector (31 downto 0);
        c: in std_logic
    );
    end component;
    signal d: std_logic_vector (31 downto 0);
    signal c: std_logic;
begin
    r32: reg32 PORT MAP (d=>d, c=>c, q=>q);

-- diese sind aus dem letzten eingefuegt, damit ich sie nicht noch mal schreiben muss

    d <= ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 0 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 10 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 20 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 30 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 40 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 50 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1') after 60 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','1','0','0', '1','0','1','1', '0','0','0','1' ,'0','0','1','1')  after 70 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 80 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 90 ns, ('0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0', '0','0','0','0' ,'0','0','0','0') after 100 ns;
    c <= '1' after 0 ns, '0' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns, '0' after 50 ns, '1' after 60 ns, '0' after 70 ns, '0' after 80 ns, '0' after 90 ns, '0' after 100 ns;
end;


library ieee;
use ieee.std_logic_1164.all;

entity MUX32_2_1 is
port (
    c: out std_logic_vector (31 downto 0);
    b: in std_logic_vector (31 downto 0);
    a: in std_logic_vector (31 downto 0);
    x: in std_logic
);
end;

architecture behaviour of MUX32_2_1 is
begin
    MUX_generate: FOR i IN 31 DOWNTO 0 GENERATE
        c (i) <= (a (i) and not x) or (b (i) and x);
    END GENERATE;
end;

library ieee;
use ieee.std_logic_1164.all;

entity MUX32_2_1testbench is
port (
    c: out std_logic_vector (31 downto 0)
);
end;

architecture behaviour of MUX32_2_1testbench is
    component MUX32_2_1 is
    port (
        c: out std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        a: in std_logic_vector (31 downto 0);
        x: in std_logic
    );
    end component;
    signal b: std_logic_vector (31 downto 0);
    signal a: std_logic_vector (31 downto 0);
    signal x: std_logic;
begin
    mux: MUX32_2_1 PORT MAP (c=>c, b=>b, a=>a, x=>x);

    a <= ('1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0', '1', '0');
    b <= ('1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0', '1', '1', '0', '0');
    x <= '1' after 0 ns, '0' after 1 ns, '1' after 2 ns, '0' after 3 ns;
end;

library ieee;
use ieee.std_logic_1164.all;

entity registerset2_32 is
port (
    srcdata1: out std_logic_vector (31 downto 0);
    srcdata2: out std_logic_vector (31 downto 0);
    destdata: in std_logic_vector (31 downto 0);
    regsrc1: in std_logic;
    regsrc2: in std_logic;
    regdest: in std_logic;
    en: in std_logic
);
end;

architecture behaviour of registerset2_32 is
    component reg32
    port (
        c: in std_logic;
        d: in std_logic_vector (31 downto 0);
        q: out std_logic_vector (31 downto 0)
    );
    end component;
    component MUX32_2_1 is
    port (
        c: out std_logic_vector (31 downto 0);
        b: in std_logic_vector (31 downto 0);
        a: in std_logic_vector (31 downto 0);
        x: in std_logic
    );
    end component;
    signal q1: std_logic_vector (31 downto 0);
    signal q2: std_logic_vector (31 downto 0);
    signal c1, c2: std_logic;
begin
    reg1: reg32 PORT MAP (q=>q1,d=>destdata,c=>c1);
    reg2: reg32 PORT MAP (q=>q2,d=>destdata,c=>c2);
    srcmux1: MUX32_2_1 PORT MAP (a=>q1, b=>q2, c=>srcdata1, x=>regsrc1);
    srcmux2: MUX32_2_1 PORT MAP (a=>q1, b=>q2, c=>srcdata2, x=>regsrc2);
    c1 <= en and regdest;
    c2 <= en and not regdest;
end;
Jetzt tue ich es einfach auf die Homepage und dann ist nicht mehr viel zu machen jetzt mache ich noch ein 4 x 32 Registers hat nämlich noch mal ne Komponente und da muss nicht mehr viel rein. Da muss noch eine Komponente von dem bisherigen Registers Satz rein und davon definieren wir jeweils zwei sozusagen existierende Einheiten also real existierende und dann gehört noch ein multiplexer dazu
Attachments
Screenshot_20241204_000328.png
Screenshot_20241204_000328.png (37.73 KiB) Viewed 14 times
Screenshot_20241204_002615.png
Screenshot_20241204_002615.png (43.66 KiB) Viewed 14 times
Screenshot_20241204_002644.png
Screenshot_20241204_002644.png (43.63 KiB) Viewed 14 times
Screenshot_20241202_100936.png
Screenshot_20241202_100936.png (42.48 KiB) Viewed 28 times
Screenshot_20241202_103615.png
Screenshot_20241202_103615.png (45.21 KiB) Viewed 28 times
Post Reply