向std_logic_vector添加常量

时间:2013-10-20 15:21:21

标签: vhdl

我有一个std_logic_vector的输入信号并保存一个地址。我用它来读取内存,我需要读取500位,但由于我的内存数据总线只有256位宽,我需要读取两个连续的256位块。为此,我想从存储在信号中的地址第一次读取,第二次从地址存储后的地址读取256位(32字节)。如何向std_logic_vector添加常数:

ADRESS  : in std_logic_vector (0 to 31);

--code

--read first word:
dfmc_DDR2Interface_address <= ADRESS;
dfmc_DDR2Interface_read <= '1';

-- more code

--read second word (what I want to do)
dfmc_DDR2Interface_address <= ADRESS+32;
dfmc_DDR2Interface_read <= '1';

2 个答案:

答案 0 :(得分:1)

简单的方法是使用numeric_std_unsigned包:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std_unsigned.all;  -- if you add this...

entity add_integer_literal_to_slv_signal is
    port (
        address: in std_logic_vector(0 to 31);
        dfmc_DDR2Interface_address: out std_logic_vector (0 to 31);
        dfmc_DDR2Interface_read: out std_logic
    );
end;

architecture example of add_integer_literal_to_slv_signal is
begin
    --read first word:
    dfmc_DDR2Interface_address <= address;
    dfmc_DDR2Interface_read <= '1';

    -- more code

    --read second word (what I want to do)
    dfmc_DDR2Interface_address <= address + 256; -- ...this will work out of the box!
    dfmc_DDR2Interface_read <= '1';
end;

对于记录,您应该正确查看numeric_std包。 @JimLewis对VHDL 2008算法有一个很好的综述: http://www.gstitt.ece.ufl.edu/vhdl/refs/vhdl_math_tricks_mapld_2003.pdf

答案 1 :(得分:0)

一种解决方案是询问地址在您的设计环境中的含义。

如果我通常发现它代表一个无符号数,那么最干净的答案是将Address声明为Unsigned(来自numeric_std)库,或者有时甚至是Natural的远程子类型。

然后添加整数将简单地工作,没有大惊小怪,VHDL-2008支持脑死亡工具也没有问题。

在您的测试平台中,您可能必须转换为std_logic_vector才能连接到设计不佳的仿真模型,但此类转换可能很少。