2016-11-22 8 views
0

64クロックパルスごとにキャリー信号を送信するカウンタを作成しようとしています。下記のコードを合成しようとすると(Vivadoで)、次のエラーが発生します。VHDLコーディングエラー「クロックがチェックされていないためにElse句がサポートされていません」

クロックのチェック後のElse節はサポートされていません。

(ライン上で合図「!!」)

私は別のプロジェクトに非常によく似た何かをしたと私はそこにすべてのエラーを取得していないので、私は本当に何を得ることはありません違う。どんな助け?

entity refresh_counter is 
    port(CLK : in STD_LOGIC; 
      CLR : in STD_LOGIC; 
      CARRY : out STD_LOGIC); 
end refresh_counter; 

architecture Behavioral of refresh_counter is 
begin 

process(CLK) 
variable tel : integer; 
begin 
    if (CLK'event and CLK = '1') then 
     if CLR = '1' then 
      tel := 0; 
     end if; 
    else 
     if (tel < 63) then   !! 
      tel := tel + 1; 
     else 
      CARRY <= '1'; 
      tel := 0; 
     end if; 
    end if; 

end process; 
end Behavioral; 
+2

あなたの 'else'は' clk'の立ち上がりエッジでないことが何時に起こるかを記述しようとします。実際のハードウェアでこれがどのように実装されていると思いますか? –

+0

正直なところ、これは実際のハードウェアにどのように実装されているのか分かりませんし、問題かもしれません。しかし、私はポイントを得ると思う。 elseループを 'if CLR = '1' then thenループの中に移動して、今合成します。 – TheAlPaca02

+0

「elsif(tel <63)then」と書いたければ、 'if' CLK部分に最初の' else'を持つよりも意味があります。 Btw。あなたはまた、ある時に 'CARRY'をクリアしたいと思っています。最後に、 'tel 'を代わりにシグナルにすると、シミュレーションデバッグが容易になるからです。 –

答えて

1

コメント欄に@scary_jeffで述べたように、あなたが実質的に立ち上がりエッジではない実装することができないとして、あなたのelseは意味がありません。ここでは、その仕事を行う実装があります。

このプロセスには、2つの変数n_carryn_telがあります。それらをFSMの組み合わせ出力と同様に扱うことができます。クロックの立ち上がりエッジで、これら2つの変数はそれぞれcarrytelに転送されます。

CLRが高い場合は、代わりに0が転送されます。

n_carryn_telロジックは、ハードウェアで組み合わせて実装されています。入力としてtelがかかり、意思決定はプロセスのif-elsif-elseシーケンスでコード化されています。

library std; 
library ieee; 
use ieee.std_logic_1164.all; 
entity refresh_counter is 
    port(CLK : in STD_LOGIC; 
      CLR : in STD_LOGIC; 
      CARRY : out STD_LOGIC); 
end refresh_counter; 

architecture Behavioral of refresh_counter is 
signal tel: integer := 0; 
begin 

process(CLK, CLR, tel) 
variable n_tel: integer := 0; 
variable n_carry: STD_LOGIC := '0'; 
begin 

    if (tel < 63) then 
     n_carry := '0'; 
     n_tel := tel + 1; 
    elsif (tel = 63) then 
     n_carry := '1'; 
     n_tel := 0; 
    else 
     -- This case should never arise in practice 
     n_carry := '0'; 
     n_tel := 0; 
    end if; 

    if (CLK'event and CLK = '1') then 
     if CLR = '1' then 
      tel <= 0; 
      CARRY <= '0'; 
     else 
      tel <= n_tel; 
      CARRY <= n_carry; 
     end if; 
    end if; 

end process; 
end Behavioral; 
+0

これを書くもっと標準的な方法は、必要なコードを 'if(clk'event ...')の中に入れることです。実際にやる必要があったのは、最初の 'end if'を最後まで移動し、 'tel:= tel + 1;'の後に 'CARRY <= '0''の割り当てがあります。コメントから、これは彼が行ったようです。 –

関連する問題