SlideShare a Scribd company logo
1 of 194
Download to read offline
VHDL 简 明 教 程


 王小军               编著

 乔长阁   边计年   薛宏熙    译

 边计年               审校




  清 华 大 学 出 版 社
( 京 ) 新登字 158 号

                                     内      容    提   要

     V HDL 是国际标准硬件描述语言 , 在电 子系统 自动设 计中已 十分流 行 , 成为主 要的硬 件描述 工具 , 将
成为数字系统设计领域中所有技术人员必须掌握的一种语言。
     本书是根据王小军博士 3 年来在都柏林城市大学电子系给本科生四年级 和研究生授 课时的英文 讲稿
翻译而成的 , 主要介绍 V HDL 语言的基础及其应用。书 中给出 了一些 VHDL 描述 实例 , 一些 V HDL 的 标
准程序包 , 练习题 , 实验 , 自测题 , 以及从 In ternet 网上得到有关 V HDL 的帮助及最新 信息的途径 等。书中
的实例都是经过微机上的 VHDL 模拟软件 V - System/ Windows 编译 和模拟的 , 用于逻辑 综合的实例 都经
过 SU N S PARC 工作站上的 V HDL 模拟软件 Quick VHDL 编译和模 拟 , 然后 作为逻辑综合 软件 AutoLogic
的输入而自动生成逻辑电路图。
     本书全面而系统 , 可作为电子类和计算机 类各专 业的高 年级本 科生和 研究生 的入门 教材和 教学参 考
书 , 也可作为数字电路设计人员了解 VHDL 的读物。




       版权所有 , 翻印 必究。
       本书封面 贴有清华大 学出版社 激光防伪标 签 , 无 标签者不 得销售。




    图书在版编目 ( CIP) 数据

    VHDL 简明教程/ 王小军编著 ; 乔长阁等译 . - 北京 : 清华大学出版社 , 1997
    ISBN 7- 302-02647- 5

    Ⅰ . V…    Ⅱ . ①王… ②乔…         Ⅲ . 程序语言 , V HDL- 教材        Ⅳ . TP312

    中国版本图书馆 CIP 数据核字 (97) 第 18087 号



出 版 者 : 清华大学出版社 ( 北京清华大学校内 , 邮编 100084)
             因特网网址 : www .t up .tsinghua .edu .cn
印 刷 者 : 国防工业出版社印刷厂
发 行 者 : 新华书店总店北京科技发行所
开       本 : 787 ×1092 1/ 16   印张 : 12 .25       字数 : 285 千字
版       次 : 1997 年 10 月 第 1 版     1998 年 4 月 第 2 次印刷
书       号 : ISBN 7-302- 02647-5/ TP 1365
印       数 : 4001~8000
定       价 : 19 .50 元
译     者     序

    硬件描述语言是硬件设计者和电子设计自动 化工具 之间 的界面 , 用 于数 字电路 与系 统
的描述、模拟和自动设计。目前 , 电子系统向集成化、大规模和高速度等方向发展 , 电子系统
设计自动化 ( EDA) 软件工具在市场上大量出现 , 以硬件 描述 语言 和逻辑 综合 为基础 的自 顶
向下的电路设计方法在工业界已十分流行。自 从 1987 年 VHDL 被 IE EE 确 定为标 准硬 件
描述语言 ( IEE E 标准 1076) 以来 , V HDL 迅 速出 现在各 EDA 系统 中 , 取代了 各 自的 非标 准
语言 , 并 很 快 为 数 字 系 统 的 硬 件 设 计 者 所 接 受。 1993 年 , IEE E 又 推 出 VHDL 新 的 版 本
IE EE 标准 1076-1993 , IEE E 还制定了与 VHDL 语言有关的标 准逻辑系 统程序 包 Std - Log-
ic - 1164、标准数学程序包 Math , 标 准综 合用程 序包 N umeric - St d , N umeric - Bit , 面 向 ASIC
模型 设 计 的 VHDL 基 准 VIT AL 等 , 并 正 在 制 定 数 字 系 统 与 模 拟 电 路 结 合 的 描 述 语 言
VHDL- A。我国自行开发的熊猫系统 ( PANDA ) 中 , 也已经把 V HDL 语言作为行为描述的输
入手段。近年来 , 我国高等院校也开始重视 VHDL , 许多 学校 已经把 它列 入电 子、 算机 等
                                               计
专业的教学大纲。V HDL 在硬件设计领域的作用将与 C 和 C + + 在软件设计领域的作用一
样 , 在大规模数字系统的设计中 , 它将逐步取代如 逻辑状 态表 和逻辑 电路 图等 级别较 低的、
繁琐的硬件描述方法 , 而成为主要的硬件描述工具 , 它将成为数字系统设计领域中所有技术
人员必须掌握的一种语言。
    国外介绍 VHDL 的书籍非常多 , 而我国此方面的书还非常少。本 书是根据 王小军博 士
几年来在都柏林城市大学电子系给本科生四年级 和研究 生授 课的英 文讲 稿翻 译而成 的 , 主
要介绍 VHDL 语言的基础及其应用。作为 VHDL 语言的基础 , 它可以作为电子类和计算机
类各专业的高年级本科生和研究生的入门教材和 教学参 考书 , 也 可以作 为数 字电路 设计 人
员了解 VHDL 的读物。读者可在阅读此书的基础上进一步阅读其它有关 VHDL 的书籍 , 以
便掌握更高级的 VHDL 特性和应用。我们愿意将此书介绍给读者 , 以促进 V HDL 在我国的
迅速普及。
    参加本书翻译的有以下 3 位同志 : 薛宏熙译 1~ 4 章 , 边计年 译 5 ~13 章 , 乔 长阁 译 14
~23 章。全书由乔长阁负责统稿 , 边计年对全书进行了审阅。 我们对 全书中的 程序部分 进
行了规范化处理 , 加入了图注、表注及其说明 等 , 统 一了 程序 中的大 小写 , 并 标识了 1987 年
和 1993 年 2 个版本的区别。程序中关键词一律用大写表示 , 各标准中规定的标准标识符首
字符大写。有关 1993 年版本新添加的关键词用黑体标识。除此之外 , 我们还对原书中的错
误进行了修改。书末附了主要术语的英汉对照表。
    我们在翻译过程中力求译文准确 , 风格统一 , 但 由于 时间 仓促和 译者 的水平 有限 , 不 足
之处在所难免。欢迎读者提出批评改进意见。
    译者感谢原书作者王小军博士给了我们这个 机会 , 并感 谢北 京邮电 大学 胡健栋 教授 向
我们推荐这本书。
                                                              译     者
                                                         1997 年 4 月于清华大学
                                                                         Ⅰ
前             言

   VHDL 是美国电气 和 电子 工 程 师 协 会 制 定 的 标 准 硬 件 描 述 语 言 ( IE EE 标 准 1076 ) 。
VHDL 可用于数字电路与系统的描述、模拟和自动设计。
   以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法可用于复杂的集成电路
设计以缩短设计周期。这种自顶向下的电路设计方法在欧美工业界已十分流行。大的集成
电路厂家 , 如摩托罗拉等 , 已开始使用 VHDL。美国 国防 部明确 要求 , 自 1988 年 9 月 30 日
起 , 所有为军方研制的专用集成电路必须用 V HDL 描述。教育界也开 始重视并 逐步把硬 件
描述语言 VHDL 列入大学电子系 和计 算机系 的教 学大纲。 包括 美国加 利福 尼 亚大 学戴 维
斯分校和英国曼彻斯特大学 在内 的许 多高校 的电 子系和 计算 机系 已经把 VHDL 作 为本 科
生或研究生 的 课 程。 从 帝 国 理 工 医 学 院 的 In ternet 资 料 库 里 可 以 找 到 世 界 各 地 有 关 的
VHDL 检索资料。 VHDL 在硬件设 计领 域的 作用 将与 C 和 C + + 在软 件设 计 领域 的作 用
一样。在软件设计领域 , C 和 C + + 等高级语言早已取代低级汇编 语言 , 尤其是 在大的软 件
设计项目中。同样的情况正 在硬 件设 计领域 发生。高 级硬 件设 计语 言 VHDL 将逐 步取 代
低级硬件描述语言 , 如逻辑状态表和逻辑电路图等。
   作者希望把 VHDL 介绍给国内 的读者。 本书 是以作 者 3 年来 在都 柏林 城 市大 学电 子
系给本科生四年级和研究生授课的讲稿 为基 础写 成的。该 书的英 文原 稿曾 于 1995 年 5 月
在都柏林用作一家属于菲利普 集团的 硅软 公司的 VHDL 培训 教材。本 书可 作 为电 子系 和
计算机系的高年级本科生和研究生的入门教材 , 也可以 作为 数字 电路设 计人 员了解 VHDL
的读物。书中的实例都 经过 微 机上 的 VHDL 模拟 软件 V- System/ Windows〔 1〕编译 和模 拟
的。用 于 逻 辑 综 合 的 实 例 都 经 过 SUN SPARC 工 作 站 上 的 VHDL 模 拟 软 件 Quick-
VHDL 〔2 〕编译和模拟 , 然 后作 为 逻辑 综 合 软 件 Au toLogic〔 3〕的输 入 而 自 动 生成 逻 辑 电 路
图。自动生成的逻辑电路图经过电路模拟软件进行模拟 , 已证 实其实现 了原 VHDL 模型 的
功能。
   由于作者水平有限 , 不足之处在所难 免。欢迎 读者提 出批 评改 进意见。 作者的 电子 邮
件地址为 : wangx@eeng .dcu .ie。




  〔1 〕 V- System/ Window s 是 Model Tec hnology 的 注册商 标
  〔2 〕 Qu ick V HDL 是 M en tor Graphics 的注册 商标
  〔3 〕 Aut oLog ic 是 M en tor Graphics 的注册 商标

                                                                Ⅲ
目     录

译者序 ………………………………………………………………………………………… Ⅰ
前言 …………………………………………………………………………………………… Ⅱ
1   为什么要用 VHDL ………………………………………………………………………… 1
    1 .1   为什么要用硬件描述语言 HDL        ………………………………………………… 1
    1 .2   各种 HDL 的浏览     ………………………………………………………………… 1
    1 .3   VHDL 的诞生 ……………………………………………………………………… 2
    1. 4   设计的表示方法 …………………………………………………………………… 3
    1. 5   VHDL 的能力范围 ………………………………………………………………… 4
    1. 6   一个 V HDL 的描述实例 …………………………………………………………… 5
    1. 7   VHDL 的 CAD 工具   ……………………………………………………………… 5
    习题 ………………………………………………………………………………………… 6
2   基本的 VHDL 模型结构 …………………………………………………………………… 7
    2 .1   设计实体 …………………………………………………………………………… 7
    2 .2   实体说明 …………………………………………………………………………… 7
           2 .2 .1   类属和端口说明 …………………………………………………………… 7
           2 .2 .2   端口模式 …………………………………………………………………… 8
           2 .2 .3   实体说明部分 ……………………………………………………………… 9
           2 .2 .4   实体语句部分 ……………………………………………………………… 9
    2. 3   结构体 ……………………………………………………………………………… 9
    2. 4   标识符的命名规则 ………………………………………………………………… 11
           2 .4 .1   短标识符 ………………………………………………………………… 11
           2 .4 .2   扩展标识符 ……………………………………………………………… 12
    2. 5   对象 ………………………………………………………………………………… 12
    2 .6   数据类型和子类型 ………………………………………………………………… 13
           2 .6 .1   标量类型 ………………………………………………………………… 13
           2 .6 .2   复合类型 ………………………………………………………………… 14
           2 .6 .3   存取类型 ………………………………………………………………… 17
           2 .6 .4   文件类型 ………………………………………………………………… 17
           2 .6 .5   子类型 …………………………………………………………………… 21
    2. 7   类型转换 …………………………………………………………………………… 22
           2 .7 .1   用类型标记实现类型转换 ……………………………………………… 23
           2 .7 .2   用户创建的类型转换 …………………………………………………… 23
    2. 8   词法单元 …………………………………………………………………………… 24
           2 .8 .1   注释 ……………………………………………………………………… 24
                                                   Ⅴ
2 .8 .2   数字 ……………………………………………………………………… 25
            2 .8 .3   字符 ……………………………………………………………………… 26
            2 .8 .4   字符串 …………………………………………………………………… 26
            2 .8 .5   位串 ……………………………………………………………………… 26
    习题 ……………………………………………………………………………………… 27
3   VHDL 最基本的表示方法 ………………………………………………………………… 29
    3 .1    进程语句 …………………………………………………………………………… 29
    3. 2    进程同步 …………………………………………………………………………… 32
    习题 ……………………………………………………………………………………… 33
4   并行语句 …………………………………………………………………………………… 34
    4 .1    BLOCK 语句 ……………………………………………………………………… 34
    4. 2    并行过程调用 ……………………………………………………………………… 35
    4. 3    并行断言语句 ……………………………………………………………………… 36
    4. 4    并行信号赋值语句 ………………………………………………………………… 37
            4. 4. 1   条件信号赋值语句 ……………………………………………………… 37
            4. 4. 2   选择信号赋值语句 ……………………………………………………… 38
    4. 5    元件例化语句 ……………………………………………………………………… 38
    4. 6    生成语句 …………………………………………………………………………… 40
    习题 ……………………………………………………………………………………… 41
5   顺序语句 …………………………………………………………………………………… 43
    5. 1    变量赋值语句 ……………………………………………………………………… 43
    5. 2    信号赋值语句 ……………………………………………………………………… 44
    5. 3    IF 语句 …………………………………………………………………………… 44
    5. 4    CASE 语句 ………………………………………………………………………… 45
    5. 5    LOOP 语句 ………………………………………………………………………… 45
    5. 6    NEXT 语句     ……………………………………………………………………… 46
    5. 7    EXIT 语句 ………………………………………………………………………… 47
    5. 8    断言语句 …………………………………………………………………………… 47
    5. 9    过程调用语句 ……………………………………………………………………… 47
    5. 10    RE T URN 语句 …………………………………………………………………… 48
    5. 11    N UL L 语句 ……………………………………………………………………… 48
    5. 12    REPORT 语句 …………………………………………………………………… 48
    习题 ……………………………………………………………………………………… 49
6   表达式与运算符 …………………………………………………………………………… 50
    习题 ……………………………………………………………………………………… 53
7   信号驱动源 ………………………………………………………………………………… 55
    习题 ……………………………………………………………………………………… 56
8   延迟 ………………………………………………………………………………………… 57
    8. 1    惯性延迟 …………………………………………………………………………… 57
    Ⅵ
8. 2    传输延迟 …………………………………………………………………………… 59
     8. 3    信号驱动源上传输延迟的作用 …………………………………………………… 59
     8. 4    信号驱动源上惯性延迟的作用 …………………………………………………… 60
     8. 5    信号驱动源的阈值惯性延迟的作用 ……………………………………………… 62
     8. 6    保留字 UNAFFACT ED 的使用 ………………………………………………… 63
     习题 ……………………………………………………………………………………… 64
9    模拟周期 …………………………………………………………………………………… 66
     习题 ……………………………………………………………………………………… 67
10   δ 延迟 …………………………………………………………………………………… 69
     10. 1   延缓进程 ………………………………………………………………………… 69
     习题 ……………………………………………………………………………………… 70
11   VHDL 描述实例 ( 一 ) …………………………………………………………………… 72
     11. 1   多路选择器模型 ………………………………………………………………… 72
     11. 2   译码器模型 ……………………………………………………………………… 72
     11. 3   组合逻辑模型 …………………………………………………………………… 73
     习题 ……………………………………………………………………………………… 75
12   设计库 …………………………………………………………………………………… 76
     12. 1   STD 库 …………………………………………………………………………… 76
     12. 2   WORK 库 ………………………………………………………………………… 76
     12. 3   资源库 …………………………………………………………………………… 76
             12. 3. 1   IE EE 库   ……………………………………………………………… 77
             12. 3. 2   V ITAL 库 ……………………………………………………………… 77
     12. 4   USE 子句 ………………………………………………………………………… 77
     习题 ……………………………………………………………………………………… 78
13   程序包 …………………………………………………………………………………… 79
     13. 1   STANDARD 程序包          …………………………………………………………… 80
     13. 2   T EXTIO 程序包 ………………………………………………………………… 80
     13. 3   St d - Logic - 1164 程序包 ………………………………………………………… 81
     13. 4   N umeric - Std 程序包 …………………………………………………………… 81
     13. 5   N umeric - Bit 程序包    …………………………………………………………… 81
     习题 ……………………………………………………………………………………… 81
14   属性 ……………………………………………………………………………………… 83
     14. 1   用属性检查建立和保持时间 …………………………………………………… 84
     习题 ……………………………………………………………………………………… 89
15   子程序 …………………………………………………………………………………… 90
     15. 1   子程序重载 ……………………………………………………………………… 92
     习题 ……………………………………………………………………………………… 96
16   决断信号和决断函数 …………………………………………………………………… 97
     16. 1   决断信号 ………………………………………………………………………… 97
                                                         Ⅶ
16. 2   决断函数 ………………………………………………………………………… 97
     习题 ……………………………………………………………………………………… 103
17   VHDL 描述实例 ( 二 ) …………………………………………………………………… 105
     17. 1   使能模型 ………………………………………………………………………… 105
     17. 2   振荡器模型 ……………………………………………………………………… 105
     17. 3   时钟模型 ………………………………………………………………………… 106
     17. 4   边沿触发器模型 ………………………………………………………………… 106
     习题 ……………………………………………………………………………………… 107
18   信号与变量的区别 ……………………………………………………………………… 108
     18. 1   信号赋值与变量赋值 …………………………………………………………… 108
     18. 2   进程中的变量与子程序中的变量 ……………………………………………… 110
     18. 3   共享变量 ………………………………………………………………………… 111
     习题 ……………………………………………………………………………………… 113
19   描述风格 ………………………………………………………………………………… 114
     19. 1   行为描述 ………………………………………………………………………… 114
     19. 2   数据流描述 ……………………………………………………………………… 115
     19. 3   结构描述 ………………………………………………………………………… 115
     19. 4   混合描述 ………………………………………………………………………… 117
     习题 ……………………………………………………………………………………… 118
20   配置 ……………………………………………………………………………………… 120
     20. 1   默认连接 ………………………………………………………………………… 120
     20. 2   配置指定 ………………………………………………………………………… 120
     20. 3   配置说明 ………………………………………………………………………… 121
     20. 4   直接例化 ………………………………………………………………………… 123
     习题 ……………………………………………………………………………………… 124
21   作为激励语言的 VHDL    ……………………………………………………………… 125
     21. 1   测试基准描述 …………………………………………………………………… 126
     习题 ……………………………………………………………………………………… 131
22   进一步了解 VHDL    …………………………………………………………………… 132
     22. 1   信号类 …………………………………………………………………………… 132
     22. 2   被保护的块 ……………………………………………………………………… 132
     22. 3   空事项处理 ……………………………………………………………………… 133
     习题 ……………………………………………………………………………………… 134
23   有限状态机模型 ………………………………………………………………………… 135
     23. 1   有限状态机的描述风格 ………………………………………………………… 136
     23. 2   有限状态机的描述实例 ………………………………………………………… 136
     习题 ……………………………………………………………………………………… 149
实验 1 ………………………………………………………………………………………… 151
实验 2 ………………………………………………………………………………………… 157
     Ⅷ
自测题 ………………………………………………………………………………………… 165
附录 1   何处可得到有关 VHDL 的最新信息 ……………………………………………… 171
附录 2   何处可得到有关 VHDL 的帮助 …………………………………………………… 171
附录 3   一些有用的地址 …………………………………………………………………… 171
附录 4   缩写语 ……………………………………………………………………………… 171
附录 5   VHDL 保留字 ……………………………………………………………………… 172
附录 6 STANDARD 程序包   ……………………………………………………………… 173
附录 7 TEXTIO 程序包 …………………………………………………………………… 175
附录 8 STD - LOGIC - 1164 程序包 ……………………………………………………… 176
附录 9   英汉名词对照表 …………………………………………………………………… 180
参考文献 ……………………………………………………………………………………… 182




                                                Ⅸ
1     为什么要用 VHDL

1.
 1     为什么要用硬件描述语言 HDL

    技术的飞速发展使集成电路的设计规模日 益增 大 , 复 杂程 度日 益增高。 伴随着 设计 规
模的增大 , 门级描述变得难以管理 , 不得不采用更抽象层次的描述方法 , 并接受高层次的、自
顶向下的设计方法。逻辑图和布尔方程曾经是描 述硬件 的方 法 , 但随着 系统 复杂程 度的 增
加 , 这种描述变得过于复杂 , 不便于使用。在高于 逻辑级 的抽 象层次 上 , 这种 方法很 难以 用
简练的方式提供精确的描述 , 在自顶向下的设计方法中不能再把它当作通常的描述手段 , 而
硬件描述 语 言 HDL ( hardware description language ) 则 逐 渐 成 为 满 足 以 上 要 求 的 新 方 法。
HDL 与高层次的软件程序设计语言类似 , 同时它又提供了以下功能 :
    1 . 在希望的抽象层次上 , 可以对设计进行精确而简练的描述 ;
    2 . 易于产生用户手册、服务手册等文件 ;
    3 . 在不同层次上都易于形成用于模拟和验证的设计描述 ;
    4 . 在自动设计系统中 ( 例如高层次综合工具和硅编译器 ) 作为设计输入 ;
    5 . 可以作硬件和软件的联合设计 , 消除了硬件和软件开发时间上的间隔 ;
    6 . 易于作设计的修改 , 易于把相应的修改并入设计文件中 ;
    7 . 在希望的抽象层次上 , 可以建立设计者和用户 ( 老师和学生 ) 的通信界面。
    和通常的软件程序设计语言不同 , HDL 的主要目的是用来编写设 计文件并 建立硬件 器
件的模拟模型。硬件系统的基本性质和硬件设计的方法决定了 HDL 的 主要特 性。HDL 的
语法和语义的定义是为了能描述硬件的行为 , 它应当能自然地描述硬件中并行的、非递归的
特性以及时间关系。
    正如汇编语言被高级程序设计语言所代替那样 , 门级电路框图必然被 HDL 所代替。软
件设计者很喜欢使用高级语言程序的编译方法 , HDL 和硅编译器使得 硬件设计 者也能使 用
这种高层次设计的编译方法。


1.
 2     各种 HDL 的浏览

    自从 Iverson 于 1962 年提出 HDL 以来 , 已经出现许多 HDL。其中 , 绝大多数是专有 产
