2016-12-04 6 views
1

2つのエラーを持つ並列ループがあります。これは、ファイル内の唯一のコードです。 次のエラーが表示されます。私はあなたの助けに感謝します。どうすればこの問題を解決できますか?ユニットフィルタ(4)のVHDL信号出力[3]は、以下の複数のドライバに接続されています。

信号はユニットフィルタにおける出力1(4)は、以下の複数のドライバに接続されている:

ユニットフィルタにおける

信号フラグ(4)は、以下の複数のドライバに接続されている :


最小完全かつ検証例に作成OPの EDAPlayground link

library ieee; 
use ieee.std_logic_1164.all; 
-- use IEEE.STD_LOGIC_ARITH.ALL; 
-- use IEEE.std_logic_unsigned.ALL ; 

entity ex_case is 
    port (output: out std_ulogic_vector(3 downto 0)); 
end entity ex_case; 
    -- signal flag1: boolean := '0'; -- this declaration does not belong here 
architecture a1 of ex_case is 
    signal flag1: std_ulogic := '0'; -- was erroneously type boolean 
begin 

loop1: 
    for j in 0 to 3 generate -- for loop outputting data 
     flag1 <= '0';  -- reset the flag, same as output_ready 
loop2: 
     for i in 0 to 3 generate 
      output(j) <= '1' when i >= j and flag1 = '0' else 
         '0' when flag1 = '0'; 
      flag1 <=  '1' when i >= j and flag1 = '0'; -- output when valid data is available 
     end generate loop2; 
    end generate loop1; 
end architecture a1; 

から注:FLAG1と出力の両方の種類は、アルゴリズムのエラーの両方にトンを可能にするために、未解決のタイプに変更されていますo明らかにする。


これはエラーメッセージです:出力の推論されたラッチの問題があります enter image description here enter image description here

enter image description here

enter image description here

+0

'Output(j)'にはn個の並行シグナル割り当てがあり、 'flag'にはn x n個の同時シグナル割り当てがあります。 IEEE Std 1076-2008 11.8ステートメントの生成、14.5.3ステートメントの生成、14.5.2ブロックステートメント、14.5を参照してください。5他の同時ステートメント*すべての同時シグナル割り当てステートメントと並行するアサーションステートメントの作成は、同等のプロセスステートメントの作成とそれに続く同等のプロセスステートメントの作成で構成されます。* Output(j)とフラグを駆動する複数のプロセスがあります。 [MCVE](http://stackoverflow.com/help/mcve)を提供してください。 – user1155120

+0

このテストケースではn = 4 – Hamoudy

+0

実際には、[最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)を提供していません。この時点で質問を削除しないでください([VHDL:信号は複数のドライバに接続されています:](http://webcache.googleusercontent.com/search?q=cache:VMRndGKZYZ8J:stackoverflow.com/questions/40952689/vhdl-signal-is-connected-to-following-multiple-ドライバー+ & cd = 1 & hl = en & ct = clnk & gl = nz&amp))、削除された質問は60日以内に復活することができ、質問を編集することができます。完全なエラーステートメントを表示します。 – user1155120

答えて

1

。これは、同時信号割り当てに存在する 条件によって発生し、合成で報告されます。ラッチを避けたい

したがって、最小、完全、および検証可能な例では、ネストされたfor generateステートメントによって生成されたすべてのプロセスで、すべてのflag1ドライバに対して組み合わせORを提供するようにこの例を変更できます(14.5.5その他の同時実行ステートメント同時シグナル割り当てステートメントと並行アサーションステートメントは、同等のプロセスステートメントの構成とそれに続く同等のプロセスステートメントの作成から構成されます。)。

は、我々はまた、指定されたループ文を生成するための外側と内側を指定するセレクタを提供したいoutput(j)outputに貢献:

この分析
library ieee; 
use ieee.std_logic_1164.all; 

entity ex_case is 
    port (output: out std_ulogic_vector(3 downto 0)); 
end entity ex_case; 
architecture foo of ex_case is 
    signal flag1: std_ulogic := '0'; 
    constant n: natural := 4; 
    function reduce_or (input: std_logic_vector) return std_logic is 
     variable retval: std_logic; 
    begin -- MAY BE replace by "or" -2008, or by different reduction function 
     retval := '0'; 
     for i in input'range loop 
      retval := retval or input(i); 
     end loop; 
     return retval; 
    end function; 
    function firstflag (iflag: std_logic_vector) return integer is 
    begin 
     for i in iflag'range loop 
      if To_bit(iflag(i)) = '1' then 
       return i; 
      end if; 
     end loop; 
     return iflag'LEFT; -- This will park on iflag' when no flag is set 
    end function; 
    signal iflag: std_logic_vector(0 to n - 1); 
    subtype iflag_subtype is std_logic_vector(iflag'range); 
begin 

loop1: 
    for j in 0 to n - 1 generate 
     type output_array is array (0 to n - 1) of std_logic; 
     signal ioutput: output_array; 
     signal jselect: natural range 0 to n - 1; 
    begin 
     -- flag1 <= '0'; -- REMOVED -- reset the flag, same as output_ready 
loop2: 
     for i in 0 to n - 1 generate 
      signal iflag: std_logic_vector (0 to n - 1); 
     begin 
      ioutput(j) <= '1' when i >= j and iflag(j) = '0' else 
          '0'; 
      iflag(i) <= '1' when i >= j else 
         '0'; -- output when valid data is available 
      iflag(j) <= reduce_or(iflag); 
     end generate loop2; 
     output(j) <= ioutput(firstflag(iflag)); -- A Multiplexer 
    end generate loop1; 

    flag1 <= '1' when iflag /= iflag_subtype'(others => '0') else 
      '0'; 
end architecture foo; 

、詳しく説明してシミュレート(印象的な何もしないが、発揮しながら一つだけあります特定の出力のソース)。

出力をスイッチバックタイプstd_logic_vectorに戻すことができます.n x nスイッチの出力ポートのアドレスをフラグと出力を '1'に割り当てる条件として追加することもできます。

ツールチェーンがサポートしているVHDL標準のリビジョンまたは使用可能なパッケージによっては、既存の関数または単項演算子「-2008」を使用せずに関数reduce_orを削除することができます)。

出力ポートのアドレスも条件として指定しないと、この例を完全にテストすることはできません。

+1

あなたの例にそのアドレスがあったら、私はそれをシミュレートしたでしょう。 – user1155120

関連する問題