Vhdl Can';t发现问题并生成锁存

Vhdl Can';t发现问题并生成锁存,vhdl,Vhdl,我的代码生成两个锁存器,请有人帮我找到原因吗? 根据Xilinx,ISE锁存是由“try_counter”生成的,它是一个计数器,用于计算错误的数字序列的次数。(这是我代码的要点) 我不知道还能做什么 entity moore is Port ( badgeSx : in STD_LOGIC; badgeDx : in STD_LOGIC; col : in std_logic_vector (1 to 3); row

我的代码生成两个锁存器,请有人帮我找到原因吗? 根据Xilinx,ISE锁存是由“try_counter”生成的,它是一个计数器,用于计算错误的数字序列的次数。(这是我代码的要点)

我不知道还能做什么

entity moore is
Port ( badgeSx : in  STD_LOGIC;
            badgeDx : in  STD_LOGIC;
            col : in std_logic_vector (1 to 3);
            row : in std_logic_vector (1 to 4);
            clk : in std_logic;
            rst : in std_logic;
            unlock : out  STD_LOGIC
        );
end moore;

architecture Behavioral of moore is
type stato is (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9);
    signal current_state,next_state : stato;
    signal badge : std_logic_vector(1 downto 0);
    signal count, new_count: integer range 0 to 28;
    signal temp_unlock : std_logic :='0';
    signal timeover : std_logic :='0';
begin
    badge <= badgeDx & badgeSx; --concatenazione dei badge
--processo sequenziale
    current_state_register: process(clk)
    begin
    if rising_edge(clk) then
        if (rst = '1') then 
            current_state <= s0; 
            count <= 0;
        else 
            current_state <= next_state; 
            count <= new_count;
    end if;
end if;
end process;


process (current_state,badge,col,row,timeover)
    variable try_counter: integer range 0 to 3;
    begin
    case current_state is

    when s0 =>
        try_counter := 0;
        temp_unlock <= '0';
        unlock <='0';
        if(badge ="01" and row = "0000" and col = "000" ) then
            next_state <= s1;
        else 
            next_state <= s0;
        end if;

    when s1 =>
        temp_unlock <= '1';
        unlock <= '0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s2;
        elsif (timeover ='1' or badge = "10" or try_counter = 3) then
            next_state <= s0;
        else 
            next_state <= s1;
            try_counter := try_counter +1;
        end if; 

    when s2 => 
        temp_unlock <= '0';
        unlock <='0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s2;
        else
            next_state <= s3;
        end if;

    when s3 =>
        temp_unlock <= '1';
        unlock <= '0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s4;
        elsif (timeover ='1' or badge = "10" or try_counter = 3) then
            next_state <= s0;
        else 
            next_state <= s1;
            try_counter := try_counter +1;
        end if;

    when s4 =>
        temp_unlock <= '0';
        unlock <='0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s4;
        else
            next_state <= s5;
        end if;

    when s5 =>
        temp_unlock <= '1';
        unlock <= '0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s6;
        elsif (timeover ='1' or badge = "10" or try_counter = 3) then
            next_state <= s0;
        else 
            next_state <= s1;
            try_counter := try_counter +1;
        end if;

    when s6 =>
        temp_unlock <= '0';
        unlock <='0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s6;
        else
            next_state <= s7;
        end if;

    when s7 =>
        temp_unlock <= '1';
        unlock <= '0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s8;
        elsif (timeover ='1' or badge = "10" or try_counter = 3) then
            next_state <= s0;
        else 
            next_state <= s1;
            try_counter := try_counter +1;
        end if;

    when s8 =>
        temp_unlock <= '0';
        unlock <='0';
        if (badge = "00" and col ="001" and row = "0001" and timeover = '0') then
            next_state <= s8;
        else
            next_state <= s9;
        end if;

    when s9 =>
        temp_unlock <= '0';
        unlock <= '1';
        if (badge = "10") then
            next_state <= s0;
        else
            next_state <= s5;
        end if;
    when others =>
     next_state <= s0;
    end case;
  end process;

Contatore_TIMER : process(temp_unlock,count)
 begin
   if temp_unlock = '1' then 
          if count = 28 then 
             new_count<=0;
             timeover<='1';
          else
             new_count<=count+1;
             timeover<='0';
          end if;
   else 
       new_count<=0;
       timeover <= '0';
   end if;
   end process;
 end Behavioral;
