← 数字IC设计经典笔试题

推荐答案 测试一下

画出可以检测10010串的状态图,并verilog实现之。(威盛)

编程题 中等 笔试真题

参考答案

本题要求设计序列检测器,检测二进制序列“10010”。采用Moore型有限状态机(FSM)实现。首先定义状态:S0(初始,等待第一个1),S1(收到1),S2(收到10),S3(收到100),S4(收到1001),S5(收到10010,输出1)。状态转移需考虑重叠:例如在S5后若输入1,则转移到S1(因为末尾1为新序列开始);若输入0,则转移到S2(因为末尾10与前缀10匹配)。具体状态图(文字描述):从S0,输入1→S1,0→S0;S1,0→S2,1→S1;S2,0→S3,1→S1(因为10后接1,只有1匹配前缀);S3,0→S0(100后接0,无匹配),1→S4;S4,0→S5(检测到10010),1→S1(1001后接1,只有1匹配);S5,0→?(10010后接0,末尾010与目标前缀匹配?后缀10,故到S2),1→S1(末尾1匹配)。更严谨做法是使用状态转移表,但上述已覆盖重叠。Verilog实现采用三段式:第一段时序逻辑更新当前状态;第二段组合逻辑计算次态;第三段输出(状态S5时out=1,其余0)。注意异步复位。代码示例: ```verilog module seq_detector( input clk, 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 @(*) begin next_state = S0; // default case (state) S0: next_state = din ? S1 : S0; S1: next_state = din ? S1 : S2; S2: next_state = din ? S1 : S3; S3: next_state = din ? S4 : S0; S4: next_state = din ? S1 : S5; S5: next_state = din ? S1 : S2; default: next_state = S0; endcase end always @(posedge clk or negedge rst_n) if (!rst_n) dout <= 1'b0; else dout <= (state == S5); endmodule ``` 注意:三段式中输出为寄存器输出,避免组合毛刺。另外需考虑序列重叠,已在转移中处理。

涉及知识点

  • verilog
  • 状态机
  • Verilog
  • 时序
  • 组合逻辑
← 上一题
登录后反馈错题
下一题 →