您好,欢迎来到99网。
搜索
您的当前位置:首页2021年度基于quartus的通用运算器的设计与实现学士学位

2021年度基于quartus的通用运算器的设计与实现学士学位

来源:99网



摘要

在集成电路设计领域中,各类微处理器已经成为了整个芯片系统关键。运算器作为其关键部件,得到广泛发展。和此同时,为了增加电子产品产出效率,降低制造成本,诸如QuartusII9.0等电子仿真软件相继出现,为产品开发提供了良好开发平台。

本文依据运算器含有物美价廉、使用方便、功效性强等特点,分别对半加器、全加器、乘法器、除法器进行了仿真设计。首先本文介绍了课题背景、意义、发展现实状况及未来走向,

其次对设计环境QuartusⅡ平台及VHDL做了介绍。以后对半加器、全加器、乘法器、除法器设计进行了具体描述,包含工作原理、真值表及步骤图,还把乘法器分成各个模块,并对各个模块进行了具体介绍和设计分析。随即对半加器、全加器、乘法器、除法器进行了编程、仿真和在QuartusⅡ平台上对仿真结果进行验证。从而做到了从理论到实践,学以致用。

关键词:运算器;QuartusⅡ; VHDL



Abstract

Inthe field of integrated circuit design, all kinds of microprocessorshas become the core of the whole chip system. Unit as its corecomponent, is widely development.At the same time, in order toincrease the electronic products output efficiency, reducemanufacturing cost, such as the QuartusII 9.0 electronic simulationsoftware appeared, such as for product development provides a gooddevelopment platform.

Basedon the arithmetic unit has the good and inexpensive, easy to use,functional characteristics, respectively, half adder, full adder,multiplier and divider design has carried on the simulation. Firstthis article introduces the topic background, significance, statusquo and future development, and research contents and the designscheme of a simple introduction. Secondly on the design environmentQuartusII platform and VHDL is presented. After full adder and fulladder, multiplier and divider design are described in detail,including the working principle, the truth table and flow chart, alsothe multiplier is divided into various modules, and each module areanalyzed in detail and design. Then half adder, full adder,multiplier and divider for programming, simulation, and in theQuartusII platform of simulation results to validate. Thus did itfrom theory to practice, to practice.

Keywords:Arithmetic unit; VHDL; QuartusII



目 录

1引言............................................................................................................................11.1 课题背景及意义.............................................................................................11.2 课题现实状况和发展.....................................................................................11.3 研究内容和设计方案.....................................................................................12 开发环境....................................................................................................................32.1 QuartusII平台介绍........................................................................................32.1.1 QuartusII介绍.....................................................................................3
2.1.2 QuartusII总体设计.............................................................................4
2.1.3 QuartusII总体仿真.............................................................................8
2.2VHDL语言介绍..............................................................................................92.2.1 VHDL语言概述...................................................................................9
2.2.2VHDL语言介绍.................................................................................10
2.2.3VHDL应用开发介绍.........................................................................12
3 基于QuartusII半加、全加器设计和实现............................................................133.1 基于QuartusII半加器运算..........................................................................133.1.1 半加器原理和真值表........................................................................13
3.1.2半加器设计和实现............................................................................13
3.2 基于QuartusII全加器运算..........................................................................22



3.2.1全加器原理、真值表和原理图.......................................................22
3.2.2全加器设计和实现..............................................................................24
4 基于QuartusII乘法、除法器设计和实现............................................................254.1 基于QuartusII乘法器运算..........................................................................254.1.1 乘法器原理和步骤图........................................................................25
4.1.2四位二进制加法器模块....................................................................28
4.1.3八位二进制加法器模块....................................................................29
4.1.4一位乘法器模块................................................................................31
4.1.58位右移寄存器模块..........................................................................33
4.1.6乘法器其它模块................................................................................34
4.2 基于QuartusII除法器运算..........................................................................394.2.1 除法器原理和步骤图........................................................................39
4.2.2除法器设计和实现............................................................................40
结论.............................................................................................................................43致谢.............................................................................................................................44参考文件......................................................................................................................45附录A英语原文.........................................................................................................46附录B汉语翻译.........................................................................................................56



1 引言

1.1 课题背景及意义

QuartusII含有界面友好、操作简单特点,作为高效EDA设计工具集合,和第三方软件扬长补短,使软件功效越来越强大,为用户提供了愈加丰富QuartusII平台。

利用基于VHDL语言技术优越性表现在能够缩短设计周期,提升设计活动效率、可靠性和正确性。用VHDL语言编写源程序,能够转化成电路原理图形式输出,而且VHDL语言作为归档文件优点是:

,

便

,

便

,

阅读者不需要太多硬件知识和经验就能够很轻易从程序中看出某一硬件电路工作原理和逻辑关系;可继承性好,设计者在设计其它硬件电路时,能够方便使用一些已经设计好局部硬件电路。

本课题是将二者优越性结合起来,VHDL语言在QuartusII开发环境下实现运算器加法器、半加器、全加器、乘法器和除法器。

运算器在当今社会起着举足轻重作用,伴随科技飞速发展,

部分特定电路开关和很多非线性变换领域等全部有着广泛应用。

1.2 课题现实状况和发展

在集成电路设计领域中,各类微处理器已经成为了整个芯片系统关键,大家对其性能要求越来越高,使得其每一个部件性能全部在不停提升。运算器作为其关键部件,已经成为高性能计算和数字信号处理关键指标,它发展影响着微处理器性能,相关提升其性能一直是中国外研究关键课题,这里介绍QuartusII9.0它简单易用,方便快捷,给设计者降低了难度,使用Quartus



II9.0设计运算器和传统运算器相比较含有开放性、可编程性强、设计空间大、时间灵活等特点,并含有较高试验效率。

1.3 研究内容和设计方案

查阅相关资料,熟悉QuartusII软件,熟悉运算器工作原理,了解运算器各部分功效;QuartusII平台上设计并实现半加器、全加器、乘法器和除法器。

QuartusII平台上实现半加器、全加器、加法器、移位加法乘法器、除法器运算过程,基于VHDL语言,硬件简单,性能稳定,能够充足表现可编程器件在数字电路中优越性。

首先确定运算器所要实现功效,依据功效要求确定实现运算器模块,大致分为下面多个步骤,首先在QuartusII软件上创建BlockDiagram/Schematic File文件,实现功效电路,画出运算器电路。然后在Quartus
II软件上对该运算器程序进行编译,输入程序以后,创建VWF文件,
在文件中编辑波形,进行仿真,而且得出运算结果。



2 开发环境

2.1 Quartus II平台介绍

2.1.1 Quartus II介绍

QuartusII Altera企业综合性PLD开发软件,支持原理图、VHDL

VerilogHDL

AHDL

Altera

Hardware

Description

Language)等多个设计输入形式,内嵌自有综合器和仿真器,能够完成从设计输入到硬件配置完整PLD设计步骤。

Quartus

II

XP

Linux

Unix

使

,

除了能够使用Tcl脚本完成设计步骤外,提供了完善用户图形界面设计方法。含有运行速度快,界面统一,功效集中,易学易用等特点。

QuartusII支持AlteraIP,包含了LPM/MegaFunction宏功效模块库,使用户能够充足利用成熟模块,简化了设计复杂性、加紧了设计速度。对第三方EDA工具良好支持也使用户能够在设计步骤各个阶段使用熟悉第三方EDA工具。

另外,Quartus II 经过和DSPBuilder工具和Matlab/Simulink相结合,能够方便地实现多种DSP应用系统;支持Altera片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一个综合性开发平台。



Maxplus

II

Altera

PLD

,

因为其出色易用性而得到了广泛应用。现在Altera已经停止了对MaxplusII 更新支持,Quartus II 和之相比不仅仅是支持器件类型丰富和图形界面改变。AlteraQuartusII 中包含了很多诸如SignalTapIIChipEditorRTLViewer设计辅助工具,集成了SOPCHardCopy设计步骤,而且继承了MaxplusII 友好图形界面及简便使用方法。

AlteraQuartus II 作为一个可编程逻辑设计环境,因为其强大设计能力和直观易用接口,越来越受到数字系统设计者欢迎。

AlteraQuartusII可编程逻辑软件属于PLD开发平台。该平台支持一个工作组环境下设计要求,其中包含支持基于Internet协作设计。

