【FPGA学习笔记】VHDL语言学习笔记(四)并行语句:并行赋值、process、子程序(procedure、function)

一、并行赋值语句

包括并发信号赋值条件信号赋值选择信号赋值

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语句可以并行执行每一个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、过程procedure

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);--过程的调用

2、函数function

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;

你可能感兴趣的:(FPGA)