ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:26.22KB ,
资源ID:25823641      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25823641.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VHDL语法简单总结.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VHDL语法简单总结.docx

1、VHDL语法简单总结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、般来说,枚举类型的数据自动按顺序依次编码。2.子类型在原有已定义数据类型上加一些约束条件,可以定义该数据类型的子类型。VHDL不允许不同类型的数据直接进行操作运算,而某个数据类型的子类型则可以和原有类型数据直接进行操作运算。子类型定义使用SUBTYPE关键字。3.数组(ARRAY)ARRAY是将相同数据类型的数据集合在一起形成的一种新的数据类型。TYPE type_name IS ARRAY (specification) OF data_type;定义新的数组类型语法结构SIGNAL signal_name: type_name := initial_value;使用新的数组类型对SIGNA

3、L,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.端口数组在定义电路的输入/输出端口时,有时需把端口定义为矢量阵列,而在

4、ENTITY中不允许使用TYPE进行类型定义,所以必须在包集(PACKAGE)中根据端口的具体信号特征建立用户自定义的数据类型,该数据类型可以供包括ENTITY在内的整个设计使用。PACKAGE-library ieee;use ieee.std_logic_1164.all;PACKAGE my_data_types ISTYPE vector_array IS ARRAY (natural range ) OF STD_LOGIC_VECTOR(7 DOWNTO 0); 声明8位的数组END my_data_types;Main Codelibrary ieee;use ieee.std_

5、logic_1164.all;use work.my_data_types.all; 用户自定义包集ENTITY mux ISPORT (inp: IN vector_array(0 to 3);END mux;-5.有符号数和无符号数要使用SIGNED和UNSIGNED类型数据,必须在代码开始部分声明ieee库中的包集std_logic_arith。它们支持算术运算但不支持逻辑运算。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;SIGNAL a: IN SIGNED (7 DOWNTO 0);SIG

6、NAL b: IN SIGNED (7 DOWNTO 0);SIGNAL x: IN SIGNED (7 DOWNTO 0);v = a + b;w = a AND b;非法(不支持逻辑运算)-STD_LOGIC_VECTOR类型的数据不能直接进行算术运算,只有声明了std_logic_signed和std_logic_unsigned两个包集后才可以像SIGNED和UNSIGNED类型的数据一样进行算术运算。6.数据类型转换在ieee库的std_logic_arith包集中提供了许多数据类型转换函数:1. conv_integer(p): 将数据类型为INTEGER,UNSIGNED,SIG

7、NED,STD_ULOGIC或STD_LOGIC的操作数p转换成INTEGER类型。不包含STD_LOGIC_VECTOR。2 conv_unsigned(p,b):将数据类型为INTEGER,UNSIGNED,SIGNED或STD_ULOGIC的操作数p转换成位宽为b的UNSIGNED类型数据。3 conv_signed(p,b):将数据类型为INTEGER, UNSIGNED, SIGNED或STD_ULOGIC的操作数p转换成位宽为b的SIGNED类型的数据。4 conv_std_logic_vector(p, b):将数据类型为INTEGER, UNSIGNED, SIGNED或STD

8、_LOGIC的操作数p转换成位宽为b的STD_LOGIC_VECTOR类型的数据。二、运算操作符和属性1.运算操作符l赋值运算符赋值运算符用来给信号、变量和常数赋值。用于对矢量中的某些位赋值,或对某些位之外的其他位赋值(常用OTHERS表示)。例:SIGNAL x: STD_LOGIC;VARIABLE y: STD_LOGIC_VECTOR(3 DOWNTO 0);最左边的位是MSBSIGNAL w: STD_LOGIC_VECTOR(0 TO 7);最右边的位是MSBx = 1;y := “0000”;w = “1000_0000”; LSB位为1,其余位为0w 1, OTHERS = 0

9、); LSB位是1, 其他位是0l逻辑运算符操作数必须是BIT, STD_LOGIC或STD_ULOGIC类型的数据或者是这些数据类型的扩展,即BIT_VECTOR, STD_LOGIC_VECTOR,STD_ULOGIC_VECTOR。VHDL的逻辑运算符有以下几种:(优先级递减)NOT 取反AND 与OR 或NAND 与非NOR 或非XOR 异或l算术运算符操作数可以是INTEGER, SIGNED, UNSIGNED, 如果声明了std_logic_signed或std_logic_unsigned,可对STD_LOGIC_VECTOR类型的数据进行加法或减法运算。+ 加- 减* 乘/

10、除* 指数运算MOD 取模REM 取余ABS 取绝对值加,减,乘是可以综合成逻辑电路的;除法运算只在除数为2的n次幂时才能综合,此时相当于对被除数右移n位;对于指数运算,只有当底数和指数都是静态数值(常量或GENERIC参数)时才是可综合的;对于MOD运算,结果的符号同第二个参数的符号相同,对于REM运算,结果的符号同第一个参数符号相同。l关系运算符=, /=, , =左右两边操作数的类型必须相同。l移位操作符 其中左操作数必须是BIT_VECTOR类型的,右操作数必须是INTEGER类型的(可以为正数或负数)。VHDL中移位操作符有以下几种:usll逻辑左移 数据左移,右端补0;usrl逻辑

