| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2019-02-1 | gingko | 初次建立 | ===== 实验十:有限状态机实验——一段式状态机描述 ===== ==== 一、 实验目的与意义 ==== - 掌握一段式状态机的描述方法。 - 掌握宏定义、参数变量的使用方法。 - 掌握QuartusII的使用方法。 ==== 二、 实验设备及平台 ==== - iCore4T 双核心板。 - iTool A(或相同功能)仿真器。 - USB Type C 线缆。 - Keil MDK 开发平台。 - Quartus开发平台。 - 电脑一台。 ==== 三、 实验原理 ==== * 状态机是一种设计思想,通常由组合逻辑和寄存器两部分组成。寄存器用于存储状态,组合逻辑完成状态译码和产生输出信号。状态机的组成有3各基本要素:状态、输入和输出。其中状态是用来划分逻辑顺序和时序规律的变量;输入指的是状态机进入每个状态的条件;输出指的是在某种状态下发生的事件。 * 描述状态机关键是要描述清楚状态机的三个要素,即如何进行状态转移、每个状态的输出是什么、状态转移的条件是什么等。在Verilog硬件描述时,状态机有3种常用的描述方法:一段式、二段式和三段式。 * 一段式描述方法是将状态转移的组合逻辑和状态寄存器转移的时序逻辑写在一个always模块中。这种描述方法不符合Verilog将时序和组合逻辑分开描述的代码风格,且整个代码不够清晰,不利于代码维护和升级,同时,不利于附加约束,不利于设计的综合和布局布线。 * 本实验的实验原理是通过硬件语言描述产生一个周期为3s的时间闸门信号,以该信号作为状态转移的触发信号来实现状态跳转,通过状态跳转改变led的亮灭。 ==== 四、 代码讲解 ==== * 本实验状态机的主要功能是通过状态切换实现led的闪烁,在state_idle状态,led为灭;程序开始运行后,自动跳转到state_led_on状态,点亮led;当3s时间闸门打开,状态转移信号有效,状态跳转到state_led_off状态;当3s时间闸门打开,状态转移信号有效,状态跳转到state_led_on状态,以此循环实现led的闪烁。其代码如下: //控制led亮灭的状态机 //状态机流程,上电复位后进入空闲状态,然后自动进入点亮led状态,当检测到时间闸门信号 //的高电平时,将状态切换至熄灭led状态,再次检测到时间闸门时切换至亮状态,如此循环。 reg led_r; reg [2:0]led_state; always@(posedge clk_25m or negedge rst_n) begin if(!rst_n) begin led_r <= led_off; led_state <= `state_idle; end else begin case(led_state) `state_idle:begin led_state <= `state_led_on; led_r <= led_off; end `state_led_on:begin led_r <= led_on; if(state_sig) begin led_state <= `state_led_off; end else begin led_state <= led_state; end end `state_led_off:begin led_r <= led_off; if(state_sig) begin led_state <= `state_led_on; end else begin led_state <= led_state; end end endcase end end ==== 五、 实验步骤及实验结果 ==== {{ :icore4t:icore4t_ide_1_37.jpg?600 |图10.1}} - 将硬件正确连接,如图10.1所示。 - 将编写好的代码进行编译,并下载到开发板中; - 观察实验现象——FPGA_LED闪烁,间隔大约为3s; ==== 六、 拓展实验 ==== 1、通过Signaltap采样状态机跳转信号及状态切换,观察信号变化。