VHDL中子程序的条目

时间:2014-06-20 06:07:44

标签: vhdl

我的代码中有两个函数:

 function derivative(error, previous_error, dt :in std_logic_vector(7 downto 0)) return std_logic_vector is
  variable derivative_val: std_logic_vector(15 downto 0);
  begin
      derivative_val := div(sub(error,previous_error),dt);
      return derivative_val;
  end derivative;


function mul(num1,num2 : in std_logic_vector(7 DOWNTO 0)) return std_logic_vector is
    variable v_TEST_VARIABLE1 : integer;
    variable v_TEST_VARIABLE2 : integer;
    variable n_times: integer:=1;
    variable product: integer:=0;
    begin 
       v_TEST_VARIABLE1 := to_integer(unsigned(num1)) ; 
       v_TEST_VARIABLE2 := to_integer(unsigned(num2)) ;
      for n_times in 1 to v_TEST_VARIABLE2 loop
        product:=product + v_TEST_VARIABLE1;
      end loop;
    return std_logic_vector(to_unsigned(product,16));
  end mul;

在后半部分我试图分配一个变量。

 variable derivative_term: std_logic_vector(15 downto 0) := x"0000";
  derivative_term := mul(mul(Kp,Td), derivative(error, previous_error,dt));

编译时,我得到了:

No feasible entries for subprogram "mul".

有没有其他方法可以使用它? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

mul函数接受类型为num*的参数std_logic_vector(7 downto 0),因此长度为8,并返回长度为std_logic_vector的结果 16。

因此,当调用mul(mul(...), ...)时,外部mul获得第一个参数 类型std_logic_vector的长度为16,与要求不匹配 函数的参数长度。

您可以使用"*"来代替编写自己的乘法函数 ieee.numeric_std,可以用作:

slv_16_0 <= std_logic_vector(unsigned(slv_8_0) * unsigned(slv_8_1));

它还处理未知值,如'X',结果长度为总和 这两个论点的长度。