您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > VHDL数字电路设计教程第4讲 运算操作符和属性
1•VHDL的运算操作符:•属性:•用户自定义属性•操作符扩展•通用属性语句•例子第四章运算操作符和属性24.1运算操作符6种预定义的运算操作符:赋值运算符;逻辑运算符;算术运算符;关系运算符;移位运算符;并置运算符;3例:signalx:std_logic;variabley:std_logic_vector(3downto0);signalw:std_logic_vector(0TO7);x=‘1’;----通过=将‘1’赋给信号x;y:=“0000”;----通过:=将值“0000”赋给变量y;w1=(0=’1’,OTHERS=’0’);--信号w1的赋值;w2=(OTHERS=’0’);--信号w2的赋值;赋值运算符4逻辑运算符高运算优先级低运算优先级5注意:书上的“可综合”是指EDA工具的工艺库(如IP库、基本器件库)中是否直接包含相应的功能模块或器件,如果包含,则称为可综合,否则就称为不可综合。对于某些运算功能,理论上是可以用电路实现的,但代价太大,不常使用,因此工艺库中一般就不包含这些功能器件,在这里就称为不可综合。另外,可综合的电路必须是规格固定的。算术运算符6加法、减法、乘法可以综合成逻辑电路;(见例6.8/12.1/12.2等)除法:除数为2n时可通过移位操作实现(见例9.1),容易综合;其它类型除数时则比较复杂(见例9.4),是否能综合还取决于具体的除数;指数运算:只有当底数和指数都是静态数值(常量或GENERIC参数)时才可综合;MOD和REM:只能用于整数类型。两者区别在于符号不同,如果有两个操作数a和b,表达式aREMb的符号与a相同;表达式aMODb的符号与b相同。例如:7REM-2=1、-7REM2=-1、-7MOD2=1、7MOD-2=-1。“mod”、“rem”操作的综合限制:若右操作数为2n,则可用移位电路实现,即可综合的,其它情况则不可综合。ABS:不可综合。7关系操作符8移位操作符语法结构:左操作数移位操作符右操作数例:令x=“01001”,那么:y=xssl2;---y=“00100”;y=xsla2;---y=“00111”;y=xrol2;---y=“00101”;9并置运算符:例:使用并置运算符对信号赋值Z=X&“1001”;----若X=“101”,则Z=“1011001”;Z=(‘1’,’0’,’1’,’0’);----Z=“1010”;1011各种操作符的优先级问题NOT和算术运算符中的ABS、**的优先级相同,是所有运算符中优先级最高的。运算符*、/、MOD、REM的优先级相同,低于NOT、ABS和**运算符六种移位运算符的优先级相同,高于关系运算符。并置运算符的优先级与加、减运算符相同,高于移位运算符;在VHDL中,左右没有优先组合的区别,一个表达式中如果有多个逻辑运算符,运算顺序的不同可能会影响运算结果,就需要用括号来解决组合顺序的问题。124.2属性(ATTRIBUTE)属性是指从指定的客体或对象(如entity/type/architecture等)中获取关心的数据或信息。利用属性可以使VHDL源代码更加简明扼要,易于理解;语法:对象’属性预定义的属性:数值类属性和信号类属性13数值类属性:获取数组、块或一般数据的相关信息。VHDL预先定义的、可综合的数值类属性:left:索引的左边界值right:索引的右边界值high:索引的上限值low:索引的上限值length:索引的长度值range:索引的位宽范围reverse_range:索引的反向位宽范围14例:variablemy_vector:bit_vector(5downto-5);各属性如下:my_vector’left5my_vector’right-5my_vector’high5my_vector’low-5my_vector’length11my_vector’range(5downto-5)my_vector’reverse_range(-5to5)15枚举类型数值的属性:通常是不可综合的VAL(pos):指定位置(pos)的值POS(value):给定数值的位置序号LEFTOF(value):给定数值的左侧值VAL(row,column):位于行、列位置的值16信号类属性:VHDL预定义的,对于信号s:EVENT:如果s值发生了变化,则返回值为true,否则为falseXXX,常用于时钟信号的判定。STABLE:如果s值保持不变,则返回值为true,否则为false;ACTIVE:如果s值为‘1’,则返回值为true,否则为false;QUIETtime:如果在指定的time内s值保持不变,则返回值为true,否则为false;LAST_EVENT:返回从上一次事件发生的时间到当前时间的时间差;LAST_ACTIVE:最后一次s=‘1’到当前所经历的时间长度值;LAST_VALUE:最后一次变化前s的值;除EVENT和STABLE属性是可以综合的之外,其它的属性都不可综合,仅用于仿真。例:对信号clk是否出现上述沿进行判断IF(clk’EVENTandclk=‘1’)..IF(NOTclk’STABLEandclk=‘1’)..174.3用户自定义的属性用户自定义属性的声明,语法如:ATTRIBUTEattribute_name:attribute_type;attribute_type可以是任何数据类型,包括预定义的数据类型。用户自定义属性的描述,语法如:ATTRIBUTEattribute_nameOFtarget_name:classISvalue;class可以是数据类型、信号、变量、函数、实体或构造体等。18例:attributenumber_of_in;integer;--属性声明;attributenumber_of_inofnand3:signalis3;--属性描述;inputs=nand3’number_of_in;--属性调用,返回值为3;例:枚举类型编码:通常采用顺序编码的方式TYPEcolorIS(red,green,blue,white);默认的编码是:red=“00”;green=“01”;blue=“10”;white=“11”;可对编码次序进行修改:attributeenum_codingofcolor:typeis“11001001”;(值可选,如typeis“1000000101000010”)194.4操作符扩展(或重载操作符):即用户自定义操作符,可以与预定义的操作符具有相同的名称。对已存在的操作符重新定义,可进行不同类型操作数之间的运算。例:对一个整数和一个1位的二进制数进行加法运算function“+”(a:integer;b:bit)returnintegerisbeginif(b=‘1’)thenreturna+1;elsereturna;endif;end“+”,20(续前)对函数“+”的调用:signalinp1,outp:integerRANGE0TO15;signalinp2:bit;……outp=3+inp1+inp2;……………预定义的加法操作符(两个整数相加)用户自定义的、经过扩展的加法运算操作符,可对一个整数和一个bit型数据进行加法运算214.5通用属性语句(GENERIC)用于指定常规参数,所指定的参数是静态的,方便设计人员进行参数修改,可增加代码的灵活性和可重用性。•generic语句必须在ENTITY中进行声明;•generic语句所指定的参数是全局的,不仅可以在ENTITY内部使用,还可以在后面的整个设计中使用。•主要用来为设计实体指定参数,如端口宽度、器件延时等;语法结构:GENERIC(参数名:参数类型:=参数值);如:224.6设计实例:例1:通用译码器•功能描述:m-n译码器,m=log2n23端口描述两个输入端口:ena和sel(m-1:0)一个输出端口:x(n-1:0)功能特征分析1、根据真值表,确定ena/sel与x的关系:当ena为‘0’时,x为“1111_1111”;当ena为‘1’时,8位的二进制数“1111_1111”的某位变为‘0’,其它位保持‘1’。该位的确定取决于sel的值;2、确定端口规格:本例中m为3,n为8;设计要点1、如何根据sel的值确定需由‘1’变‘0’的位置?分析真值表发现:将sel由二进制数转换成十进制数temp2,则需由‘1’变为‘0’的位的位置为temp2。2、如何将二进制数转换为十进制数?循环累加!24具体实现:1------------------------------------------------------2libraryieee;3useieee.std_logic_1164.all;4--------------------------------------------------5entitydecoderis6port(ena:INstd_logic;7sel:INstd_logic_vector(2downto0);8x:OUTstd_logic_vector(7downto0));9enddecoder;10-----------------------------------------------2511architecturegeneric_decoderofdecoderis12begin13process(ena,sel)14variabletemp1:std_logic_vector(x’highdownto0);15variabletemp2:integerrange0tox’high;16begin17temp1:=(others=’1’);18temp2:=0;19if(ena=‘1’)then20FORiINsel’rangeloop21if(sel(i)=‘1’)then22temp2:=2*temp2+1;23else24temp2:=2*temp2;25endif;26ENDloop;27temp1(temp2):=‘0’;28endif;29x=temp1;30endprocess;31endgeneric_decoder;32-------------------------------------------指2downto0过程?26思考:如何使代码具有较强的通用性,以适应不同端口规格的译码器,即通用译码器?GENERIC语句!27例2:通用奇偶校验检测器电路•功能描述:输入矢量中‘1’的个数为偶数时,电路输出‘0’,否则输出‘1’。28端口描述:一个输入端口:input(n:0)一个输出端口:output功能特征分析1、需要统计输入矢量中‘1’的个数:2、功能固定,规格不固定,可以设计成通用构造体:设计要点1、如何使用GENERIC语句来定义端口规格,以适应不同规格电路设计的需要?2、如何统计输入矢量中‘1’的个数?循环累加还是异或运算?代价如何?29具体实现:1------------------------------------------------------2entityparity_detis3GENERIC(n:integer:=7);4port(input:INbit_vector(ndownto0);5output:OUTBIT);6endparity_det;7-----------------------------------------------8architectureparityOFparity_detis9begin10process(input)11variabletemp:BIT;12begin13temp:=‘0’;14FORiINinput’rangeloop15temp:=tempXORinput(i);16
本文标题:VHDL数字电路设计教程第4讲 运算操作符和属性
链接地址:https://www.777doc.com/doc-6150977 .html