品 , 包括 Silvar- lisco 公 司 的 HHDL ( hierarchical HDL ) , Zycad 公 司 的 ISP, Gateway Design
Automation 公司的 Verilog 以 及 Mentor Graphics 公司 的 BLM。高 等学 校 和科 研 单位 中 也
有上百种 HDL[ IDTC92 ] , 例如 AHPL , MI MOLA 以及 SCHOLAR。 此外 , 一 些 大型 计算 机
制造商也都有其内部使用的设计语言。例如 TIHDL 就是德 克萨斯仪 器公司 的硬件 描述 语
言 , 在该公司内部以其客户中采用 TI HDL 来描述其设计。
    某些 HDL 是从已有的软件程序设计语言发展而来 , 例如 : BLM , M I MOLA 和 SCHOL-
AR 是由 PASCAL 发展而来 , 而 Silicon Compiler 公司 的 M 以及 Gateway 公 司的 Verilog 则
                                                                               1
以 C 语言为基础。英国国防部在皇家信号和雷达研究所于 1979 年开发了 EL LA , 在 VHDL
出现之前广泛应用于欧洲。UDL / I 在日本以标准 HDL 的形式出现。多年以来 , 设计者 一
直使用这些专用的 HDL 来描述他们的 军用 或民 用芯片 设计。 为了能 继续 生存 , Verilog 和
E LLA [ MoC194] 已经公开 , 因为它们最后 将成 为为 数不多 的标 准 HDL 之 一 , 而根据 定义 ,
这样的标准不能是专用语言。
   EDI F 经常被误认为是一 种硬 件描 述 语言。事 实上 , EDI F 不是 一种 语 言 , 而 是一 种 格
式 , 正如它的名字 : 电子设计交换 格式 ( Electronic Design Interchange Format , EDI F ) 。我 们
注意到这个细小 的 差别 是 因 为 : EDIF 原来 就 不 准 备 被人 们 用 于 阅 读或 书 写。 EDI F 是 由
CAD 工具制造商们鼓动起来的 , 用 于工 作于不 同数 据格 式上 的 CAD 工 具之 间 交换 设计 数
据。EDIF 可能适合于纯描述性文 件 , 但不适 合于 重新设 计的 过程 , 因为 EDI F 中未 包含 行
为描述。


1.
 3        VHDL 的诞生

    美国国防部的项目有众多的承包人 , 他们使用过多的设计语言 , 使得承包人甲的设计不
能被承包人乙再次利用 , 这就造成了信息交换困难和设计维护困难。为了解决这个问题 , 美
国国防部为他们的超高速集成电 路计划 ( Very High Speed Integrated Circuit, VHSIC ) 提 出
了硬件描述语言 VHDL( VHSIC Hardware Description Language , VHDL) , 这 个任务 交给 了
德克 萨 斯 仪 器 公 司、IBM 公 司 和 Intermetrics 公 司。 1987 年 12 月 IEE E 接 受 VHDL
[ Leib89] 为标准 HDL , 这就是今天我们所了解的 IE EE St d 1076 - 1987 [ LRM87 ] 。此后 又
作了若干修改 , 增加了一些功能 , 新的标准版本记作 IE EE Std 1076 - 1993 [ LRM93] 。严格
地说 , VHDL’ 和 VHDL’ 并不完全兼容 ( 例如 , 增加了一些保留字并删去了某些属性 ) ,
          93      87
但是 , 对 VHDL’ 的 源 码 只 作 少 许 简 单 的 修 改 就 可 以 成 为 合 法 的 VHDL ’ 代 码
            87                                             93
[ BFMR93] 。

                            表 1. 1 VHDL 的发展过程

  年           第一季度                第二季度                  第三季度         第四季度

 1993                         第二次投票通过                           I EEE Std 1076-1993
                                                                      获批准

 1992                                                             再次投票通过

 1987       评审 1076 / A    语言参考手册 1076 / B             反对票的反应   I EEE Std 1076-1987
                                                                      获批准

 1986     VHDL 分析和标准化小组         语言参考手册                            语言参考手册
              第一次会议              第一次草稿                          第二次草稿 1076/ / A

 1985                                                   V7 .2   I EEE 开始标准化工作

 1984          V2 .0                                    V5 .0          V6 .0

 1983      美国国防部提出需求      和 TI , IBM 及 Intermet rics    开始工作
                                  公司签约


      2
1988 年 9 月 30 日之后 , 美国国防部要求开发 ASIC 的合同文件一律 采用 V HDL 文档。
VHDL 逐渐演变为工业标准的过程示于表 1 .1。


1 .4    设计的表示方法

    设计的表示方法涉及两方 面的 问 题 : 领域 和层 次。在 表 1 .2 中 , 垂 直 方向 表 示抽 象 层
次 , 水平方向表示领域。表 1 .2 中有行为、结构 和物 理等 3 个领 域。对于 每一 个领域 , 都 可
以分为 5 个 抽 象 层 次 : 系 统 级 ( architectural 或 system) 、 法 级 ( algorit hmic, sub- system 或
                                                   算
chip level ) 、寄存器传输级 ( register- transfer , functional block 或 micro - architecture ) 、逻辑 级
( logic 或 gate level ) 和电路级 ( circuit ) 。

                            表1 .
                               2    设计的表示方法 : 领域和抽象层次

                                                 领           域
        层     次
                            行      为                 结   构                  物        理

                                                CPU、存储器、开                芯片、模块、电
        系 统 级               性能描述                关、控制器以及总                路板以及子系统
                                               线之间的逻辑连接                   的物理划分

        算 法 级             I / O 应答算法                 硬件模块             部件之间的物理连接
  ( 子系统级或芯片级 )           ( 数据结构操作)                   数据结构              ( board , floor-plan )

                        并行操作 , 寄存器           ALU、多路器、寄存器、
       寄存器传输级            传输 , 状态序列            总线、微定序器、微存                 芯片、宏单元等
                            (状态表 )          储器等功能块的物理连接

        逻 辑 级               布尔方程               门、触发器、锁存器                 标准单元布图

        电 路 级               微分方程               晶体管、电阻、电容                  晶体管布图


    不幸的是 , 在一些人的概念中 , 许多抽象层次名字的含义早已和某个特定的领域有了联
系 , 而不是像表 1 .2 所示的那样和 3 个领域都有联系。例如 , 某些人可能认为逻辑级和电路
级只是结构领域的元件 ; 而算法级只是行为领域的 1 个级别 , 某些作者也把物理领域称作几
何领域。尽管如此 , 更多的人还是接受了表 1 .2 所示的名字。
    行为领域描述 1 个设计的基本功能 , 或者说该电路或设计应该做什么。从概念上讲 , 纯
行为是输入和输出关系的描述 , 例如布尔方程组就是组合逻辑网络的行为描述。
    结构领域描述逻辑结构 , 或者说描述设计的抽象实现 , 典型的是抽象模块相互连接的网
表。例如 , 在寄存器传输级 , 抽象模块是 ALU、多路选择器、寄存器等。
    物理领域描述设计的物理实现 , 或者说把结 构领域 里的 抽象 元件代 之以 真正的 物理 元
件。例如在寄 存器传 输级 , 物理领 域描述实 现 ALU 、 路选择 器和寄存 器等所需 的平面 布
                                多
图。在所有的抽象级别里 , 速度、功耗以及面积约束等通常是物理领域的一部分。
    无论是领域还是层次级别 , 他们的边界都是可以重叠的。 1 个 设计的描 述 , 通常在领 域
方面以及在层次级别方面都 可以 混合 表示。1 个典 型的 寄存器 传输 级描 述 , 通 常既 包含 行
为特性又包含结构特性 , 既包含寄存器级元件 又包 含逻辑 级元 件。任何 设计 的最终 实现 是
                                                                                         3
物理实现 , 换句话说 , 集成电路的制造数据库应当由许多多边形来表示。


1 . VHDL 的能力范围
  5

   VHDL 既可以被计算机阅 读又 可 以被 人阅 读 , 它支 持 硬件 的设 计、 证、 合 和 测试。
                                             验  综
此外 , 它还支持硬件设计数据的交换、维护、修改和硬件的实现 [ LRM87] [ WaSC89] 。
   VHDL 支持行为领域和结构领域的硬件描述 , 并且 可以 从最 抽象的 系统 级一直 到最 精
确的逻辑级。VHDL 主要优 点 之一 是 : 在描 述数 字系 统 时 , 可以 使用 前后 一 致的 语义 和 语
法跨越多个层次 , 并且使用跨越多个级别的混合描述模拟该系统。因此 , 可以对由高层次行
为描述子系统及低层次详细实现子系统所组成的系统进行模拟。
   上述特性使得系统的原始描述能够方便地 反映设 计者 的意图。 在维 护系统、 新设 计
                                         重
或更改部分设计时 , 可以用原来的测试集对修改过的 V HDL 描述重新模拟。
   VHDL 描述能力的范围示于图 1 .1 [ Hand90 ] 。




                       图 1 .1   V HDL 描述能力的范围

  请 注 意 , V HDL 并 不 具 有 描 述 模 拟 电 路 的 能 力。 虽 然 某 些研 究 的 结 果 以 实 例 表 明 ,
VHDL 的描述能力可以扩展到电路级 [ HaSt91 ] , 但是在 这个 级别上 , VHDL 不是一 种理 想
的语言。把 VHDL 的描述能力扩展到描述模 拟电路 由 IE E E 的 1076 .1 小 组进 行。该小 组
正在设计一种新语言 , 以便既能描述模拟电路 又能 描述数 模混 合电 路。这种 新语言 和我 们




   4
即将提到的 描 述 数 字 电 路 的 VHDL’ 非 常 接 近。 该 小 组 计 划 将 其 成 为 标 准 [ V Tfa94
                         93
] 〔1〕。


1.
 6       一个 VHDL 的描述实例

    图 1 .2 所示是 1 位加法器的逻辑图 , 其 V HDL 的描述如下所示 :




                                          图 1 .2   1 位加法器逻辑图

    ENTI TY one - bit - adder IS
                           ∶
     POR T ( a , b , c - in IN Bit ;
                              ∶
                c - ou t , sum O UT Bit ) ;
   END one - bit - adder ;

   ARCHI TECT URE logic OF one - bit - adder IS
               ∶
     SIG NAL int Bit ;
   BEGIN
     int < = a XOR b AFT ER 10 ns;
     c - out < = ( a AND b) OR ( int AND c - in ) AFT ER 20 ns;
     sum < = int XOR c - in AFT ER 10 ns;
   END logic;



1 . VHDL 的 CAD 工具
  7

    许多公司都提供 VHDL 工具 , 其中包括 VHDL 的创始 者 ( 例 如 In termetrics 公司 , 不 过
该公司的 VHDL 分部已被 Valid 公 司收 购 , 而 此后 不久 , Valid 公司 又 并入 Cadence 公司 ) ,
也包括一些大型 EDA 的公 司 ( 例 如 Cadence, Men tor Graphics , ViewLogic, Synopsys 等 ) ,
还包括一些专 门领 域的 公司 ( 例如 CLSI , Model- T echnology , Van tage 等 ) 。V HDL 模 拟 器
和综合器已经是商业软件 , 可以在多种工作平台上运行 ( V HDL 描述 不是 100 % 可以被综 合
的 , 不同公司提供的工具软件在描述风格和构造方面会有不同的指南和限制 , 满足这些要求
的 VHDL 描述才能被该公司提供的工具所综合 ) 。
    VHDL 技 术 小 组 ( h ttp∶ / www . vhdl . com/ V HDLVendors/ Vendors . h tm ) 已 对 许 多
                         /
VHDL 商家的工具软件作过编译。


  〔1 〕 目前仍 在制 定中。 — —译 者注
                   —

                                                                              5
欧洲有 1 个促进 元件、子系统 及微系统 技
术 发 展 的 组 织 E UROP RACTICE ( htt p∶ /
                                   /
www .te .rl .ac .uk/ europractice) , 通过他们可以
得到和 VHDL 有 关的 工 具。图 1 .3 列举 的 仅
是 VHDL 工具的一部分。
Altera
    Altera 公司 的 PLSM- V HDL ( 适 用 于 个 人
计算机 ) 和 PLSM- V HDLWS ( 适用 于 SUN4 和
HP 9000 工作站 ) 是 VHDL 的 设 计 输 入工 具 ,
支持 该公 司的 Classic, Max 5000 , Max 7000 ,       图 1 .3   VHDL 的 CAD 工具
Flex 8000 等 可 编 程 器 件 系 列。Altera 还 提 供
和 Mentor- Graphics , Cadence 以及 Synopsys 工具的接口和库。
Cadence
    该公司宣称他们的 VHDL 模拟器 ( Leapforg ) 是工业 界最快的 V HDL 模拟器 , 并且和 逻
辑综合工具的 Synergy 系列紧密相连 [ V Tfa94] 。
Mentor Graphics
    该公司 提 供 V HDL 模拟 器 QuickVHDL 和 Q uickSim II , 以及 VHDL 综 合 工具 Auto-
logic VHDL。
Synopsys
    该公司提供 VHDL 系统模拟器 ( VSS Expert ) 和 VHDL 编译器。该模拟器有 1 条命令 ,
可以告知程序的其中 1 行执行了多少次。留意观 察这些 数字 , 就 可以知 道该 模型或 测试 基
准的哪一部分执行的次数最少。
    根据设计者的输入数据以及设计者目前 所处的设 计阶段 , Synopsys 的 Design Power 可
以快速给出比较精确的功耗反馈 信息。 在设 计的早 期阶 段 , Design Power 根 据设计 者对 电
路状态转换频率的粗略估计 , 可以快速给出功耗反馈信息 , 设计者利用此信息可以对设计指
标作出折衷选择。在设计的后期 , 在门级优化阶段 , Design Power 利用门级模拟 器提供的 精
确的电路状态转换数据 , 可以给出精确的功耗反馈信息。
Model- Technology
    该公司提 供 在 个 人 计 算 机 Windows 环 境 下 运 行 的 VHDL 模 拟 器 ( V-System/ Win-
dows) , 它也有在工作站上运行的版本。
    此外 , VEDA 和 XILI NX 公司也支持 V HDL 设计输入。V EDA 有 1 个叫作 VHDL Pat h
的工具 , 它可以计算语句的作用范围、分支的作用范围、条件的作用范围、路径的作用范围和
信号的作用范围 , 并给出统计报告。

习题
1 . 什么是 VHDL ? 简述 VHDL 的发展史。
2 . 用领域和层次的概念简述 VHDL 的描述能力。
3 . VHDL 适合于设计流程中的哪些部分 ?



    6
2      基本的 VHDL 模型结构

2.
 1       设计实体

    设计实体是 VHDL 中的基本单元和最重要的抽象 , 它可以代表整个系统、 块电路板、
                                         1    1
个芯片、 个 单 元 或 1 个 门 电 路。它 可 以 代 表 像
   1
微处理器那样复 杂 的 电路 , 也可 以 代表 像 单个 逻
辑门那样简单的 电 路 , 对 于 设计 实 体可 以 代表 什
么几乎没 有 限 制。 实际 上 , 1 个 设 计 实 体 由 1 个
实体说明和 1 个 结构 体 组成 , 如图 2 .1 所 示。在
VHDL 中 , 设计实体是 1 个模块 , 这 个模块 可以是
                                              图 2 .1   设计实体的表示
设计中的 1 个元件 , 也可以是设计的顶层模块。


2.
 2       实体说明

    设计实体是 1 个初级设计单元 , 它可以单 独编 译并且 可以 被并 入设计 库。它给 实体 命
名并给实体定义 1 个接口 , 接口信息用于和其 它模 块通信。 实体 说明是 1 个 器件的 外部 视
图 , 即从器件外部看到的器件外貌 , 其中包 括该 器件 的端口。 实体说 明也 可以 定义参 数 , 并
把参数从外部传入模块内部。下面是实体说明的一般格式 , 其中的黑体字选项是 VHDL’93
语法的要求。

   ENT I TY 实体名 IS
         [ GENERIC ( 类属表 ) ; ]
         [ P OR T ( 端口表 ) ; ]
         实体说明部分 ;
   [ BEGIN
         实体语句部分 ; ]
   END [ ENTITY ] [实体名 ] ;


2 .2 .
     1   类属和 端口说明

    类属表和端口表是实体说明的头 , 它们说明用于设计实体和其外部环境通信的对象。
    类属为设计实体和其外部环境通信的静态信息提供通道 , 特别是用来规定端口的大小、
实体中子元件的数目、实体的定时特性等等。

    GEN ERIC ( [ CONS TAN T ] 名字表 : [ I N ] 子类型标识 [∶ 静态表达式 ] , … ) ;
                                                    =

    端口为设计实体和其外部环境的动态通信提供通道 , 每 个端口必 须有 1 个名字、 个 通
                                             1
信模式和 1 个数据类型。名字是该端口的标识符 , 模式说明数据通过该端口的流动方向 , 类
                                                                  7
型说明流过该端口的数据类型。

    POR T ( [ SIGNAL ] 名字 : [ 模式 ] 子类型标识 [ BUS ] [∶ 静态表达式 ] , … ) ;
                                                   =

    因为关键字 PORT 之后必须是信号类 , 所以略去关键字 SI GNAL 也不会 引起歧义。 如
果该端口和多个输出端相连 , 就要使用关键字 BUS。
    从双连符 (-- ) 到本行 之末 的一段 文字 是 V HDL 的注 释。
注释对 VHDL 正文的意义没有影响。举例如下。
                                                                    图 2 .2   半加器
    下面是图 2 .2 所示半加器的 VHDL 描述。

   -- 只有端口说明的实体说明
   ENT I TY half - adder IS            -- V HDL 不区分大小写
                  ∶
     POR T ( x , y IN Bit ;            -- 所有端口为 SIGNAL 对象类型 , 可忽略
                          ∶
               sum , carry OUT Bit ) ;
   END ENTITY half - adder ;

   -- 有类属和端口说明的实体说明
   ENT I TY andg IS
                                   ∶   ∶
     GENERIC ( t pd - hl , tpd - lh Time = 1 ns;   -- 典型延迟
                   ∶       ∶
                  n Positive = 2 ) ;               -- 与门的输入端数目
                  ∶
     POR T ( inpu t Bit - Vector ( 1 TO n) ;       -- 模式省略 , 默认为 IN 模式
                    ∶
               output O UT Bit ) ;
   END ENTITY andg ;

   -- 没有类属和端口说明的实体说明
   ENT I TY testbench IS
   END test bench ;

2 .2 .
     2   端口模 式

    在电子线路级别之上观察 1 个设计时 , 把连接点和数据流向联系起来通常会带来方便。
为满足此要求 , VHDL 提供了下述端口模式 :

    IN ( 流入实体 ) ,
    OU T ( 流出实体 ) ,
    INOU T ( 双向端口 : 既可流入 , 又可流出 ) ,
    BUFFER ( 也是双向端口 , 但限定该端口只能有 1 个源 ) 。

    VHDL 对于 端口 的读 写规则 如下 : 只 有在端 口模 式为 I N , INOU T 或 BU FFER 时 , 才
能从该端口读入数据 ; 只有在 端口 模式 为 OU T , INO U T 或 BUFF ER 时 , 才 能 向该 端口 写
数据。模式为 BU FFER 的端口和 模式 为 INOU T 的 端口 相似 之 处是 : 它 们既 可 读又 可写 ;
不同之处是 : BUFF ER 端口只能有 1 个源 ( 不管它的子类型是否是决断类型 ) 。
    VHDL’ 允许使用属性 ′
         93       Driving - Value 从 OU T 或 INO U T 端 口 读 取信 号 的驱 动 值
( 或贡献值 ) 。

2 .2 .
     3   实体说 明部分

    实体说明中的说明部分定义的项目是该实体接口中的公共信息 , 举例如下 :
    8
-- 有实体说明项目的实体说明
   ENT I TY ram IS
                  ∶
       POR T ( addr IN Bit - Vector (15 DOWNTO 0 ) ;
                     ∶
                  data OU T Bit - Vector ( 31 DOWNTO 0 ) ;
                    ∶
                  sel IN Bit ) ;
       TYPE instruction IS ARRAY ( 1 TO 5 ) of Natural ;
       TYPE program IS ARRA Y ( Natural RANGE < > ) OF instruction ;
       U SE Work .timing - pkg ;
                                                   ∶
       PROCEDUR E initialization ( SIG NAL con ten t Bit - Vector ( 31 DOWNTO 0 ) ) IS
       BEGI N
            con ten t < = ( OTHERS = > ′1′)          AFTE R some - delay ;
       END PROCED URE initialization ;
   END ENTITY ram ;

2 .2 .
     4     实体语 句部分

    实体说明中的语句是每一设计实体接口的共同部分 , 它们仅可以是下述并行语句 : 并行
断言语句、并行过程调用语句或被动进程语句。所有这些语句必须是被动语句 , 即其中不含
信号赋值。举例如下 :

-- 有实体说明项目和语句的实体说明
   U SE Work .my - pkg .ALL ;                   -- 假设 my - pkg 包含 word 类型说明
   ENT I TY latch IS
               ∶
   P OR T ( din IN word ;                       -- word 类型必须定义在 1 个程序包中
                   ∶
               dou t OU T word ;                -- 例如 my - pkg 程序包 , 程序包对该实体可见
                         ∶
               load , clk IN Bit ) ;
                  ∶   ∶
   CONSTANT set up Time = 12 ns;
   U SE Work .timing - pkg .ALL ;               -- 假设程序包 timing - pkg 包括 CheckTiming 过程
   BEGIN
       CheckTiming ( set up , din , load , clk ) ;
   END latch ;


2 .3     结构体

    结构体是次级设计单元 , 在其对应的初级设 计单元 实体 说明 被编译 并且 被并入 设计 库
之后 , 它就可以单独地被编译并且被并入该设 计库 之中。结 构体 描述 1 个设 计的结 构或 行
为 , 把 1 个设计的输入和输出之间的关系建立起来。1 个 设计实体 可以有 多个结构 体 , 分 别
代表该器件的不同实现方案。
    结构体的描述格式为 ( 其中的黑体字为 V HDL’ 的语法要求 ) :
                              93

   ARCHI TECT URE 结构体名 OF 实体名 IS
                    -- 说明语句
   BEGIN
                                                                                          9
-- 并行语句
  END [ ARCHITECTURE ] [ 结构体名 ] ;

  例如 :

  ARCHI TECT URE behavl OF half - adder IS
                           ∶
      CONSTA NT delay : Time = 5 ns ;
 BEGIN
      p1 : PROCESS          -- p1 为可选的进程标号
      BEGI N
        sum < = x XOR y AFTE R delay ;
        carry < = x AND y AFT ER delay ;
        WAI T O N x , y ;
      END PROCESS p1 ;
  END ARCHITECTURE behavl ;

  上述例子中 有 1 个 进 程 语 句。 在 该 进 程 语 句 中 , 有 2 个 信 号 赋 值 语 句 和 1 个 等 待
( WA IT) 语句。此进程语句描述了数据的传送和定时关系 , 它们合起来构成半加器的行为。
  前文已经提到 , 可以为 1 个实体说明写上 几个 结构体。 结构 体描述 中的 实体名 把结 构
