Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
17241 Discussions

Error (10818): (does not hold its value outside the clock edge)

Altera_Forum
Honored Contributor II
8,441 Views

Hello, 

 

I am trying to build a pulse counter that shoud be connected to an external switch and count the times the user push the button. 

moreover i need to output: result,result+1,result +2.  

 

i have written the next code and it works graet on model sim but quartus dosent like it, i an getting the error: 

Error (10818): Can't infer register for "q2_int[X]" at counter.vhd(32) because it does not hold its value outside the clock edge. 

 

for every bit, someone has an idea how to solve it? 

 

the code is: 

 

 

--- Quote Start ---  

library ieee; 

use ieee.std_logic_1164.all; 

use IEEE.std_logic_unsigned.all;  

 

entity counter is port ( 

load : in std_logic;  

q,q1,q2 : buffer std_logic_vector (4 downto 0));  

end entity; 

architecture rtl of counter is 

signal q_int : std_logic_vector (4 downto 0):="00000"; 

signal q1_int : std_logic_vector (4 downto 0):="00000"; 

signal q2_int : std_logic_vector (4 downto 0):="00000"; 

begin 

process (load,q_int) 

begin 

if (q_int="00000") then 

q<="LLLLL"; 

q1_int<="LLLLH"; 

q2_int<="LLLHL"; 

else 

 

end if; 

if (rising_edge(load)) then 

q_int <= q_int + 1; 

 

q1_int<=q1_int + 1; 

 

q2_int<=q2_int + 1; 

end if; 

end process; 

q <= q_int;  

q1 <= q1_int; 

q2 <= q2_int;  

end rtl; 

 

--- Quote End ---  

 

 

thanks alot 

Pini Sberro
0 Kudos
6 Replies
Altera_Forum
Honored Contributor II
6,226 Views

The recommended way of writing a process that can be synthesized is the following: 

process(clock,reset) begin if (reset = '1') then -- reset conditions elsif (rising_edge(clock)) then -- clocked operations end if; end process;The reset part is optional, but recommended. 

 

I think that in your case the synthesizer is confused by your first if in the process and doesn't know what to do with it. It isn't a reset condition, and you are assigning signal values outside of a clock edge. You should change your first part as a real reset condition, or scrap it and give correct initial values to q_int, q1_int and q2_int. You could also keep only one counter and assign its value +1 or +2 to the correct output. 

You shouldn't need to use the L and H values if you do everything inside the clocked part of the process.
0 Kudos
Altera_Forum
Honored Contributor II
6,226 Views

Basically there are 2 problems: 

 

1. It thinks "load" is a clock. On the edge of load, Q_int is updated along with Q1_int and Q2_int 

 

2. Now that Q_int has changed, it changes Q1 and Q2 int to fixed values, so now these things that were clocked, are no longer clocked. 

 

Now, because you dont have a clock - you dont have to do your logic inside a process. But I think you really could use a clock, like Daixiwen suggests. 

 

One big issue though, appears to be that you're trying to write the code without understanding the hardware that you're describing.
0 Kudos
Altera_Forum
Honored Contributor II
6,226 Views

Thank you very much. 

its working! 

 

Tricky, about ur comment: 

appears to be that you're trying to write the code without understanding the hardware that you're describing 

it was very usfull for me so thanks again
0 Kudos
Altera_Forum
Honored Contributor II
6,226 Views

I am having the same problem too - Error 10818 (does not hold its value outside the clock edge) and 10822 (couldn't implement registers for assignment on this clock edge) but i cant understand what changes do i need to do. 

 

I am trying to build a Counter that count the time user successfully catches a number 8. 

If it is, then a logic '1' will be sent out and a signal will record the times of success events and sent out too. 

 

I have another question is "can i use rising_edge to detect any change of logic value for any time of signal ? std_logic / unsigned / integer .. etc .... 

 

Here is the code 

 

 

--- Quote Start ---  

 

library IEEE; 

use IEEE.std_logic_1164.all; 

use IEEE.std_logic_arith.all; 

 

entity catch is 

port ( 

PUSH : in std_logic; 

COMP : in unsigned(3 downto 0); 

RST : in std_logic; 

INC_FREQ : out integer range 1 to 10; 

SCORE_COUNT : out std_logic 

); 

end catch; 

 

architecture catch_arch of catch is 

 

signal var_INC_FreQ : integer range 1 to 10; 

 

begin  

 

process (RST,PUSH,COMP)  

 

begin 

 

if RST = '0' then 

 

var_INC_FREQ <= 1; 

 

elsif rising_edge(PUSH) then 

 

if COMP = 8 then 

 

SCORE_COUNT <= '1'; 

 

var_INC_FREQ <= var_INC_FREQ + 1; 

 

end if;  

 

else 

 

SCORE_COUNT <= '0'; 

 

end if; 

 

end process; 

 

INC_FREQ <= var_INC_FREQ; 

 

end catch_arch;  

 

 

 

--- Quote End ---  

 

 

Thanks alot !
0 Kudos
Altera_Forum
Honored Contributor II
6,226 Views

Remove the Else from the reset and clock condition.

0 Kudos
Altera_Forum
Honored Contributor II
6,225 Views

Thank you for the help, 

 

sincerely ,  

 

Katon
0 Kudos
Reply