11、右移 数据右移,左端补0;usla算术左移 数据左移,同时复制最右端的位,填充在右端空出的位置;usra算术右移 数据右移,同时复制最左端的位,填充在左端空出的位置;urol循环逻辑左移 数据左移,从左端移出的位填充到右端空出的位置上;uror循环逻辑右移 数据右移,从右端移出的位填充到左端空出的位置上。例:x = “01001”,那么:y = x sll 2;逻辑左移2位,y=”00100”y = x sla 2;算术左移2位,y=”00111”y = x srl 3;逻辑右移3位,y=”00001”y = x sra 3;算术右移3位,y=”00001”y = x rol 2;循环左移2位

12、,y=”00101”y = x srl -2;相当于逻辑左移2位l并置运算符用于位的拼接,操作数可以是支持逻辑运算的任何数据类型。有以下两种:&(, , , )与Verilog中的功能一样。2.属性(ATTRIBUTE)l数值类属性数值类属性用来得到数组、块或一般数据的相关信息,例如可用来获取数组的长度和数值范围等。以下是VHDL中预定义的可综合的数值类属性:dLOW返回数组索引的下限值dHIGH返回数组索引的上限值dLEFT返回数组索引的左边界值dRIGHT返回数组索引的右边界值dLENGTH 返回矢量的长度值dRANGE返回矢量的位宽范围dREVERSE_RANGE 按相反的次序返回矢量的

13、位宽范围例:定义信号 SIGNAL d: STD_LOGIC_VECTOR(7 DOWNTO 0);则有:dLOW = 0, dHIGH = 7, dLEFT = 7, dRIGHT = 0, dLENGTH = 8,dRANGE = (7 DOWNTO 0), dREVERSE_RANGE = (0 TO 7).l信号类属性对于信号s,有以下预定义的属性(可综合的):sEVENT若s的值发生变化,则返回布尔量TRUE,否则返回FALSEsSTABLE 若s保持稳定,则返回TRUE,否则返回FALSE例:clk的上升沿判断IF (clkEVENT AND clk = 1)IF (NOT clk

14、STABLE AND clk = 1)WAIT UNTIL (clkEVENT AND clk = 1)3.通用属性语句GENERIC语句提供了一种指定常规参数的方法,所指定的参数是静态的,增加了代码的可重用性,类似于Verilog中的parameter与defparam。GENERIC语句必须在ENTITY中进行声明,由GENERIC语句指定的参数是全局的,不仅可在ENTITY内部使用,也可在后面的整个设计中使用。语法结构如下:GENERIC (parameter_name: parameter_type := parameter_value);用GENERIC语句指定多个参数:GENERI

15、C (n: INTEGER := 8; vector: BIT_VECTOR := “0000_1111”);三、并发代码VHDL中并发描述语句有WHEN和GENERATE。除此之外,仅包含AND, NOT, +, *和sll等逻辑、算术运算操作符的赋值语句也是并发执行的。在BLOCK中的代码也是并发执行的。从本质上讲,VHDL代码是并行执行的。只有PROCESS, FUNCTION, PROCEDURE内部的代码才是顺序执行的。但是当它们作为一个整体时,与其他模块之间又是并行执行的。并发代码称为“数据流”代码。通常我们只能用并发描述语句来实现组合逻辑电路,为了实现时序逻辑电路,必须使用顺序描

16、述语句。事实上,使用顺序描述语句可以同时实现组合逻辑电路和时序逻辑电路。在并发代码中可以使用以下各项:运算操作符WHEN语句(WHEN/ELSE或WITH/SELECT/WHEN)GENERATE语句BLOCK语句使用运算操作符运算类型运算操作符操作数类型逻辑运算NOT, AND, NAND,ORNOR, XOR, XNORBIT, BIT_VECTOR, STD_LOGIC, STD_LOGIC_VECTORSTD_ULOGIC, STD_ULOGIC_VECTOR算术运算符+, , *, /, *INTEGER, SIGNED, UNSIGNED比较运算符=, /=, , =任意数据类型移

17、位运算符sll, srl, sla, sra, rol, rorBIT_VECTOR并置运算符&,(, , ,)STD_LOGIC, STD_LOGIC_VECTOR, STD_ULOGICSTD_ULOGIC_VECTOR, SIGNED, UNSIGNEDWHEN语句WHEN语句是一种基本的并发描述语句,有两种形式:WHEN/ELSE和WITH/SELECT/WHEN。WHEN/ELSE语法结构:assignment WHEN condition ELSEassignment WHEN condition ELSE;WITH/SELECT/WHEN语法结构WITH identifier S

18、ELECTassignment WHEN value,assignemnt WHEN value,;当使用WITH/SELECT/WHEN时,必须对所有可能出现的条件给予考虑,使用关键字OTHERS,如果在某些条件出现时不需要进行任何操作,那应该使用UNAFFECTED。例:-with WHEN/ELSE-Output = “000” WHEN (inp = 0 OR reset = 1) ELSE“001” WHEN ctl = 1 ELSE“010”;with WITH/SELECT/WHENWITH control SELECTOutput = “000” WHEN reset,“111

