null第四章 硬件描述语言VHDL
编程基础第四章 硬件描述语言VHDL
编程基础
本章首先介绍了VHDL的基本结构,使读者初步掌握VHDL的基础知识。最后通过大量的实例使读者进一步掌握使用VHDL的设计方法。本章主要内容null第一节 概述第二节 VHDL程序结构第三节 VHDL的基本数据类型第四节 VHDL的基本描述语句第五节 子程序第一节 概述第一节 概述VHDL(Very high speed intergated circuit Hardware Description Language):非常高速集成电路的硬件描述语言。
20世纪80年代诞生于美国国防部的一项研究MATCH_
word
word文档格式规范word作业纸小票打印word模板word简历模板免费word简历
_1713565715834_0,目的是使电路的设计能够以文字的方式保存下来。
被列为IEEE1076
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
,也成为工业界的标准。1.VHDL简介2.Verilog HDL语言简介 2.Verilog HDL语言简介 Verilog HDL它是在C语言的基础上发展起来的,由GDA(Gateway Design Automation)公司创造的,1989年cadence公司收购了GDA公司,使得Verilog HDL成为了该公司的独家专利。1990年Cadence公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995。
Verilog HDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,Verilog HDL语言的系统抽象能力稍逊于VHDL,而对门级开关电路的描述能力则优于VHDL。二、VHDL的优点二、VHDL的优点1. 支持层次化设计
2. 具有多层次描述系统硬件功能的能力
3. 具有丰富的仿真语句和库函数
4. VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。 VHDL的优点VHDL的优点5. 对设计的描述具有相对独立性,与硬件的结构无关
6.可以利用EDA工具进行逻辑综合和优化,并自动将VHDL描述转化为门级网表。
7. 具有可移植性,可以在不同的设计环境和系统平台中使用。
8. 具有良好的可读性。三、VHDL与高级语言的区别三、VHDL与高级语言的区别1.某些并行语句可以自动的重复执行,不需要用循环指令来保证。
2.VHDL中的许多语句不是按排列顺序执行的,而是可以同时执行的(VHDL的并行性)。返 回第二节 VHDL程序结构第二节 VHDL程序结构一、VHDL的基本结构ENTITY nand_2 IS ---------------定义一个实体
PORT( a, b: IN STD_LOGIC; --描述输入输出
y: OUT STD_LOGIC); ------信号
END nand_2;LIBRARY IEEE;------------------IEEE库说明
USE IEEE.STD_Logic_1164.ALL; ----自定义元件库ARCHITECTURE rtl OF nand_2 IS
BEGIN -------------结构体说明
y<=NOT(a AND b);
END rtl;1. VHDL基本结构图1.USE定义区2.PACKAGE定义区3.ENTITY定义区4.ARCHITECTURE定义区定义元件库5.CONFIGURATION定义区定义使用那些自定义元件库定义电路实体的外观:I/O接口的规格描述电路内部的逻辑功能决定那一个architecture被使用1. VHDL基本结构图2. 实体说明2. 实体说明功能:描述设计模块的输入/输出信号或引脚,并给出设计模块与外界的接口。实体类似一个“黑盒”,实体描述了“黑盒”的输入输出口。
格式:
ENTITY 实体名 IS
[GENERIC(类属表);]
[PORT(端口表);]
END [ENTITY] [实体名]
实 体 名实 体 名实体名实际上是器件名,最好根据相应的电路功能确定。如4位2进制计数器用counter4b;8位加法器用add8b;3/8译码器用ym_38。实体名必须与文件名相同,否则无法编译。实体名不能用工具库中定义好的元件名。实体名不能用中文,也不能用数字开头。类 属 表类 属 表类属表:用以将信息参数传递到实体。
类属表的一般格式为:
GENERIC(常数名:数据类型[:=设定值]
……)
GENERIC(awidth : INTEGER:=3;
timex: time );
其中:常数名由设计者确定;数据类型通常取INTEGER或time等;在表中提供时间参数、总线宽度等信息。端 口 表端 口 表端口表:指明实体的输入、输出信号极其模式。
端口表的一般格式为:
PORT(端口名:端口模式 数据类型…… )
端口模式:共四种: IN(输入)、 OUT(输出)、 INOUT(双向端口) 、 BUFFER(输出并向内部反馈) 数据类型:VHDL作为一种强类型语言,必须对数据对象(常量、变量、信号)规定取值范围,即对传输或存储数据的类型作明确的界定。 实 体 举 例实 体 举 例ENTITY black_box IS
Generic ( constant width : integer := 7;);
PORT (
clk, rst: IN std_logic;
d: IN std_logic_vector(width DOWNTO 0);
q: OUT std_logic_vector(width DOWNTO 0);
co: OUT std_logic);
END black_box;
练 习 一练 习 一 编写包含以下内容的实体代码
端口 D 为12位输入总线
端口 OE 和 CLK 都是1位输入
端口 AD 为 12位双向总线
端口 A为12位输出总线
端口 INT 是1位输出
端口 AS 是一位输出同时被用作内部反馈练习一答案练习一答案LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY my_design IS
PORT (
d: IN std_logic_vector(11 DOWNTO 0);
oe, clk: IN std_logic;
ad: INOUT std_logic_vector(11 DOWNTO 0);
a: OUT std_logic_vector(11 DOWNTO 0);
int: OUT std_logic;
as: BUFFER std_logic);
END my_design;练 习练 习 1、编写包含全加器的实体代码。
2、编写4选1数据选择器的实体代码。
3. 结构体3. 结构体 结构体:通过若干并行语句来描述设计实体的逻辑功能(行为描述)或内部电路结构(结构描述),从而建立设计实体输出与输入之间的关系。一个设计实体可以有多个结构体。
格式:
ARCHITECTURE 结构体名 OF 实体名 IS
[说明语句;]
[BEGIN
并行语句;]
END [ARCHITECTURE] [结构体名];VHDL结构体术语VHDL结构体术语说明语句:用于定义结构体中所用的数据对象和子程序,并对所引用的元件加以说明,但不能定义变量。
并行语句 并行语句有五种类型,可以把它们看成结构体的五种子结构。这五种语句结构本身是并行语句,但内部可能含有并行运行的逻辑描述语句或顺序运行的逻辑描述语句,如进程内部包含的即为顺序语句。
五种语句结构分别为块语句、进程语句、信号赋值语句、子程序调用语句和元件例化语句。 结构体结构图结构体结构图实体和结构体之间的关系实体和结构体之间的关系结构体的三种描述形式 Structure描述 描述该设计单元的硬件结构,即该硬件是如何构成的,类似于数字电路中的逻辑图描述.
Date Flow描述 它是类似于寄存器传输级的方式描述数据的传输和变换,以规定设计中的各种寄存器形式为特征,然后在寄存器之间插入组合逻辑。与数字电路中的真值表描述相似。
Behavior Process描述 只描述所希望电路的功能或者电路行为(输入输出间转换的行为),而没有指明或涉及实现这些行为的硬件结构。与数字电路中的逻辑表达式描述相似。结构体的三种描述形式Structure描述Structure描述architecture one of mux21 is
signal d,e:bit;
begin
d<=a and (not)s;
e<=b and s;
y<=d or e;
end one;
Date Flow描述Date Flow描述
architecture one of mux21 is
begin
y<=(a and (not s) or (b and s);
end one;Behavior Process描述Behavior Process描述
architecture one of mux21 is
begin
y<=a when s='0' else
b;
end one;结构体—行为描述举例结构体—行为描述举例2 X 8 Input AND gate:
ENTITY black_box IS
PORT (
a, b: IN std_logic_vector(7 DOWNTO 0);
y: OUT std_logic_vector(7 DOWNTO 0));
END black_box;
ARCHITECTURE example OF black_box IS
BEGIN
y <= a AND b;
END example;操作案例操作案例1、操作题目:通过38译码器的设计实例,从整体结构上初步认识VHDL的基本结构和语句特点。
2、38译码器的电路图如图所示,有4个输入端(A0、A1、A2、EN),8个输出端(Y0~Y7)
3、步骤:定义元件库、实体、结构体、编译、仿真。返 回第三节 VHDL的基本数据类型 第三节 VHDL的基本数据类型 一、数据对象 是数据类型的载体,共有三种形式的对象:
Constant(常量)
Variable(变量)
Signal(信号)
对象的说明格式为:
对象类别 标识符表:类型标识[:=初值](1)常量声明(1)常量声明 常量是全局量,在结构描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。
例:
constant WIDTH :INTEGER := 8;
constant X :NEW_BIT := ′X′;(2)变量声明(2)变量声明定义了给定类型的变量名称。
例:
variable A,B :BIT;
variable INIT :NEW_BIT变量赋值变量赋值整体赋值: temp := “10101010”; temp := x”AA” ;
逐位赋值: temp(7) := ‘1’;
多位赋值 temp (7 downto 4) := “1010”;(3)信号声明(3)信号声明信号可以将结构体中分离的并行语句连接起来,并且通过端口其他模块与该设计内的连接起来。
信号为器件内部节点信号,数据的进出不像端口信号那样受限制,不必定义其端口模式。
定义信号的目的是为了在设计电路时使用该信号。
用“<=”来给信号赋值
例:
signal A,B :BIT;
signal INIT :INTEGE: = -1信号赋值信号赋值SIGNAL temp : Std_Logic_Vector (7 downto 0);
整体赋值: temp <= “10101010”; temp <= x”AA” ;
逐位赋值: temp(7) <= ‘1’;
多位赋值:
temp (7 downto 4) <= “1010”;信号举例信号举例LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY simp IS
PORT(a, b, c, d : IN Std_Logic;
g : OUT Std_Logic);
END simp;
ARCHITECTURE logic OF simp IS
SIGNAL e,f : Std_Logic;
BEGIN
e <= a or b;
f<=not(c or d);
g <=e and f;
END logic;信号和变量的作用范围信号和变量的作用范围信号和变量的区别信号和变量的区别二、数据类型二、数据类型 1. 标准定义的数据类型
不必用USE说明而直接使用。
1)Boolean(布尔量):取值为FALSE和TRUE。
2)Character(字符):使用时用单引号括起来,如:‘A’。
3)String(字符串):使用时用双引号括起来,如: ‘‘ 111000101 ’’ 。
4)Integer(整数):范围在-(231-1)~(231-1)
5)Real(实数):范围在-1.0E+38 ~+ 1.0E+38 null6)Bit(位):取值为0或1.
7)Time(时间):取值范围与整数一致,一般用于仿真。
8)Bit_vector(位矢量):基于BIT数据类型的数组。使用时必需注明宽度。
9)Natural(自然数)和Positive(正整数):是整数的一个子类型。
10)Severity level(错误等级):用来设计系统的工作状态。有四种状态值:NOTE(注意)、WARNING(警告)、ERROR(错误)、FAILURE(失败)。2. 用户自定义的数据类型2. 用户自定义的数据类型1)Enumerated Types(枚举类型)格式如下:
TYPE 数据类型名 IS (枚举文字,枚举文字…);
例如:TYPE color IS (red,green,yellow,blue);
TYPE level IS (‘0’,’1’,’Z’);
2)Integer Types(整数类型)和 Real Types(实数类型)格式为:
TYPE 数据类型名 IS RANGE 约束范围;
例如: TYPE int IS RANGE -10 TO 10;
3)Array Types(数组类型)格式如下:
TYPE 数据类型名 IS ARRAY(索引范围)OF类型名称 ;
例如:TYPE a IS ARRAY(integer0 TO 9)OF std_logic3. IEEE预定义标准逻辑位与矢量3. IEEE预定义标准逻辑位与矢量 在IEEE的程序包中std_logic_1164中定义了两个重要的数据类型。
1)std_logic:工业标准的逻辑类型。取值为‘0’(强0)、‘1’(强1)、‘Z’(高阻态)、‘X’(强未知的)。
2)std_logic_vector:工业标准的逻辑类型。std_logic的组合。
注意:使用这两种数据时,程序中必须声明:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALLStd_Logic数据类型Std_Logic数据类型IEEE std_logic_ 1164中定义的一种数据类型,它包含9种取值分别为: ‘U’ 未初始化 用于仿真 ’X’ 强未知 用于仿真 ’0’ 强0 用于综合与仿真 ’1’ 强1 用于综合与仿真 ’Z’ 高阻 用于综合与仿真 ’W’ 弱未知 用于仿真 ’L’ 弱0 用于综合与仿真 ’H’ 弱1 用于综合与仿真 ’_’ 忽略 用于综合与仿真三、标识符三、标识符 标识符是VHDL语言最基本的要素之一,是使用VHDL语言的基础。标识符是描述VHDL语言中端口、信号、常数、变量以及函数等名称的字符串。VHDL标识符书写规则如下: 1)使用的字符由26个英文字母、数字0~9以及下划线组成; 2)标识符必须以英文字母开始,不区分大小写; 3)不能以下划线结尾; 4)标识符中不能有空格; 5)标识符不能与VHDL的关键字重名。 四、运算符四、运算符(1)算术运算符 + 加 ** 乘方
- 减 MOD 求模
* 乘 REM 求余
/ 除 ABS 求绝对值(2)关系运算符(2)关系运算符= 等于
/= 不等于
< 小于
<= 小于或等于
> 大于
>=大于或等于
其中‘<=’符号也用于信号的赋值操作 (3)逻辑运算符(3)逻辑运算符AND 逻辑与 SLL 逻辑左移
OR 逻辑 SRL 逻辑右移
NAND 逻辑与非 SLA 算术左移
NOR 逻辑或非 SRA 算术右移
XOR 逻辑异或 ROR 逻辑循环右移
NOT 逻辑非 ROL 逻辑循环左移
五、VHDL属性五、VHDL属性 VHDL属性(Attribute)是指实体、结构体、类型及信号的一些表现特征。一般需要了解VHDL中的数值类属性、函数类属性以及范围类属性。其引用的一般形式均为:对象ˊ属性。1.数值类属性1.数值类属性 数值类属性可用于返回数组、块或一般数据的有关属性。如左边界(ˊleft)、右边界(ˊright)、下边界(ˊlow)、上边界(ˊhigh)和数组长度(ˊlength)。例如:
sdown :IN std_logic_vector(8 DOWNTO 0);
这个信号的各属性值如下:
sdownˊleft=8;sdownˊright=0;sdownˊlow=0; sdownˊhigh=8;sdownˊlength=9;2.函数类属性2.函数类属性 函数类属性用来返回有关信号行为功能的信息。如信号属性函数:ˊevent,它的值为布尔型,如果刚好有事件发生在该属性所附着的信号上(即信号有变化),则其取值为True,否则为False。利用此属性可决定时钟边沿是否有效,即时钟是否发生。例如:时钟边沿表示 SIGNAL clk:IN std_logic 则:clkˊevent AND clk=ˊ1ˊ,表示时钟的上升沿。
clkˊevent AND clk=ˊ0ˊ,表示时钟的下降沿。 3.范围类属性3.范围类属性范围(ˊRANGE)类属性,用来生成一个限制性数据对象的范围。
例如:数据总线的范围
SIGNAL data_bus :std_logic_wector(15 DOWNTO 0);
Data_busˊRANGE=15 DOWNTO 0;
注意:MAX+PLUSⅡ不支持该属性。练 习练 习 1、编写包含全加器的结构体代码。
2、编写3输入与非门的结构体代码。
练 习 答 案练 习 答 案ARCHITECTURE example1 OF Full_adder IS
BEGIN
sum<= a XOR b XOR c;
c <= (a AND b)OR(b AND c)OR(a AND c);
END example1;ARCHITECTURE example2 OF and3 IS
BEGIN
y<= a AND b AND c;
END example2;返 回第四节 VHDL的基本描述语句 第四节 VHDL的基本描述语句 一、顺序语句1. IF语句 顺序语句用于进程过程或函数之中,为算法描述提供了IF 语句、CASE语句、 LOOP语句。可以用于实现两种或两种以上的条件分支判断。
格式为:IF 布尔表达式1 THEN
顺序语句1
[ELSIF 布尔表达式2 THEN
顺序语句2] …
END IF 常用格式常用格式1)
IF 布尔表达式1 THEN顺序语句1
END IF 2)
IF 布尔表达式1 THEN
顺序语句1
ELSE
顺序语句2…
END IF 3)
IF 布尔表达式1 THEN
顺序语句1
ELSIF 布尔表达式2 THEN
顺序语句2] …
END IF 4)
IF 布尔表达式1 THEN
IF 布尔表达式2 THEN
顺序语句 …
END IF
END IF 【例4-3】IF语句描述的判断程序(2选1)【例4-3】IF语句描述的判断程序(2选1)IF s = ″0″ THEN
y<= a0;
ELSIF s =″1″THEN
y<= a1;
END IF
练 习练 习用IF语句实现4选1IF s= ″00″ THEN
y<= a;
ELSIF s= ″01″ THEN
y<= b;
ELSIF s= ″10″ THEN
y<= c;
ELSE
y<= d;
END IF;操作案例操作案例 1、操作题目:通过四选一数据选择器设计实例,讲解顺序语句的语句特点。
2、四选一数据选择器的电路图:如图4-3,有7个输入端(A0、A1、D0、D1、D2、D3、S),1个输出端(Y)
3、步骤:分别用IF语句和CASE语句进行编程,然后编译、仿真。2. CASE语句2. CASE语句CASE语句用于多分支判断结构,它以一个多值表达式为判断条件,依条件式的取值不同而实现多路分支。
格式为:CASE 表达式 IS
WHEN 条件 =>顺序语句;
[WHEN OTHERS =>顺序语句;
END CASEnull使用CASE语句时应注意:
条件句的选择值应在表达式的取值范围内.
除非所有条件句中的选择值能完全覆盖case语句中表达式的取值,否则最后一个条件句中的选择必须用“others”表示.
case语句中每一条件句的选择值只能出现一次,不能有相同选择值的条件语句出现.
case语句执行中必须选中且只能选中所列条件语句中的一条.【例4-4】case语句描述的判断程序【例4-4】case语句描述的判断程序
Process(s)
Begin
Case s Is
WHEN"00"=>d<=b; --当s=00时,d=b
WHEN"01"=>d<=c; --当s=01时,d=c
WHEN"10"=>d<=NOT b; --当s=10时,d=非b
WHEN Others=>d<=′0′; --当s=其他时,d=0
End Case;
课后练习课后练习用case语句实现3-8译码器3. LOOP语句3. LOOP语句 用于循环控制,与LOOP有关的五种语法其格式如下:
(1)[循环标号:] LOOP
顺序语句;
END LOOP [循环标号];
(2)[标号:] FOR 循环变量 IN 循环次数范围 LOOP
顺序语句;
END LOOP [循环标号];
(3)[循环标号:] WHILE 条件 LOOP
顺序语句;
END LOOP [循环标号];null(4)NEXT语句:在LOOP语句中,用来跳出当前循环。其格式为:
NEXT [循环标号] [WHEN条件];
(5)EXIT语句:用来结束LOOP语句的执行。其格式为:
EXIT [循环标号] [WHEN条件];
null利用LOOP语句可以简化同类顺序语句表达式.如:
Signal a,b,c:std_logic_vector(1 to 3)
……
For n IN 1 to 3 LOOP
a(n)<= b(n)AND c(n)
END LOOP
等效于:
a(1)<= b(1)AND c(1)
a(2)<= b(2)AND c(2)
a(3)<= b(3)AND c(3)4.NULL语句4.NULL语句 NULL是一条空语句,执行该语句使程序走到下一条语句。例4-6是用VHDL描述3路数据选择的程序,使用NULL语句可以排除一些不用的条件。 Process(s,a,b,c)
Begin
Case s Is
WHEN"00"=>d<=a;
WHEN"01"=>d<=b;
WHEN"10"=>d<=c;
WHEN Others=>NULL;
End Case;
End Process;二、并行语句二、并行语句并行语句与一般软件程序的最大区别就是在结构体中的执行都是同时进行的,既它们的执行顺序与语法的书写顺序无关。这种并行性是由硬件本身的并行性决定的,一旦电路接通电源,各部分就会按照事先设计好的
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
同时工作。
并行语句主要有进程语句(PROCESS)、块语句( BLOCK )、并行信号赋值语句、生成语句( GENERATE )、元件例化语句、断言语句。1. 进程语句1. 进程语句 进程语句是一段复合语句,由一段程序构成,各个进程之间是并行进行的,而进程的内部语句都是顺序执行的。一个结构体中可以包括多个进程语句,多个进程之间依靠信号(SIGNAL)来传递。进程语句进程语句null 进程语句的格式如下:
[标号:] PROCESS(敏感信号表)
[说明语句];--------定义一些局部变量
BEGIN
[顺序语句];
END PROCESS [标号:] ;敏感信号表敏感信号表进程赖以启动的敏感表。对于表中列出的任何信号的改变,都将启动进程,执行进程内相应顺序语句.
一些VHDL综合器,综合后对应进程的硬件系统对进程中的所有输入的信号都是敏感的,不论在源程序的进程中是否把所有的信号都列人敏感表中.
为了使软件仿真与综合后的硬件仿真对应起来,应当将进程中的所有输入信号都列入敏感表中.进程语句举例进程语句举例LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY if_case IS PORT
( a, b, c, d : IN Std_Logic;
sel : IN Std_Logic_Vector(1 downto 0);
y, z : OUT Std_Logic);
END if_case;
ARCHITECTURE logic OF if_case IS
BEGIN
if_label: PROCESS(a, b, c, d, sel)
BEGIN
IF sel="00" THEN y <= a;
ELSIF sel="01" THEN y <= b;
ELSIF sel="10" THEN y <= c;
ELSE y <= d;
END IF;
END PROCESS if_label;case_label:
PROCESS(a, b, c, d, sel) BEGIN CASE sel IS WHEN "00" =>z <= a; WHEN "01" =>z <= b; WHEN "10" =>z <= c; WHEN "11" =>z <= d; WHEN OTHERS =>z <= '0'; END CASE; END PROCESS case_label; END logic;敏感表举例敏感表举例if_ label: PROCESS(oe)
BEGIN
IF oe=‘1’ THEN
y <= a;
END IF;
END PROCESS if_label;敏感表举例敏感表举例if_label: PROCESS(oe,a)
BEGIN
IF oe=‘1’ THEN
y <= a;
END IF;
END PROCESS if_label;null进行进程设计时应注意以下问题:
1、进程为一个独立的无限循环语句。它只有两种状态:执行状态和等待状态。满足条件进入执行状态,当遇到end process语句后停止执行。
2、进程中的顺序语句具有明显的顺序/并行运行双重性。即。进程中的顺序语句具有并行执行的性质。如:Process(s,a,b,c)
Begin
Case s Is
WHEN"00"=>d<=a;
WHEN"01"=>d<=b;
WHEN"10"=>d<=c;
WHEN Others=>NULL;
End Case;
End Process;null3、进程必须由一个敏感信号表中定义的任一敏感信号的变化来启动,否则必须有一个显示的WAIT语句来激励。
4、进程语句本身是并行语句。即同一结构体中的不同进程是并行运行的,后者是根据敏感信号独立运行的。
5、信号是多个进程间的通信线。
6、在同一进程中只能放置一个含有时钟边沿检测语句的条件语句。2. 块语句2. 块语句 块语句将结构体中的并行语句结合在一起,其主要目的是改善并行语句极其结构的可读性,一般用于较复杂的VHDL程序。
其格式如下:
块名称: BLOCK (表达式)
[块声明项];
BEGIN
并行语句;
END BLOCK [块名称];
3. 并行信号赋值语句3. 并行信号赋值语句(1)简单(并行)信号赋值语句
格式:赋值目标﹤=表达式; 如q ﹤=b+c;
(2)条件信号赋值语句
格式:赋值目标﹤=表达式 WHEN 赋值条件 ELSE
…
表达式;
注意:由于条件测试的顺序性,第一句具有最高赋值优先级,第二句次之,以此类推。nullARCHITECTURE ar_6 OF fzh_1 IS
BEGIN
y<= a WHEN q=″00″ELSE
b WHEN q=″01″ELSE
c WHEN q=″10″ELSE
d ;
END ar_6;
【例4-10】条件信号赋值语句的用法null(3)选择信号赋值语句
格式:WITH 选择表达式 SELECT
赋值目标﹤=表达式 WHEN 选择值,
…
表达式 WHEN 选择值; 选择信号赋值语句不允许有条件重叠的现象,也不允许存在条件涵盖不全的情况。null 注意:选择信号赋值语句本身不能在进程中应用,但其功能却与进程中的CASE语句的功能相似。 CASE语句的执行依赖于进程中敏感信号的改变而启动进程。选择信号语句中也有敏感量,即选择表达式 。当选择表达式 的值发生变化时,就将启动此语句对各子句的选择值进行测试对比,当发现有满足条件的子句的选择值时,就将此子句表达式中的值赋给赋值目标。 nullARCHITECTURE ar_7 OF fzh_2 IS
BEGIN
WITH q SELECT
y<= a WHEN ″00″, --选择值用“,”结束
b WHEN ″01″,
c WHEN ″10″,
d WHEN OTHERS;
END ar_7;
【例4-11】选择信号赋值语句的用法
4. 元件例化语句4. 元件例化语句 把已经设计好的设计实体称为一个元件或一个模块,它可以被高层次的设计引用。引用时就会用到元件声明和元件例化语句。二者缺一不可。 COMPONENT 元件实体名
PORT (元件端口信息);
END COMPONENT;
元件声明相当于对现成的设计实体进行封装,使其只留出外面的接口界面。(1)元件声明 null(2)元件例化 例化名:元件名 PORT MAP (端口列表)
PORT MAP 是端口映射的意思;端口列表是把例化元件端口与连接实体端口连接起来。
端口列表的接口格式为:
[ 例化元件端口=〉]连接实体端口null接口格式有三种格式:
一、名字关联方式
即保留例化元件端口=〉部分,这时为例化元件端口名与连接实体端口名的关联方式,其在PORT MAP 中的位置可以是任意的。
二、位置关联方式
即省去例化元件端口=〉部分,在PORT MAP 中只列出当前系统中的连接实体端口名即可,但要求连接实体端口名的与例化元件端口定义中的端口名一一对应。
三、混合关联方式
即上述两种关联方式同时并存。例4-13 元件例化设计4位加法器例4-13 元件例化设计4位加法器LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY add_4 IS
PORT(x,y: IN std_logic_vector (3 DOWNTO 0);
ci: IN std_logic;
s: OUT std_logic_vector(3 DOWNTO 0);
co: OUT std_logic;
END add_4;nullARCHITECTURE ar_9 OF add_4 IS
COMPONENT adde_1
PORT (x,y,ci: IN std_logic;
sum,co: OUT std_logic);
END COMPONENT;
SIGNAL cm: std_logic _vector (3 DOWNTO 0);
BEGIN
yj0:adde_1 PORT MAP(x(0),y(0),ci,s(0),cm(1));
yj1:adde_1 PORT MAP(x=>x(1),y=>y(1),
ci=>cm(1),sum=>s(1), co=>cm(2));
yj2:adde_1 PORT MAP(x(2), y(2), cm(2), sum=>s(2), co=>cm(3));
yj3:adde_1 PORT MAP(x(3), y(3), cm(3), s(3), co);
END ar_9;null***一位加法器的描述***
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY add_1 IS
PORT( x, IN std_logic;
y: IN std_logic;
ci: IN std_logic;
sum: OUT std_logic;
co: OUT std_logic;
END add_1;
ARCHITECTURE ar_10 OF add_1 IS
BEGIN
sum<=x XOR y XOR ci;
co<=( x AND y )OR( x AND ci)OR( y AND ci);
END ar_10;null练习:用D触发器构成4位移位寄存器,用例化语句进行设计。练 习 答 案练 习 答 案LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY shifter IS
PORT( din,clk: IN std_logic;
dout: OUT std_logic);
END shifter;
ARCHITECTURE a OF shifter IS
COMPONENT dff
PORT (D,clk: IN std_logic;
Q: OUT std_logic);
END COMPONENT;
SIGNAL d: std_logic _vector (4 DOWNTO 0);nullBEGIN
d(0)<=din;
U0:dff PORT MAP (d(0),clk,d(1));
U1:dff PORT MAP (d(1),clk,d(2));
U2:dff PORT MAP (D=>d(2), clk=> clk, Q =>d(3));
U3:dff PORT MAP (D=>d(3), clk=> clk, Q =>d(4));
dout<=d(4);
END a;null练习:用元件例化语句设计如图所示电路。元件为2输入与非门。练 习 答 案练 习 答 案LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY yf4 IS
PORT(A,B,C,D: IN std_logic;
Z: OUT std_logic);
END yf4;
ARCHITECTURE a OF yf4 IS
COMPONENT yf2
PORT (A1,B1: IN std_logic;
C1: OUT std_logic);
END COMPONENT;
SIGNAL X,Y: std_logic ;null BEGIN
U1:yf2 PORT MAP (A,B,X);
U2:yf2 PORT MAP (C,D,Y);
U3:yf2 PORT MAP (A1 => X, C1=>Z, B1 => Y);
END a;nullLIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY yf2 IS
PORT( A1,B1: IN std_logic;
C1: OUT std_logic);
END yf2;
ARCHITECTURE b OF yf2 IS
BEGIN
C1 <=A1 NAND B1;
END b;
5. 生成语句5. 生成语句 生成语句具有复制作用,可以生成与某个元件或设计单元电路完全相同的一组并行元件或设计单元电路结构。
格式1:
[标号:] FOR 循环变量 IN 取值范围 GENERATE
说明语句;
BEGIN
并行语句;
END GENERATE [标号];null格式2:
[标号:] IF 条件 GENERATE
说明语句;
BEGIN
并行语句;
END GENERATE [标号];null练习:用D触发器构成4位移位寄存器,用生成语句进行设计。LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY shifter IS
PORT( din,clk: IN std_logic;
dout: OUT std_logic);
END shifter;
ARCHITECTURE a OF shifter IS
COMPONENT dff
PORT (D,clk: IN std_logic;
Q: OUT std_logic);
END COMPONENT;
SIGNAL d: std_logic _vector (0 TO 4);nullBEGIN
d(0)<=din;
G:For i IN 0 TO 3 GENERATE
U:dff PORT MAP (d(i),clk,d(i+1));
END GENERATE G;
dout<=d(4);
END a;
6. 断言语句6. 断言语句断言语句是面向仿真的语句,综合器通常忽略此语句。并行断言语句等价一个进程语句,但不作任何操作,仅用于判断某一条件是否成立。
格式为:
ASSERT 条件
[REPORT
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
信息][SEVERITY出错级别];
当判断条件为Fause时报告错误。nullNote: 用在仿真时传递信息。
Warning: 用于非平常情形,仿真仍继续,结果不可预知。
Error: 仿真不能继续。
Failure: 致命错误,必须立即停止。错误级别为四级: nullLIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE ieee.std_logic_unsigned.ALL;
ENTITY rs_1 IS
PORT (s,r: IN std_logic;
q,nq : OUT std_logic);
END rs_1;
ARCHITECTURE ar_11 OF rs_1 IS
BEGIN
PROCESS
VARIABLE blh_1:bit:=′0′;
BEGIN
ASSERT NOT(s=′1′AND r=′1′)
REPORT"BOTH s AND r EQUAL TO′1′!“
SEVERITY ERROR;null IF s =′0′AND r=′0′ THEN
blh_1:=blh_1;
ELSIF s=′0′AND r=′1′THEN
blh_1:=′0′;
ELSE
blh_1:=′1′;
END IF;
q<=blh_1 after 2 ns;
nq<=NOT blh_1
WAIT ON r,s;
END PROCESS;
END ar_11;返 回第五节 子程序第五节 子程序子程序由一组顺序语句组成,是为了在程序中重复使用而设立的。
子程序不是一个独立的编译单位,只能置于实体或程序包中。
在结构体中定义的子程序对于该结构体来说是局部的,即不能被其它设计层次的结构体调用。如果要在其它结构体中调用同一个子程序,就需要把子程序定义到程序包中。null VHDL中的子程序有两类:
过程子函数:过程通过其接口返回0个或多个值。
函数子函数:函数直接返回单个值。
子程序包含两部分:即子程序声明和主体部分。
在程序包中声明子程序时,子程序声明必须要放在程序包声明中,子程序主体必须要放在程序包体中。一、函数的定义与引用一、函数的定义与引用 函数语句的作用是输入若干参数,通过函数运算求值,最后返回直接一个值。
函数语句的格式为:
FUNCTION 函数名 [参数表]
RETURN 类型; --函数头
FUNCTION 函数名 [参数表] --函数体
RETURN 类型 IS
[程序声明项;]
BEGIN
顺序语句;
END 函数名; null 函数头是程序包与函数的接口界面。如果要将一个函数组织成程序包入库,则必须定义函数头,且函数头应放在程序包的说明部分,而函数体应放在程序包的包体内。如果只在一个结构体中定义并调用函数,则只需定义函数体即可。
其中:函数表中为参数名、参数类别及数据类型,函数的参数为信号或常数,默认情况为常数;在RETURN后面的数据类型为函数返回值的类型;子程序声明项用来说明函数体内引用的对象和过程;顺序语句就是函数体,用来定义函数的功能。函数应用实例函数应用实例LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY fun IS
PORT (A: IN std_logic _Vector(0 TO 2);
M : OUT std_logic _Vector(0 TO 2));
END fun;
ARCHITECTURE art OF fun IS
FUNDTION sam (X,Y,Z: BIT) RETURN BIT IS
BEGIN
RETURN(X AND Y) OR Z;
END sam;nullPROCESS(A)
BEGIN
M(0)<=sam(A(0), A(1), A(2));
M(1)<=sam(A(2), A(0), A(1));
M(2)<=sam(A(1), A(2), A(0));
END PROCESS;
END art;二、过程的定义与引用二、过程的定义与引用 过程的作用是传递信息,即通过参数进行内外的信息传递。其中参数需说明(信号、变量及常量)类别、类型及传递方向。
过程定义的格式为:
PROCEDURE 过程名 [参数声明] IS
[子程序声明项];
BEGIN
顺序语句;
END [PROCEDURE] [过程名] ;
其中:参数声明指明了输入、输出端口的数目和类型。参数声明的语法格式为:[参数名:方式]
方式参数类型有in\out\inout\buffer 等四种。过程的调用过程的调用 过程的调用是一条语句,调用时通过其接口返回0个或多个值。
根据环境的不同,过程调用有两种方式,即顺序语句方式和并行语句方式。在一般的顺序语句自然执行过程中,一个过程被执行,则属于顺序语句方式;当某个过程处于并行语句环境中时,其过程体中定义的任一IN或INOUT的目标参量发生改变时,将启动过程的调用,这时的调用属于并行语句方式。过程应用实例过程应用实例LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY fun IS
PORT (A: IN std_logi