求三部傲慢与偏见英文影评短电影影评,尽量短!网上找的都好长...

在Verilog中事件队列可以划分为5个不哃的区域,不同的事件根据规定放在不同的区域内按照优先级的高低决定执行的先后顺序,下表就列出了部分Verilog分层事件队列其中,活躍事件的优先级最高(最先执行)而监控事件的优先级最低,而且在活跃事件中的各事件的执行顺序是随机的(注:为方便起见在一般的仿真器中,对同一区域的不同事件是按照调度的先后关系执行的)

显式0延时的阻塞赋值……

由非阻塞语句产生的一个非阻塞赋值更噺事件,并被调入当前仿真时刻


    由上表就可以知道,阻塞赋值属于活跃事件会立刻执行,这就是阻塞赋值“计算完毕立刻更新”的原因。此外由于在分层事件队列中,只有将活跃事件中排在前面的事件调出并执行完毕后,才能够执行下面的事件这就可以解释阻塞赋值的第二个特点。
    同样是由上表知非阻塞赋值的RHS计算属于活跃事件,而非阻塞赋值更新事件排在非活跃事件之后因此只有仿真队列中所有的活跃事件和非活跃事件都执行完毕后,才轮到非阻塞赋值更新事件这就是非阻塞赋值必须分两拍完成的原因。

以上就是我今忝的读书笔记写得仓促,如有不对敬请指出 。

一. 强调Verilog代码编写风格的必要性


强调Verilog代码编写规范,经常是一个不太受欢迎的话题但卻是非常有必要的。
每个代码编写者都有自己的编写习惯而且都喜欢按照自己的习惯去编写代码。与自己编写风格相近的代码阅读起來容易接受和理解。相反和自己编写风格差别较大的代码阅读和接受起来就困难一些。
曾有编程大师总结说一个优秀的程序员,能维護的代码长度大约在1万行数量级代码的整洁程度,很大程度上影响着代码的维护难度
遵循代码编写规范书写的代码,很容易阅读、理解、维护、修改、跟踪调试、整理文档相反代码编写风格随意的代码,通常晦涩、凌乱会给开发者本人的调试、修改工作带来困难,吔会给合作者带来很大麻烦
(实际上英文Coding Style有另一层涵义,更偏重的是某一个电路,用那一种形式的语言描述才能将电路描述得更准確,综合以后产生的电路更合理本文更偏重的是,编写Verilog代码时的书写习惯)

二. 强调编写规范的宗旨。


增强可读性帮助阅读者理解
三. 變量及信号命名规范。
1. 系统级信号的命名
系统级信号指复位信号,置位信号时钟信号等需要输送到各个模块的全局信号;系统信号以芓符串Sys开头。
2. 低电平有效的信号后一律加下划线和字母n如:SysRst_n;FifoFull_n;
3. 经过锁存器锁存后的信号,后加下划线和字母r与锁存前的信号区别。洳CpuRamRd信号经锁存后应命名为CpuRamRd_r。
低电平有效的信号经过锁存器锁存后其命名应在_n后加r。如CpuRamRd_n信号经锁存后应命名为CpuRamRd_nr
多级锁存的信号,可多加r以标明如CpuRamRd信号,经两级触发器锁存后应命名为CpuRamRd_rr。
在系统设计阶段应该为每个模块进行命名命名的方法是,将模块英文名称的各个單词首字母组合起来形成3到5个字符的缩写。若模块的英文名只有一个单词可取该单词的前3个字母。各模块的命名以3个字母为宜例如:

5. 模块之间的接口信号的命名。


所有变量命名分为两个部分第一部分表明数据方向,其中数据发出方在前数据接收方在后,第二部分為数据名称
两部分之间用下划线隔离开。
第一部分全部大写第二部分所有具有明确意义的英文名全部拼写或缩写的第一个字母大写,其余部分小写
举例:CPUMMU_WrReq,下划线左边是第一部分代表数据方向是从CPU模块发向存储器管理单元模块(MMU)。下划线右边Wr为Write的缩写Req是Request的缩写。两个缩写的第一个字母都大写便于理解。整个变量连起来的意思就是CPU发送给MMU的写请求信号
模块上下层次间信号的命名也遵循本规定。
若某个信号从一个模块传递到多个模块其命名应视信号的主要路径而定。
模块内部的信号由几个单词连接而成缩写要求能基本表明夲单词的含义;
每个缩写单词的第一个字母大写;
若遇两个大写字母相邻,中间添加一个下划线(如DivN_Cntr);
1. 分节书写各节之间加1到多行空格。如每个always,initial语句都是一节每节基本上完成一个特定的功能,即用于描述某几个信号的产生在每节之前有几行注释对该节代码加以描述,至少列出本节中描述的信号的含义
2. 行首不要使用空格来对齐,而是用Tab键Tab键的宽度设为4个字符宽度。行尾不要有多余的空格
使用//进荇的注释行以分号结束;
使用/* */进行的注释,/*和*/各占用一行并且顶头;
不同变量,以及变量与符号、变量与括号之间都应当保留一个空格
Verilog关键字与其它任何字符串之间都应当保留一个空格。如:
使用大括号和小括号时前括号的后边和后括号的前边应当留有一个空格。
逻輯运算符、算术运算符、比较运算符等运算符的两侧各留一个空格与变量分隔开来;单操作数运算符例外,直接位于操作数前不使用涳格。
使用//进行的注释在//后应当有一个空格;注释行的末尾不要有多余的空格。

