
EDA技术与应用教程全套ppt完整版课件整本书电子教案最全教学教程最新.ppt
338页EDA技术与应用教程技术与应用教程1EDA技术与应用教程第1章 EDA技术概述 第2章 可编程逻辑器件 第3章 QUARTUS II应用基础 第4章 硬件描述语言VHDL 第5章 基本数字单元设计 第6章 EDA技术综合应用 EDA技术与应用教程技术与应用教程2第1章 EDA技术概述1.1 EDA技术及其发展1.2 EDA技术的主要内容1.3 EDA的设计流程1.4 常用EDA工具EDA技术与应用教程技术与应用教程31.1 EDA技术及其发展技术及其发展⒈⒈ EDA技术的涵义技术的涵义⒉⒉ EDA技术的发展技术的发展⒊⒊ EDA技术的特点与发展趋势技术的特点与发展趋势⒋⒋ EDA技术应用前景展望技术应用前景展望 ⑴⑴ EDA技术将广泛应用于高校电类专业的实践教学和科研工作技术将广泛应用于高校电类专业的实践教学和科研工作 ⑵⑵ EDA技术将广泛应用于专用集成电路的设计和新产品的开发技术将广泛应用于专用集成电路的设计和新产品的开发 ⑶⑶ EDA技术将广泛应用于传统机电设备的升级换代和技术改进技术将广泛应用于传统机电设备的升级换代和技术改进EDA技术与应用教程技术与应用教程41.2 EDA技术的主要内容⒈⒈ 可编程逻辑器件可编程逻辑器件⒉⒉ 硬件描述语言硬件描述语言⒊⒊ EDA工具软件工具软件EDA技术与应用教程技术与应用教程51.2 EDA技术的主要内容EDA技术与应用教程技术与应用教程61.3 EDA的设计流程⒈⒈ 设计准备设计准备⒉⒉ 设计输入设计输入⒊⒊ 设计处理设计处理⒋⒋ 设计校验设计校验⒌⒌ 器件编程器件编程⒍⒍ 测试验证测试验证图 1 - 1 EDA的设计流程⑴⑴ 图形输入方式图形输入方式⑵⑵ 文本输入方式文本输入方式⑴⑴ 编译和检查编译和检查⑵⑵ 优化和综合优化和综合⑶⑶ 适配和分割适配和分割⑷⑷ 布局和布线布局和布线⑸⑸ 生成编程数据文件生成编程数据文件EDA技术与应用教程技术与应用教程71.4 常用EDA工具⒈⒈ 编辑器编辑器⒉⒉ 仿真器仿真器⒊⒊ 综合器综合器⒋⒋ 适配器适配器⒌⒌ 下载器下载器EDA技术与应用教程技术与应用教程8思考练习⑴ 何谓EDA技术?EDA技术的核心内容是什么?⑵ 简述EDA技术的发展历程。
⑶ 简述用EDA技术设计电路的基本流程⑷ 什么是硬件描述语言?常见的硬件描述语言有哪些?⑸ 与软件描述语言相比,HDL有什么特点?⑹ EDA技术与ASIC设计和FPGA开发有何关系?EDA技术与应用教程技术与应用教程9第2章 可编程逻辑器件2.1 可编程逻辑器件概述2.2 CPLD的实现原理与典型结构2.3 FPGA的实现原理与典型结构2.4 FPGA/CPLD产品概述2.5 FPGA/CPLD器件的配置与编程EDA技术与应用教程技术与应用教程102.1 可编程逻辑器件概述2.1.1 可编程逻辑器件的基本结构2.1.2 可编程逻辑器件的发展历程⒈⒈ PLD诞生及简单诞生及简单PLD发展阶段发展阶段⒉⒉ 乘积项可编程结构乘积项可编程结构PLD发展与成熟阶段发展与成熟阶段⒊⒊ 复杂可编程器件发展与成熟阶段复杂可编程器件发展与成熟阶段图 2 - 1 基本PLD的原理结构框图EDA技术与应用教程技术与应用教程112.1 可编程逻辑器件概述2.1.3 可编程逻辑器件的分类⒈⒈ 按规模大小分类按规模大小分类⒉⒉ 按结构特点分类按结构特点分类⒊⒊ 按编程方式分类按编程方式分类⒋⒋ 按编程工艺分类按编程工艺分类图 2 - 2 可编程逻辑器件按规模分类EDA技术与应用教程技术与应用教程122.1 可编程逻辑器件概述表 2 - 2 CPLD与FPGA的区别 2.1.4 CPLD与FPGA比较EDA技术与应用教程技术与应用教程132.2 CPLD的实现原理与典型结构2.2.1 CPLD的逻辑实现原理图 2 - 3 乘积项结构示例电路图 2 - 4 CPLD的实现方式EDA技术与应用教程技术与应用教程142.2 CPLD的实现原理与典型结构2.2.2 典型CPLD器件简介——MAX 3000A⒈⒈ MAX 3000A系列器件概览系列器件概览⒉⒉ MAX 3000A器件结构组成器件结构组成图 2 - 5 MAX 3000A的整体结构EDA技术与应用教程技术与应用教程152.2 CPLD的实现原理与典型结构图 2 - 6 MAX 3000A的宏单元结构⒊⒊ MAX3000A系列系列CPLD的特性的特性⒋⒋ MAX 3000A系列器件的性能参数系列器件的性能参数EDA技术与应用教程技术与应用教程162.3 FPGA的实现原理与典型结构2.3.1 FPGA的逻辑实现原理(a)实际逻辑电路 (b)LUT的实现方式图 2 - 7 FPGA的逻辑实现原理图 2 - 8 FPGA查找表内部结构EDA技术与应用教程技术与应用教程172.3 FPGA的实现原理与典型结构⒈⒈ Cyclone系列器件概览系列器件概览⒉⒉ Cyclone系列系列FPGA结构组成结构组成图 2 - 9 Altera Cyclone系列FPGA整体结构图 2 - 10 Cyclone器件的LE结构2.3.2 典型FPGA器件简介——CycloneEDA技术与应用教程技术与应用教程182.3 FPGA的实现原理与典型结构⒊⒊ Cyclone系列系列FPGA的特性的特性⒋⒋ Cyclone系列系列FPGA的性能参数的性能参数EDA技术与应用教程技术与应用教程192.4 FPGA/CPLD产品概述2.4.1 FPGA/CPLD产品主要厂商⒈⒈ Altera公司公司图 2 - 11 Altera公司的主要产品⒉⒉ Xilinx公司公司⒊⒊ Lattice公司公司⒋⒋ Actel公司公司⒌⒌ Atmel公司公司EDA技术与应用教程技术与应用教程202.4 FPGA/CPLD产品概述⒈⒈ Altera公司成熟器件公司成熟器件表 2 - 8 Altera的成熟器件2.4.2 Altera公司的可编程逻辑器件EDA技术与应用教程技术与应用教程212.4 FPGA/CPLD产品概述⒉⒉ Altera新型系列器件简介新型系列器件简介⑴⑴ Stratix系列高端系列高端FPGA⑵⑵ Arria系列中端系列中端FPGA⑶⑶ Cyclone系列低成本系列低成本FPGA ⑷⑷ MAX系列低成本系列低成本CPLD ⑸⑸ HardCopy系列系列ASIC⒊⒊ Altera配置器件简介配置器件简介⑴⑴ 标准型配置器件标准型配置器件⑵⑵ 增强型配置器件增强型配置器件((3)串行配置器件)串行配置器件 ⒋⒋ Altera可编程逻辑器件命名规则可编程逻辑器件命名规则EDA技术与应用教程技术与应用教程222.4 FPGA/CPLD产品概述⒈⒈ Xilinx的主流的主流FPGA器件器件⒉⒉ Xilinx的主流的主流CPLD器件器件⒊⒊ Xilinx公司公司FPGA配置器件配置器件⒈⒈ Lattice的的FPGA器件器件⒉⒉ Lattice的的CPLD和和SPLD器件器件Lattice的最新FPGA产品包括低成本、非易失和系统级三大类。
Lattice的ispLSI、ispMACH和GAL产品系列是其CPLD和SPLD器件的代表 2.4.4 Lattice公司的可编程逻辑器件2.4.3 Xilinx公司的可编程逻辑器件EDA技术与应用教程技术与应用教程232.4 FPGA/CPLD产品概述⒈⒈ 器件类型的选择器件类型的选择⒉⒉ 器件系列的选择器件系列的选择⒊⒊ 器件型号的选择器件型号的选择⒋⒋ 外围器件的选择外围器件的选择2.4.5 FPGA/CPLD的开发应用选择EDA技术与应用教程技术与应用教程242.5 FPGA/CPLD器件的配置与编程 ⑴ 将PLD焊在PCB板上 ⑵ 接好编程电缆 ⑶ 现场烧写PLD芯片图 2 - 13 PLD编程操作过程示意图2.5.1 配置与编程工艺配置与编程工艺目前常见的大规模可编程逻辑器件的编程和配置工艺有三种:⑴ 基于电可擦除存储单元的EEPROM或Flash技术 ⑵ 基于SRAM查找表的编程单元 ⑶ 基于反熔丝编程单元 EDA技术与应用教程技术与应用教程252.5 FPGA/CPLD器件的配置与编程(a) 并口下载方式 (b) USB口下载方式 图 2 - 14 并口/USB口下载电缆连接示意图 图 2 - 15 目标板上的10针下载接口表 2 - 24 10针插座的在不同模式下对应的信号2.5.2 下载电缆与接口EDA技术与应用教程技术与应用教程262.5 FPGA/CPLD器件的配置与编程⒈⒈ FPGA的的PS模式配置模式配置图 2 - 16 PS模式下对FPGA器件的配置⒉⒉ FPGA的的JTAG模式配置模式配置图 2 - 17 JTAG模式下对FPGA器件的配置2.5.3 编程与配置模式EDA技术与应用教程技术与应用教程272.5 FPGA/CPLD器件的配置与编程⒊⒊ CPLD的的ISP模式编程模式编程图 2 - 18 JTAG模式下对CPLD器件的编程EDA技术与应用教程技术与应用教程282.5 FPGA/CPLD器件的配置与编程⒈⒈ 使用专用配置器件配置使用专用配置器件配置FPGA图 2 - 19 EPCS器件对FPGA器件的配置电路⒉⒉ 利用微处理器配置利用微处理器配置FPGA图 2 - 20 PS模式下微处理器对FPGA器件的配置电路2.5.4 FPGA的配置方式EDA技术与应用教程技术与应用教程29思考练习⑴ 什么是基于乘积项的可编程逻辑结构?⑵ 什么是基于查找表的可编程逻辑结构?⑶ CPLD和FPGA有什么差异?在实际应用中各有什么特点?⑷ 解释编程与配置这两个概念。
⑸ 目前比较知名的CPLD/FPGA厂商有Altera、Xilinx和Lattice, 请写出你对这几家公司及其PLD产品的了解⑹ 根据本章介绍的各厂商FPGA/CPLD产品系列及你对新产品的了解, 请思考选用PLD器件时应考虑哪些方面的问题?EDA技术与应用教程技术与应用教程30实训项目1.上网查阅资料,了解主流PLD厂商新型CPLD/FPGA器件的性能特点2.试根据图 2 - 21 所示ByteBlaster MV变换电路原理图制作 如图 2 - 22 所示的ByteBlaster MV下载电缆图 2 - 21 Byte Blaster MV变换电路原理图图 2 - 22 Byte Blaster MV 下载电缆 EDA技术与应用教程技术与应用教程31第3章 QUARTUS II应用基础o3.1 QUARTUS II软件概述o3.2 QUARTUS II设计流程o3.3 Quartus II设计实例EDA技术与应用教程技术与应用教程323.1 QUARTUS II软件概述3.1.1 QUARTUS II软件简介 Quartus II是Altera公司提供的综合性PLD开发工具,可以完成从设计输入、HDL综合、布线布局(适配)、仿真到硬件下载及测试的完整PLD设计流程,同时也是单芯片可编程系统(SoPC)设计的综合性环境 。
图 3 - 1 Quartus II设计软件的主要功能EDA技术与应用教程技术与应用教程333.1 QUARTUS II软件概述 图 3 - 2 Quartus II编译器的主控界面 Quartus II包括模块化的编译器图 3 - 2是Quartus II编译器的主控界面,它显示了Quartus II进行自动化设计的主要处理环节,包括分析与综合(Analysis & Synthesis)、适配(Filter)、装配(Assembler)及、时序分析(Classic Timing Analyzer) EDA技术与应用教程技术与应用教程343.1 QUARTUS II软件概述3.1.2 QUARTUS II功能特点2009年3月Altera公司发布了Quartus II 9.0,新增特性有以下几方面:⑴ SignalTape II嵌入式逻辑分析器 ⑵ 增强的SoPC Builder工具 ⑶ 新的操作系统支持 ⑷ 增强第三方仿真接口 ⑸ 新的引脚顾问 ⑹ Real Intent验证支持 ⑺ 新的增强IP内核和宏功能 ⑻ 物理综合引擎增强 EDA技术与应用教程技术与应用教程353.1 QUARTUS II软件概述3.1.3 QUARTUS II界面预览工具栏菜单栏标题栏工程导航器状态窗口任务窗口工作区消息窗口3.1.3 QUARTUS II界面预览图 3 - 3 Quartus II初始用户界面EDA技术与应用教程技术与应用教程363.1 QUARTUS II软件概述3.1.4 QUARTUS II授权许可图 3 - 4 许可文件设置对话框图 3 - 5 许可文件设置完成对话框EDA技术与应用教程技术与应用教程373.2 QUARTUS II设计流程图 3 - 6 Quartus II设计的基本流程⒈⒈ 设计输入设计输入 Quartus II支持多种设计输入方式,如原理图输入、文本输入、波形输入等。
⒉⒉ 设计编译设计编译⒊⒊ 设计仿真设计仿真 根据设计要求事先设定编译参数,如器件类型、逻辑综合方式的选择等,然后进行编译,包括分析综合、适配、装配及时序分析,并产生相应的报告文件、延时信息文件及编程文件等,供仿真分析和下载编程使用 仿真用来验证设计项目的逻辑功能是否正确,包括功能仿真、时序仿真和定时分析 ⒋⒋ 引脚锁定引脚锁定 为了将设计结果下载到CPLD/FPGA芯片中进行测试验证,必须根据具体EDA开发系统或实验板硬件的要求对设计项目的输入输出信号赋予特定的引脚,以便能够对其进行实测 ⒌⒌ 编程配置与测试验证编程配置与测试验证 在成功编译工程并锁定引脚之后,就可以使用Quartus II的编程器(Programmer)对PLD器件进行编程或配置,然后在实验开发系统上测试验证其实际运行性能EDA技术与应用教程技术与应用教程383.3 Quartus II设计实例 本节将以3人表决器电路为例,详细介绍基于原理图输入和文本输入的Quartus II工程设计过程,主要包括建立工程文件、编辑设计文件、编译综合、仿真测试、引脚锁定、编程下载和硬件测试等基本过程。
s1s2s3L1L20000100101010010111010001101101101011110表 3- 1 三人表决电路真值表EDA技术与应用教程技术与应用教程393.3 Quartus II设计实例3.3.1 建立工程文件⒈⒈ 指定工程文件名称指定工程文件名称⒉⒉ 选择添加的文件和库选择添加的文件和库图 3 - 8 新建工程对话框图 3 - 7 新建工程菜单选项图 3 - 9 添加文件或者库对话框EDA技术与应用教程技术与应用教程403.3 Quartus II设计实例图 3 - 12 工程创建完成对话框⒋⒋ 选择第三方选择第三方EDA工具工具⒊⒊ 选择目标器件选择目标器件图 3 - 10 目标器件选择对话框图 3 - 11 第三方EDA工具选择对话框EDA技术与应用教程技术与应用教程413.3 Quartus II设计实例⒌⒌ 完成创建工程完成创建工程图 3 - 13 工程建立完成后的界面3.4.2 设计文件输入⒈⒈ 原理图输入方法原理图输入方法⑴⑴ 建立原理图建立原理图图 3 - 14 〖New〗对话框图 3 - 15 空白图形编辑窗口EDA技术与应用教程技术与应用教程423.3 Quartus II设计实例⑵⑵ 放置元器件符号放置元器件符号图 3 - 16 选择电路元器件符号对话框图 3 - 17 正在放置元器件符号图 3 - 18 元器件符号放置完成EDA技术与应用教程技术与应用教程433.3 Quartus II设计实例⑶⑶ 命名和连接各元器件命名和连接各元器件图 3 - 19 符号属性对话框图 3 - 20 表决器的电路原理图⑷⑷ 保存文件保存文件图 3 - 21〖另存为〗对话框EDA技术与应用教程技术与应用教程443.3 Quartus II设计实例⒉⒉ 文本输入方法文本输入方法⑴⑴ 建立文件建立文件图 3 - 22 Quartus II文本编辑窗口⑵⑵ 输入输入VHDL语言程序代码语言程序代码 图3-23 〖Insert Template〗对话框图 3 - 24 表决器的VHDL程序代码EDA技术与应用教程技术与应用教程453.3 Quartus II设计实例图 3 - 25 编译结果⑶⑶ 保存程序保存程序3.4.3 编译工程文件无论是采用原理图输入还是文本输入,在完成输入并保存文件后,即可开始编译。
执行【Processing】【Start Compilation】菜单命令或单击工具栏中的编译按钮,开始编译并伴随着进度不断变化,完成后弹出编译完成提示对话框, EDA技术与应用教程技术与应用教程463.3 Quartus II设计实例3.4.4 建立仿真测试的矢量波形文件⒈⒈ 建立波形文件建立波形文件图 3 - 26 〖New〗对话框⒉⒉ 添加引脚和节点添加引脚和节点图3-27波形编辑窗口图3-28〖Insert Node or Bus〗对话框EDA技术与应用教程技术与应用教程473.3 Quartus II设计实例图 3 - 29 〖Node Finder〗对话框图 3 - 30 选择输入、输出引脚图 3 - 31 查找节点后的添加节点对话框图 3 - 32 添加节点后的波形编辑窗口EDA技术与应用教程技术与应用教程483.3 Quartus II设计实例⒊⒊ 编辑波形编辑波形图 3 - 33 〖End Time〗对话框图 3 - 34 时钟设置对话框图 3 - 35 对输入波形进行编辑后的波形编辑窗口⒋⒋ 保存波形文件保存波形文件EDA技术与应用教程技术与应用教程493.3 Quartus II设计实例3.4.5 仿真并观察RTL电路图 3 - 36 Quartus II软件仿真设置界面⒈⒈ 功能仿真功能仿真图 3 - 37 Quartus II中表决器功能仿真结果EDA技术与应用教程技术与应用教程503.3 Quartus II设计实例⒉⒉ 时序仿真时序仿真图 3 - 38 Quartus II中表决器时序仿真结果⒊⒊ 观察观察RTL电路电路图 3 - 39 表决器的RTL电路EDA技术与应用教程技术与应用教程513.3 Quartus II设计实例3.4.6 分配引脚图 3 - 40 引脚和引脚组分配窗口图 3 - 41 引脚属性对话框窗口 图 3 - 42 〖Tc1 Script〗对话框EDA技术与应用教程技术与应用教程523.3 Quartus II设计实例⒊⒊ 配置下载线缆配置下载线缆3.4.7 编程下载与硬件测试⒈⒈ 再编译再编译⒉⒉ 连接下载电缆连接下载电缆图 3 - 43 编程配置下载窗口图 3 - 44 硬件设置对话框⒋⒋ 配置文件下载配置文件下载EDA技术与应用教程技术与应用教程533.3 Quartus II设计实例⒌⒌ 硬件测试硬件测试图 3 - 45 配置完成窗口图 3 - 46 JTAG模式下载完成窗口EDA技术与应用教程技术与应用教程54思考练习 ⑴ 说明原理图输入法设计电路的详细流程。
⑵ 指出功能仿真和时序仿真的区别 ⑶ 用原理图输入法设计8进制的加法计数器 ⑷ 用文本输入法设计4变量的多数表决器EDA技术与应用教程技术与应用教程55实训项目2.参照3.3节通过Quartus II设计实现三人表决器,并下载到CPLD/FPGA芯片中在实验开发系统上进行测试验证 1.下载Quartus II网络版并上机练习安装、加载受权文件,熟悉QUARTUS II的界面 EDA技术与应用教程技术与应用教程56第4章 硬件描述语言VHDLo4.1 VHDL语言概述o4.2 VHDL程序结构o4.3 VHDL语言要素o4.4 VHDL描述语句o4.5 VHDL描述风格o4.6 VHDL设计方法EDA技术与应用教程技术与应用教程574.1 VHDL语言概述4.1.1 VHDL简介 VHDL(VHSIC Hardware Description Language,VHSIC硬件描述语言)是电子工程师用来设计硬件系统与电路的高级语言。
目前,流行的EDA工具软件全部支持VHDL,它在EDA领域的学术交流、电子设计的存档以及ASIC设计等方面担当着不可缺少的角色显然,VHDL是现代电子设计人员必须掌握的硬件设计语言4.1.2 VHDL优点⑴ VHDL语言具有很强的电路描述和建模能力 ⑵ VHDL有良好的可读性 ⑶ VHDL具有良好的可移植性 ⑷ 使用VHDL可以延长设计的生命周期 ⑸ VHDL支持对大规模设计的分解和已有设计的再利用 ⑹ VHDL有利于保护知识产权 EDA技术与应用教程技术与应用教程584.1 VHDL语言概述4.1.3 VHDL实例图 4 - 1 2选1选择器【例4 - 1】:2选1数据选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS PORT (a, b: IN STD_LOGIC; s: IN STD_LOGIC; y: OUT STD_LOGIC);END mux21;ARCHITECTURE rtl OF mux21 ISBEGIN y <= a WHEN s='0' ELSE b;END ARCHITECTURE rtl;⑴ ⑴ 库说明库说明⑵ ⑵ 实体说明实体说明⑶ ⑶ 结构体说明结构体说明EDA技术与应用教程技术与应用教程594.2 VHDL程序结构图 4 - 2 VHDL程序的基本结构 一个相对完整的VHDL程序称为设计实体,通常都具有比较固定的结构,即由实体(Entity)、结构体(Architecture)、配置(Configuration)、库(Library)和程序包(Package)五大部分构成(见图 4 - 2)。
4.2.1 实体 实体由实体声明部分和结构体组成,实体声明部分指定了设计单元完整的接口信息,基本格式如下: ENTITY 实体名 IS [GENERIC(类属参数声明);] PORT(端口表); END [ENTITY] 实体名;⒈ ⒈ 实体名实体名一个设计实体无论多大和多复杂,在实体中定义的实体名即为这个设计实体的名称 ⒉ ⒉ 类属参数声明类属参数声明 类属参数声明必须放在端口声明之前,用于指定如端口中矢量位数、器件延迟时间参数等 EDA技术与应用教程技术与应用教程604.2 VHDL程序结构⒊⒊ 端口声明端口声明 端口声明是对基本设计实体与外部接口的描述,也可以说是对外部引脚信号的名称、数据类型和输入/输出方向的描述 PORT(端口名{,端口名}:端口模式 数据类型; {端口名{,端口名}:端口模式 数据类型});⑴⑴ 端口名端口名 端口名是赋予每个外部引脚的名称,即该端口的标识符,通常用一个或几个英文字母,或者英文字加数字命名 ⑵⑵ 端口模式端口模式表 4 - 1 端口模式说明端口模式端口模式含义含义IN输入OUT输出(结构体内部不可再用)INOUT双向BUFFER输出(结构体内部可利用该输出信号)LINKAGE不指定方向,任何方向均可连接⑶⑶ 数据类型数据类型 VHDL提供10种标准数据类型,但在实际使用时,端口描述中的数据类型只有两类,即位(BIT)和位矢量(BIT_VECTOR)。
EDA技术与应用教程技术与应用教程614.2 VHDL程序结构【例4 - 2】:端口说明之一PORT(clk,clr:IN BIT; sec0,sec1:OUT BIT_VECTOR(3 DOWNTO 0));【例4 - 3】:端口说明之二LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY cnt60 IS PORT (clk,clr:IN STD_LOGIC; sec0,sec1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt60;EDA技术与应用教程技术与应用教程624.2 VHDL程序结构4.2.2 结构体 结构体具体描述了该基本设计单元的行为、元件及内部的连接关系,也就是定义了ARCHITECTURE 结构体名 OF 实体名 IS [说明语句] BEGIN 功能描述语句 END [ARCHITECTURE] 结构体名;设计单元的具体功能。
一般格式如下:图 4 - 3 结构体构造图⒈⒈ 结构体说明语句结构体说明语句 结构体中的说明语句是对结构体的功能描述,语句中将要用到SIGNAL、数据类型(Type)、常量(Constant)、元件(Component)、函数(Function)和过程(Procedure)等进行说明 EDA技术与应用教程技术与应用教程634.2 VHDL程序结构⒉⒉ 功能描述语句功能描述语句 功能描述语句可以含有5种不同类型的、以并行方式工作的语句结构,这可以看成是结构体的5个子结构 ⑴ 块语句 ⑵ 进程语句 ⑶ 信号赋值语句 ⑷ 子程序调用语句 ⑸ 元件例化语句 ⒊⒊ VHDL语言子结构描述语言子结构描述 一个结构体可以用几个子结构即几个相对比较独立的子模块来实现以下重点介绍 块语句(BLOCK)、进程语句(PROCESS)两种形式的子结构描述语句 ⑴⑴ 块语句块语句EDA技术与应用教程技术与应用教程644.2 VHDL程序结构块标号:BLOCK[(块保护表达式)] 接口说明 类属说明 BEGIN 并行语句 END BLOCK 块标号;【例4 - 4】:用BLOCK语句描述的2选1电路LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS GENERIC(m:TIME:=1ns); PORT(a,b,s:IN STD_LOGIC; q:OUT STD_LOGIC);END mux21;EDA技术与应用教程技术与应用教程654.2 VHDL程序结构ARCHITECTURE rtl OF mux21 IS SIGNAL tmp1,tmp2,tmp3:STD_LOGIC;--定义信号量BEGIN cale:BLOCK BEGIN tmp1<=a AND s; tmp2<=b AND (NOT S); tmp3<=tmp1 OR tmp2; q<=TMP3 AFTER m; END BLOCK cale;END rtl;EDA技术与应用教程技术与应用教程664.2 VHDL程序结构⑵⑵ 进程语句进程语句① 进程语句格式进程语句PROCESS的一般表达格式如下: [进程标号:] PROCESS (敏感信号参数表) [IS] [进程说明部分] BEGIN 顺序描述语句 END PROCESS[进程标号];② 进程的组成进程由进程说明部分、顺序描述语句和敏感信号参数表三个部分组成。
例4-5是一个用进程语句描述的2选1选择器,其中a、b、s均是敏感信号,当其中有任何一个值发生变化时,进程都会被启动EDA技术与应用教程技术与应用教程674.2 VHDL程序结构LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS PORT(a,b,s:IN STD_LOGIC; y:OUT STD_LOGIC);END mux21;ARCHITECTURE rtl OF mux21 ISBEGIN PROCESS(a,b,s) VARIABLE tmp1,tmp2,tmp3:STD_LOGIC; --定义变量 BEGIN tmp1:=a AND s; tmp2:=b AND (NOT S); tmp3:=tmp1 OR tmp2; y<=tmp3; END PROCESS;END rtl;EDA技术与应用教程技术与应用教程684.2 VHDL程序结构【例4 - 6】:用进程语句描述的24进制计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt24 IS PORT(clk,clr:IN STD_LOGIC; dec0,dec1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END cnt24;ARCHITECTURE rtl OF cnt24 IS SIGNAL bcd1,bcd10:STD_LOGIC_VECTOR(3 DOWNTO 0); --定义信号量BEGIN dec0<=bcd1; dec1<=bcd10;EDA技术与应用教程技术与应用教程694.2 VHDL程序结构 U1:PROCESS(clk,clr) BEGIN IF clr='1' THEN bcd1<="0000"; --清零信号有效,启动进程 ELSIF clk'EVENT AND clk='1' THEN --时钟上升沿有效 IF bcd1="1001" THEN bcd1<="0000"; --计数器个位为9时,个位输出为0 ELSIF bcd1="0011"AND bcd10="0010" THEN --计数器输出为23时,个位输出为0 bcd1<="0000"; ELSE bcd1<=bcd1+1; END IF; END IF; END PROCESS U1;EDA技术与应用教程技术与应用教程70U2:PROCESS(clk,clr) BEGIN IF clr='1'THEN bcd10<="0000"; --清零信号有效 ELSIF clk'EVENT AND clk='1'THEN IF bcd1="1001"THEN --计数器个位为9,十位数累加1 bcd10<=bcd10+1; ELSIF bcd1="0011"AND bcd10="0010" THEN --计数器输出为23时,个位输出为0 bcd10<="0000"; END IF; END IF; END PROCESS U2;END rtl;4.2 VHDL程序结构EDA技术与应用教程技术与应用教程714.2 VHDL程序结构③ 进程语句应该注意的问题 · PROCESS语句为无限循环语句。
在同一结构体中的进程是一个独立的无限循环 程序结构,但进程的返回是自动的,不必加返回语句进程只有执行和等待两种状态·进程必须有敏感信号的变化来启动·进程语句本身是并行语句,同一结构体中的不同进程语句是并行执行的·信号是多个进程间的通信线EDA技术与应用教程技术与应用教程724.2 VHDL程序结构4.2.3 库 库是经过编译后的数据集合,其目的为了使设计遵循某些统一的语言标准或数据格式,同时便于利用已有的设计成果,以提高设计效率⒈⒈ 库的语句格式库的语句格式⒉⒉ 库的种类库的种类⑴⑴ IEEE库库⑵⑵ STD库库⑶⑶ 面向面向ASIC库库⑷⑷ WORK库库⑸⑸ 用户自定义库用户自定义库⒊⒊ 库的使用库的使用EDA技术与应用教程技术与应用教程734.2 VHDL程序结构 USE语句的使用有两种常用格式: USE 库名. 程序包名. 项目名; USE 库名. 程序包名. ALL;例如语句: LIBRARY IEEE; USE IEEE. STD_LOGIC_1164.ALL;【例4 - 7】:库说明语句的应用LIBRARY IEEE; --库说明语句USE IEEE. STD_LOGIC_1164.ALL;ENTITY inv IS --第1个实体 PORT (a:IN STD_LOGIC; b:OUT STD_LOGIC); END inv;EDA技术与应用教程技术与应用教程74ARCHITECTURE behav OF inv ISBEGIN b<=NOT a;END behav;LIBRARY IEEE; --库说明语句(重新使用)USE IEEE. STD_LOGIC_1164.ALL;ENTITY ad3 IS --第2个实体 PORT (a1,a2,a3:IN STD_LOGIC; co:OUT STD_LOGIC);END ad3;ARCHITECTURE behav OF ad3 ISBEGIN co<=a1 AND a2 AND a3;END behav;4.2 VHDL程序结构EDA技术与应用教程技术与应用教程754.2 VHDL程序结构4.2.4 程序包程序包的一般语句格式如下: PACKAGE 程序包名 IS 程序包首说明部分 END 程序包名;PACKAGE BODY 程序包名 IS 程序包体说明部分以及包体内容 END 程序包名;程序包首 程序包体 4.2.5 配置配置语句的一般格式如下: CONFIGURATION 配置名 OF 实体名 IS 配置说END 配置名;EDA技术与应用教程技术与应用教程764.3 VHDL语言要素4.3.1 VHDL的文字规则⒈⒈ 注释注释:注释以“--”开头直到本行末尾(出现回车或换行符)的一段文字。
⒉⒉ 数字数字:⑴⑴ 整数整数⑵⑵ 实数实数⑶⑶ 以数制基数表示的数以数制基数表示的数⑷⑷ 物理量文字物理量文字:综合器不支持物理量文字的综合,如:30s(秒)、10m (米)、2.5A(安培)等⒊⒊ 字符与字符串字符与字符串⒋⒋ 关键字关键字:关键字是VHDL预先定义的保留字,它们在程序中有不同的目的和作用 ⒌⒌ 标识符标识符:标识符是用户编程时为常量、变量、信号、端口、子程序或参数等定义的 名字 ⒍⒍ 下标名下标名:下下标名用于指示数组型变量或信号的某一元素 EDA技术与应用教程技术与应用教程774.3 VHDL语言要素4.3.2 VHDL的数据对象在VHDL语言中,数据对象主要包括3种:常量、变量和信号 表 4 - 2 VHDL数据对象及说明场合数据对象数据对象含义含义说明场合说明场合信号(Signal)说明全局量ARCHITECTURE,PACKAGE,ENTITY变量(Variable)说明局部量PROCESS,FUNCTION,PROCEDURE常量(Constant)说明全局量以上所述场合都可以存在EDA技术与应用教程技术与应用教程78⒈⒈ 常量常量常量是一个固定的值,定义和设置常量主要是为了程序更容易阅读和理解。
⒉⒉ 变量变量变量一个局部量,只能在进程和子程序中使用 ⒊⒊ 信号信号信号在硬件电路设计中相当于是连线 4.3 VHDL语言要素EDA技术与应用教程技术与应用教程794.3 VHDL语言要素⒋⒋ 信号和变量的区别信号和变量的区别⑴ 信号用于电路中的信号连线,变量用于进程中局部数据存储单元;⑵ 信号的使用和定义范围在结构体、程序包和实体中,不能在进程、函数和子程序中使用,而变量只能在进程、函数和子程序中使用;⑶ 变量在赋值时不能产生附加延时,信号代入时可以附加延时 ⑷ 变量用“:=”赋值,信号用“<=”代入 ⑸ 变量赋值语句一旦被执行,其值立即被赋予变量信号实际代入过程和代入语句的处理是分开进行的 VHDL中的标准数据类型都是在VHDL标准程序包中预定义的,总共有104.3.3 VHDL的数据类型⒈⒈ 标准数据类型标准数据类型种如表 4 - 3所示EDA技术与应用教程技术与应用教程804.3 VHDL语言要素表 4 - 3 标准的数据类型数据类型数据类型含义含义整数(Integer)整数32位 ,-2147483647~+2147483647实数(Real)浮点数,-1.0E+38~+1.0E+38位(Bit)逻辑量“0”或“1”位矢量(Bit_Vector)位矢量布尔量(Boolean)逻辑“真”或逻辑“假”字符(Charactor)ASCⅡ字符时间(Time)时间单位fs, ps, ns,us,ms,sec,min,hr错误等级(Severity Level)NOTE,WARNING,ERROR,FAILURE自然数、正整数(Natual & Positive)整数的子集字符串(String)字符矢量EDA技术与应用教程技术与应用教程814.3 VHDL语言要素⒊⒊ 用户定义的子类型用户定义的子类型⒋⒋ 数据类型的转换数据类型的转换表 4 - 4 数据类型变换函数函数名函数名功能功能STD_LOGIC_1164程序包:TO_STDLOGICVECTOR(A)TO_BITVECTOR(A)TO_STDLOGIC(A)TO_BIT(A)由BITVECTOR转换为STDLOGICVECTOR由STDLOGICVECTOR转换为BITVECTOR由BIT转换为STDLOGIC由STDLOGIC转换为BITSTD_LOGIC_ARITH程序包:CONV_STD_LOGIC_VECTOR(A,位长)CONV_INTEGER(A)由INTEGER,UNSIGNED,SIGNED转换成STD_LOGIC_VECTOR由UNSIGNED,SIGNED转换成INTEGERSTD_LOGIC_UNSIGNED程序包:CONV_INTEGER(A)由STD_LOGIC_VECTOR转换成INTEGER⒉⒉ 用户定义的数据类型用户定义的数据类型⑴⑴ 枚举类型枚举类型⑵⑵ 整数类型、实数类型整数类型、实数类型⑶⑶ 数组数组⑷⑷ 记录类型记录类型EDA技术与应用教程技术与应用教程82【例4 - 10】:数据类型转换示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY dec3to8 IS PORT(input:IN STD_LOGIC_VECTOR(2 DOWNTO 0); output:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END dec3to8; ARCHITECTURE behav OF dec3to8 ISBEGIN PROCESS(input) BEGIN output<=(OTHERS=>'0'); EDA技术与应用教程技术与应用教程834.3 VHDL语言要素4.3.4 VHDL的操作符⒈⒈ 逻辑操作符逻辑操作符 VHDL共有7种基本逻辑操作符,它们是AND(与),OR(或),NAND(与非),NOR(或非),XOR(异或),XNOR(异或非)和NOT(取反)。
信号或变量在这些操作符的直接作用下,可构成组合电路逻辑操作符所要求的操作数(如变量或信号)的基本数据类型有3种,即BIT、BOOLEAN、和STD_LOGIC⒉⒉ 关系操作符关系操作符 关系操作符的作用是将相同数据类型的数据对象进行数值比较或关系排序判断,并将结果以布尔类型(Boolean)的数据表示出来,即“TRUE”或“FALSE”两种;VHDL提供了6种关系运算操作符:“=”(等于)、“/=”(不等于)、“>”(大于)、“<”(小于)、“>=”(大于等于)和“<=”(小于等于)⒊⒊ 算术操作符算术操作符output(CONV_INTEGER(input))<='1'; END PROCESS;END behav;EDA技术与应用教程技术与应用教程844.3 VHDL语言要素 VHDL共有17种算术运算符,它们是+(加)、–(减)、*(乘)、/(除)、MOD(求模)、REM(取余)、**(乘方)、ABS(取绝对值)、+(正)、–(负)和SLL(逻辑左移)、SRL(逻辑右移)、SLA(算术左移)、SRA(算术右移)、ROL(逻辑循环左移)、ROR(逻辑循环右移)和&(并置)。
其中+(正)、–(负)操作符亦称为符号操作符,代表所操作整数数值的正负,其操作数只有一个,属于一元运算符⒋⒋ 并置操作符并置操作符 并置运算符(&)在VHDL中使用比较多,故单独列出予以介绍并置运算操作数的数据类型是一维数组,可以利用并置符将普通操作数或数组组合起来形成各种新的数组例如“VH”&“DL”的结果为“VHDL”;“0”&“1”的结果是“01”,并置操作常用于生成位矢量和字符串 4.3.5 VHDL的属性1. 数值类属性数值类属性数值类属性用来得到数组、块或一般数据的相关值数值类属性包括3个子类:一般数据的数值属性、数组的数值属性和块的数值属性EDA技术与应用教程技术与应用教程854.3 VHDL语言要素⑴⑴ 一般数据的数值属性一般数据的数值属性 一般数据的数值属性共有4种,其书写格式为:客体‘属性名如果用“T”表示客体,则4种属性分别表示如下: ① T'LEFT:得到数据类或子类区间的最左端值; ② T'RIGHT:得到数据类或子类区间的最右端值; ③ T'HIGH:得到数据类或子类区间的高端值;④ T'LOW:得到数据类或子类区间的低端值⑵⑵ 数组的数值属性数组的数值属性 数组的数值属性只有一个,即T’LENGTH。
该属性用于得到数组的长度值,可用于任何标量类数组(包括多维标量类数组)⑶⑶ 块的数值属性块的数值属性 块的数值属性用于得到块或结构体是什么样的一个设计模块的信息,包括'STRUCTURE(结构设计)和'BEHAVIOR(行为设计)两种属性 EDA技术与应用教程技术与应用教程864.3 VHDL语言要素2. 函数类属性函数类属性 类属性是指属性以函数为主,让设计人员得到函数的有关数据类型、数组、信号的某些信息函数类的属性包括数据类型属性、数组属性、信号属性3类⑴⑴ 数据类型属性函数数据类型属性函数主要包括6种属性函数:① 'POS(x):得到输入x值的位置顺序号② 'VAL(x):得到位置顺序号x处的值③ 'SUCC(x):得到输入x值的下一个值④ 'PRED(x):得到输入x值的前一个值⑤ 'LEFTOF(x):得到输入x值左侧的值⑥ 'RIGHTOF(x):得到输入x值右侧的值⑵⑵ 数组属性函数数组属性函数 利用数组属性函数可得到数组的区间,在对数组的每一个元素进行操作时,必须知道数组的区间数组属性函数可以分为4种:EDA技术与应用教程技术与应用教程874.3 VHDL语言要素 ① 'LEFT(n):得到序号为n区间的左端位置号。
② 'RIGHT(n):得到序号为n区间的右端位置号 ③ 'HIGH(n):得到序号为n区间的高端位置号④ 'LOW n):得到序号为n区间的低端位置号⑶⑶ 信号属性函数信号属性函数信号属性函数用来得到信号的行为信息信号属性函数共有5种:① 'EVENT:用于判断在当前一个非常小的时间间隔内,事件是否发生 ② 'ACTIVE:用于判断在当前一个非常小的时间间隔内,信号是否发生改变 ③ 'LAST_EVENT:用于得到从信号前一个事件发生到现在所经过的时间④ 'LAST_VALUE:用于得到信号最后一次改变以前的值⑤ 'LAST_ACTIVE:用于得到从信号最后一次改变到现在的时间EDA技术与应用教程技术与应用教程884.3 VHDL语言要素【例4 - 14】:信号属性函数示例1LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff1 IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC);END dff1; ARCHITECTURE rtl OF dff1 ISBEGIN PROCESS(clk,d) BEGIN IF clk'EVENT AND clk='1' AND clk'LAST_VALUE='0' THEN q<=d; END IF; END PROCESS ;END rtl;EDA技术与应用教程技术与应用教程894.3 VHDL语言要素【例4 -15】:信号属性函数示例2LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff2 IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC);END dff2; ARCHITECTURE rtl OF dff2 ISBEGIN PROCESS(clk,d) BEGIN IF clk'EVENT AND clk'LAST_VALUE='0' THEN q<=d; END IF; END PROCESS ;END rtl; EDA技术与应用教程技术与应用教程904.3 VHDL语言要素【例4 -16】:信号属性函数示例3LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff3 IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC);END dff3; ARCHITECTURE rtl OF dff3 ISBEGIN PROCESS(clk,d) BEGIN IF rising_edge(clk) THEN q<=d; END IF; END PROCESS ;END rtl;EDA技术与应用教程技术与应用教程914.3 VHDL语言要素3. 信号类属性信号类属性 信号类属性用来对所加属性的信号产生新的特殊信号,在新产生的信号中包含了所加属性的相关信息。
4. 数据类型类属性数据类型类属性5. 数据区间类属性数据区间类属性EDA技术与应用教程技术与应用教程924.4 VHDL描述语句4.4.1 顺序描述语句 顺序语句的特点是,每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的,顺序语句只能出现在进程(Process)和子程序(Subprogram)中VHDL有以下几类基本顺序语句:· · •变量赋值语句 •信号赋值语句·•WAIT语句•IF语句•CASE语句•LOOP语句•NEXT语句•EXIT语句•RETURN语句•NULL语句•子程序调用语句赋值语句流程控制语句EDA技术与应用教程技术与应用教程934.4 VHDL描述语句⒈⒈ 赋值语句赋值语句 赋值语句的功能是将一个值或是一个表达式的运算结果传递给某一数据对象,如信号或变量赋值语句有两种:即信号赋值语句和变量赋值语句 ⒉⒉ IF语句语句 IF语句是一种条件语句,它根据语句中所设置的一种或多种条件,有选择的执行指定的顺序语句 EDA技术与应用教程技术与应用教程944.4 VHDL描述语句【例4 - 17】:第1种IF语句应用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY suocun IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC);END suocun; ARCHITECTURE rtl OF suocun ISBEGIN PROCESS(clk,d) BEGIN IF clk'EVENT AND clk='1' THEN q<=d; END IF; END PROCESS;END rtl;EDA技术与应用教程技术与应用教程954.4 VHDL描述语句【例4 - 18】:第2种IF语句应用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux21 IS PORT(a,b,s: IN STD_LOGIC; y: OUT STD_LOGIC);END mux21; ARCHITECTURE rtl OF mux21 ISBEGIN PROCESS(a,b,s) BEGIN IF s='1'THEN y<=a; ELSE y<=b; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程964.4 VHDL描述语句【例4 - 19】:第3种IF语句应用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY shfrt IS PORT(clk,load:IN STD_LOGIC; d:IN STD_LOGIC_VECTOR(7 DOWNTO 0); q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END shfrt; ARCHITECTURE rtl OF shfrt ISBEGIN PROCESS(clk,d) VARIABLE temp:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN IF clk'EVENT AND clk='1' THEN IF load='1'THEN temp:=d; EDA技术与应用教程技术与应用教程974.4 VHDL描述语句 ELSE temp(7 DOWNTO 1):=temp(6 DOWNTO 0); temp(0):=temp(7); END IF; END IF; q<=temp; END PROCESS;END rtl;EDA技术与应用教程技术与应用教程984.4 VHDL描述语句⒊⒊ CASE语句语句【例4 - 20】:CASE语句应用示例之编码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decoder IS PORT(datain:IN STD_LOGIC_VECTOR(2 DOWNTO 0); g1,g2a,g2b:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END decoder; ARCHITECTURE rtl OF decoder ISBEGIN PROCESS(datain,g1,g2a,g2b) BEGIN EDA技术与应用教程技术与应用教程994.4 VHDL描述语句 IF g1='1'AND g2a='0'AND g2b='0' THEN CASE datain IS WHEN "000"=>y<="11111110"; WHEN "001"=>y<="11111101"; WHEN "010"=>y<="11111011"; WHEN "011"=>y<="11110111"; WHEN "100"=>y<="11101111"; WHEN "101"=>y<="11011111"; WHEN "110"=>y<="10111111"; WHEN "111"=>y<="01111111"; WHEN OTHERS=>y<="XXXXXXXX"; END CASE;ELSE y<="11111111"; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1004.4 VHDL描述语句【例4 - 21】:CASE语句应用示例之译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY encoder IS PORT(input:IN STD_LOGIC_VECTOR(7 DOWNTO 0); y:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END encoder; ARCHITECTURE rtl OF encoder ISBEGIN PROCESS(input) BEGIN EDA技术与应用教程技术与应用教程1014.4 VHDL描述语句 PROCESS(input) BEGIN CASE input IS WHEN "01111111"=>y<="111"; WHEN "10111111"=>y<="110"; WHEN "11011111"=>y<="101"; WHEN "11101111"=>y<="100"; WHEN "11110111"=>y<="011"; WHEN "11111011"=>y<="010"; WHEN "11111101"=>y<="001"; WHEN "11111110"=>y<="000"; WHEN OTHERS=>y<="XXX"; END CASE; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1024.4 VHDL描述语句⒋⒋ LOOP语句语句【例4 - 22】:FOR-LOOP语句应用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY pcheck IS PORT( a:IN STD_LOGIC_VECTOR(7 DOWNTO 0); y:OUT STD_LOGIC);END pcheck; ARCHITECTURE rtl OF pcheck ISBEGIN PROCESS(A) VARIABLE temp:STD_LOGIC; BEGIN temp:='0'; FOR i IN 0 TO 7 LOOP temp:=temp XOR a(i); EDA技术与应用教程技术与应用教程1034.4 VHDL描述语句END LOOP; y<=temp; END PROCESS;END rtl;【例4 -23】:WHILE_LOOP语句应用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY pcheck IS PORT( a:IN STD_LOGIC_VECTOR(7 DOWNTO 0); y:OUT STD_LOGIC);END pcheck; ARCHITECTURE rtl OF pcheck ISBEGIN PROCESS(a) EDA技术与应用教程技术与应用教程1044.4 VHDL描述语句VARIABLE temp:STD_LOGIC; VARIABLE i:INTEGER RANGE 0 TO 8; BEGIN temp:='0'; i:=0; WHILE(i<8)LOOP temp:=temp XOR a(i); i:=i+1; END LOOP; y<=temp; END PROCESS;END rtl;EDA技术与应用教程技术与应用教程1054.4 VHDL描述语句⒌⒌ NEXT语句语句【例4 - 24】:NEXT语句应用示例WHILE var1>1 LOOP --假定var1与var2为变量 var1:=var2-2; NEXT WHEN var1=3; --省略NEXT与WHEN之间的标号 var2:=var2*var1;END LOOP; L1:FOR i IN 10 DOWNTO 1 LOOPL2:FOR j IN 0 TO i LOOP NEXT L1 WHEN i=j; --这里不能省略标号 matrix(i,j):=i*j+1; END LOOP L2;END LOOP L1; EDA技术与应用教程技术与应用教程1064.4 VHDL描述语句⒍⒍ EXIT语句语句【例4 -25】:EXIT语句与NEXT语句比较示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY bijiao IS PORT (a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0); y:OUT STD_LOGIC);END bijiao;ARCHITECTURE rtl OF bijiao ISBEGIN PROCESS(a,b) BEGIN FOR i IN 7 DOWNTO 0 LOOP EDA技术与应用教程技术与应用教程1074.4 VHDL描述语句 IF a(i)=’1’ AND b(i)=’0’ THEN y<=’1’; EXIT; ELSIF a(i)=’0’ AND b(i)=’1’ THEN y<=’0’; EXIT; ELSE NULL; END IF; END LOOP; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1084.4 VHDL描述语句⒎⒎ WAIT语句语句【例4 - 26】:WAIT ON语句应用示例PROCESS PROCESS(a,b)BEGIN BEGIN Y<=a OR b; Y<=a OR b; WAIT ON a,b; END PROCESS;END PROCESS;EDA技术与应用教程技术与应用教程1094.4 VHDL描述语句【例4 - 27】:WAIT UNTIL语句应用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY suocun IS PORT(clk,d:IN STD_LOGIC; q:OUT STD_LOGIC);END suocun; ARCHITECTURE rtl OF suocun ISBEGIN PROCESS BEGIN WAIT UNTIL clk'EVENT AND clk='1' ; --一直等到时钟的上升沿 q<=d; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1104.4 VHDL描述语句⒏⒏ RETURN语句语句 返回语句(RETURN)只能用于子程序体中,执行返回语句将结束子程序的执行,无条件的跳转至子程序结束处。
⒐⒐ NULL语句语句【例4 - 28】:NULL语句应用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY disp IS PORT (din:IN STD_LOGIC_VECTOR(3 DOWNTO 0); sg: OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END disp;EDA技术与应用教程技术与应用教程1114.4 VHDL描述语句ARCHITECTURE rtl OF disp ISBEGIN PROCESS(din) BEGIN CASE din IS WHEN "0000" => sg <= "0111111"; WHEN "0001" => sg <= "0000110"; WHEN "0010" => sg <= "1011011"; WHEN "0011" => sg <= "1001111"; WHEN "0100" => sg <= "1100110"; WHEN "0101" => sg <= "1101101"; WHEN "0110" => sg <= "1111101"; WHEN "0111" => sg <= "0000111"; WHEN "1000" => sg <= "1111111"; WHEN "1001" => sg <= "1101111"; EDA技术与应用教程技术与应用教程1124.4 VHDL描述语句 WHEN "1010" => sg <= "1110111"; WHEN "1011" => sg <= "1111100"; WHEN "1100" => sg <= "0111001"; WHEN "1101" => sg <= "1011110"; WHEN "1110" => sg <= "1111001"; WHEN "1111" => sg <= "1110001"; WHEN OTHERS => NULL ; END CASE ; END PROCESS ;END rtl; EDA技术与应用教程技术与应用教程1134.4 VHDL描述语句⒑⒑ 子程序调用语句子程序调用语句⑴⑴ 函数函数【例4 - 29】:程序里包定义函数LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE bpac IS --程序包首定义 FUNCTION max(A,B:STD_LOGIC_VECTOR) --函数首定义 RETURN STD_LOGIC_VECTOR;END;PACKAGE BODY bpac IS --程序包体定义 FUNCTION max(a,b:STD_LOGIC_VECTOR) --函数体定义 RETURN STD_LOGIC_VECTOR IS BEGIN IF a>b THEN RETURN a; ELSE RETURN b; END IF; END FUNCTION max;END bpac; EDA技术与应用教程技术与应用教程1144.4 VHDL描述语句LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.bpac.ALL; --打开函数所在的程序包 ENTITY peak IS PORT( data1:IN STD_LOGIC_VECTOR(4 DOWNTO 0); clk,set:IN STD_LOGIC; out1:OUT STD_LOGIC_VECTOR(4 DOWNTO 0));END peak;ARCHITECTURE rtl OF peak IS SIGNAL temp:STD_LOGIC_VECTOR( 4 DOWNTO 0);BEGIN out1<=temp; EDA技术与应用教程技术与应用教程1154.4 VHDL描述语句 PROCESS(clk,set) BEGIN IF clk'EVENT AND clk='1'THEN IF SET='1' THEN temp<=data1; ELSE temp<=max(data1,temp); --调用定义函数 END IF; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1164.4 VHDL描述语句【例4 - 30】:结构体中定义函数LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY func IS PORT(data1,data2,data3,data4: IN STD_LOGIC_VECTOR(3 DOWNTO 0); out1:OUT STD_LOGIC_VECTOR( 3 DOWNTO 0));END func; ARCHITECTURE rtl OF FUNC IS FUNCTION maxx(a,b:STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS BEGIN IF(a>b)THEN RETURN a; ELSE RETURN b; END IF; END FUNCTION maxx; EDA技术与应用教程技术与应用教程1174.4 VHDL描述语句 SIGNAL t1,t2:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN t1<=maxx(data1,data2); --调用函数 T2<=maxx(data3,data4); out1<=maxx(t1,t2);END rtl; EDA技术与应用教程技术与应用教程1184.4 VHDL描述语句⑵⑵ 过程过程【例4 - 31】:过程调用示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE EXAMPLE IS --定义程序包首 PROCEDURE max(SIGNAL a,b,c,d:IN STD_LOGIC_VECTOR; --定义过程首 SIGNAL y:OUT STD_LOGIC_VECTOR);END EXAMPLE;PACKAGE BODY EXAMPLE IS --定义程序包体 PROCEDURE max (SIGNAL a,b,c,d:IN STD_LOGIC_VECTOR; --定义过程体 SIGNAL y:OUT STD_LOGIC_VECTOR) IS EDA技术与应用教程技术与应用教程1194.4 VHDL描述语句 VARIABLE t1,t2:STD_LOGIC_VECTOR(A'RANGE); BEGIN IF a>b THEN t1:=a; ELSE t1:=b; END IF; IF c>d THEN t2:=c; ELSE t2:=d; END IF; IF t1>t2 THEN y<=t1; ELSE y<=t2; END IF; RETURN; END max;END EXAMPLE; EDA技术与应用教程技术与应用教程1204.4 VHDL描述语句⒈⒈ 并行信号赋值语句并行信号赋值语句⑴⑴ 简单信号赋值语句简单信号赋值语句⑵⑵ 条件信号赋值语句条件信号赋值语句其语句格式如下: 赋值目标 <= 表达式;4.4.2 并行描述语句⒈⒈ 并行信号赋值语句并行信号赋值语句⑴⑴ 简单信号赋值语句简单信号赋值语句⑵⑵ 条件信号赋值语句条件信号赋值语句EDA技术与应用教程技术与应用教程1214.4 VHDL描述语句4.4.2 并行描述语句⒈⒈ 并行信号赋值语句并行信号赋值语句⑴⑴ 简单信号赋值语句简单信号赋值语句⑵⑵ 条件信号赋值语句条件信号赋值语句其语句格式如下: 赋值目标 <= 表达式;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.EXAMPLE.ALL; --打开过程所在的程序包ENTITY guocheng IS PORT(e,f,g,h:IN STD_LOGIC_VECTOR(3 DOWNTO 0); q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END guocheng; ARCHITECTURE rtl OF guocheng ISBEGIN max(e,f,g,h,q); --调用过程END rtl;4.4.2 并行描述语句⒈⒈ 并行信号赋值语句并行信号赋值语句⑴⑴ 简单信号赋值语句简单信号赋值语句⑵⑵ 条件信号赋值语句条件信号赋值语句其语句格式如下: 赋值目标 <= 表达式;EDA技术与应用教程技术与应用教程1224.4 VHDL描述语句作为另一种并行赋值语句,条件信号赋值语句的表达方式如下: 赋值目标 <= 表达式1 WHEN 赋值条件1 ELSE 表达式2 WHEN 赋值条件2 ELSE ... 表达式n WHEN 赋值条件n ELSE 表达式;【例4 - 32】:条件信号赋值语句示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY disp IS PORT ( din:IN STD_LOGIC_VECTOR(3 DOWNTO 0); sg: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END disp;ARCHITECTURE rtl OF disp ISBEGIN EDA技术与应用教程技术与应用教程1234.4 VHDL描述语句 sg<="0111111" WHEN din = "0000" ELSE "0000110" WHEN din = "0001" ELSE "1011011" WHEN din = "0010" ELSE "1001111" WHEN din = "0011" ELSE "1100110" WHEN din = "0100" ELSE "1101101" WHEN din = "0101" ELSE "1111101" WHEN din = "0110" ELSE "0000111" WHEN din = "0111" ELSE "1111111" WHEN din = "1000" ELSE "1101111" WHEN din = "1001" ELSE "1110111" WHEN din = "1010" ELSE "1111100" WHEN din = "1011" ELSE "0111001" WHEN din = "1100" ELSE "1011110" WHEN din = "1101" ELSE "1111001" WHEN din = "1110" ELSE "1110001" WHEN din = "1111" ELSE "0000000";END rtl; EDA技术与应用教程技术与应用教程1244.4 VHDL描述语句⑶⑶ 选择信号赋值语句选择信号赋值语句语句格式如下: WITH 选择表达式 SELECT 赋值目标 <= 表达式1 WHEN 选择值1, 表达式2 WHEN 选择值2, ... 表达式n WHEN 选择值n, [表达式 WHEN OTHERS];【例4 - 33】:选择信号赋值语句示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY disp IS PORT ( din:IN STD_LOGIC_VECTOR(3 DOWNTO 0); sg: OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END disp;ARCHITECTURE rtl OF disp IS BEGINEDA技术与应用教程技术与应用教程1254.4 VHDL描述语句 WITH din SELECT sg<="0111111" WHEN "0000", "0000110" WHEN "0001", "1011011" WHEN "0010", "1001111" WHEN "0011", "1100110" WHEN "0100", "1101101" WHEN "0101", "1111101" WHEN "0110", "0000111" WHEN "0111", "1111111" WHEN "1000", "1101111" WHEN "1001", "1110111" WHEN "1010", "1111100" WHEN "1011", "0111001" WHEN "1100", "1011110" WHEN "1101", "1111001" WHEN "1110", "1110001" WHEN "1111", "0000000" WHEN OTHERS;END rtl; EDA技术与应用教程技术与应用教程1264.4 VHDL描述语句⒉⒉ 进程语句进程语句进程语句归纳起来有以下特点: ⑴ 它可以与其它进程并行运行,并可以存取结构体或实体中所定义的信号 ⑵ 进程结构中的所有语句都是按顺序执行的; ⑶ 为启动进程,在进程语句中必须至少包含一个敏感信号表或包含一个WAIT语句;⑷ 进程间的通信是通过信号量来实现的。
⒊⒊ 块语句块语句⒋⒋ 元件例化语句元件例化语句图 4 - 4 全加器的原理图和实体模块EDA技术与应用教程技术与应用教程1274.4 VHDL描述语句表 4 - 7 半加器真值表absoco0000011010101101【例4 - 34】:元件例化示例,半加器描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT ( a ,b : IN STD_LOGIC; co,so : OUT STD_LOGIC);END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder IS SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ; EDA技术与应用教程技术与应用教程1284.4 VHDL描述语句BEGIN abc <= a & b ; --a相并b,即a与b并置操作 PROCESS(abc) BEGIN CASE abc IS --类似于真值表的CASE语句 WHEN "00" => so<='0'; co<='0'; WHEN "01" => so<='1'; co<='0'; WHEN "10" => so<='1'; co<='0'; WHEN "11" => so<='0'; co<='1'; WHEN OTHERS => NULL; END CASE; END PROCESS; END ARCHITECTURE fh1;EDA技术与应用教程技术与应用教程1294.4 VHDL描述语句【例4 - 35】:元件例化示例,或门描述LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL;ENTITY or2a IS PORT (a, b :IN STD_LOGIC; c : OUT STD_LOGIC );END ENTITY or2a; ARCHITECTURE one OF or2a ISBEGIN c <= a OR b ;END ARCHITECTURE one ; EDA技术与应用教程技术与应用教程1304.4 VHDL描述语句【例4 - 36】:元件例化示例,全加器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY f_adder IS PORT(ain,bin,cin:IN STD_LOGIC; co,sum:OUT STD_LOGIC);END f_adder; ARCHITECTURE rtl OF f_adder IS COMPONENT h_adder PORT (a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END COMPONENT; COMPONENT or2a EDA技术与应用教程技术与应用教程1314.4 VHDL描述语句 PORT (a, b :IN STD_LOGIC; c : OUT STD_LOGIC ); END COMPONENT; SIGNAL t0,t1,t2:STD_LOGIC;BEGIN U1:h_adder PORT MAP (a=>ain,b=>bin,co=>t0,so=>t1); U2:h_adder PORT MAP (a=>t1,b=>cin,co=>t2,so=>sum); U3:or2a PORT MAP (a=>t0,b=>t2,c=>co);END rtl; EDA技术与应用教程技术与应用教程1324.4 VHDL描述语句⒌⒌ 生成语句生成语句【例4 - 37】:D触发器描述LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY jicun IS PORT(clk,clr,d:IN STD_LOGIC; q:OUT STD_LOGIC);END jicun; ARCHITECTURE rtl OF jicun ISBEGIN PROCESS(clk,clr,d) BEGIN IF clr='1'THEN q<='0'; ELSIF clk'EVENT AND clk='1'THEN q<=d; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1334.4 VHDL描述语句⒌⒌ 生成语句生成语句【例4 - 38】:生成语句的用法示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY shift IS PORT(clk,clr,din:IN STD_LOGIC; dout:OUT STD_LOGIC);END shift; ARCHITECTURE rtl OF shift IS COMPONENT jicun PORT(clk,clr,d:IN STD_LOGIC; q:OUT STD_LOGIC); END COMPONENT; EDA技术与应用教程技术与应用教程1344.4 VHDL描述语句SIGNAL temp:STD_LOGIC_VECTOR(0 TO 4); BEGIN temp(0)<=din; g1:FOR i IN 0 TO 3 GENERATE dffx: jicun PORT MAP (clk,clr,temp(i), temp(i+1)); END GENERATE; dout<=temp(4);END rtl;EDA技术与应用教程技术与应用教程1354.4 VHDL描述语句⒍⒍ 参数传递映射语句参数传递映射语句【例4 - 39】:参数传递语句示例LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY and2a IS GENERIC(rise:TIME:=1ns; fall:TIME:=2ns); PORT(a,b:IN STD_LOGIC; c:OUT STD_LOGIC);END and2a; ARCHITECTURE behav OF and2a IS SIGNAL temp:STD_LOGIC;BEGIN temp<=a AND b; c<=temp AFTER (rise) WHEN temp='1' ELSE temp AFTER (fall);END behav; EDA技术与应用教程技术与应用教程1364.4 VHDL描述语句图 4 - 5 四输入与门电路图【例4 - 40】:参数映射语句和端口映射语句的用法LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY yand2 IS PORT(ain,bin,cin,din:IN STD_LOGIC; q:OUT STD_LOGIC);END yand2; EDA技术与应用教程技术与应用教程1374.4 VHDL描述语句 SIGNAL t0,t1:STD_LOGIC; BEGIN U0:and2a GENERIC MAP(5ns,5ns) PORT MAP(ain,bin,t0); U1:and2a GENERIC MAP(8ns,10ns) PORT MAP(cin,din,t1); U2:and2a GENERIC MAP(9ns,11ns) PORT MAP(t0,t1,q);END behav; ARCHITECTURE behav OF yand2 IS COMPONENT and2a GENERIC(rise:TIME:=1ns; fall:TIME:=2ns); PORT(a,b:IN STD_LOGIC; c:OUT STD_LOGIC); END COMPONENT;EDA技术与应用教程技术与应用教程1384.4 VHDL描述语句⒎⒎ 断言语句断言语句 断言语句语句主要用于程序仿真、调试中的人机对话,它可以给出一个文字串作为警告或是错误信息。
8.并行过程调用语句并行过程调用语句过程调用语句可以出现在进程中,也可以出现在结构体和块语句中 EDA技术与应用教程技术与应用教程1394.5 VHDL描述风格 在VHDL语言中,结构体对于相同的逻辑功能可以采用不同的描述方法或实现方法,称为VHDL的硬件描述风格VHDL语言通常有3中不同的描述风格:即行为描述(Behavioral Description)、数据流描述(Dataflow Description)和结构描述(Structural Description) 4.5.1 行为描述表 4 - 8 全加器真值表ainbincinsumco0000000110010100110110010101011100111111EDA技术与应用教程技术与应用教程1404.5 VHDL描述风格【例4 - 41】:采用行为描述风格设计的一位全加法器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY fadder IS PORT(ain,bin,cin:IN STD_LOGIC; co,sum:OUT STD_LOGIC);END fadder;ARCHITECTURE behav OF fadder IS SIGNAL data:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN data<=ain&bin&cin; PROCESS(data) BEGIN EDA技术与应用教程技术与应用教程1414.5 VHDL描述风格CASE data IS WHEN"000"=>sum<='0';co<='0'; WHEN"001"=>sum<='1';co<='0'; WHEN"010"=>sum<='1';co<='0'; WHEN"011"=>sum<='0';co<='1'; WHEN"100"=>sum<='1';co<='0'; WHEN"101"=>sum<='0';co<='1'; WHEN"110"=>sum<='0';co<='1'; WHEN"111"=>sum<='1';co<='1'; WHEN OTHERS=>NULL; END CASE ; END PROCESS;END behav; EDA技术与应用教程技术与应用教程1424.5 VHDL描述风格图 4 - 6 采用行为描述方式的全加器RTL网表4.5.2 数据流描述图 4 - 7 采用数据流描述方式的全加器RTL网表【例4 - 42】: 采用数据流描述风格设计的一位全加法器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY fadder1 IS PORT(ain,bin,cin:IN STD_LOGIC; co,sum:OUT STD_LOGIC);END fadder1; EDA技术与应用教程技术与应用教程1434.5 VHDL描述风格ARCHITECTURE RTL OF fadder1 ISBEGIN sum<=ain XOR bin XOR cin; co<=((ain XOR bin)AND cin)OR (ain AND bin);END RTL; EDA技术与应用教程技术与应用教程1444.5 VHDL描述风格使用数据流描述方式需要注意的几个问题:⑴ 禁止在同一个进程中存在对两个寄存器的描述,如例4-43所示。
例4 - 43】:数据流描述注意1PROCESS(clk1,clk2)BEGIN IF clk1'EVENT AND clk1='1'THEN y<=a; END IF; IF clk2'EVENT AND clk2='1'THEN y<=b; END IF;END PROCESS; EDA技术与应用教程技术与应用教程1454.5 VHDL描述风格⑵ 禁止使用IF语句中的ELSE,如例4-44所示:【例4 - 44】:数据流描述注意2PROCESS(clk)BEGIN IF clk'EVENT AND clk='1'THEN y<=a; ELSE y<=b; END IF;END PROCESS; EDA技术与应用教程技术与应用教程1464.5 VHDL描述风格⑶ 寄存器描述中必须代入信号值4.5.3 结构描述图 4 - 8 全加器原理图EDA技术与应用教程技术与应用教程1474.5 VHDL描述风格【例4 - 45】:采用结构描述风格实现的一位全加器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY fadder2 IS PORT( ain,bin,cin:IN STD_LOGIC; co,sum:OUT STD_LOGIC);END fadder2; ARCHITECTURE stru OF fadder2 IS SIGNAL t0,t1,t2:STD_LOGIC;BEGIN t0<=ain XOR bin; t1<=NOT(ain AND bin); t2<=NOT(cin AND t0); co<=NOT(t1 AND t2); sum<=t0 XOR cin;END stru; EDA技术与应用教程技术与应用教程1484.6 VHDL设计方法 对于一个比较大的设计项目,往往应采用层次化的设计方法,即将一个大的设计项目分解为若干个子项目或若干层次来完成。
划分层次是从顶层由高住下(也称“自顶向下”),而设计时则可先设计底层电路,然后在高层次的设计中,逐级调用低层次的设计结果 4.6.1. 电路模块的划分与工程文件夹的建立⒈⒈ 电路模块的划分电路模块的划分图 4 - 9 4位二进制计数器的总体原理方框图⒉⒉ 工程文件夹建立工程文件夹建立EDA技术与应用教程技术与应用教程1494.6 VHDL设计方法4.6.2 设计底层电路模块⒈⒈ 十进制计数器的设计十进制计数器的设计图 4 - 10 计数器元件符号LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt IS PORT( clk,en:IN STD_LOGIC; --时钟脉冲信号,计数使能信号 dout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --计数结果 cout:OUT STD_LOGIC); --计数进位脉冲信号END cnt10; EDA技术与应用教程技术与应用教程1504.6 VHDL设计方法 ARCHITECTURE rtl OF cnt IS SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN dout<=q; --输出计数结果 PROCESS(clk,en) BEGIN IF(clk'EVENT AND clk='1') THEN IF en='1' THEN --计数使能 IF(q="1001") THEN --计数到9,则回0,进位脉冲输出1 q<="0000"; cout<='1'; ELSE --小于9,则累加1 q<=q+'1'; cout<='0'; END IF; END IF; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1514.6 VHDL设计方法图 4 - 11 十进制计数器的仿真波形⒉⒉ 设计七段显示译码器设计七段显示译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY dec IS PORT( din:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入4位BCD码 led:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --数码管七段显示END dec; EDA技术与应用教程技术与应用教程1524.6 VHDL设计方法 ARCHITECTURE rtl OF dec ISBEGIN PROCESS(din) BEGIN CASE din(3 DOWNTO 0) IS --七段数码管显示4位BCD码 WHEN "0000" => led <= "0111111" ; --显示“0” WHEN "0001" => led <= "0000110" ; --显示“1” WHEN "0010" => led <= "1011011" ; --显示“2” WHEN "0011" => led <= "1001111" ; --显示“3” WHEN "0100" => led <= "1100110" ; --显示“4” WHEN "0101" => led <= "1101101" ; --显示“5” WHEN "0110" => led <= "1111101" ; --显示“6” WHEN "0111" => led <= "0000111" ; --显示“7” WHEN "1000" => led <= "1111111" ; --显示“8” WHEN "1001" => led <= "1101111" ; --显示“9” EDA技术与应用教程技术与应用教程1534.6 VHDL设计方法 WHEN "1010" => led <= "1110111" ; --显示“A” WHEN "1011" => led <= "1111100" ; --显示“B” WHEN "1100" => led <= "0111001" ; --显示“C” WHEN "1101" => led <= "1011110" ; --显示“D” WHEN "1110" => led <= "1111001" ; --显示“E” WHEN "1111" => led <= "1110001" ; --显示“F” WHEN OTHERS => NULL; END CASE; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1544.6 VHDL设计方法图 4 - 12 译码器元件符号图 4 - 13 七段显示译码器的仿真波形EDA技术与应用教程技术与应用教程1554.6 VHDL设计方法4.6.3 设计电路顶层文件⒈⒈ 原理图设计方式原理图设计方式⒉⒉ VHDL设计方式设计方式 在Quartus II集成环境下,首先为顶层设计建立工程项目(cnt10),然后新建一个原理图设计文件。
在图形编辑方式中,调出4个cnt元件符号、4个dec元件符号及输入(INPUT)和输出(OUTPUT)元件符号,并按图 4 - 9 将它们连接起来即可得到计数译码显示电路的设计结果, 图 4 - 14 通过原理图自动生成VHDL文件EDA技术与应用教程技术与应用教程1564.6 VHDL设计方法图 4 - 15 选择文件类型对话框LIBRARY ieee;USE ieee.std_logic_1164.all; LIBRARY work; ENTITY cnt10 IS PORT ( clk : IN STD_LOGIC; en : IN STD_LOGIC; cout : OUT STD_LOGIC; led1 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); led2 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); led3 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0); led4 : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );END cnt10;ARCHITECTURE bdf_type OF cnt10 IS COMPONENT cnt -- 定义元件cnt EDA技术与应用教程技术与应用教程1574.6 VHDL设计方法 PORT(clk : IN STD_LOGIC; en : IN STD_LOGIC; cout : OUT STD_LOGIC; dout : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );END COMPONENT;COMPONENT dec -- 定义元件dec PORT(din : IN STD_LOGIC_VECTOR(3 DOWNTO 0); led : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) );END COMPONENT;SIGNAL SYNTHESIZED_WIRE_0 : STD_LOGIC;SIGNAL SYNTHESIZED_WIRE_1 : STD_LOGIC;SIGNAL SYNTHESIZED_WIRE_2 : STD_LOGIC;SIGNAL SYNTHESIZED_WIRE_3 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SYNTHESIZED_WIRE_4 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SYNTHESIZED_WIRE_5 : STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL SYNTHESIZED_WIRE_6 : STD_LOGIC_VECTOR(3 DOWNTO 0); EDA技术与应用教程技术与应用教程1584.6 VHDL设计方法BEGIN b2v_inst : cnt -- cnt元件例化PORT MAP(clk => clk, -- 端口映射 en => en, cout => SYNTHESIZED_WIRE_0, dout => SYNTHESIZED_WIRE_3); b2v_inst1 : cntPORT MAP(clk => SYNTHESIZED_WIRE_0, en => en, cout => SYNTHESIZED_WIRE_1, dout => SYNTHESIZED_WIRE_4); EDA技术与应用教程技术与应用教程1594.6 VHDL设计方法 b2v_inst2 : cntPORT MAP(clk => SYNTHESIZED_WIRE_1, en => en, cout => SYNTHESIZED_WIRE_2, dout => SYNTHESIZED_WIRE_5); b2v_inst3 : cntPORT MAP(clk => SYNTHESIZED_WIRE_2, en => en, cout => cout, dout => SYNTHESIZED_WIRE_6); EDA技术与应用教程技术与应用教程1604.6 VHDL设计方法b2v_inst4 : dec -- dec元件例化PORT MAP(din => SYNTHESIZED_WIRE_3, led => led1); b2v_inst5 : decPORT MAP(din => SYNTHESIZED_WIRE_4, led => led2); b2v_inst6 : decPORT MAP(din => SYNTHESIZED_WIRE_5, led => led3); b2v_inst7 : decPORT MAP(din => SYNTHESIZED_WIRE_6, led => led4); END bdf_type; EDA技术与应用教程技术与应用教程1614.6 VHDL设计方法4.6.4 编译仿真顶层设计文件图 4 - 16 4位十进制计数器元件符号图 4 - 17 顶层设计文件的仿真波形4.6.5 下载顶层设计文件设计完成后,可将设计结果下载到PLD芯片中进行测试验证,具体操作包括选择目标器件、引脚锁定和下载等,这里不再赘述。
EDA技术与应用教程技术与应用教程162思考练习⑴ 说明VHDL语言的基本结构⑵ 说明端口模式的INOUT与BUFFER的异同⑶ VHDL语言有几种数据对象,请说明他们的功能以及使用方法,举例说明数据对象 与数据类型的关系⑷ 试说明布尔类型和位类型的输出有什么区别?对于逻辑操作应该使用哪种类型? 关系操作的结果为哪种类型?IF语句的表达式为哪种类型?⑸ 用不同的表述语句描述一个四选一的多路选择器⑺ 如何用PROCESS语句和WAIT语句来描述电平触发的触发器⑼ 试说明子程序包括哪两种,在用法上有什么区别?⑽ 试用结构描述方式来描述图 4 - 18所示的硬件电路图 4 - 18 EDA技术与应用教程技术与应用教程163实训项目数控分频器的设计⒈⒈ 实训目的实训目的学习数控分频器的设计、分析和测试方法 ⒉⒉ 实训原理实训原理 对于数控分频器就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可 ⒊⒊ 实训步骤与要求实训步骤与要求⑴ 仿真:对于不同的d值和输入信号clk,给出仿真波形。
⑵ 验证:引脚锁定后重新进行编译,无误后通过下载电缆将生成的相应的.pof文件下载到目标板芯片中,观察实验结果预制数以8个开关键代替,输出接扬声器⑶ 根据以上要求,写出实训报告EDA技术与应用教程技术与应用教程164第5章 基本数字单元设计o5.1 组合逻辑电路设计o5.2 时序逻辑电路设计o5.3 状态机设计o5.4 存储器设计EDA技术与应用教程技术与应用教程1655.1 组合逻辑电路设计5.1.1 运算电路设计⒈⒈ 半加器半加器图 5 - 1 半加器网表电路图 【例5-1】:半加器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY halfadder IS PORT( a,b :IN STD_LOGIC; --加数与被加数输入 s,co :OUT STD_LOGIC); --和与进位输出END ENTITY halfadder; ARCHITECTURE half OF halfadder IS SIGNAL c,d:STD_LOGIC; BEGIN c<= a OR b; d<= a NAND b; co<= NOT d; s<= c AND d;END half; EDA技术与应用教程技术与应用教程1665.1 组合逻辑电路设计⒉⒉ 全加器全加器⑴⑴ 原理图方式原理图方式图 5 - 2 全加器的电路图⑵⑵ HDL描述方式描述方式 基于半加器的描述,若采用COMPONENT语句和PORT MAP语句就很容易编写出描述全加器的程序。
全加器的VHDL程序见例4-36EDA技术与应用教程技术与应用教程1675.1 组合逻辑电路设计⒊⒊ 多位加法器多位加法器图 5 - 4 8位乘法器的仿真波形例5-2】:多位加法器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY adder8bit IS PORT ( a, b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); cin: IN STD_LOGIC; s: OUT STD_LOGIC_VECTOR(8 DOWNTO 0)); --输出中含进位输出位END adder8bit ; ARCHITECTURE behav_adder8bit OF adder8bit ISBEGIN s<=('0'& a)+('0'& b);END behav_adder8bit;EDA技术与应用教程技术与应用教程1685.1 组合逻辑电路设计⒋⒋ 8位乘法器位乘法器图 5 - 3 8位乘法器的元件符号图 5 - 4 8位乘法器的仿真波形【例5-3】:8位乘法器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mul IS PORT (a,b:IN INTEGER RANGE 0 TO 255; q:OUT INTEGER RANGE 0 TO 65535);END mul; ARCHITECTURE mul8 OF mul ISBEGIN q<=a*b;END mul8;EDA技术与应用教程技术与应用教程1695.1 组合逻辑电路设计⒈⒈ 一般编码器设计一般编码器设计图 5 - 5 8-3编码器外部端口示意图表 5 - 1 8-3编码器的真值表输输 入入二进制编码输出二进制编码输出a0a1a2a3a4a5a6a7y2y1y01111111011111111101110111110111011111011110011101111011110111110101011111100101111111000EDA技术与应用教程技术与应用教程1705.1 组合逻辑电路设计图 5 - 6 8-3编码器电路的仿真波形【例5-4】:8-3编码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ch_8_3 IS PORT (a :IN STD_LOGIC_VECTOR(7 DOWNTO 0); --输入 y :OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); --编码输出END ch_8_3; ARCHITECTURE rtl OF ch_8_3 ISBEGIN WITH a SELECT y <="000" WHEN "11111110", "001" WHEN "11111101", "010" WHEN "11111011", "011" WHEN "11110111", "100" WHEN "11101111", EDA技术与应用教程技术与应用教程1715.1 组合逻辑电路设计⒉⒉ 优先编码器设计优先编码器设计表 5 - 2 优先级编码器真值表输输 入入输输 出出input(7)input(6)input(5)input(4)input(3)input(2)input(1)input(0)y2y1y0XXXXXXX0111XXXXXX01110XXXXX011101XXXX0111100XXX01111011XX011111010X011111100101111111000 "101" WHEN "11011111", "110" WHEN "10111111", "111" WHEN "01111111", "000" WHEN OTHERS; END rtl;EDA技术与应用教程技术与应用教程1725.1 组合逻辑电路设计图 5 - 7 8-3优先编码器的仿真波形【例5-5】:8-3优先编码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ch8_3 IS PORT (input:IN STD_LOGIC_VECTOR(7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END ch8_3; ARCHITECTURE rtl OF ch8_3 IS BEGIN PROCESS(input) BEGIN IF (input(0)='0') THEN ---使用IF-ELSIF语句实现优先编码功能 y<="111"; ELSIF (input(1))='0' THEN y<="110"; EDA技术与应用教程技术与应用教程1735.1 组合逻辑电路设计 ELSIF (input(2))='0' THEN y<="101"; ELSIF (input(3))='0' THEN y<="100"; ELSIF (input(4))='0' THEN y<="011"; ELSIF (input(5))='0' THEN y<="010"; ELSIF (input(6))='0' THEN y<="001"; ELSE y<="000"; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1745.1 组合逻辑电路设计5.1.3 译码器设计表 5 - 3 3-8译码器的真值表使能使能二进制输入端二进制输入端译码输出端译码输出端ENCBAY0Y1Y2Y3Y4Y5Y6Y70xxx11111111100001111111100110111111101011011111101111101111110011110111110111111011111011111101111111111110图 5 - 8 3-8译码器外部端口示意图EDA技术与应用教程技术与应用教程1755.1 组合逻辑电路设计【例5-6】:3-8译码器(用“CASE…WHEN”语句)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decoder3_8 IS PORT (a,b,c, en : IN STD_LOGIC; --输入端与使能端 y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --译码输出端END decoder3_8 ; ARCHITECTURE rtl OF decoder3_8 IS SIGNAL indata :STD_LOGIC_VECTOR(2 DOWNTO 0); --信号BEGIN indata<=c&b&a; PROCESS (indata,en) BEGIN IF (en='1')THEN CASE indata IS WHEN "000" =>y<="11111110"; EDA技术与应用教程技术与应用教程1765.1 组合逻辑电路设计图 5 - 9 3-8译码器电路的仿真波形 WHEN "001" =>y<="11111101"; WHEN "010" =>y<="11111011"; WHEN "011" =>y<="11110111"; WHEN "100" =>y<="11101111"; WHEN "101" =>y<="11011111"; WHEN "110" =>y<="10111111"; WHEN "111" =>y<="01111111"; WHEN OTHERS=>y<=NULL; END CASE; ELSE y<="11111111"; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程1775.1 组合逻辑电路设计【例5-7】:3-8译码器(用“WITH…SELECT”语句)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.All;ENTITY decoder3_8 ISPORT (a,b,c, en : IN STD_LOGIC; y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END decoder3_8; ARCHITECTURE rtl OF decoder3_8 IS SIGNAL indata :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN indata<=en&c&b&a; --将en,a,b,c进行并置操作 WITH indata SELECT y <="11111110" WHEN "1000", "11111101" WHEN "1001", EDA技术与应用教程技术与应用教程1785.1 组合逻辑电路设计 "11111011" WHEN "1010", "11110111" WHEN "1011", "11101111" WHEN "1100", "11011111" WHEN "1101", "10111111" WHEN "1110", "01111111" WHEN "1111", "11111111" WHEN OTHERS;END rtl; EDA技术与应用教程技术与应用教程1795.1 组合逻辑电路设计5.1.4 数据选择器设计表 5 - 4 4选1电路真值表选择输入选择输入数据输入数据输入数据输出数据输出BAD0D1D2D3y000XXX0001XXX101X0XX001X1XX110XX0X010XX1X111XXX0011XXX11图 5 - 10 4选1电路 EDA技术与应用教程技术与应用教程1805.1 组合逻辑电路设计【例5-8】:4选1多路选择器(使用“IF”语句描述)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 IS PORT(data0,data1,data2,data3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --数据输入 a,b:IN STD_LOGIC; --选择输入 y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --数据输出END ENTITY MUX4; ARCHITECTURE art OF mux4 IS SIGNAL sel : STD_LOGIC_VECTOR(1 DOWNTO 0);BEGIN sel<=b&a; EDA技术与应用教程技术与应用教程1815.1 组合逻辑电路设计图 5 - 11 4选1多路选择器的仿真波形 y<= data0 WHEN sel="00" ELSE data1 WHEN sel="01" ELSE data2 WHEN sel="10" ELSE data3 WHEN sel="11" ELSE "0000";END ARCHITECTURE art; EDA技术与应用教程技术与应用教程1825.1 组合逻辑电路设计【例5-9】:4选1多路选择器(使用“CASE”语句)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 IS PORT(data0,data1,data2,data3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --数据输入 a,b:IN STD_LOGIC; --选择输入 y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --数据输出END ENTITY MUX4; ARCHITECTURE art OF mux4 IS SIGNAL sel : STD_LOGIC_VECTOR(1 DOWNTO 0);BEGIN sel<=b&a; PROCESS(sel) BEGIN CASE sel IS EDA技术与应用教程技术与应用教程1835.1 组合逻辑电路设计 WHEN "00"=>y<=data0; WHEN "01"=>y<=data1; WHEN "10"=>y<=data2; WHEN "11"=>y<=data3; WHEN OTHERS =>y<=NULL; END CASE; END PROCESS;END ARCHITECTURE art; EDA技术与应用教程技术与应用教程1845.1 组合逻辑电路设计【例5-10】:4选1多路选择器(使用“WHEN-ELSE”语句描述)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux4 IS PORT(data0,data1,data2,data3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); a,b:IN STD_LOGIC; y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY mux4; ARCHITECTURE art OF mux4 IS SIGNAL sel : STD_LOGIC_VECTOR(1 DOWNTO 0);BEGIN sel<=b&a; y<= data0 WHEN sel="00" ELSE --并行条件赋值语句 EDA技术与应用教程技术与应用教程1855.1 组合逻辑电路设计 data1 WHEN sel="01" ELSE data2 WHEN sel="10" ELSE data3 WHEN sel="11" ELSE "0000"; END ARCHITECTURE art ; EDA技术与应用教程技术与应用教程1865.1 组合逻辑电路设计5.1.5 数据比较器设计表 5 - 5 三态门真值表【例5-11】:多位比较器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY comparator IS PORT ( a,b: IN STD_LOGIC_VECTOR(7 DOWNTO 0); --待比较数 a_equal_b,a_greater_b,a_less_b: OUT STD_LOGIC); --比较结果输出END comparator; ARCHITECTURE behav_comp OF comparator ISBEGIN a_equal_b<= '1'WHEN a=b ELSE '0'; --相等 a_greater_b<='1'WHEN a>b ELSE '0' ; --大于 a_less_b<= '1' WHEN aqout<=shift_right&qout(7 DOWNTO 1); --右移一位 WHEN "10"=>qout<=qout(6 DOWNTO 0)&shift_left; --左移一位 WHEN "11"=>qout<=data; --并行输入 WHEN OTHERS=>NULL; END CASE; END IF; END PROCESS;END ARCHITECTURE art; EDA技术与应用教程技术与应用教程2015.2 时序逻辑电路设计5.2.4 计数器设计⒈⒈ 同步计数器设计同步计数器设计⑴⑴ 六十进制计数器六十进制计数器图 5 - 21 六十进制计数器外部端口示意图【例5-20】:六十进制计数器(方法1)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY bcd60count IS PORT(clk,bcd1wr,bcd10wr,cin:IN STD_LOGIC; co:OUT STD_LOGIC; datain:IN STD_LOGIC_VECTOR (3 DOWNTO 0); bcd1:OUT STD_LOGIC_VECTOR (3 DOWNTO 0); bcd10:OUT STD_LOGIC_VECTOR (2 DOWNTO 0));END bcd60count;EDA技术与应用教程技术与应用教程2025.2 时序逻辑电路设计ARCHITECTURE rtl OF bcd60count IS SIGNAL bcd1n:STD_LOGIC_VECTOR (3 DOWNTO 0); SIGNAL bcd10n:STD_LOGIC_VECTOR (2 DOWNTO 0);BEGIN bcd1<=bcd1n; bcd10<=bcd10n; P1:PROCESS (clk,bcd1wr) --个位数处理进程 BEGIN IF (bcd1wr='1') THEN bcd1n<=datain; ELSIF (clk'EVENT AND clk='1') THEN IF (cin='1') THEN IF (bcd1n=9) THEN bcd1n<="0000";EDA技术与应用教程技术与应用教程2035.2 时序逻辑电路设计P2:PROCESS (clk,bcd10wr) --十位数处理进程 BEGIN IF (bcd10wr='1') THEN bcd10n<=datain (2 DOWNTO 0); ELSIF (clk'EVENT AND clk='1') THEN IF (cin='1' AND bcd1n=9) THEN IF (bcd10n=5) THEN bcd10n<="000"; ELSE bcd10n<=bcd10n+1; END IF; END IF; END IF; END PROCESS P2;EDA技术与应用教程技术与应用教程2045.2 时序逻辑电路设计P3:PROCESS (clk,bcd10n,bcd1n,cin) --进位位处理进程 BEGIN IF clk'EVENT AND clk='1' THEN IF (cin='1' AND bcd1n=9 AND bcd10n=5) THEN co<='1'; ELSE co<='0'; END IF; END IF; END PROCESS P3;END rtl;EDA技术与应用教程技术与应用教程2055.2 时序逻辑电路设计【例5-21】:六十进制计数器(方法2)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY counter60 IS PORT(cp: IN STD_LOGIC; --时钟脉冲 bin: OUT STD_LOGIC_VECTOR (5 DOWNTO 0); --二进制 s: IN STD_LOGIC; --输出启动信号 clr: IN STD_LOGIC; --清除信号 ec: IN STD_LOGIC; --使能计数信号 cy60: OUT STD_LOGIC ); --计数60进位信号END counter60;EDA技术与应用教程技术与应用教程2065.2 时序逻辑电路设计ARCHITECTURE rtl OF counter60 IS SIGNAL q : STD_LOGIC_VECTOR (5 DOWNTO 0); SIGNAL rst, dly : STD_LOGIC;BEGIN PROCESS (cp,rst) --计数60 BEGIN IF rst = '1' THEN q<= "000000"; --复位计数器 ELSIF cp'EVENT AND cp = '1' THEN dly <= q(5); IF ec = '1' THEN q<= q+1; --计数值加1 END IF; END IF; END PROCESS; cy60 <= NOT q(5) AND dly; --进位信号微分 EDA技术与应用教程技术与应用教程2075.2 时序逻辑电路设计图 5 - 22 六十进制计数器(方法2)电路的仿真波形rst <= '1' WHEN q=60 OR clr='1' ELSE --复位信号设定 '0'; bin <= q WHEN s = '1' ELSE --计数输出 "000000";END rtl ;EDA技术与应用教程技术与应用教程2085.2 时序逻辑电路设计⑵⑵ 可逆计数器可逆计数器表 5 - 8 可逆计数器真值表输入端输出端DIRCPQ2Q1Q0XX0001↑计数器加1操作0↑计数器减1操作【例5-22】:3位二进制可逆计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count3 IS PORT (cp,dir:IN STD_LOGIC; --时钟输入端口与计数方向控制端口 q: OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END;EDA技术与应用教程技术与应用教程2095.2 时序逻辑电路设计ARCHITECTURE rtl OF count3 IS SIGNAL qn:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN PROCESS(cp) BEGIN IF cp'EVENT AND cp='1' THEN IF dir='0' THEN --正计数,+ 1 qn<=qn +1; ELSE --逆计数,- 1 qn<=qn-1; END IF; END IF; END PROCESS; q<=qn;END rtl;EDA技术与应用教程技术与应用教程2105.2 时序逻辑电路设计⒉⒉ 异步计数器设计异步计数器设计图 5 - 23 8位异步计数器原理图【例5-23】:由8个触发器构成的8位二进制异步计数器LIBRARY IEEE; --待例化元件USE IEEE.STD_LOGIC_1164.ALL;ENTITY dffr IS PORT(clk,clr,d:IN STD_LOGIC; q,qb:OUT STD_LOGIC);END ENTITY dffr; EDA技术与应用教程技术与应用教程2115.2 时序逻辑电路设计⒉⒉ 异步计数器设计异步计数器设计 ARCHITECTURE art1 OF dffr IS SIGNAL q_in:STD_LOGIC;BEGIN qb<=NOT q_in; q<=q_in; PROCESS(clk,clr) IS BEGIN IF (clr='1') THEN q_in<='0'; ELSIF (clk'EVENT AND clk='1') THEN q_in<=d; END IF ; END PROCESS;END ARCHITECTURE art1; EDA技术与应用教程技术与应用教程2125.2 时序逻辑电路设计LIBRARY IEEE; --顶层文件设计USE IEEE.STD_LOGIC_1164.ALL;ENTITY rplcont IS PORT(clk,clr:IN STD_LOGIC; count:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END ENTITY rplcont; ARCHITECTURE art2 OF rplcont IS SIGNAL count_in_bar:STD_LOGIC_VECTOR(8 DOWNTO 0); COMPONENT dffr IS --元件调用声明 PORT(clk,clr,d:IN STD_LOGIC; q,qb:OUT STD_LOGIC); END COMPONENT;BEGIN count_in_bar(0)<=clk; GEN1:FOR I IN 0 TO 7 GENERATE u:dffr PORT MAP (clk=>count_in_bar(i),clr=>clr, --例化语句 d=>count_in_bar(i+1),q=>count(i),qb=>count_in_bar(i+1)); END GENERATE;END ARCHITECTURE art2; EDA技术与应用教程技术与应用教程2135.3 状态机设计图 5 - 24 状态机的基本结构I/OI/OI/OI/OI/OI/O状态A状态B状态C状态D状态E状态B01状态A001/01状态A状态B图 5 - 25 状态转移图 图 5 - 26 摩尔和米立状态机 EDA技术与应用教程技术与应用教程2145.3 状态机设计表 5 - 9 状态转移表现态现态输入输入次态次态输出输出S0-SnI0-ImS0-SnQ0-QP5.3.1 摩尔状态机设计图 5 - 27 Moore状态机的状态图【例5-24】:Moore状态机LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY moore IS PORT ( clk,datain, reset : IN STD_LOGIC; dataout: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END moore; EDA技术与应用教程技术与应用教程2155.3 状态机设计ARCHITECTURE arc OF moore ISTYPE state_type IS (s1, s2, s3, s4); SIGNAL state: state_type;BEGIN state_process: PROCESS (clk, reset) --时序逻辑进程 BEGIN IF reset='1' THEN --异步复位 state<=s1; ELSIF clk'EVENT AND clk='1' THEN --当检测到时钟上升沿时执行CASE语句 CASE state IS WHEN s1=>IF datain='1' THEN state<=s2; END IF; WHEN s2=>IF datain='0' THEN state<=s3; END IF; EDA技术与应用教程技术与应用教程2165.3 状态机设计图 5 - 28 Moore状态机的工作时序图WHEN s3=>IF datain='1' THEN state<=s4; END IF; WHEN s4=>IF datain='0' THEN state<=s1; END IF; END CASE; END IF; END PROCESS; --由信号STATE将当前状态值带出此进程,进入进程OUTPUT_P output_P: PROCESS (state) --组合逻辑进程 BEGIN CASE state IS --确定当前状态值 WHEN s1=>dataout<="0001"; --对应状态S1的数据输出为"0001" WHEN S2=>dataout<="0010"; WHEN S3=>dataout<="0100"; WHEN S4=>dataout<="1000"; END CASE; END PROCESS;END arc;EDA技术与应用教程技术与应用教程2175.3 状态机设计5.3.2 米里状态机设计 图 5 - 29 Mealy状态机的状态图图 5 - 30 Mealy的工作时序图【例5-25】:Mealy状态机LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY mealy IS PORT ( clk,datain,reset : IN STD_LOGIC; dataout : OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END mealy; ARCHITECTURE arc OF mealy IS TYPE state_type IS (s1, s2, s3, s4); SIGNAL state: state_type;BEGIN EDA技术与应用教程技术与应用教程2185.4 存储器设计 state_process: process (clk,reset) --时序逻辑进程 BEGIN IF reset='1' THEN --异步复位 state<=s1; ELSIF clk'EVENT AND clk='1' THEN --当检测到时钟上升沿时执行CASE语句 CASE state IS WHEN s1=>IF datain='1' THEN state<=s2; END IF; WHEN s2=>IF datain='0' THEN state<=s3; END IF; EDA技术与应用教程技术与应用教程2195.4 存储器设计5.4.2 随机存储器设计图 5 - 33 8×8位的RAM端口示意图【例5-27】:8×8位的RAMLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ram IS PORT(addr:IN STD_LOGIC_VECTOR(2 DOWNTO 0); --地址信号 wr:IN STD_LOGIC; --写信号 rd:IN STD_LOGIC; --读信号 cs:IN STD_LOGIC; --片选信号 datain:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --数据输入端 dataout:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --数据输出端END; EDA技术与应用教程技术与应用教程2205.4 存储器设计图 5 - 34 8×8位的RAM电路的仿真波形ARCHITECTURE one OF ram IS TYPE memory IS ARRAY(0 TO 7)OF STD_LOGIC_VECTOR(7 DOWNTO 0); --定义数据类型 SIGNAL data1:memory; SIGNAL addr1:INTEGER RANGE 0 TO 7;BEGIN addr1<=conv_integer(addr); --二进制到十进制的转换 PROCESS(wr,cs,addr1,data1,datain) --写操作 BEGIN IF cs='0' and wr='1' THEN data1(addr1)<=datain; END IF; END PROCESS; EDA技术与应用教程技术与应用教程2215.4 存储器设计图 5 - 34 8×8位的RAM电路的仿真波形 PROCESS(rd,cs,addr1,data1) --读操作 BEGIN IF cs='0' and rd='1' THEN dataout<=data1(addr1); ELSE dataout<=(OTHERS=>'Z'); END IF; END PROCESS;END;EDA技术与应用教程技术与应用教程222思考练习1.用VHDL语言设计一个8位二进制全加器。
2.用VHDL语言设计一个16选1数据选择器3.用VHDL语言设计一个9位偶校验电路要求当输入数据“1”的个数为偶数时输出为“0”,否则输出为“1”4.用VHDL语言设计一个带三态输出的二输入端“同或”逻辑门5.已知10线-4线优先编码器功能表如表 5 - 10,试用VHDL语言设计6.已知4线-10线译码器功能表如表 5 - 11,试用VHDL语言设计7.用VHDL语言设计一个带异步清零(低电平有效)、上升沿触发的JK触发器8.用VHDL语言设计一个带异步清零(低电平有效)、同步置位(低电平有效)、 下降沿触发的D触发器9.移位寄存器电路如图 5 - 35 所示,试用VHDL语言设计10.用VHDL语言设计一个带异步清零(低电平有效)的同步4位二进制加、减计数器EDA技术与应用教程技术与应用教程223实训项目项目一 1位二进制全加器⒈⒈ 实训目的实训目的⑴ 熟悉QUARTUS II的VHDL文本设计流程全过程; ⑵ 掌握1位二进制全加器的设计、仿真和硬件测试;⑶ 学会用VHDL语言设计一个1位二进制全加器⒉⒉ 实训原理实训原理 1位二进制全加器能够完成两个1位二进制数的加法运算,并且考虑低位来的进位。
全加器有两个一位二进制的输入端和一个进位输入端,以及一位和输出端和一位进位输出端EDA技术与应用教程技术与应用教程224实训项目项目二 七段显示译码器⒈⒈ 实训目的实训目的 ⑴ 熟悉QUARTUS II的VHDL文本设计流程全过程; ⑵ 掌握七段显示译码器的设计、仿真和硬件测试;⑶ 学会用VHDL语言设计一个七段显示译码器⒉⒉ 实训原理实训原理 通常使用的七段LED为“8”字型,另外,还有一个发光二极管用来显示小数点在七段LED显示器中,通常将各段发光二极管的阴极或阳极连在一起作为公共端,这样可以使驱动电路简单些,其中将各段发光二极管阳极连在一起的叫共阳极LED显示器,用低电平驱动;将各段发光二极管阴极连在一起的叫共阴极LED显示器,用高电平驱动 EDA技术与应用教程技术与应用教程225实训项目项目三 带异步清零的D触发器⒈⒈ 实训目的实训目的⑴ 熟悉QUARTUS II的VHDL文本设计流程全过程; ⑵ 掌握带异步清零的D触发器的设计、仿真和硬件测试; ⑶ 学会用VHDL语言设计一个带异步清零的D触发器 ⒉⒉ 实训原理实训原理 带异步清零的D触发器和一般D触发器的区别是多了一个复位输入端clr。
异步清零指的是当clr有效时,不论D和clk输入怎样的信号,其q端输出都被强迫置为“0”clr又称清零输入端或复位输入端 EDA技术与应用教程技术与应用教程226实训项目项目四 同步十进制计数器⒈⒈ 实训目的实训目的 ⑴ 熟悉QUARTUS II的VHDL文本设计流程全过程; ⑵ 掌握同步8421BCD码十进制计数器的设计、仿真和硬件测试; ⑶ 学会用VHDL语言设计一个同步8421BCD码十进制计数器⒉⒉ 实训原理及设计要求实训原理及设计要求 十进制计数器的特点是“逢十进一”同步8421BCD码十进制计数器的输出是8421BCD码,代表十进制数的0-9 用VHDL语言设计一个具有异步清零、同步置数功能的同步8421BCD码十进制计数器其输入端有:时钟输入端cp、异步清零控制输入端R、同步置数控制输入端S、同步置数4位数据输入端:DATA3-DATA0;计数器溢出指示输出端CO、计数输出端Q3-Q0EDA技术与应用教程技术与应用教程227第6章 EDA技术综合应用o6.1 数字钟的设计o6.2 数字频率计的设计o6.3 函数信号发生器的设计o6.4 交通信号控制器的设计o6.5 数字电压表设计o6.6 出租车计费系统EDA技术与应用教程技术与应用教程2286.1 数字钟的设计6.1.1 设计要求利用VHDL设计一个数字电子钟,使其具有如下基本功能: ⑴ 能够实现时、分、秒计时并以数字形式显示,时、分、秒各占2位; ⑵ 小时为24进制,分和秒为60进制; ⑶ 能够通过按键调整时间和复位;⑷ 可以进行整点报时; ⑸ 能够输出用于6位数码管动态扫描显示的控制信息。
6.1.2 设计方案七段译码器秒计数器分计数器时计数器校时电路秒信号发生器报时电路图 6 - 1 数字钟的系统组成框图EDA技术与应用教程技术与应用教程2296.1 数字钟的设计6.1.3 模块设计图 6 - 2 秒计数器模块⒈⒈ 秒计数器模块秒计数器模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt60 IS --定义实体 PORT(clk,reset:IN STD_LOGIC; --clk:1Hz脉冲,reset:复位端口 co:OUT STD_LOGIC; --60进制计数器进位端口 bcd1,bcd10:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --计数器个位和十位输出端口END cnt60; EDA技术与应用教程技术与应用教程2306.1 数字钟的设计6.1.3 模块设计图 6 - 2 秒计数器模块⒈⒈ 秒计数器模块秒计数器模块 ARCHITECTURE rtl OF cnt60 IS --定义结构体 SIGNAL bcd1t,bcd10t: STD_LOGIC_VECTOR(3 DOWNTO 0); --定义信号量BEGIN bcd1<=bcd1t; bcd10<=bcd10t; PROCESS(clk,reset) --计数器个位计数 BEGIN IF reset='1' THEN bcd1t<="0000"; --复位端有效,个位输出为0 ELSIF(clk'EVENT AND clk='1')THEN --时钟上升沿有效 IF bcd1t="1001"THEN --计数器个位为9时,重新回0 EDA技术与应用教程技术与应用教程2316.1 数字钟的设计bcd1t<="0000"; ELSE --否则自动累加1 bcd1t<=bcd1t+'1'; END IF; END IF; END PROCESS; PROCESS(clk,reset) --计数器十位计数 BEGIN IF reset='1' THEN bcd10t<="0000"; --复位端有效,十位输出为0 ELSIF( clk'EVENT AND clk='1')THEN IF bcd1t="1001" THEN --计数器个位为9时 IF bcd10t<5 THEN --十位小于5时,十位累加1 bcd10t<=bcd10t+'1'; ELSE --十位为5时,十位回0 bcd10t<="0000"; END IF; END IF; END IF; END PROCESS; EDA技术与应用教程技术与应用教程2326.1 数字钟的设计 PROCESS(clk,bcd1t,bcd10t) --进位处理进程 BEGIN IF clk'EVENT AND clk='1' THEN IF bcd1t="1001" AND bcd10t="0101" THEN --当十位为5,个位为9时,进位为1 co<='1'; ELSE --其余为0 co<='0'; END IF; END IF; END PROCESS;END rtl;EDA技术与应用教程技术与应用教程2336.1 数字钟的设计⒉⒉ 分计数器模块分计数器模块分钟计数模块和秒计数模块均为60进制计数器,参考程序如秒计数器。
⒊⒊ 小时计数器模块小时计数器模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt24 IS PORT(clk,reset:IN STD_LOGIC; --clk:时计数脉冲,reset:复位端口 bcd1,bcd10:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --时计数器的个位和十位输出END cnt24;ARCHITECTURE rtl OF cnt24 IS SIGNAL bcd1t,bcd10t: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN bcd1<=bcd1t; bcd10<=bcd10t; EDA技术与应用教程技术与应用教程2346.1 数字钟的设计PROCESS(clk,reset) BEGINIF reset='1' THEN bcd1t<="0000";bcd10t<="0000"; --复位端有效,计数器个位、十位输出为0 ELSIF(clk'EVENT AND clk='1')THEN --否则时钟上升沿有效时 IF bcd1t="0011"AND bcd10t="0010"THEN --若计数达到23,个位十位均回0 bcd1t<="0000"; bcd10t<="0000"; ELSIF bcd1t="1001"THEN --否则如果个位输出为9时, bcd1t<="0000"; --个位回0,十位加1 bcd10t<=bcd10t+'1'; ELSE --否则个位加1,十位保持不变 bcd1t<=bcd1t+'1'; END IF; END IF; END PROCESS;END rtl; 图 6 - 3 小时计数器模块EDA技术与应用教程技术与应用教程2356.1 数字钟的设计⒋⒋ 译码扫描显示模块译码扫描显示模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY disp IS PORT ( clk: IN STD_LOGIC; --动态扫描时钟,这里选择1Khz din0,din1,din2,din3,din4,din5:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --待显示的6个BCD码数 sg: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --数码管的段控端 bt: OUT STD_LOGIC_VECTOR(5 DOWNTO 0)); --数码管的位控端END disp; ARCHITECTURE rtl OF disp IS SIGNAL s: STD_LOGIC_VECTOR(2 DOWNTO 0); --信号量,6个数码管轮流计数值 SIGNAL num:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN EDA技术与应用教程技术与应用教程2366.1 数字钟的设计⒋⒋ 译码扫描显示模块译码扫描显示模块 P1:PROCESS(clk) --6进制计数器 BEGIN IF clk'EVENT AND clk= '1' THEN IF s="101"THEN s<="000" ; ELSE s<=s+'1'; END IF; END IF; END PROCESS P1; P2:PROCESS(s,din0,din1,din2,din3,din4,din5) BEGIN IF s="000" THEN bt<="111110";num<=din0; --数码管显示din0的值 ELSIF s="001" THEN bt<="111101";num<=din1; --数码管显示din1的值 EDA技术与应用教程技术与应用教程2376.1 数字钟的设计图 6 - 4 动态扫面显示模块 ELSIF s="010" THEN bt<="111011";num<=din2; --数码管显示din2的值 ELSIF s="011" THEN bt<="110111";num<=din3; --数码管显示din3的值 ELSIF s="100" THEN bt<="101111";num<=din4; --数码管显示din4的值 ELSIF s="101" THEN bt<="011111";num<=din5; --数码管显示din5的值 ELSE bt<="111111"; num<="1111"; END IF; END PROCESS P2; sg<= "0111111" WHEN num = "0000" ELSE "0000110" WHEN num = "0001" ELSE "1011011" WHEN num = "0010" ELSE "1001111" WHEN num = "0011" ELSE "1100110" WHEN num = "0100" ELSE "1101101" WHEN num = "0101" ELSE "1111101" WHEN num = "0110" ELSE "0000111" WHEN num = "0111" ELSE EDA技术与应用教程技术与应用教程2386.1 数字钟的设计 "1111111" WHEN num = "1000" ELSE "1101111" WHEN num = "1001" ELSE "1110111" WHEN num = "1010" ELSE "1111100" WHEN num = "1011" ELSE "0111001" WHEN num = "1100" ELSE "1011110" WHEN num = "1101" ELSE "1111001" WHEN num = "1110" ELSE "1110001" WHEN num = "1111" ELSE "0000000";END rtl;EDA技术与应用教程技术与应用教程2396.1 数字钟的设计⒌⒌ 校时模块校时模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY t_mux2 IS PORT(clk_1,cntclk:IN STD_LOGIC; --校时脉冲(秒脉冲)和正常计数脉冲(秒进位)输入端 sel:IN STD_LOGIC; --校时电路选择端 clkout:OUT STD_LOGIC); --计数脉冲输出端END t_mux2;ARCHITECTURE rtl OF t_mux2 ISBEGIN PROCESS(sel,clk_1,cntclk) --2选1电路 BEGIN IF sel='1'THEN clkout<=cntclk; ELSE clkout<=clk_1; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程2406.1 数字钟的设计⒍⒍ 分频模块分频模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY div IS PORT(clk_10m:IN STD_LOGIC; --10MHz信号端口 clk_1k:OUT STD_LOGIC; --1KHz信号端口 clk_1: OUT STD_LOGIC); --1Hz信号端口END div; ARCHITECTURE rtl OF div IS SIGNAL cnt1:INTEGER RANGE 0 TO 4999; SIGNAL cnt2:INTEGER RANGE 0 TO 499; SIGNAL tclk1k,tclk1: STD_LOGIC;BEGIN clk_1k<=tclk1k; clk_1<=tclk1; EDA技术与应用教程技术与应用教程2416.1 数字钟的设计 PROCESS(clk_10m) --对10MHz的脉冲进行10000分频,得到1KHz脉冲 BEGIN IF clk_10m'EVENT AND clk_10m='1' THEN IF cnt1=4999 THEN cnt1<=0; tclk1k<=NOT tclk1k; --取反,2分频得到1KHz方波脉冲 ELSE cnt1<=cnt1+1; END IF; END IF; END PROCESS;PROCESS(tclk1k) --对1KHHz的脉冲进行1000分频,得到1Hz脉冲 BEGIN IF tclk1k'EVENT AND tclk1k='1' THEN IF cnt2=499 THEN cnt2<=0; EDA技术与应用教程技术与应用教程2426.1 数字钟的设计 tclk1<=NOT tclk1; --取反,2分频得到1Hz方波脉冲 ELSE cnt2<=cnt2+1; END IF; END IF; END PROCESS;END rtl; ⒎⒎ 报时模块报时模块 当时钟到达整点时,扬声器发出报警信号。
该电路为一个与门电路,当分进位输出脉冲为高电平1时,扬声器响起⒏⒏ 顶层模块设计顶层模块设计EDA技术与应用教程技术与应用教程2436.1 数字钟的设计图 6 - 7 数字钟顶层模块6.1.4 仿真分析图 6 - 8 秒(分)计数脉冲输出仿真波形图EDA技术与应用教程技术与应用教程2446.1 数字钟的设计图 6 - 9 小时计数器模块图 6 - 10 扫描显示模块EDA技术与应用教程技术与应用教程2456.2 数字频率计的设计6.2.1 设计要求设计一个4位简易频率计,测量给定信号的频率,并用十进制数字显示,具体指标为:⑴ 测量范围,分4档(用数码管读数×档位): ① ×1档,1Hz-9.999KHz,闸门时间1s; ② ×10档,10Hz-99.99KHz,闸门时间0.1s; ③ ×100档,100Hz-999.9KHz,闸门时间10ms; ④ ×1000档,1000Hz-9999KHz,闸门时间1ms⑵ 显示方式:4位十进制数⑶ 用动态扫描方式输出显示控制信号6.2.2 设计方案EDA技术与应用教程技术与应用教程2466.2 数字频率计的设计计数器锁存器分频显示控制档位选择被测信号信号整形数码显示核心控制电路测频控制基准时钟图 6 - 11 数字频率计组成框图6.2.3 模块设计⒈⒈ 测频控制模块测频控制模块LIBRARY IEEE; --测频控制电路USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ftctrl IS PORT (clk : IN STD_LOGIC; --1Hz cnt_en: OUT STD_LOGIC; --计数器时钟使能 rst_cnt: OUT STD_LOGIC; --计数器清零 load: OUT STD_LOGIC ); --输出锁存信号END ftctrl;图 6 -12 测频控制模块EDA技术与应用教程技术与应用教程2476.2 数字频率计的设计ARCHITECTURE behav OF ftctrl IS SIGNAL Div2clk : STD_LOGIC;BEGIN PROCESS(clk ) BEGIN IF clk'EVENT AND clk= '1' THEN --1Hz时钟2分频 div2clk <= NOT div2clk; END IF; END PROCESS; rst_cnt<=NOT(clk OR div2clk); --产生复位信号 load <= NOT div2clk; --产生锁存信号 cnt_en<= div2clk; --产生计数信号END behav;EDA技术与应用教程技术与应用教程2486.2 数字频率计的设计⒉⒉ 计数模块计数模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY cnt10 IS PORT(clk,clr,en:IN STD_LOGIC; --待计数脉冲信号,清零信号,计数使能信号 dout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --计数结果 co:OUT STD_LOGIC); --计数进位脉冲信号END cnt10;ARCHITECTURE rtl OF cnt10 IS SIGNAL q:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN dout<=q; EDA技术与应用教程技术与应用教程2496.2 数字频率计的设计图 6 - 13 计数模块 PROCESS(clk,clr,en) BEGIN IF clr='1' THEN q<="0000"; --计数复位 ELSIF(clk'EVENT AND clk='1') THEN --计数使能 IF en='1' THEN IF(q="1001") THEN --计数到9,则回0,进位脉冲输出1 q<="0000"; co<='1'; ELSE --小于9,则累加1 q<=q+'1'; co<='0'; END IF; END IF; END IF; END PROCESS;END rtl; EDA技术与应用教程技术与应用教程2506.2 数字频率计的设计⒊⒊ 锁存模块锁存模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY reg IS PORT(load:IN STD_LOGIC; --锁存信号 din:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --计数输入 dout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --锁存计数结果输出 END reg;ARCHITECTURE rtl OF reg ISBEGIN PROCESS(load) BEGIN IF(load'EVENT AND load='1') THEN DOUT<=DIN; END IF; END PROCESS;END rtl; 图 6 -14 锁存模块EDA技术与应用教程技术与应用教程2516.2 数字频率计的设计⒋⒋ 显示模块显示模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY disp IS PORT(clk:IN STD_LOGIC; --动态扫描时钟 din0,din1,din2,din3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --待显示的4个BCD码 bt:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --位控端 sg:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --段控端END disp; ARCHITECTURE rtl OF disp ISSIGNAL num:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL cnt:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGIN 图 6 - 15 显示模块EDA技术与应用教程技术与应用教程2526.2 数字频率计的设计 PROCESS(clk) --对4个数码管的显示轮流计数 BEGIN IF clk'EVENT AND clk='1' THEN IF cnt="11" THEN cnt<="00"; ELSE cnt<=cnt+1; END IF; END IF; END PROCESS; PROCESS(cnt,din0,din1,din2,din3) BEGIN IF cnt="00" THEN bt<="1110";num<=din3; --显示din3的值 ELSIF cnt="01" THEN bt<="1101";num<=din2; --显示din2的值 EDA技术与应用教程技术与应用教程2536.2 数字频率计的设计 ELSIF cnt="10" THEN bt<="1011";num<=din1; --显示din1的值 ELSIF cnt="11" THEN bt<="0111";num<=din0; --显示din0的值 ELSE bt<="1111"; num<="1011"; END IF; END PROCESS; sg <= "0111111" WHEN num = "0000" ELSE --数码管显示BCD码方法 "0000110" WHEN num = "0001" ELSE "1011011" WHEN num = "0010" ELSE "1001111" WHEN num = "0011" ELSE "1100110" WHEN num = "0100" ELSE "1101101" WHEN num = "0101" ELSE "1111101" WHEN num = "0110" ELSE "0000111" WHEN num = "0111" ELSE "1111111" WHEN num = "1000" ELSE "1101111" WHEN num = "1001" ELSE "0000000";END rtl;EDA技术与应用教程技术与应用教程2546.2 数字频率计的设计⒌⒌ 分频模块分频模块图 6 - 16 档位选择模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY switch IS PORT(clk_1k:IN STD_LOGIC; keyin:IN STD_LOGIC_VECTOR(1 DOWNTO 0);--档位选择开关 clkout:OUT STD_LOGIC); --闸门信号(时间)输出END switch; ARCHITECTURE rtl OF switch IS SIGNAL cnt0,cnt1,cnt2:INTEGER RANGE 0 TO 4; SIGNAL clk_100,clk_10,clk_1:STD_LOGIC;EDA技术与应用教程技术与应用教程2556.2 数字频率计的设计BEGIN u1:PROCESS(clk_1k) --对1KHz进行10分频 BEGIN IF clk_1k'EVENT AND clk_1k='1' THEN IF cnt0=4 THEN cnt0<=0; clk_100<=NOT clk_100; ELSE cnt0<=cnt0+1; END IF; END IF; END PROCESS u1;u2:PROCESS(clk_100) --对100Hz进行10分频 BEGIN IF clk_100'EVENT AND clk_100='1' THEN IF cnt1=4 THEN cnt1<=0; EDA技术与应用教程技术与应用教程2566.2 数字频率计的设计 clk_10<= NOT clk_10; ELSE cnt1<=cnt1+1; END IF; END IF; END PROCESS u2; u3:PROCESS(clk_10) --对10Hz进行10分频 BEGIN IF clk_10'EVENT AND clk_10='1' THEN IF cnt2=4 THEN cnt2<=0; clk_1<=NOT clk_1; ELSE cnt2<=cnt2+1; END IF; EDA技术与应用教程技术与应用教程2576.2 数字频率计的设计 END IF; END PROCESS u3; u4:PROCESS(keyin,clk_1k,clk_100,clk_10,clk_1) --档位选择开关选择不同的闸门时间 BEGIN IF keyin="00" THEN clkout<=clk_1; ELSIF keyin="01" THEN clkout<=clk_10; ELSIF keyin="10" THEN clkout<=clk_100; ELSE clkout<=clk_1k; END IF; END PROCESS u4;END rtl; EDA技术与应用教程技术与应用教程2586.2 数字频率计的设计⒍⒍ 顶层模块顶层模块图 6 - 17 数字频率计顶层模块图EDA技术与应用教程技术与应用教程2596.2 数字频率计的设计6.2.4 仿真分析图 6 - 18 测频模块仿真波形图图 6 - 19 计数模块仿真波形图图 6 - 20 锁存模块仿真波形图EDA技术与应用教程技术与应用教程2606.2 数字频率计的设计图 6 - 21 分频模块仿真波形图图 6 - 22 顶层模块仿真波形图图 6- 23 高精度频率计测量原理图EDA技术与应用教程技术与应用教程2616.3 函数信号发生器的设计6.3.1 设计要求 设计一个智能函数信号发生器,能够以稳定的频率产生正弦波、三角波、锯齿波和方波,并能够通过按键选择输出4种不同种类的函数波形,同时具有系统复位功能。
6.3.2 设计方案图 6 - 23 函数信号发生器组成框图6.3.3 模块设计⒈⒈ 正弦波产生模块正弦波产生模块图 6 - 24 正弦波产生原理图EDA技术与应用教程技术与应用教程2626.3 函数信号发生器的设计⑴⑴ 定制定制LPM计数器计数器图 6 - 25 〖MegaWizard Plug-In Manager[page 1〗对话框图 6 - 26 〖MegaWizard Plug-In Manager[page 2a]〗对话框EDA技术与应用教程技术与应用教程2636.3 函数信号发生器的设计图 6 - 27 〖MegaWizard Plug-In Manager –LPM_COUNTER [page 3 of 7]〗对话框图 6 - 28 〖MegaWizard Plug-In Manager –LPM_COUNTER [page 4 of 7]〗对话框EDA技术与应用教程技术与应用教程2646.3 函数信号发生器的设计图 6 - 29 〖MegaWizard Plug-In Manager –LPM_COUNTER [page 5 of 7]〗对话框图 6 - 30 〖MegaWizard Plug-In Manager –LPM_COUNTER [page 7 of 7]〗对话框EDA技术与应用教程技术与应用教程2656.3 函数信号发生器的设计⑵⑵ 建立存储器初值设定文件建立存储器初值设定文件图 6 - 31 存储器参数设置对话框 图 6 - 32 存储器初值设定文件界面 EDA技术与应用教程技术与应用教程2666.3 函数信号发生器的设计⑶⑶ 定制定制ROM存储器存储器图 6 - 33 〖MegaWizard Plug-In Manager[page 2a]〗对话框图 6 - 34 〖MegaWizard Plug-In Manager–ROM:1-PORT [page 3 of 7]〗对话框EDA技术与应用教程技术与应用教程2676.3 函数信号发生器的设计图 6 - 35 〖MegaWizard Plug-In Manager–ROM:1-PORT [page 4 of 7]〗对话框图 6 - 36 〖MegaWizard Plug-In Manage–ROM:1-PORT [page 5 of 7]〗对话框EDA技术与应用教程技术与应用教程2686.3 函数信号发生器的设计图 6 - 37 正弦波产生模块⑷⑷ 设计正弦波产生模块的顶层文件设计正弦波产生模块的顶层文件⒉⒉ 三角波产生模块三角波产生模块LIBRARY IEEE; --三角波产生模块,加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY xhq_tri IS --定义实体 PORT( clk,clr:IN STD_LOGIC; --时钟与复位信号 q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --输出波形数据END xhq_tri; ARCHITECTURE xhq_1 OF xhq_tri IS --定义结构体BEGIN PROCESS(clk,clr) --启动进程 VARIABLE tmp: STD_LOGIC_VECTOR(7 DOWNTO 0); --临时变量 VARIABLE tag: STD_LOGIC; --加、减标志 BEGIN EDA技术与应用教程技术与应用教程2696.3 函数信号发生器的设计IF clr='1' THEN --复位清零 tmp:= "00000000"; ELSIF clk'EVENT AND clk='1' THEN IF tag='0' THEN --加法计数 IF tmp="11111110" THEN --加法计数器满tmp:="11111111"; tag:='1'; --下一时钟周期开始减法计数 ELSE tmp:=tmp+2; --加2操作 END IF; ELSE IF tmp="00000001" THEN --减法计数器满 tmp:="00000000"; tag:='0'; --下一时钟周期开始加法计数 ELSE tmp:=tmp-2; --减2操作 END IF; EDA技术与应用教程技术与应用教程2706.3 函数信号发生器的设计 END IF; END IF; q<=tmp; END PROCESS;END xhq_1;⒊⒊ 锯齿波产生模块锯齿波产生模块LIBRARY IEEE; --锯齿波产生模块,加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY xhq_saw IS --定义实体 PORT( clk,clr:IN STD_LOGIC; --时钟与复位信号 q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --输出波形数据END xhq_saw;图 6 -39 锯齿波产生模块EDA技术与应用教程技术与应用教程2716.3 函数信号发生器的设计⒊⒊ 锯齿波产生模块锯齿波产生模块ARCHITECTURE xhq_2 OF xhq_saw IS --定义结构体BEGIN PROCESS(clk,clr) --启动进程 VARIABLE tmp: STD_LOGIC_VECTOR(7 DOWNTO 0);--临时变量 BEGIN IF clr='1' THEN --复位清零 tmp:= "00000000"; ELSIF clk'EVENT AND clk='1' THEN IF tmp="11111111" THEN --到最大值,重新开始计数 tmp:="00000000"; ELSE tmp:=tmp+1; --加1操作 END IF; END IF; q<=tmp; END PROCESS;EDA技术与应用教程技术与应用教程2726.3 函数信号发生器的设计⒋⒋ 方波产生模块方波产生模块LIBRARY IEEE; --方波产生模块,加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY XHQ_Squ IS --定义实体 PORT( clk,clr:IN STD_LOGIC; --时钟与复位信号 q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --输出波形数据 END xhq_squ;ARCHITECTURE xhq_3 OF xhq_squ IS --定义结构体 SIGNAL tag: STD_LOGIC; --前、后半周标志BEGIN PROCESS(clk,clr) --前、后半周计数进程 VARIABLE cnt: INTEGER RANGE 0 TO 127; BEGIN IF clr='1' THEN --复位清零 图 6 - 40 方波产生模块EDA技术与应用教程技术与应用教程2736.3 函数信号发生器的设计⒋⒋ 方波产生模块方波产生模块 tag<='0'; ELSIF clk'EVENT AND clk='1' THEN IF cnt<127 THEN --时钟计数 cnt:=cnt+1; ELSE --时钟计数满,输出翻转 cnt:=0; tag<=NOT tag; END IF; END IF; END PROCESS; PROCESS(clk,tag) --输出信号赋值进程 BEGIN IF clk'EVENT AND clk='1' THEN IF tag='1' THEN 图 6 - 40 方波产生模块EDA技术与应用教程技术与应用教程2746.3 函数信号发生器的设计⒌⒌ 波形选择模块波形选择模块 q<="11111111"; ELSE q<="00000000"; END IF; END IF; END PROCESS;END xhq_3;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY xhq_sel ISLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY xhq_sel IS PORT( sel: IN STD_LOGIC_VECTOR(1 DOWNTO 0); d0,d1,d2,d3:IN STD_LOGIC_VECTOR(7 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END xhq_sel;EDA技术与应用教程技术与应用教程2756.3 函数信号发生器的设计ARCHITECTURE xhq_4 OF xhq_sel ISBEGIN PROCESS(sel) BEGIN CASE sel IS WHEN "00" => q<=d0; WHEN "01" => q<=d1; WHEN "10" => q<=d2; WHEN "11" => q<=d3; WHEN OTHERS=> NULL; END CASE; END PROCESS;END xhq_4;EDA技术与应用教程技术与应用教程2766.3 函数信号发生器的设计6.3.4 仿真分析图 6 - 42 正弦波产生模块仿真波形图 6 - 43 SignalTap II获得XHQ_Sin的波形EDA技术与应用教程技术与应用教程2776.3 函数信号发生器的设计图 6 - 44 三角波产生模块的仿真波形图 6 - 45 锯齿波产生模块的仿真波形EDA技术与应用教程技术与应用教程2786.3 函数信号发生器的设计图 6 - 46 方波产生模块的仿真波形图 6 - 47 仿真波形显示格式选择菜单 图 6 - 48 模拟波形显示方式参数设置 EDA技术与应用教程技术与应用教程2796.3 函数信号发生器的设计图 6 - 49 波形选择模块的仿真波形图 6 - 50 函数信号发生器顶层电路图EDA技术与应用教程技术与应用教程2806.3 函数信号发生器的设计图 6 - 51 函数信号发生器仿真波形EDA技术与应用教程技术与应用教程2816.4 交通信号控制器的设计6.4.1 设计要求 设计一个具有4种信号灯和倒计时显示的十字路口交通信号灯控制器,用以指挥车辆和行人有序的通行,如图 6 - 52所示。
图 6 - 52 十字路口交通灯示意图 图 6 - 53 交通灯控制器系统框图 6.4.2 设计方案EDA技术与应用教程技术与应用教程2826.4 交通信号控制器的设计表 6 - 1 交通灯工作方式设定表方方 式式一一二二三三四四五五M2(0:手动,1:自动)00001M1(0:A向,1:B向)0011*M0(0:直行,1:左拐)0101*表 6 - 2 交通灯状态转换表状态状态SS1S2S3S4S5S6S7S0A方向绿黄左黄红亮灯时间40s5s10s5s50sB方向红绿黄左黄亮灯时间60s30s5s10s5s6.4.3 模块设计⒈⒈ 顶层电路设计顶层电路设计图 6 - 54 交通灯控制器顶层原理图EDA技术与应用教程技术与应用教程2836.4 交通信号控制器的设计⒉⒉ 控制模块控制模块图 6 - 55 控制模块LIBRARY IEEE; --加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY xhd_ctrl IS --定义实体 PORT( clk,clr:IN STD_LOGIC; --时钟与复位信号 m:IN STD_LOGIC_VECTOR(2 DOWNTO 0); --工作方式选择 a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --计时信号 s:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); --工作状态信号END xhd_ctrl;ARCHITECTURE xhd_1 OF xhd_ctrl IS --定义结构体 SIGNAL q:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGIN PROCESS(clr,clk,m,a,b) BEGIN IF clr='1' THEN q<="000"; --复位信号为高电平,置状态S0 EDA技术与应用教程技术与应用教程2846.4 交通信号控制器的设计⒉⒉ 控制模块控制模块ELSIF (clk'EVENT AND clk='1')THEN IF m="000" THEN q<="001"; --工作方式1,置状态S1 END IF; IF m="001" THEN q<="011"; --工作方式2,置状态S3 END IF; IF m="010" THEN q<="101"; --工作方式3,置状态S5 END IF; IF m="011" THEN q<="111"; --工作方式4,置状态S7 END IF; IF m>="100" THEN --工作方式4,自动 IF (a=X"01") OR (b=X"01") THEN q<=q+1; --状态变化 ELSE q<=q; --计时时间未到,状态保持 END IF; END IF; END IF; END PROCESS; s<=q;END xhd_1; EDA技术与应用教程技术与应用教程2856.4 交通信号控制器的设计⒊⒊ 计时模块计时模块LIBRARY IEEE; --加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY xhd_time IS PORT(clk,clr:IN STD_LOGIC; --时钟与复位信号 m,s:IN STD_LOGIC_VECTOR(2 DOWNTO 0); --方式与状态信号 a,b:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --计时信号END xhd_time;ARCHITECTURE xhd_2 OF xhd_time IS SIGNAL at,bt:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ar,ag,al,yl:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL br,bg,bl:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN EDA技术与应用教程技术与应用教程2866.4 交通信号控制器的设计⒊⒊ 计时模块计时模块 ar<=X"50"; --A向红灯亮的时间 ag<=X"40"; --A向绿灯亮的时间 al<=X"10"; --A向左拐灯亮的时间 yl<=X"05"; --A、B向黄灯亮的时间 br<=X"60"; --B向红灯亮的时间 bg<=X"30"; --B向绿灯亮的时间 bl<=X"10"; --B向左拐灯亮的时间PROCESS(clr,clk,m,s) BEGIN IF clr='1' THEN at<=X"01"; bt<=X"01"; --复位 ELSIF (clk'EVENT AND clk='1')THEN IF m="000" THEN at<=X"01";bt<=X"21"; --方式1,A向直行 END IF;IF m="001" THEN at<=X"01";bt<=X"06"; --方式2,A向左拐 END IF; 图 6 - 56 计时模块EDA技术与应用教程技术与应用教程2876.4 交通信号控制器的设计 IF m="010" THEN at<=X"21";bt<=X"01"; --方式3,B向直行 END IF; IF m="011" THEN at<=X"06";bt<=X"01"; --方式4,B向左拐 END IF; IF m>="100" THEN --方式5,自动循环 IF (at=X"01") OR (bt=X"01") THEN CASE s IS --计时时间到,根据现工作状态决定亮灯时间 WHEN "000"=>at<=ag;bt<=br; WHEN "001"=>at<=yl; WHEN "010"=>at<=al; WHEN "011"=>at<=yl; WHEN "100"=>bt<=bg;at<=ar; WHEN "101"=>bt<=yl; WHEN "110"=>bt<=bl; WHEN "111"=>bt<=yl; WHEN OTHERS =>at<=at;bt<=bt; END CASE; END IF;EDA技术与应用教程技术与应用教程2886.4 交通信号控制器的设计 IF at/=X"01"THEN --A向计时 IF at(3 DOWNTO 0)="0000" THEN --若个位为0 at(3 DOWNTO 0)<="1001"; --则变9 at(7 DOWNTO 4)<=at(7 DOWNTO 4)-1; --十位减1 ELSE at(3 DOWNTO 0)<=at(3 DOWNTO 0)-1; --个位减1 at(7 DOWNTO 4)<=at(7 DOWNTO 4); --十位不变 END IF; END IF; IF bt/=X"01" THEN --B向计时,同A向 IF bt(3 DOWNTO 0)="0000" THEN bt(3 DOWNTO 0)<="1001"; bt(7 DOWNTO 4)<=bt(7 DOWNTO 4)-1; ELSE bt(3 DOWNTO 0)<=bt(3 DOWNTO 0)-1; bt(7 DOWNTO 4)<=bt(7 DOWNTO 4); END IF; END IF; END IF; END IF; END PROCESS; a<=at; b<=bt;END xhd_2; EDA技术与应用教程技术与应用教程2896.4 交通信号控制器的设计 IF at/=X"01"THEN --A向计时 IF at(3 DOWNTO 0)="0000" THEN --若个位为0 at(3 DOWNTO 0)<="1001"; --则变9 at(7 DOWNTO 4)<=at(7 DOWNTO 4)-1; --十位减1 ELSE at(3 DOWNTO 0)<=at(3 DOWNTO 0)-1; --个位减1 at(7 DOWNTO 4)<=at(7 DOWNTO 4); --十位不变 END IF; END IF; IF bt/=X"01" THEN --B向计时,同A向 IF bt(3 DOWNTO 0)="0000" THEN bt(3 DOWNTO 0)<="1001"; bt(7 DOWNTO 4)<=bt(7 DOWNTO 4)-1; ELSE bt(3 DOWNTO 0)<=bt(3 DOWNTO 0)-1; bt(7 DOWNTO 4)<=bt(7 DOWNTO 4); END IF; END IF; END IF; END IF; END PROCESS; a<=at; b<=bt;END xhd_2; EDA技术与应用教程技术与应用教程2906.4 交通信号控制器的设计END IF; END IF; END PROCESS; a<=at; b<=bt;END xhd_2;LIBRARY IEEE; --加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY xhd_disp IS --定义实体 PORT(clk1k,clr:IN STD_LOGIC; a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --欲显示的时间 sg:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); --段控信号 bt:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --位控信号END xhd_disp; ⒋⒋ 扫描显示模块扫描显示模块EDA技术与应用教程技术与应用教程2916.4 交通信号控制器的设计ARCHITECTURE xhd_3 OF xhd_disp IS --定义结构体 SIGNAL ou:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL ds:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL sel:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN PROCESS(clr,clk1k) --4进制计数器,位控控制 BEGIN IF clr='1' THEN sel<="00"; --复位 ELSIF (clk1k'EVENT AND clk1k='1')THEN IF sel="11" THEN sel<="00"; ELSE sel<=sel+1; --+1计数 END IF; END IF; END PROCESS; 图 6 - 57 扫描显示模块EDA技术与应用教程技术与应用教程2926.4 交通信号控制器的设计图 6 - 58 七段数码管PROCESS(sel) BEGIN CASE sel IS --数码管位控 WHEN "00"=>ou<=b(3 DOWNTO 0);bt<="1110"; --B个位 WHEN "01"=>ou<=b(7 DOWNTO 4);bt<="1101"; --B十位 WHEN "10"=>ou<=a(3 DOWNTO 0);bt<="1011"; --A个位 WHEN "11"=>ou<=a(7 DOWNTO 4);bt<="0111"; --A十位 WHEN OTHERS=>ou<=X"0";bt<="0001"; END CASE; END PROCESS; PROCESS(ou) BEGIN EDA技术与应用教程技术与应用教程2936.4 交通信号控制器的设计CASE ou IS --0 a b c d e f g(七段共阴,a为高位) WHEN X"0"=>ds<=X"7E"; --0 1 1 1 1 1 1 0(=7E),数码"0"的七段码 WHEN X"1"=>ds<=X"30"; --0 0 1 1 0 0 0 0(=30),数码"1"的七段码 WHEN X"2"=>ds<=X"6D"; --0 1 1 0 1 1 0 1(=6D),数码"2"的七段码 WHEN X"3"=>ds<=X"79"; --0 1 1 1 1 0 0 1(=79),数码"3"的七段码 WHEN X"4"=>ds<=X"33"; --0 0 1 1 0 0 1 1(=33),数码"4"的七段码 WHEN X"5"=>ds<=X"5B"; --0 1 0 1 1 0 1 1(=5B),数码"5"的七段码 WHEN X"6"=>ds<=X"5F"; --0 1 0 1 1 1 1 1(=5F),数码"6"的七段码 WHEN X"7"=>ds<=X"70"; --0 1 1 1 0 0 0 0(=70),数码"7"的七段码 WHEN X"8"=>ds<=X"7F"; --0 1 1 1 1 1 1 1(=7F),数码"8"的七段码 WHEN X"9"=>ds<=X"7B"; --0 1 1 1 1 0 1 1(=7B),数码"9"的七段码 WHEN OTHERS=>ds<=X"00"; END CASE; END PROCESS; sg<=ds(6 DOWNTO 0);END xhd_3; EDA技术与应用教程技术与应用教程2946.4 交通信号控制器的设计⒌⒌ 译码驱动模块译码驱动模块LIBRARY IEEE; --加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY xhd_lamp IS --定义实体 PORT(clr:IN STD_LOGIC; m:IN STD_LOGIC_VECTOR(2 DOWNTO 0); --工作方式 s:IN STD_LOGIC_VECTOR(2 DOWNTO 0); --工作状态 l:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --信号灯控制信号END xhd_lamp; ARCHITECTURE xhd_4 OF xhd_lamp IS --定义结构体 SIGNAL lm:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN EDA技术与应用教程技术与应用教程2956.4 交通信号控制器的设计⒌⒌ 译码驱动模块译码驱动模块PROCESS(clr,s,m) BEGIN IF clr='1' THEN lm<="00000000"; --复位,信号灯熄灭 ELSE IF m="000" THEN lm<="00100001"; --方式1,A绿B红 END IF; --高4位A向,低4位B向,次序为左黄绿红 IF m="001" THEN lm<="10000001"; --方式2,A左B红 END IF; IF m="010" THEN lm<="00010010"; --方式3,A红B绿 END IF; IF m="011" THEN lm<="00011000"; --方式4,A红B左 END IF; IF m>="100" THEN --方式5,自动EDA技术与应用教程技术与应用教程2966.4 交通信号控制器的设计CASE s IS --根据状态S决定信号灯是否亮 WHEN "000"=>lm<="00010100"; --状态0,A红B黄 WHEN "001"=>lm<="00100001"; --状态1,A绿B红 WHEN "010"=>lm<="01000001"; --状态2,A黄B红 WHEN "011"=>lm<="10000001"; --状态3,A左B红 WHEN "100"=>lm<="01000001"; --状态4,A黄B红 WHEN "101"=>lm<="00010010"; --状态5,A红B绿 WHEN "110"=>lm<="00010100"; --状态6,A红B黄 WHEN "111"=>lm<="00011000"; --状态7,A红B左 WHEN OTHERS =>lm<="00000000"; END CASE; END IF; END IF; END PROCESS; l<=lm;END xhd_4; EDA技术与应用教程技术与应用教程2976.4 交通信号控制器的设计⒍⒍ 分频模块分频模块图 6 - 60 分频模块LIBRARY IEEE; --加载库文件USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY xhd_freq IS --定义实体 PORT(clk1k:IN STD_LOGIC; --1KH时钟脉冲信号 clk:OUT STD_LOGIC); --1Hz时钟脉冲信号END xhd_freq; ARCHITECTURE xhd_5 OF xhd_freq IS --定义结构体 SIGNAL f:STD_LOGIC_VECTOR(9 DOWNTO 0);BEGIN PROCESS(clk1k) BEGIN IF (clk1k'EVENT AND clk1k='1') THEN f<=f+1; --计数 EDA技术与应用教程技术与应用教程2986.4 交通信号控制器的设计 END IF; END PROCESS; clk<=F(9); --1Hz秒脉冲输出END xhd_5; EDA技术与应用教程技术与应用教程2996.4 交通信号控制器的设计6.4.4 仿真分析图 6 - 61 控制模块的仿真波形图 6 - 62 计时模块的仿真波形图 6 - 63 译码驱动模块的仿真波形EDA技术与应用教程技术与应用教程3006.4 交通信号控制器的设计状态S1A向绿、B向红(21H-00100001)状态S2A向黄、B向红(41H-01000001)状态S3A向左、B向红(81H-10000001)状态S4A向黄、B向红(41H-01000001)状态S5A向红、B向绿(12H-00010010)状态S6A向红、B向黄(14H-00010100)状态S7A向红、B向左(18H-00011000)状态S0A向红、B向黄(14H-00010100)图 6 - 64 信号灯的状态转换图图 6 - 65 显示模块的仿真波形图 6 - 66 交通信号控制系统的仿真波形图EDA技术与应用教程技术与应用教程3016.5 数字电压表设计6.5.1 设计要求 利用FPGA控制ADC0809,设计一个量程为5V的数字电压表,要求采用3位数码管显示电压值,可以显示小数点后两位。
6.5.2 设计方案图 6 - 67 FPGA与ADC0809的接口电路图EDA技术与应用教程技术与应用教程3026.5 数字电压表设计6.5.3 模块设计⒈⒈ A/D转换控制模块转换控制模块图 6 - 68 ADC0809的工作时序图 图 6 - 69 AD转换控制模块 表 6 - 3 ADC0809状态转换表当前状态当前状态下一状下一状态态状态功能状态功能状态描述状态描述ST0ST1ALE=’0’,START=’0’,OE=’0’,LOCK=’0’对ADC0809初始化ST1ST2ALE=’1’,START=’1’,OE=’0’,LOCK=’0’启动A/D转换ST2ST3ALE=’0’,START=’0’,OE=’0’,LOCK=’0’采样周期等待(判断)ST3ST4ALE=’0’,START=’0’,OE=’1’,LOCK=’0’开启OE,输出转换好的数据ST4ST0ALE=’0’,START=’0’,OE=’1’,LOCK=’1’由LOCK信号输出转换好的数据EDA技术与应用教程技术与应用教程3036.5 数字电压表设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY adc IS PORT(clk10M,reset:IN STD_LOGIC; --系统频率及复位信号 clkout:OUT STD_LOGIC; --输出500KHz频率,提供ADC0809时钟 D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --ADC0809的数据输入 EOC:IN STD_LOGIC; --ADC0809的EOC输入 ALE:OUT STD_LOGIC; --ALE,OE,START信号输出控制ADC0809 OE:OUT STD_LOGIC; START:OUT STD_LOGIC; q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --准换后的数据输出END adc; EDA技术与应用教程技术与应用教程3046.5 数字电压表设计ARCHITECTURE behav OF adc IS TYPE states IS(st0,st1,st2,st3,st4); SIGNAL current_state,next_state:states:=st0; SIGNAL newclk:STD_LOGIC; SIGNAL LOCK:STD_LOGIC; SIGNAL cnt:INTEGER RANGE 0 TO 99;BEGIN clkout<=newclk; U1:PROCESS(clk10M) --分频,500KHz频率输出 BEGIN IF clk10M'EVENT AND clk10M='1' THEN IF cnt<99 THEN cnt<=cnt+1; ELSE cnt<=0; EDA技术与应用教程技术与应用教程3056.5 数字电压表设计 newclk<=NOT newclk; END IF; END IF; END PROCESS U1;U2:PROCESS(current_state,EOC) --不同状态的控制 BEGIN CASE current_state IS WHEN st0=>ALE<='0';START<='0';OE<='0';LOCK<='0';next_state<=st1; WHEN st1=>ALE<='1';START<='1';OE<='0';LOCK<='0';next_state<=st2; WHEN st2=>ALE<='0';START<='0';OE<='0';LOCK<='0'; IF(EOC='1')THEN next_state<=st3; ELSE next_state<=st2; END IF; WHEN st3=>ALE<='0';START<='0';OE<='1';LOCK<='0';next_state<=st4; WHEN st4=>ALE<='0';START<='0';OE<='1';LOCK<='1';next_state<=st0; WHEN OTHERS=>next_state<=st0; EDA技术与应用教程技术与应用教程3066.5 数字电压表设计 END CASE; END PROCESS U2; U3:PROCESS(reset,newclk) --状态转换 BEGIN IF reset='1'THEN current_state<=st0; ELSIF newclk'EVENT AND newclk='1' THEN current_state<=next_state; END IF;END PROCESS U3; U4:PROCESS(LOCK) --转换后的数据输出 BEGIN IF LOCK'EVENT AND LOCK='1' THEN q<=D; END IF; END PROCESS U4;END behav; EDA技术与应用教程技术与应用教程3076.5 数字电压表设计⒉⒉ 电压计算模块电压计算模块图 6 -70 电压计算模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cod IS PORT(datain:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --ADC0809转换后的数据 d0,d1,d2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --将转换后的数据转换为数字电压END cod;ARCHITECTURE rtl OF cod IS SIGNAL t0,t1:INTEGER RANGE 0 TO 510; SIGNAL t2:INTEGER RANGE 0 TO 99; SIGNAL tmp0,tmp1,tmp2: INTEGER RANGE 0 TO 9;BEGIN PROCESS(datain,t0,t1,t2) BEGIN t0<=CONV_INTEGER(datain)+CONV_INTEGER(datain); --将数据转换为整数EDA技术与应用教程技术与应用教程3086.5 数字电压表设计 CASE t0 IS --将转换后的数据加以修正 WHEN 510 DOWNTO 486 =>t1<=t0-10; WHEN 485 DOWNTO 434 =>t1<=t0-9; WHEN 433 DOWNTO 384 =>t1<=t0-8; WHEN 383 DOWNTO 332 =>t1<=t0-7; WHEN 331 DOWNTO 282 =>t1<=t0-6; WHEN 281 DOWNTO 230 =>t1<=t0-5; WHEN 229 DOWNTO 180 =>t1<=t0-4; WHEN 179 DOWNTO 128 =>t1<=t0-3; WHEN 127 DOWNTO 78 =>t1<=t0-2; WHEN 77 DOWNTO 26 =>t1<=t0-1; WHEN 25 DOWNTO 0 =>t1<=t0; WHEN OTHERS=>NULL; END CASE;CASE t1 IS --取百位数 EDA技术与应用教程技术与应用教程3096.5 数字电压表设计 WHEN 510 DOWNTO 500=>tmp2<=5; t2<=t1-500; WHEN 499 DOWNTO 400=>tmp2<=4; t2<=t1-400; WHEN 399 DOWNTO 300=>tmp2<=3; t2<=t1-300; WHEN 299 DOWNTO 200=>tmp2<=2; t2<=t1-200; WHEN 199 DOWNTO 100=>tmp2<=1; t2<=t1-100; WHEN 99 DOWNTO 0=>tmp2<=0; t2<=t1; WHEN OTHERS=>NULL; END CASE;CASE t2 IS --取十位和个位数 WHEN 99 DOWNTO 90 =>tmp1<=9;tmp0<=T2-90; WHEN 89 DOWNTO 80 =>tmp1<=8;tmp0<=T2-80; WHEN 79 DOWNTO 70 =>tmp1<=7;tmp0<=T2-70; WHEN 69 DOWNTO 60 =>tmp1<=6;tmp0<=T2-60; WHEN 59 DOWNTO 50 =>tmp1<=5;tmp0<=T2-50; WHEN 49 DOWNTO 40 =>tmp1<=4;tmp0<=T2-40; WHEN 39 DOWNTO 30 =>tmp1<=3;tmp0<=T2-30; EDA技术与应用教程技术与应用教程3106.5 数字电压表设计 WHEN 29 DOWNTO 20 =>tmp1<=2;tmp0<=T2-20; WHEN 19 DOWNTO 10 =>tmp1<=1;tmp0<=T2-10; WHEN 9 DOWNTO 0 => tmp1<=0;tmp0<=T2; WHEN OTHERS =>NULL; END CASE;EDA技术与应用教程技术与应用教程3116.5 数字电压表设计⒊⒊ 显示控制模块显示控制模块图 6 - 71 显示控制模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY disp IS PORT(clk:IN STD_LOGIC; d0,d1,d2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); bt:OUT STD_LOGIC_VECTOR( 2 DOWNTO 0); sg:OUT STD_LOGIC_VECTOR( 7 DOWNTO 0));END disp;ARCHITECTURE rtl OF disp IS SIGNAL cnt:INTEGER RANGE 0 TO 2; SIGNAL num:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL newclk:STD_LOGIC;EDA技术与应用教程技术与应用教程3126.5 数字电压表设计 SIGNAL tmp:INTEGER RANGE 0 TO 249;BEGIN U1:PROCESS(clk) BEGIN IF clk'EVENT AND clk='1'THEN IF tmp=249 THEN tmp<=0; newclk<=NOT newclk; ELSE tmp<=tmp+1; END IF; END IF; END PROCESS U1;EDA技术与应用教程技术与应用教程3136.5 数字电压表设计U2:PROCESS(newclk) BEGIN IF newclk'EVENT AND newclk='1'THEN IF cnt=2 THEN cnt<=0;ELSE cnt<=cnt+1; END IF; END IF; END PROCESS U2;U3:PROCESS(cnt,d0,d1,d2) BEGIN IF cnt=0 THEN bt<="110";num<=d0;sg(7)<='0'; ELSIF cnt=1 THEN bt<="101";num<=d1;sg(7)<='0'; ELSIF cnt=2 THEN bt<="011";num<=d2;sg(7)<='1'; ELSE bt<="111";num<="1011"; END IF; END PROCESS U3;EDA技术与应用教程技术与应用教程3146.5 数字电压表设计 sg(6 DOWNTO 0)<= "0111111" WHEN num = "0000" ELSE "0000110" WHEN num = "0001" ELSE "1011011" WHEN num = "0010" ELSE "1001111" WHEN num = "0011" ELSE "1100110" WHEN num = "0100" ELSE "1101101" WHEN num = "0101" ELSE "1111101" WHEN num = "0110" ELSE "0000111" WHEN num = "0111" ELSE "1111111" WHEN num = "1000" ELSE "1101111" WHEN num = "1001" ELSE "1110111" WHEN num = "1010" ELSE "1111100" WHEN num = "1011" ELSE "0111001" WHEN num = "1100" ELSE "1011110" WHEN num = "1101" ELSE "1111001" WHEN num = "1110" ELSE "1110001" WHEN num = "1111" ELSE "0000000";END rtl;EDA技术与应用教程技术与应用教程3156.5 数字电压表设计⒋⒋ 顶层模块设计顶层模块设计图 6 - 72 数字电压表顶层模块6.5.4 仿真分析图 6 - 73 AD转换模块仿真波形图EDA技术与应用教程技术与应用教程3166.5 数字电压表设计图 6 - 74 电压计算模块仿真波形图图 6 - 75 显示模块仿真波形图EDA技术与应用教程技术与应用教程3176.6 出租车计费系统6.6.1 设计要求 假设某城市出租车的收费标准如下:白天起步价为3Km范围内5元,晚上(21时至次日5时)起步价为3Km范围内6元。
白天3Km以上续程单价每Km为1.8元,晚上3Km以上续程单价每Km为2.2元当按下复位键时,出租车计费器回复为初始状态,若为白天则显示费用5元,晚上则显示费用6元当按下开始键时,出租车则按上述收费标准进行计费试设计符合要求的计费管理系统并通过LCD1602来显示车费和行驶里程6.6.2 设计方案图 6 - 76 出租车计费系统组成框图EDA技术与应用教程技术与应用教程3186.6 出租车计费系统6.6.3 模块设计⒈⒈ 速度模块速度模块图 6 - 77 速度模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY speed IS PORT(clk:IN STD_LOGIC; --传感器输出脉冲 reset:IN STD_LOGIC; --复位信号 stop,start:IN STD_LOGIC; --出租车停止和行使信号 sp:IN STD_LOGIC; --出租车暂停信号 clkout:OUT STD_LOGIC); --出租车每行使100m输出脉冲END speed;ARCHITECTURE rtl OF speed IS EDA技术与应用教程技术与应用教程3196.6 出租车计费系统 TYPE states IS (s0,s1); --s0 出租车停止,s1 出租车行使 SIGNAL state:states; SIGNAL cnt:INTEGER RANGE 0 TO 24;BEGIN PROCESS(clk,reset,stop,start) BEGIN IF reset='1' THEN state<=s0; ELSIF clk'EVENT AND clk='1' THENCASE state IS WHEN s0=>cnt<=0;clkout<='0'; --出租车停止状态,速度为0,100m脉冲为0 IF start='1'THEN state<=s1; --出租车行使状态 ELSE state<=s0; --否则出租车未行使 END IF;EDA技术与应用教程技术与应用教程3206.6 出租车计费系统 WHEN s1=>clkout<='0'; --出租车行使,初始clkout为0 IF stop='1' THEN state<=s0; --出租车到达目的地 ELSIF sp='1' THEN state<=s1; --出租车暂停,需收费 ELSIF cnt=24 THEN --否则处于行使状态,100m距离到 cnt<=0; clkout<='1'; state<=s1; --clkout为1,cnt重新计数 ELSE --否则100m行使距离不到 cnt<=cnt+1; state<=s1; --计数值继续加1 END IF; END CASE; END IF; END PROCESS;END rtl;EDA技术与应用教程技术与应用教程3216.6 出租车计费系统⒉⒉ 计程模块计程模块图 6 - 78 计程模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY kilom IS PORT(reset:IN STD_LOGIC; --复位脉冲 clkout:IN STD_LOGIC; --100m脉冲的输入信号 co:OUT STD_LOGIC; --500m里程进位信号 kcnt0,kcnt1,kcnt2,kcnt3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --里程输出十分位、个位、十位和百位END kilom;ARCHITECTURE rtl OF kilom IS SIGNAL cnt0,cnt1,cnt2,cnt3:STD_LOGIC_VECTOR(3 DOWNTO 0); --暂存里程输出十分位、个位、十位和百位EDA技术与应用教程技术与应用教程3226.6 出租车计费系统BEGIN U1:PROCESS(reset,clkout) BEGIN IF reset='1' THEN --复位信号有效,里程清零 cnt0<="0000";cnt1<="0000"; cnt2<="0000";cnt3<="0000"; ELSIF clkout'EVENT AND clkout='1' THEN IF cnt3="1001" AND cnt2="1001"AND cnt1="1001" AND cnt0="1001"THEN cnt0<="0000";cnt1<="0000"; cnt2<="0000";cnt3<="0000"; --里程清零 ELSIF cnt3<"1001" AND cnt2="1001"AND cnt1="1001" AND cnt0="1001"THEN cnt0<="0000";cnt1<="0000"; cnt2<="0000";cnt3<=cnt3+'1'; --里程十分位、个位、十位清零,百位加1 ELSIF cnt2<"1001"AND cnt1="1001" AND cnt0="1001"THEN cnt0<="0000";cnt1<="0000";EDA技术与应用教程技术与应用教程3236.6 出租车计费系统 cnt2<=cnt2+'1';cnt3<=cnt3; --里程十分位、个位清零,十位加1,百位保持 ELSIF cnt1<"1001" AND cnt0="1001"THEN cnt0<="0000";cnt1<=cnt1+'1'; cnt2<=cnt2;cnt3<=cnt3; --里程十分位清零、个位加1,十位、百位保持 ELSIF cnt0<"1001"THEN cnt0<=cnt0+'1';cnt1<=cnt1; cnt2<=cnt2;cnt3<=cnt3; --里程十分位加1、个位、十位、百位保持 END IF; END IF; END PROCESS U1; U2:PROCESS(clkout,cnt0) --每0.5Km输出一个脉冲信号 BEGIN IF clkout'EVENT AND clkout='1' THEN IF cnt0="0100" OR cnt0="1001" THEN co<='1'; EDA技术与应用教程技术与应用教程3246.6 出租车计费系统 ELSE co<='0'; END IF; END IF; END PROCESS U2; kcnt0<=cnt0;kcnt1<=cnt1; kcnt2<=cnt2;kcnt3<=cnt3;END rtl;EDA技术与应用教程技术与应用教程3256.6 出租车计费系统⒊⒊ 计费模块计费模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY money IS PORT(co:IN STD_LOGIC; reset:IN STD_LOGIC; choose:IN STD_LOGIC; kcnt1,kcnt2,kcnt3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); m0,m1,m2,m3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END money;ARCHITECTURE rtl OF money IS EDA技术与应用教程技术与应用教程3266.6 出租车计费系统SIGNAL tim0,tim1,tim2,tim3:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL cnt:INTEGER RANGE 0 TO 9; SIGNAL en:STD_LOGIC;BEGIN m0<=tim0; m1<=tim1; m2<=tim2; m3<=tim3;U1:PROCESS(kcnt1,kcnt2,kcnt3,choose) BEGIN IF kcnt3>="0000" AND kcnt2>="0000" AND kcnt1>="0011"THEN en<='1';ELSE en<='0'; END IF; END PROCESS U1;EDA技术与应用教程技术与应用教程3276.6 出租车计费系统U2:PROCESS(choose,reset,co) BEGIN IF reset='1' THEN IF choose='1' THEN tim0<="0000";tim1<="0101";tim2<="0000";tim3<="0000"; ELSE tim0<="0000";tim1<="0110";tim2<="0000";tim3<="0000"; END IF; ELSIF co'EVENT AND co='1' THEN IF en='1' THEN IF choose='1' THEN CASE tim0 is WHEN "0000"=>tim0<="1001";tim1<=tim1; WHEN "0001"=>tim0<="0000";tim1<=tim1+'1'; WHEN "0010"=>tim0<="0001";tim1<=tim1+'1'; WHEN "0011"=>tim0<="0010";tim1<=tim1+'1'; EDA技术与应用教程技术与应用教程3286.6 出租车计费系统 WHEN "0011"=>tim0<="0010";tim1<=tim1+'1'; WHEN "0100"=>tim0<="0011";tim1<=tim1+'1'; WHEN "0101"=>tim0<="0100";tim1<=tim1+'1'; WHEN "0110"=>tim0<="0101";tim1<=tim1+'1'; WHEN "0111"=>tim0<="0110";tim1<=tim1+'1'; WHEN "1000"=>tim0<="0111";tim1<=tim1+'1'; WHEN "1001"=>tim0<="1000";tim1<=tim1+'1'; WHEN OTHERS=>NULL; END CASE;IF tim1>="1001" THEN tim1<="0000";tim2<=tim2+'1'; ELSIF tim2>="1001"THEN tim2<="0000";tim3<=tim3+'1'; END IF; ELSIF choose='0' THEN tim0<=tim0+'1'; EDA技术与应用教程技术与应用教程3296.6 出租车计费系统tim1<=tim1+'1'; IF tim0>="1001" THEN tim0<="0000";tim1<=tim1+"0010"; ELSIF tim1>="1001" THEN tim1<="0000";tim2<=tim2+'1'; ELSIF tim2>="1001" THEN tim2<="0000";tim3<=tim3+'1'; END IF; ELSIF en='0' THEN IF choose='1' THEN tim0<="0000";tim1<="0101";tim2<="0000";tim3<="0000"; ELSE tim0<="0000";tim1<="0110";tim2<="0000";tim3<="0000"; END IF; END IF; END IF; END IF; END PROCESS U2;END rtl;EDA技术与应用教程技术与应用教程3306.6 出租车计费系统⒋⒋ LCD显示模块显示模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY disp1602 IS PORT(reset,clk:IN STD_LOGIC; --复位信号,系统时钟 kcnt0,kcnt1,kcnt2,kcnt3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --待显示的里程 m0,m1,m2,m3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); --待显示的费用 lcdrs:OUT STD_LOGIC; --数据/指令选择信号 lcden:OUT STD_LOGIC; --使能信号 lcdrw:OUT STD_LOGIC; --读写选择信号 data:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --数据引脚END disp1602;EDA技术与应用教程技术与应用教程3316.6 出租车计费系统ARCHITECTURE rtl OF disp1602 IS TYPE states IS(set_clr,set_cur,set_mod,set_input,set_ddram1,w_data1,set_ddram2,w_data2); SIGNAL state:states; SIGNAL cnt1:INTEGER RANGE 0 TO 9999; SIGNAL cnt2:INTEGER RANGE 0 TO 5:=0; SIGNAL datacnt:INTEGER RANGE 0 TO 4:=0; SIGNAL lcdclk:STD_LOGIC; BEGIN lcden<=lcdclk; lcdrw<='0';U1:PROCESS(clk) --分频 BEGIN IF clk'EVENT AND clk='1' THEN IF cnt1=9999 THEN cnt1<=0; lcdclk<=NOT lcdclk; EDA技术与应用教程技术与应用教程3326.6 出租车计费系统ELSE cnt1<=cnt1+1; END IF; END IF; END PROCESS U1;U2:PROCESS(lcdclk,reset,state) BEGIN IF reset='1' THEN state<=set_clr; lcdrs<='0'; ELSIF lcdclk'EVENT AND lcdclk='1' THEN CASE state IS WHEN set_clr => --清屏 lcdrs<='0'; IF cnt2=5 THEN cnt2<=0; data<=X"01"; state<=set_cur;ELSEEDA技术与应用教程技术与应用教程3336.6 出租车计费系统 cnt2<=cnt2+1; END IF; WHEN set_cur => --光标设置 lcdrs<='0'; data<=X"0C"; state<=set_mod; WHEN set_mod => lcdrs<='0'; data<=X"3C"; state<=set_input; WHEN set_input=> --输入方式设置 lcdrs<='0'; data<=X"06"; state<=set_ddram1; WHEN set_ddram1 => --设置DDRAM lcdrs<='0'; data<=X"80"; state<=w_data1;EDA技术与应用教程技术与应用教程3346.6 出租车计费系统 WHEN w_data1=> --写入行驶里程 lcdrs<='1'; IF datacnt=0 THEN IF kcnt3="0000" THEN data<="0010"&kcnt3;datacnt<=datacnt+1; ELSE data<="0011"&kcnt3;datacnt<=datacnt+1; END IF; ELSIF datacnt=1 THEN IF kcnt3="0000" AND kcnt2="0000" THEN data<="0010"&kcnt2;datacnt<=datacnt+1; ELSE data<="0011"&kcnt2;datacnt<=datacnt+1; END IF;ELSIF datacnt=2 THEN data<="0011"&kcnt1;datacnt<=datacnt+1; ELSIF datacnt=3 THEN EDA技术与应用教程技术与应用教程3356.6 出租车计费系统 data<=X"2E";datacnt<=datacnt+1; ELSIF datacnt=4 THEN data<="0011"&kcnt0;datacnt<=datacnt+1; ELSE datacnt<=0; state<=set_ddram2; END IF; WHEN set_ddram2 => --设置DDRAM lcdrs<='0'; data<=X"C0"; state<=w_data2; WHEN w_data2=> --写入总费用 lcdrs<='1'; IF datacnt=0 THEN IF m3="0000" THEN data<="0010"&m3;datacnt<=datacnt+1; ELSE data<="0011"&m3;datacnt<=datacnt+1;EDA技术与应用教程技术与应用教程3366.6 出租车计费系统 END IF; ELSIF datacnt=1 THEN IF m3="0000" AND m2="0000" THEN data<="0010"&m2;datacnt<=datacnt+1; ELSE data<="0011"&m2;datacnt<=datacnt+1; END IF; ELSIF datacnt=2 THEN data<="0011"&m1;datacnt<=datacnt+1; ELSIF datacnt=3 THEN data<=X"2E";datacnt<=datacnt+1; ELSIF datacnt=4 THEN data<="0011"&m0;datacnt<=datacnt+1; ELSE datacnt<=0; state<=set_mod; END IF; WHEN OTHERS=>state<=set_clr; END CASE; END IF; END PROCESS U2;END rtl; EDA技术与应用教程技术与应用教程3376.6 出租车计费系统图 6 - 83 计程模块仿真波形图图 6 - 84 顶层模块仿真波形图EDA技术与应用教程技术与应用教程3386.6 出租车计费系统⒌⒌ 顶层模块设计顶层模块设计图 6 - 81 出租车计费系统顶层图6.6.4 仿真分析图 6 - 82 速度模块仿真波形图。






![河南新冠肺炎文件-豫建科[2020]63号+豫建科〔2019〕282号](http://img.jinchutou.com/static_www/Images/s.gif)





