VHDL函数和过程、VHDL预定义包

本文详细介绍了VHDL中的函数和过程声明,包括在包中定义,输入输出参数的规定,以及如何在实体和架构中调用。此外,还讨论了VHDL包的使用,如预定义包、IEEE包及其功能,如算术运算、递归函数和断言语句的应用。

VHDL函数和过程

对于在设计中多次使用的块,请使用VHDL函数和过程。这个内容类似于组合过程内容在中声明函数和过程:

•实体的声明性部分

•架构

•一个包

函数或过程由声明部分和主体组成。声明性部分规定:

•输入参数,可以不受给定界限的约束。

•输出和输入参数(仅限程序)

重要!除IEEE中定义的功能外,不支持分辨率功能std_logic_1164包。

包内声明的函数示例(VHDL)

文件名:function_package_1.vhd

从编码示例下载编码示例文件。

此编码示例声明了包中的ADD函数。ADD功能是单个位加法器,并被调用四次以创建一个4位加法器。以下示例使用了一个函数:

-- Declaration of a function in a package
--
-- function_package_1.vhd
--
package PKG is
function ADD(A, B, CIN : BIT) return BIT_VECTOR;
end PKG;
package body PKG is
function ADD(A, B, CIN : BIT) return BIT_VECTOR is
variable S, COUT : BIT;
variable RESULT : BIT_VECTOR(1 downto 0);
begin
S := A xor B xor CIN;
COUT := (A and B) or (A and CIN) or (B and CIN);
RESULT := COUT & S;
return RESULT;
end ADD;
end PKG;
use work.PKG.all;
entity function_package_1 is
port(
A, B : in BIT_VECTOR(3 downto 0);
CIN : in BIT;
S : out BIT_VECTOR(3 downto 0);
COUT : out BIT
);
end function_package_1;
architecture ARCHI of function_package_1 is
signal S0, S1, S2, S3 : BIT_VECTOR(1 downto 0);
begin
S0 <= ADD(A(0), B(0), CIN);
S1 <= ADD(A(1), B(1), S0(1));
S2 <= ADD(A(2), B(2), S1(1));
S3 <= ADD(A(3), B(3), S2(1));
S <= S3(0) & S2(0) & S1(0) & S0(0);
COUT <= S3(1);
end ARCHI;
Procedure Declared Within a Package Example
(VHDL)
Filename: procedure_package_1.vhd
The following example uses a procedure within a package:
-- Declaration of a procedure in a package
--
-- Download: procedure_package_1.vhd
--
package PKG is
procedure ADD(
A, B, CIN : in BIT;
C : out BIT_VECTOR(1 downto 0));
end PKG;
package body PKG is
procedure ADD(
A, B, CIN : in BIT;
C : out BIT_VECTOR(1 downto 0)) is
variable S, COUT : BIT;
begin
S := A xor B xor CIN;
COUT := (A and B) or (A and CIN) or (B and CIN);
C := COUT & S;
end ADD;
end PKG;
use work.PKG.all;
entity procedure_package_1 is
port(
A, B : in BIT_VECTOR(3 downto 0);
CIN : in BIT;
S : out BIT_VECTOR(3 downto 0);
COUT : out BIT
);
end procedure_package_1;
architecture ARCHI of procedure_package_1 is
begin
process(A, B, CIN)
variable S0, S1, S2, S3 : BIT_VECTOR(1 downto 0);
begin
ADD(A(0), B(0), CIN, S0);
ADD(A(1), B(1), S0(1), S1);
ADD(A(2), B(2), S1(1), S2);
ADD(A(3), B(3), S2(1), S3);
S <= S3(0) & S2(0) & S1(0) & S0(0);
COUT <= S3(1);
end process;
end ARCHI;
Recursive Functions Example (VHDL)
Vivado synthesis supports recursive functions. This coding example models an n! function.
function my_func(x : integer) return integer is begin
if R > 1 then
return (R*my_func(R-1));
else
return R;
end if;
end function my_func;

VHDL断言语句

-Assert合成选项支持断言语句。

小心!使用断言时应小心。Vivado只能支持不创建的静态断言或者是由行为创建的。例如,对常量或运算符的值执行断言/一般作品;然而,作为一种资产,if语句中信号的值是不起作用的。

VHDL预定义包

Vivado synthesis支持STD和IEEE中定义的VHDL预定义包标准库。这些库是预编译的,不需要用户编译,并且可以直接包含在HDL源代码中。

VHDL预定义标准包

默认情况下包括VHDL预定义的标准包,定义以下基本

VHDL类型:bit、bit_vector、integer、natural、real和boolean。

VHDL IEEE包

Vivado synthesis支持一些预定义的VHDL IEEE包,这些包在IEEE库和以下IEEE包:

•数字比特

○ 基于位的无符号和有符号矢量类型。

○ 重载的算术运算符、转换函数和这些的扩展函数类型。

•std_logic_1164

○ std_logic、std_ulogic、std_logic_vector和std_ulogic_vector类型。

○ 基于这些类型的转换函数。

•数字_std

○ 基于std_logic的无符号和有符号矢量类型。

○ 重载的算术运算符、转换函数和这些的扩展函数类型。相当于std_logic_arith。

•已修复_pkg

○ 用于固定变量和接点类型。

○ 使用ieee.fixed_pkg.all;

•浮动_pkg

○ 用于浮动变量和引脚类型。

○ 使用ieee.float_pkg.all;

VHDL旧版包

•std_logic_arith(Synopsys)

○ 基于std_logic的无符号和有符号矢量类型。

○ 重载的算术运算符、转换函数和这些的扩展函数类型。

•std_logic_sunsigned(Synopsys)

○ std_logic和std_logic_vvector的无符号算术运算符

•std_logic_signed(Synopsys)

○ std_logic和std_logic_vvector的有符号算术运算符

•std_logic_misc(Synopsys)

○ std_logic_1164包的补充类型、子类型、常量和函数,如and_reduce和or_reduce。

VHDL预定义的IEEE实型和IEEE数学

包装

VHDL预定义的IEEE真实类型和IEEE math_real包仅支持计算,例如泛型值的计算,并且不能用于描述可合成的功能。

VHDL实数常量

下表描述了VHDL实数常量。

VHDL实数函数

下表描述了VHDL实数函数:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cckkppll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值