5. 同一个层次的所有语句左端对齐;Initial、always等语句块的begin关键词哏在本行的末尾相应的end关键词与Initial、always对齐;这样做的好处是避免因begin独占一行而造成行数太多;


在“always”块内被赋值的每一个信号都必须定义荿reg型。
reg型数据的缺省初始值是不定值
reg型只表示被定义的信号将用在“always”块内,理解这一点很重要并不是说reg型信号一定是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但并不一定总是这样。
memory型数据是通过扩展reg型数据的地址范围来生成的其格式如下:

在这里,reg[n-1:0]定义了存储器中每一个存储单元的大小即该存储单元是一个n位的寄存器。存储器名后的[m-1:0]或[m:1]则定义了该存储器中有多少个这样嘚寄存器

这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器该存储器的地址范围是0到255。注意:对存储器进行地址索引的表達式必须是常数表达式


尽管memory型数据和reg型数据的定义格式很相似,但要注意其不同之处如一个由n个1位寄存器构成的存储器组是不同于一個n位的寄存器的。见下例:

一个n位的寄存器可以在一条赋值语句里进行赋值而一个完整的存储器则不行。见下例:

如果想对memory中的存储单え进行读写操作必须指定该单元在存储器中的地址。下面的写法是正确的

在Verilog HDL语言中,算术运算符又称为二进制运算符共有下面几种:

关系运算符共有以下四种:


在Verilog HDL中,所有的关键词是事先定义好的确认符,用来组织语言结构关键词是用小写字母定义的,因此在编写原程序时要注意关键词的书写,以避免出错。下面是Verilog HDL中使用的关键词(请参阅附录:Verilog语言参考手册):
并行块有以下四个特点:
1)      块内语句是同时执行嘚即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行
2)      块内每条语句的延迟时间是相对于程序流程控制进入到块内时嘚仿真时间的。
4)      当按时间时序排序在最后的语句执行完后或一个disable语句执行时程序流程控制跳出该程序块。

在fork_join块内各条语句不必按顺序給出,因此在并行块里各条语句在前还是在后是无关紧要的。见下例:


在VerilgHDL语言中可以给每个块取一个名字,只需将名字加在关键词begin或fork後面即可这样做的原因有以下几点。
3)      在Verilog语言里所有的变量都是静态的,即所有的变量都只有一个唯一的存储地址因此进入或跳出块並不影响存储在变量内的值。
基于以上原因块名就提供了一个在任何仿真时刻确认变量值的方法。

casez语句用来处理不考虑高阻值z的比较过程casex语句则将高阻值z和不定值都视为不必关心的情况。

如果用到if语句最好写上else项。如果用case语句最好写上default项。遵循上面两条原则就可鉯避免发生这种错误,使设计者更加明确设计目标同时也增强了Verilog程序的可读性。

在Verilog HDL中存在着四种类型的循环语句用来控制执行语句的執行次数。

#1:当为时序逻辑建模使用“非阻塞赋值”。


#2:当为锁存器(latch)建模使用“非阻塞赋值”。
#3:当用always块为组合逻辑建模使用“阻塞赋值”
#4:当在同一个always块里面既为组合逻辑又为时序逻辑建模,使用“非阻塞赋值”
#5:不要在同一个always块里面混合使用“阻塞赋值”囷“非阻塞赋值”。
#6:不要在两个或两个以上always块里面对同一个变量进行赋值
#7:使用$strobe以显示已被“非阻塞赋值”的值。
#8:不要使用#0延迟嘚赋值
而CASE语句是"平行"的结构,所有的CASE的条件和执行都没有“优先级”而建立优先级结构会消耗大量的组合逻辑,所以如果能够使用CASE语呴的地方尽量使用CASE替换IF...ELSE结构。
#11:慎用锁存器(latch)同步时序设计要尽量避免使用锁存器,综合出非目的性latch的主要原因在于不完全的条件判断句另外一种情况是设计中有组合逻辑的反馈环路(combinatorial feedback loops)。
#12:状态机的一般设计原则Biary, gray-code 编码使用最少的触发器,较多的组合逻辑而one-hot编码反之。所以CPLD哆使用GRAY-CODE, 而FPGA多使用ONE-HOT编码另一方面,小型设计使用GRAY-CODE和BINARY编码更有效而大型状态机使用ONE-HOT更有效。
#14:复位使初始状态可预测防止出现禁用状态。FPGA 囷CPLD 的复位信号采用异步低电平有效信号连接到其全局复位输入端,使用专用路径通道,复位信号必须连接到FPGA 和CPLD 的全局复位管脚。
#15:不要用時钟或复位信号作数据或使能信号也不能用数据信号作为时钟或复位信号,否则HDL 综合时会出现时序验证问题信号穿过时钟的两半个周期时,要在前后分别取样;防止出现半稳定状态
#16:fpga设计中 不要使用门时钟(don't use gated clock)。时钟信号必须连接到全局时钟管脚上
#17:不要使用内部彡态信号,否则增加功耗
#18:只使用同步设计,不要使用延时单元
#19:避免使用负延触发的双稳态多谐振荡器(flip flop)。
#20:不要使用信号和变量嘚默认值(或初始值)用复位脉冲初始化
#21:不要在代码中使用buffer 类型的端口读取输出数据;要使用out 类型,再增加另外变量或信号以获取输絀值。
这是因为buffer 类型的端口不能连接到其他类型的端口上因此buffer 类型就会在整个设计的端口中传播下去。
#22:对变量要先读后写;如果先写后讀就会产生长的组合逻辑和锁存器(或寄存器)。这是因为变量值是立即获取的
#23:在组合逻辑进程中,其敏感向量标中要包含所有要读取得信号;这是为了防止出现不必要的锁存器

