HDLBits学习------Problem 118~126

参考链接:HDLBits导学


Problem 118 Simple FSM1 / Fsm1

        问题:图中是一个有两个状态的摩尔型状态机。有一个输入信号与一个输出信号。本题中需要实现图中的状态机,注意复位后状态为 B,复位采用异步复位

Fsm1.png

        思路:三段式状态机,详细解释参考上面链接

三段式分别指

  • 状态跳转逻辑
  • 状态触发器实现
  • 输出逻辑

        解决:

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
        // State transition logic
		case(state)
			A:next_state = in ? A : B;
			B:next_state = in ? B : A;
		endcase
    end

    //状态触发器实现,在时钟边沿实现状态寄存器的跳变以及状态复位
    always @(posedge clk, posedge areset) begin    // This is a sequential always block
        // State flip-flops with asynchronous reset
		if(areset)
			state <= B;
		else
			state <= next_state;
    end

    //输出逻辑,根据当前状态实现输出
	assign out = state;
    // Output logic
    // assign out = (state == ...);

endmodule

Problem 119 Simple FSM1 / Fsm2s

        问题:此练习和上一个联系相同,但是采用同步复位的方式

        解决:

// 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_state;

    //状态跳转逻辑 根据输入信号以及当前状态确定状态的次态
    always @(*) begin    // This is a combinational always block
        // State transition logic
		case(state)
			A:next_state = in ? A : B;
			B:next_state = in ? B : A;
		endcase
    end

    //状态触发器实现,在时钟边沿实现状态寄存器的跳变以及状态复位
    always @(posedge clk) begin    // This is a sequential always block
        // State flip-flops with asynchronous reset
		if(reset)
			state <= B;
		else
			state <= next_state;
    end

    //输出逻辑,根据当前状态实现输出
	assign out = state;
    // Output logic
    // assign out = (state == ...)

endmodule

(按照题目给的模板去写没有写出来,,,时序总是对不上)


Problem 120 Simple FSM2/ Fsm2

        问题:这是一个具有两个状态、两个输入和一个输出的摩尔状态机。实现这个状态机

fsmjk.png

        解决:

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_state;

    always @(*) begin
        // State transition logic
		case(state)
			ON: next_state = k ? OFF : ON;
			OFF: next_state = j ? ON : OFF;
		endcase
    end

    always @(posedge clk, posedge areset) begin
        // State flip-flops with asynchronous reset
		if(areset)
			state <= OFF;
		else
			state <= next_state;
    end

    // Output logic
    // assign out = (state == ...);
	assign out = state;
	
endmodule

Problem 121 Simple FSM2/ Fsm2s

        问题:此练习和上一个练习一样,但是使用同步复位

        解决:

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

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

    always @(*) begin
        // State transition logic
        case(state)
			ON: next_state = k ? OFF : ON;
			OFF: next_state = j ? ON : OFF;
		endcase
    end

    always @(posedge clk) begin
        // State flip-flops with synchronous reset
        if(reset)
			state <= OFF;
		else
			state <= next_state;
    end

    // Output logic
    // assign out = (state == ...);
    assign out = state;

endmodule

Problem 122 Simple state transitions 3/ Fsm3comb

        问题:下面是一个输入、一个输出、四个状态的摩尔状态机的状态转移表。使用以下状态编码:A=2'b00、B=2'b01、C=2'b10、D=2'b11。

