2012-09-12 99 views
-1

我是新的VHDL(ISE與項目導航),我有一個小問題,合成這種程序(sequence.vhd):共享變量的VHDL

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; 

而這些都是前兩錯誤:

第5行。只能在這裏聲明SHARED變量。

第6行只有SHARED變量可以在這裏聲明。

所以問題是與我聲明的變量...目的是在架構中使用它們。我敢肯定這是一個新手問題,但我看不到解決方案。多謝!

PD:我無法正確地格式化代碼,對不起


UPDATE:

THX幫助@馬丁·湯普森。我做了你的建議,現在我有一個不同的類型或問題。我一直在尋找它,但它似乎有廣泛的原因。這是代碼

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; 

,並讓此錯誤

線25:信號疊加>不能合成,壞 同步描述。您在 中使用的描述樣式描述了在當前軟件版本中支持的同步元素(寄存器,內存等)不是 。


更新2:

我必須做出一些改變和評論節目的一部分,它合成:

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; 

這種合成。但是,當我取消註釋ELSIF rising_edge(polv) THEN部分時,它提出了相同的問題:Signal stack<counteria<9:0>> cannot be synthesized...

回答

4

現在不要使用共享變量。你首先需要了解一些基礎知識。

如果您需要將counter的值「發送」到其他地方,請將項目添加到port並寫入該項目。

如果(因爲它看起來)你只是想用它作爲存儲,你可以在process之內聲明它。

最後,如果你希望合成這一點,你需要有通過port進來的時鐘信號,你需要做一個標準時鍾過程:

如果你想找到的時候你POLH和聚{輸入更改,您必須存儲以前的值並檢查它是否與當前值不同。

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;