精华内容
下载资源
问答
  • 1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其...

    1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?

    同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。

    电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其子系统同步运作,而异步电路不使用时钟脉冲做同步,其子系统是使用特殊的“开始”和 “完成”信号使之同步。由于异步电路具有下列优点--无时钟歪斜问题、低电源消耗、平均效能而非最差效能、模块性、可组合和可复用性--因此近年来对异步 电路研究增加快速,论文发表数以倍增,而Intel Pentium 4处理器设计,也开始采用异步电路设计。

    异步电路主要是组合逻辑电路,用于产生地址译码器、FIFO或RAM的读写控制信号脉冲,其逻辑输出与任何时钟信号都没有关系,译码输出产生的毛刺通常是 可以监控的。同步电路是由时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路,其所有操作都是在严格的时钟控制下完成的。这些时序电路共享同一个时 钟CLK,而所有的状态变化都是在时钟的上升沿(或下降沿)完成的。

    2、什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求?线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用oc门来实现(漏极或者集电极开路),由于不用oc门可能使灌电流过大,而烧坏逻辑门,同时在输出端口应加一个上拉电阻。(线或则是下拉电阻)

    3、什么是Setup 和Holdup时间,setup和holdup时间区别.

    Setup/hold time 是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(如上升沿 有效)T时间到达芯片,这个T就是建立时间-Setup time.如不满足setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。保持时间是指触发器的时钟信号上升沿到来以后,数据稳定 不变的时间。如果hold time不够,数据同样不能被打入触发器。

    建立时间(Setup Time)和保持时间(Hold time)。建立时间是指在时钟边沿前,数据信号需要保持不变的时间。保持时间是指时钟跳变边沿后数据信号需要保持不变的时间。如果不满足建立和保持时间 的话,那么DFF将不能正确地采样到数据,将会出现stability的情况。如果数据信号在时钟沿触发前后持续的时间均超过建立和保持时间,那么超过量 就分别被称为建立时间裕量和保持时间裕量。

    4、什么是竞争与冒险现象?怎样判断?如何消除?

    在组合逻辑中,由于门的输入信号通路中经过了不同的延时,导致到达该门的时间不一致叫竞争。产生毛刺叫冒险。如果布尔式中有相反的信号则可能产生竞争和冒险现象。解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。

    5、你知道那些常用逻辑电平?TTL与COMS电平可以直接互连吗?

    常用逻辑电平:12V,5V,3.3V;TTL和CMOS不可以直接互连,由于TTL是在0.3-3.6V之间,而CMOS则是有在12V的有在5V的。 CMOS输出接到TTL是可以直接互连。TTL接到CMOS需要在输出端口加一上拉电阻接到5V或者12V。cmos的高低电平分别 为:Vih>=0.7VDD,Vil<=0.3VDD;Voh>=0.9VDD,Vol<=0.1VDD. TTL的为:Vih>=2.0v,Vil<=0.8v;Voh>=2.4v,Vol<=0.4v. 用cmos可直接驱动ttl;加上拉后,ttl可驱动cmos.

    6、如何解决亚稳态。亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何 时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触 发器级联式传播下去。

    解决方法:

    1 降低系统时钟

    2 用反应更快的FF

    3 引入同步机制,防止亚稳态传播

    4 改善时钟质量,用边沿变化快速的时钟信号

    关键是器件使用比较好的工艺和时钟周期的裕量要大。

    7、IC设计中同步复位与异步复位的区别。

    同步复位在时钟沿采复位信号,完成复位动作。异步复位不管时钟,只要复位信号满足条件,就完成复位动作。异步复位对复位信号要求比较高,不能有毛刺,如果其与时钟关系不确定,也可能出现亚稳态。

    8、MOORE 与 MEELEY状态机的特征。

    Moore 状态机的输出仅与当前状态值有关, 且只在时钟边沿到来时才会有状态变化. Mealy 状态机的输出不仅与当前状态值有关, 而且与当前输入值有关.

    9、多时域设计中,如何处理信号跨时域。

    不同的时钟域之间信号通信时需要进行同步处理,这样可以防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响,其中对于单个控制信号可以用两级同步器,如电平、边沿检测和脉冲,对多位信号可以用FIFO,双口RAM,握手信号等。

    跨时域的信号要经过同步器同步,防止亚稳态传播。例如:时钟域1中的一个信号,要送到时钟域2,那么在这个信号送到时钟域2之前,要先经过时钟域2的同步 器同步后,才能进入时钟域2。这个同步器就是两级d触发器,其时钟为时钟域2的时钟。这样做是怕时钟域1中的这个信号,可能不满足时钟域2中触发器的建立 保持时间,而产生亚稳态,因为它们之间没有必然关系,是异步的。这样做只能防止亚稳态传播,但不能保证采进来的数据的正确性。所以通常只同步很少位数的信 号。比如控制信号,或地址。当同步的是地址时,一般该地址应采用格雷码,因为格雷码每次只变一位,相当于每次只有一个同步器在起作用,这样可以降低出错概 率,象异步FIFO的设计中,比较读写地址的大小时,就是用这种方法。 如果两个时钟域之间传送大量的数据,可以用异步FIFO来解决问题。

    10、给了reg的setup,hold时间,求中间组合逻辑的delay范围。

    Delay < period - setup – hold

    11、时钟周期为T,触发器D1的寄存器到输出时间最大为T1max,最小为T1min。组合逻辑电路最大延迟为T2max,最小为T2min。问,触发器D2的建立时间T3和保持时间应满足什么条件。

    T3setup>T+T2max,T3hold>T1min+T2min

    12、给出某个一般时序电路的图,有Tsetup,Tdelay,Tck->q,还有 clock的delay,写出决定最大时钟的因素,同时给出表达式。

    T+Tclkdealy>Tsetup+Tco+Tdelay;

    Thold>Tclkdelay+Tco+Tdelay;

    13、说说静态、动态时序模拟的优缺点。

    静态时序分析是采用穷尽分析方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过 对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。它不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计 进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计,因此静态时序分析已经越来越多地被用到数字集成电路设计的验证中。

    动态时序模拟就是通常的仿真,因为不可能产生完备的测试向量,覆盖门级网表中的每一条路径。因此在动态时序分析中,无法暴露一些路径上可能存在的时序问题;

    14、一个四级的Mux,其中第二级信号为关键信号 如何改善timing。关键:将第二级信号放到最后输出一级输出,同时注意修改片选信号,保证其优先级未被修改。

    15、为什么一个标准的倒相器中P管的宽长比要比N管的宽长比大?

    和载流子有关,P管是空穴导电,N管电子导电,电子的迁移率大于空穴,同样的电场下,N管的电流大于P管,因此要增大P管的宽长比,使之对称,这样才能使得两者上升时间下降时间相等、高低电平的噪声容限一样、充电放电的时间相等

    16、latch与register的区别,为什么现在多用register.行为级描述中latch如何产生的。latch是电平触发,register是边沿触发,register在同一时钟边沿触发下动作,符合同步电路的设计思想,而latch则属于异步电路设计,往往会导致时序分析困难,不适当的应用latch则会大量浪费芯片资源。

    17、BLOCKING NONBLOCKING 赋值的区别。

    非阻塞赋值:块内的赋值语句同时赋值,一般用在时序电路描述中

    展开全文
  • 1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其...

    1、什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?

    同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。

    电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其子系统同步运作,而异步电路不使用时钟脉冲做同步,其子系统是使用特殊的“开始”和 “完成”信号使之同步。由于异步电路具有下列优点--无时钟歪斜问题、低电源消耗、平均效能而非最差效能、模块性、可组合和可复用性--因此近年来对异步 电路研究增加快速,论文发表数以倍增,而Intel Pentium 4处理器设计,也开始采用异步电路设计。

    异步电路主要是组合逻辑电路,用于产生地址译码器、FIFO或RAM的读写控制信号脉冲,其逻辑输出与任何时钟信号都没有关系,译码输出产生的毛刺通常是 可以监控的。同步电路是由时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路,其所有操作都是在严格的时钟控制下完成的。这些时序电路共享同一个时 钟CLK,而所有的状态变化都是在时钟的上升沿(或下降沿)完成的。

    2、什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求?线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用oc门来实现(漏极或者集电极开路),由于不用oc门可能使灌电流过大,而烧坏逻辑门,同时在输出端口应加一个上拉电阻。(线或则是下拉电阻)

    3、什么是Setup 和Holdup时间,setup和holdup时间区别.

    Setup/hold time 是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(如上升沿 有效)T时间到达芯片,这个T就是建立时间-Setup time.如不满足setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。保持时间是指触发器的时钟信号上升沿到来以后,数据稳定 不变的时间。如果hold time不够,数据同样不能被打入触发器。

    建立时间(Setup Time)和保持时间(Hold time)。建立时间是指在时钟边沿前,数据信号需要保持不变的时间。保持时间是指时钟跳变边沿后数据信号需要保持不变的时间。如果不满足建立和保持时间 的话,那么DFF将不能正确地采样到数据,将会出现stability的情况。如果数据信号在时钟沿触发前后持续的时间均超过建立和保持时间,那么超过量 就分别被称为建立时间裕量和保持时间裕量。

    4、什么是竞争与冒险现象?怎样判断?如何消除?

    在组合逻辑中,由于门的输入信号通路中经过了不同的延时,导致到达该门的时间不一致叫竞争。产生毛刺叫冒险。如果布尔式中有相反的信号则可能产生竞争和冒险现象。解决方法:一是添加布尔式的消去项,二是在芯片外部加电容。

    5、你知道那些常用逻辑电平?TTL与COMS电平可以直接互连吗?

    常用逻辑电平:12V,5V,3.3V;TTL和CMOS不可以直接互连,由于TTL是在0.3-3.6V之间,而CMOS则是有在12V的有在5V的。 CMOS输出接到TTL是可以直接互连。TTL接到CMOS需要在输出端口加一上拉电阻接到5V或者12V。cmos的高低电平分别 为:Vih>=0.7VDD,Vil<=0.3VDD;Voh>=0.9VDD,Vol<=0.1VDD. TTL的为:Vih>=2.0v,Vil<=0.8v;Voh>=2.4v,Vol<=0.4v. 用cmos可直接驱动ttl;加上拉后,ttl可驱动cmos.

    6、如何解决亚稳态。亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何 时输出才能稳定在某个正确的电平上。在这个稳定期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触 发器级联式传播下去。

    解决方法:

    1 降低系统时钟

    2 用反应更快的FF

    3 引入同步机制,防止亚稳态传播

    4 改善时钟质量,用边沿变化快速的时钟信号

    关键是器件使用比较好的工艺和时钟周期的裕量要大。

    7、IC设计中同步复位与异步复位的区别。

    同步复位在时钟沿采复位信号,完成复位动作。异步复位不管时钟,只要复位信号满足条件,就完成复位动作。异步复位对复位信号要求比较高,不能有毛刺,如果其与时钟关系不确定,也可能出现亚稳态。

    8、MOORE 与 MEELEY状态机的特征。

    Moore 状态机的输出仅与当前状态值有关, 且只在时钟边沿到来时才会有状态变化. Mealy 状态机的输出不仅与当前状态值有关, 而且与当前输入值有关.

    9、多时域设计中,如何处理信号跨时域。

    不同的时钟域之间信号通信时需要进行同步处理,这样可以防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响,其中对于单个控制信号可以用两级同步器,如电平、边沿检测和脉冲,对多位信号可以用FIFO,双口RAM,握手信号等。

    跨时域的信号要经过同步器同步,防止亚稳态传播。例如:时钟域1中的一个信号,要送到时钟域2,那么在这个信号送到时钟域2之前,要先经过时钟域2的同步 器同步后,才能进入时钟域2。这个同步器就是两级d触发器,其时钟为时钟域2的时钟。这样做是怕时钟域1中的这个信号,可能不满足时钟域2中触发器的建立 保持时间,而产生亚稳态,因为它们之间没有必然关系,是异步的。这样做只能防止亚稳态传播,但不能保证采进来的数据的正确性。所以通常只同步很少位数的信 号。比如控制信号,或地址。当同步的是地址时,一般该地址应采用格雷码,因为格雷码每次只变一位,相当于每次只有一个同步器在起作用,这样可以降低出错概 率,象异步FIFO的设计中,比较读写地址的大小时,就是用这种方法。 如果两个时钟域之间传送大量的数据,可以用异步FIFO来解决问题。

    10、给了reg的setup,hold时间,求中间组合逻辑的delay范围。

    Delay < period - setup – hold

    11、时钟周期为T,触发器D1的寄存器到输出时间最大为T1max,最小为T1min。组合逻辑电路最大延迟为T2max,最小为T2min。问,触发器D2的建立时间T3和保持时间应满足什么条件。

    T3setup>T+T2max,T3hold>T1min+T2min

    12、给出某个一般时序电路的图,有Tsetup,Tdelay,Tck->q,还有 clock的delay,写出决定最大时钟的因素,同时给出表达式。

    T+Tclkdealy>Tsetup+Tco+Tdelay;

    Thold>Tclkdelay+Tco+Tdelay;

    13、说说静态、动态时序模拟的优缺点。

    静态时序分析是采用穷尽分析方法来提取出整个电路存在的所有时序路径,计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求,通过 对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。它不需要输入向量就能穷尽所有的路径,且运行速度很快、占用内存较少,不仅可以对芯片设计 进行全面的时序功能检查,而且还可利用时序分析的结果来优化设计,因此静态时序分析已经越来越多地被用到数字集成电路设计的验证中。

    动态时序模拟就是通常的仿真,因为不可能产生完备的测试向量,覆盖门级网表中的每一条路径。因此在动态时序分析中,无法暴露一些路径上可能存在的时序问题;

    14、一个四级的Mux,其中第二级信号为关键信号 如何改善timing。关键:将第二级信号放到最后输出一级输出,同时注意修改片选信号,保证其优先级未被修改。

    15、为什么一个标准的倒相器中P管的宽长比要比N管的宽长比大?

    和载流子有关,P管是空穴导电,N管电子导电,电子的迁移率大于空穴,同样的电场下,N管的电流大于P管,因此要增大P管的宽长比,使之对称,这样才能使得两者上升时间下降时间相等、高低电平的噪声容限一样、充电放电的时间相等

    16、latch与register的区别,为什么现在多用register.行为级描述中latch如何产生的。latch是电平触发,register是边沿触发,register在同一时钟边沿触发下动作,符合同步电路的设计思想,而latch则属于异步电路设计,往往会导致时序分析困难,不适当的应用latch则会大量浪费芯片资源。

    17、BLOCKING NONBLOCKING 赋值的区别。

    非阻塞赋值:块内的赋值语句同时赋值,一般用在时序电路描述中

    展开全文
  • 从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个...

    转自:http://www.elecfans.com/baike/wangluo/fuyongqi/20180307644141.html

    一、什么是socket?

    我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。不过话说回来了 ,计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是文件描述符,即通常所说的fd,一个fd就是一个整数,所以,对这个整数的操作,就是对这个文件(流)的操作。我们创建一个socket,通过系统调用会返回一个文件描述符,那么剩下对socket的操作就会转化为对这个描述符的操作。不能不说这又是一种分层和抽象的思想。

    二、阻塞?

    什么是程序的阻塞呢?想象这种情形,比如你等快递,但快递一直没来,你会怎么做?有两种方式:

    快递没来,我可以先去睡觉,然后快递来了给我打电话叫我去取就行了。

    快递没来,我就不停的给快递打电话说:擦,怎么还没来,给老子快点,直到快递来。

    很显然,你无法忍受第二种方式,不仅耽搁自己的时间,也会让快递很想打你。

    而在计算机世界,这两种情形就对应阻塞和非阻塞忙轮询。

    非阻塞忙轮询:数据没来,进程就不停的去检测数据,直到数据来。

    阻塞:数据没来,啥都不做,直到数据来了,才进行下一步的处理。

    先说说阻塞,因为一个线程只能处理一个套接字的I/O事件,如果想同时处理多个,可以利用非阻塞忙轮询的方式,伪代码如下:

    [cpp] view plain copywhile true

    {

    for i in stream[]

    {

    if i has data

    read unTIl unavailable

    }

    }

    我们只要把所有流从头到尾查询一遍,就可以处理多个流了,但这样做很不好,因为如果所有的流都没有I/O事件,白白浪费CPU时间片。正如有一位科学家所说,计算机所有的问题都可以增加一个中间层来解决,同样,为了避免这里cpu的空转,我们不让这个线程亲自去检查流中是否有事件,而是引进了一个代理(一开始是select,后来是poll),这个代理很牛,它可以同时观察许多流的I/O事件,如果没有事件,代理就阻塞,线程就不会挨个挨个去轮询了,伪代码如下:

    [cpp] view plain copywhile true

    {

    select(streams[]) //这一步死在这里,知道有一个流有I/O事件时,才往下执行

    for i in streams[]

    {

    if i has data

    read unTIl unavailable

    }

    }

    但是依然有个问题,我们从select那里仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

    epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))伪代码如下:

    [cpp] view plain copywhile true

    {

    acTIve_stream[] = epoll_wait(epollfd)

    for i in acTIve_stream[]

    {

    read or write till

    }

    }

    可以看到,select和epoll最大的区别就是:select只是告诉你一定数目的流有事件了,至于哪个流有事件,还得你一个一个地去轮询,而epoll会把发生的事件告诉你,通过发生的事件,就自然而然定位到哪个流了。不能不说epoll跟select相比,是质的飞跃,我觉得这也是一种牺牲空间,换取时间的思想,毕竟现在硬件越来越便宜了。

    三、I/O多路复用

    好了,我们讲了这么多,再来总结一下,到底什么是I/O多路复用。

    先讲一下I/O模型:

    首先,输入操作一般包含两个步骤:

    等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区。

    将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。

    其次了解一下常用的3种I/O模型:

    1、阻塞I/O模型

    最广泛的模型是阻塞I/O模型,默认情况下,所有套接口都是阻塞的。 进程调用recvfrom系统调用,整个过程是阻塞的,直到数据复制到进程缓冲区时才返回(当然,系统调用被中断也会返回)。

    什么是IO多路复用_IO多路复用,同步,异步,阻塞和非阻塞

    2、非阻塞I/O模型

    当我们把一个套接口设置为非阻塞时,就是在告诉内核,当请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。当数据没有准备好时,内核立即返回EWOULDBLOCK错误,第四次调用系统调用时,数据已经存在,这时将数据复制到进程缓冲区中。这其中有一个操作时轮询(polling)。

    什么是IO多路复用_IO多路复用,同步,异步,阻塞和非阻塞

    3、I/O复用模型

    此模型用到select和poll函数,这两个函数也会使进程阻塞,select先阻塞,有活动套接字才返回,但是和阻塞I/O不同的是,这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写(就是监听多个socket)。select被调用后,进程会被阻塞,内核监视所有select负责的socket,当有任何一个socket的数据准备好了,select就会返回套接字可读,我们就可以调用recvfrom处理数据。

    正因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个I/O操作,所以才叫做多路复用。

    什么是IO多路复用_IO多路复用,同步,异步,阻塞和非阻塞

    4、信号驱动I/O模型(signal driven I/O, SIGIO)

    首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它来读取数据报。无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达(第一阶段)期间,进程可以继续执行,不被阻塞。免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。

    什么是IO多路复用_IO多路复用,同步,异步,阻塞和非阻塞

    5、异步I/O模型(AIO, asynchronous I/O)

    进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

    这个模型工作机制是:告诉内核启动某个操作,并让内核在整个操作(包括第二阶段,即将数据从内核拷贝到进程缓冲区中)完成后通知我们。

    这种模型和前一种模型区别在于:信号驱动I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    高性能IO模型浅析

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:

    (1)同步阻塞IO(Blocking IO):即传统的IO模型。

    (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。

    (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,Java中的Selector和Linux中的epoll都是这种模型。

    (4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

    为了方便描述,我们统一使用IO的读操作作为示例。

    一、同步阻塞IO

    同步阻塞IO模型是最简单的IO模型,用户线程在内核进行IO操作时被阻塞。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    图1 同步阻塞IO

    如图1所示,用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作。

    用户线程使用同步阻塞IO模型的伪代码描述为:

    {

    read(socket, buffer);

    process(buffer);

    }

    即用户需要等待read将socket中的数据读取到buffer后,才继续处理接收的数据。整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。

    二、同步非阻塞IO

    同步非阻塞IO是在同步阻塞IO的基础上,将socket设置为NONBLOCK。这样做用户线程可以在发起IO请求后可以立即返回。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    图2 同步非阻塞IO

    如图2所示,由于socket是非阻塞的方式,因此用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。

    用户线程使用同步非阻塞IO模型的伪代码描述为:

    {

    while(read(socket, buffer) != SUCCESS)

    ;

    process(buffer);

    }

    即用户需要不断地调用read,尝试读取socket中的数据,直到读取成功后,才继续处理接收的数据。整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

    三、IO多路复用

    IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    图3 多路分离函数select

    如图3所示,用户首先将需要进行IO操作的socket添加到select中,然后阻塞等待select系统调用返回。当数据到达时,socket被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。

    从流程上来看,使用select函数进行IO请求和同步阻塞模型没有太大的区别,甚至还多了添加监视socket,以及调用select函数的额外操作,效率更差。但是,使用select以后最大的优势是用户可以在一个线程内同时处理多个socket的IO请求。用户可以注册多个socket,然后不断地调用select读取被激活的socket,即可达到在同一个线程内同时处理多个IO请求的目的。而在同步阻塞模型中,必须通过多线程的方式才能达到这个目的。

    用户线程使用select函数的伪代码描述为:

    {

    select(socket);

    while(1) {

    sockets = select();

    for(socket in sockets) {

    if(can_read(socket)) {

    read(socket, buffer);

    process(buffer);

    }

    }

    }

    }

    其中while循环前将socket添加到select监视中,然后在while内一直调用select获取被激活的socket,一旦socket可读,便调用read函数将socket中的数据读取出来。

    然而,使用select函数的优点并不仅限于此。虽然上述方式允许单线程内处理多个IO请求,但是每个IO请求的过程还是阻塞的(在select函数上阻塞),平均时间甚至比同步阻塞IO模型还要长。如果用户线程只注册自己感兴趣的socket或者IO请求,然后去做自己的事情,等到数据到来时再进行处理,则可以提高CPU的利用率。

    IO多路复用模型使用了Reactor设计模式实现了这一机制。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    图4 Reactor设计模式

    如图4所示,EventHandler抽象类表示IO事件处理器,它拥有IO文件句柄Handle(通过get_handle获取),以及对Handle的操作handle_event(读/写等)。继承于EventHandler的子类可以对事件处理器的行为进行定制。Reactor类用于管理EventHandler(注册、删除等),并使用handle_events实现事件循环,不断调用同步事件多路分离器(一般是内核)的多路分离函数select,只要某个文件句柄被激活(可读/写等),select就返回(阻塞),handle_events就会调用与文件句柄关联的事件处理器的handle_event进行相关操作。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    图5 IO多路复用

    如图5所示,通过Reactor的方式,可以将用户线程轮询IO操作状态的工作统一交给handle_events事件循环进行处理。用户线程注册事件处理器之后可以继续执行做其他的工作(异步),而Reactor线程负责调用内核的select函数检查socket状态。当有socket被激活时,则通知相应的用户线程(或执行用户线程的回调函数),执行handle_event进行数据读取、处理的工作。由于select函数是阻塞的,因此多路IO复用模型也被称为异步阻塞IO模型。注意,这里的所说的阻塞是指select函数执行时线程被阻塞,而不是指socket。一般在使用IO多路复用模型时,socket都是设置为NONBLOCK的,不过这并不会产生影响,因为用户发起IO请求时,数据已经到达了,用户线程一定不会被阻塞。

    用户线程使用IO多路复用模型的伪代码描述为:

    void UserEventHandler::handle_event() {

    if(can_read(socket)) {

    read(socket, buffer);

    process(buffer);

    }

    }

    {

    Reactor.register(new UserEventHandler(socket));

    }

    用户需要重写EventHandler的handle_event函数进行读取数据、处理数据的工作,用户线程只需要将自己的EventHandler注册到Reactor即可。Reactor中handle_events事件循环的伪代码大致如下。

    Reactor::handle_events() {

    while(1) {

    sockets = select();

    for(socket in sockets) {

    get_event_handler(socket).handle_event();

    }

    }

    }

    事件循环不断地调用select获取被激活的socket,然后根据获取socket对应的EventHandler,执行器handle_event函数即可。

    IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因为它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO,而非真正的异步IO。

    四、异步IO

    “真正”的异步IO需要操作系统更强的支持。在IO多路复用模型中,事件循环将文件句柄的状态事件通知给用户线程,由用户线程自行读取数据、处理数据。而在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。

    异步IO模型使用了Proactor设计模式实现了这一机制。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    图6 Proactor设计模式

    如图6,Proactor模式和Reactor模式在结构上比较相似,不过在用户(Client)使用方式上差别较大。Reactor模式中,用户线程通过向Reactor对象注册感兴趣的事件监听,然后事件触发时调用事件处理函数。而Proactor模式中,用户线程将AsynchronousOperation(读/写等)、Proactor以及操作完成时的CompletionHandler注册到AsynchronousOperationProcessor。AsynchronousOperationProcessor使用Facade模式提供了一组异步操作API(读/写等)供用户使用,当用户线程调用异步API后,便继续执行自己的任务。AsynchronousOperationProcessor 会开启独立的内核线程执行异步操作,实现真正的异步。当异步IO操作完成时,AsynchronousOperationProcessor将用户线程与AsynchronousOperation一起注册的Proactor和CompletionHandler取出,然后将CompletionHandler与IO操作的结果数据一起转发给Proactor,Proactor负责回调每一个异步操作的事件完成处理函数handle_event。虽然Proactor模式中每个异步操作都可以绑定一个Proactor对象,但是一般在操作系统中,Proactor被实现为Singleton模式,以便于集中化分发操作完成事件。

    什么是IO多路复用_IO多路复用同步异步阻塞和非阻塞

    图7 异步IO

    如图7所示,异步IO模型中,用户线程直接使用内核提供的异步IO API发起read请求,且发起后立即返回,继续执行用户线程代码。不过此时用户线程已经将调用的AsynchronousOperation和CompletionHandler注册到内核,然后操作系统开启独立的内核线程去处理IO操作。当read请求的数据到达时,由内核负责读取socket中的数据,并写入用户指定的缓冲区中。最后内核将read的数据和用户线程注册的CompletionHandler分发给内部Proactor,Proactor将IO完成的信息通知给用户线程(一般通过调用用户线程注册的完成事件处理函数),完成异步IO。

    用户线程使用异步IO模型的伪代码描述为:

    void UserCompletionHandler::handle_event(buffer) {

    process(buffer);

    }

    {

    aio_read(socket, new UserCompletionHandler);

    }

    用户需要重写CompletionHandler的handle_event函数进行处理数据的工作,参数buffer表示Proactor已经准备好的数据,用户线程直接调用内核提供的异步IO API,并将重写的CompletionHandler注册即可。

    相比于IO多路复用模型,异步IO并不十分常用,不少高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构基本可以满足需求。况且目前操作系统对异步IO的支持并非特别完善,更多的是采用IO多路复用模型模拟异步IO的方式(IO事件触发时不直接通知用户线程,而是将数据读写完毕后放到用户指定的缓冲区中)。Java7之后已经支持了异步IO,感兴趣的读者可以尝试使用。

    原文地址:http://www.elecfans.com/baike/wangluo/fuyongqi/20180307644141.html

    展开全文
  • 本文的主要内容有:·复位电路概述·同步复位电路·异步复位电路·复位策略——复位网络1.复位电路概述复位信号在数字电路里面的重要性仅次于时钟信号。对电路的复位往往是指对触发器的复位,也就是说电路的复位中的...

    复位电路博大精深,并不是三言两语就能说清楚的,因此这里也是聊聊复位电路的基础,更深的研究需要在实际的项目中才能深有体会。本文的主要内容有:

    ·复位电路概述

    ·同步复位电路

    ·异步复位电路

    ·复位策略——复位网络

    1.复位电路概述

    复位信号在数字电路里面的重要性仅次于时钟信号。对电路的复位往往是指对触发器的复位,也就是说电路的复位中的这个“电路”,往往是指触发器,这是需要注意的。有的电路需要复位信号,就像是有的电路需要时钟信号那样,而有的电路是不需要复位信号的。复位又分为同步复位和异步复位,这两种各有优缺点。下面我们主要来说说复位信号的用途和不需要复位信号的情况。

    (1)复位的目的

    复位最基本的目的就是使电路(主要是触发器)进入一个能稳定操作的确定状态(主要是触发器在在某个确定的状态),主要表现为下面两点:

    ①使电路在复位后从确定的初始状态运行:

    ·上电的时候,为了避免上电后进入随机状态而使电路紊乱,这个时候你就需要上电复位了。

    ·有时候,电路在某个状态下,你想或者别人要求你从电路的初始状态开始进行延时你的电路功能,这个时候你就要对你的电路进行复位,让它从最初的状态开始运行。

    ②使电路从错误状态回到可以控制的确定状态:

    有的时候,你的电路发生了异常,比如说状态机跑飞了、系统供电炸了之类的,总之就是电路运行得不正常了,这个时候你就要对电路进行复位,让它从错误的状态回到一个正常的状态。

    上面说的都是和实际电路有关的,下面我们就从电路仿真的角度看一下复位信号的重要性。

    ·仿真的要求

    复位信号在仿真里面主要是使电路仿真时具有可知的初始值:

    在仿真的时候,信号在初始状态是未知状态(也就是所谓的x,不过对信号初始化之后的这种情况除外,因为仿真的时候对信号初始化就使信号有了初始值,这就不是x了)。

    对于数据通路(数字系统一般分为数据通路和控制通路,数据通路一般是对输入的数据进行处理,控制通路则是对运行的情况进行操作),在实际电路中,只要输入是有效数据(开始的时候可能不是有效的),输出后的状态也是确定的;在仿真的时候,也是输入数据有效了,输出也就确定了。也就是说,初始不定态对数据通路的影响不明显。

    对于控制通路,在实际电路中,只要控制通路完备(比如说控制通路的状态机是完备的),即使初始状态即使是不定态,在经过一定的循环后,还是能回到正确的状态上;然而在仿真的时候就不行了,仿真的时候由于初始状态为未知态,控制电路一开始就陷入了未知态;仿真跟实际电路不同,仿真是“串行”的,仿真时控制信号的初始不定态会导致后续的控制信号结果都是不定态,也就是说,初始的不定态对控制通道是致命的。

    (2)不需要复位信号的一些情况

    复位信号很重要,但是并不是每一部分的电路都需要复位电路,一方面是复位电路也消耗逻辑资源、占用芯片面积,另一方面是复位信号会增加电路设计的复杂性(比如要考虑复位的策略、复位的布局布线等等)。

    当某个电路的输出在任何时刻都可以不受到复位信号的控制就有正确的值时,比如说数据通路中的对数据进行处理的部分。在某些情况下,当流水线的寄存器(移位寄存触发器)在高速应用中时,应该去掉某些寄存器的复位信号以使设计达到更高的性能,因为带复位的触发器比不带复位的触发器更复杂,反应也更慢。

    对复位信号/电路有一定的概念后,下面我们就来说说复位的方式,也就是同步电路和异步电路以及它们的优缺点。

    2.同步复位

    (1)同步复位电路

    同步复位是指复位信号在时钟有效沿到来时才复位电路(主要是复位触发器)。因此同步复位的复位信号受到时钟信号的控制。同步复位的触发器RTL代码和电路如下所示:

    上面的电路在FPGA中容易综合得到;也有可能综合得到下面这样的电路:

    (2)同步复位的优点

    ①首先同步复位一般能确保电路是100%同步的,因为电路都是由同步时钟触发。

    ②同步复位会综合为更小的触发器(???更小??感觉有点不太对,可能FPGA跟ASIC不一样吧?)。从前面电路中我们也可以看到,复位电路仅仅是由一个普通的触发器和一个与门够吃。

    ③由于同步复位仅仅发生在时钟的有效沿,当外部的复位信号由毛刺时,时钟可以当做过滤毛刺的手段,也就是说同步复位受到复位信号的毛刺影响小。

    ④当复位信号是由内部电路产生时,此时复位信号就有可能有毛刺,时钟就可以过滤毛刺。也就是说,可以在那些使用内部信号当做复位信号的设计中,使用同步复位。

    (3)同步复位的缺点

    ①使用同步复位可能使综合工具无法分辨分辨复位信号和其他控制信号,导致进行复位的控制逻辑远离触发器(也就是说,并不是所以的ASIC库都有内置的同步复位逻辑,综合工具可能把符合逻辑综合到触发器自身之外)。例如对于带同步复位和加载使能的触发器,代码如下所示:

    综合得到的电路图如下所示,左边是理想的电路,右边是可能综合出的电路:

    这两个电路的功能完全一样,只不过右边电路的复位控制逻辑(即复位与门)在多路复用器之外,也就是远离了触发器。这在门级仿真的时候(注意这是仿真),当。..。

    解决方法就是:一方面这个只是综合工具的问题,一般综合工具会自动识别在敏感列表里面又在条件表达式信号中的第一个信号为复位信号;另一方面,可以在RTL代码编写的时候,加入相关的综合指令,让综合的时候把复位逻辑靠近触发器。

    ②由于同步复位需要在时钟沿的触发下才能起作用,复位信号是以短脉冲的方式出现时,时钟沿就有可能错失这个复位信号,导致复位脉冲丢失,同步复位电路没有起到作用,时序图如下所示:

    解决办法:一方面,可以采用脉冲捕捉电路,这个电路在我的跨时钟域控制信号传输中有讲到。;另一方面,可以将复位信号进行脉冲扩展,维持足够长的时间,这个可以通过一个小的计数器实现,如下图所示:

    ③同步复位可能有组合逻辑延时,当复位逻辑距离触发器比较远时,这个时候就不能把触发器当做即时响应复位信号的触发器,而是有一定延时的触发器,这个时候就有了复位信号偏移的问题,关于复位信号偏移的描述,我们将在异步复位中进行描述。

    解决方法:使用内置的同步复位触发器;综合的时候加入相关的综合指令,这个和①类似。

    ④我们前面说过,在由内部组合逻辑的产生复位信号的设计中,推荐使用同步复位。其实这也是有缺点的,这是因为这样产生复位信号的组合逻辑一方面在仿真的时候容易出现x态,另一方面在实际电路中,这样的复位信号容易被外部(多个)信号影响。

    解决方法:不建议使用内部产生的复位信号;使用异步复位。

    ⑤门控时钟的同步复位可能无效:

    使用门控时钟的时候,由于复位信号依赖于时钟,在复位信号发出的时候,时钟可能关闭了,这个时候就会导致实际的电路没有被复位,如下图所示:

    解决方法:只能使用异步复位,并在时钟恢复前移除异步复位。

    ⑥总线设计中的同步复位问题:

    在总线控制中,系统上电复位的时候,我们要求不同芯片之间的总线工作在合理的状态上(比如处于高阻态或者输出);然而上电之后,由于系统时钟可能仍未正常工作,上电(同步)复位就可能无效,这个时候各个模块(芯片)就可能不会把总线接口设置为特定的状态,(当多个模块同时输出数据到总线上时)就可能导致电平冲突,严重的话会烧坏接口。

    解决办法:为了防止芯片上电时内部总线出现竞争,有一下两种解决办法,一种是采用异步上电复位,如下图所示:

    这个时候使用了异步复位,使能信号oe输出0,也就是有了初始的状态

    另一种方法是使用复位信号能直接撤销三态使能的电路,如下所示:

    从电路图中可以看到复位信号一方面控制了复位逻辑,另一方面控制了三态的使能端;这种技术简化了复位-高阻这个条路径的时序分析。

    3.异步复位

    (1)异步复位电路

    异步复位触发器则是在设计触发器的时候加入了一个复位引脚,也就是说复位逻辑集成在触发器里面。(一般情况下)低电平的复位信号到达触发器的复位端时,触发器进入复位状态,直到复位信号撤离。带异步复位的触发器电路图和RTL代码如下所示:

    (2)异步复位的优点

    ①使用异步复位的最大好处就是复位路径上没有延时,如上面的图所示,复位信号一直连接到触发器的复位端口,而不是像同步复位那样需要经过一个复位控制逻辑(如与门)。这样子就减少了外界信号的影响。

    ②与时钟没有关系,不管时钟上升沿有没有到来,只要复位信号一有效,触发器就会复位,也就是基本上做到实时性;由于与时钟没有关系,因此也可以用在门控时钟里面。

    ③综合工具能自动推断出异步复位而不必加入任何综合指令。

    (3)异步复位的缺点

    ①复位撤离问题

    在介绍复位撤离问题之前,先说一下复位恢复时间和去除时间。所谓的复位恢复时间是指撤离一个复位信号时,复位信号从有效跳变为无效的时刻 与 下一个有效时钟沿 之间的这段时间;去除时间是指撤离一个复位信号时,复位信号从有效跳变为无效的时刻 与 上一个有效时钟沿 之间的这段时间(可以类比于触发器的建立时间和保持时间)。如下图所示:

    上图中,rst_n1是要求的复位恢复时间,rst_n2满足复位恢复时间,rst_n3复位恢复时间不足。

    上图中,rst_nA是要求的复位去除时间,rst_n2满足复位去除时间,rst_n3复位去除时间不足。

    从上面的两个图中可以知道,如果你想让某个时钟沿起作用(也就是采数据),那么你就应该在“恢复时间”之前让异步控制信号变无效;如果你想让某个时钟沿不起作用(也就是在这个时钟沿依旧复位),那么你就应该在“去除时间”过后使控制信号变无效。异步复位信号的恢复和去除时间需要大于一定的时间,如果你的异步复位信号在这两种情况之间(撤离),那么就没法确定时钟沿是否起作用了,即判断不出是复位还是不复位(不复位即是D触发器才输入端的数据)。

    介绍了复位恢复时间和去除时间之后,我们就可以看看异步复位信号的问题了。由于异步复位信号与系统时钟毫无关系,复位可以在随时施加,也可以随时撤离。在施加的时候复位信号的时候,不存在任何问题,因为这跟复位恢复时间扯不上关系。但是,在撤离复位信号的情况下就有问题了,主要有两个问题:

    ·当异步复位信号的撤离时刻在时钟有有效沿附近时,就可能导致恢复时间或去除时间不足,即这个时候违背了复位恢复时间或去除时间,这时就可能导致触发器的输出端为亚稳态(注意是可能),如下所示:

    但是并不是所有情况都会产生亚稳态,当复位值和此时的的输出相同时,就不会产生亚稳态,如下图所示:

    这是因为:复位信号翻转的时候,如果复位信号判断是低电平,输出就复位即一定是低电平;如果判断复位信号是高电平,输出信号就等于对输入信号的采样值。图里面输入信号就是低电平,不管你是复位还是不复位,输出一直是低电平,没有亚稳态。

    ·复位状态不一致的问题:

    复位信号很时钟信号一样,复位通过复位网络到达各个触发器。一方面,复位网络具有非常大的扇出和负载,到达不同的触发器存在不同的延时,也就是存在复位偏移,因此撤离异步复位的时刻也是不一样的;另一方面,由于时钟网络也存在时钟偏移。这个时候异步复位信号就有可能在不同的触发器的不同时钟周期内进行撤离,也就是说异步复位的信号不一致,如下图所示:

    异步复位信号a是异步复位信号源,异步复位信号b、c、d是到达触发器的异步信号。我们可以看到,b信号是在本周期就撤离了复位;c信号则由于复位恢复时间不满足,则可能导致触发器输出亚稳态;而d信号则由于延时太长(但是满足了复位去除时间),在下一个周期才撤离复位。

    撤离问题的解决方法:异步复位的同步释放

    异步复位的同步释放电路也称为复位同步器,这个方法是将外部输入的异步复位信号进行处理,产生另外一个适合用于后面电路的复位信号,这个处理后的复位信号能够异步复位电路中的触发器,又不会存在撤离问题(因为经过了同步);这个异步复位同步释放的处理电路和RTL代码如下所示:

    从图中可以看到,这是用外部异步复位信号来复位一对触发器,这对触发器异步地驱动主复位信号,也就是这对触发器产生电路需要的复位信号,这些复位信号再到达各个触发器,然后进行复位,理想的异步复位同步释放的时序如下所示:

    上图中,在理想的情况下,复位信号在两级D触发器上面的撤离时间可能不一样,这个和复位信号传输到的触发器位置和触发器的时钟沿有关。理想情况下的复位信号传输到目标触发器都能够同时撤离,并且不在时钟有效沿附近。

    实际情况一般不是那么理想的,当不是理想的情况下,也就是说复位信号到达目标寄存器存在时钟偏移,并且复位信号有可能在时钟有效沿附近撤离,这个时候复位器出现的问题就有三种:第一级OK,第二级出现问题;第一级出现问题,第二级OK;两级都出现问题。下面我们就来看看这三种情况下产生的复位信号是什么情况:

    第一级的撤离没有问题,第二级的撤离出现在时钟的有效沿附近,也就是说第二级的D触发器的撤离时间不满足复位恢复时间或者去除时间,这时候的时序图如下所示:

    我们可以看到无论是触发器判断此刻是复位还是不复位,输出都是一样的,也就是说,输出rst_n不是亚稳态,而是确定的值。

    第一级的撤离出现问题,第二级的撤离没有问题,这时候的时序图如下所示:

    我们可以看到,第一级触发器虽然产生了亚稳态,但是由于第二级触发器的存在,亚稳态并没有传播下去,得到的复位信号依然是干净的,只不过这个复位信号可能延长多一个周期而已(这是因为亚稳态稳定后的可能态引起的)。

    最极端的一种情况是,两级的撤离都不满足复位恢复时间或者去除时间,这时候的时序图如下所示:

    我们可以看到第一级触发器产生了亚稳态,但是由于第二级触发器的存在,亚稳态没有传播下去;虽然第二级触发器的复位信号撤离也在时钟有效沿附近,但是跟第一种情况一样,第二级触发器是不会产生亚稳态的。因此即使是极端状态,输出的复位信号也是干净的。

    由此我们可以看到,异步复位的同步撤离能够有效地解决撤离导致的复位恢复时间或者去除时间不足的问题,同时把复位信号同步化,解决了复位撤离偏移的问题。

    ②异步复位的抖动问题

    当外部输入的异步复位信号产生毛刺时,任何满足触发器最小复位脉冲宽度的输入都有可能引起触发器复位,这问题是源头上的问题,即使是使用上面的同步器,也还是有同样的敏感问题,时序图如下所示:

    解决方法:一个是使用同步复位,另一个就是过滤毛刺了,过滤毛刺和消抖的思路有点像,主要就是经过一段延时之后,在经过逻辑门判断产生外部来的是不是真正复位信号,加上过滤毛刺信号部分的同步撤离电路和时序如下所示:

    在上图中,我们可以看到,抖动问题得到了解决。然而这种方法还是有缺点的,主要就是这个延时电路的延时控制可能随着环境而变化,而且延时的时间要合适长才行,绝对不能太短。

    ③DFT的问题

    4.复位策略——复位网络

    在数字电路里面,复位信号驱动了很多触发器,仅次于时钟,因此复位也往往形成或者使用复位网络。复位网络的设计也是有值得斟酌的地方,例如,由于复位的扇出太大,全部的复位不能仅仅由一个端口驱动,也就是不能像下面一样:

    既然上面的不行,那就改成下面的呗,也就是使用多各“并联”的同步释放,分担一下负载压力:

    然而这种方案还是有问题的,这是第一级的撤离出现问题,第二级的撤离没有问题的时候,亚稳态稳定后的状态可能不一样,导致rst_n的复位不一致,有的复位可能会快/慢一个周期。

    最后的方案是,先进行同步释放之后,同步后的复位信号又当做各个部分的异步信号,然后进行同步释放,如下所示:

    这样先经过前级的同步释放之后,就不存在亚稳态稳定好导致的输出rst_n不一致的问题了。

    最后说一下多时钟域的复位:在多时钟域复位中,外部的异步复位信号的同步释放应该各自的时钟进行同步,比如异步FIFO中,写时钟域就用写时钟进行同步释放;读时钟域就用读时钟进行同步释放。

    展开全文
  • 1、前言前一段时间出去面试,被问到同步异步与阻塞、非阻塞的区别。我一时半会没有想出来,作为一个工作三年的人来说,实在很惭愧。我当时理解同步异步属于两个进程中间的协作关系,例如使用浏览器访问一个网站...
  • 1.同步异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值...
  • 因为申请较晚,本公众号没留言,想交流的欢迎添加私人微信,一起相互吹捧,共同进步。承接上文的操作系统,关于IO会涉及到阻塞、非阻塞、多路复用同步异步、BIO、NIO、AIO等几个知识点。...
  • 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞先验知识此处的异步指的是什么同步异步、阻塞、非阻塞同步阻塞、同步非阻塞、异步阻塞、异步非阻塞一个生动的例子 先验知识   在解释这几个概念之前,需要注意的是:...
  • 同步异步编程

    2020-12-21 11:45:43
    强调的是时间,是否等待同步异步区别:调用者是否得到了想要的结果同步 一直执行到返回结果异步直接返回,但不是最终结果。调用者不能通过这种调用得到结果,还要通过被调用者,使用其他方式通知调用者,来拿到...
  • 总得来说,同步异步出现在以下几个领域:1 计算机网络。数据通信技术中有同步通信与异步通信。同步通信简单的说就是你在发送数据时候我必须同时接受。这个过程有精确的时钟控制。而异步通信是你在发数据时候必须加上...
  • 同步阻塞、同步非阻塞、多路复用异步非阻塞 当调用一次 channel.read或stream.read后,会切换至操作系统内核态来完成真正数据读取,而读取又分为两个阶段,分别为: 等待数据阶段 复制数据阶
  • java同步和异步概念

    2021-11-20 21:45:54
    同步和异步同步和异步是针对应用程序内核的交互而言的。同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪;而异步是指用户进程触发IO 操作以后便开始做自己的事情,而当IO 操作已经完成的...
  • 同步 IO 和异步 IO

    2021-11-25 11:14:25
    在 linux 中对 io 操作就是把内核态准备就绪的数据拷贝到用户态。 啥是内核态呢,内核态就是 linux 内核,用户态则是用户进程中的...同步 io 和异步 io 最大的区别就是同步 io 的发起方(用户线程)会阻塞或轮询等待 i...
  • IO模型 IO模型的分类 阻塞 同步非阻塞 多路复用 异步非阻塞 注意:没有异步阻塞(没有此种情况),别人问道,直接说明没有...同步VS异步 同步:线程自己去获取结果(一个线程) 例如:线程调用一个方法后,需要等待
  • 同步时序电路中,各触发器的时钟端全部连接到同一个时钟源上,只有当时钟脉冲到来时,电路的状态才能改变。(注意不要求是同一时钟,而是同源时钟。所谓的同源时钟是指同一个时钟源衍生频率比值为2的幂次方,且初...
  • Linux中的同步IO和异步IO前言一、阻塞IO非阻塞IO二、使用步骤11.引入库12.读入数据1总结1欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一...
  • 同步异步是一个概念,阻塞与非阻塞是另一个概念,多路复用又是另一个概念。相互联系,但是概念不同同步异步同步:当一个进程需要执行I/O操作时,如果进程需要一直等待操作结果的返回,甚至被挂起,那么这就属于同步的...
  • 同步:线程自己把数据从内核复制到用户空间,期间不能做其它事情,一直等待数据复制完毕。 异步:系统内核把数据从内核复制到用户空间,然后再通知相应线程进行数据处理。 总结:阻塞/非阻塞:发生请求后,...
  • 【Verilog】 同步复位和异步复位比较    同步复位 sync 异步复位 async 特点 复位信号只有在时钟上升沿到来时才能有效。 无论时钟沿是否到来,只要复位信号有效,就进行复位。 Verilog描述 ...
  • 并发、并行、同步异步、阻塞、非阻塞、协程这些概念网上众说纷纭,有时经常混为一体,本文尽量从本质上做一下解释。并发:一个时间段内,有几个程序在同一个cpu上运行,但是任意时刻只有一个程序在cpu上运行并行...
  • RPC 是解决进程间通信的一种方式。... 最常用的两种网络IO模型是 同步阻塞IO IO多路复用。 分别用两个比喻来说明这两种IO模型的区别同步阻塞IO:我们去餐厅吃饭,我们到达餐厅,向服务员点餐,之后要一...
  • 如下,A1,B1, C1 分别使用单独的信道 A2,B2, C2 通信,需要 3 个信道 复用技术就是: 在发送端使用一个复用器,让 A1,B1, C1 使用一个共享信道进行通信 在接收端使用分用器,把合起来传输的信息分别送到相应的...
  • 客户端请求的时候,有同步请求与异步请求之分: 同步请求,一个请求,等返回后,再继续之后的操作; 异步请求,一个请求,不等待返回,继续做其他操作,有返回后有再进行操作。 如何将同步请求,写成异步请求呢,...
  • IO模型为什么需要单独拉出来来说?因为这里是我们理解linux底层一些契机,也是我们网络编程的基础。尤其现在我们主流的框架都支持了EPOLL IO模型,...IO有内存IO、网络IO磁盘IO三种,通常我们说的IO指的是后两者。 *
  • 同步IO与异步IO的区别? 1.POSIX 2.IO模型 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO模型 异步IO模型 五种IO模型比较
  • 原标题:浅谈socket同步和异步、阻塞非阻塞、I/O模型在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式同步/异步主要针对C端:同步:c端发出一个功能调用时,在没有得到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,843
精华内容 34,337
关键字:

同步复用和异步复用区别