可编程逻辑器件应用可编程逻辑器件(PLD--ProgrammableLogicDevice):器件的功能不是固定不变的,而是可根据用户的需要而进行改变,即由编程的方法来确定器件的逻辑功能。PLD器件的优点集成度高,可以替代多至几千块通用IC芯片极大减小电路的面积,降低功耗,提高可靠性具有完善先进的开发工具提供语言、图形等设计方法,十分灵活通过仿真工具来验证设计的正确性可以反复地擦除、编程,方便设计的修改和升级灵活地定义管脚功能,减轻设计工作量,缩短系统开发时间保密性好PLD的发展趋势向高集成度、高速度方向进一步发展最高集成度已达到400万门向低电压和低功耗方向发展,5V3.3V2.5V1.8V更低内嵌多种功能模块RAM,ROM,FIFO,DSP,CPU向数、模混合可编程方向发展大的PLD生产厂家最大的PLD供应商之一FPGA的发明者,最大的PLD供应商之一ISP技术的发明者提供军品及宇航级产品设计输入原理图输入使用元件符号和连线等描述比较直观,但设计大规模的数字系统时则显得繁琐HDL语言输入逻辑描述功能强成为国际标准,便于移植原理图与HDL的联系与高级语言与汇编语言类似在系统编程技术ISP--InSystemProgramVHDL语言程序的基本结构:库说明(library)实体说明(entity)结构体说明(architecture)VHDL语言中的数据数据对象:常量:一旦赋值就不会发生变化变量:可以在程序中改变值的量,赋值立即生效信号:可以随时间改变数值,赋值允许产生延时顺序描述语句:If语句If条件1then第1组顺序语句;elsif条件2then第2组顺序语句;……else第n+1组顺序语句;endif;Case语句:case条件表达式iswhen条件表达式的值=〉一组顺序语句;…………when条件表达式的值=〉一组顺序语句;endcase;进程语句:Process(敏感信号表)变量说明语句;Begin一组顺序语句;Endprocess;敏感信号是指那些值发生改变后能够引起进程语句执行的信号。If(clk’eventandclk=‘1’)then在时钟边沿的条件得到满足后才真正执行时序电路所对应的语句。当时钟信号作为进程的敏感信号时,在敏感信号表中不能出现一个以上的时钟信号MAX+PLUSII设计环境介绍MAX+PLUSII设计方法介绍设计输入(DesignEntry)编译仿真时序分析器件编程设计输入多种设计方法:MAX+PLUSII图形设计输入(Graphicdesignentry)文本设计输入(Textdesignentry)AHDL,VHDLAltera设计方法学多级设计将设计分为几个模块单独输入并调试每个模块每个独立模块都产生DefaultSymbols或者Include文件将这些模块应用于高级设计文件编译选择目标器件切记80/80原则.保留20%逻辑及20%输入/输出(I/O)管脚资源以用于将来的设计修改首先,在无任何管脚分配的情况下编译高级设计来检验实际设计是否满足目标器件验证仿真功能是否正确?是否存在假电平讯号?执行时序分析解决性能受阻问题编程器件编程运行测试验证系统必要的话,修改设计,根据后面的注释提示重新编译并重新给器件编程第三章利用可编程逻辑器件进行现代电子系统的设计第三章第一节可编程数字系统设计中的几个基本概念按结构和工作原理不同,数字电路可分为两大类:组合逻辑电路和时序逻辑电路。组合逻辑电路的特点:组合逻辑电路是数字电路中最简单的一类逻辑电路,其特点是功能上无记忆,电路中不包含存储单元,结构上无反馈。即电路任一时刻的输出状态只决定于该时刻各输入状态的组合,而与电路的原状态无关。1什么是组合逻辑电路组合逻辑电路组合逻辑电路任意时刻的输出只取决于该时刻的输入,于电路原来的状态无关常用的组合逻辑电路有:地址编码器、加法器、多路选择器等组合逻辑电路特点及应用深入总结当某一时刻同时有一个以上的信号发生变化时容易产生毛刺组合逻辑电路是会产生毛刺的时序逻辑电路的设计进阶时序逻辑电路时序逻辑电路任一时刻的输出信号不仅取决于当时的输入信号还取决于电路原来的状态常用的时序逻辑电路有:计数器、移位寄存器、序列发生器等同步时序电路同步时序电路的存储器件为触发器,且触发器是在同一个时钟操作下工作的CLK组合逻辑存储元件存储元件异步时序电路异步时序电路的存储器件可以是触发器也可以是延迟器件。电路不需要统一的系统时钟组合逻辑存储元件存储元件在FPGA设计中采用同步时序电路一般认为同步时序电路不存在竞争-冒险现象FPGA存在内部逻辑实现时延不确定性,所以用时延关系要求苛刻的异步电路实现起来比较困难。FPGA中具有丰富的触发器资源、灵活低延时的多时钟资源、三态的总线结构资源,有利于同步电路的设计CLK组合逻辑存储元件存储元件时钟信号全局时钟门控时钟行波式时钟多时钟系统(不作介绍)全局时钟由专用的全局时钟输入引脚驱动的单个主时钟去钟控设计项目中的每一个触发器全局时钟提供器件中最短的时钟到输出的延时最简单和最可预测的时钟。PLD/FPGA设计中最好的时钟方案门控时钟组合逻辑输出直接作为时钟信号容易产生毛刺,导致触发器误翻转尽量避免采用门控时钟解决方法:插入“冗余逻辑”到设计项目中(但PLD或FPGA编译器在逻辑综合时可能会去掉这些冗余逻辑)可以利用时钟使能端将门控时钟转化为全局时钟QD组合逻辑...输入在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为“毛刺”。组合逻辑的时钟如果产生毛刺,易使触发器误翻转。图4.19QD组合逻辑inputclk门控时钟是非常危险的,极易产生毛刺,使逻辑误动作。在可编程逻辑器件中,一般使用触发器的时钟使能端,而这样,并不增加资源,只要保证建立时间,可使毛刺不起作用。改进后电路:行波时钟一个触发器的输出用作另一个触发器的时钟输入(异步串行计数器)通过仔细地设计,行波时钟可以象全局时钟一样地可靠工作行波时钟使得与电路有关的定时计算变得很复杂行波时钟在行波链上各触发器的时钟之间产生较大的时间偏移,并且会超出最坏情况下的建立时间、保持时间和电路中时钟到输出的延时,使系统的实际速度下降典型应用:异步计数器全局时钟替代行波时钟QDclk1QDclk2组合逻辑QD图4.10QD组合逻辑QDclk1clk2·改进后:用一个触发器做同步化处理,保证后级时钟准确采样。多时钟的同步化两个没有相位关系的时钟这样使用,后级时钟可能不能准确采样。复位和置位对毛刺是非常敏感的好的复位和置位应该是从器件的引脚单独直接地驱动如果必须从器件内产生清除或置位信号,则要按照“门控时钟”的设计原则去建立这些信号,确保输入无毛刺特别注意:不要对寄存器的置位和清除端同时施加不同信号产生的控制,因为如果出现两个信号同时有效的意外情况,会使寄存器进入不定状态。复位与置位信号的设计总结保证时钟无毛刺不用多于一级组合逻辑构成的时钟保证清除和置位信号不包含竞争状态寄存所有对毛刺敏感的输出同步所有异步输入信号用厂家提供的软件计算建立和保持时间尽量用宏库里面提供的元件在VHDL语言中进行组合逻辑电路设计例(1):利用布尔方程(公式)进行设计在VHDL中支持所有的标准的Boolean运算AND,OR,NOT,XOR,XNOR,NAND例如:一个4选1的多路选择器,如下图所示x=(aANDNOT(s(1))ANDNOT(s(0)))OR(bANDNOT(s(1))ANDs(0))OR(cANDs(1)ANDNOT(s(0)))OR(dANDs(1)ANDs(0));axmuxcbds2赋哪个值依赖于所选的信号条件WHEN语句必须互斥(alldifferent)经常使用“WHENOTHERS”来囊括未定义的情况Onlyonereferencetothesignal,只有一个赋值运算符(=)WITHselection_signalSELECTsignal_name=value_1WHENvalue_1ofselection_signal,value_2WHENvalue_2ofselection_signal,...value_nWHENvalue_nofselection_signal,value_xWHENOTHERS;例(2)利用“WITH-SELECT-WHEN”设计前面我们所见的4选1多路选择开关还能有如下描述:WITHsSELECTx=aWHEN“00”,--meanswhens=“00”bWHEN“01”,cWHEN“10”,dWHENOTHERS;axmuxcbds2例(2):利用“WITH-SELECT-WHEN”设计这里也能在一行中把所有的条件都写上:WITHsSELECTx=aWHEN”000”|“001”|“010”,bWHEN“101”|“111”,--‘|’说明是“or”运算符cWHENOTHERS;例(2):利用“WITH-SELECT-WHEN”设计信号赋哪个值依赖于后面的条件任何简单的表达式都可以是一个条件优先级依赖于条件出现的顺序仅仅一个值赋给信号,只用一个赋值运算符(=)经常在结尾用“ELSE”来囊括未定义的条件signal_name=value_1WHENcondition1ELSEvalue_2WHENcondition2ELSE...value_nWHENconditionnELSEvalue_x;例(3):利用“WHEN-ELSE”设计同样的4选1多路选择器能以如下的描述来定义:x=awhen(s=“00”)elsebwhen(s=“01”)elsecwhen(s=“10”)elsed;axmuxcbds2例(3):利用“WHEN-ELSE”设计WITH-SELECT-WHEN和WHEN-ELSE的区别是什么?WITH-SELECT-WHEN仅仅允许一个控制信号WHEN-ELSE支持许多不同的控制信号例如:一个优先编码器j=wwhen(a=‘1’)elsexwhen(b=‘1’)elseywhen(c=‘1’)elsezwhen(d=‘1’)else‘0’;例(3):利用“WHEN-ELSE”设计利用VHDL语言设计组合逻辑电路概要组合逻辑语句(意味着是并行语句)并行语句就是“执行”并行(在同一时刻)前面我们见到的例子都是组合逻辑电路的表述方法:布尔方程“WHEN-ELSE”语句“WITH-SELECT-WHEN”语句并行语句的顺序不重要(!!!!)时序逻辑语句(意味着按照时序规定来执行语句)有时我们需要建立复杂的模型函数.在这种情况下,我们能使用一个“算法”或者一个模型来描述这个函数,这只能由时序语句来完成了在时序语句中,语句的顺序是很重要的(见后面的例子)因此,我们使用一个process(进程)来标志一个时序语句块的开始和结束每个完整的进程都可以视为一个大的并发性语句(在一个结构体中有很多个进程)在VHDL语言中进行时序逻辑电路设计什么是一个VHDL的“进程”?进程要么唤醒,要么是沉睡(activeorinactive)一个进程通常有一个敏感信号列表(sensitivitylist)当在敏感信号列表中的一个信号变化时,进程就被唤醒(wakesup)并且所有的时序语句都执行一遍例如,对有时钟的敏感信号列表而言,在信号clock的变化沿处将激活进程在进程的结尾,所有的输出都被更新并且进程开始重新沉睡(sleep),直到下一个时刻敏感信号列表中的信号开始变化应用时序语句进行组合逻辑电路的描述我们已经看到了一些应用组合