2012-09-12 106 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;