|
楼主
查看: 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;
|
|