Signal temp2 cannot be synthesized, bad synchronous description

后端 未结 2 2123
长情又很酷
长情又很酷 2020-12-07 06:22
entity timer is
    Port ( click : in  STD_LOGIC;
           clear : out  STD_LOGIC;
           t_unlock : out  STD_LOGIC);
end timer;

architecture Behavioral of ti         


        
相关标签:
2条回答
  • 2020-12-07 06:25

    Your code seems to mix concepts of HDL and "software" languages. I'm not sure what it's supposed to do, but I would refactor it into the code below

    architecture Behavioral of timer is
        constant COUNTER_VALUE_TO_REACH_15ns : integer := <some value>;
    
        signal temp2   : integer range 0 to 20 := 0;
        signal divider : std_logic_vector(7 downto 0) := (others => '0');
    begin
        process
        begin
            -- Everything happens when the clock ticks, except for reset
            if rising_edge(click) then
                temp2    <= 0;
                clear    <= '0';
                t_unlock <= '0';
    
                -- Count how many cycles until we need to increment temp2
                if divider = COUNTER_VALUE_TO_REACH_15ns then
                    temp2   <= temp2 + 1;
                    divider <= (others => '0'); -- Reset the counter when we reach the required amount of time
                else
                    divider <= divider + 1;
                end if;
    
                if temp2 = 6 then
                    clear <= '1';
                elsif temp2 = 20 then
                    t_unlock <= '1';
                end if;
    
            else
            end if;
        end process;
    end Behavioral;
    
    0 讨论(0)
  • 2020-12-07 06:36

    The VHDL has to follow some synthesis tool specific coding guidelines, for the tool to be able to translate the VHDL code into the FPGA implementation. For implementation to a flip-flop with asynchronous reset, the style can be:

    process (clk, rst) is
    begin
      -- Clock
      if rising_edge(clk) then
        ... -- Update at clock
      end if;
      -- Asynchronous reset
      if rst = '1' then
        ... -- Update at reset
      end if;
    end process;
    

    In the case of your code it looks like you are not using the asynchronous reset, thus the template may be reduced to:

    process (clk) is
    begin
      if rising_edge(clk) then
        ... -- Update at clock
      end if;
    end process;
    

    The exercise is now for you to fit your code into that template, and unfortunately it is pretty hard to determine the exact intention based on the provided code.

    0 讨论(0)
提交回复
热议问题