[FPGA入门笔记](九):序列检测实验,Moore和Mealy状态机对比

简介

今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油。
本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2。开发板输入时钟为50MHz。

序列检测器设计

序列检测器可用于检测一组或多组由二进制码组成的脉冲序列信号,当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
**关键步骤:**正确码的接收必须是连续的,要求检测器必须记住前一次的正确码及正确序列,直到在连续的检测中所收到的每一位码都与预置数的对应码相同。
利用Moore状态机和Mealy状态机来分别实现对输入序列数"1101"的检测。
Moore状态机序列检测器设计
解题分析:
如果现态是s0,输入为0,那么下一状态还是停留在s0;如果输入1,则转移到状态s1。
在状态s1,如果输入为0,则回到状态s0;如果输入为1,那么就转移到s2。
在s2状态,如果输入为1,则停留在状态s2;如果输入为0,那么下一状态为s3。
在s3状态,如果输入为1,则转移到状态s4,输出1;如果输入为0,则返回状态s0。
在s4状态,如果输入为0,回到初始状态s0;如果输入为1,下一状态为s1。
状态转移图
在这里插入图片描述
Mealy状态机序列检测器设计
状态转移图
在这里插入图片描述
对比Mealy状态机与Moore状态机的状态图可知:
Moore状态机的检测结果输出是与时钟同步的;而Mealy状态机的检测结果输出是异步的,当输入发生变化时,输出就立即变化。因此Mealy状态机的输出比Moore状态机状态的输出提前一个周期。

代码:

Moore状态机序列检测器设计

`timescale 1ns/1ps
module seq_detect_moore(
    input   clk,
    input   rst_n,
    input   din,
    output  dout
    );
    localparam  s0 = 3'b000,
                s1 = 3'b001,
                s2 = 3'b010,
                s3 = 3'b011,
                s4 = 3'b100;
    reg [2:0]   state_curt; //state current
    reg [2:0]   state_next; //state next

    //first, state transtion
    always@(posedge clk, negedge rst_n)
    begin
        if(!rst_n)
            state_curt <= s0;
        else
            state_curt <= state_next;
    end
    //second, next state logic
    always @ *
        case(state_curt)
            s0:if(din)
                    state_next = s1;
                else
                    state_next = s0;
            s1:if(din)
                    state_next = s2;
                else
                    state_next = s0;
            s2:
                if(din)
                    state_next = s2;
                else
                    state_next = s3;
            s3:if(din)
                    state_next = s4;
                else
                    state_next = s0;
            s4:if(din)
                    state_next = s1;
                else
                    state_next = s0;
            default:
                    state_next = s0;
        endcase
    //thrid, output logic
    assign dout = (state_curt==s4)? 1'b1:1'b0;
endmodule

Mealy状态机序列检测器设计

`timescale 1ns/1ps
module seq_detect_mealy(
    input   clk,
    input   rst_n,
    input   din,
    output  dout
    );
    localparam  s0 = 2'b00,
                s1 = 2'b01,
                s2 = 2'b10,
                s3 = 2'b11;
    reg [1:0]   state_curt;//state current
    reg [1:0]   state_next;//state next

    //first, state transition
    always@(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            state_curt <= s0;
        else
            state_curt <= state_next;
    end
    //second, next state logic
    always@(*)
    begin
        case(state_curt)
            s0: if(din)
                    state_next = s1;
                else
                    state_next = s0;
            s1: if(din)
                    state_next = s2;
                else
                    state_next = s0;
            s2: if(din)
                    state_next = s2;
                else
                    state_next = s3;
            s3: if(din)
                    state_next = s0;
                else
                    state_next = s0;
            default:
                    state_next = s0;
        endcase
    end
    //third, output logic
    assign dout = ((state_curt == s3)&(din==1'b1))? 1'b1:1'b0;

endmodule                         

顶层文件

`timescale 1ns/1ps
module seq_top(
    input   clk,
    input   rst_n,
    input   din,
    output  dout0,
    output  dout1
    );

    seq_detect_moore m0(
    .clk(clk),
    .rst_n(rst_n),
    .din(din),
    .dout(dout0)    
    );
    seq_detect_mealy m1(
    .clk(clk),
    .rst_n(rst_n),
    .din(din),
    .dout(dout1)    
    );
endmodule

测试文件

`timescale 1ns/1ps
module tb_seq_detect;
    reg     clk;
    reg     rst_n;
    reg  [0:0]   din;
    wire [0:0]   dout0;
    wire [0:0]   dout1;
    
    parameter   DATA_NUM = 4'b1101;
    reg  [3:0]  data;
    always #10 clk = ~clk;

    initial
    begin
        clk = 1'b0;
        rst_n = 1'b0;
        #100 
        rst_n = 1'b1;
        data  = DATA_NUM; 
        repeat(10000)
            begin    
            @(posedge clk);
                begin
                data = {data[2:0],data[3]};
                din = data[3];
                end
            end
    end
seq_top uut(
    .clk(clk),
    .rst_n(rst_n),
    .din(din),
    .dout0(dout0),
    .dout1(dout1)
    );

endmodule

仿真结果:

对比Mealy状态机与Moore状态机的状态图可知:
Moore状态机的检测结果输出是与时钟同步的;而Mealy状态机的检测结果输出是异步的,当输入发生变化时,输出就立即变化。因此Mealy状态机的输出比Moore状态机状态的输出提前一个周期。

在这里插入图片描述

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值