2016-05-06 10 views
0

Ich habe einen strukturellen Entwurf eines Schieberegisters in vhdl gemacht. Wenn WriteShift 1 ist, dann habe ich Shift und wenn es 0 ist, lädt das Shift-Register einen Preis. Obwohl load perfekt funktioniert, wenn ich in der Testbench auf 1 setze, bekomme ich 00000 in der Simulation.Tragwerksplanung von Shift Register in VHDL

Mein Code ist folgende:

entity ShiftRegis is 
    Port (Din : in STD_LOGIC_VECTOR (4 downto 0); 
      WriteShift : in STD_LOGIC; 
      Clock : in STD_LOGIC; 
       reset : in STD_LOGIC; 
       En : in STD_LOGIC; 
      Q : out STD_LOGIC_VECTOR (4 downto 0)); 
end ShiftRegis; 

architecture Behavioral of ShiftRegis is 

component notGate 
    Port (in0 : in STD_LOGIC; 
      out0 : out STD_LOGIC); 
end component; 

component nand4Gate 
    Port (i0 : in STD_LOGIC; 
      i1 : in STD_LOGIC; 
      i2 : in STD_LOGIC; 
      i3 : in STD_LOGIC; 
      bitOut : out STD_LOGIC); 
end component; 

component D_FlipFlop 
    Port (Din : in STD_LOGIC; 
      En : in STD_LOGIC; 
      Q : out STD_LOGIC; 
       reset : in STD_LOGIC; 
      Clk : in STD_LOGIC); 
end component; 

signal q4, q3, q2, q1, in3, in2, in1, in0, notWS : std_logic; 

begin 

ff4 : D_FlipFlop 
    port map(Din => Din(4), 
      En => En, 
      Q => q4, 
       reset => reset, 
      Clk => Clock); 

ff3 : D_FlipFlop 
    port map(Din => in3, 
      En => En, 
      Q => q3, 
       reset => reset, 
      Clk => Clock); 

ff2 : D_FlipFlop 
    port map(Din => in2, 
      En => En, 
      Q => q2, 
       reset => reset, 
      Clk => Clock); 

ff1 : D_FlipFlop 
    port map(Din => in1, 
      En => En, 
      Q => q1, 
       reset => reset, 
      Clk => Clock); 

ff0 : D_FlipFlop 
    port map(Din => in0, 
      En => En, 
      Q => Q(0), 
       reset => reset, 
      Clk => Clock); 

notg4 : notGate 
    port map(in0 => WriteShift, 
       out0 => notWS); 

nandg3 : nand4Gate 
    port map(i0 => Din(3), 
      i1 => notWS, 
      i2 => WriteShift, 
      i3 => q4, 
      bitOut => in3); 

nandg2 : nand4Gate 
    port map(i0 => Din(2), 
      i1 => notWS, 
      i2 => WriteShift, 
      i3 => q3, 
      bitOut => in2); 

nandg1 : nand4Gate 
    port map(i0 => Din(1), 
      i1 => notWS, 
      i2 => WriteShift, 
      i3 => q2, 
      bitOut => in1); 

nandg0 : nand4Gate 
    port map(i0 => Din(0), 
      i1 => notWS, 
      i2 => WriteShift, 
      i3 => q1, 
      bitOut => in0); 

Q(4) <= q4; 
Q(3) <= q3; 
Q(2) <= q2; 
Q(1) <= q1; 

end Behavioral; 
+0

Wenn Sie Ihre Testbench auch posten, kann eine andere Person Ihre Ergebnisse reproduzieren. –

+0