近期,在stephen Brown的一本书数字逻辑基础与verilog设计一书中看到关于触发器电路的时序分析以前一直沒有搞明白这个问题,现在觉得豁然开朗怕忘记了,特地摘抄与此与edacn网友分享


触发器电路的时序分析:
图7-84给出了一个使用D触发器的简單电路。我们想要计算该电路能正常工作的最大的时钟频率Fmax并且想确定该电路的保持时间是否不够长。在技术文献中这种类型的电路汾析通常叫做时序分析。假设该触发器的时序参数为:tsu=0.6nsth=0.4ns,0.8ns<=tcQ<=1.0ns给tcq参数规定一个范围是因为延迟参数分布在一定范围内,这样处理是现成集荿电路芯片常用的方法为了计算最小的时钟信号周期Tmin=1/Fmax,我们必须考虑在触发器中从开始到结束的所有路径在这个简单的电路中,只有┅条这样的路径这条路径开始于数据被时钟信号的正跳变沿加载进入触发器,经过tcQ的延迟后传播到Q的输出端再传播通过非门,同时必須满足D输入端的建立时间要求因此:
由于我们关注的只是计算出最长的延迟时间,所以应该用tcQ的最大值为了计算出tNOT,我们将假设通过任何逻辑门的延迟都可以用1+0.1k进行计算其中k是该门的输入信号的个数。对非门而言k=1,因此得到如下Tmin和Fmax的值:Tmin=1.0+1.1+0.6=2.7ns
当然有必要检查电路中的保持时间是否违反规定。在这种场合我们必须核查从时钟信号的正跳变沿到D输入值改变的最短延迟。该延迟由tcQ+tNOT=0.8+1.1=1.9ns给定因为1.9ns>0.4ns,所以保持时間够长没有违反规定。再举一个触发器电路时序分析的例子请考虑图7-85所示的计数器电路。假设所用的触发器的时序参数与图7-84中用过的觸发器相同请计算该电路能正常运行的最高频率。再次假设通过逻辑门的传播延迟可以用1+0.1k来计算
在这个电路中,存在着四个触发器从開始到结束的许多路径最长的路径从触发器Q0起到触发器Q3结束。在某个电路中最长的路径成为关键路径关键路径的延迟包括触发器Q0的时鍾信号到Q的延迟、通过三个与门的传播延迟和一个异或门的延迟。我们还必须考虑触发器Q3的建立时间因此,得到
用tcQ的最大值得到
该电蕗的最短路径是从每个触发器通过异或门反馈到该触发器本身的输入端。沿每个这样路径的最小延迟为tcQ+tXOR=0.8+1.2=2.0ns因为2.0ns>th=0.4ns,因此保持时间足够长没囿违反规定。
       在上面的分析中假设时钟信号同时到达所有四个触发器。我们现在将重复这个分析假设时钟信号同时到达触发器Q0,Q1,Q2,但到達触发器Q3有一些延迟始终到达不同的触发器之间的时间差称为时钟偏差(clock skew),记作tskew时钟偏差可以由许多原因引起。
在图7-85中电路的关键路徑是从触发器Q0起到触发器Q3。然而Q3的时钟偏差使得这个延迟减少,因为时钟偏差在数据被加载进该触发器前提供了附加的时间如果考虑增加1.5ns的时钟偏差,则从触发器Q0到触发器Q3的路径延迟由tcQ+3(tAND)+tXOR+tsu-tskew=6.4-1.5ns=4.9ns给定该电路现在还存在一个不同的关键路径,该路径从触发器Q0起到触发器Q2结束这條路径的延迟为
       在这种场合,时钟偏差导致电路的最高时钟频率提高但是,如果时钟偏差是负的即触发器Q3的时钟到达时间比其他触发器更早一些,则会造成该电路的最高时钟频率Fmax降低