体和实体说明联系了起来。下面是 1 个实体具有 2 个结构体的实例 :

 --
 -- 下面的模型与 VHDL’ 相符 , 已用 V- System / Windows V4 .2 e 进行过模拟
                93
 --
  ENT I TY coun t2 IS             -- 该实体有 2 个结构体
                   ∶   ∶
      GENERIC ( tpd Time = 10 ns ) ;
                   ∶
      POR T ( clock I N Bit ;            ∶
                                  q1 , q0 OUT Bit ) ;
  END ENTITY count2 ;

 -- count2 的一个结构体 , 另一个在下面
  ARCHI TECT URE arch1 OF coun t2 IS
 BEGIN
                ∶
      count - up PROCESS ( clock )
                                ∶       ∶
          VARIABLE coun t - value Natural = 0 ;
      BEGI N
          IF clock = ′1′THEN                    -- 时钟上升沿
                           ∶
               count - value = ( coun t - value + 1) MOD 4 ;
             q1 < = bit′ ( coun t - value / 2 ) AFT ER tpd ;
                        Val
             q0 < = bit′ ( coun t - value MOD 2 ) AF TER t pd ;
                        Val
          END IF ;
      END PROCESS count - up ;
  END ARCHITECTURE arch1 ;

 -- T 型触发器 , 用作 count2 另一个结构体的元件
  ENT I TY t - ff IS
                    ∶   ∶
      GENERIC ( t pd Time = 5 ns ) ;                 -- 默认延迟时间
   10
∶
       POR T ( clk I N Bit ;    q IN OUT Bit = ′ ;
                                 ∶         ∶ 0′)
   END ENTITY t - ff ;

   ARCHI TECT URE only OF t - ff IS
   BEGIN
       PROCESS ( clk )
       BEGI N
         IF clk = ′1′T HEN
              q < = NOT q A FTE R t pd ;
         END IF ;
       END PROCESS;
   END ARCHITECTURE only ;

   -- count2 的另一个结构体
   ARCHI TECT URE arch2 OF coun t2 IS
                              ∶
       SIG NAL ff0 , ff1 , inv Bit ;
   BEGIN
       t - ff1: ENTITY Work .t - ff ( only )             -- VHDL’ 中的直接实体例化
                                                                 93
            GENERIC MAP ( tpd => 4 ns)                   -- 有效的延迟值
            PORT MAP ( clk = > clock, q = > ff0 ) ;      -- 名字关联
       t - ff2: ENTITY Work .t - ff ( only )
            GENERIC MAP ( 4 ns)
            PORT MAP ( inv, ff1 ) ;                      -- 位置关联
             ∶
       inveter inv < = NOT ff0 A FTE R 2 ns;
           q0 < = ff0 ;
           q1 < = ff1 ;
   END ARCHITECTURE arch2 ;



2 .4     标识符的命名规则

    VHDL’ 中关于标识符的语 法规则 被 VHDL’ 全 部接 受并 加以 扩展。 为了 对二 者
         87                   93
加以区分 , 前者称为短标识符 , 后者称为扩展标识符。

2 .4 .
     1     短标识 符

    VHDL 的短标识符为遵守以下规则的字符序列 :
       有效字符 : 英文字母 (′ -′ ,′ -′ ) 、
                    a′ z′ A′ Z′ 数字 (′ -′ ) 和下划线 (′ ′。
                                     0′ 9′        - )

       必须以英文字母打头。
       下划线 (′ ′ 的前后都必须有英文字母或数字。
             - )

       短标识符不区分大小写。


    下面的字符序列可看作同一短标识符的不同表示形式 :
           half - adder        Half - adder    Half - Adder   HALF - ADDER
                                                                             11
下面的字符序列不是合法的短标识符 :
            illegal% name          2illegal - name   -   illegal - name   illegal - name -   illegal - - name
    某些标识符 ( 例如 E NTI TY , ARCHIT ECT U RE , BEG IN , END ) 是 VHDL 的保 留字。
为了醒目和易于发现错误 , 建 议 VHDL 的保 留字 用大写 字母 , 而 用户自 己创 建 的标 识符 用
小写字母。

2 .4 .
     2      扩展标 识符

    扩展标识符具有以下特性 :

        扩展标识符用反斜杠来定界。例如 :
          valid  ,  end - with - an - underscore -           都是合法的扩展标识符。
        允许包含图形符 号 ( 例如 CR , LF , EF 等 ) , 但没 有 格式 的 作 用。允 许包 含 空 格符。
        例如 :
          chip A and B  ,  $500 & E  , legal% name                   都是合法的扩展标识符。
        2 个反斜杠之间的字可以和保留字相同。例如 :
          buffer  ,  en tity           都是合法的扩展标识符。
        2 个反斜杠之间的字可以用数字打头。例如 :
          80p            是合法的扩展标识符。
        扩展标识符中允许多个下划线相邻。例如 :
          three -   - -   underscores     是合法的扩展标识符 ( 但不推荐 ) 。
        扩展标识符区分大小写。例如 :
          ADDER  与  Adder                不同。
        扩展标识符永远和短标识符不同。例如 :
          Counter  和 Counter 不同 ; 也和 coun ter 不同。
        扩展标识符的名字中如果含有 1 个反斜杠 , 则用相邻的 2 个反斜 杠来代表 它。例如 :
          Ab   C  表示该扩展标识符的名字为 Ab  C( 共 4 个字符 ) 。
    使用扩展标识 符 的 目 的 与 使 用 短标 识 符 的 目 的 相 同 , 但 免 受 短 标 识 符 的 那 些 限 制。
VHDL 的保留字列 于 附录 5。 由 于 VHDL’ 引 入 新 的 保 留 字 , 这 些 新 保 留 字 有 可 能 与
                            93
VHDL’ 的 文件 中用户 定义 的标识 符同 名。为保 持向 上兼 容性 , 一个 好的 解决办 法是 把
     87
这些引起冲突的标识符改成扩展标识符。再次提醒读者 , 扩展标识符是区分大小写的。


2 .5        对象

    VHDL 中的对象是一些存放值的容器 , 共有 4 类 : 信号、变量、常量和文件。信号和变量
都可以连续地被赋值 , 而常量只可以在它被说明的时候被赋值 ( 仅此 1 次 ) 。 VHDL’ 把文
                                                93
件也当作对象。和以往一样 , 不可以通过赋值 来更 新文件 的内 容。文件 可以 作为参 数向 子
程序传递 , 通过子程序对文件进行读和写操作。文件参数没有模式。
    在实体说明中 , 端口子句把对象说明为端口 , 默认类为信号类。
    对象说明的格式为 :
       12
对象类别 标识符表 : 子类型标识 [∶ 初值 ] ;
                       =

    举例 :
                           ∶   ∶
   CONSTANT delay1 , delay2 Time = 10 ns ;
               ∶
   VARIABLE sum Real ;
               ∶
   SIGNAL clock Bit ;
   F ILE inpu t Text IS IN ″
              ∶            STD - INP UT″;

    绝大多数情况下 , 在说明 1 个常 数时 必须 给 它 1 个初 始 值。但 是 , 在 非常 特 殊的 情 况
下 , 在程序包中说明 1 个常数时 , 可以不给它指定初始值。这样的常数叫作缓定常数。
       如果 在同一个 对象说 明语句中 给多个 对象指定 了 1 个 初始值 , 则 这些对象 都获得 此
       同一初始值。例如 , 在上面的常数说明语句中 , delay1 和 delay2 各自的初始值都是 10
       ns。
       如果在说明信号或变量时没有指定初始值 , 系统则认为它取默认值 , 即该 类型的最 左
       值或最小值。例如 , 在上面的信号 clock 的说明语句中 , clock 的默认的初始值为′ 。
                                                      0′
       可以用函数调用的方式给对象赋初值。例如 :
       CONS TAN T const1∶ Integer∶ your - function ( True , 3 ) ;
                                  =


2 .6     数据类型和子类型

    VHDL 有很强的数据类型。正是由于这些数据类型 , 才使得 VHDL 能够创 建高层次 的
系统和算法模型。属于强类型语言的 VHDL 的特点在于 : 每一个对象 具有 1 个 类型且只 能
具有那个类型的值 ; 施加于某对象上的操作的类型必须与该对象的类型匹配 , 即定义 1 个操
作时必须指明其操作对 象的 类 型。V HDL 的 强类 型特 性 使得 能尽 早地 发现 类 型不 匹配 方
面的错误。例如 , 把不同类型的信号连接起来 就是 非法的。 对象 的类型 在说 明该对 象时 已
被确定。
    VHDL 有许多预定义类型 , 用户可以不必显式 说明而 直接 使用 它们。这 些预定 义类 型
在标准 ( STANDARD) 程 序 包 中 , 见 附录 6。 预定 义 类 型包 括 : 整 数 类 型 In teger , 浮 点 类 型
Real, 枚举类型 Boolean , Bit, Severit y - Level 和 Character , 以及物理类型 Time。

2 .6 .
     1   标量类 型

    标量类型包括 : 整数类型、浮点数类型、 举类 型和物 理类 型。V HDL 还 允许设 计者 为
                        枚
自己定义数据类型。举例如下 :

   TYPE twos - comp IS RA NGE - 32768 TO 32767 ;
   TYPE word - index IS RAN GE 15 DOWNTO 0 ;
   TYPE voltage IS RANGE 0 .0 TO 10 .0 ;

    类型说明中的关键字 RANGE 限定该类 型的取 值范 围 , 该类 型的对 象的 取值如 果超 出
此范围 , 则为非法。举例如下 :

   TYPE Std - ULogic IS ( ′U′              -- 未定
                         ′
                         X′                -- 强制未知
                                                                         13
′0′                  -- 强制 0
                                ′1′                  -- 强制 1
                                ′
                                Z′                   -- 高阻
                                ′W′                  -- 弱未知
                                ′L′                  -- 弱 0
                                ′H′                  -- 弱 1
                                ′
                                -′                   -- 无关
                                 );                  -- 程序包 Std - Logic - 1164 中的预定义类型
     TYPE Bit IS ( ′ , ′ ;
                   0′ 1′)                                              -- STANDARD 程序包中预定义的类型
     TYPE QSim - State IS ( ′ , ′ , ′ , ′
                            X′ 0′ 1′ Z′)                               -- Men tor Graphics 预定义的类型
     TYPE Severit y - Level IS ( Note , Warning , Error , Failure) ;   -- STANDARD 程序包中预定义的类型
     TYPE t raffic - lights IS ( red , yellow, green ) ;

     请注意 , 短标识符不区分大小写 , 而字符 文字 区分 大小写 , 因 此 , 字符 文字 a” 字符 文
                                                   “ 和
字“A”不同。枚举类型中的标识符不区分大小写 , 因此类型 Severity - Level 中的标识 符 note
和 Note, NOT E 相同。
     物理类型定义规定 1 个取值范围、 个基本单位和若干个 (0 至多个 ) 次级单位。次级单
                     1
位是基本单位的整数倍。例如 :

     TYPE resistance IS RA NGE 1 TO 10 e9
       U NI TS
            oh m ;                      -- 基本单位
             kohm = 1000 ohm ;          -- 次级单位为基本单位的整数倍
       END U NITS;

2 .6 .
     2      复合类 型

     复合类型包括数组和记录。数组用于定义同一 类型 值的 集合 , 记录 用于 定义可 能不 同
类型值的集合。
     数组可以是一维 ( 有 1 个下标 ) 数组或多维 数组 ( 有 多个下 标 ) 。此外 , 数 组类型 还可 分
为限定性数组和非限定性数组 : 限定性数组下标的取值范围在该数组类型定义时就被确定 ;
而非限定性数组下标的取值范围随后才确定。举例如下 :

     TYPE Bit - Vector IS ARRAY ( Natural RANGE < > ) OF Bit ;            -- STANDARD 程序包中预定义的
类型
     TYPE word IS ARRAY ( 31 DOWNTO 0 ) OF Bit ;
     TYPE memory IS ARRAY ( address ) O F word ;                          -- 即 : 地址可以为 In teger 类型
     TYPE matrix IS ARRAY ( 1 TO 8 , 1 TO 8 ) OF R eal ;
     TYPE St ring IS ARRAY ( Positive RANGE < > ) OF Character ;          -- 预定义的类型
     TYPE lpc - coef IS ARRAY ( Natural RANGE < > ) OF Real ;

     可以把 < > ”
        “     看作下标范围的占位符 , 在今 后用到 该数 组类 型时再 填入 具体的 数值 范
围。例如 , 1 个对象要被说明为具有 8 个元素的向量就可以写作 :

                  ∶
     VARIABLE item lpc - coef ( 7 DOWNTO 0 ) ;

      14
在 VHDL 中 , 类型 Bit 和 Bit - Vector 分别是字符 ( ′ ,′ 和 字符数 组 , 它 们仅和逻 辑
                                             0′ 1′)
运算有关 , 而没有任何数字值的意义。
   记录类型的实例如下 :

   TYPE mon th - name ( Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec ) ;
   TYPE date IS R ECORD
          ∶
       day Integer RAN GE 1 TO 31 ;
             ∶
       mon th mont h - name ;
          ∶
       year Integer RANGE 0 TO 3000 ;
   END R ECORD;

   可以对 1 个复合类型的信号整体赋值 , 也可以对其子元素分别赋值。例如 , 如果我们把
today 说明为 date 类型 ( 前面已将 date 说明为记录类型 ) 的变量 :

                ∶
  VARIABLE today date ;

   那么 , 整体赋值

        ∶
   today = ( 15 , May , 1995 ) ;

   和下述分别赋值等价 :

             ∶
   today .day = 15 ;
   today .month∶ May ;
                =
             ∶
   today .year = 1995 ;

   也可以采用名字关联的 方法。 在此 情况 下 , 子 元素 出现 的前 后 顺序 就 没有 什 么 关系。
例如 :

        ∶
   today = ( mon th = > May , day = > 15 , year = > 1995 ) ;

   对于只包含单个元素的聚集来说 , 必须使用名字关联的方法进行赋值 , 其目的是把它和
被括号括起来的表达式区别开来。例如 , 有如下的说明 :

   TYPE single IS RECORD
        ∶
       a Integer ;
   END R ECORD;

  SIGNAL s single ; 〔 1〕
         ∶

   下面是对信号 s 赋值的几个例子 :

  s <= 1;                          -- 不合法
  s <= ( 1 ) ;                     -- 不合法
  s < = ( a => 1 ) ;               -- 命名关联 , 合法
  s .a < = 1 ;                     -- 指定域名字 , 合法

   对于我们所讨论的问题 , 下面的 1 段测试程序比上面的实例表述得更为清楚 :


  〔1 〕 原文误 为 signal , 译 者已作 改正 。— — 译者 注
                                 —

                                                                                                    15
ENTI TY tests IS END;
ARCHI TEC TUR E record - type O F tests IS
  TYPE mon th - name ( Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec ) ;
  TYPE date IS R ECORD
        ∶
     day In teger RA NGE 1 TO 31 ;
           ∶
     mon th mon th - name ;
        ∶
     year Integer RANGE 0 TO 3000 ;
  END R ECORD date ;
  TYPE single IS RECORD
      ∶
     a Integer ;
  END R ECORD single;

BEGIN
  PROCESS
                                                 ∶
     VARIABLE birt hday , graduation - day , today date ;
              ∶
     VARIABLE s single;
  BEGIN
     -- 复合变量整体赋值
              ∶
     bir thday = ( 12 , Apr , 1964 ) ;
     -- 复合变量的子元素分别赋值
                          ∶
     graduation - day .day = 19 ;
     graduation - day .mon th∶ Jul;
                              =
                          ∶
     graduation - day .year = 1995 ;
     -- 名字关联 , 顺序不重要
          ∶
     today = ( mon th = > May , day = > 15 , year = > 1995 ) ;

     -- 单元素复合类型变量必须采用名字关联
     ∶
     s = ( a => 1 ) ;               -- 正确
     -- 或指定域
         ∶
     s .a = 2 ;                     -- 正确
     -- 下面 2 个赋值不好 , 可能引发编译错误 : 赋值类型不兼容
     ∶
     s = 3;                         -- 错误
     ∶
     s = ( 4 );                     -- 错误
     WAIT ;
  END PROCESS ;
END ARCHITECTURE record - t ype ;

给数组赋值有几种不同的方法 , 举例如下 :

-- 下面的 V HDL 代码包括不同的类型赋值格式 , 编译无错。
LIBRARY I EEE ;
USE I EEE .S td - Logic - 1164 .ALL ;
ENTI TY typecast IS
                    ∶
  P OR T ( in1 , in2 IN Std - Logic;          ∶
                                         ou t1 O UT St d - Logic ) ;
