`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input a, output reg match ); reg [8:0]cur_state; reg [8:0]nex_state; parameter IDLE=9'b0_0000_0001; parameter s0=9'b0_0000_0010; parameter s1=9'b0_0000_0100; parameter s2=9'b0_0000_1000; parameter s3=9'b0_0001_0000; parameter s4=9'b0_0010_0000; parameter s5=9'b0_0100_0000; parameter s6=9'b0_1000_0000; parameter s7=9'b1_0000_0000; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin cur_state<=IDLE; end else begin cur_state<=nex_state; end end always@(*)begin case(cur_state) IDLE:nex_state=(a==1'b0)?s0:IDLE; s0:nex_state=(a==1'b1)?s1:s0; s1:nex_state=(a==1'b1)?s2:s0; s2:nex_state=(a==1'b1)?s3:s0; s3:nex_state=(a==1'b0)?s4:s0; s4:nex_state=(a==1'b0)?s5:s0; s5:nex_state=(a==1'b0)?s6:s0; s6:nex_state=(a==1'b1)?s7:s0; s7:nex_state=(a==1'b1)?IDLE:s0; endcase end //由图可见,match的输出比a要慢一拍,所以应该使用时序逻辑电路判断 //因为在always块中要使用reg类型,且题目已经给出的定义output match是reg类型 //所以在不改动原先代码的前提下,应在always中使用match,然后用assign在always块外对另一个match_wire进行工作 //等于always单纯是用来打一拍的延后赋值 wire match_wire; always@(posedge clk or negedge rst_n)begin if(!rst_n)begin match<=0; end else begin match<=match_wire; end end assign match_wire=(cur_state==s7)?1:0; endmodule
要点在代码注释中