找不到问题并生成了闩锁

时间:2019-01-04 11:52:49

标签: 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 : 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;

该代码几乎按预期工作(我是说它可以编译并且没有收到任何错误),但是RTL原理图不是它应该的,因为它在该过程中综合了锁存器。

Latches

1 个答案:

答案 0 :(得分:2)

在与process (current_state,badge,col,row,timeover)的明显组合过程中,变量try_counter用于存储信息(顺序行为),该信息仅在触发过程评估时才更新。这很可能会生成2个锁存器,它们与try_counter的值范围从0到3匹配。

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

try_counter用作信号也将简化调试,因为可以轻松地通过波形检查当前状态。