第10章设计的优化_第1页
第10章设计的优化_第2页
第10章设计的优化_第3页
第10章设计的优化_第4页
第10章设计的优化_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

第10章设计的优化第10章设计的优化主要内容10.1设计的可综合性10.2流水线设计技术10.3资源共享10.4有限状态机设计10.5多层次结构电路的设计10.6进程10.7阻塞赋值与非阻塞赋值10.8FPGA设计中毛刺的消除10.1设计的可综合性

用FPGA/CPLD器件实现的设计中,综合就是将Verilog或VHDL语言描述的行为级或功能级电路模型转化为RTL级功能块或门级电路网表的过程综合

可综合的设计中应注意不使用初始化语句;不使用带有延时的描述;不使用循环次数不确定的循环语句。应尽量采用同步方式设计电路。用always过程块描述组合逻辑,应在敏感信号列表中列出块中出现的所有输入信号。所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位,用器件的全局时钟端作为系统外部时钟输入端。在Verilog模块中,任务(task)通常被综合成组合逻辑的形式;每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。10.2流水线设计(PipelineDesign)技术

流水线设计是经常用于提高所设计系统运行速度的一种有效的方法。为了保障数据的快速传输,必须使系统运行在尽可能高的频率上,但如果某些复杂逻辑功能的完成需要较长的延时,就会使系统难以运行在高的频率上,在这种情况下,可使用流水线技术,即在长延时的逻辑功能块中插入触发器,使复杂的逻辑操作分步完成,减小每个部分的延时,从而使系统的运行频率得以提高。流水线设计的代价是增加了寄存器逻辑,增加了芯片资源的耗用。

流水线操作的概念如某个复杂逻辑功能的实现需较长的延时,可将其分解为几个(如3个)步骤来实现,每一步的延时变小,在各步间加入寄存器,以暂存中间结果,这样可大大提高整个系统的最高工作频率。流水线操作的概念示意图

非流水线方式实现的8位全加器moduleadder8(cout,sum,ina,inb,cin,clk);output[7:0]sum;outputcout;input[7:0]ina,inb;inputcin,clk;reg[7:0]tempa,tempb,sum;regcout,tempc;always@(posedgeclk)begintempa=ina;tempb=inb;tempc=cin;//输入数据锁存endalways@(posedgeclk)begin{cout,sum}=tempa+tempb+tempc;endendmodule两级流水实现的8位加法器moduleadder_pipe2(cout,sum,ina,inb,cin,clk);input[7:0]ina,inb;inputcin,clk;output[7:0]sum;outputcout;regcout;reg[7:0]sum;reg[3:0]tempa,tempb,firsts;regfirstc;always@(posedgeclk)begin{firstc,firsts}=ina[3:0]+inb[3:0]+cin;tempa=ina[7:4];tempb=inb[7:4];endalways@(posedgeclk)begin{cout,sum[7:4]}=tempa+tempb+firstc;sum[3:0]=firsts;endendmodule四级流水线实现的8位加法器modulepipeline(cout,sum,ina,inb,cin,clk);output[7:0]sum;outputcout;input[7:0]ina,inb;inputcin,clk;reg[7:0]tempa,tempb,sum;regtempci,firstco,secondco,thirdco,cout;reg[1:0]firsts,thirda,thirdb;reg[3:0]seconda,secondb,seconds;reg[5:0]firsta,firstb,thirds;always@(posedgeclk)begintempa=ina;tempb=inb;tempci=cin;end //输入数据缓存always@(posedgeclk)begin{firstco,firsts}=tempa[1:0]+tempb[1:0]+tempci;//第一级加(低2位)firsta=tempa[7:2];firstb=tempb[7:2]; //未参加计算的数据缓存endalways@(posedgeclk)begin{secondco,seconds}={firsta[1:0]+firstb[1:0]+firstco,firsts};//第二级加(第2、3位相加)seconda=firsta[5:2];secondb=firstb[5:2]; //数据缓存endalways@(posedgeclk)begin{thirdco,thirds}={seconda[1:0]+secondb[1:0]+secondco,seconds};//第三级加(第4、5位相加)thirda=seconda[3:2];thirdb=secondb[3:2]; //数据缓存endalways@(posedgeclk)begin{cout,sum}={thirda[1:0]+thirdb[1:0]+thirdco,thirds};//第四级加(高两位相加)endendmodule设计综合到不同器件的最高工作频率

