VHDL并行语句

[复制链接]

150

主题

446

帖子

1970

积分

审核员

Rank: 9Rank: 9Rank: 9

积分
1970
楼主
查看: 6897回复: 0 发表于 2019-9-11 09:13:43   只看该作者
并行语句——出现在结构体中,各语句并行(同步)运行,与书写的顺序无关。

使用格式如下:
ARCHITECTURE   结构体名   OF   实体名   IS
      说明语句
BEGIN
     并行语句
END   ARCHITECTURE    结构体名;


        注:并行语句与顺序语句并不是相互对立的语句,它们往往互相包含、互为依存,它们是一个矛盾的统一体。例如, 相对于其他的并行语句,进程属于并行语句,而进程内部运行的都是顺序语句,而一个单句并行赋值语句,从表面上看是一条完整的并行语句,但实质上却是一条进程语句的缩影,它完全可以用一个相同功能的进程来替代。所不同的是,进程中必须列出所有的敏感信号,而单纯的并行赋值语句的敏感信号是隐性列出的。


结构体中的并行语句模块


进程语句(PROCESS)
1.PROCESS语句格式
     格式如下:
            [进程标号:]PROCESS[(敏感信号参数表)][IS]
                           [进程说明部分]    - -进程说明部分用于定义该进程所需的局部数据环境
            BEGIN
                           顺序描述语句
            END   PROCESS[进程标号];


PROCESS语句结构由三个部分组成:
①进程说明部分(主要定义一些局部量,可包括数据类型、常数、属性、子程序等。但需注意,在进程说明部分中不允许定义信号和共享变量) ;
②顺序描述语句部分(变量赋值语句、进程启动语句、子程序调用语句、顺序描述语句和进程跳出语句 );
③敏感信号参数表(当有WAIT语句时例外)。


注:一个结构体中可含有多个PROCESS结构,每一PROCESS结构对于其敏感信号参数表中定义的任一敏感参量的变化,每个进程可以在任何时刻被激活或者称为启动,所有被激活的进程都是并行运行的。进程之间的通信是通过传递信号和共享变量值来实现的。


2.未列出敏感信号,进程需WAIT语句来启动

   【例】 ARCHITECTURE  ART  OF  STAT  IS
                 BEGIN
                 P1:PROCESS   -- 该进程未列出敏感信号,进程需靠WAIT语句来启动
                          BEGIN
                          WAIT UNTIL CLOCK ;  -- 等待CLOCK激活进程
                          IF (DRIVER=‘1’)  THEN   -- 当DRIVER为高电平时进入CASE语句
                       CASE  OUTPUT  IS
                             WHEN   S1=>  OUTPUT<=S2;
                             WHEN   S2=>  OUTPUT<=S3;
                             WHEN   S3=>  OUTPUT<=S4;
                             WHEN   S4=>  OUTPUT<=S1;
                         END CASE;
                 END PROCESS P1;
            END ARCHITECTURE  ART;


  3.敏感信号启动进程

【例】 SIGNAL  CNT4:INTEGER   RANGE 0 TO 15;--注意CNT4的数据类型
                              ...
              PROCESS(CLK,CLEAR,STOP)
                                                                 - -该进程定义了3个敏感信号 CLK、CLEAR、STOP
              BEGIN                                       - -当其中任何一个改变时,都将启动进程的运行
              IF   CLEAR=‘0’   THEN
                            CNT4<=0;
              ELSIF  CLK'EVENT   AND  CLK=‘1’ THEN --如果遇到时钟上升沿,则……
                   IF   STOP=‘0’   THEN  --如果STOP为低电平,则进行加法计数,否则停止计数
                          CNT4<=CNT4+1;               
                    END IF;
              END IF;
             END    PROCESS;


          【例】十进制加法器
LIBRARY  IEEE;
USE  IEEE.STD_LOGIC_1164.ALL;
USE  IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY  CNT10  IS
   PORT(CLR: IN  STD_LOGIC;
    IN1:IN  STD_LOGIC_VECTOR(3 DOWNTO 0);
    OUT1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END  CNT10;
ARCHITECTURE ART OF CNT10 IS
BEGIN
     PROCESS (IN1,CLR)
     BEGIN
         IF (CLR= ‘1’ OR  IN1= "1001")   THEN
               OUT1<="0000";             
         ELSE
               OUT1<=IN1+1;
         END   IF;
    END PROCESS;
END ART;


【例】十进制时序逻辑加法计数器
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY  CNT10 IS
  PORT(CLR:IN STD_LOGIC;
     CLK:IN STD_LOGIC;
     CNT: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0));
END  CNT10;
ARCHITECTURE  ART  OF CNT10 IS
BEGIN
PROCESS
BEGIN
    WAIT  UNTIL  CLK'EVENT  AND  CLK = ‘1’;
     IF (CLR= ‘1’OR CNT=9)  THEN
          CNT<="0000";
    ELSE
          CNT<=CNT+1;
    END   IF;
  END   PROCESS;
END   ART;


【例】 4状态同步有限状态机


PACKAGE  MTYPE IS
   TYPE  STATE_T  IS (S0,S1,S2,S3);
                                 --利用程序包定义数据类型
END  MTYPE;

LIBRARY  IEEE;
USE  IEEE.STD_LOGIC_1164.ALL;
USE  WORK.MTYPE.ALL;  --打开程序包

ENTITY  S4_MACHINE  IS
  PORT(CLK,INC,A1,B1:INSTD_LOGIC;
        RST: IN  BOOLEAN;
        OUT1:OUT  STD_LOGIC);
END  ENTITY   S4_MACHINE;

ARCHITECTURE  ART  OF  S4_MACHINE  IS
    SIGNAL CURRENT_STATE,NEXT_STATE:STATE_T;
  BEGIN
SYNC:PROCESS(CLK,RST)                        BEGIN
      IF  (RST)  THEN   CURRENT_STATE<=S0;
      ELSIF(CLK'EVENT  AND  CLK=‘1’) THEN
                  CURRENT_STATE<=NEXT_STATE;
      END IF;  
END  PROCESS  SYNC;
FSM:PROCESS(CURRENT_STATE, A1,B1) BEGIN
     OUT1<=A1;  NEXT_STATE<=S0;
     IF (INC=‘1’) THEN
     CASE  CURRENT_STATE   IS
  WHEN  S0=>  NEXT_STATE<=S1;
  WHEN  S1=>  NEXT_STATE<=S2;OUT<=B1;
  WHEN  S2=>  NEXT_STATE<=S3;
  WHEN  S3=>  NULL
      END  CASE;
      END IF;
END  PROCESS  FSM;
END  ART;


【例】三态缓冲器总线结构描述





A_OUT  <=A  WHEN (ENA) ELSE 'Z';
B_OUT  <=B  WHEN (ENB) ELSE 'Z';
C_OUT  <=C  WHEN (ENC) ELSE 'Z';
PROCESS (A_OUT)
BEGIN
    BUS_OUT <=A_OUT;
END  PROCESS;


PROCESS (B_OUT)
BEGIN
    BUS_OUT <=B_OUT;
END  PROCESS;
PROCESS (C_OUT)
BEGIN
     BUS_OUT <=C_OUT;
END  PROCESS;




快速回复 返回顶部 返回列表