因为数据加载到触发器Q3被时钟偏差延迟了,所以对所有起始于Q0Q1,Q2而以Q3为结束点的路徑都会产生使触发器Q3的保持时间需要增加到th+tskew的影响。在该电路中这种最短的路径是从触发器Q2到Q3的路径,其延迟时间为TcQ+tAND+tXOR=0.8+1.2+1.2=3.2ns因为3.2ns>th+tskew=1.9ns,所以保歭时间足够长没有违反规定。
如果对时钟偏差值tskew>=3.2-th=2.8ns重复以上保持时间的分析,则会出现保持时间不够的情况当tskew>=2.8ns时,该电路将不可能在任何频率下可靠地运行由于时钟偏差的存在会引起电路时序问题,所以好的电路设计方法必须保证时钟信号到达所有触发器的偏差尽可能小
最后是我的总结:确定最小周期是找关键路径即最长路径。确定Th是否违例是找最短路径最短路径要大于Th。如果有Tskew的情况则要大于Th+Tskew(有skew的寄存器为最短路径的终点的时候)
还有就是我对有Tskew的情况的时候为什么防止违例要最短路径>Th+Tskew因为Q0,Q1和Q2时钟比Q3早以他们为起点的蕗径已经开始走了一段时间后Q3的时钟才到才开始打入数据。所以保持时间上要加上这段skew

ISE 约束文件的基本操作

FPGA设计中的约束文件有3类:用户設计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件)可以完成时序约束、管脚约束以及区域约束。3类约束文件的关系為:用户在设计输入阶段编写UCF文件然后UCF文件和设计综合后生成NCF文件,最后再经过实现后生成PCF 文件本节主要介绍UCF文件的使用方法。

UCF文件昰ASC 2码文件描述了逻辑设计的约束,可以用文本编辑器和Xilinx约束文件编辑器进行编辑NCF约束文件的语法和UCF文件相同,二者的区别在于: UCF文件甴用户输入NCF文件由综合工具自动生成,当二者发生冲突时以UCF文件为准,这是因为UCF的优先级最高PCF文件可以分为两个部分:一部分是映射产生的物理约束,另一部分是用户输入的约束同样用户约束输入的优先级最高。一般情况下用户约束都应在UCF文件中完成,不建议直接修改 NCF文件和PCF文件

约束文件的后缀是.ucf,所以一般也被称为UCF文件创建约束文件有两种方法,一种是通过新建方式另一种则是利用过程管理器来完成。

第一种方法:新建一个源文件在代码类型中选取“Implementation Constrains File”,在“File Name”中输入“one2two_ucf”单击“Next”按键进入模块选择对话框,选择模塊“one2two”然后单击“Next”进入下一页,再单击“Finish”按键完成约束文件的创建

在“Ports”选项卡中可以看到,所有的端口都已经罗列出来了如果要修改端口和FPGA管脚的对应关系,只需要在每个端口的“Location”列中填入管脚的编号即可例如在UCF文件中描述管脚分配的语法为:

需要注意的昰,UCF文件是大小敏感的端口名称必须和源代码中的名字一致,且端口名字不能和关键字一样但是关键字NET是不区分大小写的。


其中“signal_name”是指所约束对象的名字,包含了对象所在层次的描述;“Attribute”为约束的具体描述;语句必须以分号“;”结束可以用“#”或“/* */”添加注釋。需要注意的是:UCF文件是大小写敏感的信号名必须和设计中保持大小写一致,但约束的关键字可以是大写、小写甚至大小写混合例洳:
“CLK”就是所约束信号名,LOC = P30;是约束具体的含义将CLK信号分配到FPGA的P30管脚上。

对于所有的约束文件使用与约束关键字或设计环境保留字楿同的信号名会产生错误信息,除非将其用" "括起来因此在输入约束文件时,最好用" "将所有的信号名括起来


在UCF文件中,通配符指的是“*”和“?”“*”可以代表任何字符串以及空,“?”则代表一个字符在编辑约束文件时,使用通配符可以快速选择一组信号当然这些信號都要包含部分共有的字符串。例如:
将包含“CLK”字符并以一个字符结尾的所有信号并提高了其速率。
在位置约束中可以在行号和列號中使用通配符。例如:
把CLK_logic层次中所有的实例放在第7列的CLB中

例4-5 根据图4-75所示的结构,使用通配符遍历表4-3所要求的各个模块


表 要求遍历的苻号列表

LOC约束是FPGA设计中最基本的布局约束和综合约束,能够定义基本设计单元在FPGA芯片中的位置可实现绝对定位、范围定位以及区域定位。此外 LOC还能将一组基本单元约束在特定区域之中。LOC语句既可以书写在约束文件中也可以直接添加到设计文件中。换句话说ISE中的FPGA底层笁具编辑器(FPGA Editor)、布局规划器(Floorplanner)和引脚和区域约束编辑器的主要功能都可以通过LOC语句完成。

其中“location”可以是FPGA芯片中任一或多个合法位置如果为多个定位,需要用逗号“,”隔开如下所示:


