0

ビット文字列で特定のパターンを検出する vhdl を作成しようとしています。入力ストリームにパターン "110" が見つかった場合、回路は 1 を出力する必要があります。私の入力は「X」で、出力は「Z」です。

「110」の入力パターンを確認する方法がわかりません。

これは私がこれまでに持っているものです:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity checker is
     Port ( clk : in  STD_LOGIC;
       x : in  STD_LOGIC;
       z : out  STD_LOGIC);
end checker;

architecture Behavioral of checker is

   type state_type is (S0, S1, S2);
   signal pr_state: state_type := S0;
   signal nx_state: state_type := S0;

 begin

process(clk) begin
  if (rising_edge(clk)) then
      pr_state <= nx_state;
  end if;
end process;

process(pr_state, nx_state) begin

case (pr_state) is 

    when S0 =>  
        z <= '0';
        nx_state <= S1;

    when S1 => 
        z <= '0';
        nx_state <= S2;

    when S2 => 
        z <= '1';
        nx_state <= S0;

end case;

end process;

end Behavioral;

何かご意見は?フィードバックをお待ちしております。

4

2 に答える 2

0

ステート マシンはこれを複雑にします (sate ロジックを使用する必要がある場合を除く)。シフトレジスタとコンパレータだけを使用するのは合理的です。「110」が「1」が最初に受信したビットであることを意味すると仮定すると、次のようなことができます (警告! このコードはテストしていません)。

architecture Behavioral of checker is
   signal shift_reg : std_logic_vector(2 downto 0) := "000";

begin
  process(clk) begin
      if rising_edge(clk) then

         -- Assert the output signal if the pattern is found
         if (shift_reg = "110") then
            z <= '1';
         else
            z <= '0';
         end if;

         -- Keep a 3-bit deep buffer for comparison.
         shift_reg(2 downto 0) <= shift_reg(1 downto 0) & x;

      end if;
   end process;
end architecture Behavioral;
于 2012-12-11T17:40:59.463 に答える
0

FSM が必要な場合、最も簡単なのは、可能性を説明することです。

achictecture behavior of checker is
   types states is (SEARCHING, SAW_1, SAW_11, SAW_110);
   signal state : states := SEARCHING;

begin
   process (clk) begin
      if rising_edge(clk) then
         case (state) is
         when SEARCHING:
            if (z = '1') then
               state <= SAW_1;
            else
               state <= SEARCHING;
            end if;
            z <= '0';

         when SAW_1:
            if (z = '1') then
               state <= SAW_11;
            else
               state <= SEARCHING;
            end if;
            z <= '0';

         when SAW_11:
            if (z = '0') then
               state <= SAW_110;
            else
               state <= SEARCHING;
            end if;
            z <= '0';

         when SAW_110:
            state <= SEARCHING;
            z <= '1';

         end case;

      end if;
   end process;
end architecture behavior;

これは元のコードとは異なる FSM 構造を使用しており、少し改善できます (少なくとも 1 つの状態を削除できます) が、要点を示していると思います。

于 2012-12-12T21:19:01.243 に答える