Vhdl 具有非零低索引的内存-有任何注意事项吗?

Vhdl 具有非零低索引的内存-有任何注意事项吗?,vhdl,fpga,vivado,Vhdl,Fpga,Vivado,在VHDL语言中,初始化内存的常用方法是: type mem0_type (0 to MEM0_SIZE-1) of std_logic_vector(DATA_WIDTH-1 downto 0); signal mem0 : mem0_type; 为了便于以后在内存和寄存器地址表中使用,我正在考虑: 标准逻辑向量(数据宽度-1向下至0)的type mem0\u type(mem0\u ADDR至mem0\u ADDR+mem0\u SIZE-1); 信号mem0:mem0_型; 要

在VHDL语言中,初始化内存的常用方法是:

type mem0_type (0 to MEM0_SIZE-1) of std_logic_vector(DATA_WIDTH-1 downto 0);
    signal mem0 : mem0_type;
为了便于以后在内存和寄存器地址表中使用,我正在考虑:

标准逻辑向量(数据宽度-1向下至0)的
type mem0\u type(mem0\u ADDR至mem0\u ADDR+mem0\u SIZE-1);
信号mem0:mem0_型;
要想做到这一点:

case开关不可用

当mem0'range=>mem0(switch)mem2(switch)时,您可以按照建议执行操作,但是-由于合成规则没有严格的标准化-我不会打赌每个合成工具都能可靠地从您的构造中检测和推断内存

这似乎是使用别名的替代构造的完美用例:

entity mem is
    generic
    (
        MEM_SIZE        : natural;
        DATA_WIDTH      : natural;
        START_ADDRESS   : unsigned(31 downto 0)
    );
    port
    (
        ...
    );
end entity mem;

architecture alias_architecture of mem is
    type mem_type is array (natural range <>) of std_ulogic_vector(DATA_WIDTH - 1 downto 0);
    signal mem : mem_type(0 to MEM_SIZE - 1);
    alias amem : mem_type(to_integer(START_ADDRESS) to to_integer(START_ADDRESS) + MEM_SIZE - 1) is mem;
begin
...
实体mem是
通用的
(
记忆大小:自然;
数据宽度:自然;
起始地址:未签名(31到0)
);
港口
(
...
);
终端实体mem;
架构别名\ mem的架构是
类型mem_type是标准逻辑向量的数组(自然范围)(数据宽度-1到0);
信号内存:内存类型(0到内存大小-1);
别名amem:mem_type(to_integer(START_ADDRESS)to to_integer(START_ADDRESS)+mem_SIZE-1)为mem;
开始
...
通过这种方式,您仍然可以方便地寻址,唯一需要处理偏移量的地方就是别名定义。它可能不能保证所有可用的工具都能猜出你的意思,但我认为它至少会增加可能性


[p.S.:出于好奇,在Quartus II中尝试了这种方法,但不幸的是,它似乎无法通过别名数组.YMMV和其他合成工具来推断RAM块。]

我相信您的合成器会允许的。要么你会得到一个内存没有使用的部分(浪费面积),一个内存的最低地址不是零,或者一个内存的最低地址是零,内存移位由合成器处理(我想不太可能,但你可能)。试试看。但是你可能会发现不同的合成器做不同的事情,这会使你的代码依赖于合成器。我投票结束这个问题,因为我认为最好在电子堆栈交换网站上提问。这个网站是用来编程的。HDL已经有点扩展了,但像这样的问题根本不是关于VHDL语言,而是关于合成的,我认为扩展得太远了。@Matthew Taylor使用HDL总是很难知道在哪里发布。尽管stack的VHDL POST大约是stack Exchange EE的10倍。堆栈上与编译器相关的问题是否正常?我是新来的,所以我想:)嗯,我不知道。这只是我的意见。请注意,没有其他人(有足够的投票权)同意我的意见,所以我不会为此担心。你可以在Meta上提问,但是(考虑到这个网站是关于编程的),Meta上很少有人会理解你的问题,你的问题可能会在3飞秒内得到无数的否决票和结束票。@MatthewTaylor倾向于不同意。人们学习VHDL是有目的的,我强烈认为——至少对大多数人来说——这个目的是为了让他们的FPGA上有一些逻辑。IMHO,如果综合,甚至工具特定的问题被排除在外,不仅像“Vivado”和“Quartus”这样的标签几乎毫无意义,而且它也会破坏大多数HDL学习者的主要兴趣。