当前位置:首页 >> 其它课程 >>

FPGA(55)课件


第5章

重点知识点
? VHDL程序的基本语法结构 ? 常用的数据类型 ? 数据对象 ? 基本操作符

5.1 VHDL语言简介
VHDL程序的基本结构
一个完整的VHDL语言程序通常包含 实体(Entity) 结构体(Architecture) 库(Library) 程序包(Package) 配置(Configuration)

2选1多路选择器的VHDL设计实例
2选1数据选择器的思想: 两个输入信号a,b,根据控制信号s的取值0或1 的不同,从输出端y选择输出。

2选1数据选择器的VHDL语言(1)
LIBRARY IEEE; ------------------------------------------------ 库 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; 程序包 USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY mux21a IS PORT( a, b : IN s : IN y : OUT END ENTITY mux21a

BIT ; BIT; BIT ) ; ;

实体

ARCHITECTURE one OF mux21a IS BEGIN y <= a WHEN s = '0' ELSE b ; END ARCHITECTURE one ;

结构体

各组成部分功能:
实体:用于描述所设计系统的外部接口特性;即该设计实 体对外的输入、输出端口数量和端口特性。 结构体:用于描述实体所代表的系统内部的结构和行为; 它描述设计实体的结构、行为、元件及内部连接关系。 库:存放已经编译的实体、结构体、程序包集合和配置。 程序包:存放各设计模块都能共享的数据类型、常数和子 程序库; 配置:实体对应多个结构体时,从与某个实体对应的多个 结构体中选定一个作为具体实现。

2选1数据选择器的VHDL语言(2)
ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a;

实体

ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT; BEGIN 结构体 d <= a AND (NOT S); e <= b AND s ; y <= d OR e ; END ARCHITECTURE one ;

2选1数据选择器的仿真波形

结构体的描述方式
1

2

3

3.结构描述方式 2.数据流描述方式 1.行为描述方式 多用在多层次的设计中,通过调用 这种描述将数据看成从设计的输入 只需描述输入与输出的行为,不关 库中得元件或已经设计好的元件,进行 端到输出端,通过并行语句表示这些数 注具体的电路实现,一般通过一组顺序 组合来完成实体功能的描述,它只表示 据形式的改变,即信号到信号的数据流 的VHDL进程来反映设计的功能和算法; 元件和元件之间的互连. 动的路径和形式进行描述;
9

5.3 VHDL程序语法格式 VHDL书写格式:
? VHDL语言不区分大小写; ? [ ]表示括号内的内容是可选的,{ }表示括 号内的内容是可重复出现的; ? VHDL用双横线”--“表示注释; ? 保存的文件名与实体名字应该一致。

5.3.1 实体声明
实体:用于描述所设计系统的外部接口特性;即该设计 实体对外的输入、输出端口数量和端口特性。

1. 实体表达
ENTITY e_name IS PORT ( p_name : port_m ...
. . .

data_type; data_type );

p_namei : port_mi END ENTITY e_name;

例1:2选一数据选择器实体描述
ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a; 例2:D触发器的实体描述 ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ENTITY DFF1;

2. PORT(端口)说明
PORT ( { 端口名 : 端口模式 。。。。。 端口名 : 端口模式 数据类型 ; 数据类型 }

) ;
? 端口名为实体的每一个对外通道的名字,符合标志符规范 ? 端口模式是指这些通道上的数据流动方式。

? 数据类型是指端口上流动的数据的表达格式或取值类
型,VHDL要求只有相同数据类型的端口信号和操作数 才能相互作用。

PORT端口举例
PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT );

PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC );

3. 端口模式
OUT IN INOUT

BUFFER

out (输出):只能被赋值,用于不能反馈的输出;

in (输入):只能读,用于时钟输入、控制输入单向数据输入;
inout(输入输出) :既可读又可被赋值,被读的值是端口输入值 而不是被赋值,作为双向端口。 buffer(缓冲):类似于输出,但可以读,读的值是被赋值,用 做内部反馈用,不能作为双向端口使用。

