在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4061|回复: 11

[求助] 状态机的问题

[复制链接]
发表于 2015-3-31 13:41:53 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 hellold77 于 2015-3-31 13:50 编辑

用状态机做一个流水灯的实验,希望四个LED可以依次闪烁,当下到片子里面,四个LED全是亮,当我把状态机最后一个状态去掉之后,运行就正常了,我用的是XILINX的XCS250E,是状态机的状态多了之后跑飞吗?



  1. module fsm_led_4( clk
  2.                                           ,en
  3.                  ,rst
  4.                                      ,a
  5.                  ,b
  6.                  ,c
  7.                  ,d
  8.                   );
  9.    
  10.    parameter FSM_STATES = 7;
  11.    parameter ON = 1'b1;
  12.    parameter OFF = 1'b0;
  13.    
  14.    input clk,en,rst;
  15.    output a,b,c,d;

  16.    wire clk,en,rst;
  17.    wire a,b,c,d;



  18.    
  19.    reg [FSM_STATES-1:0] state_current,state_next;
  20.    reg FSM_s1,FSM_s2,FSM_s3,FSM_s4;

  21.         assign a = FSM_s1;
  22.         assign b = FSM_s2;
  23.         assign c = FSM_s3;
  24.         assign d = FSM_s4;

  25.         parameter [FSM_STATES-1 : 0]
  26.                                                         IDLE        = 7'b0000001,
  27.                                                         S1                           = 7'b0000010,
  28.                                                         S2                                = 7'b0000100,
  29.                                                         S3                                = 7'b0001000,
  30.                                                         S4                                = 7'b0010000,
  31.                                                         S5                                = 7'b0100000,
  32.                                                         S6                                = 7'b1000000;

  33.    
  34. always @(posedge clk or posedge rst )
  35. begin
  36.    if(rst)
  37.       state_current <= IDLE;
  38.    else
  39.       state_current <= state_next;
  40. end

  41. always @ (
  42.             state_current
  43.                                 or en
  44.            )
  45. begin
  46.    case(state_current)
  47.       IDLE:begin
  48.                         if(en)                        
  49.                            state_next <= S1;
  50.                     else
  51.                            state_next <= IDLE;
  52.       end        
  53.       S1:begin
  54.                         state_next <= S2;
  55.       end
  56.                
  57.       S2:begin
  58.                         state_next <= S3;
  59.       end
  60.                
  61.       S3:begin
  62.                         state_next <= S4;
  63.       end
  64.                
  65.       S4:begin
  66.                         state_next <= S5;
  67.                 end
  68.       S5:begin
  69.                         state_next <= S6;
  70.                 end
  71.            S6:begin
  72.                         if(en)
  73.                                 state_next <= S1;
  74.                    else
  75.                            state_next <= IDLE;
  76.                 end

  77.       default:begin
  78.          state_next <= IDLE;
  79.       end
  80.    endcase
  81. end        

  82. always @(state_current)
  83. begin
  84.    case(state_current)
  85.       IDLE:begin
  86.          FSM_s1         <= OFF;
  87.          FSM_s2         <= OFF;
  88.          FSM_s3         <= OFF;
  89.          FSM_s4         <= OFF;
  90.       end
  91.            S1:begin
  92.          FSM_s1         <= ON;
  93.          FSM_s2         <= OFF;
  94.          FSM_s3         <= OFF;
  95.          FSM_s4         <= OFF;
  96.       end
  97.       S2:begin
  98.          FSM_s1         <= OFF;
  99.          FSM_s2         <= ON;
  100.          FSM_s3         <= OFF;
  101.          FSM_s4         <= OFF;
  102.       end
  103.       S3:begin
  104.          FSM_s1         <= OFF;
  105.          FSM_s2         <= OFF;
  106.          FSM_s3         <= ON;
  107.          FSM_s4         <= OFF;
  108.       end
  109.       S4:begin
  110.          FSM_s1         <= OFF;
  111.          FSM_s2         <= OFF;
  112.          FSM_s3         <= OFF;
  113.          FSM_s4         <= ON;
  114.       end        
  115.                 S5:begin
  116.          FSM_s1         <= ON;
  117.          FSM_s2         <= ON;
  118.          FSM_s3         <= ON;
  119.          FSM_s4         <= ON;
  120.       end
  121.                 S6:begin
  122.          FSM_s1         <= ON;
  123.          FSM_s2         <= ON;
  124.          FSM_s3         <= OFF;
  125.          FSM_s4         <= OFF;
  126.       end
  127.            default:begin
  128.          FSM_s1         <= OFF;
  129.          FSM_s2         <= OFF;
  130.          FSM_s3         <= OFF;
  131.          FSM_s4         <= OFF;
  132.       end
  133.    endcase
  134. end

  135. endmodule


复制代码
发表于 2015-3-31 13:42:31 | 显示全部楼层
仿真过了吗
 楼主| 发表于 2015-3-31 13:46:14 | 显示全部楼层
 楼主| 发表于 2015-3-31 13:51:01 | 显示全部楼层
仿真图

仿真图

仿真图
发表于 2015-3-31 14:03:04 | 显示全部楼层
你这个clk也太快了把,还有一般三段式状态机组合逻辑部分一般是阻塞赋值
 楼主| 发表于 2015-3-31 14:23:08 | 显示全部楼层
回复 5# wgej1987


   我仿真用的是1MHZ的,实际在片上用的是1hz的频率,能明显看到leds闪烁的刚刚我把IDLE状态去掉了,只保留我需要的那些状态,led闪烁正常了,我在想是不是出入IDLE状态需要给特定的条件,要不然会跑飞
发表于 2015-3-31 17:16:51 | 显示全部楼层
除了那个阻塞赋值没看出别的问题,你的en信号一直为高吗
 楼主| 发表于 2015-4-1 14:04:51 | 显示全部楼层


除了那个阻塞赋值没看出别的问题,你的en信号一直为高吗
wgej1987 发表于 2015-3-31 17:16




   en 信号是高,我也改成阻塞赋值了,下到板子里状态还是不对,如果没有IDLE状态的话就没有问题,现在只能这样做了。
发表于 2015-4-1 14:45:44 | 显示全部楼层
没道理会这样的啊,你有IDLE状态的时候现象是怎么样的,你输出1的时候LED亮还是输出0的时候LED亮。
发表于 2015-4-1 22:52:14 | 显示全部楼层
状态机好难哦 啊啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-23 05:22 , Processed in 0.024793 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表