先来看一个关于D触发器设计的完整程序
library ieee;
use ieee.std_logic_1164.all; --库说明
entity dff is
port(
clk,k :in std_logic;
q :out std_logic
);
end dff; --实体说明
architecture rtl of dff is
begin
process(clk)
begin
if(clk' event and clk = '1')then
q <= d;
end if;
end process;
end rtl; --架构说明
一个完整的VHDL程序通常包括库说明、实体说明、架构说明3个部分
一、库说明
D触发器的程序库说明语句为
library ieee;
use ieee.std_logic_1164.all;
用到了ieee库以及ieee库中的std_logic_1164程序包的全部资源
库说明语句的一般语法如下:
library 库名;
use 库名.程序包名.项目名
1.1 库与程序包
什么是库?
定义:库是用VHDL编写的源程序及其通过编译的数据集合,由各种程序包组成。
说明:一旦说明了库和程序包,整个设计实体都可进入其中访问或调用,但其作用范围仅限于所说明的设计实体。VHDL要求,在一个含有多个设计实体的更大的系统中,每一个设计实体都必须要有自己完整的library语句和use语句。
什么是程序包?
定义:程序包提供了各种数据类型以及个类型转换函数及运算,以供我们使用。
1.2 IEEE标准库
IEEE 是VHDL中最常用的库之一,包含了很多常用的数据类型、包和操作符。这个库主要用于数字电路设计中,提供了各种数学、逻辑和定时功能。
常见程序包:
-
IEEE.STD_LOGIC_1164
该包定义了std_logic和std_logic_vector类型,常用于数字信号的表示,特别是二进制信号、三态信号等。library IEEE; use IEEE.STD_LOGIC_1164.ALL;std_logic:表示单比特信号,可能的值包括'0','1','Z'(高阻抗),'X'(不确定) 等。std_logic_vector:表示一组std_logic类型的信号,例如std_logic_vector(7 downto 0)代表一个8位宽度的向量。
-
IEEE.STD_LOGIC_ARITH和IEEE.STD_LOGIC_UNSIGNED
这两个包用于有符号和无符号的算术运算。不过,这两个包并非 VHDL 标准的一部分,且通常在使用时需要额外的支持。library IEEE; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -
IEEE.STD_LOGIC_UNSIGNED
提供了无符号算术运算,如加法、减法等。signal a, b : std_logic_vector(7 downto 0); signal result : std_logic_vector(7 downto 0); result <= a + b; -- 执行无符号加法 -
IEEE.STD_LOGIC_SIGNED
提供了有符号算术运算,如加法、减法等。library IEEE; use IEEE.STD_LOGIC_SIGNED.ALL; -
IEEE.STD_LOGIC_MISC
提供了额外的逻辑运算函数。 -
IEEE.STD_LOGIC_1164
提供了广泛的std_logic信号类型,包括std_logic_vector,使得你可以实现复杂的数字电路。
1.3 WORK库
WORK 是VHDL编译器默认的库,它用于存储当前项目中的设计单元(实体和架构)。你在写VHDL代码时,默认的实体和架构会编译到 WORK 库中。
WORK 库通常不需要显式声明,所有自定义的组件都会默认编译到 WORK 中。
library WORK;
use WORK.my_entity_pkg.ALL; -- 引入在 WORK 库中定义的包
二、实体
在VHDL中,实体(Entity) 是设计的一个关键概念,它定义了硬件模块的接口,包括输入、输出信号以及模块的名称。实体描述了一个模块的外部视图,而模块的内部实现则由架构(Architecture)来定义。
2.1 实体的基本结构
VHDL中的实体用于声明模块的接口,通常包含模块的端口(Ports),即模块与外部世界交互的信号。实体并不关心信号如何在内部处理,它只是提供信号的定义。
一个VHDL实体的基本结构如下:
entity entity_name is
port (
port_name_1 : mode_1 type_1;
port_name_2 : mode_2 type_2;
...
);
end entity_name;
entity_name:实体的名称,它是模块的标识符。port_name:每个端口的名称,定义了模块与外界连接的信号。mode:端口的方向,可以是以下几种之一:in:输入端口,用于从外部接收信号。out:输出端口,用于向外部输出信号。inout:双向端口,用于既能接收也能发送信号。buffer:既是输入端口,也能提供输出(与out类似,但buffer端口可以被模块内部读取)。
type:端口的类型,指定端口的信号类型(如std_logic、std_logic_vector、integer等)。
2.2 实体使用示例
示例1:简单的实体
以下是一个简单的VHDL实体的例子,描述了一个带有两个输入端口和一个输出端口的模块:
entity and_gate is
port (
A : in std_logic; -- 输入端口A
B : in std_logic; -- 输入端口B
Y : out std_logic -- 输出端口Y
);
end entity and_gate;
and_gate是该实体的名称,表示这是一个与门(AND gate)。A和B是输入端口,它们的数据类型是std_logic。Y是输出端口,它的数据类型也是std_logic。
示例2:带有多个端口的实体
以下是一个更复杂的实体,它包含多个输入端口、输出端口以及一个双向端口。
entity multiplexer is
port (
A : in std_logic; -- 输入端口A
B : in std_logic; -- 输入端口B
sel : in std_logic; -- 选择信号
Y : out std_logic; -- 输出端口Y
enable : inout std_logic -- 双向端口
);
end entity multiplexer;
A和B是输入端口,用于提供两个输入信号。sel是一个选择信号,用于决定A或B被传递到输出端口Y。Y是输出端口,传递选择的信号。enable是一个双向端口,可以在特定条件下作为输入或输出信号。
在VHDL中,架构(Architecture) 是描述硬件模块具体行为或结构的部分,它与实体(Entity)配合使用,共同定义一个完整的硬件模块。实体定义了模块的外部接口(即端口),而架构定义了模块的内部实现或功能。
一个完整的VHDL设计通常由一个实体和一个或多个架构组成。在实体部分定义了输入、输出端口和模块名称,而在架构部分则实现模块的具体功能,例如描述电路的逻辑行为、结构连接或算法。
三、架构
架构(Architecture) 是VHDL中描述硬件模块内部行为或结构的部分,配合实体(Entity)使用。
3.1 架构的基本结构
VHDL架构的基本结构如下:
architecture architecture_name of entity_name is
-- 声明部分:可以声明信号、变量、常量、类型等
begin
-- 描述部分:定义模块的行为或结构
process (... ) is
begin
-- 过程内容
end process;
end architecture architecture_name;
architecture_name:架构的名称,用于标识不同的架构。一个实体可以有多个架构。entity_name:架构所关联的实体名称,即这个架构实现了哪个实体。is:开始声明部分,可以在这里定义局部信号、常量、类型等。begin:开始描述模块行为的部分,通常包括时序过程(如process)、并行结构、组合逻辑等。
3.2 架构的两种主要类型
-
行为型架构(Behavioral Architecture)
行为型架构用于描述模块的逻辑行为,通常使用过程(process)来表达模块的功能逻辑。这种架构关注于**“做什么”**,即功能的描述。 -
结构型架构(Structural Architecture)
结构型架构用于描述模块的硬件结构,关注于**“如何连接”**。它通过将其他组件实例化并连接起来来构建一个复杂系统,通常用于描述电路中各个模块之间的连接关系。
示例 1:行为型架构
在行为型架构中,模块的功能通过描述信号之间的关系来定义,通常用

最低0.47元/天 解锁文章
1941

被折叠的 条评论
为什么被折叠?