4. 数据类型:即端口采用的数据类型,它决定了端口可选的数 值范围 1、Boolean 可取值“True”或“False”; 2、Bit 可取值“0”或“1”; 3、Bit_Vector 由STD库中的标准包 STANDARD支持;

4、Integer 可用作循环的指针或常数,一定要指明范围
5、Std_logic 和Std_logic_Vector 由IEEE_Std_Logic_1164

程序包支持,该程序包需要显示声明

5.3.2 结构体声明与描述
1.结构体的一般表达如下:
ARCHITECTURE 结构体名称 [说明语句] BEGIN (功能描述语句) END ARCHITECTURE 结构体名称; OF 实体名称 IS

2.结构体的组成部分
?说明语句。可以不要
?功能描述语句。

2.结构体的一般表达如下:
ARCHITECTURE 结构体名称 [说明语句] BEGIN (功能描述语句) END ARCHITECTURE 结构体名称; OF 实体名称 IS

结构体说明语句:位于 architecture 和 begin 之间,对结构体
内部的使用信号、常数、元件、数据类型和函数进行说明, 包括:使用语句、程序说明、子程序体、类型说明、子类型

说明、常数说明、信号说明、元件说明。

2.结构体的一般表达如下:
ARCHITECTURE 结构体名称 [说明语句] BEGIN (功能描述语句) END ARCHITECTURE 结构体名称; OF 实体名称 IS

功能描述语句:处于 begin 与 end 之间,描述结构体的 行为与连接关系,它是构成结构体的主体。描述实体的逻 辑行为、以各种不同的描述风格表达的功能描述语句,或 针对层次设计中,以元件例化语句为特征的外部元件(设 计实体)端口间的连接。

2.结构体的一般表达如下:
ARCHITECTURE 结构体名称 [说明语句] BEGIN (功能描述语句) END ARCHITECTURE 结构体名称; OF 实体名称 IS

结构体的描述方法:

? 行为描述,即按算法的路径来描述;
? 数据流描述或 RTL 描述,即采用寄存器传输描述; ? 结构化描述,即采用例化元件,在高层次的设计中调用低 层次的实体作为元件的过程。

例1:2选一数据选择器的结构体描述
(1) 2选一数据选择器采用行为描述方式:
ARCHITECTURE one OF mux21a IS BEGIN y <= a WHEN s = '0' ELSE b ; END ARCHITECTURE one ;

功能说明

(2) 2选一数据选择器采用数据流描述方式:
ARCHITECTURE one OF mux21a IS 结构体说明----- SIGNAL d,e : BIT; BEGIN d <= a AND (NOT S) ; 功能说明 e <= b AND s ; y <= d OR e ; END ARCHITECTURE one ;

例2:D触发器的结构体描述
ARCHITECTURE bhv OF DFF1 IS 结构体说明----- SIGNAL Q1 : STD_LOGIC ; BEGIN PROCESS (CLK,Q1) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q1 <= D ; 功能说明 END IF; END PROCESS ; Q <= Q1 ; 2.时钟上升沿的表示方法 END bhv; (1)IF CLK'EVENT AND CLK =‘1’

(2)IF CLK'EVENT AND (CLK =‘1’) AND(CLK‘LAST_VALUE =‘0’) (3)IF rising_edge(CLK)

1.时序电路必须放在进程中;

5.3.3 库
1、库: 经编译后的数据的集合,它存放已经编译的实体、 结构体、包和配置。库说明总是放在设计单元的最前面。

2、库的种类

STD 库
Work 库

IEEE 库
库的
种类

用户 定义

ASIC 库

(1)IEEE库
STD_ LOGIC_ 1164

STD_ LOGIC_ ARITH

IEEE库

STD_ LOGIC_

SIGNED

STD_ LOGIC_ UNSIGNED

(2)STD库
STD库

TEXTIO 包 集合

STANDARD 包集合

(3)ASIC 矢量库 各公司提供的 ASIC 称逻辑门库 (4)WORK 库 为现行作业库,存放设计者的 VHDL 语言程序

(5)用户定义的库
用户为自身设计需要所开发的共用包集合和实体。

3. 库的使用 除 WORK、STD 库外,其他库在使用之前必须要说明。格式: LIBRARY 库名;

