我试图实现一个比平均RCA更快的加法器。因此,我使用了XILINX库,找到了一个名为adsu8的简单加法器。我想将它嵌入到我最近的VHDL代码中。但因此我必须坚持数据类型BIT和BIT_VECTOR。现在每次我合成时都会弹出一堆像这样的警告:
:Xst:2036 - 在端口上插入OBUF>由黑匣子驱动。可能的模拟不匹配。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- entity of module
entity rca_8bit is
Port ( OP_A : in BIT_VECTOR (7 downto 0);
OP_B : in BIT_VECTOR (7 downto 0);
ADDSUB : in BIT;
SUM : out BIT_VECTOR (7 downto 0);
FLAGS : out BIT_VECTOR (4 downto 0));
end rca_8bit;
-- architecture describes behavior of module
architecture behavioral of rca_8bit is
-- sub-module is declared
component adsu8
port ( A : in STD_LOGIC_VECTOR (7 downto 0);
B : in STD_LOGIC_VECTOR (7 downto 0);
CI : in BIT;
S : out STD_LOGIC_VECTOR (7 downto 0);
CO : out BIT;
OFL : out BIT);
end component;
-- some code to avoid the blackbox warning message of
-- component adsu8 which is implemented from schematics
attribute box_type : string;
attribute box_type of adsu8 : component is "black_box";
-- additional wires std_logic
signal SIG_A,SIG_B,SIG_S : STD_LOGIC_VECTOR (7 downto 0);
-- additional wires bit
signal SIG_SUM : BIT_VECTOR (7 downto 0);
signal SIG_FLAGS : BIT_VECTOR (4 downto 0);
signal SIG_CO,SIG_OFL : BIT;
begin
-- instantiate and do port map
AS8 : adsu8 port map (SIG_A,SIG_B,ADDSUB,SIG_S,SIG_CO,SIG_OFL);
-- convert and forward std_logic to bit
SIG_A <= to_stdlogicvector(OP_A);
SIG_B <= to_stdlogicvector(OP_B);
SIG_SUM <= to_bitvector(SIG_S);
-- assign result
SUM <= SIG_SUM;
-- generate flags
SIG_FLAGS(0) <= SIG_SUM(7) xor SIG_FLAGS(1); -- S (N xor V)
SIG_FLAGS(1) <= SIG_OFL; -- V
SIG_FLAGS(2) <= SIG_SUM(7); -- N (MSB = 0)
SIG_FLAGS(3) <= '1' when SIG_SUM = "00000000" else '0'; -- Z
SIG_FLAGS(4) <= SIG_CO; -- C
-- assign flags
FLAGS <= SIG_FLAGS;
end behavioral;
我对VHDL没有经验,但也不是那么少。但这个问题让我感到困惑并导致头痛。我很感激任何正确方向的解决方案或信息。
提前致谢并提出最好的问候
托比
答案 0 :(得分:0)
在VHDL中,可以定义从一种类型转换为另一种类型的函数。例如,要将std_logic
转换为bit
,您可以编写此函数:
function std_logic_to_bit(t : std_logic) return bit is
variable b : bit;
begin
if (t = '1') then
b := '1';
else
b := '0';
end if;
return b;
end;
当然,也可以编写一个从std_logic
转换为bit
的函数:
function bit_to_std_logic(t : bit) return std_logic is
variable s : std_logic;
begin
if (t = '1') then
s := '1';
else
s := '0';
end if;
return s;
end function;
这些是&#34;虚拟&#34;功能,但它们在VHDL中是必需的,因为没有功能它不可能从一种类型转换为另一种类型。
我希望我帮助过。