← 2022 · MTK联发科 笔试

推荐答案 测试一下

用Verilog实现一个10010序列检测器,当检测到10010序列(包括重叠的情况时,序列检测器输出1,否则输出0,请画出状态转移框图并写出verilog代码。(15分)

编程题 中等 笔试真题

参考答案

状态转移图:采用 Moore 型状态机,定义 6 个状态:S0(初始,未匹配到任何序列)、S1(匹配到 '1')、S2(匹配到 '10')、S3(匹配到 '100')、S4(匹配到 '1001')、S5(匹配到 '10010' 并输出 1)。状态转移如下: - S0: 输入 0 → S0;输入 1 → S1。 - S1: 输入 0 → S2;输入 1 → S1(重叠,因为 '1' 自身构成匹配)。 - S2: 输入 0 → S3;输入 1 → S1(因为末尾 '10' 加 1 变成 '101',仅最后一个 '1' 匹配)。 - S3: 输入 0 → S0('1000' 无匹配);输入 1 → S4。 - S4: 输入 0 → S5;输入 1 → S1('10011' 仅最后一个 '1' 匹配)。 - S5(输出 1): 输入 0 → S2(重叠:末尾 '10' 加 0 变成 '100',匹配到 '100');输入 1 → S1(重叠:末尾 '0' 加 1 变成 '01',仅单个 '1' 匹配)。 Verilog 代码采用三段式状态机: ```verilog module seq_detector( input clk, input rst_n, input din, output reg dout ); parameter S0=4'd0, S1=4'd1, S2=4'd2, S3=4'd3, S4=4'd4, S5=4'd5; reg [3:0] state, next_state; always @(posedge clk or negedge rst_n) begin if (!rst_n) state <= S0; else state <= next_state; end always @(*) begin next_state = state; 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) begin if (!rst_n) dout <= 1'b0; else dout <= (state == S5) ? 1'b1 : 1'b0; end endmodule ``` 注意:状态 S5 输出 1;重叠处理体现在 S5 的转移中,输入 0 回到 S2(匹配 '100'),输入 1 回到 S1(匹配单个 '1')。

涉及知识点

  • Verilog
  • verilog
  • 状态机
  • sta
← 上一题
登录后反馈错题