首页 文章

VHDL中的共享变量

提问于
浏览
0

我是vhdl的新手(使用ISE项目导航器),我有一个小问题来合成这个程序(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;

这些是前两个错误:

第5行 . 此处只能声明SHARED变量 . 第6行 . 这里只能声明SHARED变量 .

所以问题在于我声明的变量......目的是在架构中使用它们 . 我确定是一个新手问题,但我看不到解决方案 . 多谢!

PD:抱歉,我无法正确格式化代码


更新:

感谢帮助@Martin Thompson . 我做了你的建议,现在我有不同的类型或问题 . 我一直在寻找它,但它似乎有广泛的使役 . 这是代码

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...

1 回答

  • 5

    暂时不要使用共享变量 . 您首先需要了解一些基础知识 .

    如果你需要将 counter 的值 counter 输出到其他地方,请将项目添加到 port 并将其写入那里 .

    如果(看起来像)你只想将它用作存储,请在 process 中声明它,你可以在其中使用它 .

    最后,如果你希望综合这个,你需要通过 port 输入一个时钟信号,你需要制作一个标准的时钟进程:

    如果要查找polh和polv输入何时更改,则必须存储先前的值并检查它是否与当前值不同 .

    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;
    

相关问题