在 VHDL 中添加两个 std_logic_vector 的最佳和最快方法

Best and Fastest Way for adding two std_logic_vector in VHDL

在 VHDL 中,如果我根据以下声明有一个 STD_LOGIC_VECTOR:

signal RAM_ADDR : STD_LOGIC_VECTOR (2 downto 0) := (others => '0');

如果我尝试按照以下方式使用“+”运算符在循环中递增此地址:

for i in 0 to 7 loop
   RAM_RW <= '1';
   wait until KEY_NUM'event;                    
   RAM_RW <= '0';
   RAM_ADDR <= RAM_ADDR + "1";
end loop;

我遇到以下错误:

Error (10327): VHDL error at X.vhd(40): can't determine definition of operator ""+"" -- found 0 possible definitions

你能建议最好和最快的解决方法吗(也许不使用不同类型的数据,如整数)?

到目前为止,我正在使用以下(错误的)解决方案:

case RAM_ADDR is
  when "000" =>
    RAM_ADDR <= "001";
  when "001" =>
    RAM_ADDR <= "010";
  when "010" =>
    RAM_ADDR <= "011";
  when "011" =>
    RAM_ADDR <= "100";
  when "100" =>
    RAM_ADDR <= "101";
  when "101" =>
    RAM_ADDR <= "110";
  when "110" =>
    RAM_ADDR <= "111";
  when "111" =>
    RAM_ADDR <= "000";
  when others =>
    RAM_ADDR <= "000";
end case;

提前致谢,

最常推荐的方法是使用 numeric_std 包,并实例化一个类型为 unsigned 的信号。

use ieee.numeric_std.all;

...

signal RAM_ADDR : unsigned (2 downto 0) := (others => '0');

...

RAM_ADDR <= RAM_ADDR + 1;

您可以尝试其他涉及与类型系统作斗争的方法,但如果您及早习惯使用适当的类型,则可以避免将来出现某些类型的错误。在我看来,使用适当的类型还可以提高代码的可读性。