我在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负边缘触发]
答案 0 :(得分: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;
非对称延迟用于确保Q
或QN
首先设置,然后反馈设置另一个。
答案 1 :(得分: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;
答案 2 :(得分: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;
这是正确的代码