HDLBits-Circuits学习小结(七)有限状态机基础(simple FSM、design a moore FSM)

1 简单的状态机

这是一个Moore型状态机,有两个状态,一个输入,一个输出。实现此状态机。注意重置状态是B。

1
solution:

module top_module(
    input clk,
    input areset,    // Asynchronous reset to state B
    input in,
    output out);//  

    parameter A=0, B=1; 
    reg state, next_state;

    always @(*) begin    // This is a combinational always block
       case (state)
          B: if (in) 	next_state = B;
             else 		next_state = A;
          A: if (in)	next_state = A;
             else		next_state = B;
       endcase
    end

    always @(posedge clk, posedge areset) begin    // This is a sequential always block
        if (areset)    // State flip-flops with asynchronous reset
            state <= B;
        else begin
            state <= next_state;
        end
    end

    // Output logic
    // assign out = (state == ...);
    assign out = (state == B) ? 1 : 0;

endmodule

official solution:

module top_module (
	input clk,
	input in,
	input areset,
	output out
);

	// Give state names and assignments. I'm lazy, so I like to use decimal numbers.
	// It doesn't really matter what assignment is used, as long as they're unique.
	parameter A=0, B=1;
	reg state;		// Ensure state and next are big enough to hold the state encoding.
	reg next;
    
    
    // A finite state machine is usually coded in three parts:
    //   State transition logic
    //   State flip-flops
    //   Output logic
    // It is sometimes possible to combine one or more of these blobs of code
    // together, but be careful: Some blobs are combinational circuits, while some
    // are clocked (DFFs).
    
    
    // Combinational always block for state transition logic. Given the current state and inputs,
    // what should be next state be?
    // Combinational always block: Use blocking assignments.
    always@(*) begin
		case (state)
			A: next = in ? A : B;
			B: next = in ? B : A;
		endcase
    end
    
    // Edge-triggered always block (DFFs) for state flip-flops. Asynchronous reset.
    always @(posedge clk, posedge areset) begin
		if (areset) state <= B;		// Reset to state B
        else state <= next;			// Otherwise, cause the state to transition
	end
		
		
		
	// Combinational output logic. In this problem, an assign statement is the simplest.
	// In more complex circuits, a combinational always block may be more suitable.
	assign out = (state==B);

endmodule

这是一个Moore型状态机,有两个状态,两个输入,一个输出。实现此状态机。使用异步重置。

在这里插入图片描述

module top_module (
	input clk,
	input j,
	input k,
	input areset,
	output out
);
	parameter A=0, B=1;
	reg state;
	reg next;
    
    always_comb begin
		case (state)
			A: next = j ? B : A;
			B: next = k ? A : B;
		endcase
    end
    
    always @(posedge clk, posedge areset) begin
		if (areset) state <= A;
        else state <= next;
	end
		
	assign out = (state==B);

	
endmodule

2 简单的状态机----状态转换表

下面是Moore型状态机的状态转换表,它有一个输入、一个输出和四个状态。使用以下状态编码:A=2’b00, B=2’b01,C=2’b10, D=2’b11。
仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态(state),根据状态转换表计算next_state和output (out)。

状态转换表

