我是个初学者,需要一点帮助。每当检测到时钟上升的边缘时,我的"current_s“就会改变。但是,当"Dot“或"Dash”为'1‘时,我希望它只更改一次。
我试着创建一个信号,比如: Go_s<=Dot或Dash;然后尝试使用它的rising_edge来启用这个过程,但是有人告诉我,这不是一个好主意。但我想不出别的了。
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;模拟:

发布于 2013-12-29 17:09:27
在时钟进程中添加current_s的条件更新,使用:
...
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和工具。
发布于 2013-12-29 18:33:46
实际上,以你现在的方式阅读Dot或Dash应该是可行的;我怀疑还有其他的问题。
如果点数连续三个时钟周期高.
我怀疑你实际上想留在A1州(甚至是A州),直到:
要做到这一点(保持状态A1而不是重新触发),您需要:
When A1 =>
if Dot = '0' then
current_s <= Start;
elsif Dash = '1' then
current_s <= A_2;
end if; 将状态Bn类似地对待Dash。
如果我误解了,而你真的想在A州呆得更久,现在应该清楚如何让这一切成为现实。
发布于 2013-12-30 00:07:58
您的代码有许多问题,它们与Dot和Dash无关,因为有一个优先级较高的代码是可以的。现在的状态在每一个时钟周期都会发生变化,因为当Dot和/或Dash为“1”时,这正是您告诉电路要做的事情。请注意,在start、A和B状态中,机器更改为不在此列表中的状态(start、A、B),因此WHEN语句使其返回到下一个时钟边缘的开始状态,并无限期重复。
我的建议是非常小心地绘制预期的状态转换图,然后重新编写代码应该是简单的,特别是因为这是一个相对简单的问题。
https://stackoverflow.com/questions/20827777
复制相似问题