精华内容
下载资源
问答
  • 两段式
    千次阅读
    2018-05-18 14:32:15

           FPGA工程师无时无刻不在接触状态机,那么状态机的编写到底用几段式呢,这个问题会一直困扰FPGA的初学者,而问题的答案似乎都很古老,传统的建议是用二段式或者三段式状态机。

           首先解释一下为什么传统建议使用二段式或者三段式状态机,因为以前的综合工具还不够强大,如果采用一段式编写状态机,组合电路和时序电路在一段代码块里,不利于电路的优化;而两段式、三段式状态机将组合电路、时序电路分开,便于电路的优化。

           当然,随着工具的进步,现在采用几段式编写状态机已经没有那么大的影响,反而一段式状态机能够有效避免毛刺和竞争的出现,更适合初学者或者调试初期使用。在编写两段式、三段式状态机的时候,应该注意毛刺和竞争的产生,在可能的情况下将输出寄存器化。

    更多相关内容
  • //default的作用是免除综合工具综合出锁存器 endcase end 两段式有限状态机与三段式有限状态机的区别 FSM将时序部分(状态转移部分)和组合部分(判断状态转移条件和产生输出)分开,写为两个always语句,即为两段...

    转自:https://blog.csdn.net/wordwarwordwar/article/details/78509445

    实例:FSM实现10010串的检测

    状态转移图:初始状态S0,a = 0,z = 0.如果检测到1,跳转到S1。

    下一状态S1,a = 1,z = 0.如果检测到0,跳转到S2。
    下一状态S2,a = 0,z = 0.如果检测到0,跳转到S3。
    下一状态S3,a = 0,z = 0.如果检测到1,跳转到S4。
    下一状态S4,a = 1,z = 0.如果检测到0,跳转到S5。
    下一状态S5,a = 0,z = 1.如果检测到1,跳转到S1;如果检测到0,跳转到S3(因为之前S4已经是1,S5是0,若再检测到0,就是100,因此跳转到S4)。

    程序中将一段式(one_fsm)、两段式(two_fsm)、三段式(three_fsm)以及对应的仿真文件(XXX_tb)包含在了一个工程中。要单独运行、仿真每一种方式,只需将他们(one_fsm.v、two_fsm.v、three_fsm.v)分别设为顶层文件(选中右击,然后选择Set as Top-Level Entity),然后在仿真设置里面选择对应的仿真文件即可。见下图:


    补充:(转)PART1

    1、好的状态机标准

    好的状态机的标准很多,最重要的几个方面如下:

    第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义:其一要求该FSM的综合实现结果无毛刺等异常扰动;其二要求FSM要完备,即使受到异常扰动进入非设计状态,也能很快恢复到正常状态。

    第二,状态机的设计要满足设计的面积和速度的要求。

    第三,状态机的设计要清晰易懂、易维护。


    2、状态机描述方法

    状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移的条件等。具体描述时方法各种各样,最常见的有三种描述方式:

    (1)一段式:整个状态机写到一个always模块里面,在该模块中既描述状态转移,又描述状态的输入和输出;

    (2)二段式:用两个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出;

    (3)三段式:在两个always模块描述方法基础上,使用三个always模块,一个always模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。


    一般而言,推荐的FSM 描述方法是后两种。这是因为:FSM和其他设计一样,最好使用同步时序方式设计,以提高设计的稳定性,消除毛刺。状态机实现后,一般来说,状态转移部分是同步时序电路而状态的转移条件的判断是组合逻辑。


    第二种描述方法同第一种描述方法相比,将同步时序和组合逻辑分别放到不同的always模块中实现,这样做的好处不仅仅是便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线器实现设计。

    在第二种方式的描述中,描述当前状态的输出用组合逻辑实现,组合逻辑很容易产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计。

    第三种描述方式与第二种相比,关键在于根据状态转移规律,在上一状态根据输入条件判断出当前状态的输出,从而在不插入额外时钟节拍的前提下,实现了寄存器输出。


    PART2

    时序电路的状态是一个状态变量集合,这些状态变量在任意时刻的值都包含了为确定电路的未来行为而必需考虑的所有历史信息。

    状态机采用VerilogHDL语言编码,建议分为三个always段完成。


    三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。

    三段式描述方法虽然代码结构复杂了一些,但是换来的优势是:使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。

    示列模板如下:

    //第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器

    always @ (posedge clk or negedge rst_n) //异步复位

    if(!rst_n)

    current_state <= IDLE;

    else

    current_state <= next_state; //注意,使用的是非阻塞赋值

    //第二个进程,组合逻辑always模块,描述状态转移条件判断

    always @ (current_state) //电平触发

    begin

    next_state = x; //要初始化,使得系统复位后能进入正确的状态

    case(current_state)

    S1: if(...)

    next_state = S2; //阻塞赋值

    ...

    endcase

    end

    //第三个进程,同步时序always模块,格式化描述次态寄存器输出

    always @ (posedge clk or negedge rst_n)

    ...//初始化

    case(next_state)

    S1:

    out1 <= 1'b1; //注意是非阻塞逻辑

    S2:

    out2 <= 1'b1;

    default:... //default的作用是免除综合工具综合出锁存器

    endcase

    end

    两段式有限状态机与三段式有限状态机的区别

    FSM将时序部分(状态转移部分)和组合部分(判断状态转移条件和产生输出)分开,写为两个always语句,即为两段式有限状态机。
    将组合部分中的判断状态转移条件和产生输入再分开写,则为三段式有限状态机。
    区别:
    二段式在组合逻辑特别复杂时适用,但要注意需在后面加一个触发器以消除组合逻辑对输出产生的毛刺。三段式没有这个问题,由于第三个always会生成触发器。
    设计时注意方面:
    1.编码原则

    binary和gray-code适用于触发器资源较少,组合电路资源丰富的情况(CPLD),对于FPGA,适用one-hot code。这样不但充分利用FPGA丰富的触发器资源,还因为只需比较一个bit,速度快,组合电路简单。

    2.FSM初始化问题:
    GSR(Gobal Set/Reset)只是在加电时清零所有的reg和片内ram,并不保证FSM能进入初始化状态,要利用GSR,方案是适用one-hot code with zero idle,即初始状态编码为全零。已可以适用异步复位rst
    3.FSM输出可以适用task
    4FSM中的case最好加上default,默认态可以设为初始态
    5.尤其注意
    第二段的always(组合部分,赋值用=)里面判断条件一定要包含所有情况!可以用else保证包含完全。
    6第二段always中,组合逻辑电平要维持超过一个clock,仿真时注意。

    展开全文
  • 万物基于状态机,这篇博客是博主根据自己的一些经验详细描述了一段式、两段式、三段式状态机,moore型状态机、mealy型状态机的异同点及优缺点,希望能和大家一起努力,共同进步~

    目录

    前言

    一、状态机要素

    二、状态机描述方法

    1、一段式描述方法

    2、两段式描述方法

    3、三段式描述方法

    三、关系

    1、一段式与三段式

    2、两段式与三段式

    3、三种FSM描述方法比较表

    四、状态机的种类

    1、Moore型状态机

    2、Mealy型状态机

    3、注意点

    五、举例

    1、三种描述风格

    一段式描述风格

    两段式描述风格

    三段式描述风格

    说明

    2、两种状态机

    moore型状态机

    mealy型状态机

    说明

    总结


    前言

    今天更新一篇状态机的总结,可以说万物基于状态机了,哈哈。本篇博主将会用自己的经历为大家总结一下状态机的设计,同时也会提出一些其他博客都没有讲到的点,希望能给大家分享这些经验。

    一、状态机要素

    什么是RTL级好的状态机(Finite State Machine,FSM)描述?

    1、FSM要安全,稳定性高(最重要,优先级最高),即FSM不会进入死循环,特别是不会进入非预知的状态,即要求FSM的综合实现结果无毛刺等扰动,要求状态机要完备;

    2、FSM速度快,满足设计的频率要求;

    3、FSM面积小,满足设计的面积要求;

    4、FSM设计要清晰易懂,易维护。

    二、状态机描述方法

    1、一段式描述方法

    概述:整个电路用一个进程描述,包含状态转移条件判断、状态输出和状态寄存器转移。

    缺点:A、不符合时序和组合逻辑分开描述的代码风格;B、不利于修改、维护;C、不利于附加约束;D、不利于综合器和布局布线器对设计的优化;E、代码冗长。

    2、两段式描述方法

    概述:从左往右:第二个进程(纯组合逻辑always模块),描述状态转移条件的判断;第一个进程(同步时序always模块),格式化描述次态到现态的转移;一般情况下是组合逻辑输出,如果时序允许,尽量寄存器输出。

    缺点:其输出一般使用组合逻辑描述,而组合逻辑易产生毛刺等不稳定因素。

    3、三段式描述方法

    概述:从左往右:第二个进程和第一个进程同两段式状态机的描述方法一样;第三个进程(同步时序always),格式化描述状态的寄存器输出。这里的第三个进程是使用next_state做判断的,所以不会消耗多余的时钟周期。

    优点:A、FSM做到了同步寄存器输出;B、消除了组合逻辑输出的不稳定与毛刺的隐患;C、更利于时序路径分组;D、在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。

    三、关系

    1、一段式与三段式

    一段式建模:必须考虑现态在何种状态转移条件下会进入哪些次态,然后在每个现态的case分支下分别描述每个次态的输出。

    三段式建模:只需指定case敏感列表为次态寄存器,然后在每个次态的case分支中描述该状态的输出即可(根本不用考虑状态转移条件)。

    2、两段式与三段式

    两段式建模:状态寄存器分割了两部分组合逻辑(状态转移条件组合逻辑)(输出组合逻辑),电路时序路径较短,可以获得更高的性能。

    三段式建模:从输入到寄存器的输出路径上,要经过两部分组合逻辑(状态转移条件组合逻辑)(输出组合逻辑),从时序上,这两部分组合逻辑完全可以看为一体,因此这条路径的组合逻辑就比较复杂,该路径的时序相对紧张。但其优点也很突出:可以改善输出的时序条件;还能避免组合电路的毛刺,因此更为推荐这种写法。

    3、三种FSM描述方法比较表

    比较项目一段式两段式三段式
    推荐等级不推荐推荐最优推荐
    代码简洁程度冗长最简洁简洁
    always模块个数123
    是否有利于时序约束不利于利于利于
    是否有组合逻辑输出可以无组合逻辑输出多数情况下有组合逻辑输出无组合逻辑输出
    是否有利于综合与布局布线不利于利于利于
    代码的可靠性与可维护性最高
    代码风格的规范性低,任意度较大格式化,规范格式化,规范

    四、状态机的种类

    1、Moore型状态机

    状态机的输出至于当前的状态有关,如下图所示。

    2、Mealy型状态机

    状态机的输出不仅与当前的状态有关,还与当前的输入有关,如下图所示。

    3、注意点

    以上说明moore型状态机和mealy型状态机的区别所用的是两段式状态机,也就是状态输出都是采用组合逻辑输出。如果状态输出采用寄存器输出,则需要在输出端加一个寄存器,这样会多消耗一个时钟周期,但是功能不会发生错误。

    三段式状态机中为了不消耗一个额外的时钟周期,采用next_state作为判断条件,但是如果采用mealy型状态机,则此时的输入将会和next_state一起作为判断条件来判断输出,这样就会发生功能错误,如下图所示。

    正确的做法是将输出_temp与当前输入再用组合逻辑输出,如下图所示,这样功能不会发生错误。但是其实这种做法是多此一举的,因为这样做输出还是组合逻辑,没有采用寄存器输出,并且这条通路的时序相对紧张。博主这样的画法只是想说明保证三段式mealy状态机功能正确的做法。

    五、举例

    本节中,博主选择了两道HDLbits中的题目,来为大家更好的描述三种状态机写法以及moore、mealy状态机之间的差异。

    1、三种描述风格

    状态转移图如上图所示,下面是一段式、两段式、三段式的描述风格。

    一段式描述风格

    module top_module(
        input clk,
        input areset,    // Asynchronous reset to state B
        input in,
        output reg out);//  
    
        parameter A=1'b0, B=1'b1; 
        reg state;
        
        always@(posedge clk or posedge areset)begin
            if(areset)begin
                state <= B;
                out <= 1'b1;
            end
            else begin
                case(state)
                    B:begin
                        if(in == 1'b1)begin
                            state <= B;
                            out <= 1'b1;
                        end
                        else begin
                            state <= A;
                            out <= 1'b0;
                        end
                    end
                    A:begin
                        if(in == 1'b1)begin
                            state <= A;
                            out <= 1'b0;
                        end
                        else begin
                            state <= B;
                            out <= 1'b1;
                        end
                    end
                    default:begin
                        state <= B;
                        out <= 1'b1;
                    end
                endcase
            end
        end
        
    endmodule

    两段式描述风格

    输出写在下一状态转移组合逻辑中。

    module top_module(
        input clk,
        input areset,    // Asynchronous reset to state B
        input in,
        output reg out);//  
    
        parameter A=1'b0, B=1'b1; 
        reg current_state, next_state;
        
        always@(posedge clk or posedge areset)begin
            if(areset)begin
                current_state <= B;
            end
            else begin
                current_state <= next_state;
            end
        end
    
        always@(*)begin
            case(current_state)
                B:begin
                    if(in == 1'b1)begin
                        next_state = B;
                    end
                    else begin
                        next_state = A;
                    end
                    out = 1'b1;
                end
                A:begin
                    out = 1'b0;
                    if(in == 1'b1)begin
                        next_state = A;
                    end
                    else begin
                        next_state = B;
                    end
                    out = 1'b0;
                end
            endcase
        end
        
    endmodule

    输出与下一状态转移组合逻辑分开。 

    module top_module(
        input clk,
        input areset,    // Asynchronous reset to state B
        input in,
        output reg out);//  
    
        parameter A=1'b0, B=1'b1; 
        reg current_state, next_state;
        
        always@(posedge clk or posedge areset)begin
            if(areset)begin
                current_state <= B;
            end
            else begin
                current_state <= next_state;
            end
        end
    
        always@(*)begin
            case(current_state)
                B:begin
                    if(in == 1'b1)begin
                        next_state = B;
                    end
                    else begin
                        next_state = A;
                    end
                end
                A:begin
                    if(in == 1'b1)begin
                        next_state = A;
                    end
                    else begin
                        next_state = B;
                    end
                end
            endcase
        end
        
        always@(*)begin 
            if(current_state == B)begin
                out = 1'b1;
            end
            else begin
                out = 1'b0;
            end
        end
        
        /*
        //second way
        //assign out = (current_state == B);
        */
        
        /*
        //third way
        always@(*)begin
            case(current_state)
                B:begin
                    out = 1'b1;
                end
                A:begin
                    out = 1'b0;
                end
            endcase
        end
        */
    
    endmodule

    三段式描述风格

    module top_module(
        input clk,
        input areset,    // Asynchronous reset to state B
        input in,
        output reg out);//  
    
        parameter A=1'b0, B=1'b1; 
        reg current_state, next_state;
        
        always@(posedge clk or posedge areset)begin
            if(areset)begin
                current_state <= B;
            end
            else begin
                current_state <= next_state;
            end
        end
    
        always@(*)begin
            case(current_state)
                B:begin
                    if(in == 1'b1)begin
                        next_state = B;
                    end
                    else begin
                        next_state = A;
                    end
                end
                A:begin
                    if(in == 1'b1)begin
                        next_state = A;
                    end
                    else begin
                        next_state = B;
                    end
                end
            endcase
        end
    
        always@(posedge clk or posedge areset)begin
            if(areset)begin
                out <= 1'b1;
            end
            else if(next_state == B)begin
                out <= 1'b1;
            end
            else begin
                out <= 1'b0;
            end
        end
        
    endmodule
    

    说明

    一段式状态机描述中没有区分current_state和next_state,将所有的状态转移和输出逻辑写在一个always时序模块中,代码相对冗长,不利于分析电路结构。

    两段式状态机描述中采用组合逻辑描述输出,其中两种大的写法,第一种是将输出逻辑融合到下一状态转移组合逻辑中,第二种是将输出和下一状态转移组合逻辑分开。大家要注意,这两种写法映射到电路中没有任何区别。有一点困扰的地方是大家通常将第二种写法叫做三段式状态机的第三段。从广义上来讲,这种叫法没有错,因为毕竟这三段分割明显,每一段做什么事情都很好理解,但是更细化,从电路结构来讲,这种写法只能称为两段式状态机,next_state到current_state采用时序逻辑,状态转移和输出采用组合逻辑,这是两段式状态机的标志。

    三段式状态机描述中采用时序逻辑描述输出,为了节省一拍,采用next_state作为判断条件。

    特别注意,这里只有A和B两个状态,只需要1bit,所以博主两段式和三段式的case中省略了default,这里建议不论条件是否列全,都应该加上default,博主没有加default的做法不值得提倡。

    2、两种状态机

    检测“101”序列,题目要求重叠检测(比如对于序列“101010”,重叠检测会输出两次高电平,不重叠检测会输出一次高电平)。

    moore型状态机

    状态转移图如下。

    module top_module (
        input clk,
        input aresetn,    // Asynchronous active-low reset
        input x,
        output reg z ); 
        
        parameter S0 = 2'd0, S1 = 2'd1, S2 = 2'd2, S3 = 2'd3;
        reg [1:0]	current_state;
        reg [1:0]	next_state;
        
        always@(posedge clk or negedge aresetn)begin
            if(aresetn == 1'b0)begin
                current_state <= S0;
            end
            else begin
                current_state <= next_state;
            end
        end
        
        always@(*)begin
            case(current_state)
                S0:begin
                    next_state = x ? S1 : S0;
                end
                S1:begin
                    next_state = x ? S1 : S2;
                end
                S2:begin
                    next_state = x ? S3 : S0;
                end
                S3:begin
                    next_state = x ? S1 : S2;
                end
                default:begin
                    next_state = S0;
                end
            endcase
        end
        
        always@(posedge clk or negedge aresetn)begin
            if(aresetn == 1'b0)begin
                z <= 1'b0;
            end
            else begin
                if(next_state == S3)begin
                    z <= 1'b1;
                end
                else begin
                    z <= 1'b0;
                end
            end
        end
    
    endmodule

    mealy型状态机

    状态转移图如下。

    module top_module (
        input clk,
        input aresetn,    // Asynchronous active-low reset
        input x,
        output z ); 
        
        parameter S0 = 2'd0, S1 = 2'd1, S2 = 2'd2;
        reg [1:0]	current_state;
        reg [1:0]	next_state;
        
        always@(posedge clk or negedge aresetn)begin
            if(aresetn == 1'b0)begin
                current_state <= S0;
            end
            else begin
                current_state <= next_state;
            end
        end
        
        always@(*)begin
            case(current_state)
                S0:begin
                    next_state = x ? S1 : S0;
                end
                S1:begin
                    next_state = x ? S1 : S2;
                end
                S2:begin
                    next_state = x ? S1 : S0;
                end
                default:begin
                    next_state = S0;
                end
            endcase
        end
       
        assign z = ((current_state == S2) && (x == 1'b1)) ? 1'b1 : 1'b0;
        
        /*
        //second way
        always@(*)begin
            case(current_state)
                S0:begin
                    z = 1'b0;
                end
                S1:begin
                    z = 1'b0;
                end
                S2:begin
                    z = x;
                end
            endcase
        end
        */
    
    endmodule
    module top_module (
        input clk,
        input aresetn,    // Asynchronous active-low reset
        input x,
        output z ); 
        
        parameter S0 = 2'd0, S1 = 2'd1, S2 = 2'd2;
        reg [1:0]	current_state;
        reg [1:0]	next_state;
        reg			z_temp;
        
        always@(posedge clk or negedge aresetn)begin
            if(aresetn == 1'b0)begin
                current_state <= S0;
            end
            else begin
                current_state <= next_state;
            end
        end
        
        always@(*)begin
            case(current_state)
                S0:begin
                    next_state = x ? S1 : S0;
                end
                S1:begin
                    next_state = x ? S1 : S2;
                end
                S2:begin
                    next_state = x ? S1 : S0;
                end
                default:begin
                    next_state = S0;
                end
            endcase
        end
        
        always@(posedge clk or negedge aresetn)begin
            if(aresetn == 1'b0)begin
                z_temp <= 1'b0;
            end
            else begin
                if(next_state == S2)begin
                    z_temp <= 1'b1;
                end
                else begin
                    z_temp <= 1'b0;
                end
            end
        end
        
        assign z = z_temp == 1'b1 && x == 1'b1;
    
    endmodule

    上面两组代码就是mealy型状态机分别使用“两段式状态机”和“三段式状态机”完成的写法,这里加了引号,因为不是标准的两段式和三段式,我们最常用的两段式和三段式主要都是针对moore型状态机所说。

    说明

    我们从上面的状态转移图可以看出,moore型状态机要比mealy型状态机多一个状态,也就意味着mealy型状态机要比moore型状态机快一个周期,因为mealy型状态机使用当前输入和当前状态共同判断,moore型状态机不需要当前输入。

    总结

    今天的这篇博客,基于博主自己对状态机的理解所写,包括博主曾经踩过的一些坑。博客中对三种状态机写法,两类状态机都有一些直观的描述,其中三种状态机的写法那部分参考了邸志雄老师在慕课的课程《芯动力——硬件加速设计方法》,感兴趣的同学可以去慕课观看,希望能给大家带来帮助。

    展开全文
  • 分布式事务之——两段式、三段式

    千次阅读 2019-08-26 23:15:00
    一、两段式 1、请求阶段(commit-request phase,或称表决阶段,voting phase) 事务询问。协调者向所有参与者发送事务内容,询问是否可以进行事务提交操作,然后就开始等待参与者的响应。 执行事务。各参与者...

    一、两段式

    1、请求阶段(commit-request phase,或称表决阶段,voting phase)

    事务询问。协调者向所有参与者发送事务内容,询问是否可以进行事务提交操作,然后就开始等待参与者的响应。

    执行事务。各参与者节点执行事务操作(本地事务),并将Undo和Redo信息记入事务日志中。

    各参与者向协调者反馈事务询问的响应。同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)。

    2、提交阶段(commit phase)
    在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。

    当且仅当所有的参与者同意提交,事务协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者回滚事务。

    两段式的缺点

    1、同步阻塞问题。

    执行过程中,所有参与节点都是事务阻塞型的。当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。

    2、单点故障

    当协调者出错,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。

    3、

    第二阶段当协调者再发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了,那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。

    4、数据不一致

    在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求,而在这部分参与者接到commit请求之后就会执行commit操作,但是其他部分未接到commit请求的机器则无法执行事务提交,于是整个分布式系统便出现了数据局部不一致性的现象。

    二、三段式

    1、CanCommit

    事务询问。

    各参与者向协调这反馈事务询问的响应。

    2、PreCommit

    假设协调者从所有的参与者获得的都是Yes响应,那么将执行事务预提交。执行事务操作,将Undo和Redo信息记录到事务日志中。

    假设任何一个参与者向协调者反馈了No反应,或者在等待超时之后,协调者无法获得所有参与者的响应,那么将执行事务的中断。

    3、doCommit

    该阶段将进行事务提交,或者事务回滚。

    三段式和两段式的区别

    对于协调者(Coordinator)和参与者(Cohort)都设置了超时机制;

    降低了参与者的阻塞范围,两段式在第一阶段就阻塞,而三段式在第二阶段阻塞;

    解决了单点阻塞问题,因为一旦参与者无法及时收到来自协调者的信息之后,他会由于超时而默认执行commit。但如果协调者发送的是abort,而其中一个参与者因为网络问题没有收到,最终执行了commit,就会导致这个参与者与其他执行了abort的参与者数据不一致。

    (使得原先在两阶段提交中,参与者在投票之后,由于协调者发生崩溃或错误,而导致参与者处于无法知晓是否提交或者中止的“不确定状态”所产生的可能相当长的延时的问题得以解决。也就是说,即使当协调者发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了,仍可以知道目前至少是处于准备通过提案阶段,表示第一阶段大家都已经决定要通过了,此时便可以直接通过。(也就是第一阶段的预通知起到了保障的作用))

    转载于:https://my.oschina.net/u/2286010/blog/3098004

    展开全文
  • 用户读到某一操作对系统特定数据的更新需要一时间,我们称这时间为“不一致性窗口”。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。 最终一致性: 是弱一致...
  • Mysql innoDB有个日志模块:redolog 和 binlog 咱们先看一下redolog。 redolog中文来讲就是重做日志,它有什么用呢?如果每次你的更新或者插入都写入磁盘的话那这个IO成本就比较大了,所以InnoDB就把记录先记录在...
  • 鉴于一段式描述的缺点,两段式描述使用2个always块,一个always块利用同步时序逻辑描述状态转移,一个always块利用组合逻辑描述状态转移条件以及输出;(但是输出一般使用组合逻辑描述,而组合逻辑易产生毛刺等不...
  • 状态机详解(一段式、二段式、三段式

    万次阅读 多人点赞 2018-12-26 17:13:34
    可以分为类: Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关; Moore状态机:时序逻辑的输出只与当前状态有关。 描述方式: ① 状态转移图:设计分析时使用,工具自动翻译的代码效率不...
  • 3、二段式状态机 Verilog语言中,常常采用二段式和三段式描述状态机。其本质是对应状态机的激励方程,状态转换方程和输出方程。三段式每一段对应一个方程,二段式则是将输出方程和激励方程合并在一起描述。 二段式...
  • 具体描述时方法各种各样,有的设计者习惯将整个状态机写到1 个always 模块里面,在该模块中即描述状态转移,又描述状态的输入和输出,这种写法一般被称为一段式FSM 描述方法; 还有一种写法是用2 个always 模块,...
  • 上篇博文讲了:FPGA中有限状态机的状态编码采用格雷码还是独热码? 那篇博文讲了状态机的状态...一段式的描述方法、二段式以及三段式,并比较三者之间的功能仿真情况,最后真心吐露这个案例的状态转移图的疑问?不...
  • 段式FPGA的状态机

    千次阅读 2016-10-02 09:22:01
    数字系统有大类有限状态机(Finite State Machine,FSM):Moore状态机和Mealy状态机。 Moore状态机  其最大特点是输出只由当前状态确定,与输入无关。Moore状态机的状态图中的每一个状态都包含一个输出...
  • 段式状态机:在个 always 模块描述方法基础上,使用三个always 模块,一个always 模块采用同步时序描述状态转移,一个 always 采用组合逻辑判断状态转移条件,描述状态转移规律,另一个 always 模块描述状态...
  • 状态机描述时关键是要描述清楚几个状态机的要素,即如何进行状态转移,每个状态的输出是什么,状态转移... (2)二段式:用个always模块来描述状态机,其中一个always模块采用同步时序描述状态转移;另一个模块采...
  • 段式状态机理解浅析

    万次阅读 多人点赞 2018-08-26 22:23:23
    关于FSM的写法按照always块的个数来划分可以分为一段式(一个always块)、两段式状态机(两个always块)、三段式状态机(三个always块)。三段式状态机具有以下优点: (1) 三段式状态机可以清晰完整的显示出状态...
  • 段式过流保护、差动保护

    千次阅读 2021-08-09 13:34:21
    2、三保护 三个不同:电流值不同、动作时间不同、保护范围不同(记忆:大快短,小慢长) 动作延时:是为了让下一级的速断保护先跳开,尽量减少断电范围。 主保护:二,不快也不慢。既能等待下一级跳开,也能...
  • 看的一本E文的书上, 状态机的例子是典型的二段式(作者也没说明这是两段式),当时还觉得这种写法挺麻烦的,没有一段式的看起来舒服, 当时还没有切身的体会两种的区别以及一段式的劣处. 后来在一段式状态机...
  • 两段锁(2PL)理解

    万次阅读 2018-11-29 19:30:00
    两段锁即两阶段锁(Two-phase locking - 2PL): 首先,两阶段锁强调的是“加锁(增长阶段,growing phase)和解锁(缩减阶段,shrinking phase)这两项操作,且每项操作各自为一个阶段,这就是说不管同一个事务...
  • SVPMW占空比计算(五段式段式).pdf

    千次阅读 2020-12-18 22:05:29
    SVPMW占空比计算(五段式段式)SVPWM 占空比计算by 杨天锡Simol BBS: hitbuyi2011.10.11 初稿,有错的地方请指正,联系方式hitbuyi@保留所有版权,all rights reserved摘要:在矢量控制中,确定指令电压的扇区后,...
  • 一种5段式SVPWM调制方法与流程

    千次阅读 2020-12-18 22:05:34
    本发明属于电力电子控制技术领域,尤其涉及一种开关优化控制的5段式svpwm调制方法。背景技术:空间矢量控制svpwm广泛应用于不间断电源(ups)、储能变流器(pcs)、光伏逆变器(solarinverter)、静止无功发生器(svg)、...
  •     根据零矢量作用的方式,可分为五段式和七段式,也称零矢量集中和零矢量分散,如图所示。 作用时间求解     在每个扇区中, T 1 T_1 T1​和 T 2 T_2 T2​可用 u α u_{\alpha} uα​和 u β u_{\beta} u...
  • 本发明涉及一种PWM调制方法,尤其涉及一种新的七段式的SVPWM调制方法。背景技术:电压空间矢量脉宽调制(SVPWM)是一种比较新颖的控制方法,其原理是利用逆变器各桥臂开关控制信号的不同组合,使逆变器的输出电压空间...
  • 以段为单位分配内存,通过地址映射机制,将段式虚拟地址转换成实际内存物理地址。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。 逻辑地址得到段号、段内地址,再根据段号和段表求出基址,再由基址+段内...
  • 【操作系统知识】存储管理

    千次阅读 2021-09-07 17:00:09
    分页与分段的区别 1.页是信息的物理单位,是系统管理的需要而不是用户的需要;而段是信息的逻辑单位,分段是为了更好地满足用户的需要 2.页的大小固定且由系统决定,一个系统只能有一种...段式存储管理 段:用户
  • 目录页式存储管理段式存储管理分页和分段存储管理的主要区别段页式存储管理 页式存储管理 1. 基本原理 页式存储管理是把主存储器划分成大小相等的若干区域,每个区域称为一块,并对它们加以顺序编号,如0#块、1#块...
  • 耳机检测--三段式和四段式耳机判别

    千次阅读 2021-04-26 20:58:05
    (不带mic)耳机有3个触点,从最顶开始依次为 左声道、右声道、公用的接地,耳机插头分3.5mm和2.5mm种,目前大部分耳机接口采用的是3.5mm,但两者并不通用,3.5mm耳机用在2.5mm耳机口设备上需要转接头;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 847,706
精华内容 339,082
关键字:

两段式