1

我正在尝试构建一个 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  
4

2 回答 2

2

假设这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属性 for a,例如:

type memory is array (0 to 2 ** a'length - 1) of std_logic_vector(N-1 downto 0);
于 2014-08-22T16:02:43.673 回答
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:warning: 通用整数绑定必须是数字文字或属性

ghdl的作者 Tristan Gingold在 2006 年撰写了一份导致语言更改规范的问题报告,该报告明确允许当时的 (-2002) 实现将具有表达式的范围视为一个范围,当另一个范围可转换为整数范围bound 是一个通用整数(文字)。LCS 不允许在符合早期版本标准的实现中进行转换。Tristan 的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 段。

  1. 此后,Tristan 将--std=消除 -2000 合规性的选项以及默认标准更改为 93c,它引入了一组标准放宽,以更紧密地匹配 VHDL 工具供应商的行业实践。较新版本的 ghdl 的用户可以使用 --std=93严格的标准合规性。该问题最初取决于 DAC 赞助的 VASG(VHDL 分析和标准化小组)在 -1987 年之后不允许发布标准解释。可以肯定地说,没有任何 VHDL 标准的单一实现完全遵循特定版本。
于 2014-08-22T21:07:14.740 回答