芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 14942|回复: 12

【06.28已解决】关于FSM识别特定字符串的问题(已附源码)

[复制链接]
  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
    发表于 2018-6-26 15:24:17 | 显示全部楼层 |阅读模式
    本帖最后由 Deer-菜籽 于 2018-6-28 20:16 编辑

    在自己尝试写FSM识别“Welcome”的例程里面,成功编译,但是在modelsim仿真里出现错误。
    自己找了好久实在没找出来是哪里的问题。(以小梅哥的代码结构为基准去修改,一行一行对照后依然没发现问题所在。
    具体问题表现见图
    Q1.PNG
    (testbench 所给序列为 WelWelejklWelcomeqwerWElcomWelConwelcomeWelcomWelcomezxcvbmqasdv
    (检测序列为 Welcome

    1.FSM的state停在了4‘d0001 且再无变化
    2.当检测到第三个字符“l”时应为 4’0011 ,仿真显示为 4‘d0001
    3.当检测到第二个字符为“e”时state变为 4’d0010,此时依testbench所写应对 data_tmp 进行左移 ,data 应为下一字符 “l”,而仿真显示仍未 “e”

    希望大大看到能帮忙分析回复
    刚开始重新学verilog,小白问题还请见谅

    FSM代码
    1. module FSM(
    2.         clk,
    3.         rst_n,
    4.         dv,
    5.         data,
    6.         cnt,
    7.         state
    8. );


    9. input        clk;
    10. input        rst_n;
    11. input        dv;
    12. input        [7:0]data;


    13. output        reg        [2:0]        cnt;
    14. output        reg        [3:0]        state;











    15. always@(posedge clk or negedge rst_n)
    16.         if(!rst_n)
    17.                 begin
    18.                 cnt <= 3'd0;
    19.                 state <= 3'd1;
    20.                 end
    21.                 else if (dv)
    22.                         begin
    23.                                 case(state)
    24.                                         3'd1:        begin
    25.                                                 if (data == "W")
    26.                                                         state <= 3'd2;
    27.                                                 else
    28.                                                         state <= 3'd1;
    29.                                                 end
    30.                                         3'd2:        begin  
    31.                                                 if (data == "e")
    32.                                                         state <= 3'd3;
    33.                                                 else if (data == "W")
    34.                                                         state <= 3'd2;
    35.                                                 else
    36.                                                         state <= 3'd1;
    37.                                                 end
    38.                                         3'd3:        begin  
    39.                                                 if (data == "l")
    40.                                                         state <= 3'd4;  
    41.                                                 else if (data == "W")
    42.                                                         state <= 3'd2;
    43.                                                  else
    44.                                                         state <= 3'd1;
    45.                                                 end
    46.                                         3'd4:        begin  
    47.                                                 if (data == "c")
    48.                                                         state <= 3'd5;  
    49.                                                 else if (data == "W")
    50.                                                                 state <= 3'd2;
    51.                                                         else
    52.                                                                 state <= 3'd1;
    53.                                                 end
    54.                                         3'd5:        begin
    55.                                                 if (data == "o")
    56.                                                         state <= 3'd6;
    57.                                                 else if (data == "W")
    58.                                                                 state <= 3'd2;
    59.                                                         else
    60.                                                                 state <= 3'd1;
    61.                                                 end
    62.                                         3'd6:        begin
    63.                                                 if (data == "m")
    64.                                                         state <= 3'd7;
    65.                                                 else if (data == "W")
    66.                                                                 state <= 3'd2;
    67.                                                         else
    68.                                                                 state <= 3'd1;
    69.                                                 end
    70.                                         3'd7:        begin  
    71.                                                 if (data == "e")
    72.                                                         begin
    73.                                                                 cnt <= cnt + 1'd1;
    74.                                                                 state <= 3'd0;
    75.                                                         end
    76.                                                 else if (data == "W")
    77.                                                                 state <= 3'd2;
    78.                                                         else
    79.                                                                 state <= 3'd1;
    80.                                                 end        
    81.                                         default: state <= 3'd1;
    82.                                 endcase
    83.                         end

    84.                
    85. endmodule
    复制代码

    Testbench代码
    1. `timescale 1ns/1ns
    2. `define        timeperiod 20

    3. module FSM_tb;


    4. reg                clk_t;
    5. reg                rst_n_t;
    6. reg         dv_t;
    7. wire        [3:0]state_t;
    8. wire         [2:0]cnt_t;
    9. wire        [7:0]data_t;



    10. wire        [511:0]        data_tmp;
    11. assign         data_tmp = "WelWelejklWelcomeqwerWElcomWelConwelcomeWelcomWelcomezxcvbmqasdv";
    12. reg                [511:0]        reg_tmp;

    13. always@(posedge clk_t or negedge rst_n_t)
    14.         if(!rst_n_t)
    15.                 reg_tmp <= 0;        
    16.         else if (dv_t)
    17.                 reg_tmp <= (data_tmp << 8) ;
    18.         else
    19.                 reg_tmp <= data_tmp;

    20. assign data_t = reg_tmp[511:504];



    21. FSM FSM_1(
    22.         .clk(clk_t),
    23.         .rst_n(rst_n_t),
    24.         .dv(dv_t),
    25.         .data(data_t),
    26.         .cnt(cnt_t),
    27.         .state(state_t)
    28. );

    29. initial clk_t = 0;
    30. always #(`timeperiod/2) clk_t = ~clk_t;


    31. initial begin
    32.                 rst_n_t = 0;
    33.                 dv_t = 0;
    34.                 #(`timeperiod*10)
    35.                 rst_n_t = 1;
    36.                 #(`timeperiod*10)
    37.                 dv_t = 1;
    38.                 #(`timeperiod*64)
    39.                 #2000;
    40.                 $stop;
    41.         end

    42. endmodule
    复制代码

    3.FSM.zip

    1.04 KB, 下载次数: 506

    工程源码(已更新)

    回复

    使用道具 举报

  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
     楼主| 发表于 2018-6-26 15:26:04 | 显示全部楼层
    抱歉,上传的图片有比例显示问题,单击后显示正常
    下次会注意截图比例
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-6-29 15:57
  • 13

    主题

    246

    帖子

    3625

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    3625
    发表于 2018-6-26 16:38:00 | 显示全部楼层
    always@(posedge clk or negedge rst_n)

    你代码,posedge clk ,clk上升沿检测
    clk上升沿检测
    上升沿检测
    上升沿
    然后你这个“l”明显不在上升沿吧,这时候always块都没进入
    QQ图片20180626163535.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
     楼主| 发表于 2018-6-26 17:04:48 来自手机 | 显示全部楼层
    fzwwj95 发表于 2018-6-26 16:38
    你代码,posedge clk ,clk上升沿检测
    clk上升沿检测
    上升沿检测

    这个时间指示会对仿真造成影响吗,我尝试移动后好像没有任何变化,是哪里还需要设置吗

    不过我也发现了我上面说错的地方,
    看到仿真在检测到"l"后,state_t变为0011,这里应该是没问题的,即正文第二点表述出错了。

    所以问题应该是
    1.为什么在检测到第二个"W",state_t变为0001以后就不再变化了
    2.为什么data_t的数据一直停留在"e"没有变化呢

    先行谢过啦,但依然希望得到您的回复
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 421

    主题

    778

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    15840
    QQ
    发表于 2018-6-26 22:09:50 | 显示全部楼层
    建议楼主直接把代码贴出来,不要发附件,这样才能让更多的路过的人方便帮你看看代码。下载附件就转了个弯儿了。

    点评

    恩,同意,而且一解压还一大堆文件。。  发表于 2018-6-27 07:10
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
     楼主| 发表于 2018-6-27 18:44:07 | 显示全部楼层
    admin 发表于 2018-6-26 22:09
    建议楼主直接把代码贴出来,不要发附件,这样才能让更多的路过的人方便帮你看看代码。下载附件就转了个弯儿 ...

    嗯不好意思,附件已经删掉了其它文件。代码也已贴在正文。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-1-19 13:06
  • 4

    主题

    35

    帖子

    764

    积分

    高级会员

    Rank: 6Rank: 6

    积分
    764
    发表于 2018-6-28 08:07:33 | 显示全部楼层
    testbech 20-26行有问题导致数据输入始终未改变,源代码代码没问题,但是建议注意代码风格。



    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-1-19 13:06
  • 4

    主题

    35

    帖子

    764

    积分

    高级会员

    Rank: 6Rank: 6

    积分
    764
    发表于 2018-6-28 08:11:01 | 显示全部楼层
    16-26行代码修改如下:

    reg                [511:0]        reg_tmp= "WelWelejklWelcomeqwerWElcomWelConwelcomeWelcomWelcomezxcvbmqasdv";;

    always@(posedge clk_t or negedge rst_n_t)
            if(!rst_n_t)
                    reg_tmp <= 0;        
            else if (dv_t)
                    reg_tmp <= (reg_tmp << 8) ;
            else
                    reg_tmp <= reg_tmp ;
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2018-8-25 09:43
  • 3

    主题

    15

    帖子

    199

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    199
     楼主| 发表于 2018-6-28 20:16:12 | 显示全部楼层
    slsqz 发表于 2018-6-28 08:11
    16-26行代码修改如下:

    reg                [511:0]        reg_tmp= "WelWelejklWelcomeqwerWElcomWelCon ...

    已经解决!
    太谢谢了!!!
    另外想请教一下对于代码风格有什么建议吗
    因为贴上来的是为了跟小梅哥的代码进行校对而修改的,可能有些东施效颦了,不知道你有什么好的模板可以分享一下吗
    不胜感激
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-1-19 13:06
  • 4

    主题

    35

    帖子

    764

    积分

    高级会员

    Rank: 6Rank: 6

    积分
    764
    发表于 2018-6-28 22:39:56 | 显示全部楼层
    模板这种东西我是没有的,一个可以看看许多大神的例程,比如模仿梅哥的风格,另一个可以生成简单的源码不加密的ipcore,看看他们怎么写的。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-4-16 14:57 , Processed in 0.125823 second(s), 39 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表