仅为此状态机实现状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态 ( state),根据状态转换表计算next_state和输出 ( 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

Problem 123 Simple one-hot state transitions 3/ Fsm3onehot

        问题:下面是一个输入、一个输出、四个状态的摩尔状态机的状态转移表。使用以下状态编码:A=4'b0001, B=4'b0010, C=4'b0100, D=4'b1000。

 

通过检查假设编码来导出状态转换和输出逻辑方程。仅为此状态机实现状态转换逻辑和输出逻辑(组合逻辑部分)。(测试平台将使用非一个热输入进行测试,以确保您不会尝试做一些更复杂的事情)

        解决:

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[B] & in) || (state[D] & in) || (state[A] & 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

        注意:最后的输出是该状态位为1


Problem 124 Simple FSM3/ Fsm3

        问题:下面是一个输入、一个输出、四个状态的摩尔状态机的状态转移表。实现这个状态机。异步复位到状态A

        解决:

module top_module(
    input clk,
    input in,
    input areset,
    output out); //
	
	parameter A=0, B=1, C=2, D=3;
	reg[1:0] state,next_state;
	
    // State transition logic
	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
    // State flip-flops with asynchronous reset
	always @(posedge clk or posedge areset) begin
		if(areset)
			state <= A;
		else
			state <= next_state;
	end
	
    // Output logic
	assign out = (state == D);

endmodule

Problem 125 Simple FSM3/ Fsm3s

        问题:此题和上一题一样,只是使用了同步复位

        解决:

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

    parameter A=0, B=1, C=2, D=3;
	reg[1:0] state,next_state;
	
    // State transition logic
	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
    // State flip-flops with asynchronous reset
	always @(posedge clk) begin
		if(reset)
			state <= A;
		else
			state <= next_state;
	end
	
    // Output logic
	assign out = (state == D);

endmodule

Problem 126 Design a Moore FSM/Exams/ece241 2013 q4

        问题:大概意思就是:当水位达到最大值,也就是s1s2s3都输出高电平的时候,水流量为0,也就是f1f2f3和dfr都输出低电平,当水位低于最低值,也就是s1s2s3都输出低电平的时候,水流量要最大,也就是f1f2f3和dfr都输出高电平。然后就是水位在最高和最低之前的时候,f1f2f3的输出看表就好,什么状态哪一个要输出高电平。dfr则需要看上一次水位的改变是什么,如果上一次水位在减少,那就输出高电平,反之输出低电平。注意,此处指的是上一次水位的变化,而不是上一个时钟沿水位的状态

 还包括一个高电平有效同步复位,该复位将状态机复位到相当于水位长时间处于低位的状态(没有传感器有效时,所有四个输出都为高电平)

        解决:

module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
    
    //四个状态
    //空闲状态 fr1输出状态 fr1和fr2输出状态 fr1,fr2,fr3都输出的状态
    parameter Idle=0,Fr1O=1,Fr12O=2,Fr123O=3;
    //状态保存 上一次状态 本次状态 下一次状态
    reg[1:0] pre_state,state,next_state;
	
    //不管什么状态都会发生的状态改变
	always @(*) begin
		case(s)
			3'b000: next_state <= Fr123O;
			3'b001: next_state <= Fr12O;
			3'b011:	next_state <= Fr1O;
			3'b111: next_state <= Idle;
			default: next_state <= state;
        endcase
	end
	
	always @(posedge clk) begin
        if(reset) begin
			state <= Fr123O;
             if(state != next_state)
                pre_state <= state;
        end
		else begin
			state <= next_state;
            //保证上一次的状态和本次的状态不会是相同状态
            //针对 7->3->3 或是 3->1->1->1都需要输出dfr
            //不可能定义不定个上一次状态来保存各种上一次状态
            //所以上一次状态就让它不同于本次状态
            if(state != next_state)
                pre_state <= state;
		end
	end
	
    //输出 
	assign fr1 = (state == Fr1O||state == Fr12O||state == Fr123O);
	assign fr2 = (state == Fr12O||state == Fr123O);
	assign fr3 = (state == Fr123O);

    //当三个都输出的时候 dfr也要输出,然后就是本次的水位比上一次的低
    //当然指的是在本次状态发生改变的情况,没有发生改变还得看发生改变那一次的水位变化是怎样的
    assign dfr = (pre_state < state) || (state == Fr123O);

endmodule

        注意:这个题主要就是dfr的输出比较难搞

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值