module top_module(
    input in,
    input [1:0] state,
    output [1:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: next_state = f(state, in)
    always @(*) begin
        case(state)
            A: next_state = (in) ? B : A;
            B: next_state = (in) ? B : C;
            C: next_state = (in) ? D : A;
            D: next_state = (in) ? B : C;
        endcase
    end
 
    // Output logic:  out = f(state) for a Moore state machine
    assign out = (state==D); 

endmodule

以下是具有一个输入,一个输出和四个状态的Moore状态机的状态转换表。 使用以下独热状态编码:
A = 4’b0001,B = 4’b0010,C = 4’b0100,D = 4’b1000。
通过假设独热码编码的检查推导出状态转换和输出逻辑方程式。 为此状态机仅实现状态转换逻辑和输出逻辑(组合逻辑部分)。(测试台将使用非独热输入进行测试,以确保你没有尝试做更复杂的事情)。

“通过检查推导出方程”是什么意思?

独热状态机编码可确保一个状态位恰好为1。这意味着可以通过仅检查一个状态位而不检查所有状态位来确定状态机是否处于特定状态。通过检查状态转换图中每个状态的输入边缘,可以得出用于状态转换的简单逻辑方程式。

例如,在上述状态机中,状态机如何达到状态A?

它必须使用两个输入边缘之一:“当前处于状态A,in = 0”或“当前处于状态C,in = 0”。由于采用独热编码,因此测试“当前处于状态A”的逻辑方程只是状态A的状态位。这导致了状态位A的下一个状态的最终逻辑方程:next_state [0] =state[0]&(〜in) | state[2]&(〜in)。独热编码可确保一次最多有一个子句(乘积项)处于“active”状态,因此可以将这些子句进行“或”运算。

当练习“通过检查”要求状态转换方程式时,请使用此特定方法。评判系统将使用非独热输入进行测试,以确保你的逻辑方程式遵循此方法,而不是对状态位的非法(非独热编码)组合进行其他操作(例如,重置FSM)。

尽管知道此算法对于RTL级设计不是必需的(逻辑合成器可以解决这个问题),但它说明了为什么独热FSM常常具有更简单的逻辑(以增加状态位存储为代价),并且该主题经常出现数字逻辑课程的考试中。

onehot

module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: Derive an equation for each state flip-flop.
    assign next_state[A] = state[A]&~in | state[C]&~in;
    assign next_state[B] = state[A]&in | state[B]&in | state[D]&in;
    assign next_state[C] = state[B]&~in | state[D]&~in;
    assign next_state[D] = state[C]&in;

    // Output logic: 
    assign out = (state[D]);

endmodule

以下是具有一个输入,一个输出和四个状态的Moore型状态机的状态转换表。 实现此状态机。 包括一个异步重置,将FSM重置为状态A。

2

module top_module(
    input clk,
    input in,
    input areset,
    output out); //

    // State transition logic
    reg [3:0] state;
    reg [3:0] next;
    parameter A=4'b0001,B=4'b0010,C=4'b0100,D=4'b1000;
    always @(*) begin
        case(state)
            A: next = (in) ? B : A;
            B: next = (in) ? B : C;
            C: next = (in) ? D : A;
            D: next = (in) ? B : C;
        endcase
    end

    // State flip-flops with asynchronous reset
    always @(posedge clk or posedge areset) begin
        if (areset)
            state <= A;
        else
            state <= next;
    end
        
    // Output logic
    assign out = (state==D);

endmodule

3 简单的状态机----应用

🌟

大型水库可为多个用户提供服务。为了使水位足够高,三个传感器以5英寸的间隔垂直放置。
当水位高于最高传感器(S3)时,输入流量应为零。
当液位低于最低传感器(S1)时,流量应最大(标称流量阀和辅助流量阀均打开)。
当水位在上下传感器之间时,流量由两个因素决定:水位和最后一个传感器之前的水位发生变化。每种水位都有一个与之相关的标称流速,如下表所示。
如果传感器变化表明先前的液位低于当前的液位,则应进行标称流速。
如果先前的水位高于当前的水位,则应通过打开辅助流量阀(由AFR控制)来增加流量。
绘制水库控制器的Moore型状态图。清楚指出每个状态的所有状态转换和输出。 FSM的输入为S1,S2和S3。输出为FR1,FR2,FR3和dFR。

1
还包括一个高电平有效的同步复位,该复位将状态机复位到与水位已长时间处于低水平(未声明任何传感器,但是声明了所有四个输出)。

在这里插入图片描述
这道题关键在于怎么理解这个输入,题中说了未声明任何传感器,不妨将这里的输入s理解为水位变化的指令。

再结合题意,如果传感器变化表明先前的液位低于当前的液位,则应进行标称流速。
如果先前的水位高于当前的水位,则应通过打开辅助流量阀(由AFR控制)来增加流量。

我们知道一共三个传感器,那么从超低水位到超高水位,再到超低水位,从输出的角度来看,我们将一共经历六种状态:

  • A:超低水位(s1传感器之下)
  • B1:由A上升到了s1和s2传感器之间的一个水位
  • B2:由C2或C1下降到s1和s2传感器之间的一个水位
  • C1:由B1或B2上升到s2和s3传感器之间的一个水位
  • C2:由D下降到s2和s3传感器之间的一个水位
  • D:最高水位(s3传感器之上)

solution:

module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
    parameter A=0,B1=1,B2=2,C1=3,C2=4,D=5;
    reg [2:0] state;
    reg [2:0] next;
    
    // Edge-triggered always block (DFFs) for state flip-flops.
    always @(posedge clk) begin
        if(reset)
            state <= A;
        else
            state <= next;
    end
    
    // what should be next state be?
    always @(*) begin
        case(state)
            A : next = s[1] ? B1 : A;
            B1: next = s[2] ? C1 : (s[1] ? B1 : A);
            B2: next = s[2] ? C1 : (s[1] ? B2 : A);
            C1: next = s[3] ? D  : (s[2] ? C1 : B2);
            C2: next = s[3] ? D  : (s[2] ? C2 : B2);
            D : next = s[3] ? D  : C2;
            default: next = state;
        endcase
    end
    
    // Output logic: 
    always @(*) begin
        case(state)
            A : {fr3,fr2,fr1,dfr} = 4'b1111;
            B1: {fr3,fr2,fr1,dfr} = 4'b0110;
            B2: {fr3,fr2,fr1,dfr} = 4'b0111;
            C1: {fr3,fr2,fr1,dfr} = 4'b0010;
            C2: {fr3,fr2,fr1,dfr} = 4'b0011;
            D : {fr3,fr2,fr1,dfr} = 4'b0000;
            default:{fr3,fr2,fr1,dfr} <= 4'b0000;
        endcase
    end
                     
endmodule

由这道题可以知道,状态机的三段式写法中,每一个时钟沿产生一次可能的状态变化的写法基本是用时序逻辑电路书写,而产生下一状态的变化以及产生输出的变化基本是由组合逻辑电路书写。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 数字集成电路设计一种设计角度csdn 数字集成电路是指对数字电路优化设计和集成的单片微电子电路,它是现代电子技术中不可或缺的一部分。数字集成电路在电子产品中的应用广泛,如计算机、通信设备、数字音频设备、数字视频设备等。数字集成电路设计为数字电路的优化设计和集成运用打下了坚实基础。 数字集成电路设计是从电路的角度出发,按照设定的目标和规范,对数字电路进行一系列的优化设计和优化布局,使其能够满足所需的电源电压、工作电流、性能要求等指标,并能够在现实工作环境下稳定可靠地工作。数字集成电路设计需要综合考虑电路设计的各方面因素,如功耗、延迟、成本、布局、连线、测试等,从而实现数字集成电路优化设计的目标。 数字集成电路设计的过程中,可以采用电路仿真技术、设计优化工具、封装设计技术、自动布局布线技术等工具和技术手段,以达到数字集成电路设计的目标。同时,数字集成电路设计需要对设计流程、设计方法、设计规范等方面进行深入研究,并在实际设计过程中进行不断改进和完善,从而提高数字集成电路设计的效率和质量。 总之,数字集成电路设计是数字电路背后的一项重要工作,它为数字电路的实现提供了坚实的基础和支持。数字集成电路设计需要综合考虑各方面因素,采用各种工具和技术手段,通过不断的研究和实践,最终实现数字集成电路的优化设计和可靠性工作。 ### 回答2: 《数字集成电路设计视角》是一本讲解数字电路设计的权威著作。本书作者为Jan Rabaey,Shuvra S. Bhattacharyya,Anantha Chandrakasan。书中主要涵盖了数字电路设计的概念、技术和原理,旨在让读者系统掌握数字电路设计的方法和技巧。 本书一共分为14章,第一章为引言,介绍了数字芯片设计的一般过程及相关知识。接下来的几章分别介绍数字集成电路的数码逻辑设计、信号处理电路设计、时钟和时序电路设计、处理器电路设计、数据转换电路设计等内容。最后几章则讲述了数字芯片测试和设计自动化等方面的内容。 此书由于其详尽、全面的内容和简洁明了的表述风格,深受学界和业界的欢迎,在数字电路设计和集成电路设计领域具有一定的影响力。对于数字电路设计的初学者和从业者来说,这本书都是一本非常好的参考书,有助于他们更好地理解和掌握数字电路设计的相关知识。 ### 回答3: 《Digital Integrated Circuits A Design Perspective》是由美国加州大学圣地亚哥分校教授Rabaey等人合著的一本关于数字集成电路设计的经典教材。这本书通过系统地阐述数字集成电路设计的基本原理和方法,以及常用的数字集成电路设计工具和流程,为读者提供了深入理解数字电路设计的途径。 从设计角度来看,《Digital Integrated Circuits A Design Perspective》主要涵盖了数字集成电路设计的各个方面,包括数字电路的基本概念、CMOS技术及其原理、数字集成电路设计的基本原则、数字逻辑和算术电路的设计、时序电路的设计以及存储器和I/O电路的设计等。 此外,本书还介绍了数字集成电路的测试和验证方法,以及数字电路实现的相关技术,如综合和布局布线。同时,本书讨论了数字集成电路设计中的一些热门问题和趋势,如低功耗设计、嵌入式系统设计和FPGA等。 总的来说,《Digital Integrated Circuits A Design Perspective》是一本涵盖广泛、内容深入的数字电路设计教材,适合从事数字电路设计和研究的专业人士使用。同时,对于电子信息领域及相关专业的学生来说,本书也是一本不可或缺的参考书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值