FPGA开发——状态机的使用

一、概述

我们在使用FPGA进行开发的过程当中,实现一个东西用得最多的实现方法就是状态机的实现方法,用一句话总结就是万物皆可状态机,这和我们在学习Linux时常说的在Linux中万物都是文件差不多,这里就主要就是突出状态机的应用范围很广。

二、相关理论

1、概念

2、状态机编码方式

在进行状态机编码时我们一般采用独热码进行编码,独热码想对于自然二进制编码和格雷码编码来说:组合逻辑较少,不易产生毛刺,使用范围广。缺点就是触发器个数较多,(二进制编码毛刺大,格雷码逻辑组合较多)

3、描述方式

在进行代码编写时我们通常采用三段式的编码方式进行编写。

三、代码编写

这里我们就简单使用状态机描述输入多个二进制数,当检测到1011时输出一个标志位的过程。

1、状态转移图

2、设计文件的编写

cpp 复制代码
module test (
    input               clk     ,
    input               rst_n   ,
    input               din ,
    output      reg        dout  
);
//参数定义
parameter   IDLE =5'b00001,//0
            S1   =5'b00010,//检测到1
            S2   =5'b00100,//检测到10
            S3   =5'b01000,//检测到101
            S4   =5'b10000;//检测到1011
//内部信号
reg  [5:0]  state_c     ;//现态
reg  [5:0]  state_n     ;//次态


//时序逻辑电路描述状态转移
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        state_c = IDLE;
    else
        state_c = state_n; 
end
//使用组合逻辑描述状态转移条件
always @(*)begin
    case (state_c)
        IDLE :begin//0
            if(din==1)
                state_n = S1;
            else
                state_n = IDLE;
        end
        S1   :begin//1
            if(din==0)
                state_n = S2;
            else
                state_n = S1;
        end
        S2   :begin//10
            if(din==1)
                state_n = S3;
            else
                state_n = IDLE;
        end
        S3   :begin//101
            if(din==1)
                state_n = S4;
            else
                state_n = S2;
        end
        S4   :begin//1011
                state_n = IDLE;
        end
        default: state_n = IDLE;
    endcase
end 

//描述输出结果
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)
        dout<=0;
    else if(state_c ==S4)
        dout<=1;
    else
        dout<=0;
end
endmodule

3、测试文件的编写

cpp 复制代码
//定义时间尺度
`timescale 1ns/1ns
module test_tb ;

//输入信号定义
reg  clk  ;
reg  rst_n;
reg  din  ;
wire dout ;

//模块例化
test test_inst(
    /*input             */  .clk     (clk  ),
    /*input             */  .rst_n   (rst_n),
    /*input             */  .din     (din  ),
    /*output      reg   */  .dout    (dout ) 
);
//时钟
parameter  CLK_CLY =20;
initial  clk=0;
always  #(CLK_CLY/2) clk=~clk;
//复位
initial begin
//初始化
    rst_n= 1'b0;
    #(CLK_CLY*2);
    #5;
    rst_n=1'b1;
end
//激励
initial begin
    din= 1'b0;
    #(CLK_CLY*3);
    #5;
    repeat (30)begin
        din= $random;
        #(CLK_CLY*1);
    end
    $stop;
end
endmodule

四、波形仿真

在波形图中我们可以看到当检测到输入的二进制数与状态转移条件就会发生变化,当检测到1011时,输出会产生一个高电平,代表检测到数据。通过总体观察,波形图中状态之间的转移和我们在前面画的状态转移条件一致没说明我们的状态机设置成功。

相关推荐
00后程序员张6 分钟前
有没有更轻量的 iOS 开发环境?快蝎kxapp轻量化路径与构成
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
buhuizhiyuci1 小时前
【Linux 网络篇】数据的 “循环系统“:协议认识与网络传输的流程
linux·运维·服务器·网络·vscode
LabVIEW开发1 天前
LabVIEW 如何把地下震源定位误差做到5米内
fpga开发·labview·labview知识·labview功能·labview程序
Dr.kangder1 天前
嵌入式处理器架构解析(十)——DSP+FPGA
fpga开发·架构·嵌入式
szxinmai主板定制专家1 天前
Zynq MPSoC实现半导体真空腔体状态监测|FPGA多传感器时序同步采集方案
fpga开发·zynq·控制器·mpsoc·半导体设备·fpga同步
学习FPGA的电气小兴兴2 天前
基于FPGA的DDS信号发生器设计,生成频率可调的正弦波、三角波、锯齿波和方波
fpga开发·数字信号处理·fpga·vivado·dsp·dds·diy
iCxhust2 天前
8088单板机VScode集成开发环境使用方法
ide·笔记·vscode·编辑器·微机原理·8088单板机
如何原谅奋力过但无声2 天前
现代化Python工具:uv、Ruff、Pyright、Rich(只讲重点版)
vscode·python·uv
Molesidy2 天前
【VSCode】基于win10系统老版本和VSCode最新版本下出现的VSCode内置的终端窗口不能运行的问题的解决方案
ide·vscode·编辑器
szxinmai主板定制专家2 天前
Zynq MPSoC半导体高精度运动控制方案|FPGA硬件插补实现亚微米级伺服实时控制
人工智能·嵌入式硬件·fpga开发·zynq·运动控制·ethercat