原创 【博客大赛】VHDL进程语句的并行执行分析

2013-12-6 11:45 2228 15 22 分类: FPGA/CPLD 文集: VHDL中信号与变量

相信许多人在学习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;

仿真结果:

截图20131128195513.jpg

此程序中设计了两个进程:第一个用于状态存储,另一个进程用于状态转移及输出。两个进程的敏感信号表分别为: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处时)。其余情况以此类推…

文章评论7条评论)

登录后参与讨论

用户377649 2015-6-30 13:20

用户1725882 2013-12-2 20:14

真不错!顶一个,两进程写法

用户1725879 2013-12-2 19:26

赞一个!

1053683568_507245520 2013-11-30 16:12

谢谢大家支持

ydcman_691947663 2013-11-29 20:21

思路不错,赞一个!

用户403664 2013-11-29 14:37

赞一个

1053683568_507245520 2013-11-28 17:30

顶一个
相关推荐阅读
1053683568_507245520 2014-03-20 11:19
cadence16.6 软件绘制PCB板
   最近一直在学习cadence的使用,现在就对近来学习做个总结,虽然还没有达到熟练的程度,但是也希望可以给后来者做个借鉴吧。         本人的方向是硬件方向,马上面临着找工作的压力。...
1053683568_507245520 2014-01-03 21:02
【博客大赛】自己定制DPRAM的读写操作
DPRAM的读写操作 下面是本人写的DPRAM的读写操作,自己定制DPRAM,不用altera FPGA 内部自带的IP core,选择的存储器块类型是M9K(对于不同类型的存储器块,当同时对...
1053683568_507245520 2013-12-15 20:51
【博客大赛】我的EDN
我的EDN 每次进入EDN网站,看到大家在踊跃的分享自己的学习经历,经验,以及聊生活谈梦想,都会激发我的热情,激发我对生活的热爱,对未来的幻想,对自己的思索。当我懒惰时,我会进来看看,看看特权...
1053683568_507245520 2013-12-07 11:31
【博客大赛】利用FPGA控制VGA接口来使显示器显示彩条纹(里面包括调试中的查错检查方法)
利用FPGA控制VGA接口来使显示器显示彩条纹 最近一直在调关于通过VGA接口来控制显示器的程序,今天终于调试出结果来了,赶紧上来与大家分享一下。 1、VGA显示原理 常见的彩色显示器...
1053683568_507245520 2013-12-06 11:45
【博客大赛】利用VHDL产生奇分频器
利用VHDL产生占空比为50%的奇倍数分频电路 一般的介绍VHDL语言的书在对分频器进行举例描述的时候,都是举得偶数倍分频的例子,因为那相对来说比较简单(只需要设置一个中间信号变量,然后在分频...
我要评论
7
15
关闭 站长推荐上一条 /2 下一条