我想从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做到这一点?
答案 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
,并保存类型转换。