作为std_logic_vector提供的数组的地址

时间:2014-08-22 15:37:37

标签: vhdl ghdl

我正在尝试构建一个ROM,它具有访问地址的声明a : in std_logic_vector(5 downto 0)。我的问题是我不知道如何使用std_logic_vector访问ROM数组,我应该使用强制转换整数还是我还能做什么?

我的代码:

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  

2 个答案:

答案 0 :(得分:3)

假设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.更好的方式来声明{ {1}}类型将使用memory的{​​{1}}属性,例如:

'length

答案 1 :(得分:1)

ghdl语义默认为-1993,这对Morten的答案变化有影响

有关:

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:警告:通用整数绑定必须是数字文字或属性

ghdl 的作者Tristan Gingold在2006年撰写了一份导致语言变更规范的问题报告,该报告明确允许当前( - 2002)实现将表达式视为一个当另一个边界是通用整数(文字)时,绑定为可转换为整数范围。 LCS未授予在符合早期版本标准的实现中进行转换的权限。特里斯坦的 ghdl 严格来自本书,默认情况下符合-1993并产生错误。

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

从ghdl --help-options我们看到:

  

- std = 87/93 / 00 / 02/08选择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 Std 1076-1993 3.2.1.1索引约束和离散范围第2段和IEEE Std-1076-2008 5.3.2.2索引约束和离散范围第2段。