画状态转移图

在上节课学习了按键消抖的原理及解决办法,具体如下:

这节课以按键消抖过程学习了如何绘制状态转移图;

首先明确:上图的按键消抖过程中共有4个状态:

                1.空闲态 2.按下消抖状态 3.等待释放状态 4.释放消抖状态

分别用四个圆圈表示这四个状态

下面目标:搞清楚这四个状态之间分别是如何转移的,即转移条件

为了表示方便,做以下意义说明:

20ms计数器  cnt;

下降沿 nedege_key;

上升沿 pedge_key;

1.空闲态:①当检测到下降沿,则跳转到按下消抖状态,并开始20ms计数

                 ②当未检测到下降沿,保持空闲态

2.按下消抖状态:①当在20ms计数期间检测到上升沿,则回到空闲态

                            ②当在20ms计数期间未检测到上升沿,则按键消抖成功,进入等待释放状态

                            ③当在20ms计数期间上升沿和下降沿均未检测到,则保持原状态,继续计数

3.等待释放状态:①当检测到上升沿,则跳转到释放消抖状态,并开始20ms计数

                            ②当未检测到上升沿,则保持原状态

4.释放消抖状态:①当在20ms计数期间检测到下降沿,则回到等待释放状态

                            ②当在20ms计数期间未检测到下降沿,则释放消抖成功,此时输出按键消抖成功信号,进入空闲状态

9月23日更新

  上周疯狂摸鱼,今天早上把上周写完的代码进行了初步测试,结果应该是没问题的;

附代码:

module key_filter(clk,restn,key,p_flag,r_flag );
input clk;                                  
input restn;
input key;
output reg p_flag;
output reg r_flag;

reg dff0_key;
reg dff1_key;

parameter IDLE = 0;
parameter p_filter = 1;
parameter wait_rest = 2;
parameter r_filter = 3;

parameter MCNT = 1000000-1; // 20ms

//key是异步输入信号,对其打两拍消除亚稳态
always@(posedge clk)
    dff0_key<=key;
always@(posedge clk)
    dff1_key<=dff0_key;
reg reg_key;
always@(posedge clk)
    reg_key<=dff1_key;
    
//定义上升沿和下降沿
wire nedge_key;
assign nedge_key = (dff1_key==0)&&(reg_key==1);
wire pedge_key;
assign pedge_key = (dff1_key==1)&&(reg_key==0);


//20ms计数
reg[19:0]cnt;
always@(posedge clk or negedge restn)
    if (!restn)
        cnt<=0;
    else if(cnt==MCNT)
        cnt<=0;
    else if((state==p_filter)||(state==r_filter))
        cnt<=cnt+1;
    else cnt<=0;
    

reg reached_20ms;
always@(posedge clk or negedge restn)
    if(!restn)
        reached_20ms<=0;
    else if(cnt==MCNT)
       reached_20ms<=1;
       
reg [1:0]state;
reg complete;

always@(posedge clk or negedge restn)
    if(!restn)
        state<=0;
    else 
    case(state)
    IDLE:
    begin 
        if(nedge_key)
            state<=p_filter;
        else
            state<=IDLE;
    end
    p_filter:
    begin 
        if(pedge_key)
            state<=IDLE;
        else if(reached_20ms)
            begin
            state<=wait_rest;
            p_flag<=1;
            end
    end 
    wait_rest:
    begin 
         if(pedge_key)
            state<=r_filter;
        else
            state<=wait_rest;
    end
    r_filter: 
    begin 
        if(nedge_key)
            state<=wait_rest;
        else if(reached_20ms)
             begin state<=IDLE;
                   r_flag<=1;
                   complete<=1;
             end
    end
default
    state<=state;
endcase

         
endmodule

测试代码比较简单,只需要对key输入信号进行多次赋值,控制赋值间隔以达到产生抖动的效果,再通过对比仿真进行验证即可。

今天的分享就到这里啦,继续摸鱼~~

