我正在开发一个BIST引擎的描述,我的经理已经要求我从Verilog过渡到VHDL。我对VHDL非常生疏,我无法找到正确的数据类型给我的代码中的地址寄存器。大多数情况下,地址用于索引数组。
data : std_logic_vector (2**W-1 downto 0);
...
output = data(addr);
有时候,我需要执行按位操作(例如,此代码在地址中找到最不重要的1):
least_one(0) <= addr(0);
PRIORITY_ENCODER : for i in 1 to (W-1) generate
least_one(i) <= addr(i) and not or_reduce(addr(i-1 downto 0));
end generate PRIORITY_ENCODER;
least_one(W) <= not or_reduce(addr);
最后,当溢出时,我也依赖地址包裹而没有问题(即1111 + 1 = 0,0-1 = 1111)。
因此,鉴于所有这些不同的用途,我将为该地址提供什么数据类型或子类型?当我使用整数和相关类型时,我在执行按位运算时会出错:
ncvhdl_p: *E,APNPFX (filename,17|20): can not make sense of P(...)
当我使用std_logic_vector或类似时,我在尝试将地址用作数组索引时遇到错误:
ncvhdl_p: *E,INTYMM (filename,52|17): array index type mismatch [6.4]
我似乎在这里处于一种不赢的局面。我使用什么数据类型?请注意,解决方案必须是可综合的。感谢
答案 0 :(得分:2)
您需要按位访问和包装行为:
addr
从根本上成为unsigned
向量。然后你需要以整数形式访问它:
to_integer
调用。 像这样:
signal addr_int:natural;
....
addr_int <= to_integer(addr);
答案 1 :(得分:1)
在这种情况下,我会使用unsigned
类型。
这与您在通用位访问方面习惯std_logic_vector
的方式非常相似,但您也可以对地址进行算术运算,并轻松转换为integer
类型,如有必要。此外,它不会使用“可怕的”std_logic_vector
包裹弄清std_logic_unsigned
的感觉。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
...
architecture myarch of myent is
signal address : unsigned(numbits-1 downto 0);
...
begin
-- as an example
addr_counter : process(sysclk, reset)
begin
if reset = '1' then
address <= (others => '0');
elsif rising_edge(sysclk) then
address <= address + 1;
end if;
end process addr_counter;
...