跳至内容
用户工具
登录
站点工具
搜索
工具
显示页面
修订记录
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
您的足迹:
状态机实验_两段式状态机描述
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-07-01 | gingko | 初次建立 | ===== 实验七:状态机实验——两段状态机描述 ===== ==== 一、 实验目的与意义 ==== - 掌握两段式状态机的描述方法。 - 掌握宏定义、参数变量的使用方法。 - 掌握QuartusII的使用方法。 ==== 二、 实验设备及平台 ==== - iCore4 双核心板。 - Blaster(或相同功能)仿真器。 - Micro USB线缆。 - QuartusII开发平台。 - 电脑一台。 ==== 三、 实验原理 ==== * 状态机是一种设计思想,通常由组合逻辑和寄存器两部分组成。寄存器用于存储状态,组合逻辑完成状态译码和产生输出信号。状态机的组成有3各基本要素:状态、输入和输出。其中状态是用来划分逻辑顺序和时序规律的变量;输入指的是状态机进入每个状态的条件;输出指的是在某种状态下发生的事件。 * 描述状态机关键是要描述清楚状态机的三个要素,即如何进行状态转移、每个状态的输出是什么、状态转移的条件是什么等。在Verilog硬件描述时,状态机有3种常用的描述方法:一段式、二段式和三段式。 * 二段式状态机的整个功能由两个模块完成,一个always模块采用同步时序的方法描述状态转移,另一个模块采用组合逻辑的方式判断状态转移条件,描述状态转移规律,两者结合功能完成状态机功能。 * 二段式与一段式状态机相比,将同步时序和组合逻辑分别放在不同的always模块中,不仅便于阅读、理解、维护,更重要的是利于综合器优化代码,利于用户添加合适的时序约束条件,利于布局布线实现设计。在二段式描述中,常采用组合逻辑描述状态的输出,这种组合逻辑有产生毛刺的可能性,且不利于约束,这也是二段式描述的缺点。 * 本实验以实验二按键实验的程序为例,即使用按键控制LED状态的转移。依次按下按键三色LED灯会按照红、绿、蓝、红……的顺序依次点亮。以按键信号的下降沿作为状态转移的触发信号来实现状态跳转,通过状态跳转改变三色led的状态。在其中一个always模块采用同步时序描述状态转移,在另一个模块中判断状态转移条件、描述状态转移的规律,在最后一个模块中描述led输出状态,实现控制led。 ==== 四、 代码讲解 ==== * 本实验状态机的主要功能是通过状态切换实现按键控制led颜色切换的功能,led_cnt=0状态,点亮红灯;按键按下,状态跳转到led_cnt=1状态,点亮绿灯;按键按下,状态跳转到led_cnt=2状态,点亮蓝灯;以此循环实现按键控制三色led灯的切换。其代码如下: <code verilog> //控制led亮灭的状态机 //状态机流程,上电复位后进入空闲状态,并点亮红色led,然后等待按键按下 //当检测到按键的下降沿时,led_cnt加1,加至2时,清零,并依此循环 //依此来实现按键控制三色led状态切换的功能 reg [1:0]led_cnt;//led_cnt三个状态,0、1、2,代表三色led的红、绿、蓝 reg ledr,ledg,ledb; //状态跳转逻辑设计always块,检测到按键下降沿,切换led_cnt值 always@(negedge key_state or negedge rst_n) if (!rst_n) begin led_cnt <= 2'd0; end else if (led_cnt == 2'd2) begin led_cnt <= 2'd0; end else led_cnt <= led_cnt + 1'd1; //逻辑输出,根据led_cnt来切换led状态 always@(posedge clk_25m or negedge rst_n) if (!rst_n) begin ledr <= 1'd1; ledg <= 1'd1; ledb <= 1'd1; end else case(led_cnt) 2'd0: //红灯亮 begin ledr <= 1'd0; ledg <= 1'd1; ledb <= 1'd1; end 2'd1: //绿灯亮 begin ledr <= 1'd1; ledg <= 1'd0; ledb <= 1'd1; end 2'd2: //蓝灯亮 begin ledr <= 1'd1; ledg <= 1'd1; ledb <= 1'd0; end default: //都不亮 begin ledr <= 1'd1; ledg <= 1'd1; ledb <= 1'd1; end endcase </code> ==== 五、 实验步骤及实验结果 ==== {{ :icore4:icore4_fpga_6_2.jpg?direct |图7-1}} - 将硬件正确连接,如图7-1所示。 - 将编写好的代码进行编译,并下载到开发板中; - 观察实验现象——依次按下按键,三色led灯状态按红、绿、蓝、红……切换。 ==== 六、 拓展实验 ==== - 通过Signaltap II采样led_cnt信号和led输出信号,观察信号变化。
状态机实验_两段式状态机描述.txt
· 最后更改: 2022/03/22 10:28 由
sean
页面工具
显示页面
修订记录
反向链接
回到顶部