微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 状态机的问题

状态机的问题

时间:10-02 整理:3721RD 点击:

用状态机做一个流水灯的实验,希望四个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

复制代码

仿真过了吗

   状态机仿真没问题,奇怪就奇怪在这里。

仿真图

你这个clk也太快了把,还有一般三段式状态机组合逻辑部分一般是阻塞赋值



   我仿真用的是1MHZ的,实际在片上用的是1hz的频率,能明显看到leds闪烁的刚刚我把IDLE状态去掉了,只保留我需要的那些状态,led闪烁正常了,我在想是不是出入IDLE状态需要给特定的条件,要不然会跑飞

除了那个阻塞赋值没看出别的问题,你的en信号一直为高吗

   en 信号是高,我也改成阻塞赋值了,下到板子里状态还是不对,如果没有IDLE状态的话就没有问题,现在只能这样做了。

没道理会这样的啊,你有IDLE状态的时候现象是怎么样的,你输出1的时候LED亮还是输出0的时候LED亮。

状态机好难哦 啊啊

还是感觉比较复杂呀

楚天到了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top