《逻辑与计算机设计基础(原书第5版)》——2.9 硬件描述语言—VHDL

2023-10-29

2.9 硬件描述语言—VHDL

由于硬件描述语言用来描述和设计硬件,故在使用该语言编程时,应牢记底层的硬件实现,特别是当你的设计将用来综合时。例如,如果忽略将要生成的硬件,那么你可能会用低效的硬件描述语言设计出一个大且复杂的门级结构,而实际上只需少量门的简单结构即可实现。出于这种原因,我们开始重点讲述用VHDL语言详细地描述硬件,然后再进行更抽象的高层次的描述。
本章所选的实例用于说明VHDL是一个很好地描述数字电路的可选方法。首先,我们采用结构化的描述方法,用VHDL而不是原理图对图2-27中的二位大于比较器电路进行描述。这个例子介绍了VHDL的许多基本概念。image
然后,我们采用高层次的行为描述方式设计这个电路,以进一步介绍VHDL的基本概念。
例2-16 二位大于比较器电路的VHDL结构描述
图2-28给出了图2-27中二位大于比较器电路的VHDL描述。这个实例可以用来说明VHDL的许多常见特性和电路的结构描述。

image

两条短线“--”和行末之间的语句称为注释(comment),图2-28中的描述一开始是两行注释,用以说明该程序的功能以及与图2-27的关系。为了便于说明该描述,在每行的右边采用注释标注了行号。作为一种语言,VHDL有其语法规则,它准确地描述了可以使用的合法结构。这个实例将介绍VHDL语法的一些内容,特别要注意描述中分号、逗号与冒号的用法。
首先,我们跳过第3、4行,将注意力集中到整个结构上。第6行声明了一个实体(entity),这是VHDL设计中的一个基本单元。像对原理图中的一个逻辑符号一样,在VHDL中我们需要对设计命名,定义其输入/输出端口,这些是实体声明(entity declar-ation)的职能。entity和is是VHDL中的关键词。用粗体标示的关键词有特殊的含义,不能用来命名实体、输入/输出端口或者信号。语句entity comparator_greater_than_structural is声明了一个名为comparator_greater_than_structural的设计。VHDL大小写不敏感(例如,用相同字母的大写或小写命名的名字和关键词不能区分)。COMPARATOR_greater_than_Structural和comparator_Greater_than_structural以及comparator_greater_than_Structural是相同的。
接下来,从第7~9行的端口声明(port declaration)用来定义输入和输出端口,就像在原理图中对逻辑符号所做的那样。对于这个设计实例,它有二个输入信号:A和B。这些信号通过模式in指定为输入端口。同样,A_greater_than_B通过模式out指定为输出端口。VHDL是一种强类型语言,所以输入和输出信号的数据类型必须事先声明。在此例中,输出信号的类型为std_logic(标准逻辑类型(standard logic))。类型声明指定了输入输出信号的值以及对这些信号可能执行的操作。标准逻辑类型有9个值,其中包括常用的二进制值0和1以及两个附加值X和U。X表示未知值,U表示未初始化。我们选择使用标准逻辑,因为一般的仿真工具都用到这些值。
输入A和B说明了VHDL的另一个概念,即std_logic_vector(标准逻辑向量)。两个输入中的每一个都是二位宽,因此把它们定义为std_logic_vector,而不是独立的std_logic信号。我们使用下标来对向量寻址。由于A包含两个编号为0和1的输入信号,1是最高有效位(最左边),故A的下标是由1降至0。这个向量的成员是A(1)和A(0)。同样,B包含两个编号为1和0的输入信号,故它的下标也是由1降至0。从第32行开始,注意std_logic_vector类型的信号是如何通过指定信号名与用括号括起的下标来引用的。如果希望向量的下标由小到大显示,那么在VHDL中可采用另一种不同的标记方法。例如,signal N:std_logic_vector(0 to 3)定义了信号N的第一位(最左边)为N(0),最后一位(最右边)为N(3)。也可以引用子向量(例如,N(1 to 2),表示引用N的中间两个信号N(1)和N(2))。
为了使用std_logic和std_logic_vector类型,有必要对该类型的值和操作进行定义。为方便起见,我们可以采用一个由预编译的VHDL代码组成的程序包(package)来完成预定义。包一般存放在称为库(library)的目录中,而库可被一些或所有用户共享。对于std_logic,基本包是ieee.std_logic_1164,这个包定义了std_logic与std_ulogic类型的值和基本的逻辑操作。为了使用std_logic,我们在第3行调用了包含包的ieee库,在第4行调用了ieee.std_logic_1164.all包,表示我们会用到ieee库中ieee.std_logic_1164包内的所有定义。另外,lcdf_vhdl库包含了func_prims包,该包用VHDL语言描述了基本的逻辑门、锁存器和触发器,我们通过all调用该包中的所有内容。lcdf_vhdl库的ASCII码格式可从本书的配套网站上下载。注意,第3、4行语句后紧跟着实体部分。如果另一个实体也将用到std_logic类型和fun_prims中的元件,那么库和使用语句必须重复放在实体声明之前。
实体声明以关键词end结束,其后紧跟实体名。到目前为止,对于这个电路我们已经讨论了与原理图中逻辑符号等效的VHDL描述
结构化描述 接下来,我们要描述电路的功能。实体功能的描述称作实体的结构体(architecture),因此第12行声明了实体comparator_greater_than_structural的结构体structural。以下将介绍结构体的详细语法。在此实例中,根据图2-27的电路图,我们采用与原理图等价的结构化描述(structural description)方式来设计电路。
首先,在第15~29行声明了我们将在描述中要用到的门类型。由于我们采用门来实现电路,所以声明了一个反相器NOT1,一个二输入与门AND2,一个三输入与门AND3和一个三输入或门OR3作为组件(component)。这些门的VHDL描述包含在包func_prims中,包func_prims包含了这些门的实体与结构体。组件声明中的名字与端口声明必须与其对应的实体完全一致。对于NOT1,端口指定的输入名为in1和输出名为out1。对于AND2,其组件声明部分中输入名为in1和in2,输出名为out1。类似地,对于AND3和OR3,其组件声明部分中输入名为in1、in2和in3,输出名为out1。
接下来,在根据电路图确定这些门的相互连接之前,我们需要对电路中的所有节点进行命名。输入和输出已经命名了。图2-27中的内部节点是两个反相器的输出以及三个与门的输出,这些输出节点声明为std_logic类型的信号。not_B1和not_B0是两个反相器的输出信号,and0_out、and1_out和and2_out是三个与门的输出信号。同样,端口中声明的所有输入和输出都是信号。在VHDL中有信号和变量。变量的赋值是立即有效的。相反,信号的赋值不即刻有效,它在未来的某个时间被赋值。这个时间可以是物理时间,例如当前时间之后的2 ns,也可以是增量时间(delta time),如一个信号在当前时间上加上一个增量时间后被赋值。增量时间可以看作一个无穷小的时间量。信号赋值的时间延迟对典型的数字模拟器的内部操作来说是必不可少的,当然,基于门延时可使电路仿真结果更接近实际。但为简单起见,我们通常是验证电路功能的正确性,而不是其性能或者延时问题。对于这样的功能仿真,将时延默认为增量时间是最容易的。因此,在电路的VHDL描述中不涉及时延,但在测试程序中可能出现。
在内部信号的声明之后,以关键词begin开始结构体的主体部分。这个电路的描述由两个反相器、一个二输入与门、两个三输入与门和一个三输入或门组成。第32行给出了第一个反相器的标号为inv_0,指示了这个反相器是NOT1组件。接着是端口映射(port map),将反相器的输入与输出端口映射到相连接的信号上。信号间的映射通过符号=>关联,符号左边是门的端口,右边是所连接的信号。例如,反相器inv_0的输入是B(0),输出是not_B0。
从第33~37行给出了剩下的5个门以及与它们的输入输出端口相连的信号。这5个门使用了另外一种方法来映射逻辑门的端口。这种方法没有显式地给出元件的输入输出名称,而是假定在端口映射中连接的信号顺序与引用的元件的端口顺序一致。这样我们可以按元件端口的顺序列举信号,从而隐式地指定信号之间的连接。例如在33行,B(1)连接到输入,not_B1连接到输出。结构体以关键词end加其结构名structural结束。 ■
数据流描述法 数据流描述法是根据功能而不是结构来描述电路的,它由并发赋值语句或与之等价的语句组成。只要语句右边的一个值改变,并发赋值语句就并发(也就是并行)执行。例如,任何时候一个布尔表达式右边的某个值发生变化时,其左边的信号就会被赋值。例2-17举例说明由布尔表达式组成的数据流描述的使用方法。
例2-17 二位大于比较器电路的VHDL数据流描述
图2-29给出了图2-27中二位大于比较器电路的VHDL数据流描述。这个例子用来说明由布尔表达式组成的数据流描述方法。该程序中的库、包的使用及实体声明部分与图2-28中的相同,故在此不再重复。数据流描述从第15行开始,信号B0_n与B1_n分别通过对输入信号B(0)和B(1)进行not操作实现赋值。在第17行,B1_n和A(1)组合通过and运算得到and0_out。信号and1_out、and2_out和A_greater_than_B在第18~20行中,采用类似方法得到,A_greater_than_B使用了or运算。大家可以看到,数据流描述比图2-28中的结构描述要简单得多。