USE 库名.程序包名.项目名 ;
USE 库名.程序包名.ALL ; 例如:

LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_1164.STD_ULOGIC ; 4. 库说明的作用范围:

从实体声明开始到其所属构造体、配置为止。

5.3.4 程序包
1、程序包:集合用于封装属于多个设计单元分享的公共信息 2、程序包的组成: 数据 类型 元件 说明

常量

程序包

子程序

3、程序包的结构 (1)程序包声明

PACKAGE

程序包名

IS

程序包首说明部分 END 程序包名;

(2)程序包主体 PACKAGE BODY 程序包名 IS

程序包体说明部分
END 程序包名;

4、程序包的使用
use use use work.[包集合名].all; ieee.std_logic_arith.all; ieee.std_logic_unsigned.all;

5、常用的预定义的程序包

STD_LOGIC_1164

STD_LOGIC_ARITH

IEEE库 常用程序包

STD_LOGIC_SIGNED

STD_LOGIC_UNSIGNED

STANDARD

STD库
TEXTIO

5.4 VHDL文字规则
1. 数字表达
(1)整数:整数都是十进制的数,如:

5, 678,

0,

156E2(=15600), 45_234_287 (=45234287)

(2)实数:实数也都是十进制的数,但必须带有小数点,如:

5.0,670_551.453 (=670551.453),.178, 44.99E-2(=0.4499)

(3)物理量文字(VHDL综合器不接受此类文字)。如:

60s (60秒), 100m (100米), k (千欧姆), 177A (177安培)

5.4 VHDL文字规则
(4)以数制基数表示的文字:用这种方式表示的数由五个部分组成。 SIGNAL d1,d2,d3,d4,d5, : INTEGER RANGE 0 TO 255;

d1 <= 10#170# ;
d2 <= 16#FE# ;

-- (十进制表示,等于 170)
-- (十六进制表示,等于 254) -- (二进制表示,等于 254)

d3 <= 2#1111_1110#;

d4 <= 8#376#
d5 <= 16#E#E1

