首页 文章

我应该将哪种VHDL数据类型用于内存地址?

提问于
浏览
1

我正在开发一个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]

我似乎在这里处于一种不赢的局面 . 我使用什么数据类型?请注意,解决方案必须是可综合的 . 谢谢

2 回答

  • 2

    您想要按位访问和包装行为:

    • make addr 从根本上说是一个 unsigned 向量 .

    然后你需要以整数形式访问它:

    • 如果只需要一行整数,请在该行上使用 to_integer 调用 .

    • 如果您需要在多个位置作为整数,请创建另一个信号"shadow"并在架构中进行连续分配

    像这样:

    signal addr_int:natural;
    ....
    addr_int <= to_integer(addr);
    
  • 1

    在这种情况下,我会使用 unsigned 类型 .

    这将与您在通用位访问方面的操作方式非常相似,但您也可以对地址进行算术运算,并在必要时轻松转换为 integer 类型 . 另外,它不会使用"dreaded" std_logic_unsigned 包装弄脏 std_logic_vector .

    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;
    ...
    

相关问题