赞
踩
状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine),主要分为2大类:
第一类,若输出只和状态有关而与输入无关,则称为Moore状态机
第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机
有限状态机主要包括:米利状态机和穆尔状态机。输出与输入变量直接相关的状态机称为米利状态机,输出与输入变量无直接关系的状态机称为穆尔状态机。
1、根据以下描述功能用verilog编写一段代码,并用状态机来实现该功能。
(1)状态机:实现一个测试过程,该过程包括启动准备状态、启动测试、停止测试、查询测试结果、显示测试结果、测试结束返回初始化6个状态;用时间来控制该过程,90秒内完成该过程;
(2)描述状态跳转时间;
(3)编码实现。
流程图:
相关说明:
序号 | 时间 | 说明 |
---|---|---|
C0 | 10s | 到S1状态,led0亮 |
C1 | 25s | 进入S2状态,led1亮 |
C2 | 45s | 进入S3状态,led2 亮 |
C3 | 55s | 进入S4状态,led3亮 |
C4 | 70s | 进入S5结果显示状态 ,led0,1,2,3全亮 |
C5 | 90s | 返回S0初始化状态,led都灭 |
新建一个文件夹state_machine,包含以下文件夹:
将项目工程放到prj文件夹下,src放.v文件,tcl放引脚配置文件,sim放仿真文件。
代码:
module state_machine( input wire clk, //时钟50_000_000 input wire rst_n, //复位 output reg [3:0] led //4个灯 ); reg [32:0] cnt=0; //定义一个33位宽的计数器 localparam T=33'd4_499_999_999; //90秒 //90s计数器 always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt<=33'd0; else if(cnt==T) cnt<=33'd0; else cnt<=cnt +33'd1; end //状态机 //状态空间划分 localparam s0=3'd0;//第一个灯亮 localparam s1=3'd1;//第二个灯亮 localparam s2=3'd2;//第三个灯亮 localparam s3=3'd3;//第四个灯亮 localparam s4=3'd4;//全亮 localparam s5=3'd5;//全灭 //定义状态寄存器 reg [2:0]cstate;//current:当前,state:状态,6个状态需要3个位宽来存储 reg [2:0]nstate;//next state:次态 //三段式状态机 //【1】现态跟随次态 always @(posedge clk or negedge rst_n)begin if(!rst_n) cstate<=s0; else cstate<=nstate; end //【2】状态的判断和转移 always @(*)begin if(!rst_n) nstate=s0; else case(cstate) //现态 s0: begin if(cnt==33'd499_999_999)//10s nstate=s1; else nstate=s0; end s1: begin if(cnt==33'd1_249_999_999)//25s nstate=s2; else nstate=s1; end s2: begin if(cnt==33'd2_249_999_999)//45s nstate=s3; else nstate=s2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。