image

赋值语句执行的顺序与这些语句在模型描述中出现的顺序无关,但与赋值语句右边信号变化的顺序有关。因此,如果将图2-29中的赋值语句按其他顺序重写,例如把第15行与第20行调换,程序的行为是完全一样的。 ■
行为描述 使用并发赋值语句的数据流模型可以认为是行为描述,因为它们描述了电路的功能而不是它的结构。正如我们将在第4章介绍的那样,VHDL还提供使用在过程中按顺序执行的赋值语句来描述行为的方法,这种方法被称为算法模型化。但即使是使用并发赋值语句的数据流模型,VHDL也能够提供比逻辑级更为抽象的电路描述。
例2-18 使用when-else的二位大于比较器的VHDL描述
在图2-30中,我们使用when-else语句而不是根据电路结构得到的类似布尔方程的语句来描述多路复用器。这种电路模型使用电路所期望的数学运算而不是布尔逻辑,来描述电路的行为(例如,当A大于B时输出为1,否则为0)。只要A或者B发生变化,when后的条件将重新计算并进行相应的赋值。 ■
例2-19 使用with-select的二位大于比较器的VHDL描述
with-select是when-else的一个变种,用该语句描述的模型见图2-31。在表达式中,决策变量位于with与select之间。由表达式的值来选择赋值,表达式的值位于when的后面,每一对表达式值和赋值用逗号分开。在这个例子中,A是一个信号,它的取值决定了分配给A_greater_than_B的值。对于这个例子,A用于选择B的一个函数当作合适的输出。当A=“00”时,0赋给输出,因为对于B的所有组合函数为0。当A=“01”,输出只在B=“00”时为1,这是两位B的或非函数。当A=“10”,输出在B(1)为0时等于1,在B(1)为1时等于0,因此赋值函数是B(1)的非。当A=“11”时,输出除B=“11”时均等于1,它是两位B的与非函数。最后,当A是其他值时(when others),输出赋值为‘X’。这里的others代表没有指定的标准逻辑组合,如A的一位既不是0也不是1,比如是U。