-- (八进制表示,等于 254)
-- (十六进制表示,等于2#1110000#,等于224)

5.4 VHDL文字规则
2. 字符串表达
(5)字符:用单引号括起,不具有固定值 。大、小写含义不同 ‘a’ ’ *’ ‘abc’

(6)字符串:用双引号括起,不具有固定值 。大、小写含义不同 "ERROR" , "Both S and Q equal to 1" , "X" ,"BB$CC“

(7)位串:由预定义数据类型位构成的一维数组。 B:二进制基数符号,表示二进制位0或1,在字符串中的

每位表示一个Bit。
O: 八进制基数符号,代表一个八进制数,即一个3位的二进制数。 X:十六进制基数符号(0~F),代表一个十六进制数,即 一个4位的二进制数。

5.4 VHDL文字规则
(7)位串:由预定义数据类型位构成的一维数组。 B:二进制基数符号,表示二进制位0或1,在字符串中的 每位表示一个Bit。 O: 八进制基数符号,代表一个八进制数,即一个3位的二进制数。 X:十六进制基数符号(0~F),代表一个十六进制数,即 一个4位的二进制数。

data1 <= B"1_1101_1110“
data2 <= O"15" data3 <= X“AD0”

二进制数数组,位矢数组长度是9
八进制数数组,位矢数组长度是6 十六进制数数组,位矢数组长度是12

data5 <= "101_010_101_010"
data6 <= "0AD0"

表达错误,缺B。
表达错误,缺X。

3. 标识符
? 包括26个大小写英文字母,数字0~9 以及下划线“_”。 ? 任何标识符必须以英文字母开头 ? 不能连续使用下划线,不能以下划线“_”结尾

? 标识符中间不能出现空格
? 标识符中的英语字母不分大小写。 ? 标识符不能使用VHDL语言的关键字和元件名 ? 允许包含图形符号(如回车符、换行符等) 例如: 合法标识符:decoder38, fft_1,th_1_2, 非法标识符:8couter, data__bus, sina#1,entity ,and, dec_等

5.5 VHDL基本数据类型
VHDL是一种数据类型概念很强的语言。任何一个对象声明时 必须指明数据类型,并且只能携带和返回指定的数据类型。

1.VHDL基本数据类型

标量数据类型

复合数据类型 VHDL基本数据类型
存取数据类型

文件数据类型

2. 常用的VHDL预定义数据类型
常用的VHDL预定义数据类型存放在STD库的STANDARD

程序包中在程序开始时不需声明其程序包。

数据类型
1.位(BIT)
2. 位矢量 (BIT_VECTOR)

? 说明
? 表示:‘0’或‘1’.使用时加单引号

? 用双引号括起来的一组位数据,例:"00110",X"00BB"

? 必须注明宽度

3.字符(CHARACTER)

?用单引号括起,不具有固定值 。大、小写含义不同 ?a到z中的字母、0到9中的数字、空白及特殊字符

4. 字符串(STRING)

? 用双引号括起,如"a b c d"

5.布尔(BOOLEAN)

? 逻辑false 或 true的枚举型

6. 整数(INTEGER)

? 32位整数,范围: -2147483647-2147483647 ? 包括十进制、二进制、十六进制等

7. 实数(REAL)

? 浮点数,范围-1.0E38~+1.0E38

8. 时间(TIME)

? 包含整数与单位,如:55 sec, 2 min ? 表征系统状态,共四种(Note,Warning ? Error,Failure),编与仿真时用。

9. 错误等级

3. IEEE预定义标准逻辑位与矢量
在IEEE库中程序包STD_LOGIC_1164中定义了另外一 类常用的数据类型STD_LOGIC和STD_LOGIC_vector。使用 这些类型时,要在程序开始时先声明其程序包。

(1)标准逻辑位STD_LOGIC数据类型 TYPE STD_LOGIC IS

('U','X','0','1','Z','W','L','H','-');

(2)标准逻辑矢量(STD_LOGIC_VECTOR)数据类型 ? STD_LOGIC_VECTOR类型是一维数组。 ? STD_LOGIC_VECTOR类型在使用时应指明位矢宽度。 ? STD_LOGIC_VECTOR类型数组的每一位由STD_LOGIC 数据类型组成。

例如 din: in STD_LOGIC_VECTOR(7 downto 0);
dout: out STD_LOGIC_VECTOR(0 to 3);

4. 其他预定义标准数据类型
在IEEE库中程序包STD_LOGIC_ARITH中定义了另外一类常用的数 据类型无符号型(UNSIGNED)、有符号型(SIGNED)、小整型

(SMALL_INT)。如果将信号或变量定义为这几个数据类型,就可以
使用本程序包中定义的运算符。使用这些类型时,要在程序开始时先 声明其程序包。

(2)有符号型(SIGNED)数据类型 (1)无符号型(UNSIGNED)数据类型 Variable a: signed (0(0 to 10); Variable a: unsigned to 10);
Signal b: signed (5(5 to 0); unsigned to 0); 说明变量a有11位数值,最高位是a(0),最低位为a(10) 说明变量a有11位数值,最高位a(0)是符号位 说明变量b有6位数值,最高位是b(5),最低位为b(0)

5. 数据类型转换

注意事项:
(1)当定义了端口或数据对象的数据类型后,只能携带 和返回指定类型的数据. (2)如果不同类型的数据需要进行运算或操作,必须在 类型转换后才能.

5.6 VHDL操作符
表一 VHDL操作符
类 型 + - & * / MOD REM SLL 算术操作符 SRL SLA SRA ROL ROR ** ABS 操作符 加 减 并置 乘 除 取模 取余 逻辑左移 逻辑右移 算术左移 算术右移 逻辑循环左移 逻辑循环右移 乘方 取绝对值 功 能 整数 整数 一维数组 整数和实数(包括浮点数) 整数和实数(包括浮点数) 整数 整数 BIT 或布尔型一维数组 BIT 或布尔型一维数组 BIT 或布尔型一维数组 BIT 或布尔型一维数组 BIT 或布尔型一维数组 BIT 或布尔型一维数组 整数 整数 操作数数据类型

表一 VHDL操作符
类 型
= /= < 关系操作符 > <= >= 逻辑操作符 AND OR NAND NOR XOR XNOR NOT 符号操作符 + -

操作符


等于 不等于 小于 大于 小于等于 大于等于 与 或 与非 或非 异或 异或非 非 正 负


任何数据类型 任何数据类型

操作数数据类型

枚举与整数类型,及对应的一维数组 枚举与整数类型,及对应的一维数组 枚举与整数类型,及对应的一维数组 枚举与整数类型,及对应的一维数组 BIT,BOOLEAN,STD_LOGIC BIT,BOOLEAN,STD_LOGIC BIT,BOOLEAN,STD_LOGIC BIT,BOOLEAN,STD_LOGIC BIT,BOOLEAN,STD_LOGIC BIT,BOOLEAN,STD_LOGIC BIT,BOOLEAN,STD_LOGIC 整数 整数

表2 VHDL操作符优先级

(1)逻辑操作符
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 l,m,n,o,p : BOOLEAN ; ... a<=b AND c; d<=e OR f OR g ; l<=(m XOR n)AND(o XOR p); --b、c 相与后向a赋值 -- 两个操作符OR相同,不需括号 -- 操作符不同,必须加括号

h<=i AND j AND k ;
h<=i AND j OR k ; a<=b AND e ;

-- 两个操作符都是AND,不必加括号
-- 两个操作符不同,未加括号,表达错误 -- 操作数b 与 e的位矢长度不一致,表达错误

h<=i OR l ;
.

-- i 的数据类型是位STD_LOGIC,而l的数据类型是
-- 布尔量BOOLEAN,因而不能相互作用,表达错误。

(2)关系操作符
【例1】 ENTITY relational_ops_1 IS PORT ( a,b : IN BIT_VECTOR (0 TO 3) ; m : OUT BOOLEAN) ; END relational_ops_1 ; ARCHITECTURE example OF relational_ops_1 IS BEGIN m <= (a = b) ; END example ; 【例2】 ENTITY relational_ops_2 IS PORT (a,b : IN INTEGER RANGE 0 TO 3 ; m : OUT BOOLEAN) ; END relational_ops_2 ; ARCHITECTURE example OF relational_ops_2 IS BEGIN m <= (a >= b) ; END example ;

关系运算操作符:
“ = ”(等于)、 “/=”(不等于)、

“ >”(大于)、
“< ”(小于)、 “>=”(大于等于) “<=”(小于等于)

2选1数据选择器的VHDL语言(1)
LIBRARY IEEE; ------------------------------------------USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;

库 程序包

ENTITY mux21a IS PORT( a, b : IN s : IN y : OUT END ENTITY mux21a

BIT ; BIT; BIT ) ; ;

实体

ARCHITECTURE one OF mux21a IS BEGIN y <= a WHEN s = '0' ELSE b ; END ARCHITECTURE one ;

结构体

例2 4选1的数据选择器 省略了库声明和程序包说明 ENTITY mux41a IS PORT( a, b,c,d : IN BIT ; s : IN BIT_vector(1 downto 0); y : OUT BIT ) ; END ENTITY mux41a ; ARCHITECTURE one BEGIN y <= a WHEN b WHEN c WHEN d; END ARCHITECTURE OF mux41a IS s = “00” s = “01” s = “10” one ; ELSE ELSE ELSE

作业:请采用WHEN_ELSE语句实现8选1的数据选择器

例3 3人投票表决
实例来演示:一个三人表决器的逻辑设计。三人表决,以少数服

从多数为原则,多数人同意则议案通过,否则议案被否决。这里,我
们使用三个按键代表三个参与表决的人,置“0”表示该人同意议案, 置“1”表示该人同意议案;两个指示灯用来表示表决结果,LED1 点 亮表示议案通过,LED2 点亮表示议案被否决。真值表如下所示: in1 0 0 0 0 1 1 1 1 in2 0 0 1 1 0 0 1 1 in3 LED1 LED2 0 0 1 1 0 1 根据上面的真值表,做卡诺图简化, 0 0 1 可以得出: 1 1 0 LED1=in1*in2+in1*in3+in2*in3 , 0 0 1 LED2=~LED1 1 1 0 0 1 0 1 1 0

例3 3人投票表决
LIBRARY IEEE; ------------------------------------------------ 库 USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; 程序包 USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY voter IS
PORT ( in1, in2, in3: IN BIT; led1,led2 : OUT BIT );

实体

END ENTITY voter;
端口模式错误,应改为input,buffer

ARCHITECTURE one OF voter IS BEGIN

led1<=(in1 and in2) or (in1 and in3) or (in2 and in3) ; led2<=not(led1);

结构体

不同的逻辑操作符应加上括号 END ARCHITECTURE one ;

注意此程序是,错误的

例4 4位计数器(1)

取整数数据类型,为什么? 端口信号模式取 BUFFER,为什么?

提示:(1)使用了‘+’, (2)并采用了放在输出量右边

例4 4位计数器(2)

运算符加载

注意,信号端口模式和 数据类型的改变!

注意,引进内部信号矢量!

例5 7段数码显示译码器设计
数字系统中的数据处理和运算都是采用2进制, 所以输出结果表达都是16进制的,为了使输出的16进 制数据显示的更加直观,使人更容易阅读和理解,需 要采用译码器将抽象的16进制数据转换为易于阅读的

十进制数据,然后通过数码管显示。因此,本例子介
绍7段数码显示译码器设计. 7段数码是纯组合电路,它是将16进制数表示的 BCD码转换为10进制数,通过数码管显示为0,1,2, 3,4,5,6,7,8,9

例5 7段数码显示译码器设计

共阴数码管及其电路

LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DECL7S IS PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO END ; ARCHITECTURE one OF DECL7S IS BEGIN PROCESS( A ) BEGIN CASE A IS WHEN "0000" => LED7S <= "0111111" ; WHEN "0001" => LED7S <= "0000110" ; WHEN "0010" => LED7S <= "1011011" ; WHEN "0011" => LED7S <= "1001111" ; WHEN "0100" => LED7S <= "1100110" ; WHEN "0101" => LED7S <= "1101101" ; WHEN "0110" => LED7S <= "1111101" ; WHEN "0111" => LED7S <= "0000111" ; WHEN "1000" => LED7S <= "1111111" ; WHEN "1001" => LED7S <= "1101111" ; WHEN OTHERS => NULL ; END CASE ; END PROCESS ; END ;

0); 0) ) ;