实体摩尔是
端口(badgeSx:标准_逻辑中;
badgeDx:标准逻辑中;
列:标准逻辑向量(1到3);
行:标准逻辑向量(1到4);
clk:标准逻辑中;
rst:标准逻辑中;
解锁:输出标准逻辑
);
结束摩尔;
摩尔的建筑是
stato is型(s0、s1、s2、s3、s4、s5、s6、s7、s8、s9);
信号当前_状态,下一_状态:stato;
信号标识:标准逻辑向量(1到0);
信号计数,新计数:整数范围0到28;
信号温度解锁:标准逻辑:='0';
信号超时:标准逻辑:='0';
开始

badge在与
过程(当前状态、badge、col、row、timeover)
明显组合的过程中,变量
try\u计数器
用于存储信息(顺序行为),仅在触发过程评估时更新。这很可能会生成2个锁存,这与
try\u counter
的值范围0到3相匹配

要解决此问题,您可以将
try_counter
定义为信号,并将其包含在过程的灵敏度列表中


try\u计数器
作为信号也将简化调试,因为当前状态可以很容易地在波形中检查。

在与
过程(当前状态、徽章、列、行、超时)的明显组合过程中
,变量
try\u计数器
用于存储信息(顺序行为),仅在触发流程评估时更新。这很可能会生成2个锁存,这与
try\u counter
的值范围0到3相匹配

要解决此问题,您可以将
try_counter
定义为信号,并将其包含在过程的灵敏度列表中


try_计数器
作为信号也将简化调试,因为可以在波形中轻松检查当前状态。

我将try_计数器从变量切换为信号(信号try_计数器:整数范围0到3);我还更改了try_counter:=try_counter+1;进入try_计数器为避免锁存,必须在条件语句的每个分支中为try_计数器信号指定一个值。否则,需要为没有显式赋值的分支存储值的最后一个状态,这需要一个锁存器。我如何在代码中实现这一点?我的意思是我只需要在第一个状态下分配try_计数器,因为我需要尽可能地增加它(最大值3),并且我需要保存它的值,直到try_计数器达到3为止。在这种情况下是否可以避免锁存?您必须查看更新
try_counter
的条件,因为在上面的代码中,它是根据灵敏度列表中的信号事件进行更新的,这可能不是您实际想要的。
try\u计数器的赋值和更新可能会进入
current\u state\u register
过程或类似的时钟过程,因此它会在时钟边缘进行更新,就像常规同步状态一样。但同样,这取决于您想要实现的实际功能。@MortenZilmer Try\u计数器需要在每次有人获得错误代码时更新,我代码的要点是识别徽章和正确的数字序列(我将其设置为1-1-1-1)然后,如果我做了3次错误尝试,机器将返回第一个状态,我需要再次扫描徽章,而如果我做了少于3次错误尝试,它将进入第二个状态,在第二个状态中,我不必再次扫描徽章。切换的try_计数器从变量扫描到信号(信号try_计数器:整数范围0到3);我还更改了try_counter:=try_counter+1;进入try_计数器为避免锁存,必须在条件语句的每个分支中为try_计数器信号指定一个值。否则,需要为没有显式赋值的分支存储值的最后一个状态,这需要一个锁存器。我如何在代码中实现这一点?我的意思是我只需要在第一个状态下分配try_计数器,因为我需要尽可能地增加它(最大值3),并且我需要保存它的值,直到try_计数器达到3为止。在这种情况下是否可以避免锁存?您必须查看更新
try_counter
的条件,因为在上面的代码中,它是根据灵敏度列表中的信号事件进行更新的,这可能不是您实际想要的。
try\u计数器的赋值和更新可能会进入
current\u state\u register
过程或类似的时钟过程,因此它会在时钟边缘进行更新,就像常规同步状态一样。但同样,这取决于您想要实现的实际功能。@MortenZilmer Try\u计数器需要在每次有人获得错误代码时更新,我代码的要点是识别徽章和正确的数字序列(我将其设置为1-1-1-1)然后,如果我做了三次错误的尝试,机器就会返回到第一个状态,我需要再次扫描一个徽章,而如果我做了少于三次错误的尝试,它就会进入第二个状态,我不必再次扫描徽章