image

这个例子对于这个特定的电路来说显得有点不自然,结果是没有像以前的方法那样直观。但是,这个例子介绍了一种非常有用的,用一组条件选择多个函数的方法。我们将在后面的章节中看到使用这类方法的电路的例子,特别是在有关多路复用器的第3章和有关寄存器传输的第6章。

image

注意when-else允许用多个不同的信号来进行决策。例如,一个模型中可以用第一个when将一个信号作为条件,在else部分用另外一个when将另一个不同的信号作为条件,等等。相反,with-select仅允许一个单一的布尔条件(如:要么是第一个信号,要么是第二个信号,但不能是两个信号)。另外,对于典型的综合工具,when-else语句会比with-select语句综合出一个更复杂的逻辑结构,因为when-else依赖于多个条件。 ■
测试程序(测试平台,测试床) 我们在第2.8节已经简要介绍过测试程序是硬件描述语言的一种模型,它的目的是用来测试另外的模型,通常称之为被测设备(DUT),测试时给输入提供激励。更复杂的测试程序还要分析被测设备的输出以保证正确性。图2-32对二位大于比较器电路给出了一个简单的VHDL测试程序。这个测试程序有几个方面与所有测试程序是一样的。第一,实体声明部分没有任何输入或输出端口(第5~6行)。第二,测试程序的结构体为DUT声明了元件(第11~15行),然后对DUT进行实例化(第17行)。结构体还声明了将要连接到DUT的输入与输出信号(第9~10行)。最后,结构体向DUT加载各种输入组合以对其在不同条件下进行测试(第18~29行)。输入值用一个称为tb的进程进行加载,进程是一个按顺序执行的语句块。这个测试程序中的tb进程在模拟开始时启动,给DUT的输入赋值,在两次赋值之间等待10 ns模拟时间,然后以永久等待实现停机。为了简单明了起见,这个例子中的进程仅使用了少量的输入组合,但它确实测试了A与B之间关系的所有三种情况(A<B,A=B和A>B)。在第4章将更详细的介绍进程,那时会讲解大量的可用于进程的顺序语句。
至此,我们完成了组合电路的VHDL介绍。在第3章和第4章我们将用语言的另外一些特点来描述更复杂的电路,从而继续加深对VHDL的了解。