----0 ----1 ----2 ----3 ----4 ----5 ----6 ----7 ----8 ----9

8选一实验说明
LIBRARY IEEE; ------正确程序 USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux81a IS PORT( a, b,c,d,e,f,g,h : IN BIT ; s : IN BIT_vector(2 downto 0); y : OUT BIT ) ; END ENTITY mux81a ;

ARCHITECTURE one OF mux81a IS BEGIN y <= a WHEN s = "000" ELSE b WHEN s = "001" ELSE c WHEN s = "010" ELSE d WHEN s = "011" ELSE e WHEN s = "100" ELSE f WHEN s = "101" ELSE g WHEN s = "110" ELSE h ; END ARCHITECTURE one ;

实验错误说明及改正(1)
实体说明部分省略
ARCHITECTURE one OF mux81a IS BEGIN process(a,b,c,d,e,f,g,h,s) begin if s = "000" then y<=a; ELSIF s = "001" then y<=b; ELSIF s = "010" then y<=c; ELSIF s = "011" then y<=d; ELSIF s = "100" then y<=e; ELSIF s = "101" then y<=f; ELSIF s = "110" then y<=g; ELSE y<=h; End if; end process; END ARCHITECTURE one ;

错误

实验错误说明及改正(2)
ENTITY mux81a IS PORT( a, b,c,d,e,f,g,h : IN BIT ; s2,s1,s0 : IN BIT ; y : OUT BIT ) ; END ENTITY mux81a ; ARCHITECTURE one OF mux81a IS signal s : bit_vector(2 downto 0); signal s : std_logic_vector(2 downto 0); s<=s2&s1&s0; BEGIN 错误1:说明部分不能进行 s<=s2&s1&s0; 语句操作。 y <= a WHEN s = "000" ELSE b WHEN s = "001" ELSE 错误2:操作符左右两边数 c WHEN s = "010" ELSE 据类型要一致。 d WHEN s = "011" ELSE e WHEN s = "100" ELSE f WHEN s = "101" ELSE g WHEN s = "110" ELSE h ; END ARCHITECTURE one ;

