FPGA系统性学习笔记连载_Day18【线性系列机】之【110110 二进制包头检测实验】篇

2021-04-08 11:03:47 浏览数 (1)

FPGA系统性学习笔记连载_Day18【线性系列机】之【110110 二进制包头检测实验】篇

本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群联系群主。

连载《叁芯智能fpga设计与研发-第18天》【线性系列机】之【110110 二进制包头检测实验】篇

原创作者:紫枫术河 转载请联系群主授权,否则追究责任

本实验利用状态机知识,做一个线性系列机包头检测。

实验要求:检测特定的包头 110110,当检测到输出一个clk的脉冲信号出来。

一、分析110110的状态转移图

1.1、状态转移图如下表

1.2、状态转移表

二、verilog代码实现

代码语言:javascript复制
module FSM_bin_seqence_check(
    input               clk,
    input               rst_n,
    input               bin,
     
    output  reg     flag
);
 
    //检测指定的系列 110110
     
    parameter   S0  = 3'd0;
    parameter   S1  = 3'd1;
    parameter   S2  = 3'd2;
    parameter   S3  = 3'd3;
    parameter   S4  = 3'd4;
    parameter   S5  = 3'd5;
    parameter   S6  = 3'd6;
 
    reg [2:0]   status;
     
    always@(posedge clk,negedge rst_n)begin
        if(!rst_n)
            begin
                status <= S0;
                flag <= 1'b0;
            end
        else
            begin
                case(status)
                    S0:
                        begin
                            if(bin == 1'b1)
                                status <= S1;
                            else
                                status <= S0;
                        end
                    S1:
                        begin
                            if(bin == 1'b1)
                                status <= S2;
                            else
                                status <= S0;
                        end
                    S2:
                        begin
                            if(bin == 1'b1)
                                status <= S2;
                            else
                                status <= S3;
                        end
                    S3:
                        begin
                            if(bin == 1'b1)
                                status <= S4;
                            else
                                status <= S0;
                        end
                    S4:
                        begin
                            if(bin == 1'b1)
                                status <= S5;
                            else
                                status <= S0;
                        end
                    S5:
                        begin
                            if(bin == 1'b1)
                                status <= S2;
                            else
                                begin
                                    //拉高脉冲,检测到指定系列
                                    flag <= 1'b1;
                                    status <= S6;
                                end
                        end
                    S6:
                        begin
                            //拉低脉冲,脉冲只给一个周期
                            flag <= 1'b0;
                            if(bin == 1'b1)
                                status <= S1;
                            else
                                status <= S0;
                        end
                    default:status <= S0;
                endcase
            end
    end
     
endmodule

三、仿真文件

代码语言:javascript复制
`timescale 1ns/1ps
 
module FSM_bin_seqence_check_tb();
 
    reg         clk;
    reg         rst_n;
    reg         bin;
     
    wire            flag;
 
    FSM_bin_seqence_check FSM_bin_seqence_check_inst(
        .clk        (clk),
        .rst_n  (rst_n),
        .bin        (bin),
         
        .flag       (flag)
    );
 
    always #10 clk = ~clk;
     
    initial begin
        clk = 0;
        rst_n = 0;
        bin = 0;
        #30;
        rst_n = 1;
        repeat(10000)begin
            bin = {$random}%2;
            #20;
        end
        #500000;
        bin = 0;
        #500000;
        #10;
        bin = 1;
        #20;
        bin = 1;
        #20;
        bin = 0;
        #20;   
        bin = 1;
        #20;
        bin = 1;
        #20;
        bin = 0;
        #20;   
        repeat(10000)begin
            bin = {$random}%2;
            #20;
        end    
    end
 
    initial begin
        #50000000;
        $stop;
    end
 
endmodule

四、仿真效果

从仿真结果看,我们设计的代码正确。

0 人点赞