VHDL基础2
Signals & Variables
VHDL 提供了 signal
和 variable
两种对象来处理非静态数据;提供了 constant
和 generic
来处理静态数据。
constant
和 signal
是全局的,可以在顺序执行的代码中,也可以在并发执行的代码中;variable
是局部的,只能值顺序代码中,并且它们的值是不能向外传递的(如果想传递出去,必须先把这个变量值传递给一个信号,再由这个信号传递出去)。
constant
constant 可以定义在 package, entity, architecture 中,对应的作用域也不同。
-
定义在 package 中的 constant 是真正的全局的,可以被所有调用该 package 的 entity 使用
-
定义在 entity 中的 constant 对于该 entity 的所有 architecture 而言是全局的
-
定义在 architecture 中的 constant 仅在该 architecture 中是全局的
signal
VHDL 中的 signal
代表的是逻辑电路中的 “硬”连线,既可以用于电路的输入输出端口,也可以用于 内部单元之间的连接。
variable
相比于 signal 是局部的,variable 只能在 process,function,procedure 中使用,而且对它的赋值是立即更新的,新的值可以在下一行代码中立即使用。
Packages and Components
package
除了 component
, function
, procedure
之外,package 中还可以包含 TYPE
, CONSTANT
的定义。
1 PACKAGE package_name IS 2 (declarations) 3 END package_name; 4 5 [PACKAGE BODY package_name IS 6 (delarations 7 and conments) 8 END package_name;]
可以看到,语法包括两部分,PACKAGE
和 PACKAGE BODY
。
Component
一个 component 是一段完整的代码(包括 library, entity, architecture 这些组成部分),如果将这些代码声明为一个 component,那么就可以被其他电路调用,从而使代码具有了层次化的结构。
使用 component 必须先声明这个元件,然后再例化这个元件(类似 C++,变量先声明,在定义)。声明和例化都必须在 architecture 中进行。
declaration syntax
1 COMPONENT component_name IS 2 --元件端口信息 3 PORT( 4 port_name: signa_type; 5 port_name: signa_type; 6 ...); 7 END COMPOMENT;
instantiation(例化) syntax
1 例化名: component_name PORT MAP (port_list);
声明元件时,可以有两种方法:
-
上面的方法,先声明再例化
-
使用 package 进行声明,将 component 的声明放在 package 中,则可以避免每次元件例化都要重复声明
Functions and Procedure
function 和 procedure 统称为 子程序,它们和 process 相似,内部包含的都是顺序描述的代码,通常使用相同的顺序描述语句。但是,function 和 procedure 的存在主要是为了建库,以达到代码重用和共享的目的,当然它们也可以直接建立在主代码中。
Function
在写代码的过程中,我们通常会遇到一些有共性的问题,我们希望实现这些功能的代码可以被共享和重用,从而使代码变得简洁,易于理解,function 的建立和使用就能达到这个目睹。 function 中可以使用 if
, case
, loop
等语句,但是不能有 signal
和 component
。
Function Body
1 FUNCTION function_name [<参数列表>] RETURE 数据类型 IS 2 [说明部分] 3 4 BEGIN 5 (顺序语句) 6 END function_name;
其中,函数的参数列表:
1 <parameter list> =[CONSTANT] name : type; 2 = SIGNAL name : type;
Function Call
函数可以单独构成表达式,也可以作为表达式的一部分
Function Location
函数可以存放在两个地方:
-
Package 中,这时候,函数声明在 package 中,函数定义在 package body 中
-
Main Code 中,既可以在 entity 中,也可以在 architecture 中
FUNCTION versus PROCEDURE Summary
-
function 有任意个输入参数和一个返回值,输入参数只能是 constant, signal
-
procedure 有任意个输入/输出/双向参数,可以是 signal, variable, constant
-
function 可以作为表达式的一部分,procedure 直接调用
-
function 和 procedure 内部,wait 和 component 都不可综合
-
function 和 procedure 的存放位置相同,经常位于 package 中,也可以在主代码中