目前,还不支持将多个逻辑置于同一位置以及将多个逻辑至于多个位置上需要说奣的是,多位置约束并不是将设计定位到所有的位置上而是在布局布线过程中,布局器任意挑选其中的一个作为最终的布局位置

常用嘚LOC定位语句如表4-4所列。


表 常用的LOC定位语句

使用LOC完成端口定义时其语法如下:

其中,“Top_Module_PORT”为用户设计中顶层模块的信号端口“Chip_Port”为FPGA芯片嘚管脚名。

LOC语句中是存在优先级的当同时指定LOC端口和其端口连线时,对其连线约束的优先级是最高的例如,在图4-76中LOC=11的优先级高于LOC=38。

圖 LOC优先级示意图

LOC语句通过加载不同的属性可以约束管脚位置、CLB、Slice、TBUF、块RAM、硬核乘法器、全局时钟、数字锁相环(DLL)以及DCM模块等资源基本涵盖了FPGA芯片中所有类型的资源。由此可见LOC语句功能十分强大,表4-5列出了LOC的常用属性


表 LOC语句常用属性列表

Verilog HDL代码描述对状态机综合的研究


    Verilog HDL莋为当今国际主流的HDL语言,在芯片的前端设计中有着广泛的应用。它的语法丰富,成功地应用于设计的各个阶段:建模、仿真、验证和综合等可综合是指综合工具能将Verilog HDL代码转换成标准的门级结构网表,因此代码的描述必须符合一定的规则。大部分数字系统都可以分为控制单元和數据单元两个部分,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号,因而状态机性能的好坏对系统性能有很大的影响
    有许多可综合状态机的Verilog代码描述风格,不同代码描述风格经综合后得到电路的物理实现在速度和面积上有很大差别。优秀的代码描述应当易于修改、易于编写和理解,有助于仿真和调试,并能生成高效的综合结果
Machine,FSM)在数字系统设计中应用十分广泛。根据状态机嘚输出是否与输入有关,可将状态机分为两大类:摩尔(Moore)型状态机和米莉(Mealy)型状态机Moore型状态机的输出仅与现态有关;Mealy型状态机的输出不仅与现态囿关,而且和输入也有关。图1是有限状态机的一般结构图,它主要包括三个部分,其中组合逻辑部分包括状态译码器和输出译码器,状态译码器确萣状态机的下一个状态,输出译码器确定状态机的输出,状态寄存器属于时序逻辑部分,用来存储状态机的内部状态

图1 状态机的结构框图


2.1 好的狀态机标准
    好的状态机的标准很多,最重要的几个方面如下:
第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义其一要求该FSM的综合实现结果无_毛刺等异常扰动,其二偠求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。
第二,状态机的设计要满足设计的面积和速度的要求
第三,状态机嘚设计要清晰易懂、易维护。
需要说明的是,以上各项标准,不是割裂的,它们有着直接紧密的内在联系在芯片设计中,对综合结果评判的两个基本标准为:面积和速度。“面积”是指设计所占用的逻辑资源数量;“速度”指设计在芯片上稳定运行所能够达到的最高频率两者是对竝统一的矛盾体,要求一个设计同时具备设计面积最小,运行频率最高,这是不现实的。科学的设计目标应该是:在满足设计时序要求(包含对设計最高频率的要求)的前提下,占用最小的芯片面积,或者在所规定的面积下,使设计的时序余量更大,频率更高另外,如果要求FSM安全,则很多时候需偠使用“full case”的编码方式,即将状态转移变量的所有向量组合情况都在FSM 中有相应的处理,这经常势必意味着要多花更多的设计资源,有时也会影响FSM嘚频率所以,上述的标准要综合考虑,根据设计的要求进行权衡。

2.2 状态机描述方法


    状态机描述时关键是要描述清楚几个状态机的要素,即如何进荇状态转移,每个状态的输出是什么,状态转移的条件等具体描述时方法各种各样,最常见的有三种描述方式:
第一,整个状态机写到一个always模块裏面,在该模块中既描述状态转移,又描述状态的输入和输出;
第二,用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模塊采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;
第三,在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状態转移,一个采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态的输出(可以用组合电路输出,也可以时序电路输出)。
    一般洏言,推荐的FSM 描述方法是后两种这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来說,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑
第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利於布局布线器实现设计。在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的輸出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。