2个加法器和1个选择器的实现方式moduleresource1(sum,a,b,c,d,sel);parametersize=4;output[size:0]sum;inputsel;input[size-1:0]a,b,c,d;reg[size:0]sum;always@(aorborcordorsel)beginif(sel) sum=a+b;else sum=c+d;endendmodule10.3资源共享(ResourceSharing)尽量减少系统所耗用的器件资源也是我们进行电路设计时所追求的目标,在这方面,资源共享是一个较好的方法,尤其是将一些耗用资源较多的模块进行共享,能有效降低整个系统耗用的资源。

2个选择器和1个加法器的实现方式moduleresource2(sum,a,b,c,d,sel);parametersize=4;output[size-1:0]sum;inputsel;input[size-1:0]a,b,c,d;reg[size-1:0]atemp,btemp;reg[size:0]sum;always@(aorborcordorsel)beginif(sel) beginatemp=a;btemp=b;endelse beginatemp=c;btemp=d;endsum=atemp+btemp;endendmodule资源共享

器件资源的消耗对比资源共享方式一需要2个加法器,而方式二通过增加一个MUX,共享一个加法器,由于加法器耗用的资源比MUX更多,因此方式二更节省资源。所以在电路设计中,应尽可能使硬件代价高的功能模块资源共享,从而降低整个系统的成本。资源共享结论10.4有限状态机(FSM)设计有限状态机(FSM,FiniteStateMachine)是时序电路设计中经常采用的一种方式,尤其适于设计数字系统的控制模块。用Verilog的case、if-else等语句能很好地描述基于状态机的设计。用状态机设计一个二进制序列检测器,其功能是检测一个4位二进制序列“1111”,即输入序列中如果有4个或4个以上连续的“1”出现,输出为1,其它情况下,输出为0。有限状态机设计输入x:000101010110111101111110101输出z:000000000000000100001110000其输入输出如下所示:有限状态机设计“1111”序列检测器状态转换图

“1111”序列检测器的Verilog描述modulefsm_seq(x,z,clk,reset,state);inputx,clk,reset;outputz;output[2:0]state;reg[2:0]state;regz;parameters0='d0,s1='d1,s2='d2,s3='d3,s4='d4;always@(posedgeclk)beginif(reset)beginstate<=s0;z<=0;endelsecasex(state)s0: beginif(x==0)beginstate<=s0;z<=0;endelsebeginstate<=s1;z<=0;endend

s1: beginif(x==0) beginstate<=s0;z<=0;endelse beginstate<=s2;z<=0;endends2: beginif(x==0) beginstate<=s0;z<=0;endelse beginstate<=s3;z<=0;endends3: beginif(x==0) beginstate<=s0;z<=0;endelse beginstate<=s4;z<=1;endends4: beginif(x==0) beginstate<=s0;z<=0;endelse beginstate<=s4;z<=1;endenddefault: state<=s0;

endcaseendendmodule基于状态机的设计要点1.起始状态的选择起始状态是指电路复位后所处的状态,选择一个合理的起始状态将使整个系统简洁高效。有的EDA软件会自动为基于状态机的设计选择一个最佳的起始状态。2.状态编码状态编码主要有二进制编码、格雷编码和一位独热编码等方式。◆二进制编码(BinaryStateMachine)◆格雷编码(GrayCodeStateMachine)◆一位热码编码(One-HotStateMachineEncoding)一位热码编码即采用n位(或n个触发器)来编码具有n个状态的状态机。比如对于state0、state1、state2、state3四个状态可用码字1000、0100、0010、0001来代表。基于状态机的设计要点3.状态编码的定义在Verilog语言中,有两种方式可用于定义状态编码,分别用parameter和'define语句实现,比如要为state0、state1、state2、state3四个状态定义码字为:00、01、11、10,可采用下面两种方式。方式1:用parameter参数定义parameterstate1=2'b00,state2=2'b01,state3=2'b11,state4=2'b10;……case(state)state1: …; //调用state2: …;……基于状态机的设计要点4.状态转换的描述一般使用case语句来描述状态之间的转换,用case语句表述比用if-else语句更清晰明了。状态编码的定义方式2:用'define语句定义'definestate12'b00 //不要加分号“;”'definestate22'b01'definestate32'b11'definestate42'b10 case(state)'state1: …; //调用,不要漏掉符号“'”'state2: …;……10.5多层次结构电路的设计如果数字系统比较复杂,可采用“Top-down”的方法进行设计。首先把系统分为几个模块,每个模块再分为几个子模块,以此类推,直到易于实现为止。这种“Top-down”的方法能够把复杂的设计分解为许多简单的逻辑来实现,同时也适合于多人进行分工合作,如同用C语言编写大型软件一样。Verilog语言能够很好地支持这种“Top-down”的设计方法多层次结构电路的描述既可以采用文本方式,也可以用图形和文本混合设计的方式。用一个8位累加器的设计为例来说明这两种设计方式。1.图形与文本混合设计8位全加器moduleadd8(sum,cout,b,a,cin);output[7:0]sum;outputcout;input[7:0]a,b;inputcin;assign{cout,sum}=a+b+cin;endmodule8位寄存器modulereg8(qout,in,clk,clear);output[7:0]qout;input[7:0]in;inputclk,clear;reg[7:0]qout;always@(posedgeclkorposedgeclear)beginif(clear)qout<=0; //异步清0elseqout<=in;endendmodule2.文本设计moduleacc(accout,cout,accin,cin,clk,clear);output[7:0]accout;outputcout;input[7:0]accin;inputcin,clk,clear;wire[7:0]sum;add8accadd8(sum,cout,accout,accin,cin); //调用add8子模块reg8accreg8(accout,sum,clk,clear); //调用reg8子模块endmodule累加器顶层连接文本描述对于上面的模块调用,可采用位置对应的方式,即调用时模块端口列表中信号的排列顺序与模块定义时端口列表中的信号排列顺序相同;也可以采用信号名对应方式,此时不必按顺序,例如上面对reg8的调用:modulereg8(qout,in,clk,clear); //reg8的模块声明reg8accreg8(accout,sum,clk,clear); //调用方式1,位置对应Reg8accreg8(.qout(accout),.clear(clear),.in(sum),.clk(clk)); //调用方式2,信号名对应模块调用10.6进程行为模型的本质是进程。一个进程可以被看作一个独立的运行单元,它可能很简单,也可能很复杂,可以数字系统的行为看作很多有机结合的进程的集合。在Verilog语言中,描述进程的基本语句是always和initial。always过程反复执行其中的块语句,而initial过程中的语句块只执行一次。Verilog模块中有如下表示进程的方式。◆

