Tojur
Tojur

Reputation: 191

Shared variable in VHDL

I'm new in vhdl (with ISE project navigator) and I'm having a little problem to synthesize this program (sequence.vhd):

LIBRARY ieee ;
USE ieee.std_logic_1164.all;

PACKAGE mypack IS
VARIABLE counter: STD_LOGIC := '0' ;
VARIABLE simultaneous : STD_LOGIC := '0' ;
END PACKAGE mypack;

LIBRARY ieee ;
USE ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;


--library work;

USE WORK.mypack.ALL;

ENTITY secuencia IS

PORT(
    polh            : IN    STD_LOGIC; --uno
    polv            : IN    STD_LOGIC; --cero
    seq            : OUT   std_logic_vector(8 downto 0):= (others => 'Z')
);

END secuencia;


ARCHITECTURE registro OF secuencia IS

SIGNAL stack : std_logic_vector(1000 downto 0);


BEGIN
PROCESS(polh, polv)
 BEGIN

        IF (polh'event) and (polh='1') and (polv='0')THEN
            stack(counter) <= '1';
            counter := counter +1;

        ELSE IF (polv'event) and (polv='1') and (polh='0')THEN
            stack(counter) <= '0';
            counter := counter +1;
        ELSE IF (polh'event) and (polh='1') and (polv'event) and 
(polv='1') THEN
            simultaneous := simultaneous+1;

        END IF;

END PROCESS;

END registro;

And these are the first two errors:

Line 5. Only SHARED variables can be declared here.

Line 6. Only SHARED variables can be declared here.

So the problem is with my declared variables... The purpose is use them in the architecture. I'm sure is a newbie problem but I can't see the solutions. Thx a lot!

PD: I couldn't format properly the code, sorry


UPDATE:

Thx for helping @Martin Thompson . I did what you suggested and now im having a different type or problem. I've been searching about it but it seems to have a broad range of causatives. Here it is the code

ENTITY secuencia IS
PORT(
    polh            : IN    STD_LOGIC; --uno
    polv            : IN    STD_LOGIC; --cero
    Pedido      : IN    STD_LOGIC; 
    DatoListo   : OUT    STD_LOGIC; 
    seq            : OUT   std_logic_vector(1000 downto 0):= (others =>   'Z')

);
END secuencia;


ARCHITECTURE registro OF secuencia IS

SIGNAL stack : std_logic_vector(1000 downto 0);


BEGIN

PROCESS(polh, polv, Pedido) 

variable counteria : natural;
 variable Listo : integer;
 variable simultaneo : integer;
 BEGIN
    IF (counteria < 1000) THEN

       IF (polh'event AND polh='1' AND polv='0') THEN
        --IF (polh='1' AND polv='0') THEN
            stack(counteria) <= '1';
            counteria := counteria +1;


         ELSIF (polv'event AND polv='1' AND polh='0') THEN
         --ELSIF (polv='1' AND polh='0') THEN    
                stack(counteria) <= '0';
                counteria := counteria +1;                 

        ELSIF (polh'event AND polh='1' AND polv'event AND polv='1') THEN
           simultaneo := simultaneo+1;

END IF;

    ELSIF (counteria = 1000)THEN
      DatoListo <='1';
          IF (Pedido='1')THEN
               Seq  <= stack;            
           counteria := 0;
       DatoListo <='0';
            END IF;                                 
    END IF;

END PROCESS;
END registro;

and it gives this error

line 25: Signal stack> cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.


UPDATE 2:

I have make some changes and commenting a part of the program, it synthesize:

PROCESS(polh, polv, Pedido) 

     variable counteria : natural := 0;
     variable Listo : integer;
     variable simultaneo : integer;
 BEGIN
    IF (counteria < 1000) THEN
       IF rising_edge(polh) THEN
            IF (polv='0') THEN
               stack(counteria) <= '1';     
               counteria := counteria + 1;
            END IF;
--     ELSIF rising_edge(polv)  THEN
--          IF (polh='0') THEN
--             stack(counteria) <= '0';
--             counteria := counteria +1;                  
--          END IF;
--     END IF;

       ELSIF (counteria = 1000)THEN
           DatoListo <='1';
              IF (Pedido='1')THEN
                  Seq   <= stack;            
           counteria := 0;
           DatoListo <='0';
       ENDIF;                                           

    END IF;

END PROCESS;
END registro;

This Synthesize. However when I uncomment the ELSIF rising_edge(polv) THEN part, it presents the same problem: Signal stack<counteria<9:0>> cannot be synthesized...

Upvotes: 0

Views: 16700

Answers (1)

Martin Thompson
Martin Thompson

Reputation: 16792

Don't use shared variables for now. You need to understand some basics first.

If you need to "send" the value of counter out to somewhere else, add an item to the port and write it to there.

If (as it appears) you just want to use it as storage, declare it within the process you use it within.

Finally, if you hope to synthesize this, you need to have a clock signal coming in through the port and you need to make a standard clocked process:

If you want to find when your polh and polv inputs change, you have to store the previous value and check if it's different to the current value.

process (clk)
    variable vpol_last : std_logic;
begin
  if rising_edge(clk) then
       if vpol_last /= vpol then -- it's changed
       -- do something
       end if;
       vpol_last := vpol; -- store current value for next time.
       -- etc.
  end if;
end process;

Upvotes: 5

Related Questions