// 3.Moore型FSM,根据当前状态生成输出 always@(posedge clk or negedge rst_n) begin if(~rst_n) begin match <= 0; end elseif(curr_state == S7) begin match <= 1; end else begin match <= 0; end end endmodule
`timescale 1ns/1ns module sequence_detect( input clk, input rst_n, input a, output reg match );
reg [8:0] curr_seq;
// 1.维护存储序列的寄存器 always@(posedge clk or negedge rst_n) begin if(~rst_n) begin curr_seq <= 9'bxxx_xxx_xxx; end else begin curr_seq <= {curr_seq[7:0],a}; end end // 2.判断序列是否模式匹配 always@(posedge clk or negedge rst_n) begin if(~rst_n) begin match <= 0; end elseif(curr_seq[2:0] == 3'b110 && curr_seq[8:6] == 3'b011) begin match <= 1; end else begin match <= 0; end end endmodule
// 利用计数器进行分组 always@(posedge clk or negedge rst_n ) begin if(~rst_n) begin cnt <= 'b0; end else begin if(cnt == 3'd6) cnt <= 'b1; else cnt <= cnt + 1; end end // 1.次态更新现态 always@(posedge clk or negedge rst_n) begin if(~rst_n) begin curr_state = IDLE; end else begin curr_state = next_state; end end
// 3.根据现态生成输出,波形match没有打拍直接组合逻辑输出 always@(*) begin if(~rst_n) begin match <= 0; not_match <= 0; end elseif(cnt == 6 ) begin if(curr_state == S6) begin match <= 1; not_match <= 0; end else begin match <= 0; not_match <= 1; end end else begin match <= 0; not_match <= 0; end end endmodule
always@(posedge clk or negedge rst_n) begin if(!rst_n) begin cs <= IDLE; end else begin cs <= ns; end end
always@(*) begin case(cs) IDLE : begin if( data_valid ) begin ns = data == 0 ? S1 : IDLE ; end else begin ns = cs; end end S1 : begin if( data_valid ) begin ns = data == 1 ? S2 : S1; end else begin ns = cs; end end S2 : begin if( data_valid ) begin ns = data == 1 ? S3 : S1; end else begin ns = cs; end end S3 : begin if( data_valid ) begin ns = IDLE; end else begin ns = cs; end end endcase end always@(posedge clk or negedge rst_n) begin if(!rst_n) begin match <= 0; end else begin if(cs == S3 && data == 0 && data_valid == 1) begin match <= 1; end else begin match <= 0; end end end endmodule