19、” WHEN set,UNAFFECTED WHEN OTHERS;对于WHEN语句,WHEN value的描述方式有以下几种:WHEN value针对单个值进行判断WHEN value1 to value2针对取值范围进行判断WHEN value1 | value2 | 针对多个值进行判断GENERATE语句GENERATE语句和顺序描述语句中的LOOP语句一样用于循环执行某项操作,通常与FOR一起使用。语法结构如下:label: FOR identifier IN range GENERATE(concurrent assignments)END GENERATEGENERATE语句还有另

20、一种形式:IF/GENERATE,此处不允许使用ELSE。IF/GENERATE可以嵌套在FOR/GENERATE内部使用。反之亦然。Label1: FOR identifier IN range GENERATELabel2: IF condition GENERATE(concurrent assignments)END GENERATE;END GENERATE;例:SIGNAL x: BIT_VECTOR(7 DOWNTO 0);SIGNAL y: BIT_VECTOR(15 DOWNTO 0);SIGNAL z: BIT_VECTOR(7 DOWNTO 0);G1: FOR i IN

21、 xRANGE GENERATEz(i) = x(i) AND y(i+8);END GENERATE;GENERATE中循环操作的上界和下界必须是静态的,在使用过程中还要注意多值驱动问题。例:OK: FOR i IN 0 TO 7 GENERATEOutput(i) = 1 WHEN (a(i) AND b(i) = 1 ELSE 0;END GENERATE;NotOK: FOR i IN 0 TO 7 GENERATEaccum = “1111_1111”WHEN(a(i) AND b(i) = 1 ELSE “0000_0000”;END GENERATE;-NotOK: FOR i

22、IN 0 TO 7 GENERATEAccum = accum + 1 WHEN x(i) = 1;END GENERATE;-块语句(BLOCK)VHDL中有两种BLOCK:simple BLOCK和guarded BLOCK。nSimple BLOCKSimple BLOCK仅仅是对原有代码进行区域分割,增强整个代码的可读性和可维护性。语法结构如下:label:BLOCKdeclarative partBEGIN(concurrent statement)END BLOCK label;-ARCHITETURE exampleBEGINblock1: BLOCKBEGINEND BLOCK

23、 block1;block2: BLOCKBEGINEND BLOCK block2;END example;例:b1: BLOCKSIGNAL a: STD_LOGIC;BEGINa = input_sig WHEN ena = 1 ELSE z;END BLOCK b1;-无论是simple BLOCK还是guarded BLOCK,其内部都可以嵌套其他的BLOCK语句,相应的语法结构如下:label1: BLOCK顶层BLOCK声明部分BEGIN顶层BLOCK并发描述部分label2: BLOCK嵌套BLOCK声明部分BEGIN嵌套BLOCK并发描述部分END BLOCK label2;

24、顶层BLOCK其他并发描述语句END BLOCK label1;nGuarded BLOCK多了一个卫式表达式,只有当卫式表达式为真时才能执行。语法结构如下:Label: BLOCK(卫式表达式)声明部分BEGIN(卫式语句和其他并发描述语句)END BLOCK label;四、顺序代码在PROCESS, FUNCTION, PROCEDURE内部的代码都是顺序执行的,这样的语句包括IF,WAIT,CASE和LOOP。变量只能在顺序代码中使用,相对于信号而言,变量是局部的,所以它的值不能传递到PROCESS,FUNCTION和PROCEDURE的外部。1.进程(PROCESS)进程内部经常使用

25、IF,WAIT,CASE或LOOP语句。PROCESS具有敏感信号列表(sensitivity list),或者使用WAIT语句进行执行条件的判断。PROCESS必须包含在主代码段中,当敏感信号列表中的某个信号发生变化时(或者当WAIT语句的条件得到满足时),PROCESS内部的代码就顺序执行一次。语法结构如下:label: PROCESS (sensitivity list)VARIABLE name type range := initial_value; BEGIN(顺序执行的代码)END PROCESS label;如果要在PROCESS内部使用变量,则必须在关键字BEGIN之前的变量

26、声明部分对其进行定义。变量的初始值是不可综合的,只用于仿真。在设计同步电路时,要对某些信号边沿的跳变进行监视(时钟的上升沿或下降沿)。通常使用EVENT属性来监视一个信号是否发生了变化。2.信号和变量信号可在PACKAGE,ENTITY和ARCHITECTURE中声明,而变量只能在一段顺序描述代码的内部声明。因此,信号通常是全局的,变量通常是局部的。赋予变量的值是立刻生效的,在后续的代码中,此变量将使用新的变量值,而信号的值通常只有在整个PROCESS执行完毕后才开始生效。3.IF语句IF/ELSE语句在综合时可能会产生不必要的优先级解码电路。IF语句语法结构如下:IF conditions THEN assignments;ELSIF conditions THEN assignments;ELSE assignments;END IF;例:IF (x y) temp := “1

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1