vhdl功能包测试

时间:2014-06-10 14:38:57

标签: function vhdl

我最近开始在VHDL中使用函数,我正在尝试调用我在一个VHDL实体中创建的函数包。
首先,这是调用函数以影响3位总线入口的实体代码。

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use work.Func_Pack.ALL;

use IEEE.NUMERIC_STD.ALL;

entity Math_Function is

Port ( clk : in  STD_LOGIC;
       Game_Mode : in  STD_LOGIC;
       Random_Number : in  STD_LOGIC_VECTOR (2 downto 0);
       Modified_Number : out  STD_LOGIC_VECTOR (4 downto 0));
end Math_Function;

architecture Behavioral of Math_Function is

BEGIN

Out_Circuit : PROCESS (clk)

BEGIN

    IF rising_edge(clk) THEN

        IF Game_Mode = '1' THEN
            IF rand = ("001" or "010") THEN
                Modified_Number <= function1;
            ELSIF rand = ("011" or "100") THEN
                Modified_Number <= function2;
            ELSIF rand = ("101" or "110") THEN
                Modified_Number <= function3;
            ELSE
                Modified_Number <= Random_Number;
            END IF;
        ELSE
            Modified_Number <= Random_Number;
        END IF;
    END IF;
END PROCESS Out_Circuit;
end Behavioral;

应该通过一些简单的算术运算来修改名为Random_Number的入口总线的函数包的代码。

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use IEEE.NUMERIC_STD.all;


package Func_Pack is

function rand(Random_Number : std_logic_vector(2 downto 0)) return std_logic_vector;

function function1(Random_Number : std_logic_vector(2 downto 0)) return std_logic_vector;

function function2(Random_Number : std_logic_vector(2 downto 0)) return std_logic_vector;

function function3(Random_Number : std_logic_vector(2 downto 0)) return 
std_logic_vector;


end package;

package body Func_Pack is


function rand(Random_Number : std_logic_vector(2 downto 0)) return std_logic_vector is
variable number : integer range 0 to 9 ;
variable out_number : std_logic_vector(3 downto 0) ;

begin

number := 0;
number := to_integer(unsigned(Random_Number)) ;
out_number := std_logic_vector(to_unsigned(number / 2, 4)) ;
return out_number ;

end rand;

function function1(Random_Number : std_logic_vector(2 downto 0)) 

return

std_logic_vector is
variable number : integer range 0 to 9 ;
variable out_number : std_logic_vector(3 downto 0) ;

begin

number := 0;

number := to_integer(unsigned(Random_Number)) ;

out_number := std_logic_vector(to_unsigned(number mod 2 + 6, 4)) ;

return out_number ; 

end function1;

function function2(Random_Number : std_logic_vector(2 downto 0)) 
return std_logic_vector is

variable number : integer range 0 to 9 ;

variable out_number : std_logic_vector(3 downto 0) ;

begin

number := 0;

number := to_integer(unsigned(Random_Number)) ;

out_number := std_logic_vector(to_unsigned(number + 3, 4)) ;

return out_number ;

end function2;

function function3(Random_Number : std_logic_vector(2 downto 0)) 
return 
std_logic_vector is

variable number : integer range 0 to 9 ;

variable out_number : std_logic_vector(3 downto 0) ;

begin

number := 0;

number := to_integer(unsigned(Random_Number)) ;

out_number := std_logic_vector(to_unsigned(number - number mod 2 + 2, 4));

return out_number ;

end function3;

end package body;

正如我之前所说,我是包和函数的新手,我的代码中可能仍然存在语法错误或错误。

2 个答案:

答案 0 :(得分:1)

此代码的另一个难点是:

    IF rand = ("001" or "010") THEN

相当于

    IF rand = "011" THEN

等等。这意味着永远不能调用function3,因为第二个和第三个分支都是:

    ELSIF rand = "111" THEN

这可能不是您想要的行为。

答案 1 :(得分:0)

尽管缺乏明确的问题,但我认为你遇到了问题:

IF rand = ("001" or "010") THEN
  Modified_Number <= function1;
ELSIF rand = ("011" or "100") THEN
  Modified_Number <= function2;
ELSIF rand = ("101" or "110") THEN
  Modified_Number <= function3;
ELSE
  Modified_Number <= Random_Number;
END IF;

例如,您已经编写了function1,因此需要参数,但您没有提供参数。函数原型是:

function function1(Random_Number : std_logic_vector(2 downto 0)) return std_logic_vector;

调用函数时需要提供必需的参数,例如:

IF rand = ("001" or "010") THEN
  Modified_Number <= function1(rand);

另外要小心,因为你似乎有几个潜在的逐个错误 - 对于一个,你的输出Modified_Number是一个5位向量,但你分配函数的结果,返回{ {1}},只有4位。

(适用编辑)

上面,我错过了out_number本身就是一个带参数的函数的事实。那么你的if语句应该是rand(请参阅Brian的回答,了解其他行的另一个问题,就像你写的那样)。

请确保您了解您在函数中使用的名称的范围。您编写了每个函数来进行参数if rand(Random_Number) = ...。这Random_Number实体的Random_Number输入端口相同 - 它们碰巧具有相同的名称,但它们位于不同的范围内,并且不自动使用输入端口作为其参数。从函数的角度来看,参数的名称(LRM术语是“形式参数”)只是该函数的本地名称。声明一个名为Math_Function的端口时,需要将其显式传递给每个函数调用。

请注意,您也可以在架构体中声明您的函数,在这种情况下,函数本身之外的信号将在范围内,只要您声明它是不纯的(并且您不需要)完全参数)。但是,只要您在此处发布了单独的包中的函数,就需要明确地传递它们的参数。无论如何,我不确定你是否想要使用不纯的功能。