Vhdl FSM米利机器序列检测器。如何使用多个触发器?
现在我在Vivado做一个小项目,一个很小的FSM。程序必须检测6位序列001011,并在检测到该序列时输出“1” 关于序列检测的代码做得很好,但除此之外,它还必须使用三个触发器:JK、D和T 关于如何添加它们有什么建议吗 谢谢你抽出时间 这是FSM代码:Vhdl FSM米利机器序列检测器。如何使用多个触发器?,vhdl,fsm,flip-flop,Vhdl,Fsm,Flip Flop,现在我在Vivado做一个小项目,一个很小的FSM。程序必须检测6位序列001011,并在检测到该序列时输出“1” 关于序列检测的代码做得很好,但除此之外,它还必须使用三个触发器:JK、D和T 关于如何添加它们有什么建议吗 谢谢你抽出时间 这是FSM代码: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity sequence is port( clk : in std_logi
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity sequence is
port(
clk : in std_logic;
reset : in std_logic;
x: in std_logic;
z : out std_logic;
a : out std_logic;
b : out std_logic;
c : out std_logic;
d : out std_logic;
e : out std_logic;
f : out std_logic);
end sequence;
architecture behavioral of sequence is
type state_type is (Q0, Q1, Q2, Q3, Q4, Q5);
signal state, next_state : state_type;
begin
state_register: process (clk, reset)
begin
if (reset = '1') then --if reset is high, goto state Q0
state <= Q0;
elsif (clk'event and clk = '1') then --if not, and rising
state <= next_state; --edge, go to next state
end if;
end process;
next_state_func: process (x, state)
begin
case state is
when Q0 =>
if x = '0' then
next_state <= Q1;
else
next_state <= Q0;
end if;
when Q1 =>
if x = '0' then
next_state <= Q2;
else
next_state <= Q0;
end if;
when Q2 =>
if x = '1' then
next_state <= Q3;
else
next_state <= Q2;
end if;
when Q3 =>
if x ='0' then
next_state <= Q4;
else
next_state <= Q0;
end if;
when Q4 =>
if x = '1' then
next_state <= Q5;
else
next_state <= Q2;
end if;
when Q5 =>
if x = '1' then
next_state <= Q0;
else
next_state <= Q1;
end if;
end case;
end process;
-- This process controls the output of the sequence detector.
-- Each state has it's own output along with 'z' which indicates
-- the entire sequence 001011 has been detected.
output_func: process (x, state)
begin
case state is
when Q0 => z <= '0';
a <= '1';
b <= '0';
c <= '0';
d <= '0';
e <= '0';
f <= '0';
when Q1 => z <= '0';
a <= '0';
b <= '1';
c <= '0';
d <= '0';
e <= '0';
f <= '0';
when Q2 => z <= '0';
a <= '0';
b <= '0';
c <= '1';
d <= '0';
e <= '0';
f <= '0';
when Q3 => z <= '0';
a <= '0';
b <= '0';
c <= '0';
d <= '1';
e <= '0';
f <= '0';
when Q4 => z <= '0';
a <= '0';
b <= '0';
c <= '0';
d <= '0';
e <= '1';
f <= '0';
when Q5 => z <= '1';
a <= '0';
b <= '0';
c <= '0';
d <= '0';
e <= '0';
f <= '1';
end case;
end process;
end behavioral;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.std_logic_arith.all;
实体序列为
港口(
clk:标准逻辑中;
复位:在标准逻辑中;
x:在标准逻辑中;
z:输出标准逻辑;
a:输出标准逻辑;
b:输出标准逻辑;
c:输出标准逻辑;
d:输出标准逻辑;
e:输出标准逻辑;
f:输出标准(U逻辑);
末端序列;
行为序列的体系结构是
类型状态_类型为(Q0、Q1、Q2、Q3、Q4、Q5);
信号状态,下一个状态:状态类型;
开始
状态寄存器:进程(时钟、复位)
开始
如果(重置='1'),则--如果重置为高,则转到状态Q0
状态z您的代码是错误的。看看output\u func
过程;这是组合的,只解码当前状态,而不查看x
。a
到f
输出不是必需的,只是当前状态的6位解码-为什么?当当前状态为Q5
时,设置z
输出,这不是您想要的-整个过程是冗余的。当当前状态为Q5
,x
为1时,需要在主FSM中设置z
,即在下一状态上,您的代码错误。看看output\u func
过程;这是组合的,只解码当前状态,而不查看x
。a
到f
输出不是必需的,只是当前状态的6位解码-为什么?当当前状态为Q5
时,设置z
输出,这不是您想要的-整个过程是冗余的。当当前状态为Q5
,且x
为1-时,您需要在主FSM中设置z
。在下一个状态中,您的D-FF位于第36行:状态使用ieee.std\u逻辑运算代码>@JHBonarius此部分行if(reset='1')以及使用“=”运算符的其余变量都在使用它。但我会注意使用另一个。谢谢。:)@我需要用三只单脚人字拖。D-FF、JK-FF和T-FF。能在一个代码中同时使用这三个吗?@Luisito不,不能。试着把它取下来。您没有执行算术比较操作。顺便说一句,sequence
是一个关键字,因此您不应该将其用作实体名称。您的D-FF在第36行:stateuse ieee.std\u logic\u arith.all代码>@JHBonarius此部分行if(reset='1')以及使用“=”运算符的其余变量都在使用它。但我会注意使用另一个。谢谢。:)@我需要用三只单脚人字拖。D-FF、JK-FF和T-FF。能在一个代码中同时使用这三个吗?@Luisito不,不能。试着把它取下来。您没有执行算术比较操作。顺便说一句,sequence
是一个关键字,因此不应将其用作实体名称。x
用于调整要发送的时钟信号,如1或0。a
和f
输出是非常必要的,因为我需要捕获序列(001011)的1部分,并在Nexys 4中显示它们。感谢关于触发器的建议,JK可能已经过时了,但这是一种目的性实践,它必须显示关于序列的三个触发器的使用,第一个最高有效位“(0010)”将是JK,最后一个“(11)”将是D和T。我想你可能误解了我所说的x
不用于output\u func
,因此output\u func
无法导出实际模块输出,即z
output_func
不过是一种非常复杂的解码和输出当前状态的方法,如果您真的需要的话,有更好的方法可以做到这一点。至于导出z
,您必须在其他过程中进行。x
用于调整要发送的时钟信号,如1或0。a
和f
输出是非常必要的,因为我需要捕获序列(001011)的1部分,并在Nexys 4中显示它们。感谢关于触发器的建议,JK可能已经过时了,但这是一种目的性实践,它必须显示关于序列的三个触发器的使用,第一个最高有效位“(0010)”将是JK,最后一个“(11)”将是D和T。我想你可能误解了我所说的x
不用于output\u func
,因此output\u func
无法导出实际模块输出,即z
output_func
不过是一种非常复杂的解码和输出当前状态的方法,如果您真的需要的话,有更好的方法可以做到这一点。至于导出z
,您必须在其他过程中进行。