![人工智能硬件电路设计基础及应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/533/43738533/b_43738533.jpg)
2.3 运算操作符和属性
2.3.1 运算操作符
运算操作符是进行信号、变量等对象运算时不可或缺的。表2.2是VHDL中的运算操作符,共8类。其中,运算操作符类别的序号越大,优先级越高。同类别运算符在运算时具有相同的优先级,不同类别运算符的优先级依据表2.2中的优先级先后运算。
表2.2 VHDL运算操作符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_49_2.jpg?sign=1739600825-ieZUDzo8m3D8GLiMBDQpGxSZril9WgYu-0-e0d4efb3405bd70255371931063118a5)
条件运算符
VHDL条件运算符如表2.3所示。
表2.3 VHDL条件运算符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_49_3.jpg?sign=1739600825-UV6I5E0YrKzDPuAQoKjQGfW98Ildf6Im-0-0da4e2eae2b9fde9264d18ce17c443cb)
运算符??将bit类型的取值‘0’和‘1’与boolean类型的false和true对应转换,一般用在条件表达式中。这个转换运算符也会在库中重载给其他数据类型,例如,ieee库中的std_logic_1164包集将std_ulogic的“1”和“H”转换为true,其他值转换为false。条件运算符一般是隐式的,不会在程序中以代码的形式体现出来。
逻辑运算符
逻辑运算符是执行逻辑运算操作的运算符。VHDL逻辑运算符如表2.4所示。
表2.4 VHDL逻辑运算符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_50_1.jpg?sign=1739600825-lxdwSqDVorLbMrR95u8rByZUEXj0Czq7-0-5f5ed7c51901f7f927f5bcb19ce45891)
逻辑运算符示例如下。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_50_2.jpg?sign=1739600825-ZQfh7MxHpIt8WWFfmMtdIH6kYTCD0ROq-0-9437f4cd0762ac2832a75fca977987a6)
关系运算符
关系运算符是判断两个操作数之间的数值关系的运算符。VHDL关系运算符如表2.5所示。
表2.5 VHDL关系运算符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_51_1.jpg?sign=1739600825-G8fKCvLiiEVlzwjJ5Mpmm3uovQgwvcQ8-0-61fca5c0532f3709798716e95370e761)
操作符=和/=为所有非文件类型、非保护类型和不包含文件类型、保护类型子元素的复合类型提供数值相等和不相等判断。进行相等操作的两个操作数相等时,表达式返回true,否则返回false;不相等操作与之相反。当且仅当两个同类型的标量类型对象的值完全相同时,两者相等。当且仅当两个同类型的复合类型对象的子元素一一匹配且完全相同时,两者相等。
对于大小比较的运算符,标量类型的对象依据两个操作数的值的大小进行比较。对于标量数组类型,如果左操作数是空数组,右操作数是非空数组,那么左操作数小于右操作数。如果左右操作数都是非空数组,那么就从最高位开始逐位比较。
运算操作符?=、?/=、?<、?<=、?>和?>=是std库和ieee库为bit类型和std_ulogic预定义的匹配操作符。对于bit类型的操作数,这些匹配操作符的运算操作与普通的操作符相同。对于std_ulogic类型的操作数,匹配操作符?=和?<的运算定义如表2.6和表2.7所示,其余的匹配操作符的运算定义可以依此类推。
表2.6 操作符?=运算定义
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_51_2.jpg?sign=1739600825-yvQ5KvJu02P1NewGvt7rg0YiCQR6053T-0-f897c2dc1a987439bc91944ad9fb4dd1)
续表
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_52_1.jpg?sign=1739600825-UTH2FNox6ekXMlIGkSAZQ9w2GSQUFN9c-0-5482dfca6fc494bd089ba34fac714967)
表2.7 操作符?<运算定义
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_52_2.jpg?sign=1739600825-0bBn2I5irs4RR1nEf5TIWKaQ78Eqc1wC-0-a97d564ecd6d3a4f395c21a2cb38b119)
移位运算符
移位操作符是对目标对象进行移位操作的运算符。VHDL中的移位操作符如表2.8所示。
表2.8 VHDL移位运算符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_52_3.jpg?sign=1739600825-j5M5cGpaPe0lF75mcbbgfG178WDH0T09-0-727c584bfc1608a9860ec6547ee07f26)
运算符sll和srl实现数据移位,移位产生的空位用‘0’填充。运算符sla实现数据左移,移位结束后将最右端的位复制后填充到空位上;运算符sra则与之相反,实现数据右移,移位结束后,将最左端的位复制后填充到空位上。运算符rol和ror实现数据循环移位,将移出的位依次填充到空位上。
移位运算符的示例如下。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_53_1.jpg?sign=1739600825-mYQJhjYOWxwQASSUdqVLst2DPVEvc2ID-0-25eb1a50f2bd70beda43c6668032a617)
加法运算符
VHDL中的加法运算符包括+、-和串联运算符&。VHDL中的加法运算符如表2.9所示。
表2.9 VHDL加法运算符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_53_2.jpg?sign=1739600825-0ZosF94na2YEnt0shOhLtXZ6DvCdjyid-0-be5ceeef118eade36ac0ba9a8112aea2)
运算符+和-的操作为常规的数学加减操作。串联运算符的位移为数组类型定义的操作符,用于数据的拼接。串联运算符的示例如下。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_53_3.jpg?sign=1739600825-xq9DAwXyWI4QsLd91MCCP8wBHfLxft4b-0-a33a82eba8ebef1ce28e8fd6aade26c1)
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_54_1.jpg?sign=1739600825-WIB3C6E128FCRHnApTO6M3iuWZddwTMA-0-940b39d6c088e3ffaba1eb25eae51247)
标志运算符
标志运算符分别表示标识和取反的+和-。VHDL标志运算符如表2.10所示。
表2.10 VHDL标志运算符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_54_2.jpg?sign=1739600825-eqGraKlUNyfosqZEEBeobya5AOCDSZ82-0-b807c40625ed4fcccacff9df7f6235fa)
标志运算符的示例如下。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_54_3.jpg?sign=1739600825-CsJPIrhd9pQ5ewYhG2IETR4HszhjMqT4-0-36e2e885018fb13d411990d51fdd66c1)
乘法运算符
VHDL中的乘法运算符如表2.11所示,包括*、/、mod和rem,分别表示乘法、除法、取模和取余4种操作。
表2.11 VHDL乘法运算符
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_55_1.jpg?sign=1739600825-UFn375xfykaKPwkRIes2ywvCCdEgoOWl-0-8830229d590b07c0c24b221bcbe1d6f2)
运算符*、/对任意整数类型和浮点类型有常规的算术操作。对于整数类型,除法运算是整除运算,运算结果会舍去小数部分转换为整数类型。运算符mod和rem针对任意的整数类型实现取模和取余操作。
VHDL乘法运算符对物理类型的定义,如表2.12所示。
表2.12 VHDL乘法运算符对物理类型的定义
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_55_2.jpg?sign=1739600825-vlXMZ7dAepq4n8qyyaNve5hVgz9r9tPm-0-ffab1d856f7aa937fab533142b6aee06)
乘法运算符的示例如下。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_55_3.jpg?sign=1739600825-ywxFoZW5VqAYMTKlmdqnBXYcfRF4MotE-0-6030b9d2ba20bdca3bb60336f3579304)
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_56_1.jpg?sign=1739600825-8jHKVmLJbbG1ZySAl02pt6irkkrVVwuJ-0-896f0850fd8b2d6fe97f0a9543866c5e)
其他运算符
VHDL中还有两个操作符,不属于以上分类,如表2.13和表2.14所示。
表2.13 VHDL运算符abs
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_56_2.jpg?sign=1739600825-GtzXE4XgbqaRLnRobf4xJOXuulZvulfe-0-d0c398314f6fe687b59773743314c680)
表2.14 VHDL运算符**
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_56_3.jpg?sign=1739600825-z2IGTvuCuJFkOrnyCPg8raBaFyXi9VFK-0-f1156e20b109b39985e62700f3174caa)
运算符abs和**的示例如下。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_56_4.jpg?sign=1739600825-DFE9W1SAnkB2Y00abrHNYULw2gV7f57b-0-58fb4b6251c1868923ddcb5024080e91)
2.3.2 属性
VHDL中的属性可以从指定的对象中获得相关的数据和信息,使得VHDL代码更加灵活。VHDL中预定义的属性可以划分为7类,即数据类型和对象的属性、数组类型的属性、信号的属性、命名实体的属性、范围的属性、PSL对象的属性和模式视图的属性。
数据类型和对象的属性
VHDL中的数据类型和对象的属性如表2.15所示。
表2.15 VHDL中的数据类型和对象的属性
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_57_1.jpg?sign=1739600825-G2rrl3IEoDJysP9J2L3Fc0fVQogu7YA0-0-8d3d17d77771121d46bd786509fbbb8f)
续表
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_58_1.jpg?sign=1739600825-CNCptBU3gYljGae5s2zaUGZvHvpJ7BXo-0-dafb2ec32fb691824b62a5667ac400d5)
续表
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_59_1.jpg?sign=1739600825-1FFu9s62ogJ9pMA4UUs2qdGNY7kNri8o-0-77326fd98fb537b2a555a8ec9499ea41)
续表
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_60_1.jpg?sign=1739600825-3bqcfSZFWDo8SZaySj2JLc3vytGyqeLG-0-f5f53c403f8b00802985cc5a35c32b7b)
数组类型的属性
VHDL中的数组类型的属性如表2.16所示。
表2.16 VHDL中的数组类型的属性
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_61_1.jpg?sign=1739600825-beMYT41OwvOal2ssQLu7H3zamKCB3w6h-0-4dee1ef4fb97f9b2ca1217bd88da02f7)
续表
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_62_1.jpg?sign=1739600825-vxmFTAURYWFSHElIoPEyCFbTmnKIfFG5-0-1506a1447c38feb112e15b7d3fd1f3f6)
信号的属性
VHDL中信号的属性如表2.17所示。
表2.17 VHDL中信号的属性
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_63_1.jpg?sign=1739600825-51cJrJ7YKOTmNwMq0AWoDDud9DcLpaMG-0-33899363ca9bb4c03b280d6b9ccecd6c)
续表
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_64_1.jpg?sign=1739600825-oi9ifUA3T2q76cmYejeKtZQUyT4Z2JAC-0-4a03b0b860d8a59f2663256eb577d29f)
命名实体的属性
VHDL中的命名实体的属性如表2.18所示。
表2.18 VHDL中的命名实体的属性
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_64_2.jpg?sign=1739600825-anr5yQRxYkmfH5F221z7oeeXgUO7LcYX-0-24ddfea96762c43b0d718cf78c5c2d7f)
续表
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_65_1.jpg?sign=1739600825-2fWHLpTQYwuOzGVU2AnPl7wZVXg2iGSg-0-15f239a16e75882e0a5003a8d9805297)
范围的属性
VHDL中的范围的属性如表2-19所示。
表2-19 VHDL中的范围的属性
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_65_2.jpg?sign=1739600825-4kxyW7d9xAo7TeGJZZw3eP2wViVbMWAb-0-294c9a39f63a55c7cb7e6dff6611e38f)
PSL对象的属性
VHDL中的PSL对象的属性如表2.20所示。
表2.20 VHDL中的PSL对象的属性
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_65_3.jpg?sign=1739600825-khhNbYt4cJmQ3swciAAXDxcvjLEg8oB8-0-83998a8ded69844ebb1054ca2e576708)
模式视图的属性
VHDL中的模式视图的属性如表2.21所示。
表2.21 VHDL中的模式视图的属性
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_66_1.jpg?sign=1739600825-IZuV8OndH47mpnI6hA08PGvLQPn4MT0r-0-5de5411fcdd4a35e502ccdf315578992)
2.3.3 通用属性
通用属性(generic)是VHDL中定义的静态常规参数,可以在实体、元件等程序段的声明中定义。在通用属性定义的程序段中,通用属性是静态的,是不可更改的。通用属性实现内部参数与外部程序的联系,在元件实例化或者配置声明中可以重新配置参数的值,从而实现程序段的功能多样化,增加代码的灵活性和重用性。通用属性的语法结构如下。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_66_2.jpg?sign=1739600825-LsN4gKdmLljnUJBWi7BDkhmzffGWpvko-0-f2ded18f566b80b23065ace30a2998db)
其中,parameter_name是参数的名称;parameter_type是参数的类型;parameter_value是参数的默认值。在通用属性实例化时,如果没有重新配置参数的值,参数将保持默认值不变。
例2.3 通用属性示例
下方代码实现了2输入的通用门,定义通用参数gate_type是实现在多种基本逻辑门中切换。在实例化元件或配置声明时,重新配置gate_type的值,可以将元件或者实体的功能切换为目标逻辑门。
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_66_3.jpg?sign=1739600825-CszWzTKw8JPXXkfrpsrIGDgfwsNmK5PG-0-f6c702f373b72dbefea91d244cc62d7a)
![](https://epubservercos.yuewen.com/B3251C/23020659009785406/epubprivate/OEBPS/Images/43035_67_1.jpg?sign=1739600825-gBZDkqWvVw4u9L9TPBFsFfeJaIJP0zf6-0-7fe34e1575316c6a981edce1902aa2cd)