前言
本文是本人在自学VHDL时进行的整理,学习教材为《VHDL数字电路设计教程》,若整理有误欢迎指正,若需要相关参考资料,可私信获取。
VHDL结构
一段完整的VHDL代码由库(LIBRARY)、实体(ENTITY)和构造体(ARCHITECTURE)构成,其中
- 库(LIBRARY)列出当前设计中需要用到的所有库文件
- 实体(ENTITY)给出了电路外部连接端口(PROTS)的定义
- 构造体(ARCHITECTURE)描述电路实现的功能
库(LIBRARY)
库的基本组成部分如下图
VHDL中三个常用的库:ieee库,std库,work库
- ieee库:主要包含一些定义数据类型的包集。
- std库:VHDL设计环境的标准资源库,包括数据类型和输入/输出文本等内容。std库存放有包集Standard和textio。
- work库:当前工作库,当前设计的所有代码都存放在work库中,使用work库不需要任何声明。
库的声明
LIBRARY library_name;
USE library_name.package_name.package_parts;
例
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY std;
USE std.standard.all;
LIBRARY work;
USE work.all;
std库和work库在程序中都是默认“可见”的,因此不需要对它们进行声明;只有ieee库在使用前需要进行明确的声明。
实体(ENTITY)
实体用于描述电路的所有输入/输出引脚,语法结构如下
ENTITY entity_name IS
PORT(
port_name:signal_mode signal_type;
port_name:signal_mode signal_type;
...
);
END entity_name;
端口的信号模式(signal_mode)有四种可选:
- IN:单向输入
- OUT:单向输出(该输出不能供电路内部使用)
- INOUT:双向口
- BUFFER:单向输出(该输出信号只能供电路内部使用)
信号的类型包括BIT,STD_LOGIC,INTEGER等,之后会介绍
例,描述一个与非门的端口
ENTITY nand_gate IS
PORT(
a,b:IN BIT;
x:OUT BIT;
)
END nand_gate;
当输入输出有多个位时,在类型后面添加
例如,下图的多路选择器ENTITY如下
ENTITY mux IS
PORT(
a,b: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
sel: IN STD_LOGIC_VECTOR(1 DOWNTO 0);
c: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END mux;
构造体(ARCHITECHURE)
构造体用于描述实现电路行为和实现的功能,语法结构如下:
ARCHITECTURE architecture_name OF entity_name IS
[declarations]
BEGIN
(code)
END architecture_name;
构造体包含两个主要部分:
- 声明(declaration),该部分是可选的,用于对信号和常量等进行声明;
- 代码(code),用来描述电路的行为(功能)。
例,描述与非门逻辑
ARCHITECTURE myarch OF nand_gate IS
BEGIN
x <= a NAND b;
END myarch
整体结构实例:
带有异步复位的D触发器
--库
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--实体
ENTITY dff IS
PORT(
d,clk,rst:IN STD_LOGIC;
q:OUT STD_LOCIG
);
END dff;
--结构
ARCHITECTURE behavior OF dff IS
BEGIN
PROCESS(rst,clk) BEGIN --PROCESS内部的代码是顺序执行的
IF(rst = '1')THEN
q<='0';
ELSIF(clk`EVENT AND clk='1')THEN
q<=d;
END IF;
END PROCESS;
END behavior;
“<=”操作符用来给信号(SIGNAL)赋值,而“:=”用来给变量(VARIABLE)赋值,默认情况下,ENTITY中所有的端口都是信号
尽管VHDL内部是并发执行的(相对于顺序执行的计算机而言),但是要实现时序电路(随时钟节拍一步步顺序工作的电路),必须使用顺序执行的代码PROCESS
PROCESS内部的代码是顺序执行的,但是PROCESS作为整体时与外部其他语句并发执行
注释行,当出现“--”时,表示后续文字为注释,直到该行结束。
VHDL不区分大小写