Verilog FSM代码解析及4位状态编码修改问题咨询
FSM状态编码修改与逻辑说明
一、3位转4位状态编码修改方案
- 原状态定义位置定位:列出的6个状态定义,统一位于FSM模块开头的
localparam/parameter参数声明段,和状态寄存器声明(reg [2:0] current_state, next_state)紧邻。 - 最小改动修改方法:无需调整原有状态跳转判断逻辑,仅需两步即可完成4位扩展:
- 将状态寄存器位宽从3位改为4位,对应代码修改为:
// 原代码:reg [2:0] current_state, next_state; reg [3:0] current_state, next_state; - 将所有状态参数的编码从3位扩展为4位,直接在原3位编码最高位补0即可,对应参数修改参考:
localparam RESET = 4'b0000; // 原3'b000 localparam WAIT_PWD = 4'b0010; // 原3'b010,Wait for password localparam COMPARE = 4'b0100; // 原3'b100 localparam DO_OPERATION = 4'b0101; // 原3'b101 localparam LOGIN_SUCCESS = 4'b0110; // 原3'b110,Log in successful localparam LOGIN_FAILED = 4'b0111; // 原3'b111
- 将状态寄存器位宽从3位改为4位,对应代码修改为:
注意:修改完成后全局搜索代码中所有硬编码的状态判断常量,同步将位宽改为4位,避免综合时出现位宽不匹配警告。如果追求更好的FSM时序表现,也可以将4位编码改为FPGA适配性更好的独热码,对应编码为
4'b0001、4'b0010、4'b0100、4'b1000,但该方案需要同步调整次态跳转逻辑的判断条件。
二、FSM模块功能与流转逻辑说明
该FSM是典型的密码验证登录控制状态机,采用通用的两段/三段式FSM结构编写,分为状态寄存器时序逻辑、次态组合判断逻辑、输出逻辑三个代码段,各状态功能与流转规则如下:
- Reset状态:全局复位状态,系统上电/复位信号触发时进入该状态,所有输出寄存器、计数器清零复位,复位释放后一个时钟周期自动跳转到Wait for password状态。
- Wait for password状态:密码输入等待状态,该状态下持续扫描输入接口采集用户输入的密码值,当检测到用户按下确认键、密码输入完成时,跳转到Compare状态。
- Compare状态:密码比对状态,将用户输入的密码值和预存的正确密码做逐位比对,同时累计密码输入错误次数:比对一致直接跳转到Log in successful状态;比对不一致且错误次数未达锁定阈值时,清空当前输入缓存跳回Wait for password状态;比对不一致且错误次数达到锁定阈值时,跳转到Login failed状态。
- Log in successful状态:登录成功状态,该状态下点亮登录成功指示灯,输出系统解锁信号,等待1~2个时钟周期完成信号同步后,自动跳转到Do operation状态。
- Do operation状态:功能操作响应状态,该状态下解锁用户功能操作权限,响应各类功能操作请求,当检测到用户主动退出登录、或者操作超时信号时,清空登录状态标记跳回Wait for password状态,等待下一次密码输入。
- Login failed状态:登录失败锁定状态,该状态下点亮告警指示灯,锁定密码输入接口,启动锁定计时器,当计时器达到设定的锁定时长后,清空错误计数器跳回Wait for password状态,重新允许用户输入密码。
内容的提问来源于stack exchange,提问作者adfty
相关产品推荐
相关产品推荐

