VHDL的构造体,architecture
architecture arch_name of
entity_name is
说明部分
declarations and definitions;
begin
语句部分
concurrent statement;
end arch_name;
构造体语法要点每个构造体必须属于一个实体;
每个构造体必须有一个名称:
通常可以根据描述方式起名:
str rtl beh
构造体分为两部分:
is – bigin,说明语句;
bigin – end,并行语句;
构造体的说明语句
type declarations; 类型说明
signal declarations; 信号说明
constant declarations; 常量说明
component declarations; 元件说明
function definitions; 函数说明
procedure definitions; 过程说明构造体的并行语句信号赋值语句 数据流描述 rtl
元件例化语句 结构描述 str
进程语句 行为描述 beh
每条并行语句形成一个电路逻辑单元。
构造体的其他语法要点除了第一句和 begin句外,其余各句均以分号结束;
在每一部分中,各语句处于并列状态,
执行时不分先后次序;
定义语句需要考虑使用的顺序。
VHDL的数据对象
Signal 信号
Constant 常量
Variable 变量每个数据对象必须有特定的名称;
数据对象的命名规则与实体名相同;
VHDL的信号,signal
电路中端口、连接线的体现,具有具体物理含义,在构造体内为全局变量;
信号使用前必须先进行说明:
输入 /输出信号在实体中说明;
通用信号在包集合中进行说明;
模块内部信号在结构体内说明;
信号说明语句基本格式
signal signal_name,signal_type;
信号名 信号类型例,signal temp,std_logic;
signal bus_a,std_logic_vector(7
downto 0);
注意:端口(输入 /输出)信号已在实体中说明,在结构体中就不再说明;
信号的赋值在程序中采用? <=? (赋值语句)进行:
信号名 <= 信号值(表达式);
例,temp<='1'; z<=x and not y;
d<=? 0110?;
赋值号两边的信号原则上必须为相同类型;
信号可在构造体内、过程、进程内赋值;
信号不能在函数内赋值;
VHDL的常量,constant
根据说明所在的位置,可表现为全局或局部常量;
常量必须在说明时赋值,所赋值与说明的类型必须一致;常量一旦赋值就不能在程序中通过语句更改;
常量不一定有硬件对应;常见的硬件对应是固定的接地线或正电源。
常量说明语句基本格式
constant 常量名:常量类型,= 常量值例:
constant vcc,real:= 5.0;
constant grn,std_logic:= '0';
constant tpd,time:= 5ns;
constant
fbus:std_logic_vector:=?0110? ;
VHDL的变量,variable
表达各类运算中间量,通常对应于计算机中的一个存储位置,没有具体硬件对应,主要用于电路的行为描述;
变量在子程序(函数、过程、进程)中进行说明,只能为局部变量;
变量只在顺序语句中使用;
变量说明语句基本格式
variable 变量名:变量类型例:
variable temp,std_logic;
variable bus_a,std_logic_vector(7
downto 0);
变量的赋值采用?,=? 符号进行:
变量赋值语句变量名,= 变量值(表达式);
例,va,= a ;
te,= d+c;
wb,=? 1001?;
赋值号两边变量必须为相同类型;
变量的赋值变量在定义时需要赋初始值:
例:
variable c:integer range 1 to 10:=10;
variable d:std_logic_vector(7 downto
0):(others=>‘0’);
当没有指定初始值时,默认为其数据类型中的第一个值(最左边的值);
变量的赋值注意:
变量只在函数、过程、进程等子结构中使用,一旦子结构执行结束,变量值随即消失;
因此,在一个结构体中,同一个变量名可以出现在不同的子程序中,表达不同的数据对象。
VHDL的数据类型每一个数据对象都必须规定其类型;
类型规定了数据的数据形式、取值范围、
排列顺序、可进行的运算;
VHDL规定了若干预定义类型,用户可以利用预定义类型来设置自定义类型;
常用预定义类型预定义类型在相关的包集合中定义
std.standard:
bit(位),boolean(布尔)
integer(整数),real(实数)
ieee.std_logic_1164:
std_logic(标准逻辑量 );
ieee.std_logic_arith:
signed,unsigned;
常用预定义类型
bit,bit_vector,2值逻辑数据范围( 0,1),用于逻辑运算说明方式:
signal x,bit; --x为 1位逻辑信号;
signal y,bit_vector( 3 downto 0);
--y为 4位逻辑信号,最高位为 y( 3),
在最左边;
常用预定义类型
bit,bit_vector:常数表达形式一位逻辑量采用单引号,'1' '0'
多位逻辑量采用双引号," 1001"
可以采用其他进制的缩写形式:
b" 1001" o" 7777" x"ffff"
常用预定义类型
boolean:( falth,true)
逻辑量,用于关系判断;
可进行逻辑运算 ;
不能表达为多位数组;
常用预定义类型
integer:( -231-1 -- +231-1)
算术量,用于算术运算;
其子集合有 natural和 positive;
考虑到电路综合效率,对于整数类型,可以在说明时对数据范围进行限制;
常用预定义类型例:整数类型的范围
entity t is
port(a,b,in integer range 0 to 15;
f,out bit);
end t;
如果不加范围限制,a,b都是 32位,加限制后,变为 4位;
常用预定义类型整数类型的一些常数表达形式十进制数 120000=12E4=120_000 ;
二进制数 2#1111_1111#=2:1111_1111,
16进制数 16#FFFF#=16:FFFF:
常用预定义类型
character,string,ISO 8位字符集(前 128
个为 ASCⅡ 编码符号),综合性较差,主要用于仿真;
在字符类型中,大写字母和小写字母表达不同含义,需要加以区分;
例如,`A`和 `a`分别表达不同的字符。
常用预定义类型可通过连接运算将字符组合为字符串,
或将短字符串连接成长字符串,&
字符串的例子:
" string" & " literal"
"""Hello,"" I said!"
%Sale,50%% off!!!%;
常用预定义类型
real:( -1038 -- +1038)算术量,只能用于抽象描述及仿真,不可综合;
例:十进制数 120000.0=1.2E5=12.0E4
time:物理量,由整数和相关单位字符构成,
不可综合;
例,50 ns 3 sec 25 hr
可进行算术运算常用预定义类型
std_logic,std_logic_vector,8值逻辑数据范围( X,0,1,Z,W,L,H,-)
std_ulogic,std_ulogic_vector,9值逻辑数据范围( U,X,0,1,Z,W,L,H,-)
用于逻辑运算;
常用预定义类型
std_logic,std_logic_vector,8值逻辑数据范围( X,0,1,Z,W,L,H,-)
用于逻辑运算;
X:强不定; 0:强 0; 1:强 1; Z:高阻
W:弱不定; L:弱 0; H:弱 1; -:不出现;
只有 0,1,Z可以综合,其他只用于仿真;
常用预定义类型
std_logic,std_logic_vector:特点此类信号能够更清楚地表现电路中的实际电平情况;
设置有解决总线冲突问题的专用函数;
当多个电平连接到同一接点上的时候,
可以根据该判决函数决定连接点状态。
常用预定义类型
std_logic,std_logic_vector:判决函数表常用预定义类型
std_ulogic,std_ulogic_vector,9值逻辑数据范围( U,X,0,1,Z,W,L,H,-)
增加了一个初始不定值,U;
8值逻辑是它的子集合;
缺少总线冲突函数,只能通过设计消除总线冲突。
常用预定义类型
signed,unsigned:符号数和无符号数表达形式与 std_logic_vector相同;
通过重载函数( overload)支持算术运算;