我正在尝试构建一个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
答案 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是一种紧密输入的语言。
备注