FSM next-state logic

该文章展示了一个使用Verilog实现的有限状态机(FSM),通过三个触发器y[3:1]和输入w来切换状态A到F。状态分配表被详细列出,并特别关注了如何为触发器y[2]派生下一个状态表达式。输出Y2由状态C和D决定。

假设您希望使用三个触发器和状态代码 y[3:1] = 000, 001, ..., 101 分别用于状态 A、B、...、F 来实现 FSM。显示此 FSM 的状态分配表。 为触发器 y[2] 派生下一个状态表达式。

module top_module (
    input [3:1] y,
    input w,
    output Y2);
    parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=3'b100,F=3'b101;
    reg [2:0] state;
    always @ (*) begin
        case (y)
            A:	state = w ? A : B;
            B:	state = w ? D : C;
            C:	state = w ? D : E;
            D:	state = w ? A : F;
            E:	state = w ? D : E;
            F:	state = w ? D : C;
        endcase
    end
    assign Y2 = (state==C)|(state==D);
endmodule

 

 

verilog按键消抖模块module debounce_fsm ( input clk, // 主时钟 input rst_n, // 复位信号,低电平有效 input key_in, // 原始按键输入 output reg key_out // 消抖后的按键输出 ); //------------------------------------- // 参数定义 //------------------------------------- parameter CNT_MAX = 20_000_000; // 假设系统时钟为 100MHz,对应约 200ms 抖动时间 //------------------------------------- // 状态类型定义 //------------------------------------- typedef enum logic [1:0] { IDLE, PRESS_CHK, RELEASE_CHK } state_t; state_t current_state, next_state; //------------------------------------- // 计数器定义 //------------------------------------- reg [31:0] cnt; //------------------------------------- // 状态寄存器更新 //------------------------------------- always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) current_state <= IDLE; else current_state <= next_state; end //------------------------------------- // 状态转移逻辑 //------------------------------------- always_comb begin next_state = current_state; case (current_state) IDLE: begin if (!key_in) next_state = PRESS_CHK; end PRESS_CHK: begin if (cnt == CNT_MAX) next_state = IDLE; end RELEASE_CHK: begin if (cnt == CNT_MAX) next_state = IDLE; end default: next_state = IDLE; endcase end //------------------------------------- // 计时器与标志信号逻辑 //------------------------------------- always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) begin cnt <= 0; key_out <= 1'b1; end else begin case (current_state) IDLE: begin cnt <= 0; if (!key_in) key_out <= 1'b0; // 按键按下 end PRESS_CHK: begin if (cnt < CNT_MAX) cnt <= cnt + 1; else begin key_out <= 1'b0; // 确认按下 end end RELEASE_CHK: begin if (cnt < CNT_MAX) cnt <= cnt + 1; else begin key_out <= 1'b1; // 确认释放 end end endcase end end endmodule 生成测试代码
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值