Vhdl 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

现在我在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_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行:
state
use 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
,您必须在其他过程中进行。