阵列的地址作为std_logic_vector提供(Address of array provide

2019-10-20 18:36发布

我试图构建一个ROM,其中有作为的声明a : in std_logic_vector(5 downto 0)的访问地址。 我的问题是它的,我不知道如何使用std_logic_vector访问只读存储器阵列,我应该使用强制转换为整数或我还能做什么呢?

我的代码:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--------------------------------------------------------------------------------
entity imem is
    GENERIC(CONSTANT N : INTEGER := 32);
    port (a : in std_logic_vector(5 downto 0);
         result : out std_logic_vector(N-1 downto 0));
end imem;


architecture behavior of imem is
    signal addres : integer;
    type memory is array (0 to 64) of std_logic_vector(N-1 downto 0) ;
    constant myrom : memory := (
         2 => x"11111111" , --255
         3 => x"11010101" , 
         4 => x"01101000" , 
         6 => x"10011011" , 
         8 => x"01101101" , 
         9 => x"00110111" , 
         others => x"00000000" ) ;

begin 
    addres <= signed(a);
    result <= memory(addres);

end behavior;

随着如图所示,我得到以下错误的代码:

imem.vhd:25:21: can't match type conversion with type integer  
imem.vhd:25:21: (location of type conversion)
imem.vhd:26:21: conversion not allowed between not closely related types  
imem.vhd:26:21: can't match type conversion with type array type "std_logic_vector"
imem.vhd:26:21: (location of type conversion)
ghdl: compilation error  

Answer 1:

假设a是无符号的地址值,则必须首先将其转换为无符号,然后为整数。 请注意, result应该访问myrom而不是memory类型。 然后,该代码可以是:

addres <= to_integer(unsigned(a));
result <= myrom(addres);

你甚至可以跳过中间addres信号,并做到:

result <= myrom(to_integer(unsigned(a)));

memory类型也比需要较长的一个,由于6位的a输入只能覆盖0 .. 63,而不是0 .. 64.一种更好的方式来声明memory类型将是通过使用所述'length为属性a ,如:

type memory is array (0 to 2 ** a'length - 1) of std_logic_vector(N-1 downto 0);


Answer 2:

ghdl语义默认情况下严格-1993这对莫滕的答案的变化产生影响

对于:

type memory is array (0 to 2 ** a'length - 1) of 
        std_logic_vector(N-1 downto 0);

我们得到:

ghdl -a imem.vhdl
imem.vhdl:15:29:警告:通用整数结合必须为数字文字或属性

特里斯坦Gingold ghdl的作者撰写的问题报告导致语言规范变化在2006年,这给了明确的许可,以当时的(-2002的)实现,治疗范围内作为一个约束可转换为整数的范围表达式时对方结合是一种通用的整数(文字)。 该LCS没有许可做以符合早期版本标准的实现转换。 特里斯坦ghdl是严格这里的书,在默认情况下是-1993兼容,并产生一个错误。

有两种方法来处理错误。 既可以使用命令行选项来ghdl分析期间指定一个版本的标准其中该范围可以被转换为整数类型或直接提供的范围之外。

从ghdl --help选项,我们看到:

--std = 87/93/00/2月8日选择VHDL 87/93/00/02/08标准

其中该命令行标志可如ghdl -a --std = 02 imem.vhdl传递。

另外,范围型可直接声明为:

type memory is array (natural range 0 to 2 ** a'length - 1) of 
            std_logic_vector(N-1 downto 0);

分析型内存工作的两种方法。

而这一切的道德是VHDL是一个紧密类型语言。

笔记


  1. -2008合规性未完全ghdl的当前版本中实现。)
  2. 有解释的标准无论如何要支持的转换历史支撑。 该LCS克服歧义。
  3. 见IEEE标准1076至1993年3.2.1.1指数约束和离散范围第2段和IEEE STD-2076至08年5.3.2.2指数约束和离散范围第2段


文章来源: Address of array provided as std_logic_vector
标签: vhdl ghdl