`timescale 1ns/1ns module det_moore( input clk , input rst_n , input din , output reg Y ); // MOORE状态机,输出不只和当前输入有关,还和原态有关。// 记忆 // 实现从左只有序列:1101,不重叠 // 当检测到:1101,Y 输出一个时钟的高脉冲 // 状态机实现 reg [3:0] state, n_state; parameter s0 = 4'b1111, // 初态 s1 = 4'b0001, s2 = 4'b0010, s3 = 4'b0100, s4 = 4'b1000; always@(posedge clk or negedge rst_n) begin if(!rst_n) state <= s0; else state <= n_state; end // //always@(state) begin // 没有加入 din信号,不可操作. // n_state = always@(state or din) begin case(state) s0: if(din == 1) n_state = s1; else n_state = s0; s1: if(din == 1) n_state = s2; else n_state = s0; s2: if(din == 0) n_state = s3; else n_state = s1; s3: if(din == 1) n_state = s4; else n_state = s0; default: n_state = s0; endcase end always@(posedge clk or negedge rst_n) begin if(!rst_n) Y <= 1'b0; else if(state == s4) // n_state == s4不行,必须要延迟一个clk Y <= 1'b1; else Y <= 1'b0; end endmodule