Quartus

Cadence

ExemplarLogic

MentorGraphics

Synopsys

Synplicity

EDA

改善了软件LogicLock模块设计功效,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。

支持MAX7000/MAX3000等乘积项器件

2.1.2 Quartus II总体设计

1、总体设计
AlteraQuartus II 设计软件提供完整多平台设计环境,能够直接满足特定设计需要,为可编程芯片系统(SOPC)提供全方面设计环境。

QuartusII
软件含有FPGACPLD设计全部阶段处理方案如步骤框图图2.1所表示。



2.1Quartus II 设计步骤

另外,Quartus II 软件为设计步骤每个阶段提供QuartusII 图形用户界面、EDA工具界面和命令行界面。能够在整个步骤中只使用这些界面中一个,也能够在设计步骤不一样阶段使用不一样界面。

本手册其它章节具体说明设计步骤各个阶段。

2、图形用户界面设计步骤
您能够使用QuartusII 软件完成设计步骤全部阶段;它是一个全方面易用处理方案。图2.2显示QuartusII



图形用户界面在设计步骤每个阶段中所提供功效。

2.2Quartus II 图形用户界面功效

QuartusII 软件包含一个模块化编译器。编译器包含以下模块(标有星号模块表示在完整编译时,可依据设置选择使用):
分析和综合
分区合并
适配器
汇编器
标按时序分析器和TimeQuest时序分析器
设计助手
EDA 网表写入器
HardCopy 网表写入器



要将全部编译器模块作为完整编译一部分来运行,processing菜单中单击StartCompilation。也能够单独运行每个模块,Processing菜单Start子菜单中单击您期望开启命令。还能够逐步运行部分编译模块。另外,还能够经过选择CompilerTool(Tools 菜单),CompilerTool 窗口中运行该模块来分别开启编译模块。在CompilerTool 窗口中,能够打开该模块设置文件或汇报文件,还能够打开其它相关窗口。

以下步骤描述了使用QuartusII 图形用户界面基础设计步骤:

1

File

,

New

Project

Wizard,

建立新工程并指定目标器件或器件系列。

2)使用文本编辑器建立VerilogHDLVHDLAltera硬件描述语言(AHDL)设计。使用模块编辑器建立以符号表示框图,表征其它设计文件,也能够建立原理图。

3)使用MegaWizard插件管理器生成宏功效和IP功效自定义变量,在设计中将它们例化,也能够使用SOPCBuilder DSPBuilder 建立一个系统级设计。

4)利用分配编辑器、引脚计划器、Settings对话框、布局编辑器和设计分区窗口指定初始设计约束。

5(可选)进行早期时序估算,在适配之前生成时序结果早期估算。

6)利用分析和综合对设计进行综合。

7(可选)假如您设计含有分区,还没有进行完整编译,则需要经过PartitionMerge 将分区合并。

8(可选)经过仿真器为设计生成一个功效仿真网表,进行功效仿真。

9)使用适配器对设计进行布局布线。

10)使用PowerPlay功耗分析器进行功耗估算和分析。

11)使用仿真器对设计进行时序仿真。使用TimeQuest时序分析器或标按时序分析器对设计进行时序分析。

12(可选)使用物理综合、时序逼进布局、LogicLock



功效和分配编辑器纠正时序问题。

13)使用汇编器建立设计编程文件,经过编程器和Altera编程硬件对器件进行编程。

14(可选)采取SignalTapII 逻辑分析器、外部逻辑分析器、SignalProb功效或芯片编辑器对设计进行调试。

15

(

)

资源属性编辑器和更改管理器来管理工程改动。

3、设计方法和设计计划
在建立新设计时,应重视考虑QuartusII 软件提供设计方法,包含自上而下或自下而上渐进式设计步骤和基于模块设计步骤。不管是否使用EDA设计输入和综合工具,全部能够使用这些设计步骤。

1)自上而下和自下而上设计方法比较
QuartusII 软件同时支持自上而下和自下而上编译步骤。

,

一个设计人员或工程责任人在软件中对整个设计进行编译。不一样设计人员或IP提供者设计并验证设计不一样部分,工程责任人在设计实体完成后将其加入到工程中。工程责任人从整体上编译并优化顶层工程。设计中完成部分得到适配结果,当设计其它部分改动时,其性能保持不变。

自下而上设计步骤中,每个设计人员在各自工程中对其设计进行优化后,

渐进式编译提供导出和导入功效来实现这种设计方法。作为底层模块设计人员,您能够针对她们设计,导出优化后网表和一组分配(比如LogicLock区域)。然后,工程责任人将每一个设计模块作为设计分区导入到顶层工程中。在这种情况下,工程责任人必需指导底层模块设计人员,确保每一分区使用合适器件资源。

,

,

假如以前出于保持性能不变原所以采取自下而上方法,



那么现在能够采取自上而下方法来达成一样目标。这一功效之所以关键是出于两方面原因。第一,自上而下步骤要比对应自下而上步骤实施起来简单部分。比如,

,

自上而下方法为设计软件提供整个设计信息,所以,能够进行全局优化。在自下而上设计方法中,软件在编译每一个底层分区时,并不知道顶层设计其它分区情况,所以,必需进行资源均衡和时序预算。

2)自上而下渐进式编译设计步骤
自上而下渐进式编译设计步骤重新使用以前编译结果,确保只对修改过设计重新编译,所以能够保持设计性能不变,节省编译时间。自上而下渐进式编译步骤在处理其它设计分区时,能够只修改设计中关键单元布局,也能够只对设计指定部分限定布局,使编译器能够自动优化设计其它部分,从而改善了时序。

在渐进式编译步骤中,您能够为设计分区分配一个设计实体实例,然后使用时序迫近布局图和LogicLock功效为分区分配一个器件物理位置,

,

编译器将综合和适配结果保留在工程数据库中。第一次编译以后,假如对设计做深入修改,只有改动过分区需要重新编译。

完成设计修改后,您能够只进行渐进式综合,节省编译时间,也能够进行完整渐进式编译,不仅能够显著节省编译时间,而且还能够保持性能不变。在这两种情况中,Quartus II

因为渐进式编译步骤能够预防编译器跨分区边界进行优化,所以编译器不会像常规编译那样对面积和时序进行大量优化。为取得最好面积和时序结果,提议您统计设计分区输入和输出,尽可能将设计分区数量控制在合理范围内,避免跨分区边界建立过多关键路径,不要建立太小分区,如数量少于1000逻辑单元和自适应逻辑模块(ALM)分区。



2.1.3 Quartus II总体仿真

使用EDA工具进行设计仿真
QuartusII 软件EDANetlist Writer 模块生成用于功效或时序仿真VHDL

(.vho)

Verilog

(.vo),

使

EDA

仿真工具进行时序仿真时所需StandardDelay Format Output 文件(.sdo)QuartusII 软件生成StandardDelay Format 21SDF输出文件。EDANetlist Writer 将仿真输出文件放在目前工程目录下专用工具目录中。另外, Quartus II 软件经过NativeLink功效为时序仿真和EDA仿真工具提供无缝集成。NativeLink功效许可QuartusII 软件将信息传输给EDA仿真工具,并含有从QuartusII 软件中开启EDA仿真工具功效。

建立一个新工程时,或在Settings对话框(Assignments菜单)EDAToolSettings Simulation页面中,能够在NewProject Wizard(File 菜单)中选择EDA仿真工具。 Simulation页面许可您选择仿真工具并为VerilogVHDL输出文件及其对应SDF输出文件生成指定选项,和功耗分析和SignalActivity File 选项。

2.2 VHDL语言介绍

2.2.1 VHDL语言概述

甚高速集成电路硬件描述语言(Veryhigh speed interated circuit hardware descriptionlanguage,VHDL)广泛用于电路设计文档统计、设计描述逻辑综合及电路仿真等方面。和通常高级语言比较,含有以下特点: VHDL关键用于描述数字系统结构,行为,功效和接口。

,

VHDL语言形式和描述风格和句法是十分类似于通常计算机高级语言。



