我有这个单位的一些问题,我不知道它为什么不工作。平台ISE Project Navigator给了我这个错误:unit automat:the following signal(s) form a combinatorial loop
。我想收到一些建议,如果你能告诉我如何解决这个问题。
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
entity automat is
port(CLK,EN,SEN,MONED:in STD_LOGIC;
COMP:STD_LOGIC_VECTOR(2 DOWNTO 0);
REN,MEN,ENR,IM_REST,REST,BILET,CLK_EN,RESET: out STD_LOGIC;
S1,S2,com:out STD_LOGIC_VECTOR(1 downto 0)
);
end automat;
architecture arh_automat of automat is
type STARE is(A,B,C,D,E,F,G,H,I,J);
signal ST,NXST:STARE;
begin
tranzitie:process(CLK,ST,EN,SEN,MONED,COMP)
begin
REN<='0';MEN<='0';clk_en<='0';RESET<='0';
ENR<='0';IM_REST<='0';REST<='0';BILET<='0';
S1<="00";S2<="00";com<="00";
case ST is
when A=>NXST<=B;
com<="00";
if(CLK'EVENT and CLK='1') then
if EN='1' then
ST<=B;
else
ST<=A;
end if;
END IF;
when B=>NXST<=C ;
RESET<='1';
com<="01";
if(CLK'EVENT and CLK='1') then
if EN='1' then
ST<=C;
else
ST<=B;
end if;
end if;
when C=>NXST<=D;
REN<='1';
CLK_EN<='1';
com<="10";
if(CLK'EVENT and CLK='1') then
if SEN ='1' then
ST<=D;
else
ST<=C;
end if;
end if;
when D=>NXST<=E ;
s1<="01";
s2<="10";
com<="10";
if(CLK'EVENT and CLK='1') then
if MONED='1' then
ST<=E;
else
ST<=F;
end if;
end if;
when E=>NXST<=F;
com<="00";
if(CLK'EVENT and CLK='1') then
ST<=F;
end if;
when F=>NXST<=G ;
MEN<='1';
com<="00";
if(CLK'EVENT and CLK='1') then
if COMP="010" or COMP="100" then
ST<=G;
else
ST<=C;
end if;
end if;
when G=>NXST<=H;
ENR<='1';
S1<="00";
S2<="11";
com<="00";
if(CLK'EVENT and CLK='1') then
if COMP="100" OR COMP="001" OR COMP="010" then
ST<=H;
else
ST<=I;
end if;
END IF;
when H=>NXST<=J;
REST<='1';
BILET<='1';
com<="00";
if(CLK'EVENT and CLK='1') then
ST<=J;
end if;
when I=>NXST<=J;
IM_REST<='1';
BILET<='1';
com<="00";
if(CLK'EVENT and CLK='1') then
ST<=J;
end if;
when J=>NXST<=A;
com<="00";
if(CLK'EVENT and CLK='1') then
ST<=A;
end if;
end case;
end process tranzitie;
end arh_automat;
答案 0 :(得分:0)
你不知道哪些信号正在形成循环,但是你的过程&amp;案例结构写得不好。
尝试将组合和同步信号拆分为单独的进程。你的计时也搞砸了。在同步过程中,只使用一个&#34; CLK&#39; EVENT和CLK =&#39; 1&#39;&#34;陈述与其下的案例陈述。
答案 1 :(得分:0)
组合循环是指您将某些组合逻辑的输出反馈回自身。我能想到的最基本的例子是:
My_PROC : process(A)
begin
A <= not A;
end process;
显然不可能合成这个。 很难弄清楚你的代码中发生了什么,但你需要寻找一些组合逻辑的输出反馈到自身的情况。就像@lsf_design所说,你应该拆分组合和时钟同步逻辑。我建议使用here描述的格式。
我会尝试为您的信号提供更具描述性的名称。不要使用A,B,C等作为州名,而是将它们命名为实际描述该案例的内容。