|
楼主
查看: 6238回复: 1
发表于 2019-9-10 15:49:52
只看该作者
一、 VHDL顺序语句
两大基本描述语句:顺序语句(Sequential Statements)和并行语句(Concurrent Statements)
顺序语句用以定义进程、过程和函数的行为。
特点:每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的,但相应的硬件逻辑工作方式未必如此,希望读者在理解过程中要注意区分VHDL语言的软件行为及描述综合后的硬件行为间的差异。
VHDL顺序语句:
① 赋值语句;
② 转向控制语句;
③ 等待语句;
④ 子程序调用语句;
⑤ 返回语句;
⑥ 空操作语句。
1.赋值语句
1)信号和变量赋值
赋值语句有两种,即信号赋值语句和变量赋值语句。
区别:
①变量具有局部特征,它的有效性只局限于所定义的一个进程/子程序中,它是一个局部的,暂时性数据对象(在某些情况下)。对于它的赋值是立即发生的(假设进程已启动)。
②信号则不同,信号具有全局性特征,它不但可以作为一个设计实体内部各单元之间数据传送的载体,而且可通过信号与其他的实体进行通信(端口本质上也是一种信号)。信号的
赋值并不是立即发生的,它发生在一个进程结束时。赋值过程总是有某些延时的,它反映了硬件系统的重要特性,综合后可以找到与信号对应的硬件结构。
语法格式:
变量赋值目标 := 赋值源;
信号赋值目标 < = 赋值源;
1)信号和变量赋值
【例】
SIGNAL SI,S2:STD_LOGIC;
SIGNAL SVEC : STD_LOGIC_VECTOR(0TO7);
```
PROCESS(S1, S2) IS
VARIABLE V1, V2: STD_LOGIC;
BEGIN
V1:=”1”; - - 立即将V1置位为1
V2:=”1”; - - 立即将V2置位为1
S1<=”1”; - - S1被赋值为1
S2<=”1”; - - 因S2不是最后一个赋值语句,故不作任何赋值操作
SVEC(0)<=V1; - - 将V1在上面的赋值1,赋给SVEC(0)
SVEC(1)<=V2; - - 将V2在上面的赋值1,赋给SVEC(1)
SEVC(2)<=S1; - - 将S1在上面的赋值1,赋给SVEC(2)
SVEC(3)<=S2; - - 将最下面的赋于S2的值”0”,赋给SVEC(2) ,发生在一个进程结束时
V1:=”0” ; - - 将V1置入新值0
V2:=”0”; - - 将V2置入新值0
S2<=”0”; - - S2最后一次将赋值的”0”将上面准备赋入的”1”覆盖掉
SVEC(4)<=V1: - - 将V1在上面的赋值0,赋给SVEC(4)
SVEC(5)<=V2; - - 将V2在上面的赋值0,赋给SVEC(5)
SVEC(6)<=S1; - - 将S1在上面的赋值1,赋给SVEC(6)
SVEC(7)<=S2; - - 将S2在上面的赋值0,赋给SVEC(7)
END PROCESS;
2)赋值目标
(1)标识符赋值目标及数组单元素赋值目标
① 标识符赋值目标:以简单的标识符作为被赋值的信号或变量名
② 数组单元素赋值目标:数组类信号或变量名(下标名)
(见前例)
(2)段下标元素赋值目标及集合块赋值目标
①段下标元素赋值目标:数组类信号或变量名(下标1 TO/DOWNTO 下标2)
括号中的两个下标必须用具体数值表示,并且起数值范围必须在所定义的数组下标范围内,两个下标的排序方向要符合方向关键词TO或DOWNTO。
【例】
VARIABLE A,B:STD_LOGIC_VECTOR(1 TO 4);
A(1 TO 2):=“10”; - - 等效于A(1):=‘1’,A(2):=‘0’
A(4 DOWNTO 1):=“1011“; - - 等效于A(4):=‘1’,A(3):=‘0’,
- - A(2):=‘1’,A(1):=‘1’
(2)段下标元素赋值目标及集合块赋值目标
② 集合块赋值目标,是以一个集合的方式来赋值的。对目标中的每个元素进行赋值的方式有两种,即位置关联赋值方式和名字关联赋值方式。
【例】
SIGNAL A,B,C,D:STD_LOGIC;
SIGNAL S: STD_LOGIC_VECTOR(1 TO 4)
…
VARIABLE E, F:STD_LOGIC;
VARIABLE G: STD_LOGIC_VECTOR(1 TO 2);
VARIABLE H:STD_LOGIC_VECTOR(1 TO 4);
S<=(‘0’,‘1’,‘0’,‘0’);
(A,B,C,D)<=S; - - 位置关联方式赋值,赋值结果等效于:
A<=‘0’;B<=‘1’;C<=‘0’;D<=‘0’;
… - - 其他语句
(3=>E, 4=>F, 2=>G(1), 1=>G(2)):=H; - - 名字关联方式赋值,赋值结果等效
--于:G(2):=H(1); G(1):=H(2); E:=H(3); F:=H(4);
2.转向控制语句
转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。
1)IF语句
IF语句是一种条件语句,其语句结构如下:
IF 条件句 THEN
顺序语句;
{ELSIF 条件句 THEN
顺序语句;}
[ELSE
顺序语句;]
END IF;
注意:IF语句中至少应有一个条件句,条件句必须由布尔表达式构成。
IF语句根据条件句产生的判断结果TRUE或FALSE,有条件地选
择执行其后的顺序语句。
转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。
1)IF语句
例:锁存器
if (ena = ‘1’) then
q <= d;
end if;
综合后生成锁存器(latch)
如:- -描述一个具有2输入与门功能的函数
FUNCTION AND_FUNC(X,Y:IN BIT) RETURN BIT IS
BEGIN
IF X=‘1’ AND Y=‘1’ THEN RETURN ‘1’;
ELSE RETURN ‘0’;
END IF;
END FUNCTION AND_FUNC;
如:- -描述二选一电路
architecture rtl of mux2 is
begin
process(a, b, sel)
begin
if (sel = ‘1’) then
y <= a ;
else
y <= b ;
end if ;
end process ;
end architecture rtl ;
转向控制语句通过条件控制开关决定执行哪些语句。转向控制语句共有五种:IF语句、CASE语句、LOOP语句、NEXT语句和EXIT语句。
1)IF语句
例:D触发器
library ieee;
use ieee.std_logic_1164.all;
entity FD is
port (d,clk: in std_logic;
q: out std_logic);
end entity FD;
architecture one of FD is
signal sig_save: std_logic;
begin
process(clk)
begin
if clk'event and clk=‘1' then sig_save<=d; end if;
q<=sig_save;
--q<=not sig_save;
end process;
end architecture one;
|
|