以下代码是Memory
CPU
Mips
LIBRARY ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
ENTITY instructionMemory IS
generic (delay :time :=10 ns);
PORT( a : INOUT STD_LOGIC_VECTOR ( 31 downto 0);
output: OUT STD_LOGIC_VECTOR( 31 downto 0)
);
END ENTITY;
ARCHITECTURE instructionMemory OF instructionMemory IS
type MemMatrix is array ( 0 to 7 ) of std_logic_vector(31 downto 0); -- instruction from memory
signal Mem:MemMatrix := (x"00000000",x"00000001",x"00000000",x"00000001",x"00000001",x"00000001",x"00000001",x"00000001");
BEGIN
output <= Mem(conv_integer(a(6 downto 2)));
END instructionMemory;
我假设Mem是Memory
并且使用一些值来启动它。我想读取这些数据并将其分配给输出。
但它给了我以下错误:
no feasible entries for subprogram conv_integer
我将错误行更改为:
Mem(a(6 downto 2));
但是它又给了我一个错误:
cannot resolve slice name to type std.standard.integer
我不知道如何解决这个问题,任何人都可以帮助我吗?
答案 0 :(得分:2)
以下分析和阐述:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity instructionmemory is
generic (delay :time :=10 ns);
port( a : inout std_logic_vector ( 31 downto 0);
output: out std_logic_vector( 31 downto 0)
);
end entity;
architecture instructionmemory of instructionmemory is
type memmatrix is array ( 0 to 7 ) of std_logic_vector(31 downto 0); -- instruction from memory
signal mem:memmatrix := (
x"00000000",x"00000001",x"00000000",x"00000001",
x"00000001",x"00000001",x"00000001",x"00000001"
);
begin
output <= mem(conv_integer(a(6 downto 2))); -- closing paren for mem();
end instructionmemory;
与此不同的是在并发信号分配语句目标输出中添加匹配的结束语。
ghdl实际上用一条不太有用的消息指出了问题的字符位置。
instructionMemory.vhdl:20:47:&#39;,&#39;预期而不是&#39 ;;&#39;
预计没有结束的假设是一个额外的论点。您的错误消息可能表示基于YACC / Bison的解析器无法在非终端上提供错误消息。
<强>附录强>
如果您注意到Russell的评论,6 downto 0
和memmatrix (0 to 7)
的转换之间存在整数范围不匹配。转换的二进制范围为2 ** 5,而mem的范围为0到7.如果a(6 downto 2)
每个都超出范围0到7,则会发生运行时错误。使用整数类型将允许通过检查整数值与mem的界限来修改或以其他方式处理超出范围的字段。
您还可以增加memmatrix大小以适应a(6 downto 2)的全部范围。
关于如何为mem分配不同的索引以分配输出的其他问题需要更多的上下文。你想从哪里得到索引?