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变量赋值需要用:=符号,赋值是瞬时的。