本文介绍了 VHDL,一种硬件描述语言,以及它在描述数字电路时的结构。我们还将回顾一些介绍性示例电路描述,并触及“std_logic”和“bit”数据类型之间的区别。
VHDL是数字电路设计中常用的硬件描述语言(HDL)之一。VHDL 代表 VHSIC 硬件描述语言。反过来,VHSIC 代表超高速集成电路。
VHDL 于 1981 年左右由美国国防部发起,在 IBM 和德州仪器等公司的合作下,1985 年发布了 VHDL 的第一个版本。1984 年发明了第一块 FPGA 的赛灵思很快在其产品中支持了 VHDL。从那时起,VHDL 已经发展成为数字电路设计、仿真和综合方面的成熟语言。
在本文中,我们将简要讨论 VHDL 代码在描述给定电路时的一般结构。我们也会通过一些介绍性的例子来熟悉一些常用的数据类型、运算符等。
让我们考虑一个简单的数字电路,如图 1 所示。
此图显示有两个输入端口 a 和 b,以及一个输出端口 out1。该图表明输入和输出端口是一位宽。该电路的功能是对两个输入进行“与”运算并将结果放在输出端口上。
VHDL 使用类似的描述;但是,它有自己的语法。例如,它使用以下代码行来描述该电路的输入和输出端口:
1 entity circuit_1 is
2 Port ( a : in STD_LOGIC;
3 b : in STD_LOGIC;
4 out1 : out STD_LOGIC);
5 end circuit_1;
让我们逐行分解这意味着什么。
第 1 行:代码的第一行指定要描述的电路的任意名称。位于关键字“entity”和“is”之间的单词“circuit_1”决定了该模块的名称。
第 2 到 4 行:这些行指定电路的输入和输出端口。将这些线路与图 1 的电路进行比较,我们看到电路的端口及其特性列在关键字“端口”之后。例如,第 3 行说我们有一个名为“b”的端口。该端口是一个输入,如冒号后的关键字“in”所示。
关键字“std_logic”指定了什么?正如我们将在本文后面讨论的那样,std_logic 是 VHDL 中常用的数据类型。它可以用来描述一位数字信号。由于图 1 中的所有输入/输出端口都将传输 1 或 0,因此我们可以对这些端口使用 std_logic 数据类型。
第 5 行:此行确定“实体”语句的结束。
因此,代码的实体部分指定了 1) 要描述的电路的名称和 2) 电路的端口及其特性,即输入/输出和这些端口要传输的数据类型。代码的实体部分实际上描述了模块与其周围环境的接口。由讨论的“实体”语句指定的上述电路的特征在图 1 中以绿色显示。
除了电路与其环境的接口之外,我们还需要描述电路的功能。在图 1 中,电路的功能是对两个输入进行“与”运算并将结果放在输出端口上。为了描述电路的操作,VHDL 添加了“架构”部分并将其与实体语句定义的电路_1 相关联。描述该电路架构的 VHDL 代码将是
6 architecture Behavioral of circuit_1 is
8 begin
9 out1 <= ( a and b );
10 end Behavioral;
第 6 行:此行为将在下一行中描述的架构命名为“行为”。该名称位于关键字“architecture”和“of”之间。它还将这种架构与“电路_1”相关联。换言之,该架构将描述“电路_1”的操作。
第 8 行: 这指定了架构描述的开始。
第 9行 第 9 行使用 VHDL 的语法来描述电路的操作。两个输入 a 和 b 的 AND 在括号内,结果使用赋值运算符“<=”赋值给输出端口。
第 10 行 这指定了架构描述的结尾。如上所述,这些代码行描述了电路的内部操作,这里是一个简单的与门(在图 1 中以蓝色显示)。
将我们到目前为止讨论的内容放在一起,我们几乎完成了用 VHDL 描述“Circuit_1”。我们得到以下代码:
1 entity circuit_1 is
2 Port ( a : in STD_LOGIC;
3 b : in STD_LOGIC;
4 out1 : out STD_LOGIC);
5 end circuit_1;
-----------------------------------------------------
6 architecture Behavioral of circuit_1 is
8 begin
9 out1 <= ( a and b );
10 end Behavioral;
但是,我们仍然需要添加几行代码。这些行将添加一个包含一些重要定义的库,包括数据类型和运算符的定义。一个库可能由多个包组成(参见下面的图 2)。我们必须使给定库的所需包对设计可见。
由于上述示例使用数据类型“std_logic”,我们需要将“ieee”库中的“std_logic_1164”包添加到代码中。请注意,std_logic 数据类型的逻辑运算符也在“std_logic_1164”包中定义——否则我们必须使相应的包对代码可见。最终代码将是
1 library ieee;
2 use ieee.std_logic_1164.all
3 entity circuit_1 is
4 Port ( a : in STD_LOGIC;
5 b : in STD_LOGIC;
6 out1 : out STD_LOGIC);
7 end circuit_1;
-----------------------------------------------------
8 architecture Behavioral of circuit_1 is
9 begin
10 out1 <= ( a and b );
11 end Behavioral;
在这里,我们创建两条新线以超越我们已经创建的内容。第一行添加库“ieee”,第二行指定需要此库中的包“std_logic_1164”。由于“std_logic”是一种常用的数据类型,我们几乎总是需要将“ieee”库和“std_logic_1164”包添加到VHDL代码中。
我们可以使用 Xilinx ISE 仿真器来验证上述 VHDL 代码的运行情况。
现在我们熟悉了 VHDL 代码中的基本单元,让我们回顾一下最重要的 VHDL 数据类型之一,即“std_logic”数据类型。
如上所述,“std_logic”数据类型可用于表示一位信号。有趣的是,还有另一种 VHDL 数据类型“位”,它可以采用逻辑 1 或逻辑 0。
那么,如果“位”数据类型已经涵盖了数字信号的高低状态,为什么我们还需要 std_logic 数据类型呢?好吧,数字信号实际上不限于逻辑高和逻辑低。考虑一个三态逆变器,如图 3 所示。
当“enable”为高电平时,“data_output”连接到 Vdd 或接地;然而,当“enable”为低电平时,“data_output”处于浮动状态,即它没有与 Vdd 或地的低阻抗连接,而是对外部电路呈现“高阻抗”。“std_logic”数据类型允许我们通过分配值“Z”来描述高阻抗模式下的数字信号。
还有另一种状态——即除了逻辑高、逻辑低和高阻抗之外——可用于数字电路的设计。有时我们并不关心特定输入的值。在这种情况下,用“无关”表示信号的值可以导致更有效的设计。“std_logic”数据类型支持“不关心”状态。这为查找表提供了更好的硬件优化。
“std_logic”数据类型还允许我们通过分配值“U”来表示未初始化的信号。这在用 VHDL 模拟一段代码时会很有帮助。事实证明,“std_logic”数据类型实际上可以取九个值:
'U':未初始化
“1”:逻辑高电平的常用指标,也称为“强制高电平”
“0”:逻辑低电平的常用指标,也称为“强制低电平”
“Z”:高阻抗
'-':不在乎
'W':弱未知
'X':强制未知
'H':弱高
'L':弱低
在这些值中,我们通常使用“0”、“1”、“Z”和“-”。
让我们看一个例子。
为图 4 中的电路编写 VHDL 代码。
一般程序与前面的示例几乎相同。代码如下:
1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;
----------------------------------------------------
3 entity circuit_2 is
4 Port ( a : in STD_LOGIC;
5 b : in STD_LOGIC;
6 c : in STD_LOGIC;
7 d : in STD_LOGIC;
8 out1 : out STD_LOGIC;
9 out2 : out STD_LOGIC);
10 end circuit_2;
-----------------------------------------------------
11 architecture Behavioral of circuit_2 is
12 signal sig1: std_logic;
13 begin
14 sig1 <= ( a and b );
15 out1 <= ( sig1 or c );
16 out2 <= (not d);
17 end Behavioral;
第 1 行和第 2 行:这些行将所需的库和包添加到代码中。由于使用了“std_logic”数据类型,我们必须添加“std_logic_1164”包。
第 3-10 行:这些行指定模块的名称及其输入/输出端口。这部分代码对应于图 4 中的绿色部分。
第 11-17 行:这部分代码描述了电路的操作(图 4 中的蓝色部分)。您可能已经注意到,图 4 中有一个内部节点;它被标记为“sig1”。我们使用“entity”中的“port”语句来定义输入/输出端口,但是我们如何定义电路的内部节点呢?为此,我们使用“信号”关键字。
在上述代码的第 12 行,“signal”关键字告诉综合软件电路中有一个节点标记为“sig1”。与端口的定义类似,我们在冒号后使用关键字“std_logic”来指定所需的数据类型。现在我们可以给这个节点赋值(第 14 行)或使用它的值(第 15 行)。
为图 5 中的电路编写 VHDL 代码。
该电路是一个二对一的多路复用器。当“sel”为高时,无论“b”的值如何,下与门的输出都将为低。我们可以说与门阻止“b”传播到“sig2”。另一方面,由于“sel”为高电平,上与门的输出将跟随“a”。或者,等效地,“a”将达到“sig3”。由于在这种情况下“sig2”为低电平,因此或门的输出将与“sig3”相同。因此,当“sel”为高时,“out1”将与“a”相同。
类似的讨论将揭示,当“sel”较低时,“out1”将取“b”的值。因此,基于“sel”的值,我们可以允许一个输入或另一个到达输出。这称为多路复用,电路称为多路复用器。
我们可以使用以下代码来描述图 5 的电路:
1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;
-----------------------------------------------------
3 entity circuit_3 is
4 Port ( a : in STD_LOGIC;
5 b : in STD_LOGIC;
6 sel : in STD_LOGIC;
7 out1 : out STD_LOGIC);
8 end circuit_3;
-----------------------------------------------------
9 architecture Behavioral of circuit_3 is
10 signal sig1, sig2, sig3: std_logic;
11 begin
12 sig1 <= ( not sel );
13 sig2 <= ( b and sig1 );
14 sig3 <= ( a and sel );
15 out1 <= ( sig2 or sig3 );
16 end Behavioral;
在本文中,我们讨论了 VHDL 是什么、它的结构,并介绍了一些如何使用它来描述数字电路的示例。您现在应该对以下几点有了更好的理解:
代码的“实体”部分指定 1)要描述的电路的名称和 2)电路的端口;它建立了模块与其周围环境之间的接口。
代码的“架构”部分描述了电路的内部操作。
VHDL 库包含重要的定义,包括数据类型和运算符的定义。一个库本身可能包含几个包。
我们几乎总是需要将“ieee”库和“std_logic_1164”包添加到我们的 VHDL 代码中。
在“std_logic”数据类型的可能值中,我们通常使用“0”、“1”、“Z”和“-”。
今天小编带来了:ISSCC2022套餐,里面有文章、PPT、Tutorial等,同学可以拿回去自己学习研究。
1、深入理解SerDes(Serializer-Deserializer)之一
2、深入理解SerDes(Serializer-Deserializer)之二
3、科普:深入理解SerDes(Serializer-Deserializer)之三
4、资深工程师的ESD设计经验分享
5、干货分享,ESD防护方法及设计要点!
6、科普来了,一篇看懂ESD(静电保护)原理和设计!
7、锁相环(PLL)基本原理 及常见构建模块
8、当锁相环无法锁定时,该怎么处理的呢?
9、高性能FPGA中的高速SERDES接口
10、什么是毫米波技术?它与其他低频技术相比有何特点?
11、如何根据数据表规格算出锁相环(PLL)中的相位噪声
12、了解模数转换器(ADC):解密分辨率和采样率
13、究竟什么是锁相环(PLL)
14、如何模拟一个锁相环
15、了解锁相环(PLL)瞬态响应
16、如何优化锁相环(PLL)的瞬态响应
17、如何设计和仿真一个优化的锁相环
18、锁相环(PLL) 倍频:瞬态响应和频率合成
19、了解SAR ADC
20、了解 Delta-Sigma ADC
21、什么是数字 IC 设计?
22、什么是模拟 IC 设计?
23、什么是射频集成电路设计?
24、学习射频设计:选择合适的射频收发器 IC
25、连续时间 Sigma-Delta ADC:“无混叠”ADC
26、了解电压基准 IC 的噪声性能
27、数字还是模拟?I和Q的合并和分离应该怎么做?
28、良好通信链路性能的要求:IQ 调制和解调
29、如何为系统仿真建模数据转换器?
30、干货!CMOS射频集成电路设计经典讲义(Prof. Thomas Lee)
31、使用有效位数 (ENOB) 对 ADC 进行建模
32、以太网供电 (PoE) 的保护建议
33、保护高速接口的设计技巧
34、保护低速接口和电源电路设计技巧
35、使用互调多项式和有效位数对 ADC 进行建模
36、向 ADC 模型和 DAC 建模添加低通滤波器
37、揭秘芯片的内部设计原理和结构
38、Delta-Sigma ADCs中的噪声简介(一)
39、Delta-Sigma ADCs中的噪声简介(二)
40、Delta-Sigma ADCs 中的噪声简介(三)
41、了解Delta-Sigma ADCs 中的有效噪声带宽(一)
42、了解Delta-Sigma ADCs 中的有效噪声带宽(二)
43、放大器噪声对 Delta-Sigma ADCs 的影响(一)
44、放大器噪声对 Delta-Sigma ADCs 的影响(二)
45、参考电压噪声如何影响 Delta Sigma ADCs
46、如何在高分辨率Delta-Sigma ADCs电路中降低参考噪声
47、时钟信号如何影响精密ADC
48、了解电源噪声如何影响 Delta-Sigma ADCs
49、运算放大器简介和特性
50、使用 Delta-Sigma ADCs 降低电源噪声的影响
51、如何设计带有运算放大器的精密电流泵
52、锁定放大器的基本原理
53、了解锁定放大器的类型和相关的噪声源
54、用于降低差分 ADC 驱动器谐波失真的 PCB 布局技术
55、干货!《实用的RFIC技术》课程讲义
56、如何在您的下一个 PCB 设计中消除反射噪声
57、硅谷“八叛徒”与仙童半导体(Fairchild)的故事!
1、免费公开课:ISCAS 2015 :The Future of Radios_ Behzad Razavi
2、免费公开课:从 5 微米到 5 纳米的模拟 CMOS(Willy Sansen)
3、免费公开课:变革性射频毫米波电路(Harish Krishnaswamy)
4、免费公开课:ESSCIRC2019-讲座-Low-Power SAR ADCs
5、免费公开课:ESSCIRC2019-讲座-超低功耗接收器(Ultra-Low-Power Receivers)
6、免费公开课:CICC2019-基于 ADC 的有线收发器(Yohan Frans Xilinx)
7、免费公开课:ESSCIRC 2019-有线与数据转换器应用中的抖动
8、免费公开课:ISSCC2021 -锁相环简介-Behzad Razavi
9、免费公开课:ISSCC2020-DC-DC 转换器的模拟构建块
10、免费公开课:ISSCC2020-小数N分频数字锁相环设计
11、免费公开课:ISSCC2020-无线收发器电路和架构的基础知识(从 2G 到 5G)
12、免费公开课:ISSCC2020-从原理到应用的集成变压器基础
13、免费公开课:ISSCC2021-射频和毫米波功率放大器设计的基础
摩尔学堂(www.moorext.com)--摩尔学堂专注于半导体人才培训,在线学习服务平台!