VHDL中的行为设计:进程语句以电路功能块为基础,直接考虑信号流程或状态变化过程电路功能块采用进程表达,通过信号进行功能块之间的交流;
进程语句的格式进程名,process(信号名,…,信号名)
(敏感量表)
说明语句:类型、变量、常量、函数、
过程的声明或定义
begin
顺序语句;
…..
顺序语句;
end process;
进程语句的一个实例例,2-4译码器的进程描述
a,in std_logic_vector (1 downto 0);
f,out std_logic_vector (3 downto 0) ;
………
process(a)
begin
f(0) <= not a(1) and not a(0);
f(1) <= not a(1) and a(0);
f(2) <= a(1) and not a(0);
f(3) <= a(1) and a(0);
end process;
………
进程语句的编写特点
1 进程本身为结构体内的一条并行语句,其内部可执行部分是顺序语句;
2 进程可以使用结构体的各种信号作为输入和输出,在进程中可以改变这些信号的值;
3 进程内不允许定义新的信号,但可以定义局部变量、常量、函数等;这些定义的数据对象只在该进程内部使用 ;
进程语句的仿真特点
1 进程通常带有敏感量表(信号名列表),当表中任一信号值发生变化时,进程就从头到尾执行一次;
2 若进程的执行导致进程内部变量或信号的任何变化,进程将立即再次执行;
3 当进程的执行不再导致进程内部量发生任何变化时,进程将停止执行,此时进程功能块处于稳定状态。
进程语句的物理模型进程相当于一个抽象的电路功能块,其输入信号为其敏感量表所列信号,输出信号可以是在进程中赋值的任何信号;
进程的内部构造 类似于 电路(信号)流程框图,
程序的执行按顺序进行,简单功能框用代入语句、分支语句、循环语句表达,复杂的功能框可以采用过程语句表达 。
VHDL中的典型顺序语句
VHDL的子结构中的执行语句都采用顺序语句;
典型的顺序语句主要分为以下几类:
变量赋值语句;
Wait 语句;
If语句; case语句;
loop语句;
VHDL中的典型顺序语句:变量赋值变量名,= 表达式要点:
在进程中,变量赋值立即进行,具有顺序特点,
写在前面的语句先进行赋值;
可以采用函数进行赋值;
进程中信号与变量可以相互赋值;
进程的变量赋值设计实例例,2-4译码器的进程描述
architecture d of kdec24 is
begin
process(a)
begin
f(0) <= not a(1) and not a(0);
f(1) <= not a(1) and a(0);
f(2) <= a(1) and not a(0);
f(3) <= a(1) and a(0);
end process; end d;
进程的变量赋值设计实例素数检测器的进程设计 p.290 表 4-56
process(n)
variable n3l_n0,n3l_n2l_n1,
n2l_n1_n0,n2_n1l_n0:std_logic;
begin
n3l_n0,= not n(3) and n(0);
n3l_n2l_n1,= not n(3) and not n(2) and n(1);
n2l_n1_n0,= not n(2) and n(1) and n(0);
n2_n1l_n0,= n(2) and not n(1) and n(0);
f<= n3l_n0 or n3l_n2l_n1 or n2l_n1_n0 or n2_n1l_n0;
end process;
进程中的信号赋值问题进程中也可以进行信号赋值,其格式与并行赋值相同,信号名 <=表达式 [表面上为顺序语句!!! ]
信号赋值保持并行执行的特点,不会立即执行,
只在该次进程结束( 停止 )时执行;
在进程中允许有多条语句为同一信号赋值,但只有最后一次被执行;
进程中的变量与信号赋值的比较变量赋值例子:
signal s1:integer:=0;
variable v1,v2:integer:=0;
v1:=v1+1; v1马上由‘ 0’改变为‘ 1’;
v1:=v1+1; v1马上由‘ 1’改变为‘ 2’;
v2:=v2+s1; 只要类型匹配,信号值可以立即赋值给变量;[信号 变量 立即赋值!!!]
进程中的变量与信号赋值的比较信号赋值的例子:
signal s1,s2,s3:integer:=0;
s1<=1; s1不会马上变为‘ 1’;
s2<=s1; s2将得到‘ 0’;
wait for 10 ns; 此时进行 以上 赋值;
s3<=s1; s3将得到‘ 1’;
VHDL中的典型顺序语句,wait 语句等待语句用于控制进程的执行时间,当进程执行到 wait语句时,将被挂起,直到 wait语句的条件满足,才继续执行后续语句;此时进程中该语句之前的信号赋值语句得到执行;
在进程中,如果使用了 wait语句,就不能使用敏感表;
在函数和过程中,wait语句通常不能综合。
VHDL中的典型顺序语句,wait 语句
wait on 信号,信号;
等待所列举信号中任何一个发生变化;
所起作用与进程的敏感信号表相同,两者不能同时存在;
wait on 语句的应用实例采用 wait语句描述的二 -四译码器进程
process
begin
wait on a;
f(0) <= not a(1) and not a(0);
f(1) <= not a(1) and a(0);
f(2) <= a(1) and not a(0);
f(3) <= a(1) and a(0);
end process;
VHDL中的典型顺序语句,wait 语句
wait until 布尔表达式;
利用表达式建立隐含的敏感信号表;当任何一个涉及的信号发生变化时,就自动检测布尔表达式是否为真;如果为真,则执行后续语句;
如果为假,则继续等待;
wait until 语句的应用实例例,D锁存器的设计
process
begin
wait until (en = '1');
q<= d;
end process;
VHDL中的典型顺序语句,wait 语句
wait for 时间表达式;
等待由时间常量或变量组成的表达式所表达的时间到达,再执行后续语句;采用本语句可以描述电路信号在处理或传输中发生的延时;
注意,wait for语句不能综合;通常在仿真的
testbench编制时使用;
wait for 语句的应用实例
process
begin
xt<='0';yt<='0';
wait for 10 ns;xt<='0';yt<='1';
wait for 10 ns;xt<='1';yt<='0';
wait for 10 ns;xt<='1';yt<='1';
wait; --进入无限期等待;
end process;
VHDL中的典型顺序语句,if 语句
if 布尔表达式 then 顺序语句
end if;
当布尔表达式为 true时,
执行 then后面的顺序语句;
为 false时,执行 end if
以后的语句;
VHDL中的典型顺序语句,if 语句
if 布尔表达式 then 顺序语句 1
else 顺序语句 2
end if;
当布尔表达式为 true时,
执行 then后面的顺序语句 1;
为 false时,执行顺序语句 2;
VHDL中的典型顺序语句,if 语句
if 布尔表达式 1 then 顺序语句 1
elseif 布尔表达式 2 then 顺序语句 2
end if;
当布尔表达式 1为 true时,执行顺序语句 1;布尔表达式 2为 true时,执行顺序语句 2;
各布尔表达式必须互斥,在同一时刻,必须有一个为 true,也只能有一个为 true;
VHDL中的典型顺序语句,if 语句
if 布尔表达式 1 then 顺序语句 1
elseif 布尔表达式 2 then 顺序语句 2
else 顺序语句 3
end if;
当布尔表达式 1为 true时,执行顺序语句 1;
布尔表达式 2为 true时,执行顺序语句 2;
所有布尔表达式都为 false时,执行顺序语句 3;
if 语句的应用实例
process(n)
variable ni,integer;
begin
ni,= conv_integer(n);
if ni=1 or ni=2 then f<= '1';
elsif ni=3 or ni=5 or ni=7 or ni=11 or
ni=13 then f<='1';
else f<= '0';
end if;
end process;
VHDL中的典型顺序语句,case 语句与 if语句类似,用于表达逻辑语句的条件选择;
如果与信号赋值语句对比,if语句可以对应于条件赋值,case语句对应于选择赋值;
case语句适应性更广,综合也更为容易;
VHDL中的典型顺序语句,case 语句
case 表达式 is
when 选择值 1 => 顺序语句 1;
when 选择值 2 => 顺序语句 2;
end case;
选择值应互斥,并覆盖表达式所有的可能值;
VHDL中的典型顺序语句,case 语句
case 表达式 is
when 选择值 1 => 顺序语句 1;
when 选择值 2 => 顺序语句 2;
when others => 顺序语句 3;
end case;
没有列出的选择值都归入 others;
case 语句的应用实例
process(n)
begin
case conv_integer(n) is
when 1|2 => f<= '1';
when 3|5|7|11|13 => f<= '1';
when others => f<= '0';
end case;
end process;
VHDL中的典型顺序语句,loop 语句
for 循环变量 in 范围 loop
顺序语句;
end loop 编号;
循环变量为整数类型,不需要说明;范围的数据类型也必须为整数;
循环变量 从范围最左边的值开始 ;每进行一次循环,指标右移 1位;直到全部循环完毕;
VHDL中的典型顺序语句,loop 语句
while 布尔表达式 loop
顺序语句;
end loop 编号;
不指定循环次数;每次循环前检测布尔表达式的值;当布尔表达式为真时,执行循环;为假时,不进行循环;在循环体内,应有语句能够改变布尔表达式中变量的值,避免无限循环。
VHDL中的典型顺序语句,loop 语句
loop
顺序语句;
end loop 编号;
通常内部设置有跳出循环的语句 (next,exit);
只要不满足跳出条件,就会一直循环下去;
VHDL中的典型顺序语句,loop 语句
next 编号 when 布尔表达式;
执行到此语句时,检测布尔表达式,若为 true,
则转为执行编号所表示的语句(跳出本循环);
若为 false,则继续进行循环;
若没有编号,则当布尔表达式为 true时,直接跳出本次循环,开始 下一次循环 ;
VHDL中的典型顺序语句,loop 语句
exit 编号 when 布尔表达式;
执行到此语句时,检测布尔表达式,若为 true,
则转为执行编号所表示的语句;若为 false,
则继续进行循环;
若没有编号,则当布尔表达式为 true时,直接跳出循环,执行循环之后的下一条语句 ;
本语句可以作为中止 loop的语句;
loop 语句的应用实例对数组信号进行初始化
type matrix2 is array(0 to 3,7 downto 0)
of std_logic;
signal w1:matrix2;
for i in 0 to 3 loop
for j in 7 downto 0 loop
w(i,j) <= '0';
end loop;
end loop;
loop 语句的应用实例并入串出的移位寄存器设计
process(clk,load)
begin
if load='0' then q<=din; dout<='0';
elsif clk'event and clk='1' then
q(1)<=q(0);
for i in 2 to 3 loop
q(i)<=q(i-1);
end loop;
dout<=q(3);
end if; end process;
loop 语句的应用实例并入串出的移位寄存器设计
process(clk,load)
begin
if load='0' then q<=din; dout<='0';
elsif clk'event and clk='1' then
q(1)<=q(0);
for i in 2 to 3 loop
q(i)<=q(i-1);
end loop;
dout<=q(3);
end if;
end process;
行为设计的小结行为描述方式采用进程及内部的各类顺序语句进行设计,与传统的软件设计思路最接近,
也最抽象、最灵活;
时序电路的触发器设计通常依赖于进程;
部分顺序语句难以直接实现电路综合,即使能综合,效率通常也比较差,通常主要用于设计思路的仿真。 顺序语句的缺点!