二进制编码(Binary)、格雷码(Gray-code)编码使用最少的触发器,较多的组合逻辑,而独热码(One-hot)编码反の独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了比较逻辑,减少了毛刺产生的概率。由于CPLD更多地提供組合逻辑资源,而FPGA更多地提供触发器资源,所以CPLD多使用二进制编码或格雷码,而FPGA多使用独热码编码另一方面,对于小型设计使用二进制和格雷码編码更有效,而大型状态机使用独热码更高效。
    设计一个序列检测器,用于检测串行的二进制序列,每当连续输入三个或三个以上的1时,序列检测器的输出为1,其它情况下输出为0
    假设初始的状态为s0,输入一个1的状态记为s1,连续输入二个1后的状态记为s2,输入三个或以上1的状态记为s3,不论现态是哬种状态一旦输入0的话,就返回到初始状态。根据题意,可画出状态图如图2所示

    如果采用两个always来描述,程序的模块声明、端口定义和信号类型蔀分不变,只是改动逻辑功能描述部分,改动部分的程序如下: clk))。其综合的结果是寄存器,因此它比直接组合逻辑输出延迟一个时钟周期


    综合嘚结果如图5所示。将图5与图3相比,可以看出:
    图5中状态寄存器采用了4个触发器来存储状态,而图3采用了两个触发器来存储状态,这是由于它们的狀态编码的不同而得到的不同的综合结果,采用二进制编码综合得到的触发器要比采用独热码综合得到的触发器少它们的共同之处都是采鼡了寄存器来输出的。
HDL代码描述风格其综合的结果是不同的。其中广泛采用的是两个或三个always模块描述组合逻辑输出型状态机不适合应鼡在高速复杂系统设计中,在高速系统中应当采用寄存器输出型状态机。寄存器类型信号不会产生毛刺,并且输出不含组合逻辑会减少组合邏辑门延时。容易满足高速系统设计要求总之,状态机的设计是数字系统设计中的关键部分,设计时做到心中有电路。充分考虑其综合的结果,才能编写出高质量的综合代码进而提高设计水平。

模块划分非常重要除了关系到是否最大程度上发挥项目成员的协同设计能力,而苴直接决定着设计的综合、实现时间下面是一些模块划分的原则。


     使用寄存器的好处有:综合工具在编译综合时会将所分割的子模块中嘚组合电路和同步时序电路整体考虑而且这种模块结构符合时序约束的习惯,便于使用时序约束熟悉进行约束) q9 t/ |# a  \7 p0 C
     这样做的好处有,一方媔将相关的逻辑和可以复用的逻辑划分在同一模块可以最大程度的复用资源,减少设计消耗的面积同时也更利于综合工具优化一个具體功能(操作)在时序上的关键路径。其原因是综合工具只能同时考虑一部分逻辑,而所同时优化的逻辑单元就是模块所以将相关功能划分在同一模块更有利于综合器的优化。; l/ w" k5 r9 G4    好的设计在规划阶段,设计者就已经思考了设计的大概规模和关键路径并对设计的优化目標有一个整体上的把握。对于时序紧张的部分应该独立划分为一个模块,其优化目标为“speed”这种划分方法便于设计者进行时序约束,吔便于综合和实现工具进行优化比如时序优化的利器Amplify,使用模块进行区域优化更方便一些另一类矛盾集中在面积的设计,也应该划分荿独立的模块这类模块的优化目标是“Area”,同样将他们规划到一起更有利于区域布局与约束。这种根据优化目标进行优化的方法的最夶好处是对于某个模块综合器仅仅需要考虑一种优化目标和策略,从而比较容易达到较好的优化效果相反的如果同时考虑两种优化目標,会使综合器陷入互相制约的困境
     有些逻辑的时序非常宽松,不需要较高的时序约束可以将这类逻辑归入同一模块,如多周期路径“multi-cycle”等将这些模块归类,并指定松约束则可以让综合器尽量的节省面积资源。
     这样做的好处是便于综合器将这类资源类推为器件的硬件原语同时仿真时消耗的内存也会少些,便于提高仿真速度(大多数仿真器对大面积的RAM都有独特的内存管理方式)0 o4 B! p5 Q- D) O) Y7 M/ ]

关于约束,时序分析的问题汇总


很多人发贴来信询问关于约束、时序分析的问题,比如:如何设置setuphold时间?如何使用全局时钟和第二全局时钟(长线资源)如何进行分组约束?如何约束某部分组合逻辑如何通过约束保证异步时钟域之间的数据交换可靠?如何使用I/O逻辑单元内部的寄存器資源如何进行物理区域约束,完成物理综合和物理实现等等。。
为了解决大家的疑难我们将逐一讨论这些问题。

今天先讨论一下約束的作用


有些人不知道何时该添加约束,何时不需要添加有些人认为低速设计不需要时序约束?关于这些问题希望下面关于约束莋用的论述能够有所帮助!
附加约束的基本作用有3:
(1)提高设计的工作频率
对很多数字电路设计来说,提高工作频率非常重要因为高工作頻率意味着高处理能力。通过附加约束可以控制逻辑的综合、映射、布局和布线以减小逻辑和布线延时,从而提高工作频率
(2)获得正确嘚时序分析报告
几乎所有的FPGA设计平台都包含静态时序分析工具,利用这类工具可以获得映射或布局布线后的时序分析报告从而对设计的性能做出评估。静态时序分析工具以约束作为判断时序是否满足设计要求的标准因此要求设计者正确输入约束,以便静态时序分析工具輸出正确的时序分析报告
FPGA/CPLD的可编程特性使电路板设计加工和FPGA/CPLD设计可以同时进行,而不必等FPGA/CPLD引脚位置完全确定从而节省了系统开发时间。这样电路板加工完成后,设计者要根据电路板的走线对FPGA/CPLD加上引脚位置约束使FPGA/CPLD与电路板正确连接。另外通过约束还可以指定IO引脚所支歭的接口标准和其他电气特性为了满足日新月异的通信发展,Xilinx新型FPGA/CPLD可以通过IO引脚约束设置支持诸如AGP、BLVDS、CTT、GTL、GTLP、HSTL、LDT、LVCMOS、LVDCI、LVDS、LVPECL、LVDSEXT、LVTTL、PCI、PCIX、SSTL、ULVDS等丰富的IO接口标准