5.7 VHDL数据对象
VHDL的数据对象包括信号(signal)、变量(variable)、 常量(constant)三类。

1.常量 (constant):命名数据类型的一种特殊值。
2.变量(variable):用来在顺序执行的语句间传递中间值 3.信号(signal) : 用于在实体(或进程)之间传送信息;

5.7 VHDL数据对象
1. 常量 (constant):命名数据类型的一种特殊值。 (1)信号声明的语法格式: constant 常数名:数据类型[:=初始值];

例: constant
constant

aa : real;
bb: bit;

(2)常量的赋值:
aa:= 5.0 ; bb:=‘1’;

5.7 VHDL数据对象
(3)注意事项 ? 常数赋值后不能变; ? 常数赋值采用:= ? 赋的值要与数据类型一致

? 在结构体、程序包、实体中说明, 能在进程中说明。
? 在程序包中说明的信号为全局量;在实体说明部分的 信号可以被该实体中任何构造体引用,在构造体中的 信号能被其构造体内部任何语句采用,包括被进程语 句采用;在进程说明中说明的信号只能在进程中使用。

5.7 VHDL数据对象
2.变量(variable):用来在顺序执行的VHDL语句间传递中间值 (1)变量声明的语法格式 Variable 变量名:数据类型 [约束条件] [:=表达式]; 例: Variable x,y:bit; Variable a,b: integer range 0 to 255:=10; (2)变量的赋值 x:=‘1’;

