2016-05-06 17 views
0

私はvhdlにシフトレジスタの構造設計を行いました。 WriteShiftが1のときシフトを得て、それが0のときシフトレジスタは価格をロードする。テストベンチでwriteshiftを1に設定すると、ロードは完全に機能しますが、シミュレーションでは00000になります。VHDLのシフトレジスタの構造設計

私のコードは次のようである:

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

あなたがテストベンチを投稿しても、誰かが結果を再現することができます。 –

+0

ロードしない[詳細A](http://i.stack.imgur.com/xVFmh.png)を参照してください。私は非同期リセットを使用していたと推測しました([最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)ではなく)。原因は、4つの入力NANDゲートを負荷入力(Din)またはシフト入力の2:1マルチプレクサとして使用しようとしているためです。マルチプレクサをナンドゲートから外すことはできません。また、WriteShiftとnotWSが両方とも '1'で、後者が前者の反転値であるときにのみ '0'を出すことができます。 3つの入力とゲートを使用することができます。 – user1155120

+0

どこで、00000の値を観測しましたか? 'Writeshift nand not Writeshift = '1'なので、4入力の入力ゲートは常に11111の値を与えます(メタ値は無視します)。そして、私はこの値が変更されずに 'D_FlipFlop'にロードされることを期待しますが、あなたはその実装を公開していません。また、テストベンチを見せてください。エラーがあるかもしれません。 –

答えて

1

あなたの負荷(WriteShift = '1' とEN = '1')のいずれかに動作しません。

シフトレジスタの4つのLSBのビット数をDinqの間で選択するために2:1マルチプレクサが必要な4入力NANDゲートを使用する場合、設計上の欠陥があります。 3つの2入力を使用して1つのマルチプレクサNORゲート:2作成することにより、固定だ

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; 

そして、それは与える:あなたがQに表示

shifregis_tb_fixed.png

(0)はAとの間にDin(4)のシフトインされた値に続いて、B a '0'が出力され、B及びC a '1、C及びD a' 0 '、D及びE a' 1 '及びE及びF a' )、ff4への入力にはマルチプレクサがないからです。

LSBが最初に消滅することがわかります。

反復的にインスタンス化されたコンポーネントは、一般的には、generateステートメントの使用の対象となります。

なしMinimal, Complete, and Verifiable example D_flipflopコンポーネントの非同期リセットを推測して解決する必要がありました。

+0

はい、 'nand4gate'はマルチプレクサで置き換えなければなりません。しかし、これは、 'Writeshift'が1に設定されている場合、OPが00000の値を観測する理由を説明しません。テストベンチにエラーがあるか、コンポーネントがその名前のとおりに動作しません。 –

関連する問題