我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1042|回复: 6

[资料贡献] fpga状态机详解

[复制链接]

该用户从未签到

139

主题

239

回帖

152

积分

二级逆天

积分
152

终身成就奖金点子奖原创先锋奖

发表于 2020-6-4 17:15:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作

状态机的分类:Moore型状态机和Mealy型状态机


Moore型:状态机的变化只与当前的状态有关
Mealy型:状态机的变化不仅与当前的状态有关,还与输入有关


如何创建状态机:状态机的创建可以分为一段式,两段式和三段式


一段式:主要是讲所有的状态变化以及导致的输出变化都写在了一个always快中。
两段式:将一些复位信号,clk信号单独写在一个always快中,其他的状态变化,输出值得变化写在一个always快中。
三段式:将一些复位信号,clk信号单独写在一个always快中,其他的状态迁移变化写在一个always快中,对应状态的输出值得变化写在一个always快中。


举个例子:从循环输入的字母中做连续检测,当连续检测到“hello”时,将led灯进行状态的翻转,继续进行下一次的检测。



一段式的编写方式:




module  hello(
input clk,//系统时钟信号  50mHz
input rst_n,//系统复位信号,低电平有效
input [7:0] data,//连续输入的字母
output reg led//led灯
);

//设置需要改变的状态
parameter    checkh  = 5'b0000_1,
             checke  = 5'b0001_0,
             checkla = 5'b0010_0,
             checklb = 5'b0100_0,
             checko = 5'b1000_0;

reg [4:0]state;

always @(posedge clk or negedge rst_n)
    if(!rst_n)
        begin
            led <= 1'b0;
            state <= checkh;
        end
    else
        begin
            case (state)
                checkh:
                    if(data == "h") state <= checke;
                    else  state <= checkh;
                checke:
                    if(data == "e") state <= checkla;
                    else  state <= checkh;
                checkla:
                    if(data == "l") state <= checklb;
                    else  state <= checkh;
                checklb:
                    if(data == "l") state <= checko;
                    else  state <= checkh;
                checko:
                    if(data == "o")
                        begin
                        led <= ~led;
                        state <= checkh;
                        end
                    else  state <= checkh;
                default:state <= checkh;
            endcase
        end

endmodule12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849


两段式的编写方式:


module  hello(
input clk,
input rst_n,
input [7:0] data,
output reg led
);


parameter checkh  = 5'b0000_1,
             checke  = 5'b0001_0,
             checkla = 5'b0010_0,
             checklb = 5'b0100_0,
             checko = 5'b1000_0;

reg [4:0] cstate;
reg [4:0] nstate;

always @(posedge clk or negedge rst_n)
if(!rst_n)
        begin
            cstate <= checkh;
        end
else
            cstate <= nstate;


always @(cstate or data)
            case (cstate)
                checkh:
                    if(data == "h") nstate <= checke;
                    else  nstate <= checkh;
                checke:
                    if(data == "e") nstate <= checkla;
                    else  nstate <= checkh;
                checkla:
                    if(data == "l") nstate <= checklb;
                    else  nstate <= checkh;
                checklb:
                    if(data == "l") nstate <= checko;
                    else  nstate <= checkh;
                checko:
                    if(data == "o")
                        begin
                        led <= ~led;
                        nstate <= checkh;
                        end
                    else  nstate <= checkh;
                default:nstate <= checkh;
            endcase

endmodule123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051


三段式的编写方式:


module  hello(
input clk,
input rst_n,
input [7:0] data,
output reg led
);


parameter checkh  = 5'b0000_1,
             checke  = 5'b0001_0,
             checkla = 5'b0010_0,
             checklb = 5'b0100_0,
             checko = 5'b1000_0;

reg [4:0] cstate;
reg [4:0] nstate;

    //复位信号,clk的处理(主要是对初始状态进行赋值操作)
always @(posedge clk or negedge rst_n)
if(!rst_n)
        begin
            cstate <= checkh;
        end
else
            cstate <= nstate;

    //状态迁移的处理
always @(cstate or data)
            case (cstate)
                checkh:
                    if(data == "h") nstate <= checke;
                    else  nstate <= checkh;
                checke:
                    if(data == "e") nstate <= checkla;
                    else  nstate <= checkh;
                checkla:
                    if(data == "l") nstate <= checklb;
                    else  nstate <= checkh;
                checklb:
                    if(data == "l") nstate <= checko;
                    else  nstate <= checkh;
                checko:
                    if(data == "o")
                        begin
                        nstate <= checkh;
                        end
                    else  nstate <= checkh;
                default:nstate <= checkh;
            endcase

    //输出数据的处理
always @(posedge clk or negedge rst_n)
if(!rst_n)
        begin
            led <= 1'b1;
        end
else
        case (cstate)   
                checko:
                    if(data == "o")
                    led <= ~led;
                default;
            endcase

endmodule
---------------------
版权声明:本文为CSDN博主「ruanyz_china」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ruanyz_nobody/article/details/49892037[sub][/sub][sup][/sup][strike][/strike]
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-9-7 09:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    0

    主题

    4981

    回帖

    3456

    积分

    二级逆天

    积分
    3456

    终身成就奖社区居民优秀斑竹奖

    QQ
    发表于 2020-6-4 19:04:19 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    108

    回帖

    117

    积分

    二级逆天

    积分
    117

    终身成就奖特殊贡献奖原创先锋奖

    发表于 2020-6-5 08:17:12 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    1541

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖优秀斑竹奖

    发表于 2020-6-5 08:47:36 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    6

    主题

    1437

    回帖

    0

    积分

    1元学习PADS(5期)

    积分
    0

    终身成就奖优秀斑竹奖

    QQ
    发表于 2020-6-5 14:43:24 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    87

    主题

    1136

    回帖

    2478

    积分

    PADS-241024高级班

    积分
    2478

    终身成就奖

    发表于 2020-6-5 15:25:00 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    295

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2020-6-18 08:57:08 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表