版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《现代EDA技术及应用》教学课件张俊涛电子信息与人工智能学院第7章EDA技术深入应用现代EDA技术及应用1基础篇1.EDA技术基础2.VerliogHDL3.QuartusPrime23应用篇4.常用数字器件的描述5.IP的应用6.状态机设计方法提高篇7.EDA技术深入应用♫学习和重现♫应用要素硬件语言软件(第1章)(第2章)(第3章)本章内容7.2综合与优化设计7.4VerilogHDL数值运算7.1代码编写规范7.3时序分析基础7.5串口通信收发机的设计7.1代码编写规范7.1.1标识符规范
应用HDL设计数字系统时,清晰、规范的描述代码是确保模块功能与性能的关键因素之一。
优秀HDL代码的编写目标是:(1)简洁规范,具有良好的的可阅读性和可维护性,便于分析与调试;(2)紧贴硬件,确保模块功能正确,并且易于综合出性能优良的电路;(3)结构清晰,具有良好的可重用性,能够提高设计效率。
标识符除了满足Verilog标识符命名的基本规定外,应该能够见文知义,即标识符包含命名的含义和有效状态等信息。(1)采用能够反映对象功能和特征的单词或者短语作为标识符,简短易懂,以增强代码的可读性。1.标识符取名规范
在数字系统设计中,顶层文件建议使用“对象_功能_top”的形式命名(EX:dds_top.bdf,VGA_game_top.v),控制文件建议使用“对象_ctrl”的形式命名(EX:AD_controller.v),测试文件建议使用“对象_功能_tst”的形式命名(EX:transceiver_tst.v),而参数文件建议使用“对象_para”的形式命名等。
对于模块端口的取名,建议使用clk/sys_clk/VGA_clk/DDS_clk/clk50MHz等形象的标识符表示模块的时钟,用data_in/din和data_out/dout分别表示数据的输入端口和输出端口,用cnt8b_q表示8位二进制计数器变量和sync_reg、AD_reg等寄存器。(2)长标识符既不方便记忆,也不方便书写,而且容易导致拼写错误。因此,对于较长的标识符,建议采用缩略形式。(4)建议给标识符添加有意义的后缀,使标识符的含义更加明确。常用标识符的后缀参考定义如表所示。(3)标识符由多个单词组成时,词和词之间用下划线隔开,以增加标识符的可阅读性。例如:mem_addr,data_in,mem_wr,mem_ce。2.标识符大小写规范(1)常量和参数建议采用大写字符串表示。例如,①
定义存储器的位宽和深度:parameterWIDTH=8,DEPTH=256;
②定义状态机的内部状态:localparamST0=4'b0001,
ST1=4'b0010,
ST2=4'b0100,
ST3=4'b1000;(2)信号名和变量名建议采用小写字母。wire[2:0]addr;reg[3:0]curr_state,next_state;reg[WIDTH-1:0]sin_rom[DEPTH-1];3.标识符缩写规范
由多个单词的首字符缩写构成的单词应该大写,无论处于标识符的任何位置。例如,ROM_addr中ROM,rd_CPU_en中的CPU等。另外,必须注意标识符(的大小写)在整个工程项目中命名的一致性,即同一线网或者变量在不同层次的模块中的命名应该保持一致,以方便文档的阅读和交流。例如,定义ROM的地址、时序电路的状态变量和存储器变量:7.1.2代码书写规范(1)每个模块保存为一个单独的文件,并且文件名与模块名严格一致。
(2)一个模块建议只使用一个时钟,并添加前缀或后缀加以说明。例如,sys_clk,DDS_clk、VGA_clk和clk2p8Hz等。在多时钟域的数字系统设计中涉用到跨时钟域时,建议设计专门的模块做时钟域的隔离。
always@(posedgeVGA_clk)begin
reg_x2<=reg_x1;
reg_x1<=DDS_x;reg_y2<=reg_y1;
reg_y1<=DDS_y;
end
(3)基于可阅读性和可移植性方面考虑,不要在代码中直接写特定数值,尽可能使用宏定义指令“`define”或者参数定义语句paramater/localparam定义常量和参数。
宏定义指令“`define”写在模块声明之前,用于跨模块的常量和参数定义,对同时编译的多个文件起作用。
参数定义语句paramater/localparam写在模块内部,用于对模块内部的参数进行定义,不传递参数到模块外。(5)在表达式的适当位置加入空格有利于代码清晰易读,包括赋值操作符的两边和双目运算符的两边,但单目运算符和操作数之间不加空格。
(4)在代码的不同功能段之间插入空行,既可以避免代码拥挤,又能提高代码的可阅读性。
例如:a<=b调整为:a<=b;
c<=a+b调整为:c<=a+b;
if(
a==b
)...
a<=~a&c;
(6)关于语句的对齐和缩进,建议遵守以下规定:
②
使用Tab键调整对齐,不要连续使用空格。由于不同编辑器对Tab键的解释不同,因此需要在编辑器中预先设置Tab键为4个字符宽度。
③使用多重条件语句if...elseif...else时,else必须与if逐层配套对齐。
(7)
代码中应加入注释以增强代码的可阅读性。建议注释内容不少于30%的代码篇幅。另外,代码中尽量避免使用中文注释,因为中文注释错位时,会产生非法的ASICII码导致编译时发生语法错误。
①
严格采用缩进结构。采用缩进结构有利于看清代码的层次,增加代码的可阅读性。(8)模块的声明规范。进行模块声明时,建议遵守以下规定:
①
在系统设计阶段应该为每个模块进行命名,模块名应具有清晰明确的含义,能够表示模块的主要功能。例如:ALU(ArithmeticLogicalUnit)、DMI(DataMemoryInterface)和DEC(Decoder)等。
②
无论模块是否需要仿真,都应在模块声明前添加“`timescale”指令说明时间单位和仿真精度;
③
对于复杂数字系统设计,模块声明建议采用ANSI格式,即将端口类型定义合并在模块声明中进行,同时对端口名的含义和作用附加简要的注释。
④
模块中的端口列表应该按照时钟信号、复位信号、使能和控制信号、数据输入以及数据输出的顺序进行排列,同时附加必要的注释。对于全局时钟和对全局复位信号等系统级信号,建议使用字符串Sys/sys开头的标识符命名,如sys_clk和SysRst_n等。
⑤
低电平有效的端口后一律加"_n",以明确端口为低电平有效。
⑥
所有的端口名应严格对齐。必要时,使逗号、冒号和注释也对齐。
`timescale1ns/10psmodelverilog_template(//globalsignalsinputclk_50,//50MHzclockinputrst_n,//globalreset//userinterfaceinput[17:0]iSW;output[17:0]oRed_LED;...)...endmodule(9)模块的例化规范。对模块进行例化时,需要注意以下几点:
①
每个模块在例化前应添加模块的功能说明;
②
模块实例名建议采用“Un_xx”格式,其中n为例化序号,xx为例化模块名;
③
实例模块的端口名和例化模块端口名的连接列表应完全对齐;uartu_uart(
.clk(clk_100M),
.rst_n(sys_rst_n),
.vld(bt_data_out_vld),
.data_in(bt_data_out),
.uart_out(uart_tx),
.uart_in(uart_rx),
.vld(uart_data_out_vld),
.uart_out(uart_data_out),
.rdy_in(uart_in_rdy)
);
④
相关信号应写在一起,并且有注释。例如,对于串行接口模块uart.v的模块例化格式参考如下:
10.测试平台文件的编写规范。
编写testbench需要完成三项任务:(1)
对被测试设计单元的顶层接口进行例化;(2)
产生测试激励信号;(3)
显示被测模块的输出。reg[7:0]q;always@(posedgeclk)beginif(rst)q<=8'b0;elseif(ld)q=din;
elsecase(sel)
2'b01:q<=q<<1;
2'b10:q<=q>>1;
2'b11:q<=din;
default:q=q;endcaseendendmodule`timescale1ns/10ps
moduleshift_reg(clk,rst,ld,sel,din,q);inputclk;inputrst;inputld;input[7:0]din;input[1:0]sel;output[7:0]q;EX:①
描述8位移位寄存器模块:②应用modelsim进行仿真分析时,其testbench描述模板参考如下://建立时钟
initialbegin
tb_clk=0;
forever
#50tb_clk=~tb_clk;
end
//描述输入激励
initialbegin
tb_rst=1;
tb_din=8'b00000000;
tb_ld=0;
tb_sel=2'b00;
#200
tb_rst=0;
tb_ld=1;#200tb_din=8'b00000001;#100tb_sel=2'b01;tb_load=0;
moduleshift_reg_tb;
regtb_clk;
regtb_rst;
regtb_ld;
reg[7:0]tb_din;
reg[1:0]tb_sel;
wire[7:0]tb_q;
//被测试模块例化
shift_regdut(
.clk(tb_clk),
.rst(tb_rst),
.ld(tb_ld),
.din(tb_din),
.sel(tb_sel)
.q(tb_q)
);
#200
tb_sel=2'b10;
#1000$stop;
end
//输出仿真结果
initialbegin$timeformat
(-9,1,"ns",12);$display("timeclock
resetloadqdinsel");$monitor("%t%b%b%b
%b%b%b",$realtime,
tb_clk,tb_rst,tb_ld,
tb_q,tb_din,tb_sel);
endendmodule
为了保存设计成果,便于分析和交流,系统设计过程中应编写详尽的过程管理文档,在每一个模块的开头应注明文件名、功能描述、引用模块、设计者、设计时间及版权信息等。7.1.3文档管理规范//********************************//Title:(所属项目)//Project:(工程名)//File:(文件名)//Author:(作者)//Organization:(单位或团队)//LastUpdate:(最新更新日期)//Platform:(开发平台)//Simulator:(仿真工具)//Targets:(目标器件)//Description:模块功能描述)//---------------------------//Revision:(修订版本)//RevisionNumber:(修订号)//Date:(修订日期)//Modifier:(修订人)//Description:(修订内容描述)//******************************7.2综合与优化设计优化主要包括4个方面:(1)综合优化综合优化使得设计系统在FPGA中的映射得到最大优化。(2)布局布线优化
在布局布线过程中,合理的约束会大大提高整个系统的布局布线效果;(3)设计优化
在设计阶段规划整个系统的架构,利用FPGA的特点尽可能简化设计;(4)静态时序分析
静态时序分析用于在布局布线后检查整个工程的时序,找出最差的路径,进行一定的调整和修改来优化系统时序;Speed是以提高系统的工作速度为目标进行优化,Area
是以节约占用的逻辑资源为目标进行优化,而Balanced
选项则是速度与占用资源的折中选项。7.2.1
QuartusPrime优化设置1.分析与综合设置
逻辑综合是将HDL代码转换成不含布局布线信息并且能够映射(map)到门级电路过程。因为逻辑综合不包含布局布线的信息,所以综合后的时序仅限于转换后的门级电路或者器件内部逻辑单元或者节点间逻辑单元级数等时延信息,而对于FPGA内部互联的时延是无法分析的。
2.物理综合优化
物理综合是通过改变网表的布局(placement)优化综合结果,在不改变设计功能的情况下调整网表的布局或者修改增加部分节点从而达到优化设计性能和设计资源利用率等目的。用来优化资源(area)用来优化性能(performance)(1)针对性能的物理综合优化选项
PerformPhysicalsynthesisforcombinationiallogic:用于优化组合逻辑关键路径的逻辑层数。
PerformRegisterRetiming:
通过移动寄存器中组合逻辑中的位置来平衡寄存器之间的路径时延以提升系统性能。
Performautomaticasynchronoussignalpipelining:
是通过自动在异步信号路径上插入流水寄存器来改善异步信号的建立时间和保持时间。
Performregisterduplication:
是通过寄存器复制优化多扇出长路径上的时序,从而提升系统的性能。针对面积的物理综合优化选项适用于适配(fit)阶段的优化,其功能就是使得设计优化可以适配到目标器件。
(2)针对面积的物理综合优化选项
effortlevel:不同级别的差异主要体现在了编译时间的长短,与性能的提升呈反比的关系。
LogictoMemoryMapping:
是指在适配时将部分逻辑移到未使用的Memory里,同样也是在“no-fit”事件发生时才会起作用。
适配设置包括保持时序优化和多拐角时序优化。
保持时序优化(Optimizeholdtiming)允许适配器通过在合适的路径中添加延迟,从而实现保持时序的优化。关闭该选项时,则不会对任何路径进行优化。
多拐角时序优化(Optimizemulti-cornertiming)用于控制适配器是否对设计进行优化以满足所有拐角的时序要求和操作条件。使用这项功能,必须使能时序逻辑优化。3.适配设置PhysicalSynthesisforCombinationalLogic:
是指适配时针对组合逻辑的优化,尽可能地减少组合逻辑以提高资源利用率,只有在“no-fit”事件发生时才会起作用。
Extraeffort模式需要的编译时间比较长,但可以提高系统的最高工作频率;Off模式可以节省约50%的编译时间,但会使最高工作频率有所降低;Normalcompilation模式在达到设计要求的条件下,自动平衡最高工作频率和编译时间7.2.2描述方法对综合的影响1.操作符的应用差异对于代码(1)input[3:0]din;outputdout;assigndout=(xin==4'b0);//关系操作符若应用代码(2)input[3:0]din;outputdout;assigndout=(xin==4'b0)?1'b1:1'b0;//条件操作符若应用代码(3)input[3:0]din;outputdout;assigndout=~|xin;//缩位或非应用代码(4)input[3:0]din;outputdout;assigndout=~(din[3]+din[2]+din[1]+din[1])//或非逻辑
if...elseif...语句隐含有优先级的关系,综合出的电路通常为级联结构的优先编码器,传输延迟时间长,建议输入信号有优先级的的场合使用。case语句每个分支是平行的,综合为多路选择器,电路结构规整,传输延迟时间短,因而电路的工作速度快。2.条件语句和分支语句的应用差异moduledecoder_2to4(en,bincode,y);inputen;input[1:0]bincode;output[3:0]y;reg[3:0]y;always@(enorbincode)if(en)beginif(bincode==2'b00) y=4'b0001;
elseif(bincode==2'b01)
y=4'b0010;
elseif(bincode==2'b10)
y=4'b0100;
elseif(bincode==2'b11)
y=4'b1000;elsey=4'b0000;endelsey=4'b0000;endmodule应用多重条件语句描述2-4线译码器:2-4线译码器综合出的RTL电路:always@(enorbincode)if(en)case(bincode)2'b00:y=4'b0001;2'b01:y=4'b0010;2'b10:y=4'b0100;
2'b11:y=4'b1000;default:y=4'b0000;
endcase
elsey=4'b0000;endmodule 若改用分支语句描述,其功能描述语句为
上述两种描述方式从综合效果看,占用的硬件资源相同,但应用case语句比用条件语句综合出的电路传输延迟时间小,因此,在速度优化的项目中,使用case语句效果更好。但需要注意的是,无论是用if语句还是用case语句描述组合电路时,一定要防止综合出不必要的锁存器,这就要求:(1)在case语句中配套使用default语句;(2)在赋值表达式中,参与赋值的所有量(线网/变量)都必须在always语句的事件列表中列出;(3)if语句判断表达式中的所有量都必须在always语句中的事件列表中列出。
Verilog支持行为描述、数据流描述和结构描述三种方式描述应用电路。描述方式不同,综合占用的资源不同,综合出的电路性能也有差异。明晰这些描述方式之间的差异,对于优化电路的性能有着至关重要的影响。2.描述方式对综合电路的影响
对于具有使能端的3-8线译码器,若应用行为方式描述,则Verilog描述代码参考如下:moduledec3_8a(s_n,bincode,y_n);inputs_n;input[2:0]bincode;outputreg[7:0]y_n;always@(s_n,bincode)if(!s_n)case(bincode)
3'b000:y_n=8'b11111110;3'b001:y_n=8'b11111101;3'b010:y_n=8'b11111011;3'b011:y_n=8'b11110111;3'b100:y_n=8'b11101111;3'b101:y_n=8'b11011111;3'b110:y_n=8'b10111111;3'b111:y_n=8'b01111111;default:y_n=8'b11111111;endcase
elsey_n=8'b11111111;endmodule
moduledec3_8b(s_n,a,y_n);inputs_n;input[2:0]a;output[7:0]y_n;assigny_n[0]=~((~s_n)&(~a[2])&(~a[1])&(~a[0]));assigny_n[1]=~((~s_n)&(~a[2])&(~a[1])&a[0]);assigny_n[2]=~((~s_n)&(~a[2])&a[1]&(~a[0]));assigny_n[3]=~((~s_n)&(~a[2])&a[1]&a[0]);assigny_n[4]=~((~s_n)&a[2]&(~a[1])&(~a[0]));assigny_n[5]=~((~s_n)&a[2]&(~a[1])&a[0]);assigny_n[6]=~((~s_n)&a[2]&a[1]&(~a[0]));assigny_n[7]=~((~s_n)&a[2]&a[1]&a[0]);endmodule若采用数据流方式描述,Verilog参考代码如下:moduledec3_8c(s_n,a,y_n);inputs_n;input[2:0]a;output[7:0]y_n;nandU0(y_n[0],~s_n,~a[2],~a[1],~a[0]);nandU1(y_n[1],~s_n,~a[2],~a[1],a[0]);nandU2(y_n[2],~s_n,~a[2],a[1],~a[0]);nandU3(y_n[3],~s_n,~a[2],a[1],a[0]);nandU4(y_n[4],~s_n,a[2],~a[1],~a[0]);nandU5(y_n[5],~s_n,a[2],~a[1],a[0]);nandU6(y_n[6],s_n,a[2],a[1],~a[0]);nandU7(y_n[7],~s_n,a[2],a[1],a[0]);endmodule若采用结构方式,调用Verilog基元进行描述,参考代码如下:7.2.3优化设计方法EDA优化设计包含两层含义:一是在满足系统性能要求的情况下,尽可能节约芯片面积;二是占用面积一定的情况下,尽可能提升系统的性能。1.FPGA设计的基本原则
(1)速度与面积的平衡与互换
QuartusPrime软件中的分析与综合设置(Analysis&SynthesisSettings)页面中的Speed、Balanced和Area选项,分别对应于速度优先、性能折衷和面积优先三种综合优化选择,就是速度与面积原则的具体体现。(2)硬件原则
应用VerilogHDL描述数字电路时,不能像写C程序那样,片面追求代码的简洁,而应该时时刻刻牢记Verilog描述的是硬件电路,清楚描述代码与硬件电路的相关关系。moduleencode_83(//注:本段代码来源于网络inputwire[7:0]x,//注:8路高/低电平输入outputreg[2:0]y,//注:3位二进制码输出outputrege);//注:有无编码输入标志
integeri;integerj=0;always@(*)begin//注:这种隐式敏感量列表方式不推荐使用for(i=0;i<8;i=i+1)beginif(x[i]==1)//注:x[i]=1时更新输出y<=i;else//否则,只将j加1
j=j+1;end
if(j==8)//j等于8时表示无编码信号输入
e<=1;//无编码标志e设置为1
else
e<=0;endendmodule本段代码来源于网络
上述代码不适合于综合成硬件电路,而且是错误的。因为:(1)上述代码综合出了时序电路,而不是组合逻辑电路;(2)从资源消耗上看,应用条件语句和分支语句描述的8-3线优先编码器综合后均占用了(EP4CE115F29C7)10个逻辑单元,而上述代码综合后占用了703个逻辑单元,资源占用是前两者的70倍!因此,应用VerilogHDL时,除了在编写测试平台文件testbench中,描述仿真测试激励时可以使用for循环语句外,建议在可综合电路设计中应尽量避免使用循环语句,而是选用if语句和case语句来描述类似的逻辑。
其次,用HDL描述数字电路时,应对所要描述的硬件电路的结构有清晰的概念和构想,选择正确的描述方法,并用适当的代码描述出来。因为综合软件对HDL代码在进行综合时,综合出的硬件电路会因为描述方法和描述代码的不同而不同,从而直接影响着系统的性能。若定义input[3:0]a,b,c,d,e,f,g,h;output[5:0]sum;实现加法时,应用代码assignsum=((a+b)+(c+d))+((e+f)+(g+h));和直接使用代码assignsum=a+b+c+d+e+f+g+h;(3)系统原则
模块化设计是系统原则的一个很好体现,是自顶向下、分工协作设计思路的具体体现,是复杂系统的推荐设计方法。(4)同步原则时序电路有异步和同步两种实现方法。同步电路工作速度快,可靠性高,但电路比异步电路复杂。异步电路结构简单,但容易产生竞争-冒险,因而可靠性不高。对于同步电路设计,稳定可靠的时序设计必须遵从以下两个基本原则:
(1)在时钟的有效沿到达前,数据输入至少已经稳定了建立时间之久,这条原则简称满足建立时间原则;(2)在时钟的有效沿作用后,数据输入至少还要稳定保持时间之久,这条原则简称满足保持时间原则。(1)串-并转换方法。串行化是指把消耗资源大、反复使用的逻辑电路分割出来,在时间上共享该电路,采用流水线方式实现相同的功能。2.常用优化设计方法
设a0~a3和b0~b3均为4位无符号二进制数,应用并行方式实现乘加运算y=a0*b0+a1*b1+a2*b2+a3*b3时,Verilog描述代码参考如下:需要4个乘法器和3个加法器。消耗148个LEmodulep_mutl_add(input[3:0]a0,a1,a2,a3,input[3:0]b0,b1,b2,b3,output[7:0]yout);assignyout=a0*b0+a1*b1+a2*b2+a3*b3;endmodulemodules_mutl_add(inputclk,input[3:0]a0,a1,a2,a3,input[3:0]b0,b1,b2,b3,outputreg[7:0]yout);reg[1:0]cnt;reg[3:0]atmp,btmp;wire[7:0]mult_tmp;assignmult_tmp=atmp*btmp;always@(posedgeclk)cnt<=cnt+2'b01;always@(*)case(cnt)2'b00:beginatmp=a0;btmp=b0;end2'b01:beginatmp=a1;btmp=b1;end2'b10:beginatmp=a2;btmp=b2;end2'b11:beginatmp=a3;btmp=b3;enddefault:beginatmp=a0;btmp=b0;endendcasealways@(posedgeclk)yout<=yout+mult_tmp;endmodule上述代码应用一个乘法器实现,只消耗了56个逻辑单元。
若将电路中的组合逻辑块拆分成两个传输延迟时间大致相等的组合逻辑块,并在两个组合逻辑块之间插入流水线寄存器,如下图所示,就构成了流水线结构的同步时序电路。tCLK(min)=tCO+TLOGIC+tSU(2)流水线设计思想
流水线(pipelining)设计的基本思想对时序电路中传输延迟时间较大的组合逻辑块进行拆分,将原本在一个时钟周期完成的组合逻辑分割成多个较小的逻辑块,中间插入流水线寄存器,使其在多个时钟周期内完成,目的是提升这部分电路的工作频率,从而提高整个系统的性能。
设拆分后的两个组合逻辑块的传输延迟时间分别用T1和T2表示,则tLOGIC=T1+T2,若T1=T2,则T1=T2=(1/2)tLOGIC
流水线结构同步电路的最小时钟周期为tCLK(min)=tCO+T1+tSU=tCO+(1/2)tLOGIC+tSU
故最高时钟频率为fCLK(max)=1/tCLK(min)=1/(tCO+(1/2)tLOGIC+tSU)若T1=T2>>(tCO+tSU),则上式可以简化为fCLK(max)=1/tCLK(min)=1/(tCO+(1/2)tLOGIC+tSU)≈2/tLOGIC
上式说明:在忽略tCO和tSU,流水线结构的同步电路的最高工作频率约为原电路最高工作频率的两倍。
需要注意的是,应用流水线结构能够提高同步电路的性能,但会产生了输入-输出的延迟。这是因为流水线的每一级输出相对于前一级输出,都会延迟一个时钟周期。因此,增加n级流水线,输出就会延迟n个时钟周期。
流水线思维方式的扩展应用是均衡同步电路的时序。
当两个组合逻辑块的传输延迟时间分别为15ns和5ns,假设触发器的时钟到输出时间和建立时间均为5ns,则同步电路的最高工作频率为
1/(5ns+15ns+5ns)=40MHz
如果能将两个组合逻辑块的传输延迟时间调整为10ns和10ns,则电路的最高工作频率可以提升到
1/(5ns+10ns+5ns)=50MHz即经过时序均衡后,同步电路的工作速度提升了25%。(3)寻找关键路径
关键路径(CriticalPath)是指关键信号的传输路径,或者电路中传输延迟时间最大的组合逻辑路径。如果能够减小关键路径的传输延迟时间,就可以有效地提高时序逻辑电路的工作频率。
对于上图所示电路,从输入到输出之间有3条信号传输路径,设每条路径的传输延迟时间分别用td1、td2和td3表示。若td1大于td2和td3,则传输延迟时间为td1的信号路径称为关键路径,优化的主要目标是减小td1,才能有效地提高电路的工作速度。(CriticalPath)EX:对于带有功能控制端的2选一数据选择器
Y=D0A1'A0'EN+D1A1'A0EN+D2A1'A0EN+D3A1A0EN,因为EN=0时Y=0,
EN=1时Y=D0A1'A0'+D1A1'A0+D2A1'A0+D3A1A0,因此信号EN为关键路径。wireatmp,btmp,ctmp,dtmp;assignatmp=D0&&!A1&&!A0&&EN;assignbtmp=D1&&!A1&&A0&&EN;assignctmp=D2&&A1&&!A0&&EN;assigndtmp=D3&&A1&&A0&&EN;assigny=atmp||btmp||ctmp||dtmp;若应用代码描述,则关键信号EN的路径为两级门电路的传输延迟时间。
对于复杂工程,可以应用QuartusPrime中的时序分析工具TimingAnalyzer可以分析电路的时序信息,用底层编辑器ChipPlanner查看布局布线,查找和识别关键路径,对设计进行少量修补。wireatmp,btmp,ctmp,dtmp;assignatmp=D0&&!A1&&!A0;assignbtmp=D1&&!A1&&A0;assignctmp=D2&&A1&&!A0;assigndtmp=D3&&A1&&A0;assigny=(atmp||btmp||ctmp||dtmp)&&EN;(4)乒乓操作若应用代码进行描述,则关键信号EN的路径减小为一级门电路的传输延迟时间。Y=(D0A1'A0'+D1A1'A0+D2A1'A0+D3A1A0)EN,
“乒乓操作”的工作原理是:前端通过数据分配器将输入的数据流交替配到两个数据缓冲模块,第一个时钟时将输入的数据存入到“数据缓冲模块1”,第2个时钟将输入的数据存入到“数据缓冲模块2”,依次反复进行。后端再应用数据选择器将两个数据缓冲模块合并为输出数据流,依次反复循环。
“乒乓操作”是串并转化思想的具体体现,常应用于用低速的硬件电路实现高速数据流的处理。乒乓操作的本质是串并转换,将高速的串行数据并行化,利用面积换速度,巧妙运用乒乓操作可以达到用低速模块处理高速数据流的效果。7.3时序分析基础
时序分析就是对时序电路进行时序检查,通过分析电路中所有寄存器之间的路径延迟以检查电路的传输延迟是否会导致触发器的建立时间或者保持时间违例,检查触发器的异步端口信号变化是否满足恢复时间和撤除时间的要求,以及分析时钟的传输延迟以检查时钟树的偏移和延时等情况。通过时序约束文件,告诉EDA软件,该设计应该达到的时序指标,指导EDA软件优化布局布线以达到时序设计要求。
时序分析包括静态时序分析和动态时序分析两种类型。
静态时序分析(StaticTimingAnalyzier,简称STA)就是采用穷尽分析方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。静态时序分析不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计,因此静态时序分析已经越来越多地被用到数字集成电路设计的验证中。
建立时间(setuptime)是指时钟脉冲的有效沿到来时,触发器的输入信号必须提前到达并且保持稳定的最短时间,用tSU表示。7.3.1触发器的动态参数1.建立时间2.保持时间
保持时间(holdtime)是指时钟脉冲的有效沿作用后,触发器的输入信号还必须维持稳定的最短时间,用tH表示。3.时钟到输出时间
时钟到输出时间(clock-to-outputtime)是指从时钟的有效沿开始算起,到触发器完成状态更新的延迟时间,用tCO表示。4.恢复时间和撤除时间
触发器的异步复位信号与时钟脉冲之间关系用恢复时间和撤除时间两个参数来定义。
恢复时间(recoverytime)是指在时钟脉冲的有效沿到来之前,异步复位信号应该恢复无效状态的最短时间,用trec表示。
撤除时间(removetime)是指在时钟脉冲的有效沿作用之后,异步复位信号应该保持无效状态的最短时间,用trem表示。7.3.2同步时序电路分析
同步时序逻辑电路内部所有的寄存器共享同一个时钟源,寄存器的状态更新在严格的时钟控制下完成的。为了避免同步电路产生时序违例,同步电路中时钟脉冲的周期与触发器的建立时间、保持时间之间应满足一定的关系。1.时钟脉冲的特性
在实际的数字系统中,时钟脉冲受到传输路径、线路负载以及环境温度等因素的影响,会出现时钟偏斜、时钟抖动和占空比失真等现象。
时钟偏斜(clockskew)是指同源时钟到达两个寄存器时钟端的时间差异,用tSKEW表示,分为正偏斜和负偏斜两种类型。
设时钟CLK1和CLK2来源于同一时钟CLK。正偏斜是指CLK2滞后于CLK1,即tSKEW>0,如图所示。负偏斜是指CLK2超前于CLK1,即tSKEW<0。
时钟抖动(clockjitter)是指时序电路中某些触发器的时钟周期发生了变化,分为周期抖动和周期间抖动两种。
周期抖动(periodjitter)是指时钟脉冲的周期相对于理想周期的偏差。对周期抖动进行差分运算,就可以得到周期间抖动(cycle-cyclejitter)。
占空比失真是指时钟信号在传输过程中由于时延等因素的影响,造成脉冲宽度发生了变化,即脉冲高电平和低电平持续时间的比例发生了改变。在高速电路中,由占空比失真引起的问题很普遍。例如,DDR系列片外高速存储器在时钟的上升沿和下降沿都需要对信号采样,占空比失真会改变系统的时序裕量,造成数字信号的失真。2.同步时序电路分析
将FF1称为源寄存器(sourceregister),将CLK1称为源时钟或者发送时钟,同时将CLK1的有效沿称为发送沿(launchedge);
将FF2称为目的寄存器(destinationregister),将CLK2称为目的时钟或者捕获时钟,同时将CLK2的有效沿称为捕获沿(captureedge)。
发起沿和捕获沿两者相差一个时钟周期。
设同步时序电路时钟脉冲的周期用tCYCLE表示。
用tSU_SLACK表示目的寄存器的建立时间裕量,收tSU_SLACK可以表示为tSU_SLACK=tCYCLE-(tCO+tLOGIC)-tSU
当tSU_SLACK≥0时,说明目的寄存器的输入数据D2相对于CLK2的接收沿到达触发器并且稳定的时间满足触发器建立时间的要求。
考虑到时钟CLK2与CLK1之间存在正偏斜时,如图所示,则建立时间裕量可表示为:tSU_SLACK=tCYCLE-(tCO+tLOGIC)-tSU+tSKEW
由于tSKEW>0,因此建立时间裕量tSU_SLACK增加,说明正偏斜对建立时间是有益的。(1)建立时间裕量分析(2)保持时间裕量分析
如果不考虑时钟偏斜,在时钟CLK2的有效沿作用后,新的数据D2需要经过tCO+tLOGIC时间才到达目的寄存器的输入端,如图所示。因此,要求触发器的保持时间为tH时,如果tCO+tLOGIC≥tH,即满足保持时间要求。
如果用tH_SLACK表示目的寄存器的保持时间裕量,则tH_SLACK可以表示为:tHOLD_SLACK=tCO+tLOGIC-tH
考虑时钟CLK2与CLK1之间存在正偏斜时,如图所示,则保持时间裕量tH_SLACK可表示为:tHOLD_SLACK=tCO+tLOGIC-tHOLD-tSKEW
由上述分析可知:时钟发生正偏斜时对建立时间有益,但对保持时间有害;反之,如果时钟发生负偏斜时则对保持时间有益,但对建立时间有害。因此,对于同步时序电路,最好是使时钟脉冲无偏斜,即tSKEW=0,这样对建立时间和保持时间都没有影响,这就要求同步时序电路中所有触发器的时钟不但来源于同一时钟,并且时钟网络具有良好的特性。(3)最高工作频率分析
当tSU_SLACK=0时,对应的时钟脉冲周期最小,此时时序电路的工作频率最高。由于tSU_SLACK=tCYCLE-(tCO+tLOGIC)-tSU,令tSU_SLACK=0时,即可以推出该同步时序电路可靠工作时,时钟脉冲的最小周期为
tCYCLE(min)=tCO+tLOGIC+tSU因此电路工作的最高时钟频率为
fmax=1/tCYCLE(min)=1/(tCO+tLOGIC+tSU)7.3.3TimingAnalyzer的应用
TimingAnalyzer是内嵌于QuartusPrime开发环境中的时序分析工具,能够提取同步电路中存在的所有时序路径,计算信号在这些路径中的传输延迟时间,根据指定的时序约束检查信号的建立时间和保持时间是否满足设计要求,通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。
应用TimingAnalyzer进行时序分析的基本流程如图所示,分为建立和综合工程、指定时序需求、在工程中添加.sdc约束文件,重新编译工程以及查看时序分析报告等主要步骤。
本节以例4-17中描述的计数器模块HC160.v为例,讲述在QuartusPrime开发环境下,应用TimingAnalyzer进行时序分析的基本方法与步骤。moduleHC160(clk,rd_n,ld_n,ep,et,d,q,co);
inputwireclk;
inputwirerd_n,ld_n,ep,et;
inputwire[3:0]d;
outputreg[3:0]q;
outputwireco;
//进位逻辑
assignco=((q==4'b1001)&et);
//计数过程
always@(posedgeclkornegedgerd_n)if(
!rd_n
)q<=4'b0000;elseif(
!ld_n
)q<=d;
elseif(ep&et)
if(q==4'b1001)
q<=4'b0000;
elseq<=q+1'b1;endmodule【例4-17】74HC160的功能描述。1.建立和编译工程
全编译完成后,展开Tasks任务栏下TimingAnalyzer中的Clocks项,可以看到图所示的时钟参数设置:表示在未指定时序约束的情况下,TimingAnalyzer默认计数器的时钟周期(Period)为1ns,频率(Frequency)为1000MHz,在0时刻上升(Rise)、在0.5ns时刻下降(Fall),即时序分析默认计数器模块的时钟为1000MHz的方波。2.指定时序约束(1)启动TimingAnalyzer。(2)创建TimingNetlist。
选择Netlist菜单下的“CreateTimingNetlist”命令将弹出生成时序网表对话框。修改Inputnetlist栏下Post-fit为Post-map,点击OK后生成时序分析网表。
返回TimingAnalyzer窗口后,可以看到TimingAnalyzer窗口左侧的task子窗口中的CreateTimingNetlist前已经打“√”,如图所示,表示时序网表生成成功。(3)指定时序需求。
选择Constraints菜单栏下的CreateClock命令,弹出生成时钟对话框。
在Clockname栏中填入clk400”,周期栏填入“2.5”,在Waveformedges的Rising和Falling栏中不填入任何数值(默认占空比为50%),将时钟clk400设置为400MHz的方波。
点击图中Targets栏后的浏览图标,将弹出下图所示的“NameFinder”对话页。
点击对话页中的List图标显示工程所有的端口名,选中clk后移至右侧的selectedname栏中,如图所示,再点击OK图标返回CreateClock对话页,即将设置的时钟clk400与HC160的时钟clk关联起来。
点击左图中的RUN生成约束文件(HC160.out.sdc)后,TimingAnalyzer窗口任务栏的状态如下图所示。
选择Constraints菜单栏下的WriteSDCFile命令,弹出右图所示的写入约束文件对话框。点击OK完成约束文件(HC160.out.sdc)写入。(4)更新TimingNetlist。
点击“ReadSDCFile”可以查看生成的约束文件信息,再点击图中的“UpdateTimingNetlist”更新时序网表文件。
关闭TimingAnalyzer窗口,返回QuartusPrime。3.添加约束文件到工程中
在QuartusPrime主界面下,选择Project菜单下的Add/RemoveFilesinProject命令,在弹出的添加和删除文件对话页中选择浏览图标,查找生成的时序约束文件HC160.out.sdc。
然后点击图中的打开图标将约束文件HC160.out.sdc添加到计数器工程中。4.重新编译工程
在QuartusPrime主界面下,选择Processing菜单栏下的Start
Complication命令或者直接点击主界面中的图标启动全编译过程。5.查看时序分析报告
全编译完成后,展开Tasks任务栏下TimingAnalyzer中的Clocks项。在时钟约束下,三种时序分析模型的分析结果如表示。从表中可看出,两种慢速模型的建立时间裕量为负值转变为正值,表示计数器模块HC160在FPGA中能够稳定地工作在400MHz时钟下,而且能够测量的最高工作频率也有所提高。
修改时钟频率为500MHz,重新建立约束文件进行分析,可以看到计数器模块HC160仍然能够稳定地工作在500MHz时钟下。7.3.4异步时序与亚稳态问题
异步时序逻辑电路内部寄存器的时钟脉冲来自两个及以上的时钟源,而且时钟源之间没有确定的关系。
对于右图所示的时序电路,当时钟CLK1与CLK2来自不同的时钟源时,为异步时序逻辑电路。
相应地,把信号从源寄存器FF1传输到目的寄存器FF2,称为跨时钟域(clockdomaincrossing,缩写为CDC)传输。
信号在跨时钟域传输时,由于源寄存器的时钟和目的寄存器的时钟之间相位没有确定的相位关系,所以源寄存器发出数据后,数据有可能在任何时刻到达另一个时钟域的目的寄存器,因此无法保证信号能够满足目的寄存器建立时间和保持时间的要求。
如果信号不能在建立时间和保持时间的窗口内保持稳定,那么目的寄存器的输出有可能进入非0非1(介于VOHmin和VOLmax之间)的不确定状态,如图所示,这个状态称为亚稳态(metastability)。相应的,把目的寄存器脱离亚稳态进入稳态的时间称为决断时间(resolutiontime),用tmet表示。经过决断时间后,目的寄存器的输出稳定到0还是1是随机的,与输入信号没有必然的关系。
处于亚稳态的寄存器在决断时间前输出电压在高电平与低电平之间振荡时,可能会导致后续的数字部件作出不同的判断,可能判断为0、可能判断为1,也可能进入亚稳态,从而引发数字系统发生错误。除了信号的跨时钟域传输外,异步时序还有另外两种情况。(1)系统复位时,无论是异步复位还是同步复位。(2)对外部信号的采集。
对于按键和中断等外部输入信号,由于信号的作用时间不受系统时钟的控制,因此在采集过程中,外部信号可能在任何时刻发生变化,所以也无法保证满足寄存器建立时间和保持时间的要求。
亚稳态是触发器固有的特性。除了降低时钟频率和选用更好的器件外,还可以通过改善时钟脉冲的质量,采用边沿陡峭的时钟信号等措施,以减小建立时间和保持时间窗口的宽度。
在基于FPGA的数字系统设计中,主要通过以下三种技术手段来减小亚稳态传播的概率:
(1)引入同步器来减小单bit信号亚稳态传播的概率,实现异步信号与目的时钟域的同步;
(2)应用异步FIFO实现多bit数据跨时域的传输;
(3)应用异步复位同步释放信号来改善纯异步复位信号的特性。亚稳态概率=(建立时间+保持时间)/时钟周期1.单bit信号的跨时钟域同步
对于异步单bit信号的采集,降低亚稳态发生概率最简单的方法是应用由移位寄存器构成的两级同步器(double-flopsynchronizer)来同步信号的采集时间,俗称“打两拍”,如图所示。2.多bit数据的跨时钟域传输
对于多bit数据,普遍的方法是应用双口RAM或者异步FIFO进行跨时域传输。
由于FIFO没有外部读写地址线,因而应用异步FIFO比双口RAM更方便一些。
应用异步FIFO最关键的问题是如何来判断FIFO的状态,产生空/满标志了。
因为异步FIFO的读/写操作在不同的时钟域,所以无法像同步FIFO那样,通过统计存储数据的个数来产生empty和full标志。(1)异步FIFO空/满的检测方法
从工作过程可以看出,FIFO为空有两种情况:(1)FIFO复位时;(2)当读指针rp追上了写指针wp,读/写指针相同时。
FIFO已满只有一种情况:当写指针wp多写了一圈,折回来(wrappedaround)追上了读指针rp,读/写指针再次相同时,如表所示。
为了区分指针相同时FIFO为空还是已满,需要在FIFO的读/写指针前再多加一个标志位来区分写指针是否比读指针多写了一圈。所以,存储深度为2n的异步FIFO,读/写指针应为n+1位(标志位+n位地址)。
添加了标志位后,每当读/写指针递加并越过FIFO的最后一个存储单元后,将读/写指针的最高位翻转,其余位回零。因此,判断异步FIFO空/满的方法是:当读/写指针的所有位均相同时,说明FIFO为空;当读/写地址的最高位不同而其余均相同时,说明写指针比读指针多走了一圈,说明FIFO已满。(2)读/写指针的同步方法
由于异步FIFO的读/写在不同的时钟域,所以需要将读/写指针同步到另一个时钟域与写/读指针进行比较才能产生空/满标志。但是,二进制读/写指针不能直接同步到另一个时钟域。
一般的处理方法是,先将二进制读/写指针值转换为格雷码后再进行同步。因为格雷码的相邻码之间只有一位发生变化,其余位不变,而不像二进制地址那样,存在多位同时发生变化的情况。
深度为2n的异步FIFO共有n+1位读/写指针。设格雷码写指针用wptr[n:0]表示,读指针用rptr[n:0]表示,FIFO为空用rempty表示,为满用wfull表示。
判断FIFO是否为空比较简单:当读/写指针值完全相同时,无论用二进制指针还是用格雷码指针。因此,空标志产生的Verilog代码为:empty=(rptr==wptr);
FIFO为满时二进制读/写指针的最高位不同而其余位相同。从表中的二进制码和格雷码的对应关系可以看出,FIFO为满时格雷码指针的最高位和次高位不同,其余位相同。因此,基于格雷码判断FIFO已满的Verilog代码为:wfull=(wptr[n:n-1]==~rptr[n:n-1]
)
&&
(wptr[n-2:0]==rptr[n-2:0]);(3)跨时钟域异步FIFO的描述
根据跨时钟域异步FIFO的结构和工作原理,描述1024×8位异步FIFO的Verilog代码参考如下:跨时钟域异步FIFO的典型结构如图所示。modulecdc_async_fifo#(parameterFIFO_WIDTH=8)(inputwirewclk,rclk,
//写时钟和读时钟inputwirewrst_n,rrst_n,
//复位信号,低电平有效inputwirewinc,rinc,
//写请求和读请求,高电平有效inputwire[FIFO_WIDTH-1:0]wdata,//写数据outputwire[FIFO_WIDTH-1:0]rdata,//读数据outputregwfull,rempty
//满标志和空标志);//FIFO地址位数和深度定义parameterFIFO_ADDR=10;localparamFIFO_DEPTH=1<<FIFO_ADDR;//FIFO内部线网和变量定义reg[FIFO_ADDR:0]wbin,rbin;
//二进制写地址和读地址reg[FIFO_ADDR:0]wptr,rptr;
//格雷码写指针和读指针
wire[FIFO_ADDR:0]wbinnext,wptrnext;
//写地址和指针次态
wire[FIFO_ADDR:0]rbinnext,rptrnext;
//读地址和指针次态
reg[FIFO_ADDR:0]rq1_wptr,rq2_wptr;
//写指针两级同步器
reg[FIFO_ADDR:0]wq2_rptr,wq1_rptr;
//读指针两级同步器wirefull,empty;
//内部满标志和空标志wire[FIFO_ADDR-1:0]waddr,raddr;
//存储器写地址和读地址//描述FIFO存储实体(FIFOMemory)reg[FIFO_WIDTH-1:0]fifo_mem[0:FIFO_DEPTH-1];assignrdata=fifo_mem[raddr];
//读操作always@(posedgewclk)
//写过程if(winc&&!wfull)fifo_mem[waddr]<=wdata;//写地址和指针处理过程
always@(posedgewclkornegedgewrst_n)if(!wrst_n){wbin,wptr}<=0;else{wbin,wptr}<={wbinnext,wptrnext};
//FIFO写地址定义assignwaddr=wbin[FIFO_ADDR-1:0];
//次态定义,FIFO不满且有写请求时写地址加1assignwbinnext=wbin+(winc&&!wfull);
//将二进制写地址转换为格雷码assignwptrnext=(wbinnext>>1)^wbinnext;//内部满标志定义,组合逻辑assignfull=(wptrnext=={~wq2_rptr[FIFO_ADDR:FIFO_ADDR-1],
wq2_rptr[FIFO_ADDR-2:0]});//满标志同步输出
always@(posedgewclkornegedgewrst_n)if(!wrst_n)wfull<=1'b0;
elsewfull<=full;//读地址和指针处理过程
always@(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年汽车及零配件批发行业供需格局研究报告及未来五至十年自主创新与安全可控
- 2026年烟草制品批发行业战略咨询报告及未来五至十年研发投入与专利布局
- 2026年唐山三友集团有限公司人员招聘考试题库及答案详解
- 2026年国家电网有限公司直流技术中心人员招聘考试备考题库及答案详解
- 2026年广西柳州钢铁集团有限公司人员招聘考试题库及答案详解
- 2026年印刷行业趋势报告及未来五至十年新质生产力与高质量发展
- 2026年中石化广州(洛阳)工程人员招聘考试题库及答案详解
- 2026年中国电信山西分公司人员招聘考试备考题库及答案详解
- 2026年其他一般旅馆行业市场集中度研究报告及未来五至十年线上线下融合与全域运营
- 2026年西南石油局人员招聘笔试参考题库及答案详解
- JTT 1540-2025 低温改性沥青
- 人教版七年级单词全
- 工会授权审批制度
- 陕西交控集团内部竞聘笔试题
- 2025年合肥水投线上笔试题目及答案
- 职工年度体检常见异常报告解读指南
- 大队长笔试题目及答案
- GB/T 45021.1-2024光伏组件性能测试和能量评定第1部分:辐照度和温度性能测量和功率评定
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- 柏拉图法则分析课件
- 汽轮机DEH简介和SGC顺控启动
评论
0/150
提交评论