1

modelsim で jk-flip-flop の vhdl コードを書いていますが、シミュレートしようとするとエラーが発生します: エラー: 時間 0 ns で反復制限に達しました。

それが何を意味するのかはわかりませんが、ソースコードの多くを調べてエラーがないか調べましたが、成功しませんでした。誰が問題が何であるかを推測できますか?

library ieee;
use ieee.std_logic_1164.all;


entity SRlatch is
port(S,R:in bit; Q : inout bit ; QN : inout bit := '1');
end SRlatch;

architecture structural of SRlatch is
begin
Q <=  S nand QN;
QN <= R nand Q;
end;


entity JKFlipFlopStruct is
port(J,K,clk : in bit ; Q : inout bit ; QN : inout bit);
end JKFlipFlopStruct;

architecture structural of JKFlipFlopStruct is

  component SRlatch is
   port(S,R:in bit; Q : inout bit ; QN : inout bit := '1');
  end component;

  signal J0,K0,J1,K1,J2,K2 : bit;

begin

  J0 <= not ( J and QN and clk) );
  K0 <= not ( K and Q and clk) );

  f1 : SRlatch port map ( J0,K0,J1,K1 );

  J2 <= not ( J1 and (not clk) );
  K2 <= not ( K1 and (not clk) );
  f2 : SRlatch port map ( J2,K2,Q,QN );

end structural;

[JK Flop Flop ネガティブエッジトリガー]

画像を参照してください: http://i.stack.imgur.com/J3m1J.gif

4

3 に答える 3

1

Russell が言うように、このエラーは通常、ModelSim が無限ループに陥っていることを示しています。VHDL では、信号がセンシティビティ リストに配置され、この信号がプロセスで変更された場合に発生する可能性があります。

簡単な例:

process (sig)
begin
  sig <= not sig;
end;

あなたの問題もこの場合です。しかし、いくつかの違いがあります。

1. 並行シグナル割り当てステートメントには、同じ意味を持つ同等のプロセス ステートメントがあります。(詳細については、 VHDL LRM 93 $9.5を参照してください)

したがって、あなたのコードでは、

J0 <= not ( J and QN and clk) );  

の略記です

process
begin
   J0 <= not ( J and QN and clk) );
   wait on J, QN, clk;
end process;

また

process (J, QN, clk)
begin
    J0 <= not ( J and QN and clk) );
end process;

その他の同時実行ステートメントは同じです。

2. シミュレーション サイクルについて(VHDL LRM 93 $12.6.4 およびDelta Delaysを参照)
eacy サイクルでは、説明内のすべての信号の値が計算されます。この計算の結果、特定のシグナルでイベントが発生した場合、そのシグナルにセンシティブなプロセス ステートメントが再開され、シミュレーション サイクルの一部として実行されます。

あなたのコードで:

f2 : SRlatch port map ( J2,K2,Q,QN );

それは同等のプロセスです:

process (J2, K2)
begin
   Q <=  J2 nand QN;
   QN <= K2 nand Q; 
end process;

他のプロセスと一緒に無限ループを作ります。
例えば、

the J-K Flip-Flop is stable @ 100 ns + 0 delta time
J or K or clk changes       @ 100 ns + 0 delta time
J0 or K0          \ ---
J1 or K1              |__ cost several delta times
J2 or K2              |   Suppose that Q changes @ 100 ns + 3 delta time
Q or QN  changes  / ---     
Then the value of K0 will change again!!
This result in a infinite loop becase 100 ns + n delta time = 100 ns. Time never advanceds.

解決策:
1. デザインをシーケンシャルにします (つまり、同期クロックを使用します)。

process (clk)
begin
    if (rising_edge(clk)) then
        -- signal assignment
    end if;
end process;  

2.遅延割り当てを使用します。したがって、SRlatch.vhd には次のように記述します。

Q <=  S nand QN after 1 ns;
QN <= R nand Q after 2 ns;

非対称遅延を使用して、 または のいずれQQNが最初に設定され、次にフィードバックが他方を設定するようにします。

同様の質問も参照してください: Debugging Iteration Limit error in VHDL Modelsim

于 2013-10-01T16:25:40.210 に答える
0
library ieee;
use ieee.std_logic_1164.all;

entity SRlatch is
  port(S,R:in bit; Q : inout bit := '0' ; QN : inout bit := '1');
end SRlatch;

architecture structural of SRlatch is
begin
  Q <=  S nand QN;
  QN <= R nand Q;
end structural;

entity JKFlipFlopStruct is
  port(J,K,clk : in bit ; Q : inout bit ; QN : inout bit:= '1');
end JKFlipFlopStruct;

architecture structural of JKFlipFlopStruct is

  component SRlatch is
   port(S,R:in bit; Q : inout bit ; QN : inout bit := '1');
  end component;

  signal J1 : bit;
  signal J0,K0,K1,J2,K2 : bit:= '1';

begin

  J0 <= not ( J and QN and (not clk) );
  K0 <= not ( K and Q and (not clk) );

  f1 : SRlatch port map ( J0,K0,J1,K1 );

  J2 <= not ( J1 and clk );
  K2 <= not ( K1 and clk );

  f2 : SRlatch port map ( J2,K2,Q,QN );

end structural;

これは正しいコードです

于 2013-10-02T18:20:05.037 に答える
0

反復制限は、設計にフィードバック ループを作成し、シミュレーターを非常に怒らせたことを意味します。ループを解決できません。

J0 と K0 を設定するには、クロック プロセスを使用します。

jk_flippy_floppy : process (clk)
begin
  if rising_edge(clk) then
     J0 <= not ( J and QN );
     K0 <= not ( K and Q  );
  end if;
end process jk_flippy_floppy;
于 2013-10-01T14:34:39.293 に答える