首页/文章/ 详情

FPGA入门3——状态机描述风格,具有工程价值的状态机结构

1年前浏览245

       状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(Finite State Machine),主要分为2大类:

第一类,若输出只和状态有关而与输入无关,则称为Moore状态机

第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机

       关于状态机的一个极度确切的描述是:它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。

状态机模块编写:






















































module ex_fsm(    input  wire  sclk,    input  wire  rst_n,    output  reg  k1,    output  reg  k2,    input  wire  A
);//状态机应用————>既有时间关系又有顺序关系
parameter  IDLE=4'b0001;//显示的写出状态表达式parameter  START=4'b0010;//显示的写出状态表达式parameter  STOP=4'b0100;//显示的写出状态表达式parameter  CLEAR=4'b1000;//显示的写出状态表达式reg      [3:0]  state;//2'b00 2'b01 2'b10 2'b11二进制编码用的寄存器数量少,但是用的组合逻辑资源多//4'b0001 4'b0010 4'b0100 4'b1000独热码占用寄存器数量多,但是组合逻辑资源少//4个bit if(state==4'b0001)--->if(state[0]==1'b1)节省逻辑//if(state==4'b1100)---->if(state==4'b1100)二进制编码//第一段描述状态机
always@(posedge sclk or negedge rst_n)  if(rst_n==1'b0)  state<=IDLE;  else  case(state)    IDLE: if(A==1'b1)      state<=START;    START:if(A==1'b1)      state<=STOP;    STOP:if(A==1'b1)      state<=CLEAR;    CLEAR:if(A==1'b0)      state<=IDLE;    default:state<=IDLE;    endcase
always@(posedge sclk or negedge rst_n)  if(rst_n==1'b0)    k1<=1'b0;  else if(state==IDLE && A==1'b1)    k1<=1'b0;  else if(state==CLEAR && A==1'b1)    k1<=1'b1;
always@(posedge sclk or negedge rst_n)    if(rst_n==1'b0)    k2<=1'b0;  else if(state==STOP &&  A==1'b1)    k2<=1'b1;  else if(state==CLEAR && A==1'b0)    k2<=1'b0;    endmodule

测试模块编写


















































`timescale    1ns/1ns
module  tb_ex_fsm;reg  sclk,rst_n;reg  in_A;wire  k1,k2;
initial begin  sclk<=0;  rst_n<=0;  #100;  rst_n<=1;end
initial begin#200;in_data();end
always #10 sclk<=~sclk;
ex_fsm ex_fsm_inst(    .sclk  (sclk),    .rst_n  (rst_n),    .k1  (k1),//例化模块时输出端口括号内必须是wire变量    .k2  (k2),    .A  (in_A)
);task in_data();  integer i;  begin    for(i=0;i<1024;i=i+1)    begin    @(posedge sclk);    if(i<50)      in_A<=0;    else if(i<200)      in_A<=1;    else if(i<700)      in_A<=0;    else if(i<800)      in_A<=1;    else if(i<900)      in_A<=0;    end  endendtaskendmodule

上述代码不是完整代码,需要自行补充!


来源:集成电路小刚
电路控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-27
最近编辑:1年前
集成电路小刚
硕士 立志成为集成电路领域专家
获赞 3粉丝 44文章 69课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