我是VHDL的初学者。我正在尝试声明一个包以添加 2 个 4 位 STD_LOGIC_VECTOR 并返回 4 位 STD_LOGIC_VECTOR 结果和 1 位进位

问题描述 投票:0回答:1

我正在使用 Xilinx ISE 工具。

遵循的步骤:-

  1. 在 Xilinx ISE 中创建了一个项目。
  2. 添加了 VHDL 包作为源。
  3. 编写代码来声明包以添加两个 4 位 STD_LOGIC_VECTOR 并返回 4 位 STD_LOGIC_VECTOR 结果和 1 位 STD_LOGIC 进位。
  4. 在项目中添加了另一个新源(VHDL 模块),只需编写代码即可查看我的包是否正常工作。
  5. 编写了一个测试平台,通过向 DUT 添加另一个新源(VHDL 测试平台)来验证 DUT。

当我检查 TB 的行为检查语法时,它编译时带有 2 个警告:

警告 1:- 第 39 行:子程序 <"+"> 不符合其声明。 警告 2:- 第 39 行:函数“+”并不总是返回值。

无论如何,我都模拟(使用模拟行为模型)TB,但没有显示任何波形。

请指导我解决这个问题。

代码如下:-

VHDL 封装:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

package my_package is

function "+" (a,b : std_logic_vector)
return std_logic_vector;

end package my_package;

package body my_package is

function "+" (a,b : std_logic_vector(3 downto 0))
return std_logic_vector is
    
variable result : std_logic_vector (3 downto 0) := "0000";
variable carry : std_logic := '0';

begin

for i in a'reverse_range loop
result(i) := a(i) xor b(i) xor carry;
carry := (a(i) and b(i)) or (b(i) and carry) or (a(i) and carry);
end loop;
end "+";

end package body my_package;

VHDL 模块:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.my_package.all;

entity my_package_check is
Port ( A : in  STD_LOGIC_VECTOR (3 downto 0);
B : in  STD_LOGIC_VECTOR (3 downto 0);
C : in  STD_LOGIC;
res : out  STD_LOGIC_VECTOR (3 downto 0);
Cout : out  STD_LOGIC);
end my_package_check;

architecture Behavioral of my_package_check is
SIGNAL Z : STD_LOGIC_VECTOR (4 downto 0);
begin
Z <= A + B;
res <= Z (3 downto 0);
Cout <= Z(4);
end Behavioral;

VHDL 测试台:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY my_package_checktb IS
END my_package_checktb;

ARCHITECTURE behavior OF my_package_checktb IS 

COMPONENT my_package_check
PORT(
C : IN std_logic;
A : IN std_logic_vector(3 downto 0);
B : IN std_logic_vector(3 downto 0);
res : OUT std_logic_vector(3 downto 0);
Cout : OUT std_logic
);
END COMPONENT;

SIGNAL C :  std_logic :='0';
SIGNAL A :  std_logic_vector(3 downto 0) := "0000";
SIGNAL B :  std_logic_vector(3 downto 0) := "0000";
             
SIGNAL Cout :  std_logic;
SIGNAL res :  std_logic_vector(3 downto 0);
          

BEGIN

uut: my_package_check PORT MAP(
A => A,
B => B,
C => C,
res => res,
Cout => Cout
);

A <= "0000", "1111" after 100 ns;
B <= "0000", "1111" after 100 ns;

END;

注意:- 由于通过刺激过程提供输入的测试向量,导致错误,我使用了不同的方法来提供测试向量。

目的:- 获取输出波形并验证包中声明的“+”函数的功能。

vhdl fpga xilinx hdl subproject
1个回答
0
投票

您的自定义

"+"
函数没有 return 语句。它需要以以下内容结尾:

Return carry & result;
© www.soinside.com 2019 - 2024. All rights reserved.