always过程块◆

initial过程◆

assign赋值语句◆元件调用,如anda1(out,a,b);在进行数字系统设计的时候应注意◆将硬件电路的行为以合理的方式映射为一些进程,对每个进程,以最有效的方式进行设计,以最合理的方式描述。◆将组合逻辑实现的电路和用时序逻辑实现的电路应尽量分配到不同的进程中。◆一个进程中只允许描述对应于一个时钟信号的同步时序逻辑。◆进程必须由敏感信号的变化来启动,因此必须精心选择进程敏感表达式中的敏感变量。◆多个进程之间通过信号线进行通信,为达到多个进程协调运行,可设置一些握手信号10.7阻塞赋值与非阻塞赋值在可综合的硬件设计中,使用阻塞和非阻塞赋值语句时,应注意以下原则(1)当用“always”块来描述组合逻辑时,既可以用阻塞赋值,也可以采用非阻塞赋值,应尽量使用阻塞赋值。(2)对时序逻辑描述和建模,使用非阻塞赋值方式。(3)为锁存器(Latch)建模,应尽量使用非阻塞赋值。(4)若在同一个“always”过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻塞赋值方式。(5)在一个“always”过程块中,最好不要混合使用阻塞赋值和非阻塞赋值,虽然同时使用这两种赋值方式在综合时并不一定会出错,但对同一个变量不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会报错。(6)不能在两个个或两个以上的“always”过程块中对同一个变量赋值,这样会引发冲突,在综合时会报错。(7)使用$strobe显示非阻塞赋值的变量。10.8FPGA设计中毛刺的消除信号在FPGA器件内部通过连线和逻辑门时,都有一定的延时。因此多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的“毛刺”(Glitch),称为“冒险”(Hazard)现象。这些毛刺在电路板的设计中由于PCB走线时,存在分布电感和分布电容,所以许多毛刺能够被自然滤除,而在PLD内部没有分布电感和电容,这些毛刺将被完整地保留并向下一级传递,所以在FPGA设计中,如何消除毛刺就变得很重要。可通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器。还可根据D触发器的D输入端对毛刺不敏感的特点而消除毛刺,举例说明FPGA设计中毛刺的消除【例10.23】长帧同步时钟的产生modulelongframe1(clk,strb);parameterdelay=8;inputclk;outputstrb;regstrb;reg[7:0]counter;always@(posedgeclk)beginif(counter==255)counter<=0;elsecounter<=counter+1;endalways@(counter)beginif(counter<=(delay-1))strb<=1;elsestrb<=0;endendmodule毛刺例10.23的时序仿真输出波形【例10.24】引入了D触发器的长帧同步时钟的产生modulelongfram

温馨提示

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

评论

0/150

提交评论