VHDL数据类型及运算符问题解决-记录更新

std_logic_vector(or std_logic)等类型的运算


代码示例1:运算符的重载

--use ieee.std_logic_unsigned.all;
...
signal a : std_logic_vector(4 downto 0);
signal b  : std_logic_vector(3 downto 0);
signal c  : std_logic_vector(3 downto 0);
...
a <= b + c;

在quartus的编译过程中
a1 <= b + c;
会提示b和c不是整数时,"+"未定义
--use ieee.std_logic_unsigned.all;
将这一句注释去掉为正确写法,这里是通过该库对"+"进行重载,可以重载定义其他类型,有"-"时需要将unsigned改成signed


代码示例2:多位矢量的运算

use ieee.std_logic_unsigned.all;
...
signal a1 : std_logic_vector(4 downto 0);
signal a2 : std_logic_vector(4 downto 0);
signal b  : std_logic_vector(3 downto 0);
signal c  : std_logic_vector(3 downto 0);
...
a1 <= b + c;
a2 <= CONV_STD_LOGIC_VECTOR((CONV_INTEGER(a) + (CONV_INTEGER(b)),5);

在quartus的编译过程中
a1 <= b + c;
会提示运算位数不匹配的错误;
a2 <= CONV_STD_LOGIC_VECTOR((CONV_INTEGER(a) + (CONV_INTEGER(b)),5);
这一句为正确写法,不会报错。也就是位数不同的加法中,需要将加数转换成整数,运算之后再转换成位矢量


代码示例3:1位矢量的运算

use ieee.std_logic_unsigned.all;
...
signal a1 : std_logic_vector(1 downto 0);
signal a2 : std_logic_vector(1 downto 0);
signal b  : std_logic;
signal c  : std_logic;
...
a1 <= b + c;
a2 <= CONV_STD_LOGIC_VECTOR((CONV_INTEGER(a) + (CONV_INTEGER(b)),5);

在quartus的编译过程中
a1 <= b + c;
会提示在b和c为1bit时,"+"未定义;
a2 <= CONV_STD_LOGIC_VECTOR((CONV_INTEGER(a) + (CONV_INTEGER(b)),2);
这一句为正确写法,不会报错,也就是即使进行了"+"重载的定义,也不支持对1bit矢量进行运算,需要转换成整数进行运算。


代码示例4:变量的定义与赋值

------------------------------------------
process(xxx,xxx,xxx)
variable xxxx : integer := 0;
begin
        ......
end process;
------------------------------------------
variable xxxx : integer := 0;
process(xxx,xxx,xxx)
begin
        ......
end process;
------------------------------------------
process(xxx,xxx,xxx)
begin
        variable xxxx : integer := 0;
        ......
end process;

上述代码可以看到,对于variable类型的变量,定义与赋初始值都必须要在process进程内,且在begin之前,否则会出现一些报错。同时variable变量赋值需要用:=符号,赋值是瞬时的。

你可能感兴趣的:(VHDL数据类型及运算符问题解决-记录更新)