在VHDL中添加两个bit_vector返回错误“(vcom-1581)中缀运算符'+'没有可行条目。”

时间:2017-11-07 14:23:22

标签: vhdl modelsim

这是我在VHDL中将二进制转换为BCD的代码

bcdout_temp := ('0' & bin) + ('0' & temp);

问题是当我尝试在行

中添加两个bit_vector时

(vcom-1581) No feasible entries for infix operator '+'.

使用“+”运算符,我得到错误

@import

现在,我查看了网页,大多数解决方案适用于我使用std_logic_vector的时候。

如果我使用std_logic_vector,但是当我使用bit_vector时,代码工作正常。

对于我收到错误的原因,是否有任何问题的解决方案?

2 个答案:

答案 0 :(得分:1)

如果使用ieee.numeric_bit_unsigned.all(VHDL-2008的一部分),则可以添加位向量。您正在使用的numeric_std包未定义位向量的添加。

答案 1 :(得分:1)

如果您发现旧的CAD实验室软件不支持numeric_bit_unsigned,您可以使用类型转换,numeric_bit包含已签名和未签名类型的声明:

library ieee;
use ieee.numeric_bit.all;

entity bin2bcd is
    port (bin : in bit_vector(3 downto 0) := "0000";
        clk : in bit;
        bcdout : out bit_vector(4 downto 0) := "00000");
end bin2bcd;

architecture bin2bcdarch of bin2bcd is
begin
    process(clk)
    variable gt9 : bit;
    variable temp : unsigned(3 downto 0) := "0110";  -- was bit_vector
    variable bcdout_temp : unsigned(4 downto 0);     -- was bit vector
    begin 
        if clk'event and clk = '1' then
            gt9 := bin(3) and(bin(2) or bin(1));
            if gt9 = '1' then
                bcdout_temp := '0' & unsigned(bin) + ('0' & temp);  -- type conversion
            else
                bcdout_temp := '0' & unsigned(bin); -- type conversion
            end if;
        end if;
    bcdout <= bit_vector(bcdout_temp);  -- type conversion
    end process;
end bin2bcdarch;

注意temp也可以是类常量而不是变量,除了初始值之外,它不会被赋值。

从使用WARP2的评论到合成(可能是CPLD)我记得它最初是为了使用AHDL作为输入描述而开发的,并且支持VHDL和Verilog是事后的想法。

您可能会看到基于VHDL构造的限制映射到合成支持的AHDL结构的限制。

处理此类限制的方法可能是将设计的麻烦部分描述为数据流描述:

entity bin2bcd is
    port (
        bin:    in  bit_vector(3 downto 0);
        clk:    in  bit;
        bcdout: out bit_vector(4 downto 0)
    );
end entity bin2bcd;

architecture dataflow of bin2bcd is
    signal bcdout_temp:     bit_vector(4 downto 0);
begin

    bcdout_temp(4) <=  bin(3) and ( bin(2) or bin(1) ); -- gt9

    bcdout_temp(3) <=  not bcdout_temp(4) and bin(3);   --  zero if gt9 

    bcdout_temp(2) <=  (    bin(3) and bin(2) and bin(1)) or
                       (not bin(3) and bin(2));

    bcdout_temp(1) <= (    bcdout_temp(4) and not bin(1)) or -- gt9 XOR bin(1)
                      (not bcdout_temp(4) and     bin(1));

    bcdout_temp(0) <= bin(0);                           -- doesn't change

REG5:
    process (clk)
    begin
        if clk'event and clk = '1' then
            bcdout <= bcdout_temp;
        end if;
    end process;
end architecture;

虽然不能保证这会更好(尽管可能),但它也可以模拟为带有测试平台的VHDL:

library ieee;
use ieee.numeric_bit.all;

entity bin2bcd_tb is
end entity;

architecture foo of bin2bcd_tb is
    signal bin:         bit_vector(3 downto 0);
    signal clk:         bit;
    signal bcdout:      bit_vector(4 downto 0);
begin

DUT:
    entity work. bin2bcd (dataflow)
        port map (
            bin => bin,
            clk => clk,
            bcdout => bcdout
        );

CLOCK:
    process
    begin
        wait for 5 ns;
        clk <= not clk;
        if now > 160 ns then
            wait;
        end if;
    end process;

STIMULI:
    process
    begin
        for i in 0 to 2 ** bin'length - 1 loop
            bin <= bit_vector(to_unsigned(i, bin'length));
            wait for 10 ns;
        end loop;
        wait;
    end process;
end architecture;

并显示它给出了正确的结果:

binc2bcd.png

bin以十进制显示,而bcdout以十六进制显示。