目录

银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2019-02-24 gingko 初次建立

实验十二:有限状态机实验——三段式状态机描述

一、 实验目的与意义

  1. 掌握三段式状态机的描述方法。
  2. 掌握宏定义、参数变量的使用方法。
  3. 掌握QuartusII的使用方法。

二、 实验设备及平台

  1. iCore4T 双核心板。
  2. iTool A(或相同功能)仿真器。
  3. USB Type C线缆。
  4. Keil MDK 开发平台。
  5. Quartus开发平台。
  6. 电脑一台。

三、 实验原理

四、 代码讲解

//控制led亮灭的状态机
//状态机流程,上电复位后进入空闲状态,然后等待大约3s时间闸门打开时进入点亮led状态,当检测到时间
//闸门信号的高电平时,将状态切换至熄灭led状态,再次检测到时间闸门时切换至亮状态,如此循环。
    reg led_r;
    reg [2:0]led_current_state;//当前状态
    reg [2:0]led_next_state;//下一个状态
 
//状态跳转逻辑设计always块
    always@(posedge clk_25m or negedge rst_n)
        begin
            if(!rst_n)
                begin
                    led_current_state <= `state_idle;
                end
            else
                begin
                    led_current_state <= led_next_state;
                end
        end
 
//状态输出
    always@(led_current_state or state_sig or rst_n)
        begin
            if(!rst_n)
                begin
                    led_next_state <= `state_idle;
                end
            else
                begin
                    case(led_current_state)
                        `state_idle:begin
                            if(state_sig)
                                begin
                                    led_next_state <= `state_led_on;
                                end
                            else
                                begin
                                    led_next_state <= `state_idle;
                                end
                        end
                        `state_led_on:begin
                            if(state_sig)
                                begin
                                    led_next_state <= `state_led_off;
                                end
                            else
                                begin
                                    led_next_state <= `state_led_on;
                                end
                        end
                        `state_led_off:begin
                            if(state_sig)
                                begin
                                    led_next_state <= `state_led_on;
                                end
                            else
                                begin
                                    led_next_state <= `state_led_off;
                                end
                        end
                        default:begin
                            led_next_state <= `state_idle;
                        end
                    endcase
                end
        end
 
//逻辑输出
    always@(posedge clk_25m or negedge rst_n)
        begin
            if(!rst_n)
                begin
                    led_r <= led_off;
                end
            else
                begin
                    case(led_next_state)
                        `state_idle:begin
                            led_r <= led_off;
                        end
                        `state_led_on:begin
                            led_r <= led_on;
                        end
                        `state_led_off:begin
                            led_r <= led_off;
                        end
                        default:begin
                            led_r <= led_off;
                        end
                    endcase
                end
        end

五、 实验步骤及实验结果

图12.1

  1. 将硬件正确连接,如图12.1所示。
  2. 将编写好的代码进行编译,并下载到开发板中;
  3. 观察实验现象——FPGA_LED闪烁,间隔大约为3s;

六、 拓展实验

  1. 通过Signaltap采样状态机跳转信号及状态切换,观察信号变化。
  2. 通过Signaltap采样对比一段式状态机、二段式状态机和三段式状态机状态跳转时序有何不同。