📄 运算操作符和属性知识点.vhd
字号:
-------运算操作符---------------
------ <= 用于对signal赋值
------ := 用于对variable,constant,generic赋值,也可用于赋初始值
------- => 给矢量中的某些位赋值,或对某些位之外的其他位(常用OTHERS表示)赋值
signal x: std_logic;
variable y: std_logic_vector(3 downto 0) ;
signal w: std_logic_vector(0 to 7);
x <= '1';--通过<=将值'1'赋给信号x
y := "0000";--通过:=将值"0000"赋给信号y
w <= "10000000";--最低位是1,其他位是'0'
w <= (0 => '1',others >= '0');--最低位是1,其他位是'0'
--------逻辑运算符--------------
----not and or nand nor xor 异或 xnor同或
y <=not a and b;--(a'.b),这里'表示取反操作
y <=not (a and b);--(a.b)'
y <=a and b;--(a.b)'
----------算术运算符--------------
---+ - * / ** 指数运算 mod 取模 rem 取余 abs 取绝对值
---- y mod x 运算结果是y除以x所得的余数,运算结果通过信号x返回
----y rem x 运算结果是y除以x所得的余数,运算结果通过信号y返回
---mod rem abs 不可综合
----------关系运算符------------------
---- = /= < > <= >= 两边的数据类型必须相同
-------------移位操作符-----------------
----<左操作数> <移位操作符> <右操作数>
----bir_vector integer 可加+-号
---sll逻辑左移,空位充0
---srl逻辑右移
---sra算术左移, 复制最右端的位填充 在数据左移操作后填充在右端空出的位置
---sla算术右移
---rol循环逻辑左移, 依次填充
---ror循环逻辑右移
---------------并置操作符----------------
---用于位的拼接,有两种:& (,,,)
z <=x & "10000000";--如果x<='1',那么z<="11000000"
z <= ('1','1','0' '0' );--z<="11000000"
------------属性------------------------------------
--可以从指定的客体或对象中获得关心的数据或信息
--数值类属性
signal d: std_logic_vector(7 downto 0 );
----有:d'low=0, d'high=7 ,d'left=7 ,d'right=0, d'length=8, d'range=(7 downto 0),d'reverse_range=(0 to 7)
--对于枚举型的信号,vhdl中定义如下属性:
--d'val(pos) 返回指定位置(pos)的值
---d'pos(value) 给出数值(value),返回其位置序号
---d'leftof(value) 给出数值(value),返回其左侧的值
---d'val(row,column) 返回给定行,列位置对应的值
--信号类属性
---s'event 如果s的值发生变化则返回ture 否则返回false
---s'stable 如果s的值不发生变化----
---s'active 如果当前s='1'
---s'quiet<time> 如果在指定的时间内s没有发生变化
---s'last_event 计算上一次事件发生到现在所经历的时间,并返回这个时间值
---s'last_active 返回最后一次s='1'到现在所经历的时间长度值
---s'last_value 返回最后依次变化前s的值
---大部分信号类属性用于仿真,但前两个信号类属性是可以综合的
---------等效的语句:
if (clk 'event and clk = '1')....
if (not clk 'stable and clk ='1')...
wait until (clk 'event and clk ='1')...
if rising_edge(clk)...--调用一个函数
---用户自定义属性
attribute attribute_name :attribute_type;--属性声明
attribute attribute_name of target_name : class is value;--属性描述
举例:
attribute number_of_inputs: integer;--属性声明
attribute number_of_inputs of nand3: signal is 3;--属性描述
.........
inputs <=nand3'number_of_pins;--属性调用,返回值为3
举例:枚举类型编码
type color is (red,green,blue,white);
编码后,red="00",green="01",blue="10",white="11"使用用户自定义的属性后,可以改变
这种默认的编码次序,具体方式如下:
ATTRIBUTE enum_encoding of color :type is "11 00 10 01";
这样就改变了编码次序
可以在代码中的任何地方进行用户声明
---操作符扩展
预定义的算术操作符的操作数必须是特定类型(比如整数类型)的数据
例:要求对一个整数和一个一位二进制数进行加法运算,首先构成一个函数,然后调用
--------------------------------------------
function "+" (a: integer, b: bit) return integer is
begin
if(b ='1')then return a+1;
else return a;
end if;
end"+";
--------------------------------------
signal inp1,outp: intrger range 0 to 15;
signal inp2: bit;
(.........)
out <= 3+inp1+inp2;
(.........)
表达式中,第一个+是预定义的加法运算符,第二个+是经过扩展的用户自定义加法运算符,能对一个整数和一个bit类型数据进行加法运算
--------------通用属性语句
generic语句提供了一种指定常规参数的方法,所指定的参数是静态的
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -