【问题标题】:Subprocedure call in VHDLVHDL中的子过程调用
【发布时间】:2011-01-18 13:13:55
【问题描述】:

我有两个嵌套程序,其中“主”程序 利用“subproc”将结果累积到变量中 t0 和 t1,然后在最后返回。这应该都是 在一个时钟周期内计算,电路或多或少 仅由简单的逻辑门(xor、or、and)组成。当我尝试 描述电路如下我得到以下错误:

Acutal (variable t0) for formal "a" is not a signal

这是有道理的,因为子采购需要信号作为输入, 但我想在主要过程中传递一个变量。是 有一种简单的方法可以通过强制转换来规避这个问题 例子?

谢谢

procedure subproc
(
  signal a : in  std_logic_vector(31 downto 0);
  signal b : in  std_logic_vector(31 downto 0);
  signal c : in  std_logic_vector(31 downto 0);
  signal d : in  std_logic_vector(31 downto 0);    
  signal e : out std_logic_vector(31 downto 0);
  signal f : out std_logic_vector(31 downto 0)    
)
is
  variable x : std_logic_vector(31 downto 0);
  variable y : std_logic_vector(31 downto 0);    
begin

  x := (others => '0');
  y := (others => '0');

  for i in 0 to 31 loop
      x(i) := (a(i) xor b(i)) and (c(i) xor d(i));
      y(i) := (a(i) xor b(i)) or ((d(i) xor c(i)) xor b(i));
  end loop;

  e <= x(31 downto 0);
  f <= y(31 downto 0);

end;

procedure main
(
  signal a : in  std_logic_vector(31 downto 0);
  signal b : in  std_logic_vector(31 downto 0);
  signal r : out std_logic_vector(31 downto 0)
)
is
  variable res : std_logic_vector(31 downto 0);
  variable t0, t1 : std_logic_vector(31 downto 0);
  constant c : std_logic_vector(31 downto 0) := X"fedcba90";
  constant d : std_logic_vector(31 downto 0) := X"7654321f";       
begin

  t0 := (others => '0');
  t1 := (others => '0');

  for i in 0 to 31 loop
    if ( (c(i) = '0') && (d(i) = '1') ) then
       subproc( t0, t1, 
                a, b, t0, t1 );
    end if;              
  end loop;

  r <= t0;
end;      

【问题讨论】:

    标签: hardware vhdl


    【解决方案1】:

    首先,您的“if”子句是用 C 风格编写的。你想说:

    if (c(i) = '0') and (d(i) = '1') then
    

    但问题实际上是您将过程描述为将信号作为参数。如果要将结果分配给变量,则需要声明不同的过程签名:

    procedure subproc (
    signal a : in  std_logic_vector(31 downto 0);
    signal b : in  std_logic_vector(31 downto 0);
    signal c : in  std_logic_vector(31 downto 0);
    signal d : in  std_logic_vector(31 downto 0);
    variable e : out std_logic_vector(31 downto 0);
    variable f : out std_logic_vector(31 downto 0))
    

    但是,你还需要把所有的赋值都改成ef,这样它们就是变量赋值:

    e := x(31 downto 0);
    

    【讨论】:

      【解决方案2】:

      为什么不直接将 subproc 参数定义为变量而不是信号?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多