VHDL:如何将生成块的迭代器转换为std_logic_vector?

时间:2017-12-05 14:00:00

标签: vhdl

我想从generate中的整数中获取二进制std_logic_vector。

例如,

0 - > 0000

1 - > 0001

2 - > 0010

...

15 - > 1111

我可以为每个整数编写16个if-else语句,但我不喜欢这个想法。 (如果我有超过16个整数,该怎么办?)

我试过使用两种方法,但它们都不起作用: 地址和命中都是std_logic_vector

G_1 : for i in 0 to 15 generate
    address <= conv_std_logic_vector(i, 4) when hit(i) = '1';
end generate G_1;   

G_2 : for i in 0 to 15 generate
    address <= std_logic_vector(to_unsigned(i, 4)) when hit(i) = '1';
end generate G_2;

另外我注意到如果我使用数字而不是i,它就可以了。 (示例:我得到&#34; 0101&#34;当我使用conv_std_logic_vector(5,4)时)

我做错了什么?有没有办法用vhdl做到这一点?

1 个答案:

答案 0 :(得分:2)

首先,不要use ieee.std_logic_arith.all。取而代之的是use ieee.numeric_std.all,并摆脱任何讨厌的conv_integer函数;首选样式是使用类似unsigned的类型,然后在第二个代码示例中转换或转换它们。

转到循环,您正在使用generate循环:

G_1 : for i in 0 to 15 generate
  address <= conv_std_logic_vector(i, 4) when hit(i) = '1';
end generate G_1;

这将生成以下形式的16行:

address <= conv_std_logic_vector(0, 4) when hit(0) = '1';
address <= conv_std_logic_vector(1, 4) when hit(1) = '1';
address <= conv_std_logic_vector(2, 4) when hit(2) = '1';

等。由于每个并发分配都会推断出自己的过程,因此您的设计将在address信号上有多个驱动程序,这在合成符合条件的设计中是不允许的。

似乎目标是根据address向量中的最低集('1')位设置hit。这称为优先编码器。这样的事情会更好:

process (hit)
begin
  for i in 0 to 15 loop
    address <= (others => '0');  -- Default assignment, any later assignment takes priority
    if (hit(i) = '1') then
      address <= std_logic_vector(to_unsigned(i, address`length));
      exit;
    end if;
  end loop;
end process;

由于address似乎代表无符号数,因此您可以对此信号使用类型unsigned,并保存类型转换。