如何在VHDL中对整数进行按位AND操作?

时间:2012-04-30 18:35:24

标签: syntax vhdl

我正在学习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:没有操作符“和”

的函数声明

基本上,我的目标是制作一个16位地址总线,参考存储器只有4096字节。为什么我会得到这个奇怪的错误?我错过了图书馆包含什么?

4 个答案:

答案 0 :(得分:3)

首先:不要使用std_logic_arith numeric_std。并you don't need std_logic_arith

你不能对整数进行按位AND,所以你需要做类似的事情:

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);

答案 1 :(得分:2)

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

为什么不将您的地址保留为std_logic_vector?在地址方面,你经常希望能够通过直接查看某些位来进行简单的解码,所以我觉得这很有道理。

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

答案 2 :(得分: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;

答案 3 :(得分:0)

在您的特定情况下,您也可以使用“ mod SIZE”代替“ and(SIZE-1)”。