image

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《逻辑与计算机设计基础(原书第5版)》——2.9 硬件描述语言—VHDL 的相关文章

  • Symbol 'ANDROID_LOG_DEBUG' could not be resolved

    调试JNI代码的时候 加入了调试函数 include
  • 如何构造LL(1)文法预测分析表

    这类题型也经常在考试中出现 一般是与判断是否为LL 1 文法放在一起进行考察 这类题目该怎么去做呢 1 求出每个非终结符的FIRST集和FOLLOW集 在上一篇文章中已经详细介绍 2 构造预测分析表 横坐标是所有的非终结符 纵坐标是所有的终
  • 【计算机视觉

    文章目录 一 STPLS3D 二 DigestPath 三 ImageNet S ImageNet Semantic Segmentation 四 OpenEDS 五 RELLIS 3D 六 SUIM Segmentation of Und
  • React解密:React Hooks函数之useEffect和useLayoutEffect

    useEffect是react hooks的又一个重要的hooks函数 Effect hooks允许你在组件中执行副作用操作 数据获取 设置订阅以及手动更改 React 组件中的 DOM 都属于副作用 不管你知不知道这些操作 或是 副作用
  • js事件的绑定方式

    我们现在绑定的事件都是 onxxxx的方式 这个是DOM0级的事件绑定方式 注 这个方式不是很好 弊端 一旦写了第二个事件 那么第一个就会被覆盖 案例 var oDiv document querySelector div oDiv onc
  • gethup.sh

    docker exec it geth cluster1 bin bash geth datadir data0 networkid 779977 console root 85547cf26bca ethutil cat gethup s
  • 某易云音乐JS逆向案例

    某易云音乐参数破解 目标 aHR0cHM6Ly9tdXNpYy4xNjMuY29tLyMvc2VhcmNoL20vP3M9JUU2JTg4JTkwJUU5JTgzJUJEJnR5cGU9MQ 某易云音乐是大家喜爱的音乐平台 有小伙伴问我 这
  • 网关的理解

    一 什么是网关 网关 Gateway 又称网间连接器 协议转换器 网关在传输层上以实现网络互连 是最复杂的网络互连设备 仅用于两个高层协议不同的网络互连 二 如何来理解网关 大家都知道 从一个房间走到另一个房间 必然要经过一扇门 同样 从一
  • Qt自绘控件之扇形统计图

    首先绘制区域扇形需要先注意一下几点 QPainter中绘制完整的圆等于5760 16 360 此处数值用于计算每一块扇形区域所显示的 需要了解一下扇形二等分线的计算方法 要注意做坐标原点转换 此处为屏幕分辨率自适应 const qreal
  • Keil 中出现“encountered an improper argument” 解决办法

    Keil 中出现 encountered an improper argument 解决办法 出现这种情况就是因为目录文件下带有中文路径 不要弄成中文路径就可以解决了
  • HyperledgerFabric资产案例链码实例

    案例分析 功能 用户开户和销户 资产登记 资产上链 与具体的用户绑定 资产转让 资产所有权变更 查询功能 用户查询 资产查询 资产变更的历史查询 业务实体 用户 名字 身份证 标识 资产列表 资产 名字 标识 特殊属性列表 车 排量 品牌
  • linux基础操作命令符(下)

    linux基础操作命令符 上 linux笔记查询 关于用户 用户的管理 用户组的管理 权限的管理 SSH 解决等待缓存 无法获得锁问题 关于ping命令 ssh 远程连接 ssh远程拷贝的命令 查看linux本地配置 查看磁盘文件目录 df
  • 亚马逊+纽约大学开源图神经网络框架DGL:新手友好,与主流框架无缝衔接

    量子位 授权转载 公众号 QbitAI 最近 纽约大学 纽约大学上海分校 AWS上海研究院以及AWS MXNet Science Team共同开源了一个面向图神经网络及图机器学习的全新框架 命名为Deep Graph Library DGL
  • 1800*D. Nested Segments(数组数组&&离散化)

    解析 按照右端点进行排序 这样某个区间包含的区间只能是在其前面的区间中 所以维护左端点 x 的出现次数 这样我们在查询某个区间 x y 的时候 只需要求 x y 之间包含多少个前面区间的 x 即可 前缀和 因为 前面区间的 y 显然小于当前
  • 微信小程序——常用组件的属性介绍

    常用的组件内容标签 text 文本组件 类似于HTML中的span标签 是一个行内元素 rich text 富文本标签 支持把HTML字符串渲染为WXML结构 text标签的基本使用 通过text组件的selectable属性 实现长按选中
  • C++中的左值与右值(二

    C 中的左值与右值 二 以前以为自己把左值和右值已经弄清楚了 果然发现自己还是太年轻了 下面的这些东西是自己通过在网上拾人牙慧 加上自己的理解写的 1 2 怎么区分左值和右值 知乎大神 顾露的回答 3 我们不能直接定义一个引用的引用 但是
  • ts重点学习85-map类型

  • Idea更新新版本报错,Some conflicts were found in the installation area.

    笔者使用的Idea是2021 2版本 今天直接升级发现报错 找了下解决方法 供大家参考 升级过程 请添加图片描述 https img blog csdnimg cn eaa75e5af7d243d8a2a3f8a731feb6c1 png
  • 【计算机视觉

    文章目录 一 检测相关 8篇 1 1 Explainable Cost Sensitive Deep Neural Networks for Brain Tumor Detection from Brain MRI Images consi
  • 基于java的出租车预约网站

    出租车预约网站能够有效的解决大家上班下班打不到车 加快吃饭逛街的效率 天阴下雨无障碍出行 自己有车不舍得开等问题 使得用户查询车辆信息更加方面快捷 同时便于管理员对车辆和用户的管理 从而给出租车管理公司的预约管理工作带来更高的效率 因此 我

随机推荐

  • CentOS 6 时间,时区,设置修改及时间同步

    一 时区 显示时区 date help 获取帮助 date R date z 上面两个命令都可 root localhost date R date z
  • 数据清洗基本概念

    1 基本概念 数据清洗从名字上也看的出就是把 脏 的 洗掉 指发现并纠正数据文件中可识别的错误的最后一道程序 包括检查数据一致性 处理无效值和缺失值等 因为数据仓库中的数据是面向某一主题的数据的集合 这些数据从多个业务系统中抽取而来而且包含
  • 从零实现一个在线考试系统

    晚上好 我是老北 公众号 GitHub 指北 会推荐 GitHub 上有用有趣的项目 挖掘开源的价值 欢迎关注 基于 SpringBoot Mybatis Plus Shiro mysql redis 构建的智慧云智能教育平台 架构上使用完
  • 前端交互设计利器--MVVM框架avalon.js

    前端交互设计 少不了使用js框架 特别是近来非常火爆的MVVM框架 MVVM框架的确是前端交互设计的利器 最近接触到国内大牛编写的前端框架 avalon js 功能强大 兼容性好 非常好用 MVVM框架核心思想是模型数据与视图绑定 改变了模
  • AI聊天机器人,你更爱哪个?

    嗨 各位同学 最近这几个人工智能助手可是火得很啊 叮咚 AI哥们儿ChatGPT已经很强了 轻松应对各种问题 文笔挺不错的 咻 Anthropic公司的Claude也很给力 聊天能力十分强大 嗖 Google新出的Bard看着也很厉害 刚一
  • 中国自主可控计算机大会、,2019CCF自主可控计算机大会召开

    nbsp nbsp nbsp nbsp光明网讯 齐柳明 7月23日至24日 2019CCF自主可控计算机大会 在北京召开 会议以 应用驱动 协同创新 自主可控发展的源泉和动力 为主题 大会在目前自主可控计算机发展态势良好基础上 针对相关信息
  • css 选择除了某个类下的所有某种元素

    要求 选择除了某个类下的所有input输入框 非页脚下的输入框高度 input not bs table foot input height 40px important line height 40px important
  • PyTorch框架中使用早停止Early Stopping(含详细代码)

    文章目录 1 什么是早停止 为什么使用早停止 2 如何使用早停止 3 Refferences 1 什么是早停止 为什么使用早停止 早停止 Early Stopping 是 当达到某种或某些条件时 认为模型已经收敛 结束模型训练 保存现有模型
  • vue.config.js基本配置

    方法一 vue3 vue config js const defineConfig require vue cli service module exports defineConfig transpileDependencies true
  • visual studio下C4146错误分析与整理

    C4146报错原因分析 标签 空格分隔 C C4146 一元负运算符应用于无符号类型 结果仍为无符号型 文章目录 C4146报错原因分析 toc 事发现场 翻车过程 翻车原因 解决方案 番外篇 事发现场 include
  • 如何看待越来越多年轻人追捧「摸鱼哲学」,拒绝努力的年轻人真比老一辈活得更通透吗?

    题目是我在知乎上看到的 有些小伙伴应该也看到了 不知道有没有触动到你 反正我是心有戚戚焉 上周五 我去了一趟郑州 见了几个大学同学 吃了一顿饭 喝了点小酒之后 我们谈了很多各自的现状 龙仔和小龙都说 公司现在的年轻人 真不知道在想些什么 任
  • Linux主流架构运维工作简单剖析

    随着IT运维的不断发展 尤其的Linux的飞速发展 越来越多的企业开始使用Linux操作系统平台 例如CentOS RedHat Ubuntu Fedora等等 成千上亿个网站涌现在当今互联网 互联网已经成为必不可少的工具 那今天我们跟大家
  • 数据库原理 知识点总结

    名词积累 数据库 Database 存放和提供数据的 库房 数据 Data 数据库中存储的基本对象 数据库管理系统 DBMS 位于用户与操作系统之间的一层数据管理软件 数据库系统 Database System 包括数据库 DBMS 应用系
  • Git提交代码或文件

    一 直接通过git命令提交 1 git add 将所有文件加到提交区 2 git commit m 注释 提交注释 3 git pull rebase origin master 拉去代码 且把提交的线路融合在一起 4 git push u
  • Java中转化Stream流及多个Stream流如何合并

    题目 如何将对象转化为Stream流及多个Stream流如何合并 特别注意基本类型数组转化成的流 准备 Java中Stream流是JDK1 8出现的新特性 Stream流多用于过滤 转换 统计等 Stream类的静态方法 Stream co
  • javaScript-----数组使用字符串作为下标

    原文地址 http blog csdn net chenssy article details 7366160 首先Array是从Object那里继承下 它具备Object所有的功能和特性 下面是Object的情况 html view pl
  • 完美的Apache静态.htaccess文件 [discuz和home带301重定向]

    完美的Apache静态 htaccess文件 discuz和home带301重定向 本帖最后由 下砂 于 2009 11 13 10 32 编辑 先后修改过三次 加了301重定向 顶级域名和论坛二级域名 后rewrite base保持 状态
  • 无法加载训练好的.h5权重

    Unable to open file unable to open file name h5 errno 2 error message No such file or directory 确认模型是正确的情况下 最好的办法是升级h5py
  • AD中如何做出爱心❤的丝印

    不知道有没有小伙伴试过在AD中做一个爱心的丝印 今天在这里就跟大家分享一下 如何做一个带爱心 的丝印 具体方法就是我们在字符串输入框中输入相应的内容和 爱心 的话可以通过搜狗输入法打一个 心 字就会弹出哦 选择字体 MS UI Gothic
  • 《逻辑与计算机设计基础(原书第5版)》——2.9 硬件描述语言—VHDL

    2 9 硬件描述语言 VHDL 由于硬件描述语言用来描述和设计硬件 故在使用该语言编程时 应牢记底层的硬件实现 特别是当你的设计将用来综合时 例如 如果忽略将要生成的硬件 那么你可能会用低效的硬件描述语言设计出一个大且复杂的门级结构 而实际