VHDL的unsigned库
- 格式:pdf
- 大小:64.42 KB
- 文档页数:7
[转]VHDL中数据类型转换与移位(STD_LOGIC_ARITH与NUMERIC_STD)1. VHDL⽬前常⽤库⽂件⽬前写VHDL程序时,⼤部分⼈已经熟悉的库调⽤如下所⽰:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all; --或者 use ieee.std_logic_signed.all;这⼏个库⽂件的源码可以在链接中查看,⾸先阐述⼀下这些⽂件的内容和主要作⽤:- std_logic_1164 : 声明了std_Ulogic类型及其决断⼦类型std_logic,也声明了这种类型构成的数组std_logic_vector,还有这些类型的逻辑运算符函数。
如果你需要使⽤std_logic类型,并只做逻辑类运算的话。
就只需要声明 LIBRARY IEEE和 USE std_logic_1164.ALL就可以了。
- std_logic_arith : 声明了signed和unsigned两种数据类型。
这两种数据类型与std_logic_vector很相似,在后⾯详细解释。
该库函数只对integer、signed、unsigned以及std_ulogic的算术运算(包括类型转换)做了定义!注意:该库函数⽆法对STD_LOGIC_VECTOR做任何运算。
- std_logic_unsigned/std_logic_signed : 这两个库⽂件是对std_logic_arith 的延伸,适⽤与对STD_LOGIC_VECTOR进⾏运算,std_logic_unsigned将会把STD_LOGIC_VECTOR转换成⽆符号数进⾏运算;⽽std_logic_signed 将把STD_LOGIC_VECTOR转换成有符号数进⾏运算。
2. signed、unsigned以及std_logic_vector之间的区别在讲述NUMERIC_STD之前先来阐述⼏点⼩问题。
VHDL语言的基本要素一、数据对象VHDL语言的主要数据对象有信号,变量,常量。
信号—信号是电路中的物理量,对应于电路的连线、节点;信号说明全局量,用于描述中的构造体(Architecture), 实体(Intity),程序包(package)。
变量—变量是程序运算中的中间量,并不对应电路中的物理量。
变量说明局部量,用于进程语句(process), 函数(Function), 过程(procedure)。
常量—常数也不对应电路中的物理量,当常量说明全局量,在构造体(Architecture), 实体(Intity),程序包(package),进程语句(process), 函数(Function), 过程(procedure)中均可使用。
数据对象的定义格式:signal 信号名:数据类型,约束条件,表达式Variable 变量名:数据类型,约束条件:=表达式Constant 常量名:数据类型,约束条件:=表达式例如:Variable count:INTEGER RANGE 0 TO 255:=10Constant Daly:Time:=100ns信号代入和变量赋值的区别:两者形式不同,操作过程也不相同。
变量赋值符“:=”,信号的代入符“<=”。
在变量的赋值语句中,该语句一当执行,其值立即将赋予变量;而信号的代入,其语句执行后不会立即使信号发生代入,在下条语句执行时,仍使用原来的信号值,如进程语句中的敏感表的信号代入就是如此。
二、数据类型VHDL语言中的数据类型,一般而言可分为:标量类型和组合类型。
在实际使用中,也可分成予定义类型和用户定义类型。
VHDL语言是强类型的语言,主要可按如下分类和变换处理。
①标准数据类型⑴整数⑵实数(浮点数)-1.0E+38~+1.0E38 ⑶位bit(0,1)⑷位矢量⑸布尔量,“假”,“真”⑹字符(ASCⅡ)字符⑺时间⑻错误等级⑼自然数(大于等于0的整数)⑽字符串(字符矢量)②用户定义的数据类型TYPE 数据类型名{数据类型名} 数据类型定义⑴枚举类型⑵整数类型⑶实数类型⑷数组类型⑸存取类型⑹文件类型⑺记录类型⑻时间类型③用户定义子类型SUBTUPE 子类型名IS 数据类型名[范围]例:SUBTYPE digit is INTEGER RANGE 0 TO 9④数据类型转换数据类型的变换函数通常由“STD_LOGIC_1164”,“STD_LOGIC_ARITH”,“STD_LOGIC_UNSIGNED”的程序包提供例如,在STD_LOGIC_1164程序包中,TO_STD LOGIC VECTOR(A) 由BIT_VECTOR转换为STD_LOGIC_VECTORTO_BITVECTOR(A) 由STO_LOGIC_VECTOR转为BIT_VECTORTO_STDLOGIC(A) 由BIT转换为STD_LOGICTO_BIT(A) 由STD_LOGIC转换成BIT signal a: BIT_VECTOR(11 DOWNTO 0)signal b: STD_LOGIC_VECTOR(11 DOWNTO 0)a<=X”A8” 十六进制值可赋予位矢量b<=X”A8” 语法错,十六进制不能赋予.STD 矢量b<=TO_STDLOGICVECTOR(X“AF7”)b<=TO_STDLOGICVECTOR(O“5177”)八进制变换b<=TO_STDLOGICVECTCR(B“1010_1111_0111”)下表中也给出一些典型的类型变换函数三、运算符运算符的优先级如下表所示:运算符的优先级例如,并置运算符的使用:tmp_b<=b AND (en&en&en&en) y <= a & tmp_b第一个语句表示b 的4位位矢量由en 进行选择 得到一个4位位矢量输出第二个语句表示4位位矢量a 和4位位矢量b 再 次连接(并置)构成8位的位矢量y 输出 右图所示为并置运算符操作的电路示意。
VHDL语法简单总结一个VHDL程序代码包含实体(entity)、结构体(architecture)、配置(configuration)、程序包(package)、库(library)等。
一、数据类型1.用户自定义数据类型使用关键字TYPE,例如:TYPE my_integer IS RANGE -32 TO 32;–用户自定义的整数类型的子集TYPE student_grade IS RANGE 0 TO 100;–用户自定义的自然数类型的子集TYPE state IS (idle, forward, backward, stop);–枚举数据类型,常用于有限状态机的状态定义一般来说,枚举类型的数据自动按顺序依次编码。
2.子类型在原有已定义数据类型上加一些约束条件,可以定义该数据类型的子类型。
VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。
子类型定义使用SUBTYPE关键字。
3.数组(ARRAY)ARRAY是将相同数据类型的数据集合在一起形成的一种新的数据类型。
TYPE type_name IS ARRAY (specification) OF data_type;–定义新的数组类型语法结构SIGNAL signal_name: type_name [:= initial_value];–使用新的数组类型对SIGNAL,CONSTANT, VARIABLE进行声明例如:TYPE delay_lines IS ARRAY (L-2 DOWNTO 0) OF SIGNED (W_IN-1 DOWNTO 0);–滤波器输入延迟链类型定义TYPE coeffs IS ARRAY (L-1 DOWNTO 0) OF SIGNED (W_COEF-1 DOWNTO 0);–滤波器系数类型定义SIGNAL delay_regs: delay_lines; –信号延迟寄存器声明CONSTANT coef: coeffs := ( ); –常量系数声明并赋初值4.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在ENTITY中不允许使用TYPE进行类型定义,所以必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。
VHDL 库的使用当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源.首先说明总库,语句格式 library 库名,例如:library ieee;其次调用总库中的子库,用 use调取,格式:USE 库名范围(或项目名);如use ieee.std_logic_1164.all。
VHDL中库的主要种类:IEEE库、STD库、ASIC库、 work库、用户定义库和IEEE库:含有IEEE的标准包集合“STD_LOGIC_1164”以及一些大公司提供的包集合;使用前必须说明;例: library ieee; use ieee.std_logic_1164.all; 使用标准逻辑量的定义和运算; use ieee.std_logic_unsigned.all; 无符号数算术运算的定义; use ieee.std_logic_arith.all; 使用符号数算术运算的定义。
STD库:含有“STANDARD”包集合和“TEXTIO”包集合,使用前者时无需说明;ASIC库:由各公司提供,存放与逻辑门一一对应的实体,用于ASIC设计的门级仿真,使用时需加以说明;例 library altera; use altera.maxplus2.all;library lpm; use lpm.lpm_components.all;WORK库: WORK库为现行作业库,位于当前使用时设计文件的指定保存目录; WORK使用时通常无须说明;但在结构设计中进行元件的宏调用时需要说明;例:use work.all;用户定义库:由用户自定义生成,使用时需说明(指定库所在的路径);package 包集合:用于罗列VHDL语言中使用的类型定义、信号定义、常数定义、元件定义、函数定义和过程定义等(类似于C语言中的include语句),方便不同模块的设计中公共定义的共享。
VHDL的运算符号VHDL中主要有六类运算符号:赋值运算、逻辑运算、算术运算关系运算、连接运算、移位运算运算符号主要用于各类表达式中;运算可以分为单目运算(只有一个运算量)和双目运算(针对两个运算量);进行双目运算时,两个运算量必须类型相同;VHDL中运算没有左右优先级差别,同一表达式中进行多个运算时必须用括号表达先后差别;在同类运算中,单目运算优先;在所有运算符号中,NOT的优先级别最高;在一般运算中,优先顺序排列为:算术—关系—逻辑可以通过加括号来改变运算的优先顺序;赋值运算符<= 信号赋值:将右端值赋给左端信号;:= 变量赋值:将右端值赋给左端变量;或用于赋初始值;=> 数组内部分元素赋值;适用类型:所有数据类型;赋值号两边的数据类型原则上应该相同;逻辑运算符NOT AND OR NAND NOR XOR适用类型:STD_LOGIC STD_LOGIC_VECTORBIT BIT_VECTOR BOOLEAN逻辑运算结果为同类型逻辑量;对数组类型进行逻辑运算时,参与运算的两个数据位数必须相等,所做运算为对应位进行;算术运算:/ (除)* (乘) + (加)- (减)MOD(求模)REM(取余)**(指数) ABS(绝对值)适用类型:INTEGER REAL BIT BIT_VECTOR TIME加/减运算的结果为同类型算术量;注意:算术运算大多数只用于抽象的编程(行为设计);只有少数算术运算符能够进行综合,应尽量只使用加/减;对数组类型进行算术运算时,两边位数必须相同;关系运算:=> (大于等于)<= (小于等于)> (大于)< (小于) /= (不等于)= (等于)适用类型:等于和不等于适用于所有类型;其他运算适用于整数、实数、位、位矢量,以及枚举类型和数组类型;可比较位长度不相同的情况(从左向右逐位比较);关系运算的结果为boolean类型: false true注意:小于等于符号与信号赋值符号的写法相同,应注意使用位置和意义;连接运算:&适用类型bit bitvector character stringstd_logic std_logic_vector连接运算结果为同类型元素构成的数组;库和包集合除了实体、结构体外的第三种可编程结构Library 库编译后数据的集合,存放包集合定义、实体定义、构造体定义和配置定义,其功能相当于其他操作系统中的目录,经过说明后,设计中就可以使用库中的数据,实现共享;在前面图形输入的应用中,已多次采用库中的单元进行设计;库的使用:当使用库时,需要说明使用的库名称,同时需要说明库中包集合的名称及范围;每个实体都应独立进行库的说明;库的说明应该在实体之前;经过说明后,实体和结构体就可以自动调用库中的资源;库说明语句格式library 库名;use 库名.包集合名.范围(或项目名);例: library ieee;use ieee.std_logic_1164.all;VHDL中库的主要种类:IEEE库STD库ASIC库work库用户定义库IEEE库:含有IEEE的标准包集合“STD_LOGIC_1164”以及一些大公司提供的包集合;使用前必须说明;例:library ieee;use ieee.std_logic_1164.all; 使用标准逻辑量的定义和运算;use ieee.std_logic_unsigned.all; 无符号数算术运算的定义;use ieee.std_logic_arith.all; 使用符号数算术运算的定义;STD库:含有“STANDARD”包集合和“TEXTIO”包集合,使用前者时无需说明;ASIC库:由各公司提供,存放与逻辑门一一对应的实体,用于ASIC 设计的门级仿真,使用时需加以说明;例library altera;use altera.maxplus2.all;library lpm;use lpm.lpm_components.all;WORK库:WORK库为现行作业库,位于当前使用时设计文件的指定保存目录;WORK使用时通常无须说明;但在结构设计中进行元件的宏调用时需要说明;例:use work.all;用户定义库:由用户自定义生成,使用时需说明(指定库所在的路径);package 包集合用于罗列VHDL语言中使用的类型定义、信号定义、常数定义、元件定义、函数定义和过程定义等(类似于C语言中的include语句),方便不同模块的设计中公共定义的共享;数字电路设计中经常使用的包集合:ieee.std_logic_1164 逻辑量的定义ieee.std_logic_arith 数据转换,逻辑判断ieee.std_logic_unsigned 算术运算std.textio 文本数据输入/输出格式包集合在使用前必须采用use语句进行说明(在设计程序的最前面);包集合可以由用户自定义;包的结构与定义:(用户自定义的包集合)包集合标题+(包集合体)包集合标题:package 包集合名 is说明语句;(只有名称)end 包集合名;包集合体:package body包集合名 is说明语句;(完整定义)end 包集合名;例:(函数取自p.279 表4-38 )library ieee;use ieee.std_logic_1164.all;packge upac isconstant k: integer := 4;subtype cpu_bus is std_logic_vector(k-1downto 0); function conv_integer (x:std_logic_vector) return integer; end upac;packge body upac isfunction conv_integer (x: std_logic_vector) return integer is variable result: integer;beginresult := 0;for I in x'range loopresult :=result*2;case x(i) iswhen '0'|'L' => null;when '1'|'H' => result := result+1;when others => null;end case;end loop;return result;end conv_integer;end upac;用户自行编写的包集合将自动存放于WORK库中,使用时可采用下列语句调用use work.upac.all;configuration 配置在一个实体内可以编写多种不同的构造体,通过配置语句来进行选择;配置语句格式:configuration 配置名 of 实体名 isfor 选择的构造体名end for;end 配置名;此语句可以为设计增加更大的灵活性,可以对不同构造体进行比较。
关于VHDl语言提供的库VHDL提供5个库,IEEE库,STD库,VITAL库,自定义库和WORK库IEEE库包含的常用程序包有:std_logic_1164:常用数据类型(其中有std_logic、std_logic_vector数据类型)和函数的定义、各种类型转换函数及逻辑运算。
std_logic_arith:它在std_logic_1164的基础上定义了无符号数unsigned、有符号数signed数据类型并为其定义了相应的算术运算、比较,无符号数unsigned、有符号数signed及整数integer之间转换函数。
std_logic_unsigned和std_logic_signed:定义了integer数据类型和std_logic及std_logic_vector数据类型混合运算的运算符,并定义了一个由std_logic_vector型到integer型的转换函数。
其中std_logic_signed中定义的运算符是有符号数运算符。
STD库是标准库,包含两个程序包:standard:定义了基本数据类型、子类型和函数及各种类型的转换函数等。
textio文本程序包:定义了支持文本文件操作的许多类型和子程序等。
在使用textio 程序包之前,需要先写上use语句use std.txtio.all。
STD库为所有设计单元所隐含定义,在使用前不需另外加以声明。
VITAL库:使用VITAL可以提高门级时序仿真的精度,一般在VHDL语言程序进行仿真时使用。
主要包含两个程序包。
VITAL_timing:时序仿真包VITAL_primitives:基本单元程序包。
现在的EDA开发工具都已将VITAL库的程序包加到IEEE库了。
WORK库:是现行的工作库,设计人员设计的VHDL语言程序的编译结果不需任何说明,都将存放在WORK库中。
WORK库可以是设计者个人使用,也可提供给设计组多人使用。
此库为所有设计单元所隐含定义,在使用前也不需另外加以声明。
VHDL的数据类型1、预定义的数据类型std库的standard包集:定义了位(BIT)、布尔(Boolean)、整数(integer)和实数(real)数据类型。
ieee库的std_logic_1164包集:定义了std_logic和std_ulogic数据类型。
ieee库的std_logic_arith包集:定义了signed和unsigned数据类型。
还定义了conv_integer(p),conv_unsigned(p,b)和conv_signed(p,b)和conv_std_logic_vector(p,b)等数据类型转换函数。
ieee库的std_logic_signed和std_logic_unsigned包集:包含⼀些函数,这些函数可以使std_logic_vecture类型的数据进⾏像signed和unsigned类型数据⼀样的运算。
位(bit)和位⽮量(bit_vector):位值⽤'0'或'1'表⽰。
例:signal x:bit;将x声明为⼀个位宽为1的bit类型的信号。
signal y:bit_vector(3 downto 0);将y声明为⼀个位宽为4的位⽮量,其中最左边的⼀位是最⾼位(MSB:most significant bit)。
signal w:bit_vector(0 downto 7);--将w声明为⼀个位宽为8的位⽮量,它的最右边的⼀位是MSB。
在定义了上述信号以后,可以采⽤下⾯的⽅式对信号赋值(必须使⽤"<="操作符给信号赋值)。
x<='1';--x是位宽为1,值为'1'的信号。
注意,当位宽为1时,位值放在单引号中。
y<="0111";y是位宽为4,值为"0111"(MSB='0')的信号。
注意,当位宽⼤于1时,位⽮量值放在双引号中。
VHDL数值数据类型(1)整数(integer)定义位置:在std库的standard程序包中进⾏定义。
即数值范围为-2^31~2^31。
(2)⽆符号(unsigned)和有符号(signed)类型定义位置:有符号(signed)和⽆符号(unsigned)逻辑信号定义在库IEEE的程序包std_logic_arith中。
⽆符号类型数据代表⽆符号数值,即代表0或正数;最左边的位为最⾼位。
如:unsigned(“0110”)为+6,unsigned(“1010”)为+10.有符号类型数据代表有符号数值,即可以是正数,0,负数;编译器将有符号数据类型作为⼀个补码的⼆进制数,最左边的位为符号位。
如:signed(“0110”)代表+6;signed(“1010”)代表-2。
程序:library IEEE;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity data isport( a,b:in unsigned(3 downto 0); %a,b:in signed(3 downto 0);c:out std_logic);end data;architecture m1 of data isbeginc<='1' when a<b else '0';end m1;当定义成⽆符号数据类型时,若a="1000",b="0001",即a=8,b=1.则结果是a>b,c='0';当定义成有符号数据类型时,若a="1000",b="0001",即a=-8,b=1.则结果是a<b,c='1';。