32 Bit

Benutzeravatar
davidvajda.de
Site Admin
Beiträge: 1488
Registriert: Di Jul 18, 2023 8:36 pm
Wohnort: D-72072, Tübingen
Kontaktdaten:

Re: 32 Bit

Beitrag von davidvajda.de »

Herzlichen Glückwunsch - mein Zähler zählt schon mal in VDHL

Code: Alles auswählen

library ieee;
use ieee.std_logic_1164.all;

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

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

library ieee;
use ieee.std_logic_1164.all;

entity ripplecarryadder32 is
port (
    s: out std_logic_vector (31 downto 0);
    b, a: in std_logic_vector (31 downto 0)
);
end;

architecture behaviour of ripplecarryadder32 is
    component fulladder
    port (
        a, b, c: in std_logic;
        s, u: out std_logic
    );
    end component;
    signal c : std_logic_vector (31 downto 0);
    signal u : std_logic_vector (31 downto 0);
begin
    c(0) <= '0';
    add1: fulladder PORT MAP (c=>c(0),b=>b(0),a=>a(0),s=>s(0),u=>u(0));
    l1:
        for i in 1 to 31 generate
            sn: fulladder PORT MAP (c=>u(i-1),b=>b(i),a=>a(i),s=>s(i),u=>u(i));
        end generate;
end;

library ieee;
use ieee.std_logic_1164.all;

entity srlatch is
port (
    q: out std_logic;
    r, s: in std_logic
);
end;

architecture behaviour of srlatch is
    signal q1, q2: std_logic;
begin
    q1 <= s when q1 = 'U' else (q2 nor s);
    q2 <= not s when q2 = 'U' else (q1 nor r);
    q <= q1;
end;

library ieee;
use ieee.std_logic_1164.all;

entity csrlatch is
port (
    q: out std_logic;
    r, s, c: in std_logic
);
end;

architecture behaviour of csrlatch is
    component srlatch
    port (
        q: out std_logic;
        r, s: in std_logic
    );
    end component;
    signal s1, r1 : std_logic;
begin
    sn: srlatch PORT MAP (s=>s1, r=>r1, q=>q);
    s1 <= c and s;
    r1 <= c and r;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dlatch is
    component csrlatch
    port (
        q: out std_logic;
        s, r, c: in std_logic
    );
    end component;
    signal s1, r1 : std_logic;
begin
    sn: csrlatch PORT MAP (s=>s1, r=>r1, c=>c, q=>q);
    s1 <= d;
    r1 <= not d;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dmsff is
port (
    q: out std_logic;
    d, c: in std_logic
);
end;

architecture behaviour of dmsff is
    component dlatch
    port (
        q: out std_logic;
        d, c: in std_logic
    );
    end component;
    signal c1, c2 : std_logic;
    signal q1 : std_logic;
begin
    sn1: dlatch PORT MAP (d=>d, c=>c1, q=>q1);
    sn2: dlatch PORT MAP (d=>q1, c=>c2, q=>q);
    c1 <= c;
    c2 <= not c;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of reg32 is
    component dmsff
    port (
        q: out std_logic;
        d, c: in std_logic
    );
    end component;
begin
    l1:
    for i in 0 to 31 generate
        sn: dmsff PORT MAP (q=>q(i), d=>d(i), c=>c);
    end generate;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of counter32 is
    component reg32
    port (
        c: in std_logic;
        q: out std_logic_vector (31 downto 0);
        d: in std_logic_vector (31 downto 0)
    );
    end component;
    component ripplecarryadder32
    port (
        s: out std_logic_vector (31 downto 0);
        b, a: in std_logic_vector (31 downto 0)
    );
    end component;
    signal d: std_logic_vector (31 downto 0);
    signal b: std_logic_vector (31 downto 0);
    signal a: std_logic_vector (31 downto 0);
    signal c: std_logic;
