3

我正在学习 VHDL,我在尝试编写一些代码来满足边界检查异常时遇到了问题。

这是我的基本总结代码:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use IEEE.NUMERIC_STD.ALL;
use ieee.std_logic_unsigned.all; 
...
port(
Address: in std_logic_vector(15 downto 0);
...
constant SIZE : integer := 4096;
variable addr: integer range 0 to SIZE-1 := 0;
...
process ... 
addr := conv_integer(Address) and (SIZE-1); --error here

我得到的错误信息是

src/memory.vhd:37:35: 没有操作符“and”的函数声明

基本上,我的目标是制作一个 16 位地址总线,参考内存只有 4096 字节。为什么我会收到这个奇怪的错误?我是否缺少库包含或其他内容?

4

4 回答 4

3

第一:不要使用std_logic_arith and numeric_std。而且你不需要std_logic_arith

您不能对整数进行按位与运算,因此您需要执行以下操作:

addr := Address and to_unsigned(SIZE-1, Address'length);

但是您可能需要保证 SIZE 是 2 的幂

我倾向于做的是在位中创建一个常量并从那里开始工作:

constant mem_bits : integer := 16;
constant SIZE     : integer := 2**16;

然后

addr := Address(mem_bits-1 downto 0);
于 2012-05-02T09:47:02.270 回答
2

我不认为and是为整数定义的,尽管可能有一个包含该功能的标准库。

为什么不保留你的地址std_logic_vector呢?在地址方面,您通常希望能够通过直接查看某些位来轻松解码,所以我认为这很有意义。

只需创建addr一个std_logic_vector(11 downto 0), 并为其分配最低 12 位address- 这将忽略高 4 字节,并为您提供 4096 字节的空间(对于 8 位数据总线)。

于 2012-04-30T18:51:09.930 回答
2

并且对于整数没有意义。整数是一个范围内的数字,但它没有标准的实现方式,即它没有预先定义的二进制表示。

你可以使用类似下面的语法;

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;





entity testand is
    generic (nBITS:integer:=32);
    port (
        i:in integer;
        a:in std_logic_vector(nBITS-1 downto 0);
        o:out std_logic_vector(nBITS-1 downto 0));
end entity;



architecture beh of testand is

signal v:std_logic_vector(a'length-1 downto 0);

begin

    v<=std_logic_vector(conv_unsigned(i,o'length));

    o<=v and a;


end architecture;
于 2012-05-02T12:22:02.710 回答
0

在您的特定情况下,您还可以使用“mod SIZE”而不是“and (SIZE-1)”。

于 2019-01-21T16:31:57.640 回答