【问题标题】:Best and Fastest Way for adding two std_logic_vector in VHDL在 VHDL 中添加两个 std_logic_vector 的最佳和最快方法
【发布时间】:2016-11-10 14:39:54
【问题描述】:

如果我有一个 STD_LOGIC_VECTOR 按照以下声明在 VHDL 中:

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;

我遇到以下错误:

错误 (10327):X.vhd(40) 处的 VHDL 错误:无法确定 运算符 ""+"" -- 找到 0 个可能的定义

您能否提出最好、最快的解决方法(也许不使用整数等不同类型的数据)?

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

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;

提前致谢,

【问题讨论】:

    标签: vhdl add quartus


    【解决方案1】:

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

    use ieee.numeric_std.all;
    

    ...

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

    ...

    RAM_ADDR <= RAM_ADDR + 1;
    

    您可以尝试与类型系统作斗争的其他方法,但如果您尽早习惯使用适当的类型,您可以在将来避免某些类型的错误。在我看来,使用适当的类型也可以使代码更具可读性。

    【讨论】:

    • 在性能(时序)方面是否也有很好的结果?
    • 如果您描述的是 3 位计数器,那么您使用的数据类型应该不会对性能产生任何影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多