begin
    sn1: reg32 PORT MAP (q=>b, d=>d, c=>c);
    sn2: ripplecarryadder32 PORT MAP (b=>b, a=>a, s=>d);
    a <= ('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','1') after 0 ns;
    q <= d;
    --b <= ('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 0 ns;
    --d <= ('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 0 ns;
    c <= '0' after 0 ns, '1' after 1 ns, '0' after 2 ns, '1' after 3 ns, '0' after 4 ns, '1' after 5 ns, '0' after 6 ns, '1' after 7 ns;

end;
Bild

Bild

Bild

Bild

Code: Alles auswählen

library ieee;
use ieee.std_logic_1164.all;

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

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

library ieee;
use ieee.std_logic_1164.all;

entity ripplecarryadder32 is
port (
    s: out std_logic_vector (31 downto 0);
    b, a: in std_logic_vector (31 downto 0)
);
end;

architecture behaviour of ripplecarryadder32 is
    component fulladder
    port (
        a, b, c: in std_logic;
        s, u: out std_logic
    );
    end component;
    signal c : std_logic_vector (31 downto 0);
    signal u : std_logic_vector (31 downto 0);
begin
    c(0) <= '0';
    add1: fulladder PORT MAP (c=>c(0),b=>b(0),a=>a(0),s=>s(0),u=>u(0));
    l1:
        for i in 1 to 31 generate
            sn: fulladder PORT MAP (c=>u(i-1),b=>b(i),a=>a(i),s=>s(i),u=>u(i));
        end generate;
end;

library ieee;
use ieee.std_logic_1164.all;

entity srlatch is
port (
    q: out std_logic;
    r, s: in std_logic
);
end;

architecture behaviour of srlatch is
    signal q1, q2: std_logic;
begin
    q1 <= s when q1 = 'U' else (q2 nor s);
    q2 <= not s when q2 = 'U' else (q1 nor r);
    q <= q1;
end;

library ieee;
use ieee.std_logic_1164.all;

entity csrlatch is
port (
    q: out std_logic;
    r, s, c: in std_logic
);
end;

architecture behaviour of csrlatch is
    component srlatch
    port (
        q: out std_logic;
        r, s: in std_logic
    );
    end component;
    signal s1, r1 : std_logic;
begin
    sn: srlatch PORT MAP (s=>s1, r=>r1, q=>q);
    s1 <= c and s;
    r1 <= c and r;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of dlatch is
    component csrlatch
    port (
        q: out std_logic;
        s, r, c: in std_logic
    );
    end component;
    signal s1, r1 : std_logic;
begin
    sn: csrlatch PORT MAP (s=>s1, r=>r1, c=>c, q=>q);
    s1 <= d;
    r1 <= not d;
end;

library ieee;
use ieee.std_logic_1164.all;

entity dmsff is
port (
    q: out std_logic;
    d, c: in std_logic
);
end;

architecture behaviour of dmsff is
    component dlatch
    port (
        q: out std_logic;
        d, c: in std_logic
    );
    end component;
    signal c1, c2 : std_logic;
    signal q1 : std_logic;
begin
    sn1: dlatch PORT MAP (d=>d, c=>c1, q=>q1);
    sn2: dlatch PORT MAP (d=>q1, c=>c2, q=>q);
    c1 <= c;
    c2 <= not c;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of reg32 is
    component dmsff
    port (
        q: out std_logic;
        d, c: in std_logic
    );
    end component;
begin
    l1:
    for i in 0 to 31 generate
        sn: dmsff PORT MAP (q=>q(i), d=>d(i), c=>c);
    end generate;
end;

library ieee;
use ieee.std_logic_1164.all;

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

architecture behaviour of counter32 is
    component reg32
    port (
        c: in std_logic;
        q: out std_logic_vector (31 downto 0);
        d: in std_logic_vector (31 downto 0)
    );
    end component;
    component ripplecarryadder32
    port (
        s: out std_logic_vector (31 downto 0);
        b, a: in std_logic_vector (31 downto 0)
    );
    end component;
    signal d: std_logic_vector (31 downto 0);
    signal b: std_logic_vector (31 downto 0);
    signal a: std_logic_vector (31 downto 0);
    signal c: std_logic;
begin
    sn1: reg32 PORT MAP (q=>b, d=>d, c=>c);
    sn2: ripplecarryadder32 PORT MAP (b=>b, a=>a, s=>d);
    a <= ('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','1') after 0 ns;
    q <= d;
    --b <= ('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 0 ns;
    --d <= ('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 0 ns;
    c <= '0' after 0 ns, '1' after 1 ns, '0' after 2 ns, '1' after 3 ns, '0' after 4 ns, '1' after 5 ns, '0' after 6 ns, '1' after 7 ns;

end;
Man muss vor allem eines machen, da kommt man nicht drum rum

Das Problem liegt im Latch selber - am Anfang ist der Zustand 'U'. Das muss man gross schreiben - also Undefined. Und da

Code: Alles auswählen

q1 <= (q2 nor s);
q2 <= (q1 nor r);
Beim RS-Latch. Jetzt wenn man das so selber lötet, würde sich das vielleicht einpendeln. Umgekehrt in VHDL gibt es die Regel. wenn ein Bit 'U' und in ein Schaltnetz geschickt wird, dann ist der Ausgang wieder 'U'. Blöd beim Schaltwerk, wo es in den Zustand wieder rein geht. Man kriegt, jetzt das 'U' nicht mehr raus. Jetzt braucht man das IF

Ich habe das so gemacht. Damit geht es

Code: Alles auswählen

architecture behaviour of srlatch is
    signal q1, q2: std_logic;
begin
    q1 <= s when q1 = 'U' else (q2 nor s);
    q2 <= not s when q2 = 'U' else (q1 nor r);
    q <= q1;
end;
Das heisst, ich habe auch anderes Probiert. Ich habe probiert q1 '0' zu zu weisen, wenn q1 'U' ist. Das ging nicht gut, mit der Zuweisung, des Eingang dann geht es.

Der Schritt vom Zähler zum MIPS geht schnell. Weil, jetzt brauchen wir ein WE - an dem Register

Dann müssen wir - schnell einen Multiplexer schreiben, oder ein auswählendes Schaltnetz - dann müssen wir mit den Registern wieder wie vorher mit

Code: Alles auswählen

FOR GENERATE
32 Register zu einem Satz machen.
Antworten