您好,欢迎访问三七文档
第七章数字电路设计原则与VerilogHDL难点解析7.1时序电路基础组合逻辑电路的延时参数是不固定的,研究组合逻辑电路的延时没有实际意义。7.1.1同步电路时序分析1.时钟扭曲:同源时钟到达两个不同寄存器时钟端的时间差别。2.时钟抖动:在芯片的某一个给定点的时钟周期发生暂时的变化。即时钟周期在每个不同周期上可以缩短或者加长。解决方法:(1)采用全局时钟资源,增强时钟的抗干扰能力;(2)FPGA硬件设计时考虑适中的抗干扰布局布线;7.1.2同步电路核异步电路区别1.异步电路(1)电路核心是组合逻辑电路;(2)电路输出不依赖某一个时钟;(3)异步电路非常容易产生毛刺,且容易受环境影响;2.同步电路(1)电路核心是各种各样触发器(2)整个电路由时钟沿驱动(3)同步电路更适合现代FPGA设计(4)可以很好的避免毛刺影响(5)可以很好的利用先进的设计工具3.同步时序电路设计规则(1)尽可能在整个设计中只使用一个主时钟,同时只使用一个时钟沿;(2)所有输入、输出信号均应该通过寄存器寄存:寄存器接口当做异步接口考虑;(3)电路中所有寄存器、状态机在单板上电复位时,应处于一个已知的状态;(4)全部电路不能用同步设计时,原则上将电路分成多个局部同步电路设计,各局部电路接口采用异步电路考虑。7.2接口电路处理FPGA经常作为粘合逻辑,与别的芯片之间进行数据交换。为了保证电路的数据接口能够稳点的传输数据,需要专用的接口电路来处理外部芯片核FPGA之间良好的接口时序。接口电路为FPGA和外部芯片之间架起了一座桥梁。主要功能如下:(1)隔离外围电路和内部电路,不改变外围电路时序要求和相位要求。(2)统一内部电路系统时钟(3)可以绿波使内部电路接受的信号更加稳定7.2.1常用的接口模块1、三态门电路2、透明锁存器3、移位寄存器4、滤波电路5、异步FIFO模块(不明白empty和full以及读、写使能怎么使用)7.3阻塞赋值与非阻塞赋值三条原则:(1)分离电路中的组合逻辑和寄存器;(2)为寄存器选择合适的中间变量,在always语句内部采用非阻塞赋值(=);(3)在描述组合逻辑的always模块中用阻塞赋值(=);1、阻塞赋值:本次赋值结束之前,阻塞当前其他赋值任务。从上至下,依次执行,非同时。(语句描述顺序很关键)2、费阻塞赋值:always模块被激活时,非阻塞赋值的右边表达式就开始执行。当always所有表达式执行结束后,所有执行结果才赋值到左侧变量中。3、Example:阻塞:always@*beginy=a;y=y&b;y=y&c;end//最终结果为y=a&b&c;非阻塞:always@*beginy=a;y=y&b;y=y&c;end//最终结果为y=y&c;前两并没有作用7.4HDL代码风格1、补码最高位判断(例如求平方)普通处理方法:Assigndata_bar=~data_in+1;Assignsquare=(data_in[7])?(data_bar*data_bar):(data_in*data_in);1.1逻辑复用(通过提高速度换取面积)Modulesquare_u(inputwire[7:0]data_in,outputwiresquare[15:0]);Outputwire[7:0]data_reg;Assigndata_reg=(data_in[7])?(~data_in+1):data_in;Assignsquare=data_reg*data_reg;endmodule1.2逻辑复制(通过面积换取速度)2、if和caseIf具有优先级,case为并行不具有优先级。7.5Testbeach7.5.1、顺序执行语句For语句语法结构For([初始化];[结束条件];[步进])example:inteferi;Beginfor(i=0;i16;i=i+1)[过程语句][........]EndWhile语句;Repeat语句;7.5.2时序控制语句(1)普通时钟信号(2)占空比不是50%Example:parameterHI_time=6;ParameterLO_time=4;Regclk;AlwaysBegin#HI_timeclk=1;#LO_timeclk=0;End(4)固定数目时钟信号Parametercnt=4,period=10;Regclk;InitialBeginClk=0;Repeat(cnt)#(period/2)clk=~clk;End(5)相移时钟信号(6)异步复位信号(7)同步复位信号7.5.3系统函数和任务(1)仿真时间函数:$time,$stime,$realtime;(2)仿真控制任务:$finishi,$stop;(3)显示任务:$display,$wirte,$strobe,$monitor;(4)接口系统函数和任务:$fopen,$fclose;1(byte,字节)=8bit;因为Verilog是一种硬件描述语言,所以在写Verilog语言时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何去解释这个module.比如在决定是否使用reg定义时,要问问自己物理上是不是真正存在这个register,如果是,它的clock是什么?D端是什么?Q端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在register的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。同样,Verilog中没有“编译”的概念,而只有综合的概念。verilog设计注意事项1,敏感变量的描述完备性Verilog中,用always块设计组合逻辑电路时,在赋值表达式右端参与赋值的所有信号都必须在always@(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。Example1:inputa,b,c;rege,d;always@(aorborc)begine=d&a&b;/*d没有在敏感电平列表中,d变化时e不会立刻变化,直到a,b,c中某一个变化*/d=e|c;endExample2:inputa,b,c;rege,d;always@(aorborcord)begine=d&a&b;/*d在敏感电平列表中,d变化时e立刻变化*/d=e|c;end2,条件的描述完备性如果if语句和case语句的条件描述不完备,也会造成不必要的锁存器。Example1:if(a==1'b1)q=1'b1;//如果a==1'b0,q=?q将保持原值不变,生成锁存器!Example2:if(a==1'b1)q=1'b1;elseq=1'b0;//q有明确的值。不会生成锁存器!Example3:reg[1:0]a,q;....case(a)2'b00:q=2'b00;2'b01:q=2'b11;//如果a==2'b10或a==2'b11,q=?q将保持原值不变,锁存器!endcaseExample4:reg[1:0]a,q;....case(a)2'b00:q=2'b00;2'b01:q=2'b11;default:q=2'b00;//q有明确的值。不会生成锁存器!endcaseVerilog中端口的描述1,端口的I/O与数据类型的关系:端口的I/O端口的数据类型module内部module外部inputwirewire或regoutputwire或regwireinoutwirewire2,assign语句的左端变量必须是wire;直接用=给变量赋值时左端变量必须是reg!Example:assigna=b;//a必须被定义为wire!!********begina=b;//a必须被定义为reg!endVHDL中STD_LOGIC_VECTOR和INTEGER的区别例如A是INTEGER型,范围从0到255;B是STD_LOGIC_VECTOR,定义为8位。A累加到255时,再加1就一直保持255不变,不会自动反转到0,除非令其为0;而B累加到255时,再加1就会自动反转到0。所以在使用时要特别注意!以触发器为例说明描述的规范性1,无置位/清零的时序逻辑always@(posedgeCLK)beginQ=D;end2,有异步置位/清零的时序逻辑异步置位/清零是与时钟无关的,当异步置位/清零信号到来时,触发器的输出立即被置为1或0,不需要等到时钟沿到来才置位/清零。所以,必须要把置位/清零信号列入always块的事件控制表达式。always@(posedgeCLKornegedgeRESET)beginif(!RESET)Q=0;elseQ=D;end3,有同步置位/清零的时序逻辑同步置位/清零是指只有在时钟的有效跳变时刻置位/清零,才能使触发器的输出分别转换为1或0。所以,不要把置位/清零信号列入always块的事件控制表达式。但是必须在always块中首先检查置位/清零信号的电平。always@(posedgeCLK)beginif(!RESET)Q=0;elseQ=D;end结构规范性在整个芯片设计项目中,行为设计和结构设计的编码是最重要的一个步骤。它对逻辑综合和布线结果、时序测定、校验能力、测试能力甚至产品支持都有重要的影响。考虑到仿真器和真实的逻辑电路之间的差异,为了有效的进行仿真测试:1,避免使用内部生成的时钟内部生成的时钟称为门生时钟(gatedclock)。如果外部输入时钟和门生时钟同时驱动,则不可避免的两者的步调不一致,造成逻辑混乱。而且,门生时钟将会增加测试的难度和时间。2,绝对避免使用内部生成的异步置位/清零信号内部生成的置位/清零信号会引起测试问题。使某些输出信号被置位或清零,无法正测试。3,避免使用锁存器锁存器可能引起测试问题。对于测试向量自动生成(ATPG),为了使扫描进行,锁存器需要置为透明模式(transparentmode),反过来,测试锁存器需要构造特定的向量,这可非同一般。4,时序过程要有明确的复位值使触发器带有复位端,在制造测试、ATPG以及模拟初始化时,可以对整个电路进行快速复位。5,避免模块内的三态/双向内部三态信号在制造测试和逻辑综合过程中难于处理.Verilog中两种不同的赋值语句不阻塞(non-blocking)赋值语句:always@(posedgeclk)beginb=a;c=b;end生成两个触发器。阻塞(blocking)赋值语句:always@(posedgeclk)beginb=a;c=b;end生成一个触发器。行为模块:在仿真时其表现的功能与某实体逻辑电路完全一致的VerilogHDL模块,但并没有手段生成对应的门级逻辑电路与之对应。-用于系统分割时验证各部分的功能指标分配是否合理;-在仿真时可用于替代与所设计电路系统相连接的现成可购得的外围电路;-用于产生测试信号和数据输入到所设计电路系统并接收它的应答信号和输出以验证其功能。可综合模块:可通过综合工具,自动地转换为门级逻辑电路的VerilogHDL模块。它的仿真可以在两个层次上进行,行为级和门级。-想要设计的用硬线逻辑构成的电路系统;-由基本的逻辑器件为基础所构成的各种层次的结构模块;-综合器能理解并能将其编译为门级逻辑的模块;-对一般的综合器而言,单纯的RTL级VerilogHDL模块以及RTL和结构型混合HDL模块。时序分析的常用概念:1、ClockSetupTime(tsu):所谓时钟建立时间就是指时钟到达前,数据和使能已经准备好的最小时间间隔。Altera的tsu定义如下:tsu=DataDelay–Cloc
本文标题:FPGA设计重难点
链接地址:https://www.777doc.com/doc-1450249 .html