| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-04-0 | gingko | 初次建立 | \\ \\ ===== 实验十三:有限状态机实验——一段式状态机描述 ===== ==== 一、 实验目的与意义 ==== - 掌握一段式状态机的描述方法。 - 掌握宏定义、参数变量的使用方法。 ==== 二、 实验设备及平台 ==== - iCore4TX 双核心板[[https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22598974120.3.29da532fLkazHH&id=614919247574|点击购买]]。 - USB-CABLE(或相同功能)仿真器。 - Micro USB线缆。 - Keil MDK 开发平台。 - ISE开发平台。 ==== 三、 实验原理 ==== * 状态机是一种设计思想,通常由组合逻辑和寄存器两部分组成。寄存器用于存储状态,组合逻辑完成状态译码和产生输出信号。状态机的组成有3各基本要素:状态、输入和输出。其中状态是用来划分逻辑顺序和时序规律的变量;输入指的是状态机进入每个状态的条件;输出指的是在某种状态下发生的事件。 * 描述状态机关键要描述清楚状态机的三个要素,即如何进行状态转移、每个状态的输出是什么、状态转移的条件是什么。状态机有3种常用的描述方法:一段式、二段式和三段式。 * 一段式描述方法是将状态转移的组合逻辑和状态寄存器转移的时序逻辑写在一个always模块中。缺点是不符合Verilog将时序逻辑和组合逻辑分开描述的代码风格,且整个代码结构不够清晰,不利于代码维护和升级,也不利于附加约束、设计的综合和布局布线。 * 本实验的实验原理是通过硬件语言描述产生一个周期为3s的时间闸门信号,以该信号作为状态转移的触发信号来实现状态跳转,通过状态跳转改变led的亮灭。 ==== 四、 代码讲解 ==== * 本实验状态机的主要功能是通过状态切换实现led的闪烁,在state_idle状态,led灭;程序开始运行后,自动跳转到state_led_on状态,led亮;当3s时间闸门打开,状态转移信号有效,状态跳转到state_led_off状态,led灭;当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状态 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 ==== 五、 实验步骤及实验结果 ==== {{ :icore4tx:icore4tx_fpga_13_1.png?direct |图13-1}} * 将硬件正确连接,如图13-1所示。 * 将编写好的代码进行编译,并下载到开发板中; * 观察实验现象——FPGA_LED闪烁,间隔大约为3s; ==== 六、 拓展实验 ==== 1、通过Signaltap采样状态机跳转信号及状态切换,观察信号变化。