简介:
相信许多人在学习VHDL时,都会对进程如何执行的,以及进程之间的并行执行产生疑问,本文将以下面一个具体的例子来分析单个进程的执行,与进程之间的并行执行。
library ieee;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
entity state_machine is
port(
clk: in std_logic;
rst: in std_logic;
din: in std_logic;
dout: out std_logic_vector(2 downto 0)
);
end entity;
architecture convert of state_machine is
type state_type is(s0,s1,s2,s3);
signal current_state,next_state: state_type;
begin
state_storage:process(clk,rst,next_state)
begin
if(rst='1') then
current_state<=s0;
elsif(clk'event and clk='1') then
current_state<=next_state;
end if;
end process;
change_state: process(current_state,din)
begin
case current_state is
when s0=>
if din='1' then
next_state<=s1;
end if;
dout<="001";
when s1=>
if din='1' then
next_state<=s2;
else
next_state<=s1;
end if;
dout<="011";
when s2=>
if din='1' then
next_state<=s3;
end if;
dout<="101";
when s3=>
if din='1' then
next_state<=s0;
else
next_state<=s1;
end if;
dout<="111";
when others=>
next_state<=s0;
end case;
end process;
end architecture;
仿真结果:
此程序中设计了两个进程:第一个用于状态存储,另一个进程用于状态转移及输出。两个进程的敏感信号表分别为:state_storage:process(clk,rst,next_state)
change_state: process(current_state,din)。
分析:只有当进程中的敏感信号表发生变化(由高到低或者由低到高)时才会启动对应的进程。
程序开始时:两个进程同时进行,rst信号为1,进行复位。第一个进程使得current_state为s0状态,第二个进程判断到current_state发生变化,启动第二个进程,输出dout<=001,next_state变为s1。
当第二个时钟上升沿到来时,第一个进程又启动,current_state 变为s1,引起第二个进程启动,将输出dout<=011,由于din为低电平状态不发生变化,current_state,next_state仍为s1;
接下来的两个时钟上升沿到来时都将会引起第一个进程启动,但是由于第二个进程里面的输入敏感信号din,current_state均没有变化,那么进程2也不会启动,next_state没有变化,因而输出也没有变化。
当din再次变为高电平时,进程2重新启动,使得next_state变为s2,但是由于current_state此时仍为s1,所以输出没变化,直到接下来的clk发生变化启动进程1时,才会使得current_state变为s2,同时进程2也启动,输出变为dout<=101,由于此时din仍为高电平,所以next_state变为s3。
当din再次变为低电平(0.088us)时,进程2启动,但是由于din的原因,状态不发生改变,仍处于s3状态,对应时刻进程1不会启动,结果并不会发生变化。而当紧接着clk上升沿到来时,进程1启动,current_state变为s3,进程2也同时启动,输出将变为111,由于din此时是0,next_state变为s1。
在0.1us处,clk上升沿到来,启动进程1,current_state变为s1,引起进程2同时启动,输出变为011,由于din仍为0,所以状态保持不变,一直到下一次进程2重新启动(0.146us处时)。其余情况以此类推…