这是我在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时,代码工作正常。
对于我收到错误的原因,是否有任何问题的解决方案?
答案 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;
并显示它给出了正确的结果:
bin以十进制显示,而bcdout以十六进制显示。