<think>好的,我现在需要帮助用户了解如何使用Visio绘制状态转移图。根据用户的问题,他们可能希望得到具体的步骤指导,或者相关的教程资源。首先,我应该回顾用户提供的引用内容,看看有没有相关的信息可以直接利用。 用户提供的引用[2]和[3]提到了使用Visio绘制状态转换图的方法。引用[2]详细说明了在Visio 2013中如何找到所需的形状,比如圆角矩形、实心圆、箭头等,并提到需要从“更多图形”中添加。引用[3]则提到Visio可以用于绘制E-R图和状态转换图,并列举了其他图表类型,但可能对具体步骤帮助不大。 接下来,我需要将引用中的信息整合成一个清晰的步骤指南。用户可能需要知道如何开始创建新文档,如何添加必要的形状,连接形状,添加文本标签,以及调整布局和样式。此外,可能还需要推荐一些教程资源,比如官方教程或在线指南,帮助用户更深入学习。 需要注意的是,用户可能对Visio的界面不熟悉,所以步骤需要具体,比如指出在哪里找到形状库,如何拖放形状,如何连接箭头等。同时,用户可能希望了解状态转移图的常见元素,比如状态、转移箭头、初始和结束状态,这些都需要在步骤中提及。 还要确保回答符合之前的系统级指令,比如使用正确的中文,LaTeX格式(如果有数学内容的话),但在这个问题中可能涉及较少数学内容,主要需要结构化的步骤和可能的代码示例,但根据用户提供的引用,似乎不需要代码,而是绘图步骤。因此,回答应侧重于Visio的操作步骤。 最后,生成相关问题,帮助用户进一步探索,比如优化绘图效率、使用其他工具如Graphviz,或者比较Visio与其他工具的区别。这些问题需要基于引用内容,如引用[1]提到的在线绘图工具,引用[2]和[3]提到的Visio方法。 总结回答结构:首先分步骤说明如何在Visio中绘制状态转移图,引用相关的引用内容作为支持,然后提供教程链接,最后生成相关问题。</think>### 如何使用Visio绘制状态转移图 状态转移图(或称状态转换图)是描述系统状态变化的可视化工具,常用于软件设计和流程建模。以下是使用Visio绘制的具体步骤: #### **步骤1:创建新文档** 1. 打开Visio,选择“基本框图”或“流程图”模板创建空白文档。 2. 若需特定模板(如UML状态图),可在搜索栏输入“状态机”或“UML”选择对应模板[^3]。 #### **步骤2:添加状态元素** 1. **状态形状**: - 在左侧形状面板中,展开“更多形状” > “软件和数据库” > “UML状态图”,找到“状态”“开始状态”“结束状态”等元素[^2][^3]。 - 直接拖拽“圆角矩形”表示普通状态,拖拽“实心圆”表示初始状态,“同心圆”表示终止状态[^2]。 2. **文本标签**:双击形状添加状态名称(如“待机”“运行”)。 #### **步骤3:连接状态转移** 1. **箭头连接线**: - 在形状面板中选择“箭头”或“UML转换”工具,从一个状态拖拽到另一个状态以创建转移路径。 - 调整箭头样式(如直线/曲线)可通过右键点击连接线选择“格式”设置[^2]。 2. **添加事件/条件**:双击连接线输入触发转移的条件(如“用户输入”“超时”)。 #### **步骤4:优化布局与样式** 1. 使用“排列”功能自动对齐形状,或手动调整间距。 2. 通过“设计”选项卡修改主题颜色或线条样式,提升可读性。 #### **教程资源推荐** - **官方教程**:Microsoft官网提供Visio状态图详细指南([Visio状态图教程](https://support.microsoft.com/visio))。 - **快速入门**:引用[2]中提到的必应搜索方法可找到简单图形绘制技巧。 - **替代工具**:若需在线协作,可参考引用[1]的Python+Graphviz工具或Web绘图平台。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值