nullVHDL语言要素VHDL语言要素标识符(Identifiers)
数据对象
数据类型
VHDL属性
运算符 要 点 介绍 要 点 介绍有效标识符
变量信号的区别
三种数据类型
三类属性
四种操作符
标识符标识符 标识符(Identifiers)由英文字母“a”到“z”、“A”到“Z”、数字“0”到“9”以及下划线“_”组成
使用时注意:
1、VHDL不区分大小写
2、标识符一定要以字母开头
3、下划线前后必须都有字母或者数字
4、保留字(关键字)不能做标识符标识符标识符有效的标识符
A_h_1 show_new_state COUNTER_A decode3_8 counter
非法的标识符
A%h_1 show-new-state COUNTER_
T_ _1 3_8decoder IS DOWNTO数据对象数据对象 凡是可以被赋予一个值的对象称为数据对象,
数据对象用于传递信号。
常量(CONSTANT)
变量(VARIABLE)
信号(SIGNAL)
常 量常 量 常量是一个在仿真/综合过程中固定不变的值,可通过标识符来引用。与C语言中的常量的意义完全相同。
使用常量的主要目的是增加
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
文件的可读性和可维护性。
常量是全局量,在结构体、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用。
常 量常 量常数的描述
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
:
CONSTANT 常数名:数据类型:=
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式;
如: Constant D1: Integer:=3;
Constant D2: Std_Logic_Vector(D1 Down to 0):=”0000”;注意:常数数据对象定义的同时进行赋值。
赋值符号为 “:=” 变 量变 量 变量只能在进程、函数和过程中使用,用于声明局部值,一旦赋值立即生效。
变量的描述格式:
VARIABLE 变量名:数据类型 [约束条件表达式] [:=初始值]
例:
VARIABLE x: INTEGER :=0;
VARIABLE count: INTEGER RANGE 0 TO 255:=10; 变 量变 量variable count: std_logic_vector (7 downto 0);
variable count: std_logic_vector(15 downto 0):="0000000000001011";
变量赋值语句的语法格式:
目标变量名:=表达式(设定值)
a:=b+c;
a:=(NOT b)AND (NOT C);信 号信 号 信号是全局量,在实体说明、结构体描述和程序包说明中使用。SIGNAL用于声明内部信号,信号除了没有方向的概念以外几乎和端口概念一致。
作用:在元件之间起互联,代表电路内部各元件之间的连接线,可以赋值给外部信号。信 号信 号信号的描述格式:
SIGNAL 信号名:数据类型 [:=初始值]
例:
SIGNAL sys_clk: BIT:=’0’;
SIGNAL ground: BIT:=’0’ ;
signal aa:std_logic_vector(7 downto 0);
signal aa:std_logic_vector(3 downto 0):=“1010”;信 号信 号信号赋值语句语法格式:
目标信号名<=表达式;
q<=count;
irq<='0';
aa<=dx1;
bb<=dx2;
s1<=s2 AFTER 10ns
indata<=bb(7 downto 0)&aa(7 downto 0);赋初值注意赋初值注意 建议在结构体中用赋值语句完成对信号赋初值的任务,因为综合器往往会忽略信号声明时所赋初值。nullnull执行结果为: x<=c xor b, y<=c xor b null执行结果为: x<=c xor a, y<=c xor b null练习:1.定义信号 A1,A2,A3,A4,A5,A6,A7,A8其中每一位信号均为标准逻辑型2. 定义信号B,其数据类型为标准逻辑型。3.定义信号C,数据类型为整数型。4. 给A、B赋值,其中A的值为11001101;B的
值为0。nullLibrary IEEEUse ieee.std_logic_1164.allSignal A: std_logic_vector(1 to 8)Signal B: std_logicSignal C: integerLibrary StdUse std.standard.allA<=“11001101”B<=‘0’信号与变量区别信号与变量区别信号赋值可以有延迟时间,变量赋值无时间延迟
信号除当前值外还有许多相关值,如历史信息等,变量只有当前值
进程对信号敏感,对变量不敏感
信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见
信号可以看作硬件的一根连线,但变量无此对应关系
赋值的形式不同;声明的位置不同数据类型数据类型标准数据类型
用户自定义的数据类型
IEEE预定义标准逻辑与矢量标准数据类型标准数据类型1、整数(INTEGER)
范围:-2147483547---2147483646
2、实数(REAL)
范围:-1.0E38---1.0E38 (综合器不支持)
书写时一定要有小数。
3、位(BIT)
在数字系统中,信号经常用位的值表示,位值用带单引号的‘1’和‘0’来表示标准数据类型标准数据类型4、位矢量(BIT_VECTOR)
位矢量是用双引号括起来的一组位数据
“010101”
5、布尔量(BOOLEAN)
只有“真”和“假”两个状态,只能进行关系运算
6、字符(CHARACTER)
字符量通常用单引号括起来,对大小写敏感
明确说明1是字符时: CHARACTER’(‘1’) 标准数据类型标准数据类型7、字符串(STRING)
字符串是双引号括起来的由字母、数字或@、%、$组成的一串字符。区分大小写
“laksdklakld” “1010101010”
8、时间(TIME)
时间的单位:fs,ps,ns,ms,sec,min,hr
例: 10 ns
整数数值和单位之间应有空格IEEE定义的逻辑位与矢量IEEE定义的逻辑位与矢量 在IEEE的程序包std_logic_1164中定义了两个非常重要的数据类型:
1 、std_logic (标准逻辑型)
取值:0,1,Z,X,W,L,H Z:高阻 X:不定 W:弱信号不定
L:弱信号0 H:弱信号1
2、Std_logic_vector(标准逻辑数组类型)注 意注 意 1、在使用“std_logic”和“std_logic_vector”时,在程序中必须声明库及程序包说明语句,即LIBRARY ieee和std_logic_1164.ALL这两句在程序中必不可少。
2、 std_logic有多个取值,与BIT不同,在编程时应特别注意,需要考虑全所有情况。nullnull用户自定义的数据类型用户自定义的数据类型1、枚举类型
格式:TYPE 数据类型名 IS(元素、元素、…);
TYPE STD_LOGIC IS
(‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-‘);
TYPE week IS (Sun,Mon,Tue,wed,Thu,Fri,Sat);
TYPE color IS (red,green,yellow,blue) 枚举类型的声明枚举类型的声明TYPE color IS (red,green,yellow,blue);
VARIABLE A:COLOR;
SIGNAL B:COLOR;
A:=RED;
B<=YELLOW;
TYPE lever IS (‘0’,’1’,’z’);
SIGNAL V:lever;
V<=‘1’;null用户自定义的数据类型用户自定义的数据类型2、整数(INTEGER)
格式:TYPE 数据类型名 IS 数据类型定义 约束范围
例 TYPE digit IS INTEGER RANGE 0 TO 9
VARIABLE A:DIGIT;
A:=5;
A:=28;用户自定义的数据类型用户自定义的数据类型3、实数(REAL)
格式:TYPE 数据类型名 IS 数据类型定义 约束范围
TYPE current IS REAL RANGE -1E4 TO 1E4
VARIABLE A:CURRENT;
A:=1E3;
A:=1E10;用户自定义的数据类型用户自定义的数据类型4、数组(ARRAY)
格式:TYPE 数据类型名 IS ARRAY 范围 OF 原数据类型名;
例:TYPE word IS ARRAY (1 TO 8) OF STD_LOGIC;
TYPE word IS ARRAY (INTEGER 1 TO 8) OF STD_LOGIC;
数组常在总线、ROM和RAM中使用。 多维数组需要用两个以上范围来描述,而且多维数组不能生成逻辑电路,只能生成仿真波形及硬件的抽象模型。 多维数组需要用两个以上范围来描述,而且多维数组不能生成逻辑电路,只能生成仿真波形及硬件的抽象模型。TYPE memarray IS ARRAY (0 TO 5, 7 DOWNTO 0) OF STD_LOGIC;
CONSTANT romdata: memarray:=
((‘0’,‘0’, ‘0’,‘0’, ‘0’,‘0’, ‘0’,‘0’),
(‘0’,‘1’, ‘1’,‘1’, ‘0’,‘0’, ‘0’,‘1’),
(‘0’,‘0’, ‘0’,‘0’, ‘0’,‘1’, ‘0’,‘1’),
(‘1’,‘1’, ‘0’,‘1’, ‘0’,‘0’, ‘1’,‘0’),
(‘1’,‘1’, ‘0’,‘1’, ‘1’,‘1’, ‘1’,‘0’),
(‘1’,‘1’, ‘1’,‘1’, ‘1’,‘1’, ‘1’,‘1’));
SINGAL data_bit: STD_LOGIC;
……
data_bit<=romdata(3,7);
在代入初值时,各范围最左边所说明的值为数组的初始位脚标。在上例中(0,7)是起始位。用户自定义的数据类型用户自定义的数据类型5、记录(RECODE) 类型
将不同的数据类型放在一块,就是记录类型数据
格式:TYPE 记录类型名 IS RECORD
元素名:数据类型名;
元素名:数据类型名;
:
:
END RECORD[记录类型名]; 记录(RECODE) 类型记录(RECODE) 类型例:TYPE bank IS RECORD
addr0: STD_LOGIC_VECTOR(7 DOWNTO 0);
addr1: STD_LOGIC_VECTOR(7 DOWNTO 0);
r0: INTEGER;
END RECORD; 记录(RECODE) 类型记录(RECODE) 类型例:CONSTANT LEN:integer:=100;
TYPE array logic IS ARRAY (99 downto 0)OF STD_LOGIC_VECTOR(7 DOWNTO 0)
TYPE table IS RECORD
a: array logic;
b: STD_LOGIC_VECTOR(7 DOWNTO 0);
c: integer RANGE 0 to len ;
END RECORD; 数据类型的转换数据类型的转换数据类型转换函数由VHDL语言的包提供
例如:STD_LOGIC_1164,
STD_LOGIC_ARITH
STD_LOGIC_UNSIGNED等等 nullnullnull将位矢量转换为位逻辑矢量(不再有分隔号)VHDL属性VHDL属性 VHDL没有一般程序语言中的那些运算类标准函数,取而代之的是多种能反映和影响硬件行为的属性。属性在描述时序电路的VHDL设计文件中几乎处处可见,如检测上升沿、下降沿,知道前一次发生的事件。VHDL属性VHDL属性 属性指的是关于实体、结构体、类型及信号的一些特征。有的属性对综合(设计)非常有用。
VHDL的属性可分为数值类属性、函数类属性、范围类属性、信号类属性、类型类属性。其引用的一般形式为:对象’属性。数值类属性数值类属性 数值类属性用于返回数组、块或一般数据的有关值,如边界、数组长度等信息。对一般的数据有4种数值类属性:对象类型的左边界、右边界、上边界、下边界,对应的关键字是:LEFT、RIGHT、HIGH、LOW。数组再加一个长度属性LENGTH。数值类属性数值类属性sdown:IN std_logic_vector(8 DOWNTO 0);
sup:IN std_logic_vector(0 to 8);
这两个信号的各属性值如下:
sdown’left=8; sdown’right=0; sdown’low=0; sdown’high=8; sdown’length=9;
sup’left=0; sup’right=8; sup’low=0; sup’high=8; sup’length=9;
数值类属性数值类属性TYPE bit32 IS ARRAY (63 DOWNTO 32)OF BIT
VARIABLE:left_range,right_range,up_range,low_range,len:INTEGER;
BEGIN
left_range:=bit32’LEFT; --return 63
right_range:=bit32’RIGHT; --return 32
up_range:=bit32’HIGH; --return 63
low_range:=bit32’LOW; --return 32
len:=bit32’LENGTH; --return 32函数类属性函数类属性 信号属性函数属于函数类属性,用来返回有关信号行为功能的信息。共有5种信号属性函数,分别是: ’EVENT(事件) ; ’ ACTIVE(活跃);
’ LAST_EVENT (最近一次事件到现在经过多少时间);’ LAST_ACTIVE (最近一次活跃到现在经过多少时间); ’ LAST_VALUE(信号变化前的取值是什么)EVENTEVENT EVENT:它的值为布尔型,取值为TRUE或FALSE;
如果刚好有事件发生在该属性所附着的信号上(即信号有变化),取值为TRUE。
利用此属性可决定时钟边沿是否有效,即时钟是否发生。EVENTEVENTSIGNAL clk: IN std_logic;
clk ’EVENT AND clk=‘1’
clk=‘1’ AND clk ’EVENT
clk ’EVENT AND clk=‘0’
clk=‘0’ AND clk ’EVENT
rising_edge(clk) falling_edge(clk)EVENT 和ACTIVEEVENT 和ACTIVE EVENT
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
信号值发生变化;1到0、0到1
ACTIVE 信号值的任何变化,1到1,1 到0,0到1,0到0;
所有的事件都是活跃,但并非所有的活跃都是事件范围类属性范围类属性 ’RANGE属性,其生成一个限制性数据对象的范围。
例 SIGNAL data_bus:std_logic_vector(15 DOWNTO 0);
data_bus ’RANGE=15 downto 0
运算符运算符 VHDL与其他的高级语言十分相似,具有丰富的运算操作符以满足不同描述功能的需要。在VHDL中共有4类操作符,可以分别进行逻辑运算(Logical)、关系运算(Relational)、算术运算(Arithmetic)、并置运算(Concatenation)逻辑运算符逻辑运算符要求运算符左右的数据类型必须相同
AND(逻辑与) OR(逻辑或) NAND(与非)
NOT(逻辑非) NOR(或非) XOR(异或)
XNOR( 同或)逻辑运算符逻辑运算符例:x<=(a AND b) OR (NOT c AND d);
x<=b AND a AND d AND e;
x<=((a NOR b) NOR c) NOR d;
x<=b OR c OR d OR e;
x<=a XOR d XOR e;
a<=(x1 AND x2) OR (y1 AND y2); 算术运算符算术运算符VHDL语言有八种算术运算符,它们分别是:
+ 加(可综合)
- 减(可综合)
* 乘(可综合)
/ 除
** 指数 (左操作数:任意整数或实数)
(右操作数必须是整数)
MOD 求模 (只能用于整数类型)
REM 取余 (只能用于整数类型)
ABS 取绝对值关系运算符关系运算符VHDL语言有六种关系运算符,它们分别是:
= 等于
/= 不等于
< 小于
<= 小于或等于 (也用于信号的赋值)
> 大于
>= 大于或等于null并置运算符并置运算符& 并置,将多个对象或矢量连接成维数更大的矢量
ARCHITECTURE example OF shiftrl IS
BEGIN
PROCESS(a)
BEGIN
O1<=‘0’&a(7 DOWNTO 1); 右移
O2<=O1(6 DOWNTO 0)& ‘0’; 左移
O3<=a&b; 合并a,b
END PROCESS;nullnull