Y:=‘0’;
a:=10; b:=2+a;

5.7 VHDL数据对象
(3)注意事项

1.只能在进程、函数或过程中使用

2.变量赋值采用:=

3.用做局部的数据存储,为局部量

4.赋值立即生效

5.7 VHDL数据对象
3.信号(signal ):用于在实体(或进程)之间传送信息 (1)信号声明的语法格式: signal 信号名:数据类型[约束条件][:=初始值]; 例: signal a : bit ;

signal b : std_logic_vector(7 downto 0);

(2)信号的赋值:
a<=‘0’; b<=“01101111” after 10ns;

(3)注意事项

? 除无方向说明外,与端口概念一致;
? 程序中赋值采用 <=; ? 信号赋值有附加延迟; ? 赋的值要与数据类型一致; ? 在结构体、程序包、实体中说明,不能在进程中说明。

? 在程序包中说明的信号为全局量;在实体说明部分的
信号可以被该实体中任何构造体引用,在构造体中的

信号能被其构造体内部任何语句采用,包括被进程语
句采用;在进程说明中说明的信号只能在进程中使用。

4.变量和信号的区别
? ? ? ?

物理意义不同。 说明位置不同。变量在process中定义,信号在结构体中说明 信号是全局量,变量为局部量。 赋值信号不同。信号赋值用“<=”(如S1<=S2),变量赋值用

“:=”(如temp3:=temp1+temp2)
? ?

进程只对信号敏感,而对变量不敏感。 变量赋值不能加延时,且语句一旦被执行,其值立即被赋予变 量。信号赋值可以加延时,使赋予信号的值在一段时间后带入

?

如: S1<=S2 after 10ns;

——合法的

temp3:=temp1+temp2 after 10ns; ——非法的

5.8 进程语句
进程语句是最常用的并行语句。在一个结构体内,可 以出现多个进程语句,各个进程语句并行执行。进程语句 内部由顺序语句构成。 1 PROCESS 的语法格式 [进程标号:] process[(敏感信号表)] [进程说明部分] begin {顺序处理语句} end process [标号];

2 PROCESS 组成

PROCESS语句结构

敏感信号参数表

顺序描述语句 信 号 赋 值 语 句
变 量 赋 值 语 句 进 程 启 动 语 句

进程说明 顺 序 描 述 语 句 进 程 跳 出 语 句

子 程 序 调 用 语 句

