2016-04-13 25 views
1

私は加算器ブロックを持っており、加算器の入力ポートの1つに出力を戻す必要があります(これは別のエンティティが使用されるエンティティ)。私はprocesssensitivity listで実行しようとしましたが、動作しませんでした。そうする方法はありますか? 注:クロックは使用されません。ここでvhdlブロックの出力をその入力にフィードバックする

が私のコードです:あなたのコードで

library IEEE; 
use IEEE.std_logic_1164.all; 

entity example is 
port ( 
    X: IN std_logic_vector(15 downto 0); 
    Y: IN std_logic_vector(15 downto 0); 
    Z: OUT std_logic_vector(15 downto 0) 
    ); 
end example; 

architecture arch_example of example is 
    component adder is 
    port(a: in std_logic_vector(15 downto 0); 
     b: in std_logic_vector(15 downto 0); 
     cin: in std_logic; 
     s: out std_logic_vector(15 downto 0); 
     overflow: out std_logic); 
    end component; 
    signal s, ain, bin: std_logic_vector(15 downto 0); 
    signal cin, overflow, useless: std_logic; 
begin 
    process(x, y) is 
    begin 
     ain <= x; 
     bin <= y; 
     cin <= '0'; 
    end process; 
    process(s, overflow) is 
    begin 
     ain <= s; 
     bin <= "1111111110000001"; 
     cin <= overflow; 
    end process; 
    U1: adder port map (ain, bin, cin, s, overflow); 
    z <= s; 
end arch_example; 
+0

。しかし、 "クロックが使用されていません"と言っているのはちょっと心配です。_combinational feedback_は同期デザインではないので、実行しないでください。 –

+0

上記のコードは、私が何をしたいのか、何か提案していますか? @MatthewTaylor – kamal

答えて

1

2つのプロセスが同時にこれらの信号を駆動しているので、あなたはcin信号ainbinのための複数のドライバを持っている、と。同じ電線を駆動する2つのゲートと考えることができます。

中間結果に別の数値を追加するには、完全に組み合わせた設計で2番目の加算器が必要です。最初の加算器は再利用できません。マルチプレクサなどで新しい入力にいつ切り替えるかを簡単には伝えられないからです。 (これは、非同期論理の概念により可能となり、それははるかに複雑である。)

簡単な解決策は、二回あなたの加算コンポーネントをインスタンス化することである。

architecture arch_example of example is 
    component adder is 
    port(a: in std_logic_vector(15 downto 0); 
     b: in std_logic_vector(15 downto 0); 
     cin: in std_logic; 
     s: out std_logic_vector(15 downto 0); 
     overflow: out std_logic); 
    end component; 
    signal s : std_logic_vector(15 downto 0); 
    signal overflow : std_logic; 
begin 
    U1: adder port map (x, y, '0', s, overflow); 
    U2: adder port map (s, "1111111110000001", overflow, z, open); 
end arch_example; 

コードスニペットは、上記の位置割り当てを使用しコンポーネントポート。これは、ポートの順序を簡単に混ぜることができるので避けるべきです。代わりに名前付き代入を使用することをお勧めします。ここで1は、明示的に(=>の左側)どのポート(右側)を信号に割り当てられて見ることができます:あなたは私たちにいくつかのコードまたはあなたが達成しようとしているかを説明するための図を与える必要が

architecture arch_example of example is 
    component adder is 
    port(a: in std_logic_vector(15 downto 0); 
     b: in std_logic_vector(15 downto 0); 
     cin: in std_logic; 
     s: out std_logic_vector(15 downto 0); 
     overflow: out std_logic); 
    end component; 
    signal s : std_logic_vector(15 downto 0); 
    signal overflow : std_logic; 
begin 
    U1: adder port map (
     a => x, 
     b => y, 
     cin => '0', 
     s => s, 
     overflow => overflow); 

    U2: adder port map (
     a => s, 
     b => "1111111110000001", 
     cin => overflow, 
     s => z, 
     overflow => open); 
end arch_example; 
+0

私が知っている限り、最初の 'process'は' X'と 'Y'の入力が変化したときに実行され、' s'と 'overflow'が変更されたときに実行されます。したがって、最初の 'process'、' ain <= X'と 'bin <= Y'(他の値は提供されていません)では、加算器は' s'と 'overflow'を生成し、今は 'ain'と' bin'に新しい値が与えられています。したがって、「ain」と「bin」には同時に異なる値を割り当てるべきではありません。私の分析で何が間違っていますか? – kamal

+0

@mhmdhsenkamalしかし、プロセスが最後に中断されたとしても、最初のプロセスからのシグナルの割り当ては残ります。そして、各プロセスは、シミュレーションの開始後に一度実行されるため、両方のプロセスは、シミュレーションの起動 - >複数のドライバで異なる値を割り当てます。 –

+0

多くの感謝!私は別の加算器を追加しないようにしていましたが、別の選択肢がないようです。 – kamal

関連する問題