1

我正在为modelsim上的jk触发器编写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 触发器下降沿触发]

见图片: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
在每个周期中,计算描述中所有信号的值。如果作为该计算的结果,在给定信号上发生了事件,则对该信号敏感的过程语句将恢复并作为模拟周期的一部分执行。

在您的代码中:

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 回答