Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
17268 Discussions

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

Altera_Forum
Honored Contributor II
8,519 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,304 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,304 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,304 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,304 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,304 Views

Remove the Else from the reset and clock condition.

0 Kudos
Altera_Forum
Honored Contributor II
6,303 Views

Thank you for the help, 

 

sincerely ,  

 

Katon
0 Kudos
Reply