Wird nicht geladen Siehe auch [Detail A] (http://i.stack.imgur.com/xVFmh.png). Ich vermutete, dass Sie einen asynchronen Reset verwendeten (kein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve)). Die Ursache ist, dass Sie versuchen, 4 Eingangs-NAND-Gatter als 2: 1-Multiplexer entweder für den Lasteingang (Din) oder den Shift-Eingang zu verwenden. Sie können keinen Multiplexer aus nur einem NAND-Gatter machen. Beachten Sie auch, dass Sie nur eine '0' erhalten können, wenn WriteShift und notWS beide '1' sind und letzteres der invertierte Wert des ersten ist. Sie könnten 3 zwei Eingänge oder Gatter verwenden. – user1155120

+0

Wo und wann haben Sie einen Wert von 00000 beobachtet? Die 4 Eingabe-NAND-Gatter geben immer den Wert 11111 (unter Vernachlässigung von Meta-Werten), weil "Writeshift nand not Writeshift = '1'" ist. Und ich erwarte, dass dieser Wert unmodifiziert in den 'D_FlipFlop' geladen wird, aber Sie haben seine Implementierung nicht offenbart. Bitte zeigen Sie uns auch Ihre Testbench, vielleicht ist der Fehler dort. –

Antwort

1

Ihre Last (WriteShift = '1' und en = '1') funktioniert auch nicht.

Es gibt einen Konstruktionsfehler, wo Sie 4-Eingangs-NAND-Gatter verwenden, wo Sie einen 2: 1-Multiplexer für die Auswahl zwischen Din und q Bits für die vier LSBs im Schieberegister benötigen.

Das durch die Schaffung von 2 festgelegt ist: 1-Multiplexer mit drei 2-Eingang-NOR-Gatter:

architecture behavioral of shiftregis is 

    component notgate 
     port ( 
      in0: in std_logic; 
      out0: out std_logic 
     ); 
    end component; 

    -- component nand4gate 
    --  port (
    --   i0:  in std_logic; 
    --   i1:  in std_logic; 
    --   i2:  in std_logic; 
    --   i3:  in std_logic; 
    --   bitout: out std_logic 
    -- ); 
    -- end component; 

    component nor2gate 
     port (
      i0:  in std_logic; 
      i1:  in std_logic; 
      bitout: out std_logic 
     ); 
    end component; 

    component d_flipflop 
     port ( 
      din: in std_logic; 
      en:  in std_logic; 
      q:  out std_logic; 
      reset: in std_logic; 
      clk: in std_logic 
     ); 
    end component; 

    signal q4, q3, q2, q1, in3, in2, in1, in0, notws: std_logic; 

    signal nor2g0a, nor2g0b: std_logic; -- ADDED 
    signal nor2g1a, nor2g1b: std_logic; -- ADDED 
    signal nor2g2a, nor2g2b: std_logic; -- ADDED 
    signal nor2g3a, nor2g3b: std_logic; -- ADDED 
begin 

ff4: 
    d_flipflop 
     port map (
      din => din(4), 
      en => en, 
      q => q4, 
      reset => reset, 
      clk => clock 
     ); 

ff3: 
    d_flipflop 
     port map (
      din => in3, 
      en => en, 
      q => q3, 
      reset => reset, 
      clk => clock 
     ); 

ff2: 
    d_flipflop 
     port map (
      din => in2, 
      en => en, 
      q => q2, 
      reset => reset, 
      clk => clock 
     ); 

ff1: 
    d_flipflop 
     port map (
      din => in1, 
      en => en, 
      q => q1, 
      reset => reset, 
      clk => clock 
     ); 

ff0: 
    d_flipflop 
     port map (
      din => in0, 
      en => en, 
      q => q(0), 
      reset => reset, 
      clk => clock 
     ); 

notg4: 
    notgate 
     port map (
      in0 => writeshift, 
      out0 => notws 
     ); 

-- norg3: 
--  nand4gate 
--   port map (
--    i0 => din(3), 
--    i1 => notws, 
--    i2 => writeshift, 
--    i3 => q4, 
--    bitout => in3 
--  ); 

norg3a: 
    nor2gate 
     port map (
      i0 => din(3), 
      i1 => writeshift, 
      bitout => nor2g3a 
     ); 
norg3b: 
    nor2gate 
     port map (
      i0 => notws, 
      i1 => q4, 
      bitout => nor2g3b 
     ); 

nor3gc: 
    nor2gate 
     port map (
      i0 => nor2g3a, 
      i1 => nor2g3b, 
      bitout => in3 
     ); 

-- norg2: 
--  nand4gate 
--   port map (
--    i0 => din(2), 
--    i1 => notws, 
--    i2 => writeshift, 
--    i3 => q3, 
--    bitout => in2 
--  ); 

norg2a: 
    nor2gate 
     port map (
      i0 => din(2), 
      i1 => writeshift, 
      bitout => nor2g2a 
     ); 
norg2b: 
    nor2gate 
     port map (
      i0 => notws, 
      i1 => q3, 
      bitout => nor2g2b 
     ); 

nor2gc: 
    nor2gate 
     port map (
      i0 => nor2g2a, 
      i1 => nor2g2b, 
      bitout => in2 
     ); 


-- norg1: 
--  nand4gate 
--   port map (
--    i0 => din(1), 
--    i1 => notws, 
--    i2 => writeshift, 
--    i3 => q2, 
--    bitout => in1 
--  ); 

norg1a: 
    nor2gate 
     port map (
      i0 => din(1), 
      i1 => writeshift, 
      bitout => nor2g1a 
     ); 
norg1b: 
    nor2gate 
     port map (
      i0 => notws, 
      i1 => q2, 
      bitout => nor2g1b 
     ); 

nor1gc: 
    nor2gate 
     port map (
      i0 => nor2g1a, 
      i1 => nor2g1b, 
      bitout => in1 
     ); 

-- norg0: 
--  nand4gate 
--   port map (
--    i0 => din(0), 
--    i1 => notws, 
--    i2 => writeshift, 
--    i3 => q1, 
--    bitout => in0 
--  ); 

norg0a: 
    nor2gate 
     port map (
      i0 => din(0), 
      i1 => writeshift, 
      bitout => nor2g0a 
     ); 
norg0b: 
    nor2gate 
     port map (
      i0 => notws, 
      i1 => q1, 
      bitout => nor2g0b 
     ); 

nor0gc: 
    nor2gate 
     port map (
      i0 => nor2g0a, 
      i1 => nor2g0b, 
      bitout => in0 
     ); 

    q(4) <= q4; 
    q(3) <= q3; 
    q(2) <= q2; 
    q(1) <= q1; 

end architecture behavioral; 

und das gibt:

shifregis_tb_fixed.png

Wo Sie auf q sehen (0), dass zwischen A und B a '0' wird ausgegeben, B und C a '1, C und D a' 0 ', D und E a' 1 'und E und F a' 1 ', folgend auf die verschobenen Werte für Din (4), weil es keinen Mux am Din-Eingang zu ff4 gibt.

Sie werden feststellen, dass das LSB zuerst ausgeht.

Wiederholt instanziierte Komponenten können im Allgemeinen ein Ziel für die Verwendung von Generate-Anweisungen sein.

Ohne eine Minimal, Complete, and Verifiable example musste ich auf einen asynchronen Reset für die D_flipflop Komponente erraten und entschieden haben.

+0

Ja, das 'nand4gate' muss durch einen Multiplexer ersetzt werden. Dies erklärt jedoch nicht, warum das OP einen Wert von 00000 feststellt, wenn 'Writeshift' auf 1 gesetzt ist. Es gibt entweder einen Fehler in der Testbench oder die Komponenten verhalten sich nicht so, wie ihre Namen vermuten lassen. –