首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL - FSM控制

VHDL - FSM控制
EN

Stack Overflow用户
提问于 2013-12-29 17:04:47
回答 3查看 265关注 0票数 0

我是个初学者,需要一点帮助。每当检测到时钟上升的边缘时,我的"current_s“就会改变。但是,当"Dot“或"Dash”为'1‘时,我希望它只更改一次。

我试着创建一个信号,比如: Go_s<=Dot或Dash;然后尝试使用它的rising_edge来启用这个过程,但是有人告诉我,这不是一个好主意。但我想不出别的了。

代码语言:javascript
复制
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
-------------------------------------------------------------------------------
Entity Let5 is
Port(
Clk: in std_logic;
Reset: in std_logic;
Dot: in std_logic;
Dash: in std_logic;
one_spc: in std_logic;
three_spc: in std_logic);
END Let5;
-------------------------------------------------------------------------------
Architecture Let5_a of Let5 is
-------------------------------------------------------------------------------
Type state is (Start, A, B, A_1, A_2, B_1, B_2);
Signal current_s: state;
-------------------------------------------------------------------------------
BEGIN
---------------------------------------------------------------------------------
PROCESS(Clk, Reset)
BEGIN
    IF(Reset='1')Then
    current_s<=Start;   
    ELSIF(Clk='1' and Clk'event)Then
    Case current_s is

        When Start =>
            IF(Dot='1')Then
                current_s<=A;               
            ELSIF(Dash='1')Then
                current_s<=B;               
            END IF;         

        When A =>       
            IF(Dot='1')Then
                current_s<=A_1;             
            ELSIF(Dash='1')Then
                current_s<=A_2;             
            END IF;     

        When B =>
            IF(Dot='1')Then
                current_s<=B_1;
            ELSIF(Dash='1')Then
                current_s<=B_2;
            END IF;

        When OTHERS => current_s <= Start;
    END Case;
    END IF;
END PROCESS;
-------------------------------------------------------------------------------
END Let5_a;

模拟:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-29 17:09:27

在时钟进程中添加current_s的条件更新,使用:

代码语言:javascript
复制
...
elsif (Clk='1' and Clk'event) then
  if (Dot = '1') or (Dash = '1') then
    case current_s is
      ...

然后,只有在条件current_s为真时才更新(Dot = '1') or (Dash = '1')

您所被告知的是正确的,您应该而不是对此进行额外的信号Go_s检查,因为这不是实现标准同步设计的方法。相反,使用信号时钟并在上升的边缘进行更新,例如使用rising_edge(Clk)而不是Clk='1' and Clk'event,然后将更新的条件设置为任何所需的信号。为了实现这种设计,我们制作了FPGA和工具。

票数 2
EN

Stack Overflow用户

发布于 2013-12-29 18:33:46

实际上,以你现在的方式阅读Dot或Dash应该是可行的;我怀疑还有其他的问题。

如果点数连续三个时钟周期高.

  • 在第一阶段,你进入A州。
  • 在第二个阶段,您将进入State A1。
  • 在第三节..。没有状态A1的处理程序,因此"when others“子句带您返回开始。

我怀疑你实际上想留在A1州(甚至是A州),直到:

  • 点不再是1,或者:
  • 破折号是1

要做到这一点(保持状态A1而不是重新触发),您需要:

代码语言:javascript
复制
When A1 =>       
    if Dot = '0' then
        current_s <= Start;             
    elsif Dash = '1' then
        current_s <= A_2;             
    end if;  

将状态Bn类似地对待Dash。

如果我误解了,而你真的想在A州呆得更久,现在应该清楚如何让这一切成为现实。

票数 0
EN

Stack Overflow用户

发布于 2013-12-30 00:07:58

您的代码有许多问题,它们与Dot和Dash无关,因为有一个优先级较高的代码是可以的。现在的状态在每一个时钟周期都会发生变化,因为当Dot和/或Dash为“1”时,这正是您告诉电路要做的事情。请注意,在start、A和B状态中,机器更改为不在此列表中的状态(start、A、B),因此WHEN语句使其返回到下一个时钟边缘的开始状态,并无限期重复。

我的建议是非常小心地绘制预期的状态转换图,然后重新编写代码应该是简单的,特别是因为这是一个相对简单的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20827777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档