包括并发信号赋值、条件信号赋值、选择信号赋值。
1、并发信号赋值:
q <= tmp3;
tmp3类似于敏感信号,每当tmp3信号变化一次,就执行一次。
2、条件信号赋值
条件赋值语句的赋值具有优先级,第一句优先级最高。
eg:四选一多路选择器
--条件赋值(四选一多路选择器)
ENTITY mux4_1 IS
PORT(i0,i1,i2,i3,a,b : IN STD_LOGIC;
q : OUT STD_LOGIC);
END mux4_1;
ARCHITECTURE rtl OF mux4_1 IS
SIGNAL sel : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
sel <= a & b;
q <= i0 WHEN sel ="00" ELSE
i1 WHEN sel ="00" ELSE
i2 WHEN sel ="00" ELSE
i3 WHEN sel ="00" ELSE
'Z';
END rtl;
3、选择信号赋值
不能在进程中赋值,敏感量就是WITH后边的选择条件表达式,只要选择条件表达式发生变化,就会进行一次选择判断,若满足条件就会重新赋值。注:不允许条件重叠,不允许条件涵盖不全。
ENTITY mux4_1 IS
PORT(i0,i1,i2,i3,a,b : IN STD_LOGIC;
q : OUT STD_LOGIC);
END mux4_1;
ARCHITECTURE rtl OF mux4_1 IS
SIGNAL sel : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
sel <= a & b;
WITH sel SELECT
q = i0 WHEN "00",
i1 WHEN "01",
i2 WHEN "10",
i3 WHEN "11",
'Z' WHEN OTHERS;
END rtl;
是一种并行处理语句,在同一个结构体中的多个PROCESS语句可以并行执行,每一个PROCESS中的语句顺序执行。是硬件系统中最常用,最基本的语句。
进程包括进程说明部分,顺序语句描述部分,敏感信号参数表。
进程说明部分 :定义变量、数据类型、属性、子程序。不可以定义信号和共享变量。
特点:
1、各个 PEOCESS语句并发执行,并可存取结构体和实体中定义的信号;
2、每一个 PROCESS 中的语句顺序执行;
3、进程中 必须包含 显式的 敏感信号 ,或者有效的WAIT语句 ;
4、进程之间的通信通过信号量 来传递。
例子2:D触发器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY dff IS
PORT (d,clk : IN STD_LOGIC;
q ,bq : OUT STD_LOGIC );
END dff;
ARCHITECTURE rtl OF dff IS
BEGIN
L1: PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk = '1') THEN
q <= d;
bq <= NOT d;
END IF;
END PROCESS L1;
END rtl;
例子2:进程之间的通信:16分频器
--16分频器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY sync_com IS
PORT(clk : IN STD_LOGIC;
irq : OUT STD_LOGIC);
END sync_com;
ARCHITECTURE rtl OF sync_com IS
SIGNAL counter :STD_LOGIC_VECTOR (3 DOWNTO 0);--计数信号
BEGIN
L1:PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk = '1')THEN
counter =counter + 1;
END IF;
END PROCESS L1;
L2:PROCESS(clk)
IF(clk'EVENT AND clk = '1')THEN
IF(counter = "1111")THEN
counter <= '0000'
irq <= '0';
ELSE
irq <= '1';
END IF;
END IF;
END PROCESS L2;
END rtl;
WAIT语句
已经列出敏感表的不能使用wait语句。
wait; --进程无限挂起
wait on 敏感信号; --敏感信号变化时,进程启动
wait until 条件表达式; --条件表达式的信号发生变化,且满足条件,才启动进程
wait for 时间表达式; --等待一段时间后进程启动
特点:
1、利用顺序语句定义和完成;
2、不可以 从本结构体的其他模块或进程结构体中 读取和复制信号;
3、子程序的使用只能通过子程序调用 ,与子程序界面端口进行通信;
4、子程序的定义位置:程序包、结构体、进程。一般定义在程序包中;
5、可重载性:允许重名的子程序,他们通过参数类型和返回值类型进行区别;
6、分类:过程、函数;
7、子程序综合后会映射于芯片中的一个相应是电路模块,每次调用都会产生相同结构的不同模块,因此,要密切关注子程序的调用次数。
1、可以提供多个返回值或者不提供返回值;
2、过程有入口参数,输出参数,双向参数;
3、常常被看做一种语句结构,在进程或者结构体中以分散的形式存在;
4、可以 单独存在, 类似于进程;
5、结构:过程首、过程体;前者用于定义常量、变量、数据类型(仅仅该过程可见),后者用于描述具体功能;
6、定义位置:程序包、结构体、进程。一般定义在程序包中:过程首定义在程序包的包说明位置,过程体位于包体部分。
--将过程定义在程序包中
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE example IS
PROCEDURE max
(a,b : IN INTEGER
C: OUT INTEGER );
END PACKAGE example;
PACKAGE BODY example IS
PROCEDURE max
(a,b : IN INTEGER;
C: OUT INTEGER)IS
BEGIN
IF (a>b) THEN
C <= a;
ELSE
C <= b;
END IF;
END max;
END PACKAGE BODY example;
7、过程的调用:在调用过程前,将实参传递给形参。然后就会顺序执行过程语句,最后将输出值送到定义的变量或者信号中。
max(i1,i2,q1);--过程的调用
1、函数只能有一个返回值;
2、函数入口中,所有参数是输入参数(IN),数据类型只能是常量或信号,默认值是:IN,CONSTANT;
3、函数是表达式的一部分,常在赋值语句或者表达式中使用;
4、函数作为语句的一部分被调用;
5、函数结构:函数首、函数体。进程或者结构体中不必须定义函数首,程序包中必须定义函数首;函数首放在包首,函数体放在包体。
--函数在包中的定义
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE packexp IS --定义包首
FUNCTION max (a,b :IN STD_LOGIC_VECTOR(7 DOWNTO 0)) --定义函数首1
RETURN STD_LOGIC_VECTOR(7 DOWNTO 0);
FUNCTION max (a,b :IN BIT_VECTOR(7 DOWNTO 0)) --定义函数首2
RETURN BIT_VECTOR(7 DOWNTO 0);
FUNCTION max (a,b :IN INTEGER 0 TO 15) --定义函数首3
RETURN INTEGER 0 TO 15;
END PACKAGE packexp;
PACKAGE BODY packexp IS
FUNCTION max (a,b :IN STD_LOGIC_VECTOR(7 DOWNTO 0)) --定义函数体1
RETURN STD_LOGIC_VECTOR(7 DOWNTO 0) IS
IF (a > b)THEN
RETURN a;
ELSE
RETURN b;
END IF;
END FUNCTION max;
FUNCTION max (a,b :IN BIT_VECTOR(7 DOWNTO 0)) --定义函数体2
RETURN BIT_VECTOR(7 DOWNTO 0) IS
IF (a > b)THEN
RETURN a;
ELSE
RETURN b;
END IF;
END FUNCTION max;
FUNCTION max (a,b :IN BIT_VECTOR(7 DOWNTO 0)) --定义函数体3
RETURN BIT_VECTOR(7 DOWNTO 0) IS
IF (a > b)THEN
RETURN a;
ELSE
RETURN b;
END IF;
END FUNCTION max;
END PACKAGE BODY packexp;
--函数的调用
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.packexp.ALL; --引用自定义包
ENTITY examp IS
PORT(a1,b1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
a2,b2 : IN BIT_VECTOR(7 DOWNTO 9);
a3,b3 : IN INTEGER 0 TO 15;
c1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
c2 : OUT BIT_VECTOR(7 DOWNTO 0);
c3 : OUT INTEGER 0 TO 15
);
END examp;
ARCHITECTURE bhv OF examp IS
BEGIN
c1 <= max(a1,b1); --函数1调用
c2 <= max(a2,b2); --函数2调用
c3 <= max(a3,b3); --函数3调用
END bhv;