Verilog HDLBits 第十五期:3.2.5 Finite State Machines(3.2.5.1-3.2.5.4)

目录

前言

3.2.5.1 Simple FSM 1(asynchoronous reset) (Fsm1)

Solution:

3.2.5.2 Simple FSM 1(synchoronous reset) (Fsm1s)

Solution:

3.2.5.3 Simple FSM 2(asynchoronous reset) (Fsm2)

Solution:

3.2.5.4 Simple FSM 2(synchoronous reset) (Fsm2s)

Solution:


前言

HDLbits网站如下

Problem sets - HDLBits (01xz.net)

从本期开始我们继续HDLbits第三章Circuits的学习,本期的内容是3.2.5 Finite State Machines有限状态机的第一小节(3.2.5.1-3.2.5.4)


3.2.5.1 Simple FSM 1(asynchoronous reset) (Fsm1)

这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。

本练习与 fsm1s相似,但是使用异步复位。

Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。

  • Hint:这是一个 T 输入反相的TFF 。

Solution:

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

	// 给出状态名称和赋值。我太懒了,所以我习惯使用十进制数字
	// 使用什么赋值并不重要,只要他们是唯一的
	parameter A=0, B=1;
	reg state;		// 确保 state 和 next 足够大以保存状态编码。
	reg next;
    
    
    // 一个有限状态机通常分为三部分:
    //   状态转变逻辑
    //   状态触发器
    //   输出逻辑
    // 有时可以将这些代码块中的一个或多个组合在一起,但要小心:有些代码块是组合的,有些是时序
    
    
    // 使用组合always块表示状态转变逻辑,给出当前状态与输入,下一个状态应该是啥呢?
    // 组合always块:使用阻塞赋值语句
    always@(*) begin
		case (state)
			A: next = in ? A : B;
			B: next = in ? B : A;
		endcase
    end
        
    
    // 使用边沿触发always块(D触发器)来表示状态触发器,异步复位
    always @(posedge clk, posedge areset) begin
		if (areset) state <= B;		// Reset to state B
        else state <= next;			// Otherwise, cause the state to transition
	end
		
				
	// 组合输出逻辑。在本题中,一个assign语句是最简单的
	// 在更复杂的电路中,一个组合always块更合适
	assign out = (state==B);

	
endmodule

这就是俗称的三段FSM


3.2.5.2 Simple FSM 1(synchoronous reset) (Fsm1s)

这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。

本练习与 fsm1相似,但是使用同步复位。

Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。

  • Hint:这是一个 T 输入反相的TFF 。

Solution:

// Note the Verilog-1995 module declaration syntax here:
module top_module(clk, reset, in, out);
    input clk;
    input reset;    // Synchronous reset to state B
    input in;
    output out;//  
    reg out;
 
    parameter A=0,B=1;
    reg state, next;
    
    always@(*) begin
        case(state)
           A:next=in?A:B;
           B:next=in?B:A; 
        endcase
    end
    
    always@(posedge clk) begin
        if(reset) begin
            state<=B;
        end
        else begin
            state<=next;
        end
    end
    
    always@(*) begin
        case(state)
            A:out=1'b0;
            B:out=1'b1;
        endcase
    end

endmodule

3.2.5.3 Simple FSM 2(asynchoronous reset) (Fsm2)

这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。

本练习与fsm2s相似,但是使用异步复位。

Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。

  • Hint:这是一个 JK触发器 。

Solution:

module top_module(
    input clk,
    input areset,    // Asynchronous reset to OFF
    input j,
    input k,
    output out); //  

    parameter OFF=0, ON=1; 
    reg state, next;

    always @(*) begin
        case(state)
            OFF:next=j?ON:OFF;
            ON :next=k?OFF:ON;
        endcase
    end

    always @(posedge clk, posedge areset) begin
        if(areset)
            state<=OFF;
        else 
            state<=next;
    end

    assign out = (state == ON);

endmodule

3.2.5.4 Simple FSM 2(synchoronous reset) (Fsm2s)

这是一个摩尔状态机,有两种状态,单输入单输出。请实现这个状态机。请注意,复位状态为 B。

本练习与 fsm2相似,但是使用同步复位。

Hint:是的,除了编写 FSM 之外,还有其他方法可以做到这一点。但这不是这个练习的重点。

  • Hint:这是一个 JK触发器 。

Solution:

module top_module(
    input clk,
    input reset,    // Asynchronous reset to OFF
    input j,
    input k,
    output out); //  

    parameter OFF=0, ON=1; 
    reg state, next;

    always @(*) begin
        case(state)
            OFF:next=j?ON:OFF;
            ON :next=k?OFF:ON;
        endcase
    end

    always @(posedge clk) begin
        if(reset)
            state<=OFF;
        else 
            state<=next;
    end

    assign out = (state == ON);

endmodule

本小节的FSM都是入门级别的,熟练掌握三段式FSM非常有用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值