VHDL概述
实体说明
不论是简单的数字电路还是一个微处理器或者系统,都由实体构成,实体的结构
ENTITY 实体名 IS
[类属参数说明];
[端口说明];
END ENTITY 实体名
以上就是一个基本设计单元的实体说明
类属参数说明
必须放在端口说明之前,用于指定参数
端口说明
端口说明是对基本设计实体(单元)与外部接口的描述, 书写格式的描述
PORT(端口名{, 端口名}:方向 数据类型名;
……
端口名{, 端口名}:方向 数据类型名;
);
端口名
一般是赋予外部引脚的名称,为英文字母加数字
端口方向
用BUFFER时与该端口连接的另外一个元器件的端口也要用BUFFER说明,而OUT则没有此要求
顺序语句
与书写顺序有关,只能出现在进程、过程、函数中
变量赋值语句
格式:[variable]目标变量名[: 数据类型]: = 表达式
variable a,b: std_logic
a:='1';
b:='0';
注: 变量是局部的,暂时性的数据对象,变量的赋值立即生效
std_logic
std_logic是长度为1的逻辑 与bit 相似,只是bit只能是'0 ’和'1‘ 而std_logic有以下九种状态:
'U'——初始值, 'X'——不定,
‘0’——0, '1'——1,
‘Z’——高阻, 'W'——弱信号不定,
‘L’——弱信号0, 'H'——弱信号1,
'-'——不可能的情况
单元素赋值
VARIABLE a, b: STD_LOGIC;
VARIABLE x,y:INTEGER RANGE 15 DOWNTO 0;
a:='1';
b:='0';
x:=11;
y:=2+x;
注意: signal e:integer range 0 to 8; 是不是指随便怎么编,e的...答:e的取值只能是0 1 2 3 4 5 6 7 8 超过8会自动返回到0,
数组赋值
数组元素赋值目标的表示格式
单个元素:标识符(下标名) 比如 b(5)
多个元素:标识符(下标1 to / downto 下标2)
VARIABLE a,b:STD_LOGIC_VECTOR(7 DOWNTO 0);
b(7 DOWNTO 0):=“10110010”;
a:=b;
VARIABLE a,b : STD_LOGIC_VECTOR (1 TO 4);
b(1 TO 4):="1011";
a(1 TO 2):=b(3 TO 4);
信号赋值语句
格式:目标信号名 <= 表达式[after时间量]
注: 信号的赋值时有延时性的,信号量是全局量
SIGNAL y,z : STD_LOGIC;
SIGNAL a,b :STD_LOGIC_VECTOR(0 TO 3);
a <= "1010";
b <= "1000";
y <= a(1);
z <= b(3);
STD_LOGIC_VECTOR
是数组
延时性举例
PROCESS ( a, b, c, d ) BEGIN d<=a; x <= c XOR d; d<=b; y <= c XOR d; END PROCESS;
x <= c XOR b;
y <= c XOR b;
IF语句
IF 条件 THEN
顺序处理语句;
ENDIF
# 二选一
IF 条件 THEN
顺序处理语句1;
ELSE
顺序处理语句2;
ENDIF
# 多路选择
IF 条件1 THEN
顺序处理语句1;
ELSIF 条件2 THEN
顺序处理语句2;
……
ELSE
顺序处理语句x;
ENDIF
示例
IF sel='1'THEN
c<=a;
ELSE
c<=b;
END IF;
case 语句
CASE 表达式 IS
WHEN 选择值=>顺序语句1;
WHEN 选择值=>顺序语句2;
【WHEN OTHERS=>顺序语句n】;
END CASE
注意:IF语句是具有优先级;case语句没有优先级,必须穷举尽
loop语句
无限loop
[标号]:LOOP
顺序处理语句;
END LOOP[标号];
无线循环功能,只有通过控制转向语句才可退出循环。
示例
L2:LOOP
A:=A+1;
EXIT L2 WHEN A>10;
END LOOP L2
for loop
[标号]:FOR 循环变量 IN 循环次数范围 LOOP
顺序处理语句;
END LOOP[标号];
实现循环功能,每次循环时变量在范围内变化一次。循环变量不用事先说明,但不能含有信号和变量。
while loop
[标号]:WHILE 循环条件 LOOP
顺序处理语句;
END LOOP[标号];
若条件为真,则进行循环;若条件为假则结束循环
next 语句
-
NEXT
无条件终止当 前循环,跳回到本次循环LOOP语句处,开始下一次循环。
-
NEXT LOOP
标号表明下一次循环的起始位置。当有多重LOOP语句嵌套时,可以跳转到指定标号的LOOP语句处,重新开始执行循环操作。
-
NEXT LOOP标号WHEN条件表达式
如果条件表达式的值为TRUE,则执行NEXT语句,否,则循环正常继续。
exit 语句
- exit
- exit loop
- exit loop 标号 when 条件表达式
wait语句
-
wait 无线等待
-
wait on 敏感信号变化是结束挂起
PROCESS BEGIN Y<=a AND b; WAIT ON a, b; -- 当a,b任一信号变化时发生变化时,结束挂起,继续执行之后的语句 END PROCESS;
-
wait until 布尔表达式 条件满足时结束挂起
表达式方式
信号=VALUE; 信号’EVENT AND 信号=VALUE; NOT信号’STABLE AND 信号=VALUE;
-
wait for 表达式 时间到时结束挂起
当执行到该语句时,进程被挂起,直到指定的时间到,结束挂起,继续执行后面的语句。
-
多条WAIT语句
指WAIT语句可以使用多个等待条件,只要一个或多个满足,则结束挂起。
-
超时等待处理
为防止“死锁”增加的超时处理语句。常与断言语句合用。
子程序调用语句
子程序包括过程和函数,子程序可以在结构体或程序包的任何位置被调用
-
过程调用格式
过程名(参数表 );=
-
函数调用格式
函数名(参数表);
-
过程和函数的区别
过程的参数可以是IN、INOUT或OUT模式,而函数只能是IN模式。
函数调用返回一个指定类型的值,过程没有。
return
子程序返回。当“表达式”缺省时,只能用于过程;当有“表达式”时,只能用于函数,并且必须返回一个值。
RETURE [表达式];
null语句
空操作
格式: NULL;
预定义属性描述语句
属性:是关于实体、结构体、类型、信号、变量等项目的一些特征。属性可通过一个值或一个表达式表示。
属性描述语句作用:实现对项目的特性进行检测或统计。
预定义属性描述语句的格式:项目名’属性标识符
格式 | 含义 |
---|---|
信号’event | 在一段时间内若有信号事件发生则返回“true”,反之,返回“false”。 |
信号’active | 在一段时间内若信号活跃则返回“true”,反之,返回“false”。 |
信号’last_event | 返回信号从前一个事件发生到现在时刻所经历的时间值; |
信号’last_value | 返回信号在最近一个事件发生以前的值; |
信号’last_active | 返回信号从前一次信号活跃到现在时刻所经历的时间值; |
信号’STABLE[t] | 在时间t内若没有事件发生则返回“true”的布尔信号,反之,返回“false”的布尔信号。 |
[示例]
-- 检查时钟信号clk上升沿方式:
clk‘EVENT AND clk=‘1’;
NOTclk‘STABLE AND clk=‘1’;
-- 检查脉冲宽度方式
(falling_edge(clk)) AND (clk'LAST_EVENT>=10 ns); ---最小正脉冲宽度检查
( rising_edge(clk)) AND (clk'LAST_EVENT>=10ns); --最小负脉冲宽度检查
并行语句
语句的执行与书写顺序无关。各并行语句之间可以通过信号交换信息或相互独立。
每个并行语句代表一个功能单元,一个或多个功能单元组成一个结构体。
进程语句(PROCESS)
PROCESS语句格式:
[进程名]:PROCESS[(敏感信号参数)]
[变量说明语句;]
BEGIN
顺序描述语句;
END PROCESS[标号];
PROCESS内部语句为顺序执行语句 ,但进程本身是并发语句。
进程在敏感信号变化时触发执行,也可以用WAIT等待语句实现触发。
但需要注意,在进程语句中,敏感信号表和WAIT语句不能共同存在于一个进程之中。
-
不含敏感信号表的进程
ARCHITECTURE ART OF STAT IS BEGIN P1:PROCESS BEGIN WAIT UNTIL CLOCK; IF(DRIVER=‘1’)THEN CASE OUTPUT IS WHEN S1=>OUTPUT<=S2; WHEN S2=>OUTPUT<=S3; WHEN S3=>OUTPUT<=S4 WHEN S4=>OUTPUT<=S1; END CASE; END IF; END PROCESS P1; END ART;
-
含敏感信号表的进程
-
同步进程的敏感信号表中只有时钟信号
PROCESS(CLOCK) BEGIN IF(CLOCK’EVENT AND CLOCK=‘1’ ) THEN IF RESET=‘1’ THEN DATA<=“00”; ELSE DATA<=IN_DATA; END IF; END IF; END PROCESS;
-
异步进程的敏感信号表中除时钟信号外还有其他信号
PROCESS(CLK,RESET) BEGIN IF RESET=‘1’ THEN DATA<=“00”; ELSE IF CLK’EVENT AND CLK=‘1’ THEN DATA<=IN_DATA; END IF; END IF; END PROCESS;
-
并发信号赋值语句
简单信号赋值语句
格式:赋值目标 <= 信号量表达式;
当右边值发生变化时完成代入功能。
在进程之外执行语句,等效于一个进程的缩写。
ARCHITECTURE behave OF a_bar IS
BEGIN
output <= a;
END behave;
-- 等价于
ARCHITECTURE behave OF a_bar IS
BEGIN
PROCESS(a,)
output <= a;
END PROCESS;
END behave;
并发信号赋值语句
杂
- S<=S1&S2; 中 & 是连接操作