采用VHDL进行高层次设计(ppt 362页).ppt_第1页
采用VHDL进行高层次设计(ppt 362页).ppt_第2页
采用VHDL进行高层次设计(ppt 362页).ppt_第3页
采用VHDL进行高层次设计(ppt 362页).ppt_第4页
采用VHDL进行高层次设计(ppt 362页).ppt_第5页
已阅读5页,还剩357页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用VHDL进行数字电路设计 ASIC技术的发展电路系统设计方法自定向下的设计流程设计描述风格 高层次设计方法 ASIC技术的发展 由于所设计的系统的规模已从几十几百门增加到几万几十万门 使得从前电子工程师所熟悉的画电路图 真值表和卡诺图的设计方法已经远远不能满足数字系统的复杂性要求 ASIC技术的发展 高层次设计方法 HLD HighLevelDesign 是从八十年代末以来 最新专用集成电路设计的 最先进的设计方法 它为用户设计更大规模 更高水平 性能优良的数字系统提供了可靠的保证 HLD符合目前对电路的两个要求 TimetoMarket 对于通信领域来说 快速推出市场需要的系统具有非常重要的价值 HLD使得快速设计较大的芯片成为可能 SOC 目前对数子系统的需求是规模越来越大 HLD非集成电路专业背景的通信厂商设计大规模芯片提供了可能 设计技术的发展使得HLD成为可能 设计技术的发展使得HLD成为可能 采用最原始的版图设计只需要相应的图形编辑工具采用电路图设计就需要相应的布局布线工具采用HDL语言设计电路就需要相应的综合工具支持结论 正是综合技术的提出使得HLD成为可能 电路设计方法 由底向上的设计 Bottom up 从结构层开始 采用结构化单元和由少数行为级模块构成的层次式模型 逐级向上搭建出符合要求的系统 自顶而下的设计 Top Down 先对所要设计的系统进行功能描述 然后逐步分块细化 直至结构化最底层的具体实现 Top Down的优越性 提高设计生产的效率 自顶向下的设计方法允许设计者从一个高抽象层次上对系统的功能进行定制 而不需要考虑门级的具体实现方法 这充分体现了工艺无关性的基本设计思想 设计者只需要写出设计中所需部件的硬件描述语言代码或者是其它类型的模型 设计工具就会根据编写的高层描述生成门级的实现 这就大大减少了设计者以往必须花费在设计细节上的时间 Top Down的优越性 增加了设计的重用性 在大多数的自顶向下设计过程中 对设计的描述都保持在一个通用的工艺水平上 它不是为某一厂家的工艺库而特意定制的 也就是说 设计是与工艺无关的 所以在实现设计时不必使用某一特定厂家的工艺 这样就极大的提高了设计的可重用性 如果需要改变设计所使用的工艺 只需要将设计在相应的工艺库上映设即可 Top Down的优越性 错误的早期发觉 可以带来好处1 减少产品开发周期2 降低开发成本3 增加设计一次成功通过的可能性 电路设计应该采用的方法 强调进行系统开发的方式 首先进行系统分析 给出Specification 划分模块 明确模块接口 确定模块内部功能 此时应该编写详细的设计说明文档 之后才是编程 调试 目前国内很难达到这个层次 但一般较大的设计都是多个设计者完成 因此模块划分和确定接口信号是非常重要的 可以极大的减少设计的调试时间 模块尽量以寄存器为边界 这样对于联调和最后的系统集成非常方便 建立合理的设计习惯对于今后的工作的效率会有巨大帮助 设计技术的发展 CAD SchematicsEDA HDLVHDL和Verilog是影响最广的两种HDL VHDL相对于Veirlog而言 它在语法上更严谨一些 虽然这样也使它失去了一些灵活性和多样性 但从文档纪录 综合以及器件和系统级的仿真上讲VHDL是一种更好的选择 VHDL语言 在1981年 美国国防部提出了一种新的硬件描述语言 称之为VHSICHardwareDescriptionLanguage 也就是我们现在所说的VHDL 它是美国国防部委托IBM和TexasInstruments联合开发的 1986年 VHDL被建议作为IEEE标准 经过了多次更改后 直到1987年12月 它才被接纳为IEEE1076标准 该标准经过不断完善和更新 目前的标准为IEEE1164 它已被绝大多数IC生产厂家和EDA工具供应商所接受 当前几乎所有的EDA软件 象Synopsys MentorGraphics InovaEDA Cadence等 均支持该标准 VHDL语言的特点 VHDL是工业标准的文本格式语言VHDL能同时支持仿真和综合VHDL是一种并发执行的语言VHDL支持结构化设计和TOP DOWN设计方法VHDL的描述与工艺无关支持多风格的描述方法 数字系统描述的Gajski图 VHDL描述数字电路的层次 采用VHDL语言描述电路时 我们将电路的描述分为行为 Behavioral 和寄存器传输级 RegisterTransferLevel 和门级描述 GateLevel 三个层次 这样的划分是根据寄存器和组合逻辑的确定性而言的行为级 寄存器和组合逻辑都不明确RTL级 寄存器明确 组合逻辑不明确 门级 寄存器和组合逻辑都明确 三种描述层次的比较 在目前的实际设计工作中 行为描述和门级描述都很少用到 门级描述投入大量精力描述电路的具体细节 无法体现出高层描述的优点 行为描述的抽象层次太高 综合工具无法很好的理解设计者的意图 综合出的电路距离设计者的实际要求有很大差距 并且目前主流的综合工具都不具有这种功能 目前有一些推出的行为综合器如Synopsys的BehavioralComplier 但用户的反映都不是很良好 使用VHDL描述组合逻辑的方法 在使用VHDL描述组合逻辑电路时 根据描述风格的不同 我们将它分为行为级描述 结构流 DataFlow 描述和结构级 StructuralLevel 描述 这里的行为级 BehavioralLevel 描述和前面的行为描述 Behavioral 从概念上是有区别的 或者说是行为描述具体在组合逻辑中的定义 行为级描述是指一个组合逻辑的功能已经明确 但它的具体实现结构没有确定 但限定使用组合逻辑实现 高层次设计流程 一 系统功能分析 进行系统功能分析的目的是在进行系统设计之前明确系统的需求 也就是确定系统所要完成的功能 系统的输入输出 以及这些输入输出之间的关系等 并且要确定系统的时序要求 系统功能分析的另外一个目的 就是系统的模块划分 在系统分析时 应根据功能的耦合程度 将系统划分为不同的功能模块 每一个功能都映射到一个模块 同时还需要确定模块之间的相互关系 这是模块化设计的基本要求 二 体系结构设计 体系结构设计又是整个系统设计阶段最重要的工作 它的首要任务就是数据通路和控制通路的设计 在数字系统的设计中 系统的控制是建立在数据通路的基础之上的 不同的数据通路对应了不同的控制通路 数据通路的设计包括被处理数据的类型分析 处理单元的划分 以及处理单元之间的关联程度等 控制通路是数据通路上数据传输的控制单元 用于协调数据处理单元之间的关系 控制通路的设计主要包括数据的调度 数据的处理算法和正确的时序安排等 数据通路和控制通路的设计并不是截然分开的 有时在确定好数据通路后 由于时序或数据的调度等问题 而不得不重新修改数据通路 所以数据通路与控制通路的设计往往要经过许多次反复才能达到最优的效果 三 系统描述 谓系统描述也就是使用VHDL语言对系统进行编码 在进行大型软件的开发时 编码相对于前面所进行的系统划分工作相比就显得不是那么重要 但在使用硬件描述语言进行数字电路描述时 情况则完全不同 因为语言的描述直接决定着电路的性能 不好的编码将无法反映所确定的体系结构 可能导致前面所做的工作完全浪 四 系统功能仿真 系统的功能仿真 FunctionalSimulation 是用来验证设计者所编写的VHDL代码是否完成了预定的功能 几乎所有的高层设计软件都支持语言级的系统仿真 这样在系统综合前就可以通过系统功能仿真来验证所设计系统的功能正确与否 在语言级系统仿真时 要求设计者使用VHDL语言所提供的丰富的仿真语句来编写系统的测试基准程序 Testbench 测试基准程序在高层次设计中占有非常重要的地位 不仅在系统功能仿真时被用来作为功能验证的基准 而且在门级仿真与后时序仿真都要以此为基准 综合优化阶段 综合器对系统的综合优化主要分为两步 第一步是将硬件描述语言翻译成门电路 第二步是对产生的电路进行优化 主要工作是在第二步进行的 判断一个综合器性能的标准也是基于这一方面的 系统优化的目的就是花费最小的硬件资源满足最大的时序要求 所以系统优化就是在系统的速度 Speed 和面积 Area 之间找到一个最佳方案 Trade off 系统优化的关键在于系统约束条件 Constraints 的设定 施加到系统的约束条件将使综合器对系统的优化按照设计者所期望的目标进行 系统实现 如果系统综合优化的结果满足设计者的要求 就可以进行系统实现的工作 在一般的ASIC设计中 设计者应该将综合后电路的网表 Netlist 文件和设计的时序要求 交给IC生产厂家进行下一步的工作 这是国内一般的做法 专业的微电子公司将会参与更多的后面的layout的工作 设计风格描述 设计描述的风格直接控制着EDA工具综合的结果 描述同一功能的两段RTL描述能产生出时序和面积上完全不同的电路 好的描述方式就是易于被综合器识别并可以被综合出设计者期望的电路 电路的质量取决于工程师使用的描述风格和综合工具的能力 我将会在外面介绍 我个人对高层次设计方法的理解 硬件描述语言 schematic netlist 版图综合工具布局布线工具高级语言 汇编语言 机器语言高级语言编译器机器语言编译器 assembler 目前国内还有很多人不认同采用HDL的高层次设计方法 其实就是不能理解综合工具的作用 但映射到不认同C编译器或BASIC编译器的作用确是荒谬的 我认为高层次设计方法实际就是牺牲描述精确度来换取描述效率 在某些具体应用中是不适用的 比如最先进的处理器研究 但对于通常应用背景的数字系统来说TimetoMarket是非常重要的 高层次设计方法可以极大的提高设计的效率 随着综合工具性能的不断提高 高层设计方法的应用范围会越来越广 VHDL语言基础 设计实体和结构体的概念 VHDL把一个电路模块看作一个单元 对任何一个单元的描述包括接口描述和内部特性描述两个部分 接口描述称为设计实体 entity 它提供该单元的公共信息 如名称 端口等 内部特性描述称为结构体 architecture 它定义单元的内部操作特性 一个结构体可以对应多个实体 结构体和实体的绑定关系称为配置 configuration 一个电路单元只能有一个entity 下面是一个最简单的例子 描述的电路是一个半加器 一个半加器的VHDL描述 entityhalfadderisport a b inbit sum carry outbit endhalfadder architecturebehaviorofhalfadderisbeginprocess a b beginif a 1 andb 1 thencarry 1 elsecarry 0 endif if a b thensum 1 elsesum 0 endif endprocess endbehavior Entity的描述 entity实体名is类属参数说明端口说明end实体名 entitymuxisgeneric m time 1ns port d0 d1 sel inbit q outbit endmux 端口的方向 in 输入 out 输出 结构体内部不能再使用 inout 输入输出双向 buffer 输出 结构体内可再使用 不提倡使用buffer型 可以在内部在起一个名字 结构体的框架 architecture结构体名of实体名is定义语句begin并行处理语句end结构体名 定义语句位于architecture和begin之间 用于对结构体内部所使用的信号 常数 数据类型 函数等进行定义 信号定义和端口说明一样 应有信号名和数据类型 因它是内部使用 不需要有方向的说明 并行处理语句处于语句begin和end之间 具体描述了结构体的行为及其连接关系 在结构体中的语句都是可以并行执行的 语句的执行顺序不以书写的语句顺序为执行顺序 Entity和architecture总结 一个单元只有一个设计实体 而结构体的个数可以不限 也就是说 一个设计实体可以对应于多个结构体 这种方式的意义在于 每个结构体代表该电路的某一方面的特性 如行为特性 结构特性等 而且 即使是同一特性的描述 也可以有不同的抽象层次 在一个单元中引用另外一个单元 architecturestructureoffulladderissignalts bit signaltc1 tc2 bit componenthalfadderport a b inbit sum carry outbit endcomponent beginU0 halfadderportmap a b ts tc1 U1 halfadderportmap ts cin sum tc2 endstructure 设计库 库 library 是经过编译后的数据的集合 它存放程序包定义 设计实体定义 结构体定义和配置定义 在VHDL中 库的说明总是放在设计单元的最前面 如 libraryIEEE useIEEE std logic 1164 all 这样 在设计单元内就可以使用库中的数据 在VHDL中 可以存在多个不同的库 但是库与库之间是独立的 不能互相嵌套 当前在VHDL中存在的库大致包括 标准库 工艺库 用户自定义的库和WORK库 其中 WORK库是现行工作库 设计者描述的VHDL不需要任何说明 都可以存放在WORK库中 而且对WORK库的使用不需要任何说明 常用的数据类型 在设计可综合电路是常用的类型整形 一般只在作下标时用 内部 std logic std logic vector 9值逻辑 端口都用这两种类型类型之间的转化首先说明IEEE std logic unsigned库conv integer conv std logic vector integer n Std logic和std logic vector Std logic信号用单引号 比如a 1 来赋值使用 可以将位数较短的std logic vector型组合为数位较长的std logic vector型 九值逻辑 1 force10 force0X ForceUnknownZ HighImpedanceU UninitializedW WeakunknownH Weak1L Weak0 don tcare 在可综合电路中设计中需要的 1 0 Z X Z用来描述三态X用来赋不可能出现的缺省值 用来赋无关值 利于优化U在仿真中会遇到 没有初始化 在功能仿真中按照else来计算 在后仿真中则会传递 导致错误 常用的运算符 逻辑运算符not and or nand nor xor算术运算符 和 其它运算符 mod对于一般的可综合电路来讲 都不使用 因为它们的算法都比较复杂 综合器综合的效果不好 需要是用户自己设计算法 比如采用booth算法实现乘法连接运算符 比较常用关系运算符 都非常常用赋值运算符 逻辑运算 Andornandxornornot操作数必须类型和长度都相同注意使用括号c aandbandcc aandb andc 一样 不一定一样 关系运算符 只要是同一类型 长度不同可以比较在synopsys中是可以的 比如 11111 1100 这是因为定义了IEEE std logic unsigned库 Std logic unsigned库 function L STD LOGIC VECTOR R STD LOGIC VECTOR returnBOOLEAN function L STD LOGIC VECTOR R INTEGER returnBOOLEAN function L INTEGER R STD LOGIC VECTOR returnBOOLEAN function L STD LOGIC VECTOR R STD LOGIC VECTOR returnBOOLEAN function L STD LOGIC VECTOR R INTEGER returnBOOLEAN function L INTEGER R STD LOGIC VECTOR returnBOOLEAN function L STD LOGIC VECTOR R STD LOGIC VECTOR returnBOOLEAN function L STD LOGIC VECTOR R INTEGER returnBOOLEAN function L INTEGER R STD LOGIC VECTOR returnBOOLEAN 加法运算 最常见的加一计数器可以写成 A A 1这是因为在unsigned中定义了function L STD LOGIC VECTOR R STD LOGIC VECTOR returnSTD LOGIC VECTOR function L STD LOGIC VECTOR R INTEGER returnSTD LOGIC VECTOR function L INTEGER R STD LOGIC VECTOR returnSTD LOGIC VECTOR function L STD LOGIC VECTOR R STD LOGIC returnSTD LOGIC VECTOR function L STD LOGIC R STD LOGIC VECTOR returnSTD LOGIC VECTOR 引用库文件 这个预先定义的包文件std logic unsigned vhd被已经被预先编译的IEEE库中 因此设计者在使用上面的操作时 需要使用IEEE std logic unsigned all 否则编译时就会出错 用户可以自己包文件 编译到指定库中 并在源文件中引用这个包文件 usemy library my package all 进程process 一个进程就相当于一个并行的语句 它的内部时串行的 进程名 process 进程敏感信号列表 begin顺序描述语句 endprocessprocess语句从process开始 到endprocess结束 进程名可以省略 Process的例子 mux2 process a b s beginif s 0 thenf a elsef b endif endprocess 进程的所有输入信号应该放在敏感表内 否则会造成前后仿真不符 信号和变量 信号在电路模块之间传递信息 signal用在模块内部 具体表现在变量在entity的端口和architecture内说明 variable在process内部说明 无法传递到process外面赋给变量的值则立即成为当前值 而赋给信号的值必须在进程结束后才能成为当前值 顺序语句 Waitif caseloop对于一般的可综合电路描述 这四种顺序语句已经足够了 Wait语句 Waituntilclk eventandclk 1 then用来描述寄存器在testbench中描述延迟时可以使用waitforxxxns 敏感表相当于一个waiton语句 进程的启动 process a b s beginif s 0 thenf a elsef b endif waitona b s进程在这个地方挂起endprocess IF语句 IFcondition1THENsequence of statements1 ELSIFcondition2THENsequence of statements2 ELSEsequence of statements3 ENDIF 其中括号内为可选部分 它表示当条件1成立时 执行顺序语句序列1 当条件2成立时 执行顺序语句序列2 否则执行顺序语句序列3 ELSEIF付句可以重复 但ELSE付句只能有一条 IF语句 注意如果if引导event代表时钟 此时不能有else复句用户组合逻辑的if 如果没有else付句 一定要在IF语句前面有缺省赋值 否则会造成不需要的latch IF语句 IF语句对应的电路就是多选电路 比如ifselect 1 thenoutput a elseoutput b endif 对应的电路就是用select作为选择信号来选通a和b Case语句 CASE语句的描述如下 CASEexpressionISWHENchoices1 sequence of statements1 WHENchoices2 sequence of statements1 ENDCASE其中条件有如下四种表达方法 WHEN值 WHEN值 值 值 WHEN值TO值 WHENothers 选择项必须覆盖表达式所有选项 不足时其它选项包括在others项中 Case语句 Case语句对应的是无优先级的多选如果在case中给多个信号赋值一定要在前面有缺省赋值 大家看下面的程序有什么问题 Case语句 Process decoder in beginCASEdecoder inISWHEN 000 decoder outdecoder outdecoder outdecoder outdecoder outdecoder outdecoder outdecoder out 01111111 ENDCASE Decoder in为std logic vector型 所以即使是9个值也没有完全赋值 因此如果在case前没有decoder的缺省赋值 就应该有default选项whendefault decoder out X Loop语句 FORidentifierINdiscrete rangeLOOPsequence of statemetnsENDLOOP LOOP语句适用于描述有重复操作 或模块需要很强的迭代能力时使用 如下电路完成对输入的8位向量的翻转 即信号的高位与低位对调 FORiIN0TO7LOOPoutput vector i input vector 7 i ENDLOOP loop语句 上述程序中i为循环变量 在VHDL中不允许任何对循环变量的赋值 也就是说不允许在任何函数返回值中存在循环变量 或在任何过程的输出与双向参量中存在循环变量 并且循环变量不用显式说明 它的作用域仅存在于循环语句内部 因此不允许在循环语句内部存在于循环变量同名的变量或信号 进制 B binary O octal X Hexadecimal 通常情况下我们都用二进制对于位宽为4n的用16进制极为方便 在VHDL的语言规定中 可以使用 X 0F 赋值 但synopsys到9910才支持 如果工具不支持只能使用2进制 理解并行的概念 在architecture中的语句都是并行的 它们的执行顺序和位置无关 一个process相当于一个并行语句 比如在architecture中存在 D A E A B C 将产生两个加法器 第二个输出作为第一个的一个输入在仿真时 当B或C变化时 激活语句2 当A或E变化时 激活语句2 本质 在现实电路中 各个部件是并行工作的 一个部件的输入变化 才会引起这个部件的输出变换 避免组合环 在一般情况下不要使用组合环 尤其是不要用行为级描述组合环 如果需要使用电路图形式 并在设计中不要优化这个模块 练习写一个带有异步复位同步置数的增量计数器 Clk时钟load同步置数信号rst异步清零data置入数据count计数器输出 lIBRARYIEEE USEIEEE STD LOGIC 1164 ALL USEIEEE STD LOGIC UNSIGNED ALL ENTITYcounterISPORT clk INstd logic load INstd logic rst INstd logic data INstd logic vector 7downto0 count OUTstd logic vector 7downto0 ENDcounter ARCHITECTUREarc counterOFcounterISSIGNALcnt std logic vector 7downto0 BEGINPROCESS clk rst BEGINIFrst 1 THENcnt 0 ELSIFclk eventANDclk 1 THENIFload 1 THENcnt data ELSEcnt cnt 1 ENDIF ENDIF ENDPROCESS count cnt ENDarc counter 敏感表 Process a b begins a t b v sort endprocess Process a b s t begins a t b v sort endprocess 仿真和综合的区别 结论 出现在赋值号左边的都应该写在敏感表中 Latch Process x z beginifx 1 theny z endif endprocess X 0时需要保存原值 导致产生一个latch 使用VHDL描述基本电路 原因 采用HDL语言进行数字电路设计的流程中最重要的环节就是将语言描述转化为电路 将你的设计付诸实现 因此你必须知道所描述的语言对应的电路 只有这样综合工具才会输出一个可预知的 准确的 高质量的结果 满足设计者对电路功能 时序和面积上的要求 数字电路都是由一些基本单元连接而成的 只有能准确的描述这些常见电路才有可能使用这些模块构建更复杂的数字电路 因此熟悉数字电路中一些常见电路的描述是进行大规模系统设计的基础 RTL电路模型 结论 对于RTL电路的描述主要就是针对时序部件和组合逻辑的描述 如果设计者在使用VHDL语言进行描述时 能遵照组合逻辑和时序电路描述的规范 那么就可以使综合工具明确设计者的意图 综合出设计者期望的电路 数字系统的结构 除了调用的一些宏单元模块时序电路 组合逻辑以及总线和存储单元 这四种基本单元就可以构成各种各样的数字电路 我个人的理解 不知道对不对 时序部件 时序逻辑电路在任一时刻的输出信号不但与当时的输入信号有关 而且还依赖于电路原来的状态 因此这类电路必须具有记录过去状态的能力 时序逻辑电路中最基本的记忆部件就是就是触发器 flip flop 和锁存器 latch 它们都是一位的存储单元 多位存储单元就可以构成寄存器 Register LATCH 锁存器是电平触发的 锁存器的值在时钟的一个逻辑状态可以更改 在另一个逻辑状态被保存下来 因此在使能阶段输入端的一个毛刺也会导致电路的误操作 无法阻止毛刺的传播 容易产生较多的竞争冒险现象 从数字电路教材中 我们可以知道锁存器的优点是面积小 功耗低 速度较快 因此在许多全定制和半定制ASIC设计中会使用锁存器单元 但在使用FPGA或CPLD实现电路时 应该避免使用锁存器 寄存器的描述 PROCESSBEGINWAITUNTIL edge ENDPROCESS 或PROCESS sensitivitylist BEGINIF edge ENDIF ENDPROCESS 时钟沿描述 使用WAIT语句时 进程不需要敏感表 WAITUNTIL语句就相当于敏感表的功能 在使用IF语句时应该将时钟信号放入敏感表中 对于时钟的跳变有两种描述方法 event属性或函数调用 如下所示 clk eventANDclk 1 上跳沿的event属性描述clk eventANDclk 0 下跳沿的event属性描述rising edge clk 上跳沿的函数调用falling edge clk 下跳沿的函数调用在电路设计中 应使用event属性来描述时钟跳变 因为一些VHDL的综合工具并不支持函数调用 并且函数只检测0到1和1到0的跳变 无法检测出X到1或0到X 这对于使用的九值逻辑是不适合的 时钟沿描述 时钟沿在作为IF或ELSIF语句的条件时 只可以单独使用 不能和其他条件共存 如下面的语句就是错误的 IF edgeANDrst 1 THEN同时当某一IF语句或ELSIF语句后有时钟沿做条件时 就不可以在有ELSE付句 如下面的语句描述也是错误的 IFrst 1 THENSequential statementELSIF edge THENSequential statementELSESequential statementENDIF 异步复位和同步复位 记忆部件在电路加电后其状态是不确定的 它的初值应由复位信号来设置 根据设置的时机不同 可分为同步置位和异步置位 所谓同步置位是指置位信号只有在给定的时钟沿下才可以完成工作 而异步复位是指复位信号一旦生效存储部件就会被置位 其原理如下图所示 Asynreset和synreset 异步复位的VHDL描述 PROCESS sensitivitylist BEGINIF reset THEN ELSIF set THEN ELSIF edge THEN ENDIF ENDPROCESS 此时的敏感表只需要异步负位信号和时钟信号即可 IF语句相对于WAIT语句更灵活一些 强调 在FPGA设计中尽量不要使用latch 触发器描述 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL ENTITYdffISPORT data INstd logic clk INstd logic q OUTstd logic ENDdff ARCHITECTUREdffOFdffISBEGINPROCESSBEGINWAITUNTILclk eventANDclk 1 q data ENDPROCESS ENDdff 电路图 带异步复位上沿的D触发器 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL ENTITYdff asyn resetISPORT data INstd logic clk INstd logic reset INstd logic q OUTstd logic ENDdff asyn reset ARCHITECTUREdff asyn resetOFdff asyn resetISBEGINPROCESS clk reset BEGINIFreset 0 THENq 0 ELSIFclk eventANDclk 1 THENq data ENDIF ENDPROCESS ENDdff asyn reset 电路图 带异步置位复位的上跳沿D触发器 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL ENTITYdff asynISPORT data INstd logic clk INstd logic preset INstd logic reset INstd logic q OUTstd logic ENDdff asyn preset ARCHITECTUREdff asynOFdff asynISBEGINPROCESS clk preset reset BEGINIFpreset 0 THENq 1 ELSIFreset 0 THENq 0 ELSIFclk eventANDclk 1 THENq data ENDIF ENDPROCESS ENDdff asyn 电路图 带异步复位和输入使能的上跳沿D触发器 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL ENTITYdff ck enISPORT data INstd logic clk INstd logic reset INstd logic en INstd logic q OUTstd logic ENDdff ck en ARCHITECTUREdff ck enOFdff ck enISBEGINPROCESS clk reset BEGINIFreset 0 THENq 0 ELSIFclk eventANDclk 1 THENIFen 1 THENq data ENDIF ENDIF ENDPROCESS ENDdff ck en 电路图 计数器 计数器是数字系统中使用最多的时序电路 它不仅能用于对时钟脉冲计数 还可用于定时 分频 产生节拍脉冲以及进行数字运算等 稍微复杂的数字系统 几乎都包含计数器 按计数器中触发器翻转的次序 可以把计数器分为同步式和异步式两种 在同步计数器中 当时钟脉冲输入时触发器的翻转是同时的 而在异步计数器中 触发器则不是同时翻转的一般的设计中都使用同步计数器 带异步清零和计数使能的8位同步计数器 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL USEIEEE STD LOGIC UNSIGNED ALL ENTITYcounter8ISPORT clk INstd logic en INstd logic rst INstd logic count OUTstd logic vector 7downto0 ENDcounter8 ARCHITECTUREcounter8OFcounter8ISSIGNALcnt std logic vector 7downto0 BEGINPROCESS clk en cnt rst BEGINIFrst 0 THENcnt 0 ELSIFclk eventANDclk 1 THENIFen 1 THENcnt cnt 1 ENDIF ENDIF ENDPROCESS count cnt ENDcounter8 RTL视图 建议 大家在初期的练习中 对于简单电路可以使用synplify综合后观察它的RTL视图 比较自己对模块的基本理解 可以提高对vhdl描述和综合的认识 移位操作 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL USEIEEE STD LOGIC UNSIGNED ALL ENTITYshiftISPORT clk INstd logic rst INstd logic data INstd logic Q OUTstd logic vector 7downto0 ENDshift ARCHITECTUREshiftOFshiftISSIGNALQ temp std logic vector 7downto0 BEGINPROCESS rst clk BEGINIFrst 1 THENQ temp 0 ELSIFclk eventANDclk 1 THENQ temp Q temp 6downto0 data ENDIF ENDPROCESS Q Q temp ENDshift 电路图 练习 描述一个串并转换电路 并行输出位8位 搜索到同步字AA后开始发送一个同步标记 以后每组一个字 发一次 结果 Process Q temp data variablecompare AA std logic vector 7downto0 begincompare AA Q temp 6downto0 结果 Process rst clk beginifrst 1 thenword counter 000 elsifclk eventandclk 1 thenifword counter enable 1 thenword counter word counter 1 endif endif endprocess process word coutner beginifword counter 001 thenword syn 1 elseword syn 0 endif endprocess 组合电路的描述 在RTL电路模型中 处于各个寄存器之间的部分都是组合逻辑电路 相对于寄存器的描述 组合逻辑的描述相对模糊 设计者只能大约的估计出组合部分的面积和时延 而组合逻辑在很大程度上决定着电路的面积和速度 因此对于组合电路的准确描述就显得十分重要 只有了解基本组合单元的特点 才能使由VHDL语言描述产生的电路符合设计者时序和面积上的要求 组合逻辑的特点是在任何时刻电路的输出仅仅取决于该时刻的输入信号 而与这一时刻输入信号作用前电路原来的状态没有任何关系 在电路结构上基本是由逻辑门组成 只有从输入到输出的通路 没有从输出反馈到输入的回路 虽然逻辑电路由于具体问题的不同而千差万别 但其中也有若干种电路在各类数字系统中大量的出现 并且其它许多电路都是在它们的基础上变化得到的 下面就介绍如何用VHDL语言来描述这些基本电路 多选电路 ENTITYpri muxISPORT input a INstd logic input b INstd logic input c INstd logic input d INstd logic select a INstd logic select b INstd logic select c INstd logic pout OUTstd logic ENDpri mux ARCHITECTUREpri muxOFpri muxISBEGINPROCESS input a input b input c input d select a select b select c BEGINIFselect a 1 THENpout input a ELSIFselect b 1 THENpout input b ELSIFselect c 1 THENpout input c ELSEpout input d ENDIF ENDPROCESS ENDpri mux 电路图 无优先级的选择器 PROCESS input a input b input c input d sel BEGINCASEselISWHEN 00 poutpoutpoutpoutpout input d 电路图 无优先级的译码器 ENTITYdecoderISPORT Ain INstd logic vector 2downto0 en INstd logic Yout OUTstd logic vector 7downto0 ENDdecoder ARCHITECTUREdecoderOFdecoderISBEGINPROCESS Ain en BEGINIFen 0 THENYout 0 ELSECASEAinISWHEN 000 YoutYout 00000010 WHEN 010 YoutYoutYoutYoutYoutYoutYout 0 ENDCASE ENDIF ENDPROCESS ENDdecoder 电路图 算术运算电路 在数字电路中加减运算都是采用补码通过加法器来实现的 普通的乘除法也是分解成加和移位操作分步完成的 因此加法器是所有算术运算电路中最基本的部件 许多处理器 比如8031 8086和80286等 的ALU单元就是由函数发生器和加法器构成的 它是数据通路上最关键的部件之一 它的时延直接影响着系统工作频率 从一些计算机组成原理的教材上可以知道加法器分为串行进位加法器和超前进位加法器 设计者可以根据系统的需要决定采用哪一种形式 在原来的设计方法中 加法器的形式一旦确定就很难更改 除非对这个模块重新设计 灵活性和重用性都很差 采用VHDL来描述加法电路时灵活性就很大 即可以指定加法器的结构 也可以在综合时通过施加约束条件来控制 四位加法器 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL ENTITYadderISPORT operand a INstd logic vector 3downto0 operand b INstd logic vector 3downto0 result OUTstd logic vector 4downto0 ENDadder ARCHITECTUREadderOFadderISSIGNALtemp a temp b std logic vector 4downto0 BEGINtemp a 0 operand a temp b 0 operand b result temp a temp b ENDadder 注释 在上面程序中 我们使用了 没有使用process 只使用了三个并行语句注意保存进位 DesignWare库的表示 不同的约束得到不同的优化结果 指定面积优先 得到电路电路结构中 电路基本是串行结构 它的面积是33个单位 最长路径是5 42ns 对同一个设计当指定进行时间优先进行优化时可以得到第二幅的电路 这个电路的并行度明显提高 它的最长路径只有1 83ns 面积是65个单位 面积优先 33 5 42 时间优先 65 1 83 关系运算电路 在数字系统中能完成比较两个数字大小或是否相等的各种逻辑电路都可以称为比较器 比较器是数字系统中一种经常出现的电路 尤其是在通信领域的芯片设计中更为常见 比如在路由器的芯片中一项主要工作就是将数据包的地址字段和路由表中的数据进行比较以决定数据的组包和转发方向 一位比较电路 LIBRARYIEEE USEIEEE STD LOGIC 1164 ALL ENTITYcomparerISPORT a INstd logic b INstd logic equal OUTstd logic greatthan OUTstd logic lessthan OUTstd logic ENDcomparer ARCHITECTUREmultiplierOFmultiplierISBEGINPROCESS a b BEGINequalbTHENgreatthan 1 ELSElessthan 0 ENDIF ENDmultiplier 电路图 一个8位相等比较器的例子 ARCHITECTUREequalOFequalISBEGINPROCESS operand a operand b BEGINIFoperand a operand bTHENresult 1 ELSEresult 0 ENDIF ENDPROCESS ENDequal 面积优先 29 3 1 时间优先 31 1 1 总线描述 在数字系统模型中存在着总线的概念 它是系统部件之间进行数据传送的公共通路 借助总线连接 数字系统内各部件可以实现传送地址 数据和控制信息的操作 在任何一个时刻 只有一个部件向总线上传送信息 可以有多个部件从总线上读取信息 总线模型 模型说明 在上面的示意图中 共有四个部件通过总线来传递数据 当oe1 out有效时 部件1驱动总线 此时oe2 out oe3 out和oe4 out都必须处于无效状态 也就是说部件2 3和4的向总线上的输出都被隔断 否则将出现多个数据源共同驱动总线的情况 造成数据的不定态 当部件1向总线上送数时 其它部件的输入使能端oe2 in oe3 in和oe4 in都可以有效 从而可以采样所需要的数据 采用VHDL描述总线 在采用VHDL语言描述时 如果某个部件的输出使能无效 那么它将向总线上赋高阻态 Z 表明该部件和总线被隔离开 否则就会出现多个部件共同驱动总线的情况 在功能仿真时总线上出现 X 的情况 并且这样的描述将被综合器认为是多驱动 将予以报错 因此在进行系统的总体设计时 需要仔细考虑的就是合理安排各个部件输出使能的时序 使得它们在任意时刻最多只能有一个使能有效 使用寄存器的总线模型 在实际的电路

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论