1.05k likes | 1.27k Views
VHDL 讲座. VHDL 的由来. VHDL ( Very High Speed Integrated Circuit Hardware Description Language ) ,意为超高速集成电路硬件描述语言。由美国国防部 70~80 年代组织研制开发,其目的首先是想用这种语言描述复杂电路,其次是想成为一个标准。 1985 年完成第一版, 1987 年成为 IEEE Std1076-1987 。美国国防部规定所有官方的 ASIC 设计都必须用 VHDL 为设计描述语言,此后渐渐成为工业标准为大家接受。 1993 年修改成 IEEE Std1164-1993 。
E N D
VHDL的由来 VHDL (Very High Speed Integrated Circuit Hardware Description Language),意为超高速集成电路硬件描述语言。由美国国防部70~80年代组织研制开发,其目的首先是想用这种语言描述复杂电路,其次是想成为一个标准。 1985年完成第一版, 1987年成为IEEE Std1076-1987。美国国防部规定所有官方的ASIC设计都必须用VHDL为设计描述语言,此后渐渐成为工业标准为大家接受。1993年修改成IEEE Std1164-1993。 1995年,中国国家技术监督局组织编撰并出版《CAD通用技术规范》,推荐VHDL语言作为我国电子设计自动化硬件描述语言的国家标准。
VHDL的特点 1.支持从系统级(特大型)至门级电路的多层次描述;支持结构描述、行为描述、数据流描述及混合描述。 2.支持自底向上(bottom-up)及自顶向下(top-down)的设计;支持模块化、层次化设计;支持函数、过程及自定义程序包和库,可设计共享。 3. 支持组合逻辑电路和时序电路;支持延迟功能。 4. 使用类属语句进行参数化设计。 5. 支持断言语句,报告系统信息和错误信息。 6. 数据类型丰富、安全性好,既有预定义数据类型,又可自定义数据类型。
定义使用哪些自定义库 定义元件库 1.USE定义区 描述电路的内部功能,说明电路执行什么动作或功能 2.PACKAGE定义区 定义电路实体的外观:I/O接口规格 3.ENTITY定义区 4.ARCHITECTURE定义区 决定哪一个architecture被使用 Component定义区 信号定义 Behavior Process 描述 Data Flow 描述 Structure 描述 5.CONFIGURATION定义区
1.库(library) 库是用来存储和放置可编译的设计单元的地方,通过其目录可查询、调用。库可以分为两类:设计库和资源库。库说明一般格式如下: library 库名; use 库名.逻辑体名; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; 初学时不太熟悉,全部写上。
2.实体(entity) 实体的电路意义相当于器件,在电路原理图上相当于元件符号。实体的对象相当广泛,可以是完整的系统(特大型)、电路板、芯片、电路单元、小函数或是逻辑门。实体有实体名。 entity 实体名 is [generic (类属表) ;] [port (端口表) ;] end [entity] [实体名] ;
(1)类属表(generics) 将外部环境的静态信息传递给实体的具体元件,利用该特性可以设计参数化元件。 (2)端口表(ports) 实体说明中的每一个I/O信号称为端口。有四种端口模式: 1)输入(in) 用于时钟输入及各种控制输入, 如置位,复位,使能及置数等。 2)输出(out) 通常用作终端输出。 3)缓冲(buffer)允许数据流出端口及内部反馈 允许内部引用该端口的信号。 4)双向(inout) 允许数据流入或流出实体,也用于内部反馈。
3. 结构体(architecture) 实体是“黑箱”,结构体在电路上相当于器件的内部电路。结构体都必须附属于某个实体,一个实体可同时具备多个结构体。 architecture 结构体名 of 实体名 is [说明部分;] begin < 语句部分;> end [结构体名];
4. 配置(configuration) 配置是用于描述层与层之间的连接关系和实体与结构体之间的连接关系。在仿真设计中,利用配置来获得性能最佳的设计目标。
一、 VHDL语言要素 1.标识符 基本标识符用来为常量、变量、信号、端口、子程序或参数等命名,由英文字母、数字和下划线组成。基本标识符必须遵从以下规则: 1)首字符必须是英文字母; 2)末字符不能是下划线;并且不允许出现两个连续的下划线; 3)大、小写英文字母等效,可混合输入; 4)VHDL语言的关键字不能作标识符
几个合法的基本标识符: a , October , MAY_1 , loop1 , new_state 几个非法的基本标识符: signal --保留字不能用作基本标识符; old_state_ --最后字符不能是下划线; New#type --有非法字符#; 8home --不能用数字开头。
2.数据对象 常量(constant) 常量是指固定不变的量。在实体、结构体、程序包、块、进程和子程序中可对常量进行定义,所定义的常量的数据类型必须与表达式的类型相一致。 常量说明格式如下: constant常量名[,常量名]: 数据类型[ := 表达式]; 例如:constant width: integer := 8; constant Us: real := 12.0; constant bus: std_logic_vector(3 down to 0) :=”1101”;
变量(variable) 变量常用来存储中间数据,只能用于进程和子程序中,可通过变量赋值语句改变变量的值 。VHDL规定对变量的赋值立即实现,无任何延迟时间。变量说明格式如下: variable 变量名[,变量名]: 数据类型 [:= 初始值]; 目标变量名 := 表达式; 例如: variablej : integer := 2; variablea : std_logic_vector (2 downto 0); a := “101”; --对变量赋值 a(1 downto 0) := “01”; a(j) := ‘1’; --对变量分段赋值
信号(signal) 信号理解成为连接线,它的作用与ABEL语言中的节点NODE相类似。信号说明格式如下: signal 信号名: 数据类型 [:= 初始值]; 信 号 变 量 范围实体、结构体和程序包 只能在进程或子程序中使用 可用于在模块间交换数据 只用于进程或子程序局部 有独立硬件对应物:连接线 无具体的硬件对应物 不可写入进程敏感表中 采用 <= 作为信号的赋值符 采用 := 作为变量的赋值符 信号赋值存在延迟 变量赋值立即生效,无延迟 可加入进程敏感表激活进程
信号赋值语句的格式如下: 目标信号名 <= 表达式; 信号的赋值符用<=。信号可以在实体、结构体和程序包中说明和使用,但不允许在进程和子程序中定义新的信号。信号的赋值并不能立即生效,即有一δ延迟。 信号赋值与变量赋值符号不同: 信号赋值号<= 常量、变量赋值号:= 例 signalwidth:integer; signalbus:bit_vector(3 to 0); signalz:bit; z <= ‘1’; width <= 12; bus <= “1010” ;
3. 数据类型 标量型、复合型、寻址型、文件型。 标量类型(scalar type) 标量类型的数据对象在某一时刻只对应一个值。 整数类型、浮点类型、物理类型和枚举类型。 复合类型(composite type) 复合类型的数据对象在某时刻可持多个值。是单值类型元素的集合。 复合类型包括数组类型和记录类型。
标量类型 整数类型(integer) 整数类型适用加、减、乘、除等。VHDL标准规定整数的最小范围为从(2311)至(2311)。整数用关键字integer说明。 例如:signal a,b,c,d,e:integer; a<=012; b<=0; c<=123_456; d<=2E5; e<=4e3; --对c的赋值实际是123456, --数字中的下划线只是为了提高可读性,没有任何实际意义,也不影响数值。
实数类型(real) 实数的最小范围从1.0E+38至+1.0E+38。用关键字real说明。 例如:variable a,b,c,d:real; a:=12.0; b:=3.14_159; c:=2.0E5; d:=1.5e-6; 枚举类型 预定义的两个枚举类型是布尔数据类型(boolean)和位数据类型(bit)。 typebooleanis (false,true); typebitis (‘0’,‘1’);
变量或信号通常定义为枚举类型,可以将其定义成为布尔类型或位类型。如:signal z:bit; 一种常用的多值类型std_logic可以描述系统,对它的定义如下: type std_logic is ( ‘U’ ‘X’ ‘0’ ‘1’ ‘Z’ ‘W’ ‘L’ ‘H’ ‘-’ ); --未定义 --强未知 --强为0 --强为1 --高阻态 --弱未知 --弱为0 --弱为1 --可忽略
物理类型 VHDL中预定义的物理类型是时间,其定义如下: type time is range 0 to 2147483647 units fs; --飞秒,相当于10E-15秒,VHDL中最小的时间单位 ps=1000 fs; --皮秒,相当于10E-12秒 ns=1000 ps; --纳秒,相当于10E-9秒 us=1000 ns; --微秒,相当于10E-6秒 ms=1000 us;--毫秒,相当于10E-3秒 sec=1000 ms; --秒 min=60 sec; --分 hr=60 min; --时 end units; 虽然VHDL定义了八种时间类型,但ispDesign EXPERT System中的综合工具只支持微秒、纳秒时间类型。
复合类型 复合类型包括数组类型和记录类型。 数组类型(array) 数组类型由一个或多个相同类型的元素集合构成,构成它的元素可以是任何一种VHDL单值数据类型。VHDL允许数组的两种不同类型的定义方式,即限定性数组和非限定性数组。 限定性数组定义语句格式如下: type 数组名 is array (数组范围) of 数据类型; 例如:type bus is array (3 downto 0) of std_logic; type set is array (0 to 7) of integer;
非限定性数组定义语句格式如下: type 数组名 is array (数组下标名 range <> )of 数据类型; 常用非限定性数组有: type bit_vector is array (natural range <>) of bit; type std_logic_vector is array (natural range <>) of std_logic; 第一个定义只是说明非限定性数组bit_vector是由类型为bit的数据集合而成, 第二个定义也只是说明非限定性数组std_logic_vector是由类型为std_logic的数据集合而成。 非限定数组的关键字natural指明数组范围是0 ~ 2147483647。非限定性数组在使用时,必须确定下标范围。
记录类型(record) 记录类型是一种多值数据类型,元素可以是任一VHDL的数据类型。记录类型定义语句格式如下: type 记录名 is record 元素名:元素数据类型; … end record [记录名]; 将锁存器的输入输出和使能构成一个记录,举例如下: type record_name is record latch_in: bit_vector(3 downto 0); latch_out: bit_vector(3 downto 0); enable:bit; end record;
VHDL预定义数据类型 VHDL预定义数据类型都是在VHDL标准程序包STANDARD以及IEEE库中的程序包STD_LOGIC_1164中预先进行定义的。 在STANDARD程序包中预定义的数据类型有: 1)布尔(boolean)数据类型 2)位(bit)数据类型 3)位矢量(bit_vector)数据类型 4)整数(integer)数据类型 5)自然数(natural)和正整数(positive)数据类型 6)实数(real)数据类型 7)时间(time)数据类型 STD_LOGIC_1164中预定义的两个非常重要的数据类型是: 1) 标准逻辑位(std_logic)数据类型 2) 标准逻辑矢量(std_logic_vector)数据类型
用户自定义数据类型方式 用户可采用类型定义语句type和子类型定义语句subtype自定义数据类型,如枚举类型、整数类型、数组类型、记录类型、时间类型及实数类型等。 1)type语句 格式: type 数据类型名 is 数据类型定义 [of 基本数据类型]; 例:type states is (read,write); signal present _ state,next _ state:states; 再举一例自定义数据类型week如下: type week is (sun,mon,tue,wed,thu,fri,sat); signal hotel,home :week; 上述对信号hotel和home的定义表明它们是自定义数据类型week,因此这两个信号之间可以相互作用,因为只有它们属于同一数据类型。
2)subtype 语句 subtype 语句用来定义数据类型的子类型。VHDL规定任何基本数据类型均可定义其子类型。子类型与其父类型完全兼容。 格式: subtype 子类型名 is 基本数据类型 range 约束范围; 例:type integer is –2147483647 to +2147483647; --1 type i is range 0 to 50; --2 subtype natural is integer range 0 to +2147483647; --3 subtype ci is i range 0 to 30; --4 subtype di is ci range 0 to 10; --5 subtype data is bit_vector (3 downto 0); --6 subtype lower_data is data; --7 第三句定义自然数为整数数据类型的子类型;第四句定义ci为i的子类型。第五句定义di为ci的子类型,VHDL允许定义子类型的子类型;第六句,使用约束条件(3 downto 0)对非限定性数组bit_vector作具体说明;第七句,lower_data是data的一个子类型
4.属性 属性是关于信号、类型等的特性。通常,对象的属性可以用一个值或一个表达式来表示。 信号类属性 信号类属性有多种类型,其中最为常用的是’event属性。 例如:信号clk(std_logic类型)的’event属性列写如下: clk’event and clk=’1’ --1 检测时钟在上升沿有效 clk’event and clk=’0’ --2 检测时钟在下降沿有效 第一句是对信号clk的上升沿进行检测。第二句则是对信号clk的下降沿进行检测。此外,VHDL还预定义了两个函数,利用它们也可以很方便地检测信号的变化状态。 rising_edge(clk) --检测上升沿有效 falling_edge(clk) --检测下降沿有效
数值类、范围类及数组属性 数值类属性主要对属性目标的相关数值特性进行测试,返回具体值;范围类属性对属性目标的取值区间进行测试,返回一区间范围;数组属性是对数组的宽度或元素的个数进行测定,也返回一个值。 若对某数组变量的定义如下: variable byte :bit_vector (3 downto 0);则变量byte的相关属性如表所示。 属性类型 属 性 值 数值类属性 Byte’left 3 Byte’right 0 Byte’low 0 Byte’high 3 数组属性 Byte’length 4 范围类属性 Byte’range 3 downto 0 Byte’reverse_range 0 to 3
5. 运算符 主要有算术运算符、关系运算符、逻辑运算符、赋值运算符、关联运算符和其它运算符等,各种操作符见书表3所示。
二、 VHDL语言中的并行语句 特点: 各种并行语句在结构体中的执行是同步进行的,其执行顺序与书写的顺序无关。 语句之间可以有信息的交流,也可以相互独立、异步运行的。 每一并行语句内部的语句运行方式有两种:并行执行方式和顺序执行方式
基本并行语句: 进程语句(process statement) 并行信号赋值语句 (concurrent signal assignment) 元件例化语句(component instantiation) 块语句(block statement) 生成语句(generate statement) 并行过程调用语句(concurrent procedure calls)
在结构体中的使用形式 ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并行语句 END ARCHITECTURE 结构体名;
1.进程语句 格式如下: [进程标号:] process [(敏感信号表)] [is] [说明区;] begin < 顺序语句;> end process[进程标号]; (1)进程敏感表中可包含一个或多个元素值,当这些值中的一个或多个改变时,会激活进程。含有敏感信号表的进程,不允许再出现显式wait语句。如果不含,必须用wait语句。 (2)进程说明区内可以说明数据类型、子程序、变量等,限于内部,即定义局部数据环境。 (3)有关进程内部顺序语句的内容将在顺序语句部分作详细介绍。 (4) 一个进程可以重复执行多次。
对PROCESS的几点说明 1、进程说明部分主要定义一些局部量,但说明部分不允许定义信号和共享变量; 2、敏感信号参数需列出启动本进程要读入的信号名(当有wait语句时例外) 3、(在敏感信号表中没有列出敏感信号)当遇到WAIT语句时, 执行过程将被有条件的终止,即被挂起(Suspension) 4、进程语句有并行和顺序行为的双重性
例:结构体用进程实现两位二进制等值比较器。例:结构体用进程实现两位二进制等值比较器。 . . . architecture behave_process of ecomp2 is begin eqcome:process(a,b) --以敏感表(a,b)代替显式wait语句 begin if (a=b)then equ<=’1’ ; else equ<= ‘0’; end if; end process eqcome; end behave_process; .
与其等效的使用显式wait语句的进程如下: architecture behave_process of ecomp2 is begin process --无敏感信号表 begin if (a=b)then equ<=’1’ ; else equ<= ‘0’; end if; wait on a,b;--本进程无敏感表则必须有显式wait语句 end process; end behave_process;
2.并行信号赋值语句 并行信号赋值语句对信号的赋值都经历了δ延迟。 三种形式:简单型、条件型和选择型。 Eg. Architecture art of XHFZ is signal E,F,G,H: STD_LOGIC BEGIN G<=E OR F; 简单信号赋值语句 格式:信号赋值语句<=表达式;
条件信号赋值语句格式: [标号:] 信号名<=表达式 when条件 else [{表达式 when 条件 else}] 表达式; 例:z<=a when (x>5) else --注意在else后无任何分隔符(分号、逗号或其他) b when (x<5) else --赋值符<=只能出现一次 c;
选择信号赋值语句格式: [标号:]with表达式select 信号名<=表达式 when value[{, 表达式when value}]; when从句中所有取值必须互相独立,可使用when others来替代未列举的其他取值。 例: with s select --同条件信号赋值语句一样,赋值符只能出现一次 z<=a when 5,--注意此处加逗号 b when 10, c when others; --除了s为5和10两种可能以外,其他所有可能由others表达。
3.元件例化语句 允许重复调用已有的设计,从而将设计分解,支持模块化设计方式。在例化元件之前,必须对元件的外貌进行元件说明。元件说明的格式如下: component 元件名 [generic (类属表) ;] [port (端口表) ;] end component; 元件例化的格式如下: 元件标号: 元件名 port map(信号映射); 信号映射可以使用关键字open;名称映射的格式如下: 形式参数=>实际参数,其中=>为关联运算符。
4、生成语句 生成语句可以简化实际电路中由许多重复的基本结构构成的电路 语句格式: [标号:] FOR 循环变量 IN 取值范围 GENERATE 说明; BEGIN 并行语句; END GENEARTE [标号]; [标号:] IF 条件 GENERATE 说明; BEGIN 并行语句; END GENERATE [标号];
几点说明: 1、 FOR语句结构,主要用来描述设计中的一些有规律的单元结构,其生成的参数及其取值范围的含义和运行方式与LOOP语句相似。 2、生成参数(循环变量)是自动产生,有两种形式: 表达式 TO 表达式; --递增方式 表达式 DOWNTO 表达式; --递减方式 3、并行语句中主要包括:元件、进程语句、块语句、并行过程调用语句、并行信号赋值语句以及生成语句 4、生成语句允许嵌套 5、标号可以不要,但在嵌套生成语句结构中建议使用。
说明: … port(I1: bit; O1: out bit); … Inv: inverter port map (inputs(I),outputs(I)); … Inputs(I)与I1建立联系;outputs(I)与O1建立联系;从而形成了“位置映射” “命名映射” 则 Inv: inverter port map(I1=>inputs(I), O1=>outputs(I));
5、并行过程调用语句 特点: 可以作为一个并行语句直接出现在结构体或块语句中; 功能等效于包含了同一个过程调用语句的进程。 格式: procedure 过程名(关联参量名)is Eg. … procedure adder(signal A,B : IN STD_LOGIC; signal SUM: OUT STD_LOGIC) is …
6.块语句 块语句将许多并行语句包装在一起,形成一个子模块。 可以改善可读性,或利用BLOCK中的保护表达式关闭某些信号 格式: 块标号: block [(保护表达式)] [is] [generic (类属表) ;] [port (端口表) ;] [块说明语句;] --块内说明的对象、信号只在块内有效 begin < 并行语句;> end block [块标号];
三、VHDL中的 顺序语句 特点: 1、只能出现在进程(process)和子程序中 2、顺序语句的执行顺序与其书写的顺序一致;但与相应的硬件逻辑工作顺序未必一致 3、子程序本身没有顺序与并行语句之分 4、一个进程是由一系列的顺序语句构成,但其自身是并行的,即同一设计体中,所有进程都是并行的 5、进程本身与entity中其他部分的数据交换只能通过信号或端口进行
分类: 变量赋值语句 信号赋值语句 if 语句 case 语句 loop 语句 next 语句 exit 语句 null 语句 wait 语句 report 语句 assert 语句