免费预览已结束,剩余297页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 vhdl语言与应用设计,3.1 vhdl硬件描述语言简介 3.2 vhdl的结构与语言要素 3.3 vhdl的基本语句 3.4 vhdl应用设计实例,3.1 vhdl硬件描述语言简介,vhdl(vhsic hardware description language)是一种标准的硬件描述语言, 它是在20世纪7080年代中, 由美国国防部资助的vhsic (very high speed integrated circuit)项目开发的产品。 在这个语言首次开发出来时, 其目标仅是使电路文本化的一种标准, 为了使人们采用文本方式描述的设计, 能够被其他人所理解。,1987年,vhdl被正式确定为ieee 1076标准。 vhdl可使各种复杂度(系统级、 电路板级、 芯片级、 门级)的电路网络在同一抽象程度上被描述。 1993年,ieee 1076标准被升级、 更新, 新的vhdl标准为ieee 1164。 1996年, ieee 1076.3成为vhdl综合标准。,(1). vhdl的优点,vhdl已成为一个数字电路和系统的描述、 建模、 综合的工业标准。 在电子产业界, 无论asic设计人员, 还是系统级设计人员, 都需要学习vhdl, 来提高工作效率。 由于vhdl所具有的通用性, 它成为可支持不同层次设计者需求的标准语言。 vhdl有如下所述的一些优点。,1)功能强大, 灵活性强 vhdl具有功能强大的语言结构, 可用简洁明确的代码描述来进行复杂控制逻辑的设计。 它还具有多层次的设计描述功能, 支持设计库和可重复使用的元件生成。 vhdl是一种设计、 模拟、 综合的标准硬件描述语言。,2)不依赖于器件设计 vhdl允许设计者生成一个设计, 而并不需要首先选择一个用来实现设计的器件。 对于同一个设计描述, 可以采用多种不同的器件结构来实现其功能。 若需对设计进行资源利用和性能方面的优化, 也并不是要求设计者非常熟悉器件的结构才行。,3)可移植性 因为vhdl是一个标准语言, 故vhdl的设计描述可以被不同的工具所支持, 可以从一个模拟工具移植到另一个模拟工具, 从一个综合工具移植到另一个综合工具, 从一个工作平台移植到另一个工作平台去执行。,4)性能评估能力 非依赖器件的设计(device independent design)和可移植能力允许设计者采用不同的器件结构和不同的综合工具来评估设计。 设计者可以进行一个完整的设计描述, 并且对其进行综合, 生成选定的器件结构的逻辑功能, 然后评估结果, 选用最适合你设计需求的器件。 为了衡量综合的质量, 可用不同的综合工具所得到的综合结果来进行分析、 评估。,(2). vhdl的不足之处,vhdl的不足之处是: (1) 电路采用高级的简明结构vhdl描述, 意味着放弃了对电路门级实现定义的控制; (2) 由综合工具生成的逻辑实现效果有时不优化; (3) 采用工具的不同导致综合质量不一样。,vhdl设计数字系统,可划分为6个步骤: (1) 设计要求的定义; (2) 用vhdl进行设计描述(系统描述与代码设计); (3) 原代码模拟; (4) 设计综合、 设计优化和设计的布局布线; (5) 布局、 布线后的设计模块模拟; (6) 设计实现的工作(如芯片的物理版图设计、 可编程门阵列器件的编程等)。,(3). vhdl的设计步骤,(4). vhdl程序的结构,库说明(library),程序包使用说明(use),实体说明(entity),结构体(architecture),配置(configuration),在vhdl中, 基本单元是设计实体。 设计实体可以是整个系统, 如像cpu那样复杂的系统,也可以是一个芯片、 逻辑器件, 或者是一个最简单的门电路。 在vhdl中, 设计实体可以代表任何一个模块, 它可以是某个层次中的一个元件, 也可以是设计中的顶层模块。,设计实体由实体说明和构造体(结构体)所组成。 实体说明用来描述电路的外部特征(接口说明)。 构造体用来描述电路的内部逻辑。,图 设计实体的组成,3.2 vhdl的结构与语言要素,vhdl语言是现代数字系统设计的基本硬件描述语言。 vhdl+eda工具+fpga器件, 构成了典型的数字系统现场集成设计方式, 正推动着数字系统设计技术的进步。 ,vhdl硬件描述语言语法的基本要素是: 数据对象、 数据类型、 运算符和标识符。,3.2.1 vhdl基本要素,3.2.1.1 数据对象(data object),定义:可以赋予一个值的对象 vhdl语言的数据对象有: 信号、 变量、 常量,信号,是描述硬件系统的基本数据对象,类似于电路内部的连线和节点。 信号说明全局量, 用于描述中的结构(构造)体(architecture)、 实体(entity)和程序包(package)。,信号定义: signal 信号名: 数据类型: =初始值 信号定义示例: signal sl: std_logic:=0 定义了一个标准的单值信号sl,初始值为低电平。 signal s2: std_logic_vector(15 downto 0) 定义了一个标准的位矢量信号s2,共有16个信号元素。,信号定义了数据类型后,就可对其赋值。信号的赋值语句格式为: 目标信号名=表达式; 例:a=y; a=1; s1=s2 after 10ns; 表示s2经10ns延迟后,其值才赋值到s1中。,变量,是指在设计实体中值会发生变化的量,程序运算中的中间量。 用于对暂时数据进行存储,是局部量。 其主要作用是用在进程中作为临时的数据存储单元。,变量定义的语句格式为: variable 变量名:数据类型:=初始值 例:variable a:integer range 0 to 15; 定义a的取值范围是从0到15的整型变量 variable b, c:integer:=2; 定义b,c为初始值2的整型变量 variable d:std_logic; 定义d为标准逻辑位类型的变量,变量赋值格式为: 目标变量名:=表达式; 其中,变量赋值符号是“:=”; “表达式”必须是一个与“目标变量名”具有相同数据类型的数值。 表达式可以是一个运算表达式,也可是一个数值。 目标变量可以是单值变量,也可是一个变量的集合,如位矢量类型的变量。,例: variable x, y:real; variable a, b:std_logic_vector(7 downto 0); x:=100.0; 实数赋值 y:=1.5+x; 运算表达式赋值 a:=“10111011”; 位矢量赋值; a(0 to 5):=b(2 to 7); 段赋值,常量,指在vhdl程序中值一经定义,就不再发生变化的量。 常量的物理意义在于用来代表硬件电路的电源或地线。 常量在构造体(architecture)、 实体(entity)、 程序包(package)、 进程语句(process)、 函数(function)和过程(procedure)中均可使用。,常量在使用之前必须进行说明,其说明语句为: constant 常量名,常量名:数据:=表达式; 常量说明示例: constant vcc: real:=5.0; constant gnd: real:=0.0; constant number: integer:=8; constant delay_time: real:=10ns;,信号和变量的区别,变量赋值是直接生效的,没有延迟;而信号赋值有延时。 变量赋值符为“:=”, 信号代入符为“=”。 进程对变量不敏感而对信号敏感。即在变量的赋值语句中, 该语句一旦执行, 其值立即将赋予变量; 而信号的代入, 其语句执行后不会立即使信号发生代入, 在下条语句执行时, 仍使用原来的信号值, 如进程语句中的敏感表的信号代入就是如此。,3.2.1.2. 数据类型,vhdl语言是强类型语言,对各操作数的数据类型有严格要求。 它的数据类型一般可分为标量类型和组合类型, 在实际使用中, 也可分成预定义类型和用户定义类型。,(1) 预定义类型,1) 标准数据类型 整数; 不同进制整数常量示例: 2: 十进制整数 10e4: 十进制整数 12_345_678(=12345678) 16#d2#: 十六进制整数 整数文字均是十进制的数。,以数制基数表示对文字,格式为 基数 # 基于该基的整数.基于该基的整数#e 指数 其中,第1部分是用十进制数标明数制进位的基数; 第2部分是数制隔离符号“#”; 第3部分是表达的文字; 第4部分是指数隔离符号“#”; 第5部分是用字符“e”加十进制表示的指数部分。,例: 10#254# -十进制表示,等于254 2#1111_1110# -二进制表示,等于254 16#fe# -十六进制表示,等于254 8#367# -八进制表示,等于254, 实数(浮点数,取值范围-1.0e+38+1.0e38); 实数文字也是十进制的数,但需带小数点,如 188.993, 1.0 位数据(bit; 0, 1),取值只能为 1,0; constant c: bit:=1;值为1的位类型常量c variable q: bit:=0;值为0的位类类型变量q signal a, b: bit; 两个位类型常量a, b, 位矢量; 是基于bit数据类型的数组,如“10110101” 使用位矢量需要注明位宽,即数组中元素的个数和排列,例如: signal a:bit_vector (7 downto 0) 信号a定义为一个具有8位位宽的矢量, 布尔量(“假”, “真”); false ,true, 字符(ascii字符); 通常用单引号括起来,如a; 字符区分大小写,如b;不同于b; vhdl中,标识符的大小写是不区分的,但字符的大小写是有区别的。, 时间; 完整的时间类型包括整数和物理量单位,且整数和单位之间至少留一个空格,如:55 ms,20 ns。 错误等级; 用以表征系统工作状态,一般有四种:note(注意),warning(警告),error(出错),failure(失败), 自然数(大于等于0的整数); (10) 字符串(字符矢量)。 即字符串数组,必须用双撇号标明,如 variable string_var: string(1 to 7) string_var: “a b c d”,vhdl有2种字符串:文字字符串和数位字符串。 (1)文字字符串 是用双硬撇号引起来的一串文字,如: “error”, “x”, “oth s and”,(2)数位字符串 也称位矢量,是用字符形式表示的多位数码,表示二进制、八进制或十六进制的数组。 数位字符串的表示首先要有计数基数,然后将该基数表示的值放在双引号中,基数符以b,o,x表示,并放在字符串的前面。 b:二进制基数符号,表示二进制数位0或1,在字符串的每一位表示一个比特。,o:八进制基数符号(07),在字符串的每一个数表示八进制数,即代表一个3位的二进制数。 x:十六进制基数符号(0f),在字符串的每一个数表示十六进制数,即代表一个4位的二进制数。 例:b“111011110” - 二进制数数组,位矢量数组长度9 o “15” - 八进制数数组,位矢量数组长度6 x“ad0” - 十六进制数数组,位矢量数组长度12,用户自定义数据类型用类型定义语句type实现: type 数据类型名 数据类型名 数据类型定义 枚举类型; 整数类型; 实数类型; 数组类型; 存取类型; 文件类型; 记录类型; 时间类型。,(2) 用户定义的数据类型, 枚举类型 是一类的数据类型,用文字符号来表示一组实际的二进制数。 例: type state1 is (st0, st1, st2, st3) 用以表达4个状态的位矢量长度可以为2,编码默认值为: st0=”00“, st1=”01“, st2=”10“, st3=”11“ 一般将第一个枚举量的编码为0或0000等,以后的编码值依次加1., 数组类型 将一组具有相同类型的元素集合在一起,作为一个数据对象来处理的数据类型。 数组定义格式: type 数组类型名 is array 约束范围 of 数据类型 实例: type stb is arrary (7 downto 0) of std_logic 数组名是stb,各元素分别为stb(7),stb(0),若一个对象可能取值范围是某个类型说明定义范围的子集,则需用到子类型。 subtype 子类型名 is 数据类型名范围 例: subtype digit is integer range 0 to 9(子类型digit为整数的09范围) 子类型digits是把integer约束到只含10个值的数据类型。,(3) 用户定义子类型,1 函数转换法 数据类型的变换函数通常由“std_logic_1164”、 “std_logic_arith”、 “std_logic_unsigned” 的程序包等提供。,(4) 数据类型转换,表 典型的类型变换函数,以下语句表示bit_vector和std_logic_vector的赋值语句: a=x“a8“ 十六进制值可赋予位矢量 b=to_stdlogicvector(x“af7“) b=to_stdlogicvector(o“5177“) 八进制变换 b=to_stdlogicvector(b“1010_1111_0111“),2 类型标记转换法 直接利用类型名进行数据类型的转换,与高级语言的强制类型转换类似。 其语句格式为: 数据类型标志(表达式): 例:variable a:integer; varibale b: real; a:=integer (b); b:=real (a);,3.2.1.3 vhdl操作符,vhdl的各种表达式由操作数和操作符组成。其中操作数是各种运算的对象,而操作符则规定运算的方式。 vhdl操作符包括逻辑操作符,关系操作符,算术操作符和重载运算符。,表 vhdl中的运算符的优先级,操作符的使用说明,遵循在操作符之间的操作数是相同数据类型的原则。 当一个表达式中有两个以上的运算符时,可使用括号将这些运算分组。 若一串逻辑运算中的算符相同,且是and,or,xor这三个算符中的一种,则不需使用括号;其他情况则需使用括号。,例:逻辑运算的vhdl描述 signal a, b, c: std_logic_vector(3 downto 0); signal d, e, f, g: std_logic_vector(1 downto 0); signal h, i, j, k: std_logic; signal s, m, n, o, p: bollean; ,a=b and c; d=e or f or g; -两个操作符or相同,不需括号 s= (m xor n) and (o xor p);-操作符不同,需加括号 h=i and j and k; -操作符相同,不需加括号,算符操作符号中的并置运算符&的操作数的数据类型是一维数组,可以利用其将普通操作数或数组组合起来形成新的数组。 “vh”&“dl”的结果为“vhdl”,例如, 并置运算符的使用: tmp_b=b and (en 第二个语句表示4位位矢量a和4位位矢量b再次连接(并置), 构成8位的位矢量y输出。 图所示为并置运算符操作的电路示意。,图 并置运算符操作,重载运算符(overloaded operators),是基本操作符作重新定义的函数型操作符。 很多重载运算符是由ieee 1164和ieee 1076.3标准所定义的。 例如, ieee 1076标准定义了类型为signed和integer以及unsigned和natural重载运算符的函数。,运算符的重载函数在ieee 1076.3标准的numeric_std集合包中被定义。 使用时, 此集合包必须用use从句, 使之对设计实体可见。 library ieee; use ieee.std_logic_1164.all; use work.numeric_std.all; entity compare is port( a: in unsigned (3 downto 0); x: out std_logic; end add_vec; architecture compare of compare is begin x= 1 when a= 123 else 1; end;,标识符的基本作用就是给vhdl中的语法单位起一个独特的名字, 以区别于其它的语法单位。 标识符可以是常数、变量、信号、端口、子程序或参数的名字。 在vhdl 87中有关标识符的语法规范被vhdl 93全部接受并加以扩展。 下面分别介绍扩展前后的标识符命名规则。 为了对二者加以区别, 前者称为短标识符, 后者则称为扩展标识符。,3.2.1.4标识符,1) 短标识符 vhdl 87中的短标识符遵循以下命名规则。 有效字符包括: 英文字母(az, az)、 数字(09)和下划线(_); 必须以英文字母打头; 下划线(_)的前后都必须有英文字母或者数字; 不区分大小写。 在vhdl设计中, 应该注意在定义短标识符时, 避开使用vhdl中的保留字。 这些保留字如下:,2) 扩展标识符 vhdl 93中对标识符进行了扩展, 扩展后的标识符遵循以下语法规则。 扩展标识符用反斜杠来分隔。 如: adder, begin_add 扩展标识符允许包含图形符号及空格等。 如: counter&adder, entity%end 扩展标识符的两个反斜杠之间可以用保留字。 如: entity, architecture,扩展标识符的两个反斜杠之间可以用数字打头。 如: 1adder, 44counter 扩展标识符中允许多个下划线相连。 如: addercounter 同名的扩展标识符和短标识符不表示同一名称。 如: adder和adder不相同。 扩展标识符中如果含有一个反斜杠, 可以两个反斜杠来代替。 如: addercounter表示的扩展标识符名称为addercounter。 扩展标识符要区分大小写:gate和gate不同 扩展标识符规则使得vhdl中的标识符的定义更加自由。,3.2.2 vhdl程序的结构,采用vhdl进行数字系统设计, 需要根据vhdl的基本语法规则, 对所要说明的功能目标进行描述。 不管所描述的是一个百万门的数字系统, 还是描述一个基本门电路, 其基本的结构都是实体。,示例:2选1选择器设计,图1是一个2选1选择器框图,a,b为输入端,s为控制端,y为输出端,其逻辑功能为:,library ieee; - 库说明部分 use ieee.std_logic_1164.all; entity mux21 is - 实体说明部分 port(a,b : in std_logic; s : in std_logic; y : out std_logic ); end entity mux21 ; architecture one of mux21 is - 结构体部分 begin y= a when s=“0“ else b when s=“1“ ; end architecture one ;,vhdl程序的基本结构包括: 库说明library 程序包使用说明use 实体说明entity 结构体architecture 配置configuration 其中,实体和结构体是vhdl程序的基本组成部分。,libary ieee; use ieee.std_logic_1164.all; entity dff1 is port (clk :in std_logic; d: in std_logic; q: out std_logic ); end entity dff1; architecture bhv of dff1 is signal q1 : std_logic; begin process ( clk ) begin if clkevent and clk = 1 then q1= d; end if; q=q1; end process; end architecture bhv;,例:d触发器,entity 名称 is 接口信号说明 end 名称; architecture 构造名 of 实体名 is 功能描述 end 构造名;,1. 实体(entity) 实体主要由实体说明和构造体组成。 实体说明描述电路的外部特征; 结构体描述的是电路内部的逻辑。 (1) 实体说明主要包括: 类属参数说明; 端口说明。,实体说明语句格式为: entity 实体名 is generic(类属表) prot(端口表) end 实体名,libary ieee; use ieee.std_logic_1164.all; entity dff1 is port ( clk : in std_logic; d : in std_logic; q : out std_logic ); end entity dff1;,类属说明语句generic 类属参量是一种端口界面常数,以一种说明的形式放在实体或块结构体前的说明部分。 类属为设计实体和其外部环境的通信的静态信息提供通道,特别用来规定端口的大小、实体中子元件的数目、实体的定时属性等。,类属说明的一般格式为: generic(常数名:数据类型:= 设定值; 常数名:数据类型:= 设定值);,例:对于译码器电路,其特点是有n个输入,就有2n个输出。用类属统一描述为: entity decoder is generic (n:positive); prot(se1: in bit_vector(1 to n); dout: out bit_vector(1 to 2*n); end decoder,端口说明语句prot 端口为设计实体和外部环境的动态通信提供通道,实体端口说明语句格式为: port(端口名:端口模式 数据类型; 端口名:端口模式 数据类型);,端口名:为实体的对外通道所取的名字 端口模式:定义了4种常用模式, 输入in: 用于时钟、控制和单向数据的输入; 输出out:主要用于计数输出; 双向buffer: 信号输出到实体外部,同时在内部反馈使用 缓冲inout: 信号是双向的,可进入/离开实体。,端口定义,input port,output port,数据类型:vhdl预定义的数据类型有, 整数数据类型 布尔数据类型boolean 标准逻辑位数据类型std_logic 位数据类型bit(逻辑位1和0),结构体 用以描述实体的内部结构和实体端口之间的逻辑关系。 具体实现一个实体,每个实体有多个结构体。 对有多个结构体的实体,必须用configuration配置语句说明,结构体的语句格式为 architecture 结构体名 of 实体名 is 说明语句 begin 并行处理语句 end architecture结构体名,说明语句:对结构体的功能描述语句中用到的信号signal,数据类型type,常数constant,元件component,函数function和过程procedure等加以说明的语句。 并行处理语句:描述结构体的行为和结构,例:设a,b是或非门的输入端口,c是输出端口,y 是结构体内部信号,vhdl描述的二输入或非门的结构体为: architechture nor1 of nor_2 is signal y: std_logic begin y=a or b; c=not y; end nor1;,图 设计实体与其实体说明、 构造体的关系,3 配置 配置语句是vhdl设计实体中的一个基本单元,综合和仿真中可用配置语句为实体配置一个结构体。 设计者可以利用配置语句来选择不同的构造体, 使其与要设计的实体相对应。 在仿真某个实体时, 可利用配置来选择不同的构造体进行性能对比试验, 以得到性能最佳的实体。,configuration 配置名 of 实体名 is 语句说明 end 配置名 最简单的配置格式: configuration 配置名 of 实体名 is for 选配构造体名 end for end 配置名,4. 库、 程序包 1) 库 vhdl的库是用来放置和存储可编译设计单元的仓库。 为了方便使用vhdl进行编程,ieee将预定义的数据类型、元件调用声明及一些常用子程序收集在一起,形成程序包,供设计程序时共享和调用。 若干程序包形成库,库可以使设计者共享已经编译的设计成果和数据。,vhdl程序利用库中的单元时,需要在每个实体开始说明引用的库,然后利用use子句来指明要使用库中的哪一个设计单元,即每个实体开始均要有打开库或 程序包的语句。 常用的库是ieee库。vhdl程序需要使用库中的单元时,需要在每个实体开始时说明引用的库,然后用use子句来说明要使用库中哪一个设计单元。,库说明语句和use子句的语句结构为: library ,库名; use . . all use . . ; 关键词library指明所使用的库名,use指明库中程序包。,例: library ieee; use ieee. std_logic_1164. all; use ieee.std_logic_1164. rising_edge; 表示打开ieee库,允许设计程序中被描述器件的输入、输出端口和数据类型使用ieee标准库中的std_logic_1164.all程序包和std_logic_1164程序包中的rising_edge函数。,库的种类,vhdl库分为设计库和资源库,设计库不需要使用library和use子句声明,资源库是标准模块和常规元件存放的库,使用之前需要声明。 vhdl库的设计库主要是std库、 work库; vhdl库的资源库包括用户定义库和ieee库。,(1) ieee库 该库存放了ieee 1076中的标准设计单元, 如程序包std_logic_1164、 numeric_std和numeric_bit。 其中std_logic_1164是最重要和最常用的程序包。 synopsys的std_logic_arith, std_logic_signed, std_logic_unsigned也并入了ieee库。,(2) std库 逻辑名为std的库是所有设计单元隐含定义的库, 即下面的library子句隐含存在任意设计单元之前, 而不需显式地写出。 library std; std库中包含预定义的程序包standard和textio。,(3) work库 用户当前库, 可用于保存当前正在进行的设计; 它也是在开发过程中, 各种vhdl工具处理设计文件的地方。 用户在设计项目中已经设计好的,正在校验、未仿真的中间件等均放在工作库work中。,(4) 用户定义库 vhdl工具厂商往往都有他们自己的资源库, 其中包括各厂商自己预定义的程序包。 用户可以直接使用这些库。 另外, 用户也可以建立自己的资源库, 如对每个项目建立的用户库等。 为了使用已经定义好的某个资源库, 必须在要使用资源库的每个设计单元的开头用library子句显式地说明。,(5) 面向asic库 fpga公司提供的现成的ip资源库, 有许多可以由用户定制的功能元件形式出现的设计。 这些元件的功能范围从简单的加法器、 多路选择器等到复杂的系统级的滤波器、 存储器模块等。 这些功能元件都经过专业设计和验证, 并在性能和占用器件资源等方面进行了优化。 应用它们对提高设计效率和质量十分有利。,2) 程序包 程序包是一个可编译的设计单元, 也是库结构中的一个层次, 用来存放各个设计共享的信号定义、 常数定义、 数据类型、 元件结构、 函数定义和过程定义等。 程序包的一般格式:,package 程序包名is 说明单元 end package程序包名; 以下为程序包包体单元 package body 程序包名 is 说明单元 end package body程序包名; 程序包体名应该与其对应的程序包说明的名字相同。,程序包说明单元是主设计单元, 它可以独立编译并插入设计库中。 程序包体是次级单元, 它可以在其对应的主设计单元编译并插入设计库之后独立进行编译, 然后插入设计库中。 ,例如: 程序包的说明单元 package my_package is function and_f(a, b: std_logic_vector) return std_logic_vector; type my_array is array 2 downto 0 of std_logic_vector(3 downto 0); constant my_5v: std_logic_vector(7 downto 0):=(other = 1); end;,程序包的包体单元 package body my_pack is function add_f(a, b: std_logic_vector) return std_logic_vector is begin return(0,常用程序包,vhdl标准提供了一些预先定义的标准程序包,包括standard,textio,std_logic_1164,numeric_std,numeric_bit等程序包。,std_logic_1164程序包 定义了一些数据类型、子类型和函数,这些定义将vhdl扩展为能描述多值逻辑的硬件描述语言。 该程序包对所有设计实体均不可见,在使用时需在vhdl开始部分添加以下语句: library ieee; use ieee.std_logic_1164.all;,std_logic_arith程序包 该程序包已预先编译在ieee库中,在std_logic_1164程序包基础上的扩展。 std_logic_signed和std_logic_unsigned程序包 该程序包已预先编译在ieee库中,其中std_logic_signed定义有符号数的运算, std_logic_unsigned定义无符号数的运算,,standard程序包 存在于标准设计库std中。定义了布尔量类型,位类型,字符类型,实数类型,整数类型等。 textio程序包 存在于标准设计库std中。定义了line类型,text类型,文件input等。,程序包textio对所有设计实体均不可见,故在使用它时需要在vhdl程序的开始部分添加: library std; use std.textio.all;,3.3 vhdl的基本语句,vhdl语句主要是并行语句 concurrent statements和顺序语句sequential statements。 并行语句在执行过程中,语句的执行顺序与语句的书写顺序无关,所有语句是并发执行的。 顺序语句在执行过程中,语句的执行顺序按照语句的书写顺序依次执行的。 并行语句主要用于表示算法模块间的连接关系, 顺序语句主要用于实现模型的算法部分。,结构体中各个模块之间是并行执行的,应采用并行语句来描述。 模块内部的语句则需根据描述方式决定,即模块内部既可采用并行描述语句,也可采用顺序描述语句。,实际电子系统中,几乎所有操作都是并发执行的。 这些操作没有顺序之分。一旦得到事件触发,它们就会开始工作。 为了描述电子系统的工作方式,vhdl提供了并行描述语句。 各种并行语句在结构体中的执行是同步进行的,即并行运行的,其执行方式与书写的顺序无关,3.3.1 并行语句,并行语句内部的语句运行方式包括并行执行方式(块语句)和顺序执行方式(进程语句) 并行语句在结构体中的格式为: architecture 结构体 of 实体名is 说明语句; begin 并行处理语句; end 结构体名,vhdl中的主要并行语句包括: 信号赋值语句; 块(block)语句; 进程(process)语句; 过程调用语句; 生成(generate)语句; 元件例化语句; 断言(assert)语句。,并行信号复制语句用于进程和子程序外部的信号赋值。 并行信号赋值语句有3种形式: 基本(简单)信号赋值语句、 条件信号赋值语句、 选择信号赋值语句。,1) 信号赋值语句,基本信号赋值语句 将信号直接赋给赋值目标, 其格式如下: 赋值目标 = 表达式 ; 注意:赋值目标的数据对象必须是信号,=两边的数据类型必须一致。 多条并发信号赋值语句是并行执行的。,例:如下结构体中3条信号赋值语句并行执行。 architecture curt of bcl is signal s,e,f,g,h: std_logic; begin output1=a and b; output2=c+d; g=e or f; end curt;,(2) 条件信号赋值语句 在满足条件表达式的情况下将表达式的值赋给目标信号, 其格式如下: 赋值目标 = 表达式 when 赋值条件 else -第一句 表达式 when 赋值条件 else -第二句 表达式; -最后一句,1)执行该语句的过程是,首先判断第一句中的赋值条件是否满足,若满足时就把对应的表达式的值传递个赋值目标,并且结束该赋值语句(整个语句);否则,判断第二句中的赋值条件,如果所有的赋值条件都不满足,把最后一句表达式的值传递给赋值目标。 2)语句的执行具有优先次序,第一条优先级最高; 3)赋值目标与表达式的值数据类型应相同; 4)赋值条件是布尔量,为真时表示条件满足; 5) 这是一种并行描述语句,不能在进程和子程序中使用。,例:利用条件信号赋值语句描述4选1数据选择电路程序 library ieee; use ieee.std_logic_1164.all; entity mux41_2 is prot( s1,s0,d0,d1,d2 d3: in std_logic; q: out std_logic); end mux41_2; architecture bhv of mux41_2 is signal sel: std_logic_vector(1 downto 0); begin sel=s1 ,(3) 选择信号赋值语句 与条件信号赋值语句基本相同,都是在条件表达式为真时将表达式赋给目标信号,只是在基本格式上有所不同。 选择信号赋值语句的基本格式如下: with表达式 select 目标信号= 表达式1 when 选择条件1; 表达式2 when 选择条件2; 表达式n when 选择条件n; 先进行选择条件表达式的判断,然后根据其值来决定把哪一个表达式赋给目标信号。,例:利用选择信号赋值语句描述4选1数据选择电路程序 library ieee; use ieee.std_logic_1164.all; entity mux41_3 is prot( s1,s0,d0,d1,d2 d3: in std_logic; q: out std_logic); end mux41_3; architecture bhv of mux41_3 is signal sel: std_logic_vector(1 downto 0); begin sel=s1 ,选择信号赋值语句需注意: 仅当条件表达式的值满足选择条件时,才能将表达式赋给目标信号 是并行描述语句,不能在进程和子程序中使用 表达式后面均含when子句。,块语句把多个并行语句打包, 形成结构体中的一个单独的块区域, 可以看作结构体中的一个子模块。 block语句的目的是改善并行语句及其结构的可读性。,2) 块(block)语句,其基本格式如下: 块标号: block(保护表达式) 块说明部分语句 begin 并行描述语句 end block块标号;,1)块语句本身是并行语句,块内的语句也需是并行语句。 2)语句包括类属说明语句和端口说明语句。类属说明语句用于参数的定义,端口说明语句用于信号的定义,通常用generic,port语句来实现。 3)块中定义的数据类型、数据对象(信号、变量和常量)、子程序等都是局部的。在块嵌套时,外层定义的内容可被内层接受,反之则不然。如果块中出现同名数据对象,则遵循相邻优先的原则。,例: 含block语句的1位全加器 library ieee; use ieee.std_logic_1164.all; entity full_adder is port(a,b,ci: in std_logic; co: out std_logic; s: out std_logci); end full_adder;,architectur rtl of full_adder is begin example: block port(a_tmp,b_tmp,ci_tmp: in std_logic; co_tmp:out std_logic; s_tmp: out std_logic);,port map (a, b, ci, co, s); signal tmp1,tmp2:std_logic; begin p1: process (a_tmp, b_tmp) begin tmp1=a_tmp xor b_tmp; end process p1; p2: process(tmp1,ci_tmp) begin tmp2=tmp1 and ci_tmp; end process p2;,p3: process(tmp1,ci_tmp) begin s_tmp=tmp1 xor ci_tmp; end process p3; p4: process(a_tmp,b_tmp, tmp2) begin co_tmp=tmp2 or( a_tmp and b_tmp); end process p4; end block example; end rtl;,一个结构体可包一个或多个进程语句,各个进程语句之间是并行执行。 而组成进程语句的各个语句是顺序执行的。,3) 进程(process)语句,进程语句基本格式如下: 进程标号:process(信号敏感表)is 进程说明部分 begin 顺序处理语句 end process进程标号;,entity example is port(in1,clk: in bit; out1: out bit); end example; archtecture example of example is begin process (clk) begin out1 = in1 after 10ns; end process; end example;,进程语句的说明部分用来定义局部变量, 在该说明区中可以说明数据类型、 子程序和变量。 敏感信号列表是列出用于启动本进程可读入的信号名。 通常将所有输入信号均列入敏感信号列表中,当其中某个信号变化时,该进程被激活执行。 不能将变量列入敏感表,因进程只对信号敏感。,进程语句中的敏感信号有两种表示方式: 其一是将敏感信号紧跟在保留字process之后的显式敏感表形式; 其二是采用wait语句形式, 即在该进程末加wait on信号敏感表。 一个进程语句可以看作是一个无限循环: 当进程的最后一个语句执行完成之后, 又从该进程的第一个语句开始执行。,在一个进程语句中, 如果没有显式的信号敏感表, 则在进程体内部至少必须含有一个wait语句; 否则, 该进程陷入无限循环。 wait语句的执行会暂停进程的执行, 直到信号敏感表发生变化或某种条件满足为止。 ,wait语句的基本格式有3种: wait on 信号敏感表; wait until 条件表达式; wait for 时间表达式。 wait on 使进程暂停, 直到信号敏感表中的某个信号值发生变化为止; wait until语句使进程暂停, 直到预期的条件为真; wait for语句使进程暂停一段由时间表达式指定的时间。 在信号敏感表的位置, 如果没有信号敏感表而有一个条件表达式, 则默认的信号敏感表由在该表达式中出现的信号组成。,例:含有进程语句的d触发器 library ieee; use ieee.std_logic_1164.all; entity d_ff is port (clk, d: in std_logic; q,qn: out std_logic); end d_ff;,architecture rtl of d_ff is begin process (clk) begin if(clkevent and clk=1)then q=d; qb=not d; end if; end process; end rtl; 其中敏感信号激励方式是敏感信号列表方式。若信号clk发生变化,则程序顺序执行进程中的描述语句。执行完成后,进程语句进入等待状态,等待信号clk的下次变化。,采用wait语句的进程描述d触发器 process begin if(clkevent and clk=1)then q=d; qb=not d; end if; wait on clk; end process 程序中去掉了保留字process后的敏感信号列表,然后在进程语句末采用wait on语句进行信号激励。,过程是vhdl中子程序的一种。 对于任何一个并行过程调用, 都有一个等价的进程语句与之对应。 过程由过程首和过程体两部分组成,过程首不是必须的,过程体可以独立存在和使用。 被并行过程调用的过程的形式参数必须是常数类或信号类。,4) 过程调用语句,并行过程调用语句的基本格式如下: procedure 过程名(参数表);过程首 procedure 过程名 (参数表)is;过程体 过程说明部分; begin 顺序处理语句 end 过程名,生成语句可以简化有规则设计结构的逻辑描述,适用于高重复性电路设计。 在设计中,只要根据某些条件,设定好某一元件或设计单位,则可利用生成语句复制一组完全相同的的并行元件或设计单元电路结构。,5) 生成(generate)语句,生成语句的基本格式如下: 生成标号: 生成方案 generate 生成语句 end generate 生成标号; 生 成方案有两种: for 和if
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 刃具制造工岗前变更管理考核试卷含答案
- 土石方挖掘机司机安全知识水平考核试卷含答案
- 乳品杀菌工常识水平考核试卷含答案
- 乙炔发生工岗前理论模拟考核试卷含答案
- 漆艺师基础常识模拟考核试卷含答案
- 制材工岗位责任制强化考核试卷含答案
- 道路货运汽车驾驶员岗位安全理论考核试卷含答案
- 石墨化工岗位记录考核试卷含答案
- 呼吸道传染病防控应急预案
- 第二单元测试卷年统编版六年级上册语文
- 化工装置开车前安全检查
- GB/T 43655-2024自攻螺钉连接底孔直径和拧紧扭矩技术条件
- 国企招聘中层干部笔试题库
- 医院院内感染培训
- 青海省某节水灌溉示范项目可行性报告
- 强制性条文宣贯课件
- 三营养性添加剂氨基酸添加剂
- 关于春节放假的通知范文(关于春节放假的通知范本)
- 孝道与感恩企业培训教材课件
- 高考英语衡水体字帖电子书
- 第二章因子试验设计-《试验设计与建模》课件
评论
0/150
提交评论