END ENTITY typecast ;
16
ARCHI TEC TUR E test OF typecast IS
     BEGIN
        PROCESS( in1 , in2 ) ;
                       ∶
          VARIABLE temp Std - Logic - Vector( 1 DOWNTO 0 ) ;
       BEGIN
     -- 将数组值赋值给变量 temp 的不同方法
              ∶
          temp = ( in1 , in2 ) ;
              ∶
          temp = in1 & in2 ;
              ∶
          temp = St d - Logic - Vector′ in1 , in2 ) ;
                                       (
              ∶
          temp = St d - Logic - Vector′ in1 & in2 ) ;
                                       (
              ∶
          temp = St d - Logic - Vector ( 1 DOWNTO 0 )′ in2 , in1 ) ;
                                                      (
              ∶
          temp = St d - Logic - Vector ( 1 DOWNTO 0 )′ in2 & in1 ) ;
                                                      (
     -- 用 CASE 语句描述 1 个异或门
          CASE Std - Logic - Vector′ in1 , in2 ) IS
                                    (                        -- 此处需要类型赋值
             WHEN ″00″= > out1 < = ′
                                   0′;
             WHEN ″01″= > out1 < = ′
                                   1′;
             WHEN ″10″= > out1 < = ′
                                   1′;
             WHEN ″11″= > out1 < = ′
                                   0′;
             WHEN OTHERS           = > out1 < = ′
                                                X′;
          END CASE ;
         END PROCESS ;
         END ARCHITECTURE test ;

2 .6 .
     3     存取类 型

     存取类型实际上是指针类型 , 它被用来在对象之间建立联系 , 或者给新对象分配或释放
存储空间。在普通 VHDL 的程序中很少用到存取类型 , 许多关于 V HDL 的书中甚至不介绍
这种类型。本 书 在 这 里 提 到 它 , 也 仅 仅 是 为 了 完 整 性。 欲 知 详 情 , 请 参 阅 IEE E 标 准 的
VHDL 语言参考手册 [ LRM93 ] 。
     在 IEE E St d - 1076 的程序包 TEX TIO 中 , 有 1 个预 定义 的存 取类型 Line ( 用户 也可 以
定义自己的存取类型 ) :

     TYPE Line IS ACCESS St ring ;

     这表示类型为 Line 的变 量 是 指向 字 符串 值 的指 针。 只有 变 量才 可 以是 存 取 类型 , 例
如:

     VARIABLE line - buffer∶ Line;


2 .6 .
     4     文件类 型

     文件类型用于在主系统环境中定义代表文件 的对象 , 文 件对 象的值 是主 系统文 件中 值
的序列。



                                                                           17
在 IEE E Std - 1076 的程序包 T EXT IO( 见附录 7 〔1〕 中 , 有 1 个预定义的文件类型 T ext
                                              )
( 用户也可以定义自己的文件类型 ) :

   TYPE Text IS F ILE OF String ;                            -- TEXT IO 程序包中预定义的文件类型
   TYPE input - t ype IS FI LE OF Character ;                -- 用户自定义的文件类型

   这表示类型为 Text 的文件是可 变长度 的 ASCII 码 记录 文件。 在程 序 包 T EXTIO 中 ,
有 2 个预定义的标准文本文件 :

   FILE input Text O PEN read - mode IS ″
            ∶                           STD - IN PU T″;
   FILE ou tput Text OPEN write - mode IS ″
              ∶                           STD - OUTP UT″;

   从 VHDL’ 到 V HDL’ 在使用文件方 面有很大的变化 , 因此 , 要注意这 2 个版本 的
          87       93
文件说明和文件使用的不同之处。
   VHDL 的输入和输出能力很有限。为了扩展输入和 输出 能力 , 某些 公司 出售专 门的 程
序包。下面的 1 段测试程序是 Andrew Fenner 写的 , 已使用 V- System / W indows 模拟器 和
Q uick VHDL 模拟器测试过 , 写此程序时他是都柏林城市大学电子工程学院四年级的学生。

   ----------------------------------------------------------------------------------------------------------------
   -- purpose
            ∶             T he purpose of t he program is to provide an example of the
   --                     file accessing features of VHDL using the 1993 version .
   --
   --                     T he program asks for the name of the file to be opened . If the file
   --                     does not exist , t he program asks for the name of the file again and
   --                    again un til the name exists .       If t he file cannot be opend for any
   --                    ot her reason t hen t he program stops .
   --
   --                     T he program reads t he data in line by line . The data is t hen read out
   --                    of the line . T he data is two integers . T he in tegers are then multiplied .
   --                    An out put line is t he created . T his line contains the values multiplied
   --                    and t he result along wit h some string data .
   --
   --                                                   X1     *    X2      =    Result
   --
   --                     T his con tinues till t he end of t he input file . T he outpu t is writ ten to a
   --                     file called ou tput .dat in t he base directory .
   ----------------------------------------------------------------------------------------------------------
   LIBRARY I EEE ;
   USE I EEE .S td - Logic - 1164 .ALL ;
   USE St d .Tex tio .ALL ;

   ENTI TY test file IS
                 -

   END ENTITY test - file ;



  〔1 〕 原书误 为附 录 8。 — — 译者注 。
                    —

    18
ARCHI TEC TUR E test1 OF test - file IS
-- All t he reading and writing of t he file takes place in t his function
-- T his function takes the name of the file to be opened as an input
                                   ∶
FU NCT ION read - file ( file - name IN St ring ) R ETU RN Boolean IS
-- open the file with t he name read in from t he keyboard
                 ∶                     ∶
   VARIABLE status File - Open - Stat us = Open - OK ;
                 ∶
   F ILE in - file Text O PEN Read - Mode IS file - name ;
   F ILE temp - file Text O PEN Write - Mode IS ″ tput .dat″
                   ∶                            ou          ;
                ∶       ∶
   VARIABLE int1 In teger = 0 ;
                ∶       ∶
   VARIABLE int2 In teger = 0 ;
                       ∶        ∶
   VARIABLE result - int In teger = 0 ;
  -- variables required to read in file name
                                       ∶
   VARIABLE in - line, lin , ou t - line Line ;
                        ∶
   VARIABLE file - name2 String ( 1 TO 60 ) ;
   VARIABLE out2∶ St ring ( 1 TO 58 ) ;
                         ∶
   VARIABLE out - 3 - char St ring ( 1 TO 3 ) ;
              ∶
   VARIABLE ok Boolean ;
             ∶       ∶
   VARIABLE x In teger = 1 ;
                  ∶
   VARIABLE charact Character ;

BEGIN
-- Close the file t hen open it again . If the file is not closed then an error
-- occurs when you test to see if it is opened correctly .
   File - Close ( in - file ) ;
   File - Open ( stat us , in - file , file - name, R ead - Mode ) ;
-- If t he file did not open correctly
   WHI LE NOT ( status = Open - OK ) LOOP
         IF ( status = Name - Error ) THEN
           out2∶ ″                                         ∶
                = Enter the name of the inpu t file again D pat h  name .asm″;
            W rite ( lin , out2 , Left , 0 ) ;
            W riteLine ( Ou tput , lin ) ;
            ReadLine ( Input , in - line ) ;
            Read ( in - line, charact , ok ) ;
-- get the name of the file
             ∶
            x = 1;
            WHI LE ( x < 61 ) LOOP
                  file - name2 ( x )∶ nul ;
                                     =
                  x∶ x + 1 ;
                    =
            END LOOP ;

             ∶
            x = 1;
            WHI LE ( ok ) LOOP
           file - name2 ( x)∶ charact ;
                             =
             ∶
            x = x + 1;
                                                                                  19
Read ( in - line, charact , ok ) ;
           END LOOP ;
-- open the file with t he new name given
           File - Open ( status, in - file, file - name2 , Read - Mode ) ;
        ELSE
           ASSER T false R EPORT ″T he file cannot be opened ″SEVERI TY Failure;
        END I F;
   END LOO P;
-- Read in the first line of the file
   ReadLine ( in - file , in - line ) ;
-- continue un til the end of the file is reached
     ∶
   r1 WHIL E NOT E ndFile ( in - file ) LOOP
-- read in the two integers from t he file
        Read ( in - line, in t1 , ok ) ;
        Read ( in - line, in t2 , ok ) ;
-- multiply t he read in data
        result - in t = int1 * int2 ;
                    ∶
-- make up a line of out put in the given format
        W rite ( out - line, int1 , Lef t , 0 ) ;                 -- integer 1
        ou t - 3 - char ( 1)∶ ′ ;
                             = ′
        ou t - 3 - char ( 2)∶ ′ ′
                             = * ;                                -- * sign
        ou t - 3 - char ( 3)∶ ′ ;
                             = ′
        W rite ( out - line, out - 3 - char , Left , 0 ) ;
        W rite ( out - line, int2 , Lef t , 3 ) ;                 -- integer 2
        ou t - 3 - char ( 2)∶ ′ ′
                             = = ;
        W rite ( out - line, out - 3 - char , Left , 0 ) ;        -- = sign
        W rite ( out - line, result - int , Lef t , 0 ) ;         -- result
-- write ou tput line to file
        W riteLine ( temp - file, out - line ) ;
-- read in the nex t line
        ReadLine ( in - file , in - line ) ;
   END LOO P;
   RE TUR N T rue;
END F UNCT ION read - file ;

BEGIN
PROCESS
                      ∶
        VARIABLE result Boolean ;
-- variables required to read in file name
                                ∶
        VARIABLE in - line , lin Line;
                           ∶
        VARIABLE file - name St ring ( 1 TO 60 ) ;
                     ∶
        VARIABLE out2 St ring ( 1 TO 58 ) ;
                   ∶
        VARIABLE ok Boolean ;
20
∶       ∶
             VARIABLE x In teger = 1 ;
                            ∶
             VARIABLE charact Character ;

        BEGIN
   -- reads in t he program from a file at 0 ns . Prompt the user
   -- the name of the file , and read in t he data from that file
         I F ( Now = 0 ns ) THEN
   -- read in the file name for t he first time
             ou t2 = ″Please en ter t he name of t he inpu t file D  path  name .asm ″
                  ∶                                                ∶                    ;
             W rite ( lin , out2 , Left , 0 ) ;
             W riteLine (out put , lin ) ;
             ReadLine ( input , in - line ) ;
             Read ( in - line, charact , ok ) ;
   -- get the name of the file
             WHI LE (ok )      LOO P
               file - name ( x)∶ charact ;
                                =
                 ∶
                x = x + 1;
                Read ( in - line, charact , ok ) ;
             END LOOP ;
   --
   -- call t he function to read the file
   --
                  ∶
             result = read - file ( file - name ) ;
         END IF ;
         WAI T ;
         END PROCESS ;
    END ARCHITECTURE test1 ;

2 .6 .
     5     子类型

    1 个类型说明定义了 1 个值域 , 它和任何其它类型说明定义的值域完全不同。有时候 1
个对象可能取值的值域是某个类型说明定义的值域的子集 , 这 就要用到 VHDL 提供的子 类
型的概念。子类型和其父类型完全兼容。但是 , 如果某 个对 象被 说明为 某个 特定的 子类 型
时 , 它的取值范围就不允许超出该子类型的值域 , 即使这个值处在其父类型的值域范围之内
也不允许。为了增加可重用性 , 只要有可能定义为子类型时 , 就不要将其定义为新类型。
    子类型可以是对其父类型施加限制条件 ; 也可以是简单地对其父类型重新起个名字 , 而
没有增加任何新意义。下面的简单实例用于说明子类型的用法 :

   -- 子类型测试程序
    ARCHI TEC TUR E subtype - test O F tests IS
        SUBTY PE data IS Bit - Vector (31 DOWNTO 0 ) ;          -- 下标约束
        SUBTY PE operand IS data;                               -- operand 只是 data 的另一个名字 , 它们等价

         TYPE x - int IS RA NGE 1 TO 50 ;
         TYPE y - in t IS RANGE 1 TO 30 ;

                                                                                            21
SUBTY PE z - int IS x - int RANGE 1 TO 30 ;
        SUBTY PE a - int IS x - in t RA NGE 3 TO 32 ;
        SUBTY PE b - in t IS z - int RANGE 5 TO 20 ;      -- 允许定义子类型的子类型

                ∶      ∶
        SIGNAL x x - int = 1 ;
               ∶       ∶
        SIGNAL y y - int = 2 ;
               ∶        ∶
        SIGNAL z z - in t = 3 ;
               ∶       ∶
        SIGNAL a a - int = 4 ;
                ∶       ∶
        SIGNAL b b - in t = 5 ;

   BEGIN
        z <= x;                   -- 正确 , 因为 z - int 为 x - int 的 1 个子类型
                                  -- 但若 x 越出 z - int 的界 , 则将导致运行错误
        a < = z;                  -- 正确 , 因为同一类型的不同子类型兼容
        b < = a;                  -- 正确 , 因为同一类型的不同子类型兼容
                                  -- 但若 a 越出 b - int 的界 , 则将导致运行错误
        y < = x;                  -- 错误 , 导致编译错误 , 因为 x 与 y 类型不同
        y < = y - int ( x) ;      -- 正确 , 因为 x - int 与 y - in t 为密切相关的数据类型 , 允许类型标记转换
                                  -- 但若 x 越出 y - int 的界 , 则将导致运行错误
   END ARCHITECTURE sub type - test ;

   标准程序包 St d - Logic - 1164 [ 附录 8 〔 1〕 中含有如下子类型说明 :
                                        ]

                         ∶
   FU NCT ION Resolved ( s Std - ULogic - Vector ) R ETU RN Std - ULogic;
   SUBTY PE St d - Logic IS Resolved St d - ULogic ;

   子类型 Std - Logic 恰好就是子类型 Resolved Std - U Logic 的另一个名 字 , 仅 是简单一 点
而已。下面 2 个信号说明是等价的 , 请参看决断函数一章。

              ∶
   SIGNAL res1 Std - Logic ;
              ∶
   SIGNAL res1 R esolved Std - ULogic ;

   标准程序包 Std - Logic - 1164 中 还含 有如 下 子类 型说 明 , 它们 具有 不 同的 取 值范 围 约
束条件 :

   SUBTY PE X01 IS Resolved St d - ULogic RA NGE        ′
                                                        X′TO ′ ;
                                                              1′       -- ( ′ , ′ , ′ ;
                                                                            X′ 0′ 1′)
   SUBTY PE X01Z IS Resolved Std - ULogic RA NGE        ′
                                                        X′TO ′ ;
                                                              Z′       -- ( ′ , ′ , ′ , ′ ;
                                                                            X′ 0′ 1′ Z′)
   SUBTY PE UX01 IS Resolved St d - ULogic RAN GE        ′
                                                         U′TO ′ ;
                                                               1′      -- (′ , ′ , ′ , ′ ) ;
                                                                            U′ X′ 0′ 1′
   SUBTY PE UX01 Z IS Resolved St d - ULogic RAN GE       ′
                                                          U′TO ′ ;
                                                                Z′     -- (′ , ′ , ′ , ′ , ′ ;
                                                                            U′ X′ 0′ 1′ Z′)

其中 , 子类型 X01 的另一等价形式如下 :

   SUBTYPE X01 IS Std - Logic RANGE ′
                                    X′TO ′ ;
                                         1′                            -- ( ′ , ′ , ′ ;
                                                                            X′ 0′ 1′)



2 .7        类型转换

   VHDL 属于 强类型 语言 , 每 一个 对象只 能有 1 种 类型 , 并 且只 能取该 类型 的值。赋 值
  〔1 〕 原书误 为附 录 7。 — — 译者注 。
                    —

       22
时 , 若值类型和对 象 类型 不 一 致 , 需要 使 用 显 式 类型 转 换。 VHDL 中没 有 隐 式 类 型转 换。
同一父类型的诸子类型相互兼容。

2 .7 .
     1     用类型 标记实现 类型转换

    类型标记实际上 是类 型 的 名 字。例 如 , Real 就 是 用 于 把 整数 转 换 为 浮 点数 的 类 型 标
记。类型标记转换仅适用于关系密切的标量类 型 , 即整数 和浮 点数。枚 举类 型不能 使用 类
型标记的方法进行类型转换。举例如下 :
    假定有 :

    V ARIABLE ∶ In teger ;
              i
    V ARIABLE r∶ Real ;

    则下列赋值语句可以正常工作 :

    ∶
    i = In teger ( r) ;
    ∶
    r = Real ( i) ;

    请注意 , 把浮点数转换为整数时会发生舍 入现象。 如果某 浮点 数的 值恰好 处于 2 个 整
数的正中间时 , 转换的结果可能向任意方向靠拢。
    已经定义了以整数或浮点数为基类型的标 量数据 类型 的加法 运算 符。但是 , 所 有操 作
数必须属于同一数据类型 ( 或者同一基类型的子类型 ) 。在下面 的实例中 , x 不能 与 y 相加 ,
除非其中之一转换为另一个数的类型。

    PROCESS ( clk )
         TYPE tpx IS RANGE 3 .5 TO 12 .8 ;
         TYPE tpy IS RAN GE 5 .7 TO 20 .9 ;
                ∶
      VARIABLE x t px ;
                ∶
      VARIABLE y tpy RANGE 10 .2 TO 15 .6 ;
               ∶
      VARIABLE z tpy ;
    BEGIN
      ∶
      z = tpy (x ) + y ;
    END PROCESS ;

    程序包 Numeric - Bit 中定义了有符号数 Signed 和无符号数 U nsigned 类型 , 与其关系 密
切的数据类型是 Bit - Vector , 可以用类型标记方法实现它们之间的类型转换。与此 类似 , 程
序包 Numeric - St d 中定义的有符号 数和 无符 号数 类 型与 数据 类型 St d - Logic - Vector 关 系
密切 , 它们也可以用类型标记方法实现类型转换。

2 .7 .
     2     用户创 建的类型 转换

    函数可以用来实 现类型转 换。程序 包 St d - Logic - 1164 , N umeric - Bit 和 N umeric - Std
中定义了许多类型转换函数。下面是 1 个把 Std - U Logic 值转换为 Bit 值的类型转 换函数。
参阅程序包 Std - Logic - 1164 [ 见附录 8 ] , 可以看到更多的类型转换函数。

                          ∶
    FU NCT ION To - Bit ( s Std - ULogic;     xmap Bit = ′
                                                  ∶ ∶ 0′) RE TUR N Bit IS
      BEGIN
                                                                            23
CASE   s   IS
             WHEN ′ | ′
                   0′ L′= > R ETUR N (′ ) ;
                                      0′
             WHEN ′ | ′
                   1′ H′= > RET URN (′ ) ;
                                      1′
             WHEN OTHERS = > RE TURN xmap ;
            END CASE ;
         END ;

    下面的实例以不同的方式调 用转 换函 数 To - Bit。请 注意 , 在函 数调 用时 , 第二 个参 数
可以被略去不写。此时 , 该参数 取默认值。在下面的 例子中 , 若 s 的取 值为 ′ , ′ , ′ , ′
                                            0′ 1′ L′
H′之一 , 则 b1 , b2 , b3 将得到的值是与 s 相同的值 ′ 或′ 。若 s 的取值 是 St d - U Logic 类
                                      0′ 1′
型中的其它值时 , b1 , b2 的值将是 ′ , 而 b3 的值将是 ′ 。当然 , 用户可以写出自己的类型
                       0′            1′
转换函数。
    LIBRARY I EEE ;
    USE I EEE .S td - Logic - 1164 .ALL ;
    ENTI TY typeconv IS END ;
    ARCHI TEC TUR E arch O F typeconv IS
        SIGNAL s Std - ULogic = ′ ;
               ∶            ∶ 0′
        SIGNAL b1 , b2 , b3∶Bit = ′ ;
                              ∶ 1′
    BEGIN
        b1 < = To - Bit ( s) ;
        b2 < = To - Bit ( s, ′ ) ;
                             0′
        b3 < = To - Bit ( s, ′ ) ;
                             1′
    END;

    常数也可用于类型转换。就模拟效率而言 , 它 比类型 转换 函数 效率更 高。下面 以实 例
说明使用常数把类型为 Std - U Logic 的值转换 Bit 类型的值 :
    LIBRARY I EEE ;
    USE I EEE .S td - Logic - 1164 .ALL ;
    ENTI TY typeconv IS END ;
    ARCHI TEC TUR E arch O F typeconv IS
         TYPE typeconv - typ IS ARRAY ( Std - ULogic ) OF Bit ;
        CO NSTANT typeconv - con∶ typeconv - typ∶= ( ′ | L′ = > ′ ,
                                                      0′         0′   ′ |′ = > ′ ,
                                                                       1′ H′    1′   OT HE RS
       => ′ ) ;
           0′
        SIGNAL b∶Bit ;
               ∶
        SIGNAL s Std - ULogic ;
    BEGIN
        b < = typeconv - con ( s) ;
    END;



2 .8        词法单元

2 .8 .
     1      注释

    VHDL 中的注释是以双连符 (-- ) 打头直到本行末尾的 1 段文字。注释不是 VHDL 设计
       24
描述的一部分 , 编译之后存入数据库中的信息不包含注释。举例如下 :

   -- 一整行注释
    NEXT ;    -- 从此到行尾为注释


2 .8 .
     2      数字

    数字可以表示为十进制数 , 也可以表示为 以 2 至 16 为 基的数。 浮点 数中含 小数 点 , 整
数中不含小数点。十进制数文字以如下格式定义 :

    十进制文字∷ = 整数 [ .整数 ] [ 指数]
    整数∷ = 数字{ [下划线 ]数字}
    指数∷ = E [ + ]整数 | E - 整数

    在相邻的数字之间插入下划线 , 对十进制 数的 数值并 无影 响。允许 在数 之前冠 以若 干
个 0 , 但不允许在数之间存在空格 , 即使与指数成分之间也不允许。举例如下 :

   -- 整数文字
    012        0            123 - 456 ( 等效于 123456 )         2E8 ( 等效于 2e8 )
   -- 实数文字
    12 .0      0 .0         0 .234       3 .14159 - 26535    1 .2E - 6         2 .4 E + 3

    以基表示的数 , 其定义的格式如下 :

    以基表示的数∷ = 基 # 基于基的整数 [ .基于基的整数] # 指数
    基∷ = 整数
    基于基的整数∷ = 扩展数字{[ 下划线] 扩展数字}
    扩展数字∷ = 数字 | 字母

    对以基表示的数而言 , 在相邻的数字之间 插入 下划线 对其 数值 无影响。 基数的 最小 值
是 2 ; 最大值是 16。基数和指数都用十进 制表示 法。以 基表示 的数 中允 许使用 的字 母是 A
到 F , 大小写字母所表达的意义相同。举例如下 :

   -- 整数文字 , 值为 255。
    2 # 1111 - 1111 #            8 # 377 #       16 # FF #      016 # 0F F #
   -- 整数文字 , 值为 224。
    16 # E # E1         2 # 1110 - 0000 #
   -- 以基表示的浮点数实例
    2 # 1 .1111 - 1111 # E4      ( 等于十进制数 31 .9375 )
    16 # 0 .F # E0               ( 等于十进制数 0 .9375 )
    16 # F F .F F # E + 1        ( 等于十进制数 4095 .9375 )

    对于上述以基表示的浮点数实例 , 可以用下面的程序进行测试 :

    ENTI TY tests IS END;
    ARCHI TEC TUR E numbers OF tests IS
    BEGIN
    PROCESS
                                                                                            25
∶
      VARIABLE r1 Real;
    BEGIN
      REPORT ″Default initial value of t ype real = ″& Real′Image ( r1 ) ;
        ∶
      r1 = 2 # 1 .1111 - 1111 # E4 ;
      REPORT ″= ″ # 1 .1111 - 1111 # E4 = ″& Real′
                2                                 Image( r1 ) ;
        ∶
      r1 = 16 # 0 .F # E0 ;
      REPORT ″= ″ # 0 .F # E0 = ″& Real′
                16                      Image ( r1 ) ;
      r1 = 16 # FF .F F # E + 1 ;
      REPORT ″= ″ # F F .FF # E + 1 = ″& Real′mage( r1 ) ;
                16                            I
         WAI T ;
    END PROCESS ;
    END ARCHITECTURE numbers ;


2 .8 .
     3      字符

    VHDL 中的文字字符表示形式为 : 被单引号括起来的 ASCII 字符。例如 :
          ′
          A′            ′ ′
                         *             ′
                                       ′′      ′ ′
                                                ″            ′′
    其形式化定义为 :
    字符文字∷ = ′图形字符′

2 .8 .
     4      字符串

    VHDL 中的文字字符串表示形式为 : 被双引号 括起来 的图 形字符 序列 ( 可 以为 空 ) 。 举
例如下 :

   ″Can be used to repor t some message ″
   ″″                                                -- 空字符串
   ″″              ″
                   A″         ″ ″
                               ″ ″                   -- 3 个长度为 1 的字符串
   ″This string contains an ″ em bedded string″ in it″
                             ″                 ″

    其形式化定义为 :
   字符串文字∷ = ″
            {图形字符}″
    在 VHDL’ 中引入了属性′
           93      Image , 它对 于预 定 义的 标量 类型 ( 或 子类 型 ) 返 回 1 个 代
表该标量类型值的字符串。其形式为 :
   标量类型或子类型 ′Image (该类型的值 )
    例如 ,
   REPORT ″T he decimal value of 16 # 0 .F # E0 = ″& Real′Image(16 # 0 .F # E0 ) ;

2 .8 .
     5      位串

    VHDL 中的位串表示形式 为 : 被 双引 号括 起来 的扩 展 的数 字序 列 , 数 字序 列 前冠 以 基
数说明符。

    位串文字∷ = 基数说明符 ″位值 ″
    基数说明符∷ = B | O | X
    位值∷ = 扩展数字{ [下划线 ]扩展数字}
    26
位串的长度是该位串中扩展数字序列的等价位数。举例如下 :

    B″1111 - 0101 ″                -- 长度为 8
    X″F0F ″                        -- 长度为 12 , 等效于 B″1111 - 0000 - 1111 ″
    O″070 ″                        -- 长度为 9 , 等效于 B″000 - 111 - 000 ″


习题
1 . 在端口子句中说明每一个端口时 , 一般说来需要说明哪 3 件事 ? 如果端口模式被省略 , 则该端口的默认
  模式是什么 ?
2 . 1 个模型是否必须有 1 个结构体 ? 结构体的目的是什么 ? 1 个设计可以有多个结构体吗 ?
3 . 设计实体和其结构体必须存放在同一文本文件中吗 ? 如 果存放在不同 的文本文件 中 , 那么 对它们进 行
  编译的先后次序有要求吗 ? 如果对结构体重新编译 , 是否一定要对 相应的实体 说明重 新编译 ? 如果 对
  实体说明重新编译 , 是否一定要对相应的结构体重新编译 ?
4 . 一种良好的 V HDL 编码风格和方法是 : 使用类属或 常数而 不使用 具体的 数值表 示器件 特性 , 这些特 性
  值会随着时间的推移而变化 , 在不同例化场合也可能使用不同的特性值。请问这是为什么 ?
5 . 如果没有给对象显式设定初始值 , 其默认初始值是什么 ?
6 . 一种良好的编码风格和方法是 : 尽可能使用子类型对类型的取值范围加以限定。为什么 ?
7 . VHDL 区分大小写吗 ? 扩展标识符是怎么回事 ?
8 . 从模拟的角度看 , 使用常数作为类型转换或数据查找非常有效。例如 , 假定已有如下的类型和子类型的
  说明 :

       SUBTY PE int01 IS Integer RANGE 0 TO 1 ;
       TYPE bit - array IS ARRAY ( int01 ) OF Bit ;
       TYPE int - array IS ARRAY (Bit ) OF int01 ;

  请定义 1 个常数类型 , 使得能够把整数 0 转换为 Bit ′ ; 把整数 1 转换为 Bit ′ 。与此类似 , 再定义 1 个
                                  0′                1′
  常数类型 , 使得能够把 Bit ′ 转换为常数 0 ; 把 Bit ′ 转换为常数 1。
                   0′                1′
9 . 程序包 Std - Logic - 1164 中定义了类型 Std - ULogic:
       TYPE Std - ULogic IS ( ′ , ′ ,′ , ′ ,′ ,′ ,′ ,′ ,′
                               U′ X′ 0′ 1′ Z′ W′ L′ H′ -′)
  请简述此类型的逻辑状态。
10 . 存储器可以被描述为二维数组 , 例如 :

         S UB TYPE mem - size IS In teger RANGE 1 TO 1024 ;
         S UB TYPE word - size IS Integer RAN GE 15 DOWNTO 0 ;
         TY PE memory IS ARRAY( mem - size, word - size ) OF Bit ;

   上面的存储器类型适用于模拟 , 但是这种多维数组形式的描述不适于综合。关于此问题还有别的什么
   方法吗 ?
11 . 书写 1 个关于电流的物理类型定义 , 其基类型是纳安( nA) , 其次级单位是微安 (μ A )、毫安 ( mA )和 安培
   ( A) 。类似地 , 书写关于电压的物理类型定义和关于频率的物理类型定义。
12 . 使用 V- System 对下述 VHDL 模型进行编译和模拟。

   ENT I TY tests IS
   END tests ;

   -- test t he aggregate way of initialization
   ARCHI T ECTU RE agg OF tests IS
                                                                            27
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程
Vhdl教程

More Related Content

Similar to Vhdl教程

网络收音机-毕业论文
网络收音机-毕业论文网络收音机-毕业论文
网络收音机-毕业论文rgw5267
 
GCC_Porting_on_MiniSystem
GCC_Porting_on_MiniSystemGCC_Porting_on_MiniSystem
GCC_Porting_on_MiniSystemXiaojing Ma
 
深入浅出 Android
深入浅出 Android深入浅出 Android
深入浅出 AndroidYUCHENG HU
 
城市交通管理模拟综合设计 - 算法设计
城市交通管理模拟综合设计 - 算法设计城市交通管理模拟综合设计 - 算法设计
城市交通管理模拟综合设计 - 算法设计toukaigi
 
《云计算核心技术剖析》Mini书
《云计算核心技术剖析》Mini书《云计算核心技术剖析》Mini书
《云计算核心技术剖析》Mini书ikewu83
 
Java消息服务
Java消息服务Java消息服务
Java消息服务jinkris
 
Al32 v1 使用手册
Al32 v1 使用手册Al32 v1 使用手册
Al32 v1 使用手册ayman_hendawy
 
Docbook dev note
Docbook dev noteDocbook dev note
Docbook dev notecri fan
 
Docbook dev note
Docbook dev noteDocbook dev note
Docbook dev notecri fan
 
8门编程语言的设计思考
8门编程语言的设计思考8门编程语言的设计思考
8门编程语言的设计思考Ray Song
 
Linux nand driver
Linux nand driverLinux nand driver
Linux nand drivercri fan
 
Html5移动web开发指南
Html5移动web开发指南Html5移动web开发指南
Html5移动web开发指南Alex Wong
 
2007—2010 年中国led 外延片、芯片、显示屏市场(2)
2007—2010 年中国led 外延片、芯片、显示屏市场(2)2007—2010 年中国led 外延片、芯片、显示屏市场(2)
2007—2010 年中国led 外延片、芯片、显示屏市场(2)xiongjianvlsi
 
Xcode tutorial
Xcode tutorialXcode tutorial
Xcode tutorialMarch Liu
 
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版liu sheng
 
Memcached
MemcachedMemcached
Memcachednowise
 
Memcached全面剖析
Memcached全面剖析Memcached全面剖析
Memcached全面剖析chen vivian
 

Similar to Vhdl教程 (20)

网络收音机-毕业论文
网络收音机-毕业论文网络收音机-毕业论文
网络收音机-毕业论文
 
Design document
Design documentDesign document
Design document
 
GCC_Porting_on_MiniSystem
GCC_Porting_on_MiniSystemGCC_Porting_on_MiniSystem
GCC_Porting_on_MiniSystem
 
深入浅出 Android
深入浅出 Android深入浅出 Android
深入浅出 Android
 
城市交通管理模拟综合设计 - 算法设计
城市交通管理模拟综合设计 - 算法设计城市交通管理模拟综合设计 - 算法设计
城市交通管理模拟综合设计 - 算法设计
 
《云计算核心技术剖析》Mini书
《云计算核心技术剖析》Mini书《云计算核心技术剖析》Mini书
《云计算核心技术剖析》Mini书
 
Java消息服务
Java消息服务Java消息服务
Java消息服务
 
Twido programming guide
Twido programming guideTwido programming guide
Twido programming guide
 
Al32 v1 使用手册
Al32 v1 使用手册Al32 v1 使用手册
Al32 v1 使用手册
 
Docbook dev note
Docbook dev noteDocbook dev note
Docbook dev note
 
Docbook dev note
Docbook dev noteDocbook dev note
Docbook dev note
 
8门编程语言的设计思考
8门编程语言的设计思考8门编程语言的设计思考
8门编程语言的设计思考
 
Linux nand driver
Linux nand driverLinux nand driver
Linux nand driver
 
Html5移动web开发指南
Html5移动web开发指南Html5移动web开发指南
Html5移动web开发指南
 
2007—2010 年中国led 外延片、芯片、显示屏市场(2)
2007—2010 年中国led 外延片、芯片、显示屏市场(2)2007—2010 年中国led 外延片、芯片、显示屏市场(2)
2007—2010 年中国led 外延片、芯片、显示屏市场(2)
 
Xcode tutorial
Xcode tutorialXcode tutorial
Xcode tutorial
 
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
 
Memcached
MemcachedMemcached
Memcached
 
Memcached
MemcachedMemcached
Memcached
 
Memcached全面剖析
Memcached全面剖析Memcached全面剖析
Memcached全面剖析
 

Vhdl教程

  • 1. VHDL 简 明 教 程 王小军 编著 乔长阁 边计年 薛宏熙 译 边计年 审校 清 华 大 学 出 版 社
  • 2. ( 京 ) 新登字 158 号 内 容 提 要 V HDL 是国际标准硬件描述语言 , 在电 子系统 自动设 计中已 十分流 行 , 成为主 要的硬 件描述 工具 , 将 成为数字系统设计领域中所有技术人员必须掌握的一种语言。 本书是根据王小军博士 3 年来在都柏林城市大学电子系给本科生四年级 和研究生授 课时的英文 讲稿 翻译而成的 , 主要介绍 V HDL 语言的基础及其应用。书 中给出 了一些 VHDL 描述 实例 , 一些 V HDL 的 标 准程序包 , 练习题 , 实验 , 自测题 , 以及从 In ternet 网上得到有关 V HDL 的帮助及最新 信息的途径 等。书中 的实例都是经过微机上的 VHDL 模拟软件 V - System/ Windows 编译 和模拟的 , 用于逻辑 综合的实例 都经 过 SU N S PARC 工作站上的 V HDL 模拟软件 Quick VHDL 编译和模 拟 , 然后 作为逻辑综合 软件 AutoLogic 的输入而自动生成逻辑电路图。 本书全面而系统 , 可作为电子类和计算机 类各专 业的高 年级本 科生和 研究生 的入门 教材和 教学参 考 书 , 也可作为数字电路设计人员了解 VHDL 的读物。 版权所有 , 翻印 必究。 本书封面 贴有清华大 学出版社 激光防伪标 签 , 无 标签者不 得销售。 图书在版编目 ( CIP) 数据 VHDL 简明教程/ 王小军编著 ; 乔长阁等译 . - 北京 : 清华大学出版社 , 1997 ISBN 7- 302-02647- 5 Ⅰ . V… Ⅱ . ①王… ②乔… Ⅲ . 程序语言 , V HDL- 教材 Ⅳ . TP312 中国版本图书馆 CIP 数据核字 (97) 第 18087 号 出 版 者 : 清华大学出版社 ( 北京清华大学校内 , 邮编 100084) 因特网网址 : www .t up .tsinghua .edu .cn 印 刷 者 : 国防工业出版社印刷厂 发 行 者 : 新华书店总店北京科技发行所 开 本 : 787 ×1092 1/ 16 印张 : 12 .25 字数 : 285 千字 版 次 : 1997 年 10 月 第 1 版 1998 年 4 月 第 2 次印刷 书 号 : ISBN 7-302- 02647-5/ TP 1365 印 数 : 4001~8000 定 价 : 19 .50 元
  • 3. 者 序 硬件描述语言是硬件设计者和电子设计自动 化工具 之间 的界面 , 用 于数 字电路 与系 统 的描述、模拟和自动设计。目前 , 电子系统向集成化、大规模和高速度等方向发展 , 电子系统 设计自动化 ( EDA) 软件工具在市场上大量出现 , 以硬件 描述 语言 和逻辑 综合 为基础 的自 顶 向下的电路设计方法在工业界已十分流行。自 从 1987 年 VHDL 被 IE EE 确 定为标 准硬 件 描述语言 ( IEE E 标准 1076) 以来 , V HDL 迅 速出 现在各 EDA 系统 中 , 取代了 各 自的 非标 准 语言 , 并 很 快 为 数 字 系 统 的 硬 件 设 计 者 所 接 受。 1993 年 , IEE E 又 推 出 VHDL 新 的 版 本 IE EE 标准 1076-1993 , IEE E 还制定了与 VHDL 语言有关的标 准逻辑系 统程序 包 Std - Log- ic - 1164、标准数学程序包 Math , 标 准综 合用程 序包 N umeric - St d , N umeric - Bit , 面 向 ASIC 模型 设 计 的 VHDL 基 准 VIT AL 等 , 并 正 在 制 定 数 字 系 统 与 模 拟 电 路 结 合 的 描 述 语 言 VHDL- A。我国自行开发的熊猫系统 ( PANDA ) 中 , 也已经把 V HDL 语言作为行为描述的输 入手段。近年来 , 我国高等院校也开始重视 VHDL , 许多 学校 已经把 它列 入电 子、 算机 等 计 专业的教学大纲。V HDL 在硬件设计领域的作用将与 C 和 C + + 在软件设计领域的作用一 样 , 在大规模数字系统的设计中 , 它将逐步取代如 逻辑状 态表 和逻辑 电路 图等 级别较 低的、 繁琐的硬件描述方法 , 而成为主要的硬件描述工具 , 它将成为数字系统设计领域中所有技术 人员必须掌握的一种语言。 国外介绍 VHDL 的书籍非常多 , 而我国此方面的书还非常少。本 书是根据 王小军博 士 几年来在都柏林城市大学电子系给本科生四年级 和研究 生授 课的英 文讲 稿翻 译而成 的 , 主 要介绍 VHDL 语言的基础及其应用。作为 VHDL 语言的基础 , 它可以作为电子类和计算机 类各专业的高年级本科生和研究生的入门教材和 教学参 考书 , 也 可以作 为数 字电路 设计 人 员了解 VHDL 的读物。读者可在阅读此书的基础上进一步阅读其它有关 VHDL 的书籍 , 以 便掌握更高级的 VHDL 特性和应用。我们愿意将此书介绍给读者 , 以促进 V HDL 在我国的 迅速普及。 参加本书翻译的有以下 3 位同志 : 薛宏熙译 1~ 4 章 , 边计年 译 5 ~13 章 , 乔 长阁 译 14 ~23 章。全书由乔长阁负责统稿 , 边计年对全书进行了审阅。 我们对 全书中的 程序部分 进 行了规范化处理 , 加入了图注、表注及其说明 等 , 统 一了 程序 中的大 小写 , 并 标识了 1987 年 和 1993 年 2 个版本的区别。程序中关键词一律用大写表示 , 各标准中规定的标准标识符首 字符大写。有关 1993 年版本新添加的关键词用黑体标识。除此之外 , 我们还对原书中的错 误进行了修改。书末附了主要术语的英汉对照表。 我们在翻译过程中力求译文准确 , 风格统一 , 但 由于 时间 仓促和 译者 的水平 有限 , 不 足 之处在所难免。欢迎读者提出批评改进意见。 译者感谢原书作者王小军博士给了我们这个 机会 , 并感 谢北 京邮电 大学 胡健栋 教授 向 我们推荐这本书。 译 者 1997 年 4 月于清华大学 Ⅰ
  • 4.
  • 5. 言 VHDL 是美国电气 和 电子 工 程 师 协 会 制 定 的 标 准 硬 件 描 述 语 言 ( IE EE 标 准 1076 ) 。 VHDL 可用于数字电路与系统的描述、模拟和自动设计。 以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法可用于复杂的集成电路 设计以缩短设计周期。这种自顶向下的电路设计方法在欧美工业界已十分流行。大的集成 电路厂家 , 如摩托罗拉等 , 已开始使用 VHDL。美国 国防 部明确 要求 , 自 1988 年 9 月 30 日 起 , 所有为军方研制的专用集成电路必须用 V HDL 描述。教育界也开 始重视并 逐步把硬 件 描述语言 VHDL 列入大学电子系 和计 算机系 的教 学大纲。 包括 美国加 利福 尼 亚大 学戴 维 斯分校和英国曼彻斯特大学 在内 的许 多高校 的电 子系和 计算 机系 已经把 VHDL 作 为本 科 生或研究生 的 课 程。 从 帝 国 理 工 医 学 院 的 In ternet 资 料 库 里 可 以 找 到 世 界 各 地 有 关 的 VHDL 检索资料。 VHDL 在硬件设 计领 域的 作用 将与 C 和 C + + 在软 件设 计 领域 的作 用 一样。在软件设计领域 , C 和 C + + 等高级语言早已取代低级汇编 语言 , 尤其是 在大的软 件 设计项目中。同样的情况正 在硬 件设 计领域 发生。高 级硬 件设 计语 言 VHDL 将逐 步取 代 低级硬件描述语言 , 如逻辑状态表和逻辑电路图等。 作者希望把 VHDL 介绍给国内 的读者。 本书 是以作 者 3 年来 在都 柏林 城 市大 学电 子 系给本科生四年级和研究生授课的讲稿 为基 础写 成的。该 书的英 文原 稿曾 于 1995 年 5 月 在都柏林用作一家属于菲利普 集团的 硅软 公司的 VHDL 培训 教材。本 书可 作 为电 子系 和 计算机系的高年级本科生和研究生的入门教材 , 也可以 作为 数字 电路设 计人 员了解 VHDL 的读物。书中的实例都 经过 微 机上 的 VHDL 模拟 软件 V- System/ Windows〔 1〕编译 和模 拟 的。用 于 逻 辑 综 合 的 实 例 都 经 过 SUN SPARC 工 作 站 上 的 VHDL 模 拟 软 件 Quick- VHDL 〔2 〕编译和模拟 , 然 后作 为 逻辑 综 合 软 件 Au toLogic〔 3〕的输 入 而 自 动 生成 逻 辑 电 路 图。自动生成的逻辑电路图经过电路模拟软件进行模拟 , 已证 实其实现 了原 VHDL 模型 的 功能。 由于作者水平有限 , 不足之处在所难 免。欢迎 读者提 出批 评改 进意见。 作者的 电子 邮 件地址为 : wangx@eeng .dcu .ie。 〔1 〕 V- System/ Window s 是 Model Tec hnology 的 注册商 标 〔2 〕 Qu ick V HDL 是 M en tor Graphics 的注册 商标 〔3 〕 Aut oLog ic 是 M en tor Graphics 的注册 商标 Ⅲ
  • 6.
  • 7. 录 译者序 ………………………………………………………………………………………… Ⅰ 前言 …………………………………………………………………………………………… Ⅱ 1 为什么要用 VHDL ………………………………………………………………………… 1 1 .1 为什么要用硬件描述语言 HDL ………………………………………………… 1 1 .2 各种 HDL 的浏览 ………………………………………………………………… 1 1 .3 VHDL 的诞生 ……………………………………………………………………… 2 1. 4 设计的表示方法 …………………………………………………………………… 3 1. 5 VHDL 的能力范围 ………………………………………………………………… 4 1. 6 一个 V HDL 的描述实例 …………………………………………………………… 5 1. 7 VHDL 的 CAD 工具 ……………………………………………………………… 5 习题 ………………………………………………………………………………………… 6 2 基本的 VHDL 模型结构 …………………………………………………………………… 7 2 .1 设计实体 …………………………………………………………………………… 7 2 .2 实体说明 …………………………………………………………………………… 7 2 .2 .1 类属和端口说明 …………………………………………………………… 7 2 .2 .2 端口模式 …………………………………………………………………… 8 2 .2 .3 实体说明部分 ……………………………………………………………… 9 2 .2 .4 实体语句部分 ……………………………………………………………… 9 2. 3 结构体 ……………………………………………………………………………… 9 2. 4 标识符的命名规则 ………………………………………………………………… 11 2 .4 .1 短标识符 ………………………………………………………………… 11 2 .4 .2 扩展标识符 ……………………………………………………………… 12 2. 5 对象 ………………………………………………………………………………… 12 2 .6 数据类型和子类型 ………………………………………………………………… 13 2 .6 .1 标量类型 ………………………………………………………………… 13 2 .6 .2 复合类型 ………………………………………………………………… 14 2 .6 .3 存取类型 ………………………………………………………………… 17 2 .6 .4 文件类型 ………………………………………………………………… 17 2 .6 .5 子类型 …………………………………………………………………… 21 2. 7 类型转换 …………………………………………………………………………… 22 2 .7 .1 用类型标记实现类型转换 ……………………………………………… 23 2 .7 .2 用户创建的类型转换 …………………………………………………… 23 2. 8 词法单元 …………………………………………………………………………… 24 2 .8 .1 注释 ……………………………………………………………………… 24 Ⅴ
  • 8. 2 .8 .2 数字 ……………………………………………………………………… 25 2 .8 .3 字符 ……………………………………………………………………… 26 2 .8 .4 字符串 …………………………………………………………………… 26 2 .8 .5 位串 ……………………………………………………………………… 26 习题 ……………………………………………………………………………………… 27 3 VHDL 最基本的表示方法 ………………………………………………………………… 29 3 .1 进程语句 …………………………………………………………………………… 29 3. 2 进程同步 …………………………………………………………………………… 32 习题 ……………………………………………………………………………………… 33 4 并行语句 …………………………………………………………………………………… 34 4 .1 BLOCK 语句 ……………………………………………………………………… 34 4. 2 并行过程调用 ……………………………………………………………………… 35 4. 3 并行断言语句 ……………………………………………………………………… 36 4. 4 并行信号赋值语句 ………………………………………………………………… 37 4. 4. 1 条件信号赋值语句 ……………………………………………………… 37 4. 4. 2 选择信号赋值语句 ……………………………………………………… 38 4. 5 元件例化语句 ……………………………………………………………………… 38 4. 6 生成语句 …………………………………………………………………………… 40 习题 ……………………………………………………………………………………… 41 5 顺序语句 …………………………………………………………………………………… 43 5. 1 变量赋值语句 ……………………………………………………………………… 43 5. 2 信号赋值语句 ……………………………………………………………………… 44 5. 3 IF 语句 …………………………………………………………………………… 44 5. 4 CASE 语句 ………………………………………………………………………… 45 5. 5 LOOP 语句 ………………………………………………………………………… 45 5. 6 NEXT 语句 ……………………………………………………………………… 46 5. 7 EXIT 语句 ………………………………………………………………………… 47 5. 8 断言语句 …………………………………………………………………………… 47 5. 9 过程调用语句 ……………………………………………………………………… 47 5. 10 RE T URN 语句 …………………………………………………………………… 48 5. 11 N UL L 语句 ……………………………………………………………………… 48 5. 12 REPORT 语句 …………………………………………………………………… 48 习题 ……………………………………………………………………………………… 49 6 表达式与运算符 …………………………………………………………………………… 50 习题 ……………………………………………………………………………………… 53 7 信号驱动源 ………………………………………………………………………………… 55 习题 ……………………………………………………………………………………… 56 8 延迟 ………………………………………………………………………………………… 57 8. 1 惯性延迟 …………………………………………………………………………… 57 Ⅵ
  • 9. 8. 2 传输延迟 …………………………………………………………………………… 59 8. 3 信号驱动源上传输延迟的作用 …………………………………………………… 59 8. 4 信号驱动源上惯性延迟的作用 …………………………………………………… 60 8. 5 信号驱动源的阈值惯性延迟的作用 ……………………………………………… 62 8. 6 保留字 UNAFFACT ED 的使用 ………………………………………………… 63 习题 ……………………………………………………………………………………… 64 9 模拟周期 …………………………………………………………………………………… 66 习题 ……………………………………………………………………………………… 67 10 δ 延迟 …………………………………………………………………………………… 69 10. 1 延缓进程 ………………………………………………………………………… 69 习题 ……………………………………………………………………………………… 70 11 VHDL 描述实例 ( 一 ) …………………………………………………………………… 72 11. 1 多路选择器模型 ………………………………………………………………… 72 11. 2 译码器模型 ……………………………………………………………………… 72 11. 3 组合逻辑模型 …………………………………………………………………… 73 习题 ……………………………………………………………………………………… 75 12 设计库 …………………………………………………………………………………… 76 12. 1 STD 库 …………………………………………………………………………… 76 12. 2 WORK 库 ………………………………………………………………………… 76 12. 3 资源库 …………………………………………………………………………… 76 12. 3. 1 IE EE 库 ……………………………………………………………… 77 12. 3. 2 V ITAL 库 ……………………………………………………………… 77 12. 4 USE 子句 ………………………………………………………………………… 77 习题 ……………………………………………………………………………………… 78 13 程序包 …………………………………………………………………………………… 79 13. 1 STANDARD 程序包 …………………………………………………………… 80 13. 2 T EXTIO 程序包 ………………………………………………………………… 80 13. 3 St d - Logic - 1164 程序包 ………………………………………………………… 81 13. 4 N umeric - Std 程序包 …………………………………………………………… 81 13. 5 N umeric - Bit 程序包 …………………………………………………………… 81 习题 ……………………………………………………………………………………… 81 14 属性 ……………………………………………………………………………………… 83 14. 1 用属性检查建立和保持时间 …………………………………………………… 84 习题 ……………………………………………………………………………………… 89 15 子程序 …………………………………………………………………………………… 90 15. 1 子程序重载 ……………………………………………………………………… 92 习题 ……………………………………………………………………………………… 96 16 决断信号和决断函数 …………………………………………………………………… 97 16. 1 决断信号 ………………………………………………………………………… 97 Ⅶ
  • 10. 16. 2 决断函数 ………………………………………………………………………… 97 习题 ……………………………………………………………………………………… 103 17 VHDL 描述实例 ( 二 ) …………………………………………………………………… 105 17. 1 使能模型 ………………………………………………………………………… 105 17. 2 振荡器模型 ……………………………………………………………………… 105 17. 3 时钟模型 ………………………………………………………………………… 106 17. 4 边沿触发器模型 ………………………………………………………………… 106 习题 ……………………………………………………………………………………… 107 18 信号与变量的区别 ……………………………………………………………………… 108 18. 1 信号赋值与变量赋值 …………………………………………………………… 108 18. 2 进程中的变量与子程序中的变量 ……………………………………………… 110 18. 3 共享变量 ………………………………………………………………………… 111 习题 ……………………………………………………………………………………… 113 19 描述风格 ………………………………………………………………………………… 114 19. 1 行为描述 ………………………………………………………………………… 114 19. 2 数据流描述 ……………………………………………………………………… 115 19. 3 结构描述 ………………………………………………………………………… 115 19. 4 混合描述 ………………………………………………………………………… 117 习题 ……………………………………………………………………………………… 118 20 配置 ……………………………………………………………………………………… 120 20. 1 默认连接 ………………………………………………………………………… 120 20. 2 配置指定 ………………………………………………………………………… 120 20. 3 配置说明 ………………………………………………………………………… 121 20. 4 直接例化 ………………………………………………………………………… 123 习题 ……………………………………………………………………………………… 124 21 作为激励语言的 VHDL ……………………………………………………………… 125 21. 1 测试基准描述 …………………………………………………………………… 126 习题 ……………………………………………………………………………………… 131 22 进一步了解 VHDL …………………………………………………………………… 132 22. 1 信号类 …………………………………………………………………………… 132 22. 2 被保护的块 ……………………………………………………………………… 132 22. 3 空事项处理 ……………………………………………………………………… 133 习题 ……………………………………………………………………………………… 134 23 有限状态机模型 ………………………………………………………………………… 135 23. 1 有限状态机的描述风格 ………………………………………………………… 136 23. 2 有限状态机的描述实例 ………………………………………………………… 136 习题 ……………………………………………………………………………………… 149 实验 1 ………………………………………………………………………………………… 151 实验 2 ………………………………………………………………………………………… 157 Ⅷ
  • 11. 自测题 ………………………………………………………………………………………… 165 附录 1 何处可得到有关 VHDL 的最新信息 ……………………………………………… 171 附录 2 何处可得到有关 VHDL 的帮助 …………………………………………………… 171 附录 3 一些有用的地址 …………………………………………………………………… 171 附录 4 缩写语 ……………………………………………………………………………… 171 附录 5 VHDL 保留字 ……………………………………………………………………… 172 附录 6 STANDARD 程序包 ……………………………………………………………… 173 附录 7 TEXTIO 程序包 …………………………………………………………………… 175 附录 8 STD - LOGIC - 1164 程序包 ……………………………………………………… 176 附录 9 英汉名词对照表 …………………………………………………………………… 180 参考文献 ……………………………………………………………………………………… 182 Ⅸ
  • 12. 1 为什么要用 VHDL 1. 1 为什么要用硬件描述语言 HDL 技术的飞速发展使集成电路的设计规模日 益增 大 , 复 杂程 度日 益增高。 伴随着 设计 规 模的增大 , 门级描述变得难以管理 , 不得不采用更抽象层次的描述方法 , 并接受高层次的、自 顶向下的设计方法。逻辑图和布尔方程曾经是描 述硬件 的方 法 , 但随着 系统 复杂程 度的 增 加 , 这种描述变得过于复杂 , 不便于使用。在高于 逻辑级 的抽 象层次 上 , 这种 方法很 难以 用 简练的方式提供精确的描述 , 在自顶向下的设计方法中不能再把它当作通常的描述手段 , 而 硬件描述 语 言 HDL ( hardware description language ) 则 逐 渐 成 为 满 足 以 上 要 求 的 新 方 法。 HDL 与高层次的软件程序设计语言类似 , 同时它又提供了以下功能 : 1 . 在希望的抽象层次上 , 可以对设计进行精确而简练的描述 ; 2 . 易于产生用户手册、服务手册等文件 ; 3 . 在不同层次上都易于形成用于模拟和验证的设计描述 ; 4 . 在自动设计系统中 ( 例如高层次综合工具和硅编译器 ) 作为设计输入 ; 5 . 可以作硬件和软件的联合设计 , 消除了硬件和软件开发时间上的间隔 ; 6 . 易于作设计的修改 , 易于把相应的修改并入设计文件中 ; 7 . 在希望的抽象层次上 , 可以建立设计者和用户 ( 老师和学生 ) 的通信界面。 和通常的软件程序设计语言不同 , HDL 的主要目的是用来编写设 计文件并 建立硬件 器 件的模拟模型。硬件系统的基本性质和硬件设计的方法决定了 HDL 的 主要特 性。HDL 的 语法和语义的定义是为了能描述硬件的行为 , 它应当能自然地描述硬件中并行的、非递归的 特性以及时间关系。 正如汇编语言被高级程序设计语言所代替那样 , 门级电路框图必然被 HDL 所代替。软 件设计者很喜欢使用高级语言程序的编译方法 , HDL 和硅编译器使得 硬件设计 者也能使 用 这种高层次设计的编译方法。 1. 2 各种 HDL 的浏览 自从 Iverson 于 1962 年提出 HDL 以来 , 已经出现许多 HDL。其中 , 绝大多数是专有 产 品 , 包括 Silvar- lisco 公 司 的 HHDL ( hierarchical HDL ) , Zycad 公 司 的 ISP, Gateway Design Automation 公司的 Verilog 以 及 Mentor Graphics 公司 的 BLM。高 等学 校 和科 研 单位 中 也 有上百种 HDL[ IDTC92 ] , 例如 AHPL , MI MOLA 以及 SCHOLAR。 此外 , 一 些 大型 计算 机 制造商也都有其内部使用的设计语言。例如 TIHDL 就是德 克萨斯仪 器公司 的硬件 描述 语 言 , 在该公司内部以其客户中采用 TI HDL 来描述其设计。 某些 HDL 是从已有的软件程序设计语言发展而来 , 例如 : BLM , M I MOLA 和 SCHOL- AR 是由 PASCAL 发展而来 , 而 Silicon Compiler 公司 的 M 以及 Gateway 公 司的 Verilog 则 1
  • 13. 以 C 语言为基础。英国国防部在皇家信号和雷达研究所于 1979 年开发了 EL LA , 在 VHDL 出现之前广泛应用于欧洲。UDL / I 在日本以标准 HDL 的形式出现。多年以来 , 设计者 一 直使用这些专用的 HDL 来描述他们的 军用 或民 用芯片 设计。 为了能 继续 生存 , Verilog 和 E LLA [ MoC194] 已经公开 , 因为它们最后 将成 为为 数不多 的标 准 HDL 之 一 , 而根据 定义 , 这样的标准不能是专用语言。 EDI F 经常被误认为是一 种硬 件描 述 语言。事 实上 , EDI F 不是 一种 语 言 , 而 是一 种 格 式 , 正如它的名字 : 电子设计交换 格式 ( Electronic Design Interchange Format , EDI F ) 。我 们 注意到这个细小 的 差别 是 因 为 : EDIF 原来 就 不 准 备 被人 们 用 于 阅 读或 书 写。 EDI F 是 由 CAD 工具制造商们鼓动起来的 , 用 于工 作于不 同数 据格 式上 的 CAD 工 具之 间 交换 设计 数 据。EDIF 可能适合于纯描述性文 件 , 但不适 合于 重新设 计的 过程 , 因为 EDI F 中未 包含 行 为描述。 1. 3 VHDL 的诞生 美国国防部的项目有众多的承包人 , 他们使用过多的设计语言 , 使得承包人甲的设计不 能被承包人乙再次利用 , 这就造成了信息交换困难和设计维护困难。为了解决这个问题 , 美 国国防部为他们的超高速集成电 路计划 ( Very High Speed Integrated Circuit, VHSIC ) 提 出 了硬件描述语言 VHDL( VHSIC Hardware Description Language , VHDL) , 这 个任务 交给 了 德克 萨 斯 仪 器 公 司、IBM 公 司 和 Intermetrics 公 司。 1987 年 12 月 IEE E 接 受 VHDL [ Leib89] 为标准 HDL , 这就是今天我们所了解的 IE EE St d 1076 - 1987 [ LRM87 ] 。此后 又 作了若干修改 , 增加了一些功能 , 新的标准版本记作 IE EE Std 1076 - 1993 [ LRM93] 。严格 地说 , VHDL’ 和 VHDL’ 并不完全兼容 ( 例如 , 增加了一些保留字并删去了某些属性 ) , 93 87 但是 , 对 VHDL’ 的 源 码 只 作 少 许 简 单 的 修 改 就 可 以 成 为 合 法 的 VHDL ’ 代 码 87 93 [ BFMR93] 。 表 1. 1 VHDL 的发展过程 年 第一季度 第二季度 第三季度 第四季度 1993 第二次投票通过 I EEE Std 1076-1993 获批准 1992 再次投票通过 1987 评审 1076 / A 语言参考手册 1076 / B 反对票的反应 I EEE Std 1076-1987 获批准 1986 VHDL 分析和标准化小组 语言参考手册 语言参考手册 第一次会议 第一次草稿 第二次草稿 1076/ / A 1985 V7 .2 I EEE 开始标准化工作 1984 V2 .0 V5 .0 V6 .0 1983 美国国防部提出需求 和 TI , IBM 及 Intermet rics 开始工作 公司签约 2
  • 14. 1988 年 9 月 30 日之后 , 美国国防部要求开发 ASIC 的合同文件一律 采用 V HDL 文档。 VHDL 逐渐演变为工业标准的过程示于表 1 .1。 1 .4 设计的表示方法 设计的表示方法涉及两方 面的 问 题 : 领域 和层 次。在 表 1 .2 中 , 垂 直 方向 表 示抽 象 层 次 , 水平方向表示领域。表 1 .2 中有行为、结构 和物 理等 3 个领 域。对于 每一 个领域 , 都 可 以分为 5 个 抽 象 层 次 : 系 统 级 ( architectural 或 system) 、 法 级 ( algorit hmic, sub- system 或 算 chip level ) 、寄存器传输级 ( register- transfer , functional block 或 micro - architecture ) 、逻辑 级 ( logic 或 gate level ) 和电路级 ( circuit ) 。 表1 . 2 设计的表示方法 : 领域和抽象层次 领 域 层 次 行 为 结 构 物 理 CPU、存储器、开 芯片、模块、电 系 统 级 性能描述 关、控制器以及总 路板以及子系统 线之间的逻辑连接 的物理划分 算 法 级 I / O 应答算法 硬件模块 部件之间的物理连接 ( 子系统级或芯片级 ) ( 数据结构操作) 数据结构 ( board , floor-plan ) 并行操作 , 寄存器 ALU、多路器、寄存器、 寄存器传输级 传输 , 状态序列 总线、微定序器、微存 芯片、宏单元等 (状态表 ) 储器等功能块的物理连接 逻 辑 级 布尔方程 门、触发器、锁存器 标准单元布图 电 路 级 微分方程 晶体管、电阻、电容 晶体管布图 不幸的是 , 在一些人的概念中 , 许多抽象层次名字的含义早已和某个特定的领域有了联 系 , 而不是像表 1 .2 所示的那样和 3 个领域都有联系。例如 , 某些人可能认为逻辑级和电路 级只是结构领域的元件 ; 而算法级只是行为领域的 1 个级别 , 某些作者也把物理领域称作几 何领域。尽管如此 , 更多的人还是接受了表 1 .2 所示的名字。 行为领域描述 1 个设计的基本功能 , 或者说该电路或设计应该做什么。从概念上讲 , 纯 行为是输入和输出关系的描述 , 例如布尔方程组就是组合逻辑网络的行为描述。 结构领域描述逻辑结构 , 或者说描述设计的抽象实现 , 典型的是抽象模块相互连接的网 表。例如 , 在寄存器传输级 , 抽象模块是 ALU、多路选择器、寄存器等。 物理领域描述设计的物理实现 , 或者说把结 构领域 里的 抽象 元件代 之以 真正的 物理 元 件。例如在寄 存器传 输级 , 物理领 域描述实 现 ALU 、 路选择 器和寄存 器等所需 的平面 布 多 图。在所有的抽象级别里 , 速度、功耗以及面积约束等通常是物理领域的一部分。 无论是领域还是层次级别 , 他们的边界都是可以重叠的。 1 个 设计的描 述 , 通常在领 域 方面以及在层次级别方面都 可以 混合 表示。1 个典 型的 寄存器 传输 级描 述 , 通 常既 包含 行 为特性又包含结构特性 , 既包含寄存器级元件 又包 含逻辑 级元 件。任何 设计 的最终 实现 是 3
  • 15. 物理实现 , 换句话说 , 集成电路的制造数据库应当由许多多边形来表示。 1 . VHDL 的能力范围 5 VHDL 既可以被计算机阅 读又 可 以被 人阅 读 , 它支 持 硬件 的设 计、 证、 合 和 测试。 验 综 此外 , 它还支持硬件设计数据的交换、维护、修改和硬件的实现 [ LRM87] [ WaSC89] 。 VHDL 支持行为领域和结构领域的硬件描述 , 并且 可以 从最 抽象的 系统 级一直 到最 精 确的逻辑级。VHDL 主要优 点 之一 是 : 在描 述数 字系 统 时 , 可以 使用 前后 一 致的 语义 和 语 法跨越多个层次 , 并且使用跨越多个级别的混合描述模拟该系统。因此 , 可以对由高层次行 为描述子系统及低层次详细实现子系统所组成的系统进行模拟。 上述特性使得系统的原始描述能够方便地 反映设 计者 的意图。 在维 护系统、 新设 计 重 或更改部分设计时 , 可以用原来的测试集对修改过的 V HDL 描述重新模拟。 VHDL 描述能力的范围示于图 1 .1 [ Hand90 ] 。 图 1 .1 V HDL 描述能力的范围 请 注 意 , V HDL 并 不 具 有 描 述 模 拟 电 路 的 能 力。 虽 然 某 些研 究 的 结 果 以 实 例 表 明 , VHDL 的描述能力可以扩展到电路级 [ HaSt91 ] , 但是在 这个 级别上 , VHDL 不是一 种理 想 的语言。把 VHDL 的描述能力扩展到描述模 拟电路 由 IE E E 的 1076 .1 小 组进 行。该小 组 正在设计一种新语言 , 以便既能描述模拟电路 又能 描述数 模混 合电 路。这种 新语言 和我 们 4
  • 16. 即将提到的 描 述 数 字 电 路 的 VHDL’ 非 常 接 近。 该 小 组 计 划 将 其 成 为 标 准 [ V Tfa94 93 ] 〔1〕。 1. 6 一个 VHDL 的描述实例 图 1 .2 所示是 1 位加法器的逻辑图 , 其 V HDL 的描述如下所示 : 图 1 .2 1 位加法器逻辑图 ENTI TY one - bit - adder IS ∶ POR T ( a , b , c - in IN Bit ; ∶ c - ou t , sum O UT Bit ) ; END one - bit - adder ; ARCHI TECT URE logic OF one - bit - adder IS ∶ SIG NAL int Bit ; BEGIN int < = a XOR b AFT ER 10 ns; c - out < = ( a AND b) OR ( int AND c - in ) AFT ER 20 ns; sum < = int XOR c - in AFT ER 10 ns; END logic; 1 . VHDL 的 CAD 工具 7 许多公司都提供 VHDL 工具 , 其中包括 VHDL 的创始 者 ( 例 如 In termetrics 公司 , 不 过 该公司的 VHDL 分部已被 Valid 公 司收 购 , 而 此后 不久 , Valid 公司 又 并入 Cadence 公司 ) , 也包括一些大型 EDA 的公 司 ( 例 如 Cadence, Men tor Graphics , ViewLogic, Synopsys 等 ) , 还包括一些专 门领 域的 公司 ( 例如 CLSI , Model- T echnology , Van tage 等 ) 。V HDL 模 拟 器 和综合器已经是商业软件 , 可以在多种工作平台上运行 ( V HDL 描述 不是 100 % 可以被综 合 的 , 不同公司提供的工具软件在描述风格和构造方面会有不同的指南和限制 , 满足这些要求 的 VHDL 描述才能被该公司提供的工具所综合 ) 。 VHDL 技 术 小 组 ( h ttp∶ / www . vhdl . com/ V HDLVendors/ Vendors . h tm ) 已 对 许 多 / VHDL 商家的工具软件作过编译。 〔1 〕 目前仍 在制 定中。 — —译 者注 — 5
  • 17. 欧洲有 1 个促进 元件、子系统 及微系统 技 术 发 展 的 组 织 E UROP RACTICE ( htt p∶ / / www .te .rl .ac .uk/ europractice) , 通过他们可以 得到和 VHDL 有 关的 工 具。图 1 .3 列举 的 仅 是 VHDL 工具的一部分。 Altera Altera 公司 的 PLSM- V HDL ( 适 用 于 个 人 计算机 ) 和 PLSM- V HDLWS ( 适用 于 SUN4 和 HP 9000 工作站 ) 是 VHDL 的 设 计 输 入工 具 , 支持 该公 司的 Classic, Max 5000 , Max 7000 , 图 1 .3 VHDL 的 CAD 工具 Flex 8000 等 可 编 程 器 件 系 列。Altera 还 提 供 和 Mentor- Graphics , Cadence 以及 Synopsys 工具的接口和库。 Cadence 该公司宣称他们的 VHDL 模拟器 ( Leapforg ) 是工业 界最快的 V HDL 模拟器 , 并且和 逻 辑综合工具的 Synergy 系列紧密相连 [ V Tfa94] 。 Mentor Graphics 该公司 提 供 V HDL 模拟 器 QuickVHDL 和 Q uickSim II , 以及 VHDL 综 合 工具 Auto- logic VHDL。 Synopsys 该公司提供 VHDL 系统模拟器 ( VSS Expert ) 和 VHDL 编译器。该模拟器有 1 条命令 , 可以告知程序的其中 1 行执行了多少次。留意观 察这些 数字 , 就 可以知 道该 模型或 测试 基 准的哪一部分执行的次数最少。 根据设计者的输入数据以及设计者目前 所处的设 计阶段 , Synopsys 的 Design Power 可 以快速给出比较精确的功耗反馈 信息。 在设 计的早 期阶 段 , Design Power 根 据设计 者对 电 路状态转换频率的粗略估计 , 可以快速给出功耗反馈信息 , 设计者利用此信息可以对设计指 标作出折衷选择。在设计的后期 , 在门级优化阶段 , Design Power 利用门级模拟 器提供的 精 确的电路状态转换数据 , 可以给出精确的功耗反馈信息。 Model- Technology 该公司提 供 在 个 人 计 算 机 Windows 环 境 下 运 行 的 VHDL 模 拟 器 ( V-System/ Win- dows) , 它也有在工作站上运行的版本。 此外 , VEDA 和 XILI NX 公司也支持 V HDL 设计输入。V EDA 有 1 个叫作 VHDL Pat h 的工具 , 它可以计算语句的作用范围、分支的作用范围、条件的作用范围、路径的作用范围和 信号的作用范围 , 并给出统计报告。 习题 1 . 什么是 VHDL ? 简述 VHDL 的发展史。 2 . 用领域和层次的概念简述 VHDL 的描述能力。 3 . VHDL 适合于设计流程中的哪些部分 ? 6
  • 18. 2 基本的 VHDL 模型结构 2. 1 设计实体 设计实体是 VHDL 中的基本单元和最重要的抽象 , 它可以代表整个系统、 块电路板、 1 1 个芯片、 个 单 元 或 1 个 门 电 路。它 可 以 代 表 像 1 微处理器那样复 杂 的 电路 , 也可 以 代表 像 单个 逻 辑门那样简单的 电 路 , 对 于 设计 实 体可 以 代表 什 么几乎没 有 限 制。 实际 上 , 1 个 设 计 实 体 由 1 个 实体说明和 1 个 结构 体 组成 , 如图 2 .1 所 示。在 VHDL 中 , 设计实体是 1 个模块 , 这 个模块 可以是 图 2 .1 设计实体的表示 设计中的 1 个元件 , 也可以是设计的顶层模块。 2. 2 实体说明 设计实体是 1 个初级设计单元 , 它可以单 独编 译并且 可以 被并 入设计 库。它给 实体 命 名并给实体定义 1 个接口 , 接口信息用于和其 它模 块通信。 实体 说明是 1 个 器件的 外部 视 图 , 即从器件外部看到的器件外貌 , 其中包 括该 器件 的端口。 实体说 明也 可以 定义参 数 , 并 把参数从外部传入模块内部。下面是实体说明的一般格式 , 其中的黑体字选项是 VHDL’93 语法的要求。 ENT I TY 实体名 IS [ GENERIC ( 类属表 ) ; ] [ P OR T ( 端口表 ) ; ] 实体说明部分 ; [ BEGIN 实体语句部分 ; ] END [ ENTITY ] [实体名 ] ; 2 .2 . 1 类属和 端口说明 类属表和端口表是实体说明的头 , 它们说明用于设计实体和其外部环境通信的对象。 类属为设计实体和其外部环境通信的静态信息提供通道 , 特别是用来规定端口的大小、 实体中子元件的数目、实体的定时特性等等。 GEN ERIC ( [ CONS TAN T ] 名字表 : [ I N ] 子类型标识 [∶ 静态表达式 ] , … ) ; = 端口为设计实体和其外部环境的动态通信提供通道 , 每 个端口必 须有 1 个名字、 个 通 1 信模式和 1 个数据类型。名字是该端口的标识符 , 模式说明数据通过该端口的流动方向 , 类 7
  • 19. 型说明流过该端口的数据类型。 POR T ( [ SIGNAL ] 名字 : [ 模式 ] 子类型标识 [ BUS ] [∶ 静态表达式 ] , … ) ; = 因为关键字 PORT 之后必须是信号类 , 所以略去关键字 SI GNAL 也不会 引起歧义。 如 果该端口和多个输出端相连 , 就要使用关键字 BUS。 从双连符 (-- ) 到本行 之末 的一段 文字 是 V HDL 的注 释。 注释对 VHDL 正文的意义没有影响。举例如下。 图 2 .2 半加器 下面是图 2 .2 所示半加器的 VHDL 描述。 -- 只有端口说明的实体说明 ENT I TY half - adder IS -- V HDL 不区分大小写 ∶ POR T ( x , y IN Bit ; -- 所有端口为 SIGNAL 对象类型 , 可忽略 ∶ sum , carry OUT Bit ) ; END ENTITY half - adder ; -- 有类属和端口说明的实体说明 ENT I TY andg IS ∶ ∶ GENERIC ( t pd - hl , tpd - lh Time = 1 ns; -- 典型延迟 ∶ ∶ n Positive = 2 ) ; -- 与门的输入端数目 ∶ POR T ( inpu t Bit - Vector ( 1 TO n) ; -- 模式省略 , 默认为 IN 模式 ∶ output O UT Bit ) ; END ENTITY andg ; -- 没有类属和端口说明的实体说明 ENT I TY testbench IS END test bench ; 2 .2 . 2 端口模 式 在电子线路级别之上观察 1 个设计时 , 把连接点和数据流向联系起来通常会带来方便。 为满足此要求 , VHDL 提供了下述端口模式 : IN ( 流入实体 ) , OU T ( 流出实体 ) , INOU T ( 双向端口 : 既可流入 , 又可流出 ) , BUFFER ( 也是双向端口 , 但限定该端口只能有 1 个源 ) 。 VHDL 对于 端口 的读 写规则 如下 : 只 有在端 口模 式为 I N , INOU T 或 BU FFER 时 , 才 能从该端口读入数据 ; 只有在 端口 模式 为 OU T , INO U T 或 BUFF ER 时 , 才 能 向该 端口 写 数据。模式为 BU FFER 的端口和 模式 为 INOU T 的 端口 相似 之 处是 : 它 们既 可 读又 可写 ; 不同之处是 : BUFF ER 端口只能有 1 个源 ( 不管它的子类型是否是决断类型 ) 。 VHDL’ 允许使用属性 ′ 93 Driving - Value 从 OU T 或 INO U T 端 口 读 取信 号 的驱 动 值 ( 或贡献值 ) 。 2 .2 . 3 实体说 明部分 实体说明中的说明部分定义的项目是该实体接口中的公共信息 , 举例如下 : 8
  • 20. -- 有实体说明项目的实体说明 ENT I TY ram IS ∶ POR T ( addr IN Bit - Vector (15 DOWNTO 0 ) ; ∶ data OU T Bit - Vector ( 31 DOWNTO 0 ) ; ∶ sel IN Bit ) ; TYPE instruction IS ARRAY ( 1 TO 5 ) of Natural ; TYPE program IS ARRA Y ( Natural RANGE < > ) OF instruction ; U SE Work .timing - pkg ; ∶ PROCEDUR E initialization ( SIG NAL con ten t Bit - Vector ( 31 DOWNTO 0 ) ) IS BEGI N con ten t < = ( OTHERS = > ′1′) AFTE R some - delay ; END PROCED URE initialization ; END ENTITY ram ; 2 .2 . 4 实体语 句部分 实体说明中的语句是每一设计实体接口的共同部分 , 它们仅可以是下述并行语句 : 并行 断言语句、并行过程调用语句或被动进程语句。所有这些语句必须是被动语句 , 即其中不含 信号赋值。举例如下 : -- 有实体说明项目和语句的实体说明 U SE Work .my - pkg .ALL ; -- 假设 my - pkg 包含 word 类型说明 ENT I TY latch IS ∶ P OR T ( din IN word ; -- word 类型必须定义在 1 个程序包中 ∶ dou t OU T word ; -- 例如 my - pkg 程序包 , 程序包对该实体可见 ∶ load , clk IN Bit ) ; ∶ ∶ CONSTANT set up Time = 12 ns; U SE Work .timing - pkg .ALL ; -- 假设程序包 timing - pkg 包括 CheckTiming 过程 BEGIN CheckTiming ( set up , din , load , clk ) ; END latch ; 2 .3 结构体 结构体是次级设计单元 , 在其对应的初级设 计单元 实体 说明 被编译 并且 被并入 设计 库 之后 , 它就可以单独地被编译并且被并入该设 计库 之中。结 构体 描述 1 个设 计的结 构或 行 为 , 把 1 个设计的输入和输出之间的关系建立起来。1 个 设计实体 可以有 多个结构 体 , 分 别 代表该器件的不同实现方案。 结构体的描述格式为 ( 其中的黑体字为 V HDL’ 的语法要求 ) : 93 ARCHI TECT URE 结构体名 OF 实体名 IS -- 说明语句 BEGIN 9
  • 21. -- 并行语句 END [ ARCHITECTURE ] [ 结构体名 ] ; 例如 : ARCHI TECT URE behavl OF half - adder IS ∶ CONSTA NT delay : Time = 5 ns ; BEGIN p1 : PROCESS -- p1 为可选的进程标号 BEGI N sum < = x XOR y AFTE R delay ; carry < = x AND y AFT ER delay ; WAI T O N x , y ; END PROCESS p1 ; END ARCHITECTURE behavl ; 上述例子中 有 1 个 进 程 语 句。 在 该 进 程 语 句 中 , 有 2 个 信 号 赋 值 语 句 和 1 个 等 待 ( WA IT) 语句。此进程语句描述了数据的传送和定时关系 , 它们合起来构成半加器的行为。 前文已经提到 , 可以为 1 个实体说明写上 几个 结构体。 结构 体描述 中的 实体名 把结 构 体和实体说明联系了起来。下面是 1 个实体具有 2 个结构体的实例 : -- -- 下面的模型与 VHDL’ 相符 , 已用 V- System / Windows V4 .2 e 进行过模拟 93 -- ENT I TY coun t2 IS -- 该实体有 2 个结构体 ∶ ∶ GENERIC ( tpd Time = 10 ns ) ; ∶ POR T ( clock I N Bit ; ∶ q1 , q0 OUT Bit ) ; END ENTITY count2 ; -- count2 的一个结构体 , 另一个在下面 ARCHI TECT URE arch1 OF coun t2 IS BEGIN ∶ count - up PROCESS ( clock ) ∶ ∶ VARIABLE coun t - value Natural = 0 ; BEGI N IF clock = ′1′THEN -- 时钟上升沿 ∶ count - value = ( coun t - value + 1) MOD 4 ; q1 < = bit′ ( coun t - value / 2 ) AFT ER tpd ; Val q0 < = bit′ ( coun t - value MOD 2 ) AF TER t pd ; Val END IF ; END PROCESS count - up ; END ARCHITECTURE arch1 ; -- T 型触发器 , 用作 count2 另一个结构体的元件 ENT I TY t - ff IS ∶ ∶ GENERIC ( t pd Time = 5 ns ) ; -- 默认延迟时间 10
  • 22. POR T ( clk I N Bit ; q IN OUT Bit = ′ ; ∶ ∶ 0′) END ENTITY t - ff ; ARCHI TECT URE only OF t - ff IS BEGIN PROCESS ( clk ) BEGI N IF clk = ′1′T HEN q < = NOT q A FTE R t pd ; END IF ; END PROCESS; END ARCHITECTURE only ; -- count2 的另一个结构体 ARCHI TECT URE arch2 OF coun t2 IS ∶ SIG NAL ff0 , ff1 , inv Bit ; BEGIN t - ff1: ENTITY Work .t - ff ( only ) -- VHDL’ 中的直接实体例化 93 GENERIC MAP ( tpd => 4 ns) -- 有效的延迟值 PORT MAP ( clk = > clock, q = > ff0 ) ; -- 名字关联 t - ff2: ENTITY Work .t - ff ( only ) GENERIC MAP ( 4 ns) PORT MAP ( inv, ff1 ) ; -- 位置关联 ∶ inveter inv < = NOT ff0 A FTE R 2 ns; q0 < = ff0 ; q1 < = ff1 ; END ARCHITECTURE arch2 ; 2 .4 标识符的命名规则 VHDL’ 中关于标识符的语 法规则 被 VHDL’ 全 部接 受并 加以 扩展。 为了 对二 者 87 93 加以区分 , 前者称为短标识符 , 后者称为扩展标识符。 2 .4 . 1 短标识 符 VHDL 的短标识符为遵守以下规则的字符序列 : 有效字符 : 英文字母 (′ -′ ,′ -′ ) 、 a′ z′ A′ Z′ 数字 (′ -′ ) 和下划线 (′ ′。 0′ 9′ - ) 必须以英文字母打头。 下划线 (′ ′ 的前后都必须有英文字母或数字。 - ) 短标识符不区分大小写。 下面的字符序列可看作同一短标识符的不同表示形式 : half - adder Half - adder Half - Adder HALF - ADDER 11
  • 23. 下面的字符序列不是合法的短标识符 : illegal% name 2illegal - name - illegal - name illegal - name - illegal - - name 某些标识符 ( 例如 E NTI TY , ARCHIT ECT U RE , BEG IN , END ) 是 VHDL 的保 留字。 为了醒目和易于发现错误 , 建 议 VHDL 的保 留字 用大写 字母 , 而 用户自 己创 建 的标 识符 用 小写字母。 2 .4 . 2 扩展标 识符 扩展标识符具有以下特性 : 扩展标识符用反斜杠来定界。例如 : valid , end - with - an - underscore - 都是合法的扩展标识符。 允许包含图形符 号 ( 例如 CR , LF , EF 等 ) , 但没 有 格式 的 作 用。允 许包 含 空 格符。 例如 : chip A and B , $500 & E , legal% name 都是合法的扩展标识符。 2 个反斜杠之间的字可以和保留字相同。例如 : buffer , en tity 都是合法的扩展标识符。 2 个反斜杠之间的字可以用数字打头。例如 : 80p 是合法的扩展标识符。 扩展标识符中允许多个下划线相邻。例如 : three - - - underscores 是合法的扩展标识符 ( 但不推荐 ) 。 扩展标识符区分大小写。例如 : ADDER 与 Adder 不同。 扩展标识符永远和短标识符不同。例如 : Counter 和 Counter 不同 ; 也和 coun ter 不同。 扩展标识符的名字中如果含有 1 个反斜杠 , 则用相邻的 2 个反斜 杠来代表 它。例如 : Ab C 表示该扩展标识符的名字为 Ab C( 共 4 个字符 ) 。 使用扩展标识 符 的 目 的 与 使 用 短标 识 符 的 目 的 相 同 , 但 免 受 短 标 识 符 的 那 些 限 制。 VHDL 的保留字列 于 附录 5。 由 于 VHDL’ 引 入 新 的 保 留 字 , 这 些 新 保 留 字 有 可 能 与 93 VHDL’ 的 文件 中用户 定义 的标识 符同 名。为保 持向 上兼 容性 , 一个 好的 解决办 法是 把 87 这些引起冲突的标识符改成扩展标识符。再次提醒读者 , 扩展标识符是区分大小写的。 2 .5 对象 VHDL 中的对象是一些存放值的容器 , 共有 4 类 : 信号、变量、常量和文件。信号和变量 都可以连续地被赋值 , 而常量只可以在它被说明的时候被赋值 ( 仅此 1 次 ) 。 VHDL’ 把文 93 件也当作对象。和以往一样 , 不可以通过赋值 来更 新文件 的内 容。文件 可以 作为参 数向 子 程序传递 , 通过子程序对文件进行读和写操作。文件参数没有模式。 在实体说明中 , 端口子句把对象说明为端口 , 默认类为信号类。 对象说明的格式为 : 12
  • 24. 对象类别 标识符表 : 子类型标识 [∶ 初值 ] ; = 举例 : ∶ ∶ CONSTANT delay1 , delay2 Time = 10 ns ; ∶ VARIABLE sum Real ; ∶ SIGNAL clock Bit ; F ILE inpu t Text IS IN ″ ∶ STD - INP UT″; 绝大多数情况下 , 在说明 1 个常 数时 必须 给 它 1 个初 始 值。但 是 , 在 非常 特 殊的 情 况 下 , 在程序包中说明 1 个常数时 , 可以不给它指定初始值。这样的常数叫作缓定常数。 如果 在同一个 对象说 明语句中 给多个 对象指定 了 1 个 初始值 , 则 这些对象 都获得 此 同一初始值。例如 , 在上面的常数说明语句中 , delay1 和 delay2 各自的初始值都是 10 ns。 如果在说明信号或变量时没有指定初始值 , 系统则认为它取默认值 , 即该 类型的最 左 值或最小值。例如 , 在上面的信号 clock 的说明语句中 , clock 的默认的初始值为′ 。 0′ 可以用函数调用的方式给对象赋初值。例如 : CONS TAN T const1∶ Integer∶ your - function ( True , 3 ) ; = 2 .6 数据类型和子类型 VHDL 有很强的数据类型。正是由于这些数据类型 , 才使得 VHDL 能够创 建高层次 的 系统和算法模型。属于强类型语言的 VHDL 的特点在于 : 每一个对象 具有 1 个 类型且只 能 具有那个类型的值 ; 施加于某对象上的操作的类型必须与该对象的类型匹配 , 即定义 1 个操 作时必须指明其操作对 象的 类 型。V HDL 的 强类 型特 性 使得 能尽 早地 发现 类 型不 匹配 方 面的错误。例如 , 把不同类型的信号连接起来 就是 非法的。 对象 的类型 在说 明该对 象时 已 被确定。 VHDL 有许多预定义类型 , 用户可以不必显式 说明而 直接 使用 它们。这 些预定 义类 型 在标准 ( STANDARD) 程 序 包 中 , 见 附录 6。 预定 义 类 型包 括 : 整 数 类 型 In teger , 浮 点 类 型 Real, 枚举类型 Boolean , Bit, Severit y - Level 和 Character , 以及物理类型 Time。 2 .6 . 1 标量类 型 标量类型包括 : 整数类型、浮点数类型、 举类 型和物 理类 型。V HDL 还 允许设 计者 为 枚 自己定义数据类型。举例如下 : TYPE twos - comp IS RA NGE - 32768 TO 32767 ; TYPE word - index IS RAN GE 15 DOWNTO 0 ; TYPE voltage IS RANGE 0 .0 TO 10 .0 ; 类型说明中的关键字 RANGE 限定该类 型的取 值范 围 , 该类 型的对 象的 取值如 果超 出 此范围 , 则为非法。举例如下 : TYPE Std - ULogic IS ( ′U′ -- 未定 ′ X′ -- 强制未知 13
  • 25. ′0′ -- 强制 0 ′1′ -- 强制 1 ′ Z′ -- 高阻 ′W′ -- 弱未知 ′L′ -- 弱 0 ′H′ -- 弱 1 ′ -′ -- 无关 ); -- 程序包 Std - Logic - 1164 中的预定义类型 TYPE Bit IS ( ′ , ′ ; 0′ 1′) -- STANDARD 程序包中预定义的类型 TYPE QSim - State IS ( ′ , ′ , ′ , ′ X′ 0′ 1′ Z′) -- Men tor Graphics 预定义的类型 TYPE Severit y - Level IS ( Note , Warning , Error , Failure) ; -- STANDARD 程序包中预定义的类型 TYPE t raffic - lights IS ( red , yellow, green ) ; 请注意 , 短标识符不区分大小写 , 而字符 文字 区分 大小写 , 因 此 , 字符 文字 a” 字符 文 “ 和 字“A”不同。枚举类型中的标识符不区分大小写 , 因此类型 Severity - Level 中的标识 符 note 和 Note, NOT E 相同。 物理类型定义规定 1 个取值范围、 个基本单位和若干个 (0 至多个 ) 次级单位。次级单 1 位是基本单位的整数倍。例如 : TYPE resistance IS RA NGE 1 TO 10 e9 U NI TS oh m ; -- 基本单位 kohm = 1000 ohm ; -- 次级单位为基本单位的整数倍 END U NITS; 2 .6 . 2 复合类 型 复合类型包括数组和记录。数组用于定义同一 类型 值的 集合 , 记录 用于 定义可 能不 同 类型值的集合。 数组可以是一维 ( 有 1 个下标 ) 数组或多维 数组 ( 有 多个下 标 ) 。此外 , 数 组类型 还可 分 为限定性数组和非限定性数组 : 限定性数组下标的取值范围在该数组类型定义时就被确定 ; 而非限定性数组下标的取值范围随后才确定。举例如下 : TYPE Bit - Vector IS ARRAY ( Natural RANGE < > ) OF Bit ; -- STANDARD 程序包中预定义的 类型 TYPE word IS ARRAY ( 31 DOWNTO 0 ) OF Bit ; TYPE memory IS ARRAY ( address ) O F word ; -- 即 : 地址可以为 In teger 类型 TYPE matrix IS ARRAY ( 1 TO 8 , 1 TO 8 ) OF R eal ; TYPE St ring IS ARRAY ( Positive RANGE < > ) OF Character ; -- 预定义的类型 TYPE lpc - coef IS ARRAY ( Natural RANGE < > ) OF Real ; 可以把 < > ” “ 看作下标范围的占位符 , 在今 后用到 该数 组类 型时再 填入 具体的 数值 范 围。例如 , 1 个对象要被说明为具有 8 个元素的向量就可以写作 : ∶ VARIABLE item lpc - coef ( 7 DOWNTO 0 ) ; 14
  • 26. 在 VHDL 中 , 类型 Bit 和 Bit - Vector 分别是字符 ( ′ ,′ 和 字符数 组 , 它 们仅和逻 辑 0′ 1′) 运算有关 , 而没有任何数字值的意义。 记录类型的实例如下 : TYPE mon th - name ( Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec ) ; TYPE date IS R ECORD ∶ day Integer RAN GE 1 TO 31 ; ∶ mon th mont h - name ; ∶ year Integer RANGE 0 TO 3000 ; END R ECORD; 可以对 1 个复合类型的信号整体赋值 , 也可以对其子元素分别赋值。例如 , 如果我们把 today 说明为 date 类型 ( 前面已将 date 说明为记录类型 ) 的变量 : ∶ VARIABLE today date ; 那么 , 整体赋值 ∶ today = ( 15 , May , 1995 ) ; 和下述分别赋值等价 : ∶ today .day = 15 ; today .month∶ May ; = ∶ today .year = 1995 ; 也可以采用名字关联的 方法。 在此 情况 下 , 子 元素 出现 的前 后 顺序 就 没有 什 么 关系。 例如 : ∶ today = ( mon th = > May , day = > 15 , year = > 1995 ) ; 对于只包含单个元素的聚集来说 , 必须使用名字关联的方法进行赋值 , 其目的是把它和 被括号括起来的表达式区别开来。例如 , 有如下的说明 : TYPE single IS RECORD ∶ a Integer ; END R ECORD; SIGNAL s single ; 〔 1〕 ∶ 下面是对信号 s 赋值的几个例子 : s <= 1; -- 不合法 s <= ( 1 ) ; -- 不合法 s < = ( a => 1 ) ; -- 命名关联 , 合法 s .a < = 1 ; -- 指定域名字 , 合法 对于我们所讨论的问题 , 下面的 1 段测试程序比上面的实例表述得更为清楚 : 〔1 〕 原文误 为 signal , 译 者已作 改正 。— — 译者 注 — 15
  • 27. ENTI TY tests IS END; ARCHI TEC TUR E record - type O F tests IS TYPE mon th - name ( Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec ) ; TYPE date IS R ECORD ∶ day In teger RA NGE 1 TO 31 ; ∶ mon th mon th - name ; ∶ year Integer RANGE 0 TO 3000 ; END R ECORD date ; TYPE single IS RECORD ∶ a Integer ; END R ECORD single; BEGIN PROCESS ∶ VARIABLE birt hday , graduation - day , today date ; ∶ VARIABLE s single; BEGIN -- 复合变量整体赋值 ∶ bir thday = ( 12 , Apr , 1964 ) ; -- 复合变量的子元素分别赋值 ∶ graduation - day .day = 19 ; graduation - day .mon th∶ Jul; = ∶ graduation - day .year = 1995 ; -- 名字关联 , 顺序不重要 ∶ today = ( mon th = > May , day = > 15 , year = > 1995 ) ; -- 单元素复合类型变量必须采用名字关联 ∶ s = ( a => 1 ) ; -- 正确 -- 或指定域 ∶ s .a = 2 ; -- 正确 -- 下面 2 个赋值不好 , 可能引发编译错误 : 赋值类型不兼容 ∶ s = 3; -- 错误 ∶ s = ( 4 ); -- 错误 WAIT ; END PROCESS ; END ARCHITECTURE record - t ype ; 给数组赋值有几种不同的方法 , 举例如下 : -- 下面的 V HDL 代码包括不同的类型赋值格式 , 编译无错。 LIBRARY I EEE ; USE I EEE .S td - Logic - 1164 .ALL ; ENTI TY typecast IS ∶ P OR T ( in1 , in2 IN Std - Logic; ∶ ou t1 O UT St d - Logic ) ; END ENTITY typecast ; 16
  • 28. ARCHI TEC TUR E test OF typecast IS BEGIN PROCESS( in1 , in2 ) ; ∶ VARIABLE temp Std - Logic - Vector( 1 DOWNTO 0 ) ; BEGIN -- 将数组值赋值给变量 temp 的不同方法 ∶ temp = ( in1 , in2 ) ; ∶ temp = in1 & in2 ; ∶ temp = St d - Logic - Vector′ in1 , in2 ) ; ( ∶ temp = St d - Logic - Vector′ in1 & in2 ) ; ( ∶ temp = St d - Logic - Vector ( 1 DOWNTO 0 )′ in2 , in1 ) ; ( ∶ temp = St d - Logic - Vector ( 1 DOWNTO 0 )′ in2 & in1 ) ; ( -- 用 CASE 语句描述 1 个异或门 CASE Std - Logic - Vector′ in1 , in2 ) IS ( -- 此处需要类型赋值 WHEN ″00″= > out1 < = ′ 0′; WHEN ″01″= > out1 < = ′ 1′; WHEN ″10″= > out1 < = ′ 1′; WHEN ″11″= > out1 < = ′ 0′; WHEN OTHERS = > out1 < = ′ X′; END CASE ; END PROCESS ; END ARCHITECTURE test ; 2 .6 . 3 存取类 型 存取类型实际上是指针类型 , 它被用来在对象之间建立联系 , 或者给新对象分配或释放 存储空间。在普通 VHDL 的程序中很少用到存取类型 , 许多关于 V HDL 的书中甚至不介绍 这种类型。本 书 在 这 里 提 到 它 , 也 仅 仅 是 为 了 完 整 性。 欲 知 详 情 , 请 参 阅 IEE E 标 准 的 VHDL 语言参考手册 [ LRM93 ] 。 在 IEE E St d - 1076 的程序包 TEX TIO 中 , 有 1 个预 定义 的存 取类型 Line ( 用户 也可 以 定义自己的存取类型 ) : TYPE Line IS ACCESS St ring ; 这表示类型为 Line 的变 量 是 指向 字 符串 值 的指 针。 只有 变 量才 可 以是 存 取 类型 , 例 如: VARIABLE line - buffer∶ Line; 2 .6 . 4 文件类 型 文件类型用于在主系统环境中定义代表文件 的对象 , 文 件对 象的值 是主 系统文 件中 值 的序列。 17
  • 29. 在 IEE E Std - 1076 的程序包 T EXT IO( 见附录 7 〔1〕 中 , 有 1 个预定义的文件类型 T ext ) ( 用户也可以定义自己的文件类型 ) : TYPE Text IS F ILE OF String ; -- TEXT IO 程序包中预定义的文件类型 TYPE input - t ype IS FI LE OF Character ; -- 用户自定义的文件类型 这表示类型为 Text 的文件是可 变长度 的 ASCII 码 记录 文件。 在程 序 包 T EXTIO 中 , 有 2 个预定义的标准文本文件 : FILE input Text O PEN read - mode IS ″ ∶ STD - IN PU T″; FILE ou tput Text OPEN write - mode IS ″ ∶ STD - OUTP UT″; 从 VHDL’ 到 V HDL’ 在使用文件方 面有很大的变化 , 因此 , 要注意这 2 个版本 的 87 93 文件说明和文件使用的不同之处。 VHDL 的输入和输出能力很有限。为了扩展输入和 输出 能力 , 某些 公司 出售专 门的 程 序包。下面的 1 段测试程序是 Andrew Fenner 写的 , 已使用 V- System / W indows 模拟器 和 Q uick VHDL 模拟器测试过 , 写此程序时他是都柏林城市大学电子工程学院四年级的学生。 ---------------------------------------------------------------------------------------------------------------- -- purpose ∶ T he purpose of t he program is to provide an example of the -- file accessing features of VHDL using the 1993 version . -- -- T he program asks for the name of the file to be opened . If the file -- does not exist , t he program asks for the name of the file again and -- again un til the name exists . If t he file cannot be opend for any -- ot her reason t hen t he program stops . -- -- T he program reads t he data in line by line . The data is t hen read out -- of the line . T he data is two integers . T he in tegers are then multiplied . -- An out put line is t he created . T his line contains the values multiplied -- and t he result along wit h some string data . -- -- X1 * X2 = Result -- -- T his con tinues till t he end of t he input file . T he outpu t is writ ten to a -- file called ou tput .dat in t he base directory . ---------------------------------------------------------------------------------------------------------- LIBRARY I EEE ; USE I EEE .S td - Logic - 1164 .ALL ; USE St d .Tex tio .ALL ; ENTI TY test file IS - END ENTITY test - file ; 〔1 〕 原书误 为附 录 8。 — — 译者注 。 — 18
  • 30. ARCHI TEC TUR E test1 OF test - file IS -- All t he reading and writing of t he file takes place in t his function -- T his function takes the name of the file to be opened as an input ∶ FU NCT ION read - file ( file - name IN St ring ) R ETU RN Boolean IS -- open the file with t he name read in from t he keyboard ∶ ∶ VARIABLE status File - Open - Stat us = Open - OK ; ∶ F ILE in - file Text O PEN Read - Mode IS file - name ; F ILE temp - file Text O PEN Write - Mode IS ″ tput .dat″ ∶ ou ; ∶ ∶ VARIABLE int1 In teger = 0 ; ∶ ∶ VARIABLE int2 In teger = 0 ; ∶ ∶ VARIABLE result - int In teger = 0 ; -- variables required to read in file name ∶ VARIABLE in - line, lin , ou t - line Line ; ∶ VARIABLE file - name2 String ( 1 TO 60 ) ; VARIABLE out2∶ St ring ( 1 TO 58 ) ; ∶ VARIABLE out - 3 - char St ring ( 1 TO 3 ) ; ∶ VARIABLE ok Boolean ; ∶ ∶ VARIABLE x In teger = 1 ; ∶ VARIABLE charact Character ; BEGIN -- Close the file t hen open it again . If the file is not closed then an error -- occurs when you test to see if it is opened correctly . File - Close ( in - file ) ; File - Open ( stat us , in - file , file - name, R ead - Mode ) ; -- If t he file did not open correctly WHI LE NOT ( status = Open - OK ) LOOP IF ( status = Name - Error ) THEN out2∶ ″ ∶ = Enter the name of the inpu t file again D pat h name .asm″; W rite ( lin , out2 , Left , 0 ) ; W riteLine ( Ou tput , lin ) ; ReadLine ( Input , in - line ) ; Read ( in - line, charact , ok ) ; -- get the name of the file ∶ x = 1; WHI LE ( x < 61 ) LOOP file - name2 ( x )∶ nul ; = x∶ x + 1 ; = END LOOP ; ∶ x = 1; WHI LE ( ok ) LOOP file - name2 ( x)∶ charact ; = ∶ x = x + 1; 19
  • 31. Read ( in - line, charact , ok ) ; END LOOP ; -- open the file with t he new name given File - Open ( status, in - file, file - name2 , Read - Mode ) ; ELSE ASSER T false R EPORT ″T he file cannot be opened ″SEVERI TY Failure; END I F; END LOO P; -- Read in the first line of the file ReadLine ( in - file , in - line ) ; -- continue un til the end of the file is reached ∶ r1 WHIL E NOT E ndFile ( in - file ) LOOP -- read in the two integers from t he file Read ( in - line, in t1 , ok ) ; Read ( in - line, in t2 , ok ) ; -- multiply t he read in data result - in t = int1 * int2 ; ∶ -- make up a line of out put in the given format W rite ( out - line, int1 , Lef t , 0 ) ; -- integer 1 ou t - 3 - char ( 1)∶ ′ ; = ′ ou t - 3 - char ( 2)∶ ′ ′ = * ; -- * sign ou t - 3 - char ( 3)∶ ′ ; = ′ W rite ( out - line, out - 3 - char , Left , 0 ) ; W rite ( out - line, int2 , Lef t , 3 ) ; -- integer 2 ou t - 3 - char ( 2)∶ ′ ′ = = ; W rite ( out - line, out - 3 - char , Left , 0 ) ; -- = sign W rite ( out - line, result - int , Lef t , 0 ) ; -- result -- write ou tput line to file W riteLine ( temp - file, out - line ) ; -- read in the nex t line ReadLine ( in - file , in - line ) ; END LOO P; RE TUR N T rue; END F UNCT ION read - file ; BEGIN PROCESS ∶ VARIABLE result Boolean ; -- variables required to read in file name ∶ VARIABLE in - line , lin Line; ∶ VARIABLE file - name St ring ( 1 TO 60 ) ; ∶ VARIABLE out2 St ring ( 1 TO 58 ) ; ∶ VARIABLE ok Boolean ; 20
  • 32. ∶ VARIABLE x In teger = 1 ; ∶ VARIABLE charact Character ; BEGIN -- reads in t he program from a file at 0 ns . Prompt the user -- the name of the file , and read in t he data from that file I F ( Now = 0 ns ) THEN -- read in the file name for t he first time ou t2 = ″Please en ter t he name of t he inpu t file D path name .asm ″ ∶ ∶ ; W rite ( lin , out2 , Left , 0 ) ; W riteLine (out put , lin ) ; ReadLine ( input , in - line ) ; Read ( in - line, charact , ok ) ; -- get the name of the file WHI LE (ok ) LOO P file - name ( x)∶ charact ; = ∶ x = x + 1; Read ( in - line, charact , ok ) ; END LOOP ; -- -- call t he function to read the file -- ∶ result = read - file ( file - name ) ; END IF ; WAI T ; END PROCESS ; END ARCHITECTURE test1 ; 2 .6 . 5 子类型 1 个类型说明定义了 1 个值域 , 它和任何其它类型说明定义的值域完全不同。有时候 1 个对象可能取值的值域是某个类型说明定义的值域的子集 , 这 就要用到 VHDL 提供的子 类 型的概念。子类型和其父类型完全兼容。但是 , 如果某 个对 象被 说明为 某个 特定的 子类 型 时 , 它的取值范围就不允许超出该子类型的值域 , 即使这个值处在其父类型的值域范围之内 也不允许。为了增加可重用性 , 只要有可能定义为子类型时 , 就不要将其定义为新类型。 子类型可以是对其父类型施加限制条件 ; 也可以是简单地对其父类型重新起个名字 , 而 没有增加任何新意义。下面的简单实例用于说明子类型的用法 : -- 子类型测试程序 ARCHI TEC TUR E subtype - test O F tests IS SUBTY PE data IS Bit - Vector (31 DOWNTO 0 ) ; -- 下标约束 SUBTY PE operand IS data; -- operand 只是 data 的另一个名字 , 它们等价 TYPE x - int IS RA NGE 1 TO 50 ; TYPE y - in t IS RANGE 1 TO 30 ; 21
  • 33. SUBTY PE z - int IS x - int RANGE 1 TO 30 ; SUBTY PE a - int IS x - in t RA NGE 3 TO 32 ; SUBTY PE b - in t IS z - int RANGE 5 TO 20 ; -- 允许定义子类型的子类型 ∶ ∶ SIGNAL x x - int = 1 ; ∶ ∶ SIGNAL y y - int = 2 ; ∶ ∶ SIGNAL z z - in t = 3 ; ∶ ∶ SIGNAL a a - int = 4 ; ∶ ∶ SIGNAL b b - in t = 5 ; BEGIN z <= x; -- 正确 , 因为 z - int 为 x - int 的 1 个子类型 -- 但若 x 越出 z - int 的界 , 则将导致运行错误 a < = z; -- 正确 , 因为同一类型的不同子类型兼容 b < = a; -- 正确 , 因为同一类型的不同子类型兼容 -- 但若 a 越出 b - int 的界 , 则将导致运行错误 y < = x; -- 错误 , 导致编译错误 , 因为 x 与 y 类型不同 y < = y - int ( x) ; -- 正确 , 因为 x - int 与 y - in t 为密切相关的数据类型 , 允许类型标记转换 -- 但若 x 越出 y - int 的界 , 则将导致运行错误 END ARCHITECTURE sub type - test ; 标准程序包 St d - Logic - 1164 [ 附录 8 〔 1〕 中含有如下子类型说明 : ] ∶ FU NCT ION Resolved ( s Std - ULogic - Vector ) R ETU RN Std - ULogic; SUBTY PE St d - Logic IS Resolved St d - ULogic ; 子类型 Std - Logic 恰好就是子类型 Resolved Std - U Logic 的另一个名 字 , 仅 是简单一 点 而已。下面 2 个信号说明是等价的 , 请参看决断函数一章。 ∶ SIGNAL res1 Std - Logic ; ∶ SIGNAL res1 R esolved Std - ULogic ; 标准程序包 Std - Logic - 1164 中 还含 有如 下 子类 型说 明 , 它们 具有 不 同的 取 值范 围 约 束条件 : SUBTY PE X01 IS Resolved St d - ULogic RA NGE ′ X′TO ′ ; 1′ -- ( ′ , ′ , ′ ; X′ 0′ 1′) SUBTY PE X01Z IS Resolved Std - ULogic RA NGE ′ X′TO ′ ; Z′ -- ( ′ , ′ , ′ , ′ ; X′ 0′ 1′ Z′) SUBTY PE UX01 IS Resolved St d - ULogic RAN GE ′ U′TO ′ ; 1′ -- (′ , ′ , ′ , ′ ) ; U′ X′ 0′ 1′ SUBTY PE UX01 Z IS Resolved St d - ULogic RAN GE ′ U′TO ′ ; Z′ -- (′ , ′ , ′ , ′ , ′ ; U′ X′ 0′ 1′ Z′) 其中 , 子类型 X01 的另一等价形式如下 : SUBTYPE X01 IS Std - Logic RANGE ′ X′TO ′ ; 1′ -- ( ′ , ′ , ′ ; X′ 0′ 1′) 2 .7 类型转换 VHDL 属于 强类型 语言 , 每 一个 对象只 能有 1 种 类型 , 并 且只 能取该 类型 的值。赋 值 〔1 〕 原书误 为附 录 7。 — — 译者注 。 — 22
  • 34. 时 , 若值类型和对 象 类型 不 一 致 , 需要 使 用 显 式 类型 转 换。 VHDL 中没 有 隐 式 类 型转 换。 同一父类型的诸子类型相互兼容。 2 .7 . 1 用类型 标记实现 类型转换 类型标记实际上 是类 型 的 名 字。例 如 , Real 就 是 用 于 把 整数 转 换 为 浮 点数 的 类 型 标 记。类型标记转换仅适用于关系密切的标量类 型 , 即整数 和浮 点数。枚 举类 型不能 使用 类 型标记的方法进行类型转换。举例如下 : 假定有 : V ARIABLE ∶ In teger ; i V ARIABLE r∶ Real ; 则下列赋值语句可以正常工作 : ∶ i = In teger ( r) ; ∶ r = Real ( i) ; 请注意 , 把浮点数转换为整数时会发生舍 入现象。 如果某 浮点 数的 值恰好 处于 2 个 整 数的正中间时 , 转换的结果可能向任意方向靠拢。 已经定义了以整数或浮点数为基类型的标 量数据 类型 的加法 运算 符。但是 , 所 有操 作 数必须属于同一数据类型 ( 或者同一基类型的子类型 ) 。在下面 的实例中 , x 不能 与 y 相加 , 除非其中之一转换为另一个数的类型。 PROCESS ( clk ) TYPE tpx IS RANGE 3 .5 TO 12 .8 ; TYPE tpy IS RAN GE 5 .7 TO 20 .9 ; ∶ VARIABLE x t px ; ∶ VARIABLE y tpy RANGE 10 .2 TO 15 .6 ; ∶ VARIABLE z tpy ; BEGIN ∶ z = tpy (x ) + y ; END PROCESS ; 程序包 Numeric - Bit 中定义了有符号数 Signed 和无符号数 U nsigned 类型 , 与其关系 密 切的数据类型是 Bit - Vector , 可以用类型标记方法实现它们之间的类型转换。与此 类似 , 程 序包 Numeric - St d 中定义的有符号 数和 无符 号数 类 型与 数据 类型 St d - Logic - Vector 关 系 密切 , 它们也可以用类型标记方法实现类型转换。 2 .7 . 2 用户创 建的类型 转换 函数可以用来实 现类型转 换。程序 包 St d - Logic - 1164 , N umeric - Bit 和 N umeric - Std 中定义了许多类型转换函数。下面是 1 个把 Std - U Logic 值转换为 Bit 值的类型转 换函数。 参阅程序包 Std - Logic - 1164 [ 见附录 8 ] , 可以看到更多的类型转换函数。 ∶ FU NCT ION To - Bit ( s Std - ULogic; xmap Bit = ′ ∶ ∶ 0′) RE TUR N Bit IS BEGIN 23
  • 35. CASE s IS WHEN ′ | ′ 0′ L′= > R ETUR N (′ ) ; 0′ WHEN ′ | ′ 1′ H′= > RET URN (′ ) ; 1′ WHEN OTHERS = > RE TURN xmap ; END CASE ; END ; 下面的实例以不同的方式调 用转 换函 数 To - Bit。请 注意 , 在函 数调 用时 , 第二 个参 数 可以被略去不写。此时 , 该参数 取默认值。在下面的 例子中 , 若 s 的取 值为 ′ , ′ , ′ , ′ 0′ 1′ L′ H′之一 , 则 b1 , b2 , b3 将得到的值是与 s 相同的值 ′ 或′ 。若 s 的取值 是 St d - U Logic 类 0′ 1′ 型中的其它值时 , b1 , b2 的值将是 ′ , 而 b3 的值将是 ′ 。当然 , 用户可以写出自己的类型 0′ 1′ 转换函数。 LIBRARY I EEE ; USE I EEE .S td - Logic - 1164 .ALL ; ENTI TY typeconv IS END ; ARCHI TEC TUR E arch O F typeconv IS SIGNAL s Std - ULogic = ′ ; ∶ ∶ 0′ SIGNAL b1 , b2 , b3∶Bit = ′ ; ∶ 1′ BEGIN b1 < = To - Bit ( s) ; b2 < = To - Bit ( s, ′ ) ; 0′ b3 < = To - Bit ( s, ′ ) ; 1′ END; 常数也可用于类型转换。就模拟效率而言 , 它 比类型 转换 函数 效率更 高。下面 以实 例 说明使用常数把类型为 Std - U Logic 的值转换 Bit 类型的值 : LIBRARY I EEE ; USE I EEE .S td - Logic - 1164 .ALL ; ENTI TY typeconv IS END ; ARCHI TEC TUR E arch O F typeconv IS TYPE typeconv - typ IS ARRAY ( Std - ULogic ) OF Bit ; CO NSTANT typeconv - con∶ typeconv - typ∶= ( ′ | L′ = > ′ , 0′ 0′ ′ |′ = > ′ , 1′ H′ 1′ OT HE RS => ′ ) ; 0′ SIGNAL b∶Bit ; ∶ SIGNAL s Std - ULogic ; BEGIN b < = typeconv - con ( s) ; END; 2 .8 词法单元 2 .8 . 1 注释 VHDL 中的注释是以双连符 (-- ) 打头直到本行末尾的 1 段文字。注释不是 VHDL 设计 24
  • 36. 描述的一部分 , 编译之后存入数据库中的信息不包含注释。举例如下 : -- 一整行注释 NEXT ; -- 从此到行尾为注释 2 .8 . 2 数字 数字可以表示为十进制数 , 也可以表示为 以 2 至 16 为 基的数。 浮点 数中含 小数 点 , 整 数中不含小数点。十进制数文字以如下格式定义 : 十进制文字∷ = 整数 [ .整数 ] [ 指数] 整数∷ = 数字{ [下划线 ]数字} 指数∷ = E [ + ]整数 | E - 整数 在相邻的数字之间插入下划线 , 对十进制 数的 数值并 无影 响。允许 在数 之前冠 以若 干 个 0 , 但不允许在数之间存在空格 , 即使与指数成分之间也不允许。举例如下 : -- 整数文字 012 0 123 - 456 ( 等效于 123456 ) 2E8 ( 等效于 2e8 ) -- 实数文字 12 .0 0 .0 0 .234 3 .14159 - 26535 1 .2E - 6 2 .4 E + 3 以基表示的数 , 其定义的格式如下 : 以基表示的数∷ = 基 # 基于基的整数 [ .基于基的整数] # 指数 基∷ = 整数 基于基的整数∷ = 扩展数字{[ 下划线] 扩展数字} 扩展数字∷ = 数字 | 字母 对以基表示的数而言 , 在相邻的数字之间 插入 下划线 对其 数值 无影响。 基数的 最小 值 是 2 ; 最大值是 16。基数和指数都用十进 制表示 法。以 基表示 的数 中允 许使用 的字 母是 A 到 F , 大小写字母所表达的意义相同。举例如下 : -- 整数文字 , 值为 255。 2 # 1111 - 1111 # 8 # 377 # 16 # FF # 016 # 0F F # -- 整数文字 , 值为 224。 16 # E # E1 2 # 1110 - 0000 # -- 以基表示的浮点数实例 2 # 1 .1111 - 1111 # E4 ( 等于十进制数 31 .9375 ) 16 # 0 .F # E0 ( 等于十进制数 0 .9375 ) 16 # F F .F F # E + 1 ( 等于十进制数 4095 .9375 ) 对于上述以基表示的浮点数实例 , 可以用下面的程序进行测试 : ENTI TY tests IS END; ARCHI TEC TUR E numbers OF tests IS BEGIN PROCESS 25
  • 37. VARIABLE r1 Real; BEGIN REPORT ″Default initial value of t ype real = ″& Real′Image ( r1 ) ; ∶ r1 = 2 # 1 .1111 - 1111 # E4 ; REPORT ″= ″ # 1 .1111 - 1111 # E4 = ″& Real′ 2 Image( r1 ) ; ∶ r1 = 16 # 0 .F # E0 ; REPORT ″= ″ # 0 .F # E0 = ″& Real′ 16 Image ( r1 ) ; r1 = 16 # FF .F F # E + 1 ; REPORT ″= ″ # F F .FF # E + 1 = ″& Real′mage( r1 ) ; 16 I WAI T ; END PROCESS ; END ARCHITECTURE numbers ; 2 .8 . 3 字符 VHDL 中的文字字符表示形式为 : 被单引号括起来的 ASCII 字符。例如 : ′ A′ ′ ′ * ′ ′′ ′ ′ ″ ′′ 其形式化定义为 : 字符文字∷ = ′图形字符′ 2 .8 . 4 字符串 VHDL 中的文字字符串表示形式为 : 被双引号 括起来 的图 形字符 序列 ( 可 以为 空 ) 。 举 例如下 : ″Can be used to repor t some message ″ ″″ -- 空字符串 ″″ ″ A″ ″ ″ ″ ″ -- 3 个长度为 1 的字符串 ″This string contains an ″ em bedded string″ in it″ ″ ″ 其形式化定义为 : 字符串文字∷ = ″ {图形字符}″ 在 VHDL’ 中引入了属性′ 93 Image , 它对 于预 定 义的 标量 类型 ( 或 子类 型 ) 返 回 1 个 代 表该标量类型值的字符串。其形式为 : 标量类型或子类型 ′Image (该类型的值 ) 例如 , REPORT ″T he decimal value of 16 # 0 .F # E0 = ″& Real′Image(16 # 0 .F # E0 ) ; 2 .8 . 5 位串 VHDL 中的位串表示形式 为 : 被 双引 号括 起来 的扩 展 的数 字序 列 , 数 字序 列 前冠 以 基 数说明符。 位串文字∷ = 基数说明符 ″位值 ″ 基数说明符∷ = B | O | X 位值∷ = 扩展数字{ [下划线 ]扩展数字} 26
  • 38. 位串的长度是该位串中扩展数字序列的等价位数。举例如下 : B″1111 - 0101 ″ -- 长度为 8 X″F0F ″ -- 长度为 12 , 等效于 B″1111 - 0000 - 1111 ″ O″070 ″ -- 长度为 9 , 等效于 B″000 - 111 - 000 ″ 习题 1 . 在端口子句中说明每一个端口时 , 一般说来需要说明哪 3 件事 ? 如果端口模式被省略 , 则该端口的默认 模式是什么 ? 2 . 1 个模型是否必须有 1 个结构体 ? 结构体的目的是什么 ? 1 个设计可以有多个结构体吗 ? 3 . 设计实体和其结构体必须存放在同一文本文件中吗 ? 如 果存放在不同 的文本文件 中 , 那么 对它们进 行 编译的先后次序有要求吗 ? 如果对结构体重新编译 , 是否一定要对 相应的实体 说明重 新编译 ? 如果 对 实体说明重新编译 , 是否一定要对相应的结构体重新编译 ? 4 . 一种良好的 V HDL 编码风格和方法是 : 使用类属或 常数而 不使用 具体的 数值表 示器件 特性 , 这些特 性 值会随着时间的推移而变化 , 在不同例化场合也可能使用不同的特性值。请问这是为什么 ? 5 . 如果没有给对象显式设定初始值 , 其默认初始值是什么 ? 6 . 一种良好的编码风格和方法是 : 尽可能使用子类型对类型的取值范围加以限定。为什么 ? 7 . VHDL 区分大小写吗 ? 扩展标识符是怎么回事 ? 8 . 从模拟的角度看 , 使用常数作为类型转换或数据查找非常有效。例如 , 假定已有如下的类型和子类型的 说明 : SUBTY PE int01 IS Integer RANGE 0 TO 1 ; TYPE bit - array IS ARRAY ( int01 ) OF Bit ; TYPE int - array IS ARRAY (Bit ) OF int01 ; 请定义 1 个常数类型 , 使得能够把整数 0 转换为 Bit ′ ; 把整数 1 转换为 Bit ′ 。与此类似 , 再定义 1 个 0′ 1′ 常数类型 , 使得能够把 Bit ′ 转换为常数 0 ; 把 Bit ′ 转换为常数 1。 0′ 1′ 9 . 程序包 Std - Logic - 1164 中定义了类型 Std - ULogic: TYPE Std - ULogic IS ( ′ , ′ ,′ , ′ ,′ ,′ ,′ ,′ ,′ U′ X′ 0′ 1′ Z′ W′ L′ H′ -′) 请简述此类型的逻辑状态。 10 . 存储器可以被描述为二维数组 , 例如 : S UB TYPE mem - size IS In teger RANGE 1 TO 1024 ; S UB TYPE word - size IS Integer RAN GE 15 DOWNTO 0 ; TY PE memory IS ARRAY( mem - size, word - size ) OF Bit ; 上面的存储器类型适用于模拟 , 但是这种多维数组形式的描述不适于综合。关于此问题还有别的什么 方法吗 ? 11 . 书写 1 个关于电流的物理类型定义 , 其基类型是纳安( nA) , 其次级单位是微安 (μ A )、毫安 ( mA )和 安培 ( A) 。类似地 , 书写关于电压的物理类型定义和关于频率的物理类型定义。 12 . 使用 V- System 对下述 VHDL 模型进行编译和模拟。 ENT I TY tests IS END tests ; -- test t he aggregate way of initialization ARCHI T ECTU RE agg OF tests IS 27