← eetop.cn_数字IC设计工程师笔试面试经典100题(大部分有答案)
推荐答案
测试一下
题目
画出可以检测10010串的状态图,并verilog实现之。(威盛)
参考答案与知识点
参考答案
本题要求设计一个序列检测器,检测目标序列"10010"。采用Moore型有限状态机,每个状态代表已匹配的部分序列。定义状态:S0(初始,无匹配)、S1(已匹配'1')、S2(已匹配'10')、S3(已匹配'100')、S4(已匹配'1001')、S5(检测到完整序列'10010',输出1)。考虑重叠:当处于S5时,若输入为1,则下一状态转移至S1(因为"]"10010"的结尾"10"可与下一个"1"组成"1001"的开头一部分),若输入为0,则转移至S0;其他状态均根据输入更新匹配情况,例如S4时输入0则到S5,输入1则回到S1(因为"1001"末尾"1"可作为新序列开头)。状态转移图可用文字描述。Verilog实现采用三段式状态机:第一段时序逻辑描述状态更新(always @(posedge clk or negedge rst_n));第二段组合逻辑描述次态转移(always @(*) case (state) ... endcase);第三段组合逻辑或时序逻辑描述输出(Moore型输出可直接用assign out = (state == S5))。注意复位时进入S0。代码示例如下:
module seq_detector_10010(
input clk,
input rst_n,
input din,
output reg dout
);
parameter S0=3'd0, S1=3'd1, S2=3'd2, S3=3'd3, S4=3'd4, S5=3'd5;
reg [2:0] state, next_state;
always @(posedge clk or negedge rst_n)
if(!rst_n) state <= S0;
else state <= next_state;
always @(*)
case(state)
S0: next_state = din ? S1 : S0;
S1: next_state = din ? S1 : S2;
S2: next_state = din ? S3 : S0;
S3: next_state = din ? S4 : S0;
S4: next_state = din ? S1 : S5;
S5: next_state = din ? S1 : S0;
default: next_state = S0;
endcase
always @(posedge clk or negedge rst_n)
if(!rst_n) dout <= 1'b0;
else dout <= (state==S5);
endmodule
注意:也可用Mealy型实现,输出组合逻辑与输入相关,但Moore型更常见。易错点:遗漏S5后的重叠转移;编码时状态数不足;输出未与时钟同步导致毛刺。
涉及知识点
- 有限状态机设计方法
- 序列检测与重叠处理
- Moore型与Mealy型区别
- Verilog三段式状态机写法
- 状态图与状态转移表绘制