Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
15 years ago

VHDL Counter

I am new to VHDL, and I am trying to create a counter that will count up from 0 to X when a signal called enable will be true.

I get errors like Latches are generated for incomplete case or if statements. I don't know how to code it.

A signal called enable will drop low and before it goes low the counter is incrementing. What I want ideally is to use this counter and get the counts at the point where enable goes low.

A second counter picks up the ball (same counter instantiated twice) in the mean time I want to the counts of the first count to be zero before I use it.

The error I get is this

Found 16-bit latch for signal <cnts_out>. Latches may be generated from incomplete case or if statements. We do not recommend the use of latches in FPGA/CPLD designs, as they may lead to timing problems.

I don't know what to put on the else statement of this process...

can someone help please write a counter:

1. Count up

2. transfer the counts only when enable goes low

3. next time it is used it should start from zero up!

Help

rjrodrig@yahoo.com

pOut: process(enable,r_reg)

begin

if(enable ='0') then -- If the enable drops low then transfer the counts

cnts_out<= std_logic_vector(r_reg); --Typecast into bus vector

--temp <= std_logic_vector(r_reg); -- Keep the last counts

--else

-- cnts_out <= temp;

end if;

end process;


--Entry port 
entity Counter is
     generic(N: integer :=16);                   --Scale it to 20bits counter
    port ( clk         : in  STD_LOGIC;
           enable        : in     STD_LOGIC;        --Enable this counter
              reset        : in  STD_LOGIC;
              max_ticks    : out std_logic;
              cnts_out     : out  STD_LOGIC_VECTOR (N-1 downto 0));
end Counter;
architecture Behavioral of Counter is
signal r_reg: unsigned(N-1 downto 0):=x"0000";
begin
    
    pCntr: process(clk,reset,enable)                        --Counter process
        begin
            if(reset = '1') then
                r_reg <= (others => '0');
            elsif (clk'event and clk='1' and enable ='1') then          
                    r_reg <= r_reg + 1;                        --Increment 
            end if;
    end process;
    
    --Output logic
    --Only transfer the last count when enable goes low!   
 pOut: process(enable,r_reg)
    begin
        if(enable ='0') then                                    -- If the enable drops low then transfer the counts
            cnts_out<= std_logic_vector(r_reg);            --Typecast into bus vector
        end if;
    end process;
--Set an overflow Flag in due case we reach the maximum counts
    max_ticks <= '1' when r_reg = (2**N-1) else '0';    --Overflow counter indicator    
end Behavioral;

16 Replies