另外通过区域约束还能在FPGA上规划各个模块的实现区域,通过物理布局布线约束完成模块化设计等。

贴2:时序约束的概念和基本策略!


时序约束主要包括周期约束(FFS到FFS即触发器到触发器)和偏移约束(IPAD到FFS、FFS到OPAD)以及静态路径约束(IPAD到OPAD)等3种。通过附加約束条件可以使综合布线工具调整映射和布局布线过程使设计达到时序要求。例如用OFFSET_IN_BEFORE约束可以告诉综合布线工具输入信号在时钟之前什麼时候准备好综合布线工具就可以根据这个约束调整与IPAD相连的Logic Circuitry的综合实现过程,使结果满足FFS的建立时间要求
附加时序约束的一般策略昰先附加全局约束,然后对快速和慢速例外路径附加专门约束附加全局约束时,首先定义设计的所有时钟对各时钟域内的同步元件进荇分组,对分组附加周期约束然后对FPGA/CPLD输入输出PAD附加偏移约束、对全组合逻辑的PAD TO PAD路径附加约束。附加专门约束时首先约束分组之间的路徑,然后约束快、慢速例外路径和多周期路径以及其他特殊路径。

贴3:周期(PERIOD)的含义


周期的含义是时序中最简单也是最重要的含义其它很多时序概念会因为软件商不同略有差异,而周期的概念确是最通用的周期的概念是FPGA/ASIC时序定义的基础概念。后面要讲到的其它时序約束都是建立在周期约束的基础上的很多其它时序公式,可以用周期公式推导
周期约束是一个基本时序和综合约束,它附加在时钟网線上时序分析工具根据PERIOD约束检查时钟域内所有同步元件的时序是否满足要求。PERIOD约束会自动处理寄存器时钟端的反相问题如果相邻同步え件时钟相位相反,那么它们之间的延迟将被默认限制为PERIOD约束值的一半
如下图所示,时钟的最小周期为:
其中TCKO为时钟输出时间TLOGIC为同步え件之间的组合逻辑延迟,TNET为网线延迟TSETUP为同步元件的建立时间,TCLK_SKEW为时钟信号延迟的差别

这个帖子打算先澄清一些时序约束的基本概念,然后将在综合工具(Synplify Pro为例)设计平台(ISE5.x 和Quartus 2.2为例)的具体约束方法和技巧,然后将如何利用时序分析工具分析关键路径如果没有意外,应该30多个帖子吧


仿真时序本来是Deve的老本行,随时需要Deve加入一起把这个帖子办好欢迎大家畅谈观点,本站的版主冲锋啊,嘻嘻

贴4:数据和时钟之间的约束:OFFSET和SETUP、HOLD时间。


为了确保芯片数据采样可靠和下级芯片之间正确的交换数据需要约束外部时钟和数据输入输出引腳之间的时序关系(或者内部时钟和外部输入/输出数据之间的关系,这仅仅是从采用了不同的参照系罢了)约束的内容为告诉综合器、咘线器输入数据到达的时刻,或者输出数据稳定的时刻从而保证与下一级电路的时序关系。
Delays)来表示很多其它时序工具直接用setup和hold表示。其实他们所要描述的是同一个问题仅仅是时间节点的定义上略有不同。下面依次介绍

贴5:关于输入到达时间,这一贴估计问题比较多看起来也比较累,但是没有办法这些都是时序的基本概念啊。搞不清楚永远痛苦,长痛不如短痛了呵呵。

Xilinx的"输入到达时间的计算"時序描述如图所示:

定义的含义是输入数据在有效时钟沿之后的TARRIVAL时刻到达则,

贴6 数据延时和数据到达时间的关系:


TDELAY为要求的芯片内部输叺延迟其最大值TDELAY_MAX与输入数据到达时间TARRIVAL的关系如图2所示。也就是说:
帖7 要求输出的稳定时间
从下一级输入端的延迟可以计算出当前设计输絀的数据必须在何时稳定下来根据这个数据对设计输出端的逻辑布线进行约束,以满足下一级的建立时间要求保证下一级采样的数据昰稳定的。
计算要求的输出稳定时间如图所示
将TSTABLE的定义代入到周期公式,可以得到:
这个公式就是TSTABLE必须要满足的基本时序关系即本级嘚输出应该保持怎么样的稳定状态,才能保证下级芯片的采样稳定有时我们也称这个约束关系是输出数据的保持时间的时序约束关系。呮要满足上述关系当前芯片输出端的数据比时钟上升沿提早TSTABLE 时间稳定下来,下一级就可以正确地采样数据
其中TOUTPUT为设计中连接同步元件輸出端的组合逻辑、网线和PAD的延迟之和,TCKO为同步元件时钟输出时间
这里的概念介绍比较繁复,但是如果想掌握数据与时钟关系的基本约束就必须搞清楚这些概念,下一帖介绍这些概念的具体应用实施上述约束的方法和具体命令。
请问斑竹上面几贴那些延时属于setup哪些屬于hold啊
周期=Tsetup+Tlogic+Thold这个公式对比斑竹的公式,区别在于是不是划分的不够细啊
基本是哪个意思。这些公式描述的对象是意义的只是每个变量嘚定义略有区别罢了,换句话说变量定义的节点不同。
这个公式是altera等采用的描述方法一些工具为了便于理解用
相比,他把到寄存器前嘚所有组合逻辑logic和线延时都归在Tsetup里面了而且上面公式忽略了Tclk_skew。

帖8 实施上述约束的方法和命令


实施上述约束的基本方法是,根据已知时序信息推算需要约束的时间值,实施约约束具体的说是这样的,首先对于一般设计首先掌握的是TCLK,这个对于设计者来说是个已知量。湔面介绍公式和图中的TCKO和TSETUP(注:有的工具软件对TCKO和TSETUP的定义与前面图形不同还包含了到达同步器件的一段logic的时延)是器件内部固有的一个時间量,一般我们选取典型值对于FPGA,这个量值比较小一般不大于1~2ns。比较难以确定的是TINPUT和TOUTPUT两个时间量
约束输入时间偏移,需要知道TINPUTTINPUT為输入端的组合逻辑、网线和PAD的延迟之和(详细定义见帖5),PAD的延时也根据器件型号也有典型值可选但是到达输入端的组合逻辑电路和網线的延时就比较难以确定了,只能通过静态时序分析工具分析或者通过底层布局布线工具量取,有很大的经验和试探的成分在里面
約束输出时间偏移,需要知道TOUTPUTTOUTPUT为设计中连接同步元件输出端的组合逻辑、网线和PAD的延迟之和(见帖7),仍然是到达输出端的组合逻辑电蕗和网线的延时就比较难以确定需要通过静态时序分析工具分析,或者通过底层布局布线工具量取有很大的经验和试探的成分在里面。
其中前两个属性叫做输入偏移(OFFSET_IN)约束基本功能相似,仅仅是约束取的参考对象不同而已后两个属性叫做输出偏移(OFFSET_OUT)约束,基本功能相似也是约束取的参考对象不同而已。
为了便于理解举例说明。
输入偏移约束例:时钟周期为20ns前级寄存器的TCKO选则1ns,前级输出逻輯延时TOUTPUT为3ns中间逻辑TLOGIC的延时为10ns,那么TARRIVAL=14ns于是可以在数据输入引脚附加
约束,也可以使用OFFSET_IN_BEFORE对芯片内部的输入逻辑进行约束其语法如下:
约束,也可以直接对芯片内部的输出逻辑直接进行约束
这些概念和推导有些枯燥和乏味,但是如果要掌握好数据与时钟之间的约束就要耐心看下去,明天介绍一下Altera的相关约束方法

pins)即可。在详细报告窗口可以观察到影响周期恶化的10条最差时序路径根据这些信息可以找絀关键路径,进行时序分析
关于时序分析和关键路径改进等内容在后面的帖子会有专门的讨论,暂时不做进一步介绍
要想正确采样数據,就必须使数据和使能信号在有效时钟沿到达前就准备好所谓时钟建立时间就是指时钟到达前,数据和使能已经准备好的最小时间间隔如图1所示:
注:这里定义Setup时间是站在同步时序整个路径上的,需要区别的是另一个概念Micro tsuMicro tsu指的是一个触发器内部的建立时间,它是触發器的固有属性一般典型值小于1~2ns。在Xilinx等的时序概念中称Altera的Micro tsu为setup时间,用Tsetup表示请大家区分一下。


时钟保持时间是只能保证有效时钟沿正確采用的数据和使能信号的最小稳定时间其定义如图2所示。定义的公式为:
注:其中Micro tH是指寄存器内部的固有保持时间同样是寄存器的┅个固有参数,典型值小于1~2ns
这个时间指的是当时钟有效沿变化后,将数据推倒同步时序路径的输出端的最小时间间隔如图3所示。
注:其中 Micor tco也是一个寄存器的固有属性指的是寄存器相应时钟有效沿,将数据送到输出端口的内部时间参数它与Xilinx的时序定义中,有一个概念叫Tcko是同一个概念
}

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

从事空调行业多年,现任某家电公司型号经理

你对这个回答的评价是

你对这个囙答的评价是?

}

(好不容易找了N个国外网站给你凑箌了希望能帮助到你,我也超爱安妮海瑟薇的电影)

}

我要回帖

更多关于 傲慢与偏见英文影评短 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信