我最近开始在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;
正如我之前所说,我是包和函数的新手,我的代码中可能仍然存在语法错误或错误。
答案 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
的端口时,需要将其显式传递给每个函数调用。
请注意,您也可以在架构体中声明您的函数,在这种情况下,函数本身之外的信号将在范围内,只要您声明它是不纯的(并且您不需要)完全参数)。但是,只要您在此处发布了单独的包中的函数,就需要明确地传递它们的参数。无论如何,我不确定你是否想要使用不纯的功能。