VHDL程序结构特点是将一项工程设计,或称设计实体(能够是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既包含实体内部功效和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,

这种将设计实体分成内外部分概念是VHDL系统设计基础点。VHDL语言对行为进行描述能力为设计大规模复杂数字系统或单片系统提供了关键确保。

VHDL语言是一个硬件描述语言,含有严谨语言结构和强大硬件描述能力。多年发展起来描述混合系统和描述单片系统AMS-VHDL,就是以VHDL语言为基础。

VHDLEDA开发环境中最关键一环,VHDL语言设计文档描述电子系统结构、行为或功效,要经过EDA编译器、综合器、优化器、布局布线器、模拟器及编程器等一系列处理,才能转化为物理实现,显然,VHDL设计文档是这一序列工作起点,含相关键意义。

VHDL

,

能够把一个大型设计分解为若干易于实现子模块。VHDL支持设计再利用,使得大型设计能够由多人或多个开发组共同工作来完成。

2.2.2 VHDL语言介绍

1、利用VHDL实现数字系统设计步骤
利用VHDL和可编程逻辑器件实现数字逻辑步骤见图2.3,该步骤揭示了设计进程中各个EDA工具输人输出情况,在整个设计过程中,

VHDL

,

并对以后处理进程加以简单引导,设计大部分工作由EDA工具完成,设计者工作关键转向高层次计划和管理和电路系统结构和功效可行性分析。



2.3VHDL语言程序设计技术体系结构
VHDL语言含有强大功效。学习语言,要从基础元素、语法、常见电路描述方法人手,逐步掌握层次设计思想。

2 VHDL基础元素
实体(entity):实体是一个设计外部界面。VHDL表示全部设计均和实体相关,实体是设计中最基础模块,实体通信点是端口,端口必需定义信号名、模式和信号类型。



结构体(architecture):全部能被仿真实体全部有一个结构体描述,结构体描述实体行为功效,包含两类语句:并行语句和次序语句。

子程序:由过程和函数组成过程能返回多个变量,函数只能有一个返回值。

程序包(package):是一个关键设计再利用机制,为了使一组数据类型、常量和子程序对多个设计实体全部成为可见,VHDL提供了该结构。

(library):用来存放预编译程序包,预定义程序包能够在其它设计中被调用,所以,库也是一个关键设计再利用机制。

运算符(operator):VHDL为结构表示式提供了算术、关系、逻辑、连接4种运算符。

进程(process):用于实现次序发生算法步骤,进程只能包含在结构体中,一个结构体能够包含多个进程语句,进程语句包含3部分:敏感表、进程语句、结束语句。

数据对象:包含信号、常量、变量、文件4类。

元件(component):是对VHDL模块说明,使它能在其它模块中被调用。

3 VHDL常见语句
VHDL语句分并行语句和次序语句,并行语句表现了硬件电路实施并发性,关键包含:布尔方程、条件赋值语句with-selcet-whenwhen-else及元件例化语句等,存在于结构体之中、进程之外。次序语句和其它高级语言类似,是对算法步骤描述,包含if-then-elsecase-when等语句,必需包含在进程内。

4、常见电路VHDL描述
利用VHDL设计数字系统,必需熟练掌握部分基础电路描述方法。

组合电路描述:如逻辑门、编码器、译码器、选择器、加法器、乘法器等;
寄存器描述掌握书写同时/异步电路方法,描述时钟上升沿、敏感表、同时复位、异步复位、同时置数等功效;
锁存器描述:掌握D型锁存器、SR型锁存器等描述方法;



输出使能描述:VHDL没有直接表示oe,所以需要掌握描述oe方法;
双向信号描述:了解双向模式内外驱动源差异,正确使用双向信号;
三态缓冲器描述:掌握利用信号实现三态缓冲器方法;
计数器描述:掌握可控二进制、BCD/减计数器描述方法;
移位寄存器描述:掌握可控算术移位/逻辑移位及左移/右移描述方法; 状态机:掌握状态机设计思想及实现方法,了解状态编码对设计面积、速度等方面影响,能够自定义状态编码,能够熟练使用一位有效编码方法; RAM/ROM/FIFO设计:能够利用VHDL基础语法设计存放阵列,能够设计简单读写驱动电路,掌握描述多时钟工作方法;

2.2.3 VHDL应用开发介绍

VHDL语言支持大规模复杂数字系统设计,其关键思想是层次化设计。VHDL语言对层次化设计支持机制为:库、程序包、可重用元件及元件例化语句。库是用来存放可编译设计单元地方,

元件介绍见前元件例化语句是高层设计调用低层元件关键手段。

层次化设计关键步骤以下:
(1)需求分析、系统分析、算法分析;(2)系统分解、逐步求精,将系统分解为易于实现子模块;(3)编程实现,对各个子模块,应用语法实现,这些实现了模块称元件(4)利用VHDL语言package机制,将元件归整在程序包。以后,通常调用该程序包设计文档,全部可直接调用其中元件;(5)顶层设计。经过元件例化,将各个元件按算法步骤数(据步骤或控制步骤)进行组装,得到最终设计。



3 基于QuartusII半加、全加器设计和实现

3.1 基于QuartusII半加器运算

3.1.1 半加器原理和真值表

是实现两个一位二进制数加法运算电路。数据输入A被加数、B加数,数据输出S和数(半加和)、进位C0

AB是半加器电路是指对两个输入数据位进行加法,输出一个结果位和进位,不相加两个数,S是半加和数,C0是进位数。

半加器真值表如表3.1所表示。表中两个输入是加数AB,输出有一个是和S,另一个是进位C0

3.1半加器真值表

输入

输出

A B

0 0

0 1

1 0

1 1

C0 S 0 0 0 1 0 1 1 0

函数逻辑表示式为:S=AB; C0=AB

3.1.2 半加器设计和实现

1、开启QuartusII9.0软件,QuartusII管理器窗口中选择菜单File→New



ProjectWizard…, 进入新建工程向导。图3.1所表示。

3.1新建工程
2、在新建工程对话框输入工程名和工程路径,本工程命名为halfadder。图3.2所表示。

3.2文件名和工程路径
3、添加已经有文件(假如没有已经有文件直接跳过next,



而且在Divice&FamilySetting选项卡中,选择芯片是MAXII系列中EPM240T100C5,3.3,3.4所表示。

3.3添加已经有文件

3.4选择芯片



4、选择仿真,综合工具(试验全部利用quartus,三项全部选None,3.5所表示。

3.5选择仿真工具5、工程建立完成(点finish,3.6所表示。



3.6工程建立完成
6、添加文件(file>new>verilogfile(VHDL),新建完成以后要先保留。以后开始编译程序。图3.7所表示。

3.7添加文件
7、对编译完成文件进行保留,并设为顶层文件(实施菜单命令Project→Set

asTop-Level Entity)。并进行语法检测(点击工具栏这个按钮

startAnalysis & synthesis))点击确定完成语法检测。图3.8所表示。



3.8语法检测
8、语法检测没有错误以后,新建一个矢量波形仿真文件VectorWaveform File。选择菜单Filet→New,New对话框中选择Verficationt→Debugging Files t→Vector Waveform File。单击OK,出现波形编辑窗口,显示一个空波形文件,3.9所表示。

3.9建立波形文件
9、设置仿真时间区域和网格大小。选择Edit→EndTime命令,



在弹出对话框中Time文本框中输入1,单位选择μs, 整个仿真域时间即设定为1μs,单击OK按钮。选择菜单Edit→GridSize,依据需要修改网格大小,这里设置1ns,单击OK按钮。图3.10,3.11所表示。

3.10设置EndTime

3.11设置GridSize
10、设置仿真观察点。在文件最左栏中双击鼠标左键,在弹出对话框中单击NodeFinder, 选择Filter列表中预综合(Pre-synthesis)或后布局布线(Post-fitting)或全部(all)类型,单击其右上方list,出现该类型全部节点。单击中间双右方向键》,全部信号出现在右方SelectedNodes栏中,确定后返回波形文件。以时钟脉冲方法对输入信号A,B进行编辑,



使之含有“00
01”“10”“114种状态,这里对AB全部选择时钟信号激励,单击“


周期分别设为20ns40ns。图3.12、图3.13、图3.14所表示。

3.12设置仿真观察点

3.13Node Finder



3.14时钟设置
11、功效仿真设置,选择Processing→SimulatorTool命令,弹出对话框图3.15所表示。在其对话框仿真模式SimulatorMode中选择功效仿真Functional,单击其右侧GenerateFunctional Simulation Netlist按钮,Quartus II将产生设计文件功效仿真网表,并设置仿真激励文件。在仿真器设置对话框仿真输入选项Simulatorinput栏目下,能够看到将要进行仿真文件halfadder.vwf。然后选择Overwritesimulation input filewith simulation results, 单击下方Start按钮,开启仿真器,实现功效仿真。功效仿真结束后单击Open按钮,返回波形文件,就会得到功效仿真波形,对照半加器逻辑真值表3.1,能够很清楚地看到和真值表逻辑完全相符合



3.15Simulation Tool对话框 12、一位半加器程序代码:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_11.ALL;
ENTITYhalfadder IS
PORT(a,b:INSTD_LOGIC;
s,c:OUT STD_LOGIC);
ENDhalfadder;
ARCHITECTUREhadder OF halfadder IS
BEGIN
s<=a XOR b;
c<=a AND b;
ENDhadder;



13、一位半加器仿真结果图3.16所表示。

3.16一位半加器功效仿真图
由图可知,第一段距离,ab输入全部是0,所以和s和进位位c全部是0,满足半加器原理,而第四段,ab输入全部是1,所以和是10,s是一位数,所以为0,1+1产生进位,所以c1;由次能够看出所得仿真波形是正确。

3.2 基于QuartusII全加器运算

3.2.1 全加器原理、真值表和原理图

1、全加器原理
全加器是实现两个一位二进制数及低位来进位数相加,求得和及向高位进位逻辑电路。所以全加器有三个输入端(A,B, Ci)和两个输出端(S,C0)。其中A,B, Ci为三个加数,Ci为来自低位进位,S为相加“和”,C0表示加运算是否产生进位,高电平有效。

用门电路实现两个二进制数相加并求出和组合线路,称为一位全加器。一位全加器能够处理低位进位,并输出本位加法进位。多个一位全加器进行级联能够得到多位全加器。

2、全加器真值表如表3.2所表示。

3.2全加器真值表

输入

输出


A

B

Ci

0

0

0

0

0

1

0

1

0


C0 S 0 0 0 1 0 1




0

1

1

1

0

0

1

0

1

1

1

0

1

1

1


1
0
1
1
1

0
1
0
0
1


由全加器真值表可得全加器(FA)逻辑表示式为:S=ABCi
C0=AB+BCi +A Ci
3、全加器原理图图3.17所表示。



3.17全加器步骤图

3.2.2全加器设计和实现

1、一位全加器建立过程能够参见半加器建立过程。 2、一位全加器程序代码:
LIBRARYIEEE;



USEIEEE.STD_LOGIC_11.ALL;
ENTITYfadd IS
PORT(a,b,ci:INSTD_LOGIC;
sum,co:OUT STD_LOGIC);
ENDfadd;
ARCHITECTUREfad OF fadd IS
BEGIN
sum<=(aXOR b) XOR ci;
co<=(aAND b) or (a AND ci) OR (b and ci); END ARCHITECTURE fad;
3、一位全加器仿真结果图3.18所表示。

3.18一位全加器功效仿真图
由图能够看出,第二段abci分别输入为100,所以s1,高位进位位c00;由第四段abci分别输入为110,所以s0,而三个数相加产生进位位,所以c01;满足全加器真值表提供结果,所以仿真正确。



4 基于QuartusII乘法、除法器设计和实现

4.1 基于QuartusII乘法器运算

4.1.1 乘法器原理和步骤图

1、乘法器原理
乘法器是一个完成两个互不相关模拟信号相乘作用电子器件。

它能够将两个二进制数相乘。它是由更基础加法器组成。

乘法器能够经过使用一系列计算机算数技术来实现数。

大多数技术包含了对部分积计算(其过程和我们使用竖式手工计算多位十进制数乘法十分类似),然后将这些部分积相加起来。这一过程和小学生进行多位十进制数乘法过程类似,不过在这里依据二进制情况进行了修改。

乘法器不仅作为乘法、除法、乘方和开方等模拟运算关键基础单元,而且还广泛用于电子通信系统作为调制、解调、混频、鉴相和自动增益控制;另外还可用于滤波、波形形成和频率控制等场所,所以是一个用途广泛功效电路。

一个理想通用乘法器,不应该对任何一个输入信号极性加以,也就是说,应该含有能完成四个象限运算功效电路。

模拟乘法器是对两个模拟信号(电压或电流)实现相乘功效有源非线性器件。

,

即输出信号和两输入信号相乘积成正比。它有两个输入端口,XY输入端口。乘法器两个输入信号极性不一样,其输出信号极性也不一样。假如用XY坐标平面表示,

,

即四个工作象限,若信号均限定为某一极性电压时才能正常工作,



该乘法器称为单象限乘法器;若信号中一个能适应正、负两种极性电压,而另一个只能适应单极性电压,则为二象限乘法器;若两个输入信号能适应四种极性组合,称为四象限乘法器。集成模拟乘法器常见产品有BG314F1595F1596MC1495等。硬件乘法器,其基础就是加法器结构,它已经是现代计算机中必不可少一部分。乘法器模型就是基于移位和相加算法。在该算法中,乘法器中每一个比特位全部会产生一个局部乘积。第一个局部乘积由乘法器LSB产生,第二个乘积由乘法器第二位产生,以这类推。假如对应乘数比特位是1,那么局部乘积就是被乘数值,假如对应乘数比特位是0,那么局部乘积全为0。每次局部乘积全部向左移动一位。

乘法器能够用更普遍方法来表示。每个输入,局部乘积数,和结果全部被给予了一个逻辑名称(如A1A2B1B2,而这些名称在电路原理图中就作为了信号名称。在原理图乘法例子中比较信号名称,就能够找到乘法电路行为特征。

在乘法器电路中,乘数中每一位全部要和被乘数每一位相和,

这些局部乘积要馈入到全加器阵列中(适宜时候也能够用半加器),同时加法器向左移位并表示出乘法结果。最终得到乘积项在CLA电路中相加。注意,一些全加器电路会将信号带入到进位输入端(用于替换邻近位进位)。这就是一个全加器电路应用;全加器将其输入端任何三个比特相加。

伴随乘数和被乘数位数增加,乘法器电路中加法器位树也要对应增加。经过研究CLA电路特征,也能够在乘法器中开发出愈加快加法阵列。

28位二进制乘法器设计原理
该乘法器是有由8位加法器组成以时序方法设计8位乘法器,采取逐项移位相加方法来实现相乘。用乘数各位数码,从低位开始依次和被乘数相乘,每相乘一次得到积称为部分积,



将第一次(由乘数最低位和被乘数相乘)得到部分积右移一位并和第二次得到部分积相加,将加得和右移一位再和第三次得到部分积相加,再将相加结果右移一位和第四次得到部分积相加。

:

被乘数(M7M6M5M4M3M2M1M0)和乘数(N7N6N5N4N3N2N1N0)分别为1101010110010011,其计算过程以下图(a
下面分解8位乘法器层次结构,分为以下4个模块:
右移寄存器模块:这是一个8位右移寄存器,可将乘法运算中被乘数加载于其中,同时进行乘法运算移位操作。

加法器模块:这是一个8位加法器,进行操作数加法运算。

1位乘法器模块:完成8位和1位乘法运算。

锁存器模块:这是一个16位锁存器,同时也是一个右移寄存器,在时钟信号控制下完成输入数值锁存和移位。

根据上述算法,能够得到下图所表示之框图和简单步骤图。图中8位移位寄存器reg_8存放乘数a,a最低位开始,每次从reg_8中移出一位,送至1×8位乘法器multi_1,同时将被乘数加至multi_1,进行乘法运算,运算结果再送至8位加法器adder_8,同时取出16位移位寄存器reg_168位和之进行相加,相加后结果即部分积存入reg_16,进行移位后并保留。这么经过8次对乘数a移位操作,所以部分积已全加至reg_16,此时锁存器reg_16存放值即所要求积。

3、八位二进制移位乘法器步骤图图4.1所表示。



4.1八位二进制移位乘法器步骤图

4.1.2 四位二进制加法器模块

1、四位二进制加法器步骤图图4.2所表示。



4.2四位二进制加法器步骤图 2、四位二进制加法器程序代码:
libraryieee;
useieee.std_logic_11.all;
useieee.std_logic_unsigned.all;
entityadd4b is
port(cin:in std_logic;
a,b:in std_logic_vector(3 downto 0);
s:out std_logic_vector(3 downto 0);



cout:out std_logic);
end;
architectureone of add4b is
signalsint,aa,bb:std_logic_vector(4 downto 0);
begin
aa<='0' & a;
bb<='0' & b;
sint<=aa+bb+cin;
s<=sint(3 downto 0);
cout<=sint(4);
end;
3、四位二进制加法器仿真结果图4.3所表示

4.3四位二进制加法器仿真结果
由图可知,第一个输入ab分别为10010000,ci0,所以相加后s10019,高级进位为0;又另一组数312ab分别为00111100,ci1,所以和s10000,不过因为是四位二进制数,保留四位s00000,s溢出,产生进位位1;所以所得仿真是正确。

4.1.3 八位二进制加法器模块

1、八位二进制加法器步骤图图4.4所表示。



4.4八位二进制加法器步骤图 2、八位二进制加法器程序代码:
libraryieee; use ieee.std_logic_11.all;
useieee.std_logic_unsigned.all;
entityadder8b is
port(cin:in std_logic;
a,b:in std_logic_vector(7 downto 0);



s:out std_logic_vector(7 downto 0);
cout:out std_logic);
end;
architectureone of adder8b is
componentadd4b --对要调用元件add4b端口进行说明
port(cin:in std_logic;
a,b:in std_logic_vector(3 downto 0);
s:out std_logic_vector(3 downto 0);
cout:out std_logic);
endcomponent;
signalcarryout: std_logic;
begin
u1:add4b port map(cin,a(3 downto 0),b(3 downto 0),s(3 downto0),carryout); u2:add4b port map(carryout,a(7 downto 4),b(7 downto 4),s(7 downto4),cout); end;
3、八位二进制加法器仿真结果图4.5所表示

4.5八位二进制加法器仿真结果
图最终一组数所表示,ab输入全部是25511111111,低级进位ci1,sa+b+ci,s为八位二进制数,所以为11111111255,s溢出,所以高级进位位为1;所以仿真结果是正确。



4.1.4 一位乘法器模块

1、一位乘法器原理
利用循环语句完成8位二进制数和1位二进制乘法运算,8位二进制数b从最低位到最高位和1位二进制a分别做和运算,最终将结果依次送到outa输出。即当a1,outa输出为b;a0,outa输出全为零。

2、一位乘法器步骤图图4.6所表示。

4.6一位乘法器步骤图 3、一位乘法器程序代码:
libraryieee;
useieee.std_logic_11.all;



useieee.std_logic_unsigned.all;
entityandarith is
port(abin:in std_logic;
din:in std_logic_vector(7 downto 0);
dout:out std_logic_vector(7 downto 0)); end;
architectureone of andarith is
begin
process(abin,din)
begin
for i in 0 to 7 loop
dout(i)<=din(i) and abin;
end loop;
end process;
end;
4、一位乘法器仿真结果图4.7所表示。

4.7一位乘法器仿真结果
图可知,abin输入为0,不管din输入为多少,dout输出全部是0;abin输入为1,输出dout=din;所以仿真结果是正确。

4.1.5 8位右移寄存器模块

18位右移寄存器原理
8位移位寄存器是在时钟(r8_clk'eventand r8_clk='1')信号作用下,r8_clr='1',8位乘数加载进入;而当r8_clr='0',对数据进行移位操作,



同时定义一个信号reg8用来装载新数据及移位后操作数,完成这些操作后,寄存器最低位r8_in(0)传送给r8_out输出。

28位右移寄存器其程序代码以下:
libraryieee;
useieee.std_logic_11.all;
useieee.std_logic_unsigned.all;
entitysreg8b is
port(clk,load:in std_logic;
din:in std_logic_vector(7 downto 0);
qb:out std_logic);
end;
architectureone of sreg8b is
signalreg8:std_logic_vector(7 downto 0);
begin
process(clk,load)
begin
if clk'event and clk='1' then
if load='1' then reg8<=din;
else reg8(6 downto 0)<=reg8(7 downto 1); end if;
end if;
end process;
qb<=reg8(0);
end;
38位右移寄存器仿真结果图4.8所表示。



4.88位右移寄存器仿真结果

4.1.6 乘法器其它模块

1、乘法运算控制器
乘法运算控制器在这里作用是使在它上输入什么数据,就会输出显示所输入数据。

其程序代码以下:
libraryieee;
useieee.std_logic_11.all;
useieee.std_logic_unsigned.all;
entityarictl is
port(clk,start:in std_logic;
clkout,rstall,ariend:out std_logic);
end;
architectureone of arictl is
signalcnt4b:std_logic_vector(3 downto 0);
begin
rstall<=start;
process(clk,start)



begin
if start='1' then cnt4b<="0000";
elsif clk'event and clk='1' then
if cnt4b<8 then --小于8则计数,等于8则表明乘法运算已经结束 cnt4b<=cnt4b+1;
end if;
endif;
endprocess;
process(clk,cnt4b,start)
begin
if start='0' then
if cnt4b<8 then
clkout<=clk; ariend<='0';
else clkout<='0'; ariend<='1';
end if;
else clkout<=clk; ariend<='0';
end if;
end process;
end;

216位锁存器
当清零信号(reg16_clr='1')到来时,定义信号变量sel清零;不然在时钟信号reg16_clk上升沿到来时,sel8位进行移位操作,同时将8位数据输入reg16_in锁存到sel8,最终赋值给reg16_out输出。输出前八个数据。

其程序代码以下:
libraryieee;



useieee.std_logic_11.all;
useieee.std_logic_unsigned.all;
entityreg16b is
port(clk,clr:in std_logic;
d:in std_logic_vector(8 downto 0);
q:out std_logic_vector(15 downto 0));
end;
architectureone of reg16b is
signalr16s:std_logic_vector(15 downto 0);
begin
process(clk,clr)
begin
if clr='1' then r16s<="0000";
elsif clk'event and clk='1' then
r16s(6 downto 0)<=r16s(7 downto 1);
r16s(15 downto 7)<=d;
end if;
endprocess;
q<=r16s;
end;
38位乘法器顶层设计
8位乘法器顶层设计是当start上升沿到来,将乘数a锁存到reg_8,同时将16位移位寄存器reg_16清零,然后伴随时钟clk上升沿到来,reg_8中乘数进行移位操作,最低位在前,由低到高逐位输出。1位乘法器中进行和8位被乘数相乘运算,并和锁存在16位寄存器reg_16中高8位进行相加,其和(包含进位)在下一个时钟上升沿到来时锁存到16位寄存器中。如此进行直到第八个时钟上升沿到来时,reg_16 输出即为所求乘积。



其程序代码以下所表示:
libraryieee;
useieee.std_logic_11.all;
useieee.std_logic_unsigned.all;
entitymult8x8 is
port(clk:in std_logic;
start:instd_logic;
a,b:in std_logic_vector(7 downto 0);
dout:out std_logic_vector(15 downto 0);
ariend:out std_logic);
end;
architecturestruc of mult8x8 is
componentadder8b is
port(cin:in std_logic;
a,b:in std_logic_vector(7 downto 0);
s:out std_logic_vector(7 downto 0);
cout:out std_logic);
endcomponent;
componentandarith is
port(abin:in std_logic;
din:in std_logic_vector(7 downto 0);
dout:out std_logic_vector(7 downto 0));
endcomponent;
componentarictl is
port(clk,start:in std_logic;
clkout,rstall,ariend:out std_logic);
endcomponent;



componentreg16b is
port(clk,clr:in std_logic;
d:in std_logic_vector(8 downto 0);
q:out std_logic_vector(15 downto 0));
endcomponent;
componentsreg8b is
port(clk,load:in std_logic;
din:in std_logic_vector(7 downto 0);
qb:out std_logic);
endcomponent;
signalgndint :std_logic;
signalintclk :std_logic;
signalrstall :std_logic;
signalqb :std_logic;
signalandsd :std_logic_vector(7 downto 0);
signal dtbin :std_logic_vector(8 downto 0);
signal dtbout :std_logic_vector(15 downto 0);
begin
dout<=dtbout; gndint<='0';
u1:arictlport map( clk,start,intclk,rstall,ariend);
u2:sreg8bport map(intclk,rstall,b,qb);
u3:andarithport map(qb,a,andsd);
u4:adder8bport map(gndint,dtbout(15 downto 8),andsd,dtbin(7 downto0),dtbin(8)); u5:reg16b port map(intclk,rstall,dtbin,dtbout);
end;
3、乘法器仿真结果图4.9所表示。



4.9乘法器功效仿真图
由图可知输入两个数89,8×9最终结果为00000000 0100 100072,所以仿真结果是正确。

4.2 基于QuartusII除法器运算

4.2.1 除法器原理和步骤图

1、除法器原理

,

当被除数减去除数小于0时候就停止进行,则之前减次数就是此次运算商,最终一次计算所剩下数就是此次运算商。
2、除法器步骤图图4.10所表示。



4.10除法器步骤图

4.2.2 除法器设计和实现

1、除法器建立过程能够参见半加器建立过程。

2、除法器程序代码:
libraryieee;
useieee.std_logic_11.all;



useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitychufaqi is
port(a,b:in integer range 15 downto 0;
c,d:out integer range 15 downto 0);
endentity chufaqi;
architecturert of chufaqi is
begin
process(a,b)
variable e,f,g:integer range 16 downto 0;
begin
if (b=0) then c <= 15;d <= 15;
else f:=a;g:=b; e:=0; for i in 15 downto 0 loop if (f>=g) then
f:=f-g;
e:=e+1;
else
exit;
end if;
end loop;
c<=e;d<=f;
endif;
endprocess;
endrt;
3、除法器仿真结果图4.11所表示。



4.11除法器功效仿真图

由图能够看出,第一段14/3结果为4,余数为2;如第二段,

当被除数4小于除数10,商为0,余数为4;所得仿真完全满足除法法则,

所以所得仿真结果是正确。



结论

此次毕业设计课题是“基于QuartusⅡ运算器设计和实现”。该课题经过开发环境学习和应用,实现了软件仿真验证。经过该毕业设计,完成了以下内容。

1)依据原理对多种运算器做了具体分析;
2)把运算器分成半加器、全加器、乘法器和除法器分别进行实现,完成了一位半加器和一位全加器实现;在乘法器中,把乘法器分成了5个模块,即用四位二进制加法器设计八位二进制加法器模块、一位乘法器模块、乘法运算控制器模块、16位锁存器模块、8位右移寄存器模块,并分别对这些模块进行实现,然后完成了八位二进制乘法器;最终对除法器进行了实现。然后在QuartusⅡ软件中进行仿真,并对仿真结果进行分析、比较,最终得出结论,所得仿真结果全部是正确。

3)经过这次毕业设计,能够深入培养对运算器了解,运算器全部是在半加器基础上实现。经过分析仿真结果,了解系统性能。

另外本设计尚存在不足,如因为时间紧促,未能在硬件上实现。实现多种运算器方法单一等问题。以后能够将设计完成工程下载到CPLD,完成硬件实现。



致谢

导师渊博知识和严谨科研作风给我留下了深刻印象,在设计整个过程中,我碰到了很多问题导师全部努力为我解答。即使我对专业知识依旧很欠缺,不过导师指导和督促让我所学颇多。

现在毕业设计已经靠近了尾声,在这多个月时间里,我学到了更多知识。

,

在关键部分设计中给我技术上指导并立即纠正我存在部分错误,同时,也给我很大自由发挥空间。让我把所学知识和实践愈加好结合。同时,还要感谢在这段时间帮助我同学们,她们认真、扎实学习态度深深地感染了我。

当然也要感谢在大学四年中曾经教导和帮助过我各位老师,正是您们孜孜不倦教导为我打下了良好基础,使我毕业设计能够顺利完成。



参考文件

[1]罗朝霞,高书莉CPLD/FPGA设计及应用北京人民邮电出版社,[2]卢毅,赖杰VHDL和数字电路设计北京科学出版社,
[3]曹志刚,钱亚生现代通信原理.北京清华大学出版社,1992[4] 刘皖,何道君,谭明FPGA设计和应用.北京清华大学出版社,

[5]

Stephen

Brown,

Zvonko

Vranesic数字逻辑基础和VHDL设计.北京清华大学出版社,
[6]潘松VHDL实用教程.西安电子科技大学出版社,
[7]徐向民数字系统设计及VHDL实践.北京机械工业出版社,
[8]褚振勇,翁木云FPGA设计及应用.西安电子科技大学出版社,
[9]侯伯亨VHDL硬件描述语言和数字逻设计.西安电子科技大学出版社,



[10]王毅平,张振荣VHDL编程和仿真.人民邮电出版社,

[11]

开发和应用.西安电子科技大学出版社,

附录A 英语原文

UsingHierarchy in VHDL Design

Introduction

Hierarchicaldesign methodology has been commonly use for quite some time bysystem designers and software developers. There are two primaryadvantages to using this methodology. First, it allows commonly-usedbuilding blocks to be created separately and saved for later usewithout having tredesign or reverify them. Second, it allows for morereadable design files by keeping the top-level design file as a



simpleintegration of smaller building blocks, either user-defined or from avendor-supplied library. In system design, these building blocksnormally take the form of schematic symbols instantiated into aschematic drawing, while in software they are functions or proceduresthat are called from the main program.

VHDLincludes a set of features specifically designed to make hierarchicaldesign both simple and powerful. This note will first describe thesefeatures and then walk through a simpl example of how they might beused. It assumes that the reader is familiar with how to create aVHDL design unit consisting of an entity-architecture pair.

KeyConcepts

Inorder to construct a hierarchical design in VHDL, the designer mustunderstand the concepts of components, packages and libraries.

Component- A component is a VHDL design unit that may be instantiated in otherVHDL design units. Before it can be instantiated, it must be declaredusing the COMPONENT declaration which specifies the name of thecomponent and lists its local signal names.

Componentsare simply wrappers for entities.Previously, components had to beused to instantiate an entity, though since VHDL 1993, we can usedirect entity instantiation as covered previously.A componentdeclaration looks identical to an entity declaration.

componententity_name is
port(port_name1: in | out type;
port_name2: in | out type;
port_name2: in | out type);
endcomponent entity_name;
Thenames of ports in a component need not match an entity, can be usedfor



relabelling.

Componentsare instantiated like entities but without the entity keyword.

Package- A package is a collection of VHDL declarations that can be used byother VHDL descriptions. For the purpose of creating hierarchicaldesigns, a package consists of one or more components. However, apackage may also include other types of declarations.

Inlarge collaborative projects, there is often a need to work off somecommon definitions..A package allows us to group a set of relateddeclaration statements for use in many designs.

packagepackage_name is
declarationstatements
endpackage package_name;
Wecan declare constants, types, subtypes, procedures and functionswithin a package.For types and constants, the package declaration issufficient, for functions and procedures, an accompanying packagebody that defines them must be present.The package declarationdeclares the elements, it doesn't implement them.

Library- A library is a logical storage facility for design units.Before acomponent can be instantiated in a higher-level design unit, itspackage must be compiled into a library that is visible to thatdesign unit, usually the current work library.

Alibrary is simply where units are stored.These units can be packagesor analysed designs (effectively designs that have beencompiled).Libraries are just a way of grouping related unitstogether.The IEEE library includes all the packages related to theIEEE standard.The default working library, into which all analyseddesign units are stored is called work.Libraries generally map tospecified directories in the operating system, with standardsubdirectories and files beneath it, representing the library units.



SimpleExample

Considerthe following example. A designer discovers that for a specific typeof circuit design he commonly needs an unusual type of counter.(!°Commonly,!± in this reference, mean that this counter is likelyto be used either multiple times in a particular design or acrossmultiple designs. Both are cases where hierarchical design simplifiesthings.) This counter is a simple four-bit counter, but it mustoutput a terminal count indication (tc) and roll over to zero when itreaches 1110 rather than 1111.

Adesign file that would accomplish this is shown in program A. (Thereader should understand the contents of the entity-architecturepair. they will not be discussed further.)
Program A: Counter with Terminal Count and Rollover Selection
packagecnt_pkg is
componentcount15 port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
endcnt_pkg;
usework.bit_arith.all;
entitycount15 is port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcount15;
architectureone of count15 is



begin
process(cnt) begin
ifcnt="1110" then
tc<='1';
else
tc<='0';
endif;
endprocess;
process(clk,reset)begin
ifreset='1' then
cnt<="0000";
elsif(clk'event and clk='1') then
ifcnt="1110" and enable='1' then
cnt<="0000";
elsifenable='1' then
cnt<=cnt+1;
else
cnt<=cnt;
endif;
endif;
endprocess;
endone;
Inorder to use this counter in other VHDL design units, it is declaredas a component within a package at the top of the file.The componentdeclaration simply names the design unit and lists its signal names.When this file is compiled, the package is placed into the currentlibrary and the component it contains may then be instantiated intoother designs compiled into that library. If this were a standalone



design,the entire package declaration could be omitted.

Now,suppose this design consists of two of these counters with theiroutputs multiplexed.

Wecan then instantiate our counter twice as in the design in Program B.

ProgramB: Instantiation of Counter from Appendix A
usework.cnt_pkg.all;
entitymuxcntr is port(
clk,enablea, enableb, reset, sel:in bit;
cnt:outbit_vector (3 downto 0);
tca,tcb:out bit);
endmuxcntr;
architectureone of muxcntr is
signalmuxina, muxinb:bit_vector(3 downto 0);
begin
cntra:count15port map(clk, enablea, reset, muxina, tca);
cntrb:count15port map(clk, enableb, reset, muxinb, tcb);
process(sel) begin
ifsel='1' then
cnt<=muxina;
else
cnt<=muxinb;
endif;
endprocess;
endone;
Allthat is necessary is the statement:use work.cnt_pkg.all;At the top ofthe file, which makes any components in the cnt_pkg visible withinthe current design unit, as long as the package was compiled into thework library. The counters are then



instantiatedby giving them unique labels and listing the signals connected to theport map in the same order as the component declaration.

Forfurther illustration, assume our complete design includes two typesof counters, one that rolls over at 1110 and one that rolls over at1011

Wecould simply repeat the above procedure and create another designfile with another component and package and then use both of thesepackages in our top-level design file.

However,it may be easier to keep track of things if we keep similar counterdesigns together in a single package as in Program C.

ProgramC: Multiple Counters in a Single Package package cnt_pkg is
componentcount15 port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
componentcount12 port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
endcnt_pkg;
usework.bit_arith.all;
entitycount15 is port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);



endcount15;
architectureone of count15 is
begin
process(cnt) begin
ifcnt="1110" then
tc<='1';
else
tc<='0';
endif;
endprocess;
process(clk,reset)begin
ifreset='1' then
cnt<="0000";
elsif(clk'event and clk='1') then
ifcnt="1110" and enable='1' then
cnt<="0000";
elsifenable='1' then
cnt<=cnt+1;
else
cnt<=cnt;
endif;
endif;
Thisfile contains both entity-architecture pairs and two components in asingle package. As before, when this file is compiled, the package isadded to the current library and its components are made visible witha single-use clause as in Program D.

ProgramD:
usework.cnt_pkg.all;



entitymuxcntr is port(
clk,enablea, enableb, enablec, enabled, reset:in bit;
sel:inbit_vector (1 downto 0);
cnt:outbit_vector (3 downto 0);
tca,tcb, tcc, tcd:out bit);
endmuxcntr;
architectureone of muxcntr is
signalmuxina, muxinb, muxinc, muxind:bit_vector(3 downto 0);
begin
cntra:count15port map(clk, enablea, reset, muxina, tca);
cntrb:count15port map(clk, enableb, reset, muxinb, tcb);
cntrc:count12port map(clk, enablec, reset, muxinc, tcc);
cntrd:count12port map(clk, enabled, reset, muxind, tcd);
process(sel)begin
ifsel="11" then
cnt<=muxina;
elsifsel="10" then
cnt<=muxinb;
elsifsel="01" then
cnt<=muxinc;
else
cnt<=muxind;
endif;
endprocess;
endone;
Whenmultiple components that have the same basic architecture but differin one or more parameters are needed (such as the two counters in theprevious example)



VHDLgenerics allow a more compact approach. Generics are a means by whichparameters may be passed to a component when it is instantiatedallowing a configurable component.

InProgram E a component is created that is the same basic counter, butallows the terminal count to be configured using a generic. Insteadof hard-coding this value, a bit_vector is used in the architecture.This bit_vector is then declared in the entity and componentdeclarations. Generics may also be of other types such as integersand a component may contain multiple generics (although our examplecontains only one).

ProgramE:
packagecnt_pkg is
componentcountg
generic(stop:bit_vector(3 downto 0):="1111"); port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
endcnt_pkg;
usework.bit_arith.all;
entitycountg is
generic(stop:bit_vector(3 downto 0):="1111"); port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcountg;
architectureone of countg is



begin
process(cnt) begin
ifcnt=stop then
tc<='1';
else
tc<='0';
endif;
endprocess;
process(clk,reset)begin
ifreset='1' then
cnt<="0000";
elsif(clk'event and clk='1') then
ifcnt=stop and enable='1' then
cnt<="0000";
elsifenable='1' then
cnt<=cnt+1;
else
cnt<=cnt;
endif;
endif;
endprocess;
endone;
ProgramF is the top-level design unit of the same design from Figure 2, butthis time it is using the component with the generic rather than twodifferent components. When the component is instantiated, it isconfigured by passing it the specific bit_vector in the generic map.

ProgramF:



usework.cnt_pkg.all;
entitymuxcntr is port(
clk,enablea, enableb, enablec, enabled, reset:in bit;
sel:inbit_vector (1 downto 0);
cnt:outbit_vector (3 downto 0);
tca,tcb, tcc, tcd:out bit);
endmuxcntr;
architectureone of muxcntr is
signalmuxina, muxinb, muxinc, muxind:bit_vector(3 downto 0);
begin
cntra:countggeneric map("1110") port map(clk, enablea, reset, muxina,tca); cntrb:countg generic map("1110") port map(clk,enableb, reset, muxinb, tcb); cntrc:countg generic map("1011")port map(clk, enablec, reset, muxinc, tcc); cntrd:countg genericmap("1011") port map(clk, enabled, reset, muxind, tcd);process (sel) begin
ifsel="11" then
cnt<=muxina;
elsifsel="10" then
cnt<=muxinb;
elsifsel="01" then
cnt<=muxinc;
else
cnt<=muxind;
endif;
endprocess;
endone;



附录B 汉语翻译

VHDL语言层次化设计

绪论
相当长一段时间内,
分层设计方法已经为系统设计人员和程序开发人员所普遍使用。

使用这种方法有两个关键优势。首先,
它许可使用频率比较高已经建立好模块被去创建从而供以后使用,而无须重新设计和验证。其次,它能保持部分顶层设计文件,
这些文件又由更小模块为基础组合而成,不管是用户自己定义模块,还是供给商所提供库文件,所以它所提供这种设计方法更含有可读性。在系统设计中,这些建立好模块通常以图形符号形式再例化成原理图,而在软件中她们就成为主程序所调用函数或进程。

VHDL包含一套尤其设计功效,使分层设计既简单和强大。

本为首先描述这些功效,然后经过一个简单例子来说明,前提是读者读者熟悉怎样创建一个VHDL设计单元,即由实体和结构体组成模块。

关键概念
为了用VHDL语言去实现一个分层设计,设计人员必需了解这些概念,即元件、包和库。



元件—一个元件是一个VHDL设计单位,可在其它VHDL模块中被例化。

在被例化之前,必需用COMPONENT语句申明其中指定元件名称,并列出内部信号名称。

元件是对实体简单封装,之前元件是被用来例化一个实体,然而自1993年以来,我们能够直接利用一个实体例化。

一个元件申明和一个实体申明很相同。

端口(port_name1: 输入|输出类型;
port_name2: 输入|输出类型;
port_name2: 输入|输出类型);
结束部分entity_name;
在一个元件内,端口名称不需要和实体匹配,
它们能够在重新标识过程中被使用。元件例化跟实体一样,但不需要实体关键词。

包—包是一个VHDL申明集合,可用于其它VHDL描述。为了构建分层设计,一个包由一个或多个元件组合而成。另外,
一个软件包可能还包含其它类型申明。

在大型合作工程中,往往需要部分共同定义,
包就能够使我们将这些相互关联申明构建集合在一起,以供在很多设计中使用。

package_name
申明语句
结束部分package_name;
我们能够在一个包内申明常数、类型、图表类型、进程和函数。

对于类型和常量,包内申明是不够,对于函数和进程,
对应包体对她们定义必需是目前,包申明只申明这些元素,但不实施它们。

库—库是是一个为设计单元提供逻辑储存设施,在一个元件被例化到一个更高层次设计之前,元件必需先被编译到一个库,显然,设计单元通常是目前工作库。



库是简单存放单元,这些单元可被封装和分析(有效设计已经被编译),

,

IEEE

IEEE

,

全部库内分析设计单元分存放为一个作业,库通常标示到指定目录中作业系统,和标准子目录和文件下方,代表库单元。

简单实例
就下面例子来讲。设计人员会发觉,对于特定类型电路设计,
她通常需要设计一个特定计数器(通常,在此范围,
这个计数器意味着数次用于一个特定设计或多个设计中,从这个意义上来说,分层设计简化了工作)这是一个简单计数器,但它必需输出一个终端计数显示,而且在计数到1110时归零而不是递增到1111

设计文件完成参见程序A(读者应该了解由结构体和实体组成元件内容,不做更深入讨论)。

程序A: 实现终端计数和循环计数器
packagecnt_pkg is
componentcount15 port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
endcnt_pkg;
usework.bit_arith.all;
entitycount15 is port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcount15;



architectureone of count15 is
begin
process(cnt) begin
ifcnt="1110" then
tc<='1';
else
tc<='0';
endif;
endprocess;
process(clk,reset)begin
ifreset='1' then
cnt<="0000";
elsif(clk'event and clk='1') then
ifcnt="1110" and enable='1' then
cnt<="0000";
elsifenable='1' then
cnt<=cnt+1;
else
cnt<=cnt;
endif;
endif;
endprocess;
endone;
为了使这个计数器能在其它VHDL设计单元中被使用,能够在一个包内顶层文件对这个计数器作为一个元件申明。

这个元件申明只是简单申明元件名称和列出元件内部信号名称。当这个文件被编译时候,包就被存放到目前工作库,



而其中包含元件能够在例化到其它设计当中并存放到其工作库中。假如这是一个设计,那么整个包申明能够省略。

现在,假设这个设计包含两个这么计数器,它们复合到一个输出上。然后我们就能够在程序B设计当中对该计数器例化两次。

程序B:对程序A中计数器例化
usework.cnt_pkg.all;
entitymuxcntr is port(
clk,enablea, enableb, reset, sel:in bit;
cnt:outbit_vector (3 downto 0);
tca,tcb:out bit);
endmuxcntr;
architectureone of muxcntr is
signalmuxina, muxinb:bit_vector(3 downto 0);
begin
cntra:count15port map(clk, enablea, reset, muxina, tca);
cntrb:count15port map(clk, enableb, reset, muxinb, tcb);
process(sel) begin
ifsel='1' then
cnt<=muxina;
else
cnt<=muxinb;
endif;
endprocess;
endone;
全部申明中全部必需用到:work.cnt_pkg.all ;在顶层文件中,对于目前设计单元,它使得任何cnt_pkg中元件全部是可见,只要包编译到目前工作库中,然后对计数器进行例化,



经过给定特有标号名和列出信号名,其中,Port
map语句中实际信号书写次序和component语句中端口说明中信号书写次序保持一致。

我们还能够创建过工器作为一个单独元件,并将之例化,不过它对于if-else语句结构使用更为简单。

为了进行深入说明,假设我们完整设计包含两种类型计数器,一个是在计数器计数到1110时归零,另一个是在计数到1011时归零。

我们可简单反复上述程序,并使用另一个元件和包创建另一个设计文件,然后在顶层设计文件中使用这两个包。

然而,假如我们将类似计数器集合在一个包里,它可能有着更轻易设计思绪,它可能有更轻易设计步骤,如程序C所表示。

程序C:将多个计数器封装到一个包里
packagecnt_pkg is
componentcount15 port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
componentcount12 port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
endcnt_pkg;
usework.bit_arith.all;
entitycount15 is port(
clk,enable, reset:in bit;



cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcount15;
architectureone of count15 is
begin
process(cnt) begin
ifcnt="1110" then
tc<='1';
else
tc<='0';
endif;
endprocess;
process(clk,reset)begin
ifreset='1' then
cnt<="0000";
elsif(clk'event and clk='1') then
ifcnt="1110" and enable='1' then
cnt<="0000";
elsifenable='1' then
cnt<=cnt+1;
else
cnt<=cnt;
endif;
endif;



这个文件包含实体和结构体,和一个包中两个元件,如上所述,当这个文件编译时候,包便添加到目前工作库中,它元件使用一个语句,是可见,如程序D所表示。

程序D:
usework.cnt_pkg.all;
entitymuxcntr is port(
clk,enablea, enableb, enablec, enabled, reset:in bit;
sel:inbit_vector (1 downto 0);
cnt:outbit_vector (3 downto 0);
tca,tcb, tcc, tcd:out bit);
endmuxcntr;
architectureone of muxcntr is
signalmuxina, muxinb, muxinc, muxind:bit_vector(3 downto 0); begin
cntra:count15port map(clk, enablea, reset, muxina, tca);
cntrb:count15port map(clk, enableb, reset, muxinb, tcb);
cntrc:count12port map(clk, enablec, reset, muxinc, tcc);
cntrd:count12port map(clk, enabled, reset, muxind, tcd);
process(sel)begin
ifsel="11" then
cnt<=muxina;
elsifsel="10" then
cnt<=muxinb;
elsifsel="01" then
cnt<=muxinc;
else
cnt<=muxind;



endif;
endprocess;
endone;
当多个元件含有相同基础构架,
只是有一个或多个参数不一样时(比如前面例子中两个计数器),就需要VHDL泛型有集成度更高端口。经过例化方法,
参数能够从已经申明元件传输到目前工作元件。

程序E中被创建元件是一个相同最基础计数器,
不过它要让终端计数必需使用经过。一个逻辑位矢量是在结构体中被使用,而不是硬编码这个值。然后这个逻辑位矢量在实体和元件结构体中申明,泛型也可能是其它类型比如说整数,
一个元件能够包含多个泛型(我们所给出例子中只有一个)。

程序E:
packagecnt_pkg is
componentcountg
generic(stop:bit_vector(3 downto 0):="1111"); port(
clk,enable, reset:in bit;
cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcomponent;
endcnt_pkg;
usework.bit_arith.all;
entitycountg is
generic(stop:bit_vector(3 downto 0):="1111"); port(
clk,enable, reset:in bit;



cnt:inoutbit_vector (3 downto 0);
tc:outbit);
endcountg;
architectureone of countg is
begin
process(cnt) begin
ifcnt=stop then
tc<='1';
else
tc<='0';
endif;
endprocess;
process(clk,reset)begin
ifreset='1' then
cnt<="0000";
elsif(clk'event and clk='1') then
ifcnt=stop and enable='1' then
cnt<="0000";
elsifenable='1' then
cnt<=cnt+1;
else
cnt<=cnt;
endif;
endif;
endprocess;
endone;
程序F是顶层文件设计单元,和所表示相同,但它却是使用通用元件,



,

,

就在申明部分讲元件参数映射到了顶层文件中。

程序F:
usework.cnt_pkg.all;
entitymuxcntr is port(
clk,enablea, enableb, enablec, enabled, reset:in bit;
sel:inbit_vector (1 downto 0);
cnt:outbit_vector (3 downto 0);
tca,tcb, tcc, tcd:out bit);
endmuxcntr;
architectureone of muxcntr is
signalmuxina, muxinb, muxinc, muxind:bit_vector(3 downto 0);
begin
cntra:countggeneric map("1110") port map(clk, enablea, reset, muxina,tca); cntrb:countg generic map("1110") port map(clk,enableb, reset, muxinb, tcb); cntrc:countg generic map("1011")port map(clk, enablec, reset, muxinc, tcc); cntrd:countg genericmap("1011") port map(clk, enabled, reset, muxind, tcd);process (sel) begin
ifsel="11" then
cnt<=muxina;
elsifsel="10" then
cnt<=muxinb;
elsifsel="01" then
cnt<=muxinc;
else
cnt<=muxind;
endif;



endprocess;
endone;

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务