(1)敏感信号参数表
process[(敏感信号表)] [进程说明部分] begin {顺序处理语句} end process [标号]; 敏感信号表内为信号列表,该表内的信号的变化将引起 进程的执行。多数VHDL综合器要求敏感信号表必须列 出本进程中所有输入信号名。

(2)进程说明部分

process[(敏感信号表)]
[进程说明部分] begin {顺序处理语句} end process [标号];

进程说明用来定义在该进程中需要用到的局部量,如变量、 常数等,在此处定义的变量是局部量,只能在该进程中使 用,其他地方不能使用。特别强调在进程说明部分只能定

义局部变量,不能定义信号和共享变量。

(3)顺序处理语句

process[(敏感信号表)] [进程说明部分] begin {顺序处理语句} end process [标号];

顺序描述语句是一段顺序执行的语句,具体描述进程的行为.
信号赋值语句 变量赋值语句 进程跳出语句 进程启动语句

顺序描述语句

子程序调用语句

3. 进程设计要点
? PROCESS为一无限循环语句 ? PROCESS中的顺序语句具有明显的顺序/并行运行双重性 进程内部只能加载顺序语句,但进程本身是并行语句出 现在结构体中,它与其他并行结构或进程之间在结构体 中是并行运行的 ? 进程语句本身是并行语句 ? 一个进程中只允许描述对应于一个时钟信号的同步时序逻辑

? 进程必须由敏感信号的变化来启动 敏感信号表中有多个敏感信号时,其中任一个信号的变 化都会引起进程启动,写敏感信号表时,尽量将在进程 中被读取的信号列全。若无敏感信号表,就必须放一个 WAIT语句在进程内作为进程启动语句 ? 信号是多个进程间的通信线 在结构体中多个进程可以并行运行,多个进程之间的通

信是通过信号来实现。因此,在任一进程的进程说明部
分不允许定义信号

例1 8选1数据选择器的VHDL语言(1)
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux81a IS PORT( a, b,c,d,e,f,g,h : IN BIT ; s : IN BIT_vector(2 downto 0); y : OUT BIT ) ; END ENTITY mux81a ;

ARCHITECTURE one OF mux81a IS BEGIN y <= a WHEN s = "000" ELSE b WHEN s = "001" ELSE c WHEN s = "010" ELSE d WHEN s = "011" ELSE 在结构体中 e WHEN s = "100" ELSE 的并行语句 f WHEN s = "101" ELSE g WHEN s = "110" ELSE h ; END ARCHITECTURE one ;

例1 8选1数据选择器的VHDL语言(2)
实体说明部分省略
ARCHITECTURE one OF mux81a IS BEGIN process(a,b,c,d,e,f,g,h,s) begin if s = "000" then y<=a; ELSIF s = "001" then y<=b; ELSIF s = "010" then y<=c; ELSIF s = "011" then y<=d; 进程中的 ELSIF s = "100" then y<=e; 顺序语句 ELSIF s = "101" then y<=f; ELSIF s = "110" then y<=g; ELSE y<=h; End if; end process; END ARCHITECTURE one ;

例2:D触发器的结构体描述(1)
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 CLK'EVENT AND CLK = '1' 进程 THEN Q1 <= D ; END IF; END PROCESS ; Q <= Q1 ; 可以放在进程内也可以放在进程外部 END bhv;

结构体

例2:D触发器的结构体描述(2)
ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ENTITY DFF1; ARCHITECTURE bhv OF DFF1 IS BEGIN PROCESS (CLK,) VARIABLE Q1 : STD_LOGIC ; BEGIN IF CLK'EVENT AND CLK = '1' 进程 THEN Q1 <= D ; END IF; Q <= Q1 ; END PROCESS ; 只能放在进程内 END bhv;

结构体

例2 D触发器的VHDL语言(3)
LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF3 IS PORT ( CLK,D1 : IN STD_LOGIC ; Q1 : OUT STD_LOGIC); END ; ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS (CLK) VARIABLE A,B : STD_LOGIC ;(此处只能定义变量) BEGIN IF CLK'EVENT AND CLK ='1' THEN A:= D1; B := A; Q1 <= B; END IF; END PROCESS ; END ;


相关文章:
更多相关标签: