1 第 4 第 VHDL 第第第第
Jan 19, 2016
1
第 4 章 VHDL 设计入门
2
基本知识:
理解 QuartusⅡ 的 HDL 输入法
理解 VHDL 程序的基本结构
理解 VHDL 程序的顺序结构
理解 VHDL 程序的并行结构
理解 VHDL 程序的语言要素
3
QuartusⅡ 软件的操作顺序:
• 编写 VHDL 程序(使用 Text Editor )
• 编译 VHDL 程序(使用 Complier )
• 仿真验证 VHDL 程序(使用 Waveform Editor 、 Simulat
or )
• 进行芯片的时序分析(使用 Timing Analyzer )
• 安排芯片脚位(使用 Floorplan Editor )
• 下载程序至芯片(使用 Programmer )
4
§4.1 QuartusⅡ 的 HDL 输入法
常用的输入法有三种: AHDL 、 VHDL 、 Verilog HD
L 。
以 7 段数码显示译码器设计为例介绍 QuartusⅡ 的 V
HDL 文件的输入编辑和编译仿真方法。
一、输入编辑 VHDL 文件
1.建立工程项目
执行 File-New Project Wizard… 命令,建立工程,项目名称 DECL7S
5
一、输入编辑 VHDL 文件
2. 新建 VHDL 文件
执行 File-New… 命令,弹出图 4-8 对话框选择 VHDL File 。然后保存文本文件 File-save as…
图 4-8
图 4-9
6
一、输入编辑 VHDL 文件
3. 编辑 VHDL 文件
7
二、编译仿真 VHDL 文件
1. 编译 VHDL 文件
执行 Processing-Start Complication, 进行编译,如有错误进行修改保存后再编译直到编译成功。
2. 仿真 VHDL 文件
新建波形文件 File-New… ,如同仿真原理图一样步骤
先装载引脚 d 和 led ;然后设置仿真结束时间 Ed
it-End Time 和网格大小 Edit-Grid Size ;编辑波形后保存,最后进行波形仿真 Processing-Start Simula
tion.
8
二、编译仿真 VHDL 文件
图 4-26 仿真结果
9
§4.2 VHDL 的程序基本结构 117
1.USE 定义区
2.PACKAGE 定义区
3.ENTITY 定义区
4.ARCHITECTURE 定义区
5.CONFIGURATION 定义区
Component 定义区
信号定义
Data Flow 描述Behavior Process 描述 Structure 描述
定义元件库定义使用哪些自
定义元件库
定义电路实体的外观; I/O 接口的规
格
描述电路内部的功能,说明电路执行什么
动作或功能
决定哪一个 architecture 被使
用
10
VHDL 基本程序结构:
USE 定义区ENTITY 定义区
ARCHITECTURE 定义区
1 ) USE 定义区和标准定义库包括:LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
由于 VHDL 已是 IEEE 规定的标准,所以只要是 CPLD 、FPGA 等芯片公司,它们都会提供这个标准的定义库( Library IEEE ),而且由于这里面写了许许多多的定义与参数,初学者一时之间也不容易全部了解,所以全部写上以减轻负担。
常用库:
IEEE 库
STD 库
ASIC 矢量库
WORK 库
用户自定义库
11
1 ) USE 定义区和标准定义库包括
程序包( PACKAGE )是预先定义或设计好的数据类型、子程序和各种设计实体的集合;库( LIBRARY )则是用来存储已经完成的程序包等 VHDL 设计与数据的仓库。
一般情况下,库和程序包的引用声明放在设计文件的最前面。
12
库与程序包的使用
除 WORK 、 STD 库外,其他库与程序包使用前首先要声明。格式如下:
LIBRARY 库名 ;
USE 库名 . 程序包名 . 项目名 ;
USE 库名 . 程序包名 .ALL;
例: LIBRARY altera;
USE altera.maxplus2.ALL;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
13
附程序包的定义:
PACKAGE 程序包名 IS
程序包首说明语句;
END [PACKAGE] 程序包名;
PACKAGE BODY 程序包名 IS
程序包体说明语句;
END [PACKAGE BODY] 包集合名;
提示:程序包体为可选项,程序包首与程序包体名字应相同。
14
2 )实体( ENTITY )命令格式:
ENTITY 芯片电路名称 is PORT( 管脚名称 1 :输出输入状态 资料类型; 管脚名称 2 :输出输入状态 资料类型; : 管脚名称 n :输出输入状态 资料类型 ); END 芯片电路名称;
※ 注意两点: a. 芯片电路名称是对你所编辑的电路功能的描述,比如半加器、全加器、 D 出发器及一些复杂的编程电路; b. 对每个管脚的描述完成后要打分号,但是最后一个管脚描述完成后不用分号,而是在括上反括号后打分号。
15
端口方向:IN( 输入 ) ,只能读,用于时钟输入、控制输入(装入、复位、使能)、单向数据输入;OUT( 输出 ) ,只能被赋值,用于不能反馈的输出;BUFFER(缓冲 ) ,类似于输出,但可以读,读的值是被赋值,用做内部反馈用,不能作为双向端口使用。
ENTITY and_n IS
GENERIC(n:POSITIVE:=8);
PORT(a:IN BIT_VECTOR((N-1) DOWNTO 0);
f:OUT BIT);
END and_n;
16
3 ) Architecture 定义区的命令格式:
ARCHITECTURE 结构名称 OF 芯片电路名称 ( 实体名 ) IS
BEGIN
: (电路内部的描述)END 结构名称;
※ 这里的结构名称是可以根据用户的习惯定义,但是需要和芯片电路名称相区别。
17
例:
ENTITY adder IS
PORT(op1,op2 : IN UNSIGNED(7 DOWNTO 0);
Result: OUT INTEGER);
END adder;
ARCHITECTURE maxpld OF adder IS
BEGIN
result<=CONV_INTEGER(op1+op2);
END ARCHITECTURE maxpld;
18
4 ) CONFIGURATION配置的命令格式: 一个实体可以有几个结构体,就好像一个电路可以有几个不同的实现方案一样。配置是在一个实体有几个结构体时,用来为实体指定在特定的情况下使用哪个特定的结构体。在仿真时可以利用配置为实体选择不同的结构体。
CONFIGURATION 配置名 OF 实体名 IS
FOR 结构体名 END FOR;
END[CONFIGURATION] 配置名;
19
例:
CONFIGURATION MY_CONFIG OF COUNTER3 IS
FOR MY_ARCH
END FOR;
END MY_CONFIG;
20
以一个芯片内部俯视图为例:
Pin48 Pin7
试用 VHDL 编写程序
实际上这只是将输入
脚 Pin48 直接引一条
线至输出脚 Pin7 。
图 4-5-1 芯片内部俯视图
21
程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH1_1_1 IS PORT( PIN48: IN STD_LOGIC; PIN7: OUT STD_LOGIC );END CH1_1_1;ARCHITECTURE A OF CH1_1_1 ISBEGIN PIN7<=PIN48;END A;
22
基本数据类型 :逻辑信号、数值信号
信号
逻辑信号
数值信号
布尔代数 (Boolean)
位 (Bit)
标准逻辑 (Std_Logic)
整数( Integer Unsigned)
实数 (Real)
正整数 (Positive)
自然数 (Natural)
§4.5 VHDL 程序的语言要素总结
23
一、逻辑信号1.布尔代数 (Boolean)
Type Boolean is (False,True)
一个布尔量具有两个状态:“真”或“假”。布尔量不属于数值,因此不能用于运算,它只能通过关系运算符获得。一般这一类型的数据初始值总为 FALSE.
2. 位 (Bit)
Type Bit is(‘0’, ‘1’)
可视为数字电路里的低电位 ,高电位
Eg. 要设置一个定义为 Bit 的 Result 管脚信号为高电位输出,则
Entity中 Result: out Bit;
Architecture中 Result<=‘1’;
24
3. 标准逻辑 (Std_Logic)
Type STD_LOGIC is (‘X’,--Forcing Unknown ; 浮接不定
‘0’,--Forcing 0; 低电位
‘1’,--Forcing1;高电位
‘Z’,--High Impedance;高阻抗
‘W’,--Weak Unknown ;浮弱接
‘L’,--Weak 0;弱低电位
‘H’,--Weak 1;弱高电位
‘-’,--Don’t care; 不必理会
);
“标准逻辑”信号定义,远较“ Bit” 信号对于的数字逻辑电路的逻辑特性描述更完整、更真实。对逻辑信号的定义,通常都采用
25
4.逻辑序列信号以数字电路而言,有许多时候都是将几个信号合成一组代表特定功能的序列信号,例如:数据总线( Data Bus )、地址总线( Address Bus )等。实际上从电路的观点上,CLK 信号看成一条线上的信号,而 Data 是 8条线合成的排线信号。
Data4 8
Address
CE
ROM
图 5-1-1 序列信号在电路上的表示意义
26
针对这种序列信号的表示,提供以下功能:
Bit_Vector : 位序列
Std_Logic_Vector : 标准逻辑序列
Signal Data : Std_logic_vector(7 Downto 0);--Data output
Signal Address:Std_logic_vector(0 to 3);--Address
Signal CE:Std_logic --chip enable
对序列信号的表示,除了序列的范围大小须注意外,还须特别留意序列的编号顺序。
27
ARCHITECURE m of test isSignal A : Std_logic_vector(3 Downto 0);Signal B :Std_logic_vector(0 to 3);Begin B<=A; --A 序列信号传递至 B 序列信号End m;
A(3)
A(2)
A(1)
A(0)
B(0)
B(1)
B(2)
B(3)
图 5-1-2 A 、 B 序列信号的传递
28
5 、序列信号的分解与合并
在信号的处理上, VHDL 的语法是接受分解与合并的,如图 5-1-3“&”符号代表执行信号合并的动作。
A(3)
A(2)
A(1)
A(0)
B(0)
B(1)
B(2)
B(3)
C(0) D(1)
C(1) D(0)
1
图 5-1-3 序列信号的分解与合并
29
程序为:
ARCHITECTURE M OF TEST IS
Signal A :Std_logic_vector(3 downto 0);
Signal B :Std_logic_vector(0 to 3);
Signal C :Std_logic_vector(0 to 1);
Signal D :Std_logic_vector(1 downto 0);
BEGIN
C<=A(2 DOWNTO 1); -- 分解: A(2~1) 序列信号传至 D
B<=A(3) & D & ‘1’; -- 合并; A ( 3 )、 D 、要“ 1” 信号传递至 D
END M;
30
6 、逻辑信号的运算
配合逻辑信号的基本运算符,通常包含有两种:
逻辑运算、关系运算
1 )逻辑运算符( 6 种)NOT(非 ) OR (或) AND (与)NOR (或非) NAND (与非) XOR (异或)
2 )关系运算符= (等于) /= (不等于) < (小于)<= (小于等于) > (大于) >= (大于等于)
31
例 2 :ENTITY CH2_1_2 ISPORT( A: IN Std_logic_vector(3 downto 0); B: IN Std_logic_vector(3 downto 0); C: OUT Std_logic_vector(7 downto 0) );END CH2_1_2;ARCHITECTURE M OF CH2_1_2 ISBEGIN C(0)<=NOT A(0); C(2 DOWNTO 1)<=A(2 DOWNTO 1) AND B(2 DOWNTO 1); C(3)<='1' XOR A(3); C(7 downto 4)<="1111" when(A/=B)ELSE "0000";END M;
32
二、数值信号 在 VHDL 的程序中,将信号定义成数值,是为了方便作数值方面的运算,如“加 6 计数器”、“ 10 分频器”,为后续作加减乘等运算就相对容易许多。
1 、整数 (Integer)
Type INTEGER is range -2147483648 to 2147483647
实际上一个整数是由 32 位的 BIT_VECTOR 所构成,所以数值范围也可以看成是 -231 ~231-1
①正整数
Subtype POSITIVE is range 0 to INTEGER’High
②自然数
Subtype NATRAL is range 1 to INTEGER’High
33
数值范围的限制方法,是以 Range…To 命令来达成。
Signal A : INTEGER; --32 位整数的定义
Signal B : Integer range 0 to 7; --3 位整数的定义
Signal C : Integer range -1 to 1; --2 位整数的定义
上面的 A 、 B 、 C 信号的定义,原本都是 32 位的整数,但经 Range…To 的限制结果,将有效控制 B 、 C 的位长度。
34
2 、无符号整数
和前面的“标准逻辑”序列( Std_logic_vector )信号相似,定义时必须指明这个无符号整数的位数,例如下面的定义:
Signal A : Unsigned(3 Downto 0); --4 位无符号整数定义
Signal B : Unsigned(7 Downto 0); --8 位无符号整数定义
Usigned 信号类型除了具有数值运算的好处外,它还具有与“标准逻辑”序列信号相似的逻辑运算特性。
通过一个实例来理解无符号整数与标准逻辑序列的异同:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
35
--
****************************************************
ENTITY CH2_1_3 IS
PORT(
A:IN STD_LOGIC_VECTOR(1 DOWNTO
0);
B:IN UNSIGNED(1 DOWNTO 0);
C:OUT UNSIGNED(7 DOWNTO 0);
D:OUT STD_LOGIC_VECTOR(1
DOWNTO 0)
);
END CH2_1_3;
--
*****************************************************
ARCHITECTURE M OF CH2_1_3 IS
SIGNAL E,F,G:UNSIGNED(1 DOWNTO 0);
SIGNAL H :UNSIGNED(7 DOWNTO 0);
BEGIN
E<=UNSIGNED(A);
F<=B;
H(1 DOWNTO 0)<=E+F;
H(3 DOWNTO 2)<=E-F;
H(7 DOWNTO 4)<=E*F;
G(0)<=E(0) AND F(0);
G(1)<=E(1) OR F(1);
C<=H;
D<=STD_LOGIC_VECTOR(
G);
END M;
36
※ 注意:
1 、由上述的范例可以了解, Unsigned (无符号整数)与 Std_logic_vector (标准逻辑)信号之间是可以作转换的。
2 、 Unsigned (无符号整数)信号的序列编号是由高至低,所以一定要使用 Downto 的序列形式定义。
37
3 、实数( Real )
实数信号的定义形式为:
Type REAL is range -1.7E38 to 1.7E38
必须表示成“带小数点”或科学计数的表示方式。ARCHITECTURE m OF TEST IS
Signal A,B,C,D : REAL;
BEGIN
A<=1.5; --带小数点
B<=5.0;
C<=3.0E8; --科学计数
D<=-4.9E-9;
END m;
38
数据对象的定义
• VHDL语言的标识符
• 数据对象的定义常数( Constant )
信号( Signal )
变量( Variable )
39
VHDL语言的标识符
VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则:
• 标识符由字母( A…Z ; a…z )、数字和下划线字符组成。• 任何标识符必须以英文字母开头。• 末字符不能为下划线。• 不允许出现两个连续下划线。• 标识符中不区分大小写字母。• VHDL 定义的保留子或称关键字,不能用作标识符。• VHDL中的注释由两个连续的短线( -- )开始,直到行尾。
40
以下是非法标识符:-Decoder —起始不能为非英文字母3DOP —起始不能为数字Large#number —“#” 不能成为标识符的构成符号Data__bus — 不能有双下划线Copper_ — 最后字符不能为下划线On —关键字不能用作标识符。 注:在 AHDL 语言中标识符要区分大小写,但在 VHDL 语言中不区分大小写。所以写程序时,一定要养成良好的书写习惯,应用关键字时用大写,自己定义的标识符用小写。
41
标识符表示的几种数据对象的详细说明如下:1) 常数( Constant )• 常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读
和修改。常数一被赋值就不能在改变。一般格式:
CONSTANT 常数名:数据类型: =表达式;
例: CONSTANT Vcc: REAL: =5.0;
—设计实体的电源电压指定
• 常数所赋得值应与定义的数据类型一致。
• 常量的使用范围取决于它被定义的位置。程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;设计实体中某一结构体中定义的常量只能用于此结构体;结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。
42
例如:定义一个 4 位( Nibble )长的常数零和一个 8 位( Byt
e )长的常数零,可分别写成:Constant Zero_4:Std_logic_vector(3 downto 0):=“0000”;
Constant Zero_8:Std_logic_vector(7 downto 0):=“00000000”;
常数名称的命令规则如标志符规则,数据类型如上一节所提 Bi
t 、 Unsigned 、 Std_logic_vector 。设置值必须要,而且定义完成后,就不能再更改。
43
2)变量( Variable )• 变量是一个局部变量,它只能在进程语句、函数语句和进程语句结构中使用。用作局部数据存储。在仿真过程中。它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量常用在实现某种算法的赋值语句中。
• 一般格式:VARIABLE 变量名 数据类型 约束条件: =表达式;例: VARIABLE x, y: INTEGER; — 定义 x, y 为整数变量VARIABLE count: INTEGER RANGE0 TO255:=10; — 定义计数变量范围
• 变量的适用范围仅限于定义了变量的进程或子程序中。若将变量用于进程之外,必须该值赋给一个相同的类型的信号,即进程之间传递数据靠的信号。
• 变量赋值语句的语法格式如下: 目标变量: =表达式;• 变量赋值符号是“: =” 。赋值语句右方的表达式必须是一个与目标变
量有相同数据类型的数值。变量不能用于硬件连线和存储元件。
44
3 )信号( Signal ) 信号是描述硬件系统的基本数据对象,它类似于连接线,也可内连元件。端口也是信号。事实上,端口能够专门被定义为信号。它除了没有数据流动方向说明以外,其它性质与实体的端口( Port )概念一致。变量的值可以传递给信号,而信号的值不能传递给变量。信号通常在构造体、包集合和实体中说明。信号说明格式为:SIGNAL 信号名: 数据类型;信号初始值的设置不是必需的,而且初始值仅在 VHDL 的行为仿真中有效。信号除了没有方向的概念以外几乎和端口概念一致。例: SIGNAL sys_clk: BIT:=’0’;
SIGNAL ground: BIT:=’0’
在程序中,信号值输入信号时采用代入符” <=” ,而不是赋值符“: =” ,同时信号可以附加延时。信号传送语句: s1<=s2 AFTER 10ns
信号是一个全局量,可以用来进行进程之间的通信
45
信号与变量的区别:• 信号赋值可以有延迟时间,变量赋值无时间延迟;
• 信号除当前值外还有许多相关值,如历史信息等,变量只有当前值;
• 进程对信号敏感,对变量不敏感;
• 信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见;
• 信号可以看作硬件的一根连线,但变量无此对应关系。
46
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_2_2A IS PORT( IP:IN STD_LOGIC; CP:IN STD_LOGIC; OP:OUT STD_LOGIC );END CH2_2_2A;
ARCHITECTURE M OF CH2_2_2A IS SIGNAL D:STD_LOGIC;BEGIN
PROCESS(CP,IP) BEGIN IF CP'EVENT AND CP='1' THEN D<=IP; OP<=D; END IF; END PROCESS;END M;
ARCHITECTURE M OF CH2_2_2B ISBEGIN PROCESS(CP,IP) VARIABLE D:STD_LOGIC; BEGIN IF CP'EVENT AND CP='1' THEN D:=IP; OP<=D; END IF; END PROCESS;END M;
47
VHDL 程序的顺序结构
• 顺序语句:
每一条语句在行为仿真时的执行顺序都是按照它们的书写顺序。
• 并行语句:
各个并行语句在行为仿真时执行是同步进行的,其执行顺序与它们的书写顺序无关。
48
§4.2 顺序语句(一)
•进程( Process )•If-Else(判断比较 )
•Wait( 等待 )
注意:
“顺序语句命令”与下一节所提“并行同时”命令的最大不同点是,顺序语句命令类似一般的程序语言,如 C 、 Basic等的执行方式,是一次一个命令,且依书写方式由上而下的执行。
但“并行同时”命令的执行方式,就像是电路板的动作方式,不论几个命令,是一次同时执行,产生结果。
49
1 、进程( Process )
语法格式:
[过程名称: ] Process [ (感测信号 1 ,感测信号 2 ,……) ]
[ 定义区 ]
Begin
:
End Process[过程名称 ] ;
说明:
1 )中括号表示可以省略的,包括过程名称、感测信号;
2 )“感测信号”代表这个信号有任何变化时,将促使这个过程所包含的顺序语句立刻执行一次;
3 )在 Architecture中,可存放多个 Process ,允许它们同时执行。
50
2 、 If-Else(判断比较 )
语法格式 1 :
If 条件 Then
顺序语句;Else
顺序语句;End If;
51
例 4.3
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY multi_2 IS
PORT(
s,d0,d1:IN STD_LOGIC;
y:OUT STD_LOGIC
);
END multi_2;
ARCHITECTURE A OF multi_2 IS
BEGIN
- -Y<=(NOT s AND d0) OR
(s AND d1);
PROCESS(s,d0,d1)
BEGIN
IF (s='0')THEN
y<=d0;
ELSE
y<=d1;
END IF;
END PROCESS;
END A;
52
图 4-27 例 4.3 的仿真波形
53
If-Else 命令还有以下几种变形:
语法格式 2
If 条件 Then
顺序语句;End If;
54
例 4.4无 ELSE 部分,综合时生成一个寄存器的结构LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY dff1 IS
PORT(
data_in: IN STD_LOGIC;
clock: IN STD_LOGIC;
data_out:OUT STD_LOGIC
);
END dff1;
ARCHITECTURE behv OF dff1 I
S
BEGIN
PROCESS(data_in,cloc
k)
BEGIN
IF(clock='1' AND cloc
k'event) THEN
data_out<=data_i
n;
END IF;
END PROCESS;
END behv;
55
图 4-28 例 4.4 的仿真波形
56
If 条件式 1 Then 语句命令 A 方块ElsIf 条件式 2 Then 语句命令 B 方块ElsIf 条件式 3 Then 语句命令 C 方块ElsIf 条件式 4 Then :Else 语句命令 N 方块End If;
说明:
1) 先判断条件式 1 结果是否为真,为真则执行语句命令 A ,执行完方块 A 内命令后,则跳至 End If 之后的命令继续执行;
2 )条件 1 为假时判断条件式 2 ,依次判断执行后跳至 End If当以上条件都不合适时则执行语句命令 N
方块;
语法格式 3:
57
例 4.5LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY encoder IS PORT( inv: IN STD_LOGIC_VECTOR(7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0) );END encoder;ARCHITECTURE rtl OF encoder ISBEGIN
PROCESS(inv)
BEGIN
IF inv(7) = '1' THEN y<="111";
ELSIF inv(6) = '1' THEN y<="110";
ELSIF inv(5) = '1' THEN y<="101";
ELSIF inv(4) = '1' THEN y<="100";
ELSIF inv(3) = '1' THEN y<="011";
ELSIF inv(2) = '1' THEN y<="010";
ELSIF inv(1) = '1' THEN y<="001";
ELSIF inv(0) = '1' THEN y<="000";
ELSE y<="000";
END IF;
END PROCESS;
END rtl;
58
图 4-29 例 4.5 的仿真波形
59
3 、 Wait( 等待 )
语法格式:
Wait Until 条件式;
说明:
上述命令的意义是要求等待条件式成立,常和 Process 或 Loop 命令合用。
Eg. 合并使用 Wait Until 和 Process 命令
60
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_4_1 IS PORT( A,RST1 : IN STD_LOGIC; OP1 : OUT STD_LOGIC);END CH2_4_1;ARCHITECTURE M OF CH2_4_1 ISBEGIN PROCESS BEGIN OP1<=A; WAIT UNTIL RST1='1'; END PROCESS;END M;
61
§4.2 顺序语句 ( 二 ) Case-When,Null
Case-When 命令常用于选择执行有明确描述的信号,例
如读取内存地址是“ 0010”处的数据,,而 Null 命令常被用
于 Case-When 内的执行命令。1 、 Case-When (描述选择)
Case 选择信号 Is when 信号值 1 => 语句命令 A 方块 when 信号值 2 => 语句命令 B 方块 : when others => 语句命令 N 方块END Case;
62
Eg.利用 Case-When 的命令设计下面的电路方块功能。
其中 S1 、 S2控制开关的控制信号
OPOP
D0
D1
0
S1S2
63
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CH2_5_1 IS
PORT(
D0,D1:IN STD_LOGIC;
S:IN STD_LOGIC_VECTOR(1
DOWNTO 0);
OP:OUT STD_LOGIC
);
END CH2_5_1;
ARCHITECTURE M OF CH2_5_1 IS
SIGNAL A: STD_LOGIC;
BEGIN
PROCESS(S)
BEGIN
CASE S IS
WHEN "00"=>
A<=D0;
WHEN "01"=>
A<=D1;
WHEN "10"=>
A<=NOT A;
WHEN OTHERS=>
A<='0';
END CASE;
END PROCESS;
OP<=A;
END M;
64
2 、 Null (空语句)
与 Caes-when 语句连用
Signal S: Integer range 0 to 10;Signal A,D0,D1:Std_logic; :Case S Is when 2|4|5 => A<=D0; when 7=> A<=D1; when others=> NULL;End Case; :
65
作业:1 、试计算下列程序的 C 输出结果(假设 A=“0011” , B=“1001” )LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY lx2_1 ISPORT( A,B: IN STD_LOGIC_VECTOR(3 DOWNTO 0); C: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END LX2_1;ARCHITECTURE M OF LX2_1 ISBEGIN C(1 DOWNTO 0)<=A(2 DOWNTO 1) OR B(1 DOWNTO 0); C(3 DOWNTO 2)<='1'&('1' XOR NOT A(3)); C(7 DOWNTO 4)<="1010" WHEN (A=B) ELSE "0100";END M;
66
2 、试设计 VHDL 程序完成下面的真值表功能:
输入 输出S2 S1 S0 Z
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 0
67
3 、试设计 VHDL 程序完成下面电路方块图:
1
23
D0D1
D2
D3
D4
'1'
'1'
OP
OP
S0S1S2
68
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LX2_3 ISPORT( D0,D1,D2,D3,D4:IN STD_LOGIC; S:IN STD_LOGIC_VECTOR(2 DOWNTO 0); OP:OUT STD_LOGIC );END LX2_3;ARCHITECTURE M OF LX2_3 IS SIGNAL A: STD_LOGIC;BEGIN
PROCESS(S) BEGIN CASE S IS WHEN "000"=> A<=D0; WHEN "001"=> A<=D1; WHEN "011"=> A<=D2; WHEN "100"=> A<='1'; WHEN "101"=> A<=D3; WHEN "110"=> A<=D4 AND A; WHEN "111"=> A<='1'; WHEN OTHERS=> NULL; END CASE; END PROCESS;OP<=A;END M;
69
§4.3 并行同时语句(一)
基本的并行同时语句,可分三种形式来讨论:
• 直接设置语句:使用 <=运算符
•条件式信号设置语句: When-Else
•选择信号设置语句: With-Select
70
1 、直接设置语句:使用 <=运算符 虽然使用程序进行硬件描述,不过最终的结果是电路。所以,VHDL 的描述语法必须让电路具有同时并行处理的能力,而不是像 C 语言一次一个命令的方式顺序执行。
以下为, A 、 B 、 C 三点是将信号送入电路,此信号的结果 D 、E必须是以一次同时且并行方式出现,这样才符合电路硬件的动作规范。EG3-1. 赋值语句
71
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CH2_3_1 IS
PORT(
A,B,C: IN STD_LOGIC;
D,E: OUT STD_LOGIC
);
END CH2_3_1;
ARCHITECTURE M OF CH2_3_1 IS
BEGIN
D<=A AND B;
E<=NOT C;
END M;
72
仿真结果:
73
2 、条件式信号设置语句: When-Else
When-Else 命令也是属于同时并行的语句命令,它的语法格式是:
信号 A<= 信号 B When (条件式 1 ) Else
信号 C When (条件式 2 ) Else
信号 D ;
说明:
1 )上述的条件式,是指一般常见的布尔表达式,亦即条件式的结果必定是真( Ture )或错 (False )中的 一种。
2 )当条件 1 为真时,则将信号 B传递给信号 A ,否则在确认条件式 2 为真时,将信号 C传递给信号 A 。最后条件1 和 2 都不成立时,将信号 D传递给信号 A 。
74
Eg3-2. 真值表( Ture Table)
输入 输出
X Y Z
0 0 0
0 1 1
1 0 1
1 1 0
75
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_3_2A IS PORT( X,Y: IN STD_LOGIC; Z: OUT STD_LOGIC );END CH2_3_2A;ARCHITECTURE M OF CH2_3_2A ISBEGIN Z<='0' WHEN (X='0' AND Y='0') ELSE '1' WHEN (X='0' AND Y='1') ELSE '1' WHEN (X='1' AND Y='0') ELSE '0';END M;
76
仿真结果:
1 )其实在结构体中程序部分可以由 z<=x xor y;代替,其仿真结果完全相同。
2 ) Z 输出的延迟时间为 9.4ns
仿真结果说明:
77
3 、选择式信号设置语句: With-Select
语法格式:
With 选择信号 S Select
信号 Y<= 信号 A When 选择信号 S值为 m , 信号 B When 选择信号 S值为 n , :
信号 Z When Others;
说明:
1)With-Select 命令的作用是,判断选择信号 S 的值,依次是 m或 n 等相应的条件值,然后在判断成立时,将它对应的信号值 A或信号 B传递给信号 Y ;2 )当 S值不为罗列的任何值,则将 Others 保留字的信号值 Z ,传递给信号 Y ;3 ) S 的选择值必为不同
78
Eg3-3. 真值表( Ture Table)
输入 S 输出 Z
0 0 0
0 1 1
1 0 1
1 1 0
79
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_3_3 ISPORT( S: IN STD_LOGIC_VECTOR(1 DOWNTO 0); Z: OUT STD_LOGIC);END CH2_3_3;ARCHITECTURE M OF CH2_3_3 ISBEGIN WITH S SELECT Z<='0' WHEN "00", '1' WHEN "01", '1' WHEN "10", '0' WHEN OTHERS;END M;
80
仿真结果:
使用 With-Select 时,必须特别注意它的功能在于,选择信号是针对某一特定的信号,而无法像When-Else 命令,作较多的信号条件比较。
说明: