精华内容
参与话题
问答
  • setup()函数

    千次阅读 2013-10-09 11:29:48
    程序刚启动时,调用setup()函数.用于初始化变量,设置针脚的输出/输入类型,配置串口,引入库文件等等. 每次Arduino上电或重启后,setup函数只运行一次. 例子: int buttonPin = 10; //设置第10个脚为输出或输入 ...

    程序刚启动时,调用setup()函数.用于初始化变量,设置针脚的输出/输入类型,配置串口,引入库文件等等每次Arduino上电或重启后,setup函数只运行一次.

    例子:

    int buttonPin = 10; //设置第10个脚为输出或输入

     

    void setup()

    {

      Serial.begin(9600);   //以波特率9600开始

      pinMode(buttonPin, INPUT);//  将指定的引脚配置成输出或输入。

    }

     

    void loop()

    {

      // ...

    }

     

    展开全文
  • setup&hold time概念及违约修复 从D触发器的构成来认识setup&hold time 众所周知,setup和hold作为timing分析与验证中最重要的概念之一,是时序电路正常工作必须满足的条件。但是很多初学者甚至某些工作数年...

    setup&hold time概念及违约修复

    从D触发器的构成来认识setup&hold time

    众所周知,setup和hold作为timing分析与验证中最重要的概念之一,是时序电路正常工作必须满足的条件。

    但是很多初学者甚至某些工作数年的工程师,对时序电路需要验证setup和hold背后的原理可能并不清楚。

    下图是上升沿触发的D触发器的一种典型的基于传输门的设计原理:

    上升沿D触发器原理图

    首先我们先把注意力集中在电路的前半部分。

    假设CLK的初始状态为0,此时第一个传输门导通,信号走向为:

    D -> a -> b -> c -> d 注:路径1

    从以上信号走向可以看出,信号必须在CLK上升沿到来之前在d点保持稳定,否则如果在这之前D pin的信号发生变化,就会导致DFF锁住错误的信号。换句话说,如果假设路径1需要花费的时间为t0,那么D处的信号必须要在CLK上升沿之前的t0或更早的时间内保持稳定。此即setup的物理意义,也是timing report种library setup time所代表的含义。

    接着,当CLK从0变成1后,D与a之间的传输门关闭,a与d之间的传输门导通,此时信号走向为:

    d -> a -> -> b -> e -> f(Q) -> g -> h

    需要注意的是,当信号从0变为1的过程中,在一段很短的时间内,所有传输门都可能导通,若此时D端信号发生变化而CLK的transition比较慢,则会发生新值覆盖旧值而导致信号错误的现象。因此,D段信号需要在传输门完成开/关过程中保持稳定,此即为hold的物理意义,也是timing report中library hold time代表的含义。

    setup&hold time计算公式推导

    STA分析是基于同步电路设计模型的,在数据输入端,假设外部也是同时钟的寄存器的输出并且经过若干组合逻辑进入本级,而输出也被认为是驱动后一级的同时钟的寄存器。在不设置约束的情况下,纯组合逻辑的输入->输出不得超过一个T,否则也会被认为是Timing

    1. Timing path

    Timing path就是时间线。Timing就是从起始位置的时间点到终点位置的时间点之间的时间长度。Path是指跟位置相关,即时间起始或终点的位置。Timing path就是某位置的某一时间点到另一位置的某个时间点。对于DFF来说,上升沿类似于一瞬间的脉冲,只有在这短短的一瞬间,数据才允许通过。对于DFF来说,有两个输入点:数据D和时钟CK,有一个输出点:数据Q。由于是时间比较,所以对于DCK一定要有一个共同的起始时间点,如下图中的A点出现clk上升沿的时刻。如下图,假设我们分析DFF2的数据和时钟到达的时间。二者共同的出发点是A的上升沿,因为A位于时钟通路上,FF1的时钟经过A点到达FF1-C点,在FF1-C上升沿打开FF1,然后数据才能从FF1-Q输出,进而传递到FF2-D。在A点, FF2的时钟沿经过clock tree,达到FF2-C点。所以数据走过的路程是:

    Data path: A->clk_tree_buf1->FF1-C -> FF1-Q -> Comb_logic -> B

    而对于FF2来说只要满足下个周期的上升沿能够采样即可,所以时钟到达FF2-C的路径是:

    Clk path: A -> clk_tree_buf2-> C.

     

    2. 什么是建立时间和保持时间?

    对于某个DFF来说,建立时间和保持时间可以认为是此器件固有的属性。有关DFF的内部结构及setup和hold时间对应的逻辑门会在其他文章中进行细致描述。

    在理想情况下,只要在时钟沿来临时,有效数据也来临(时钟沿之前或同时),则能够正确采集到数据;而在时钟沿之后(或同时),即使数据发生变化,也不会影响DFF的输出了。然而在实际中,上升沿打开开关需要时间,逻辑门的状态改变(电容充放电等)都需要时间,因此数据的采集是需要一定时间的,在这个时间内数据不能发生变化。上升沿时候开关关闭也需要时间,如果在这个时间段内数据有变化的话,那么新数据就有可能被传递到下一级,进而发生错误,所以数据必须保持一定时间不变。(细节部分可以参考DFF的内部结构)。

    总而言之在DFF的输入端口上看,

    •  clk上升沿来之前,数据必须提前一个最小时间量预先准备好,这个最小时间量就是建立时间;
    •  在clk上升沿来之后,数据必须保持一个最小时间量不能变化,这个最小时间量就是保持时间。


     

    3. 建立和保持时间要求、及其公式

    满足建立和保持时间要求,电路状态改变就是正确的,电路功能就不会发生错误;如果不满足,电容就没有足够的时间充放电,造输出点的电平可能既非0也非1,造成“亚稳态“输出。如果前级驱动够强劲,电路就能按照趋势变化下去,一定时间后该点的值就会变化为“正确值”,如果驱动不够强劲,电路就会恢复之前的值,最终得到何值是不可控的,所以我们要避免亚稳态。在使用DFF时,必须满足其建立时间和保持时间的要求。


    建立时间

    现在在回头分析data path和clk path,假设t0时刻FF1采集到数据并传递给FF2,那么FF2只要在t10上升沿采到数据即可,所以数据有一整个Tperiod的时间来传递到FF2-D端。因为要满足建立时间要求,所以对于FF2来说,数据要比时钟“走得快”:

    Tdata_path+ Tsetup <= Tclk_path+ Tperiod

    所以

    Tclk_delay_FF1 + Tc->q_FF1+ Tcomb_logic+ Tsetup <= Tclk_delay_FF2 +Tperiod

    在分析STA时,不满足此公式的即为setup violation。对应时序图的分析,见下图:


    保持时间

    保持时间比较难理解,其实质是当前时钟沿的FF1输出不能太快在当前沿到达FF2。以上图为例,即在t10时刻,为防止FF1采到的新数据太快到达FF2而“冲掉”原来的正确数据,数据必须要在一定时间之后才允许到达,所以保持时间分析,分析的是FF1和FF2的同一个时钟沿。因为datapath和clk_path要满足保持时间要求,所以

    Tdata_path– Thold >= Tclk_path

    所以:

    Tclk_delay_FF1 + Tc->q_FF1+ Tcomb_logic– Thold >= Tclk_delay_FF2

    在STA分析时,不满足此公式的即为Holdviolation。

    其中Tclk_skew =Tclk_delay_FF2– Tclk_delay_FF1. 这条公式在分析Tskew时用得上。

    对应于时序图,见如下图的分析:


    4. 实际电路的Setup和Hold公式及violation分析

    因为在不同的情形下,例如不同的温度,电压,loading等等,每一段电路的delay是不同的,所以对于同一段电路,其delay可以在如下范围中:

    Min_delay<= Delay <= max_delay

    如下图:


    建立时间

    公式为:   Tclk_delay_FF1 + Tc->q_FF1+Tcomb_logic + Tsetup <= Tclk_delay_FF2 + Tperiod

    应该满足MAX_data_path_delay + Tsetup  <= MIN_clk_path_delay + Tperiod,才能保证电路是可靠的。所以在实际电路中:

    Tdata_path_max+ Tsetup <= Tclk_path_min+ Tperiod

    对应上图,该公式应该是:

    2ns+ 11ns + 2ns + 9ns + 2ns + 4ns <= 2ns + 5ns + 2ns + Tperiod

    所以: 30 <= 9 + 15.因为违反了该公式,所以该电路出现了setup violation。

    保持时间

    公式为:  Tclk_delay_FF1 + Tc->q_FF1 + Tcomb_logic –Thold>= Tclk_delay_FF2

    应该满足MIN_data_path_delay – Thold>= MAX_clk_path_delay.才能保证电路是可靠的。所以在实际电路中:

    Tdata_path_min- Thold >= Tclk_path_max


    对应上图,该公式应该是:

    1ns +9ns + 1ns + 6ns + 1ns – 2ns >= 3ns + 9ns + 3ns

    所以: 16ns >= 15ns,满足公司要求,所以该电路无holdviolation。

     

    在某些电路中,可以认为clk tree上面没有延迟,可以认为wire没有延迟,那么setup和hold公式就得到简化。


    违约以及修复

    从上面的分析可以看到,数据跑得越快(TDelay越小),时钟传输时延越大(clock skew越大)对建立时间的满足越有利,而对保持时间的满足越不利,相反则对满足保持时间越有利,对满足建立时间越不利。建立时间还跟时钟周期有关系,时钟周期越小,越容易发生建立时间违例,而保持时间则跟时钟周期没有关系。在设计中,我们常常关注的是建立时间是否满足要求,因为它关系到我们能使用的最小时钟周期有多小,能否跑到预定的工作频率,而因为时钟通常都是走专门的快速线路,很难存在时钟传输时延过大的问题,所以一般也不会出现保持时间违例的情况。

    建立时间公式:Tsetup + Tdq + Tdata ≤ Tclk + Tskew
    Tdata = (Tcomb+T逻辑组合布线延迟)
    保持时间公式:Tdq + Tdata - Tskew ≥ Thold

    setup&hold time 违约修复主要参照上面的公式进行

    对于建立时间违例的解决办法按优先级有:

    1. 首先是修改代码,找到关键路径上的源寄存器和目的寄存器,拆分它们之间的组合逻辑。插入寄存器是最简单粗暴的办法,实际上在设计之初,如果我们精心设计的话,是可以在算法级对组合逻辑进行分解的,好的时序是设计出来的,不是约束出来的;
    2. 如果修改代码实在解决不了,在使用约束关键路径的办法;
    3. 应该还有其他很多办法,不过我暂时还不知道;
      如果上面都解决不了,我们还可以:
    4. 买更好更快的芯片,更好的芯片意味着更低的Tsu要求,更小的Tpd、Tcomb;
    5. 降低工作频率,即提高时钟周期。

    对于保持时间违例的解决办法按优先级有:

    1. 增加Tdata = (Tcomb+T逻辑组合布线延迟),具体操作是在data line上(两个触发器之间的组合逻辑块部分)插入buffer,反相器或者delay cell去增加Tdata;
    2. 增加前级D触发器的驱动延迟;
    3. 减小Tskew,减小时钟偏移;

    参考文章

    哈姆雷特,请保持前行!

    展开全文
  • 真正的理解setup time/hold time

    万次阅读 2015-01-15 13:15:01
    转自:... 什么叫做真正的理解setup time/hold time呢?...就是要讲明白的setup time和hold time,都知道setup time的公式是 Tclk > Tcq + Tcomb + Tsetup - Tske

    转自:http://www.cnblogs.com/poiu-elab/archive/2012/10/29/2745390.html


    什么叫做真正的理解setup time/hold time呢?

    听我道来。

    就是要讲明白的setup time和hold time,都知道setup time的公式是

    Tclk > Tcq + Tcomb + Tsetup - Tskew

    hold time的公式是

    Thold < Tcq + Tcomb - Tskew

    那么这两个公式是怎么来的呢?就是我要说明的问题

    在我下面所举的例子中,Tsetup和Thold都是针对DFF2而言的,而符号含义如下

    Tclk    = Frequency of clock
    Tcq     = Flop clock to Flop q delay
    Tcomb   = Delay on the combinational logic between the Flops
    Tsetup  = Required setup time of a Flop
    Thold   = Required hold time of a Flop
    Tskew   = Delay between clock edges of two adjacent flops(本例中,是CLK2落后于CLK1的时间)

    方便说明时序图给上

    (1)setup time

    先来看setup time,这时其实要看的是由于p1导致的DFF1的Q端变化在DFF2的D端需要提前Tsetup时间稳定下来

    就是以DFF1的p1时刻为基准,数据需要在DFF2的p3时刻采的时候满足Tsetup的要求

    那么以DFF1的p1时刻为基准的话,从p1时刻DFF1的值传到DFF2的D端需要的时间就是(Tcq + Tcomb)

    那么对于DFF2而言,下一个上升沿来临的时刻相对于p1时刻而言是(Tclk + Tskew),得到如下式子

    (Tclk + Tskew) - (Tcq + Tcomb) > Tsetup

    化简即得到平日所见的公式

    Tclk > Tcq + Tcomb + Tsetup - Tskew

    (2)hold time

    对于hold time,即是相对于DFF2的D端而言,p2时钟沿来了之后,不要立刻影响到p3采到的数据,使得p3能正常的采得数据,而p2来临之后,传递到D端时间还是(Tcq + Tcomb)

    而这就是要求变化的慢一点,要在p3这个沿之后来才好,那么算上要求的Thold,则需要D端至少保持(Thold + Tskew)这么长的时间,即是

    Tcq + Tcomb > Thold + Tskew

    经过化简,得到平日里所用的公式

    Thold < Tcq + Tcomb - Tskew

     

    这就是setup time/ hold time的公式的由来,理解起来还算不太难,但是就是一开始都是没有很深刻的理解


    展开全文
  • Vivado时序分析概念setup time, hold time reference What is Setup and hold time in an FPGA? Propagation delay in an FPGA or ASIC? 时序分析之Arriva...

    reference

    What is Setup and hold time in an FPGA?

    Propagation delay in an FPGA or ASIC?

    时序分析之Arrival Time

    时序分析之Slack

    另外ug906的第五章介绍了时序分析的基础。最一开始介绍的就是timing path的概念,进而引出了时序分析的两个关键分析点setup slack analysis和hold slack analysis。

    作为基础,本文的reference当中提到了setup time和hold time的概念:

    setup time: Setup time is the amount of time required for the input to a Flip-Flop to be stable before a clock edge.

    hold time: Hold time is the minimum amount of time required for the input to a Flip-Flop to be stable after a clock edge.

    1479998-20190317220404364-1035063511.png

    这里\(t_{su}\)就是setup time,\(t_h\)就是那个hold time。setup time和hold time对于一个触发器来说是固定的参数。也就是说要完成一次正常的数据锁存,数据必须要在setup time和hold time的时候保持稳定。

    在实际的电路当中一个触发器的运行周期必须满足:
    \[ t_{clk(min)} = t_{su} + t_h +t_p \]
    这里只有\(t_p\)(传输延时)是可变的,与具体的电路结构设计有关。传输的延时越短,FPGA可运行的时钟速率就越高。

    再来看xilinx当中的Setup/Recovery Relationship的概念。Xilinx说:

    The setup check is performed only on the most pessimistic setup relationship between two clocks.

    ​ -ug906(v2016.4)P153

    因为(dst的setup time)setup time是固定的,所以只要能保证在收发脉冲上升沿时间差值最短的时候保证没有问题,那么实际运行应该就不会出现问题。所以检查的是required_time - arrival_time。

    Data Required Time(hold) =

    ​ capture edge time

    ​ +destination clock path delay

    ​ -clock uncertainty

    ​ -setup time

    Data Arrival Time(hold) =

    ​ launch edge time

    ​ +source clock path delay

    ​ +datapath delay

    Slack(hold) =

    ​ Data Required Time-Data Arrival Time

    在接收端dst的hold time也是固定的,如果在hold时间还没结束的时候下个数据就被推过来了。在当前传输的数据就有可能被覆盖掉。所以hold check检查的是arrival_time - required_time。

    Data Required Time(hold) =

    ​ capture edge time

    ​ +destination clock path delay

    ​ -clock uncertainty

    ​ +hold time

    Data Arrival Time(hold) =

    ​ launch edge time

    ​ +source clock path delay

    ​ +datapath delay

    Slack(hold) =

    ​ Data Arrival Time-Data Required Time

    本来hold分许也叫作Min delay analysis,可以这样理解如果把setup Slack的计算公式当做是一种标准型,那么我们就希望Min delay这个值负的越多越好。当然这里实际是反过来了,取了个相反数,那就是越大越好。

    陈小硕的那两个个cnblog的文章讲述的非常清晰,但是感觉理解起来有点过于复杂了,我觉得简化来说,setup slack就是指在数据setup time之前多久数据必须到达才行。hold slack就是在数据hold time之后数据必须保持多久,才能让下一个数据过来(hold是在说下一个launch edge了)。

    posted on 2019-03-17 22:04 luckfyzh 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lafiizh/p/10549246.html

    展开全文
  • 文章目录1. 静态时序分析与动态时序分析2. 同步设计中的建立时间和保持时间3.... launch和capture edge8.setup time和hold time时序图9. 另一种表达方式10. 相关问题10.1问题110.2 问题210.3 问题310.4 问题410.5 问
  • Setup time 和Hold time计算关系的理解

    千次阅读 2017-11-28 00:48:26
    有个著名的笔试题,这样说道:时钟周期为T,触发器D1的建立时间最大为T1max,最小为T1min,该触发器的数据输出延时为Tco。组合逻辑电 路最大延迟为 T2max,最小为T2min。假设D1在前,D2去采样D1的数据(实际就是对图2的...
  • setup函数

    千次阅读 2013-11-28 20:52:49
    private String name; public void setup ( Context context ) { this.name = context.getConfiguration().get("name"); 这样在map方法里就可以直接用this.name了 }
  • 善用setup函数

    2016-03-05 16:12:52
    1. Setup函数的理解 (摘自:http://caibinbupt.iteye.com/blog/338831) Mapper的四个方法是setup,map,cleanup和run。其中,setup和cleanup用于管理Mapper生命周期中的资源,setup在完成Mapper构造,即将...
  • Vue 3 setup 函数

    2020-11-12 20:14:12
    setupsetup 函数可以说是 Vue 3 一个入口函数。参数使用 setup 函数时,它将接受两个参数:propscontext让我们更深入地研究如何使用每个参数。Propsset...
  • vue3.0 Composition API 上手初体验 神奇的 setup 函数 (三) 生命周期函数 通过前面两讲,我相信大家对于 vue 3.0 双向绑定数据,已经有了一些了解了。但是,对于生命周期函数,还是一脸懵逼的。 这一讲,我们来讲解...
  • vue3.0 Composition API 上手初体验 神奇的 setup 函数 (一) 响应数据的绑定 从网上大家对于 vue 3.0 的最大的变化,就是 Vue Composition API 的看法来说,两极分化比较严重。一种是认为这种写法实在太优秀了,很好...
  • hadoop中的MapReduce框架里已经预定义了相关的接口,其中如Mapper类下的方法setup()和cleanup()。 ----setup() 此方法被MapReduce框架仅且执行一次,在执行Map任务前,进行相关变量或者资源的集中初始化工作。 ...
  • Vue3.0的setup函数

    2020-10-21 14:16:40
    setup函数的特性: 使用Composition API 的入口 在beforeCreate之前调用 在setup中没有this 可以返回一个对象,这个对象的属性被合并到渲染上下文,并可以在模板中直接使用; 接收props对象作为第一个参数,接收来...
  • 在内核代码中经常会看到__setup函数,这个函数从哪来,到哪去?下面我们逐一分析 例如在I2C驱动中就有这么一个setup函数: __setup("i2c_bus=", omap_i2c_bus_setup); 我们先要直到它是从哪来的:看如下代码: #...
  • setup 函数可以说是 Vue 3 一个入口函数。 参数使用 setup 函数时,它将接受两个参数: props context 让我们更深入地研究如何使用每个参数。 Propssetup 函数中的第一个参数是 props。正如在一个标准组件中所期望的...
  • 最近尝试使用compositionAPI仿cnode网站,在写路由跳转时遇到了一个问题,在setup函数中无法访问到$router对象。 在Vue2.x中可以在methods选项中的函数可以通过this访问到$router对象,因为this是当前vue实例;但是...
  • // html //点击count+1
  • setup() 函数 , 专门为属性所提供的新属性,它为Vue3的 Composition API 新特性提供了统一的入口 setup() 函数的执行时间 会在 beforeCreate() 和 created() 之前
  • vue3.0 Composition API 上手初体验 神奇的 setup 函数 (二) 响应对象数据的绑定 上文中,我们已经了解普通响应数据的绑定了。但是,那只是普通数据,我们在实际开发中,用到的对象数据是最多的。这一讲,我们就来讲...
  • __setup 在内核中的作用

    千次阅读 2012-05-29 16:40:18
    介绍的很详细,我也正好用了一次__setup(),蛮好用的:),今天回头看main.c,又搜索了一下,分享给大家:  __setup( //做了一次完整的盗贼,我毫无修改的抄袭了一次,但有时间会做量身裁减的// from ...
  • setup1、__setup使用示例2、__setup宏原理3、__setup链接函数的调用 1、__setup使用示例 我们先看一个例子,在driver中,定义下面这一段函数,并加上__setup注册 static int __init skip_initramfs_param(char *str)...
  • 让你明白:arduino中的setup和loop函数

    千次阅读 2020-04-04 17:38:04
    今天看arduino的源代码,对于arduino中的setup和loop有了新的理解,可能你以前对于这俩个函数就是知道arduino是初始化,而loop是死循环,但是托若你看了Arduino的主函数你会有更加清晰的认知 下面贴出arduino的main...
  • python中的setup.py详解

    千次阅读 2015-08-27 08:29:58
    其实对于setup.py和setup.cfg的关注是从OpenStack的源码包中开始的,OpenStack每个组件的发布时都是一个tar.gz包,同样,我们直接从github上clone代码后也会发现两个文件的存在。当阅读Nova或Ceilometer(其他组件...
  • 用过调用setUp()函数实现初始化代码。 当运行测试的使用,测试架构自动调用setUp() 在测试运行时,如果setUp()出现一个异常,框架将认为测试出现错误,测试代码将不被执行。 ''' from unittest import TestCase,main...
  • python的setup问题

    万次阅读 2016-11-10 11:54:30
    最近在研究检测里面如何调用python层的,首先就是setup这个文件,所以需要简单了解一下。 编写setup.py文件,获取帮助:Python setup.py --help-commands Standard commands: build build everything needed to ...
  • python setUp方法

    2019-11-14 17:54:14
    unittest.TestCase 类包含方法 setUp() ,让我们只需创建这些对象一次,并在每个测试方法中使用它们。如果你在 TestCase 类中包含了方法 setUp() , Python 将先运行它,再运行各个以 test_ 打头的方法。这样...
  • vue3.0 Composition API 上手初体验 神奇的 setup 函数 (四) 计算属性 computed 上一讲中,我们讲解了 vue 3.0 的生命周期,我相信大家已经了然了。在 vue 中,计算属性 computed 是非常常用的。那么,在 vue 3.0 中...
  • 不需要太多的语言基础 /* Blink Turns an LED on for one second, then off for one second, repeatedly. Most Arduinos have an on-board LED you can control.... it is attached to digital pin 13, on MKR1000...
  • @pytest.fixture装饰器用来做测试用例的预置条件,相当于unittest中的setup函数,如果要在预置条件中传参数,该如何进行呢? 1.传参就用默认的request参数 2.接收参数用request.param #!usr/bin/python # -*- ...
  • Pytest的setup和teardown函数 4.2.1。概述 1.setup和teardown主要分为:模块级,类级,功能级,函数级。 2.存在于测试类内部 4.2.2.函数级别setup()/teardown() 运行于测试方法的始末,即:运行一次...

空空如也

1 2 3 4 5 ... 20
收藏数 626,576
精华内容 250,630
关键字:

setup