2017-05-05 19 views
1

このエラーは数回の遭遇でしたが、私は自分のコードでこのエラーを解決する方法をまだ見ることができません。エラーとコードはどちらも下に表示されています。VHDLコードエラー: "エラー(10818):<name>のレジスタがクロックエッジ外にその値を保持していないため、<location>に推測できません"

Error (10818): Can't infer register for count[0] at 5bit_PHreg_vhdl.vhd(21) because it does not hold its value outside the clock edge

エラーが「カウント」の各ビットに対して繰り返さ及びコードに注目行を指します。

ARCHITECTURE behavioral OF 5bit_PHreg_vhdl IS 
SIGNAL count : STD_LOGIC_VECTOR(4 DOWNTO 0); 

BEGIN 
    PROCESS(reset, clk, SHR_EN) 
     BEGIN 
-- Check if asynchronous reset is 0 
     IF reset = '0' THEN --ERROR OCCURS HERE 
       count <= "00000"; 
-- Check if rising edge 
     ELSIF (clk'EVENT AND clk = '1') THEN 
       IF LD_EN = '1' THEN 
        count <= FA_in; 
       END IF; 
-- Check if SHR_EN is active 
     ELSIF (SHR_EN = '1') THEN 
       count(4) <= c_in; 
       count(3) <= count(4); 
       count(2) <= count(3); 
       count(1) <= count(2); 
       count(0) <= count(1); 
       c_out <= count(0); 
     END IF; 
    END PROCESS; 
    PH_reg_out <= count; 
END behavioral; 
+0

IF(clk'EVENT AND clk = '1')の後に 'else'または' elsif'を使用しないでください。また、clk'EVENTとclk = '1'の代わりに 'rising_edge(clk)'を使用してください。 [こちら](http://vhdlguru.blogspot.com/2010/04/difference-between-risingedgeclk-and.html)を読んでください。あなたがコードの一部だけを提供し、それが何をすべきか説明しなかったので、あなたに詳細な答えを与えることはできません。 [mcve]を入力してください。 – Staszek

+0

'ELSIF(SHR_EN = '1')THEN'はリセットおよびクロックエッジ条件の外にあり、合成のために認識されない形式です。もしそれが登録されていれば、前の終わりの中にそれと次の割り当てを移動してください。プロセスの機密性リストからSHR_ENを削除します。 – user1155120

+0

コメントをいただいた皆様に感謝します。今私は衝動的に投稿し、「最小限の、完全で検証可能な」質問を提供することに固執しなかったことを認識しています。 –

答えて

4

ELSIF (SHR_EN = '1') THENは、リセットおよびクロックエッジの条件の外にあり、合成のための形式は認識されません。

それが登録されている場合は、それを前の終了内に移動します。プロセスの機密性リストからSHR_ENを削除します。

VHDLでは、名前で始めることはできません。5bit_PHreg_vhdlはエンティティ名として無効です。

これらを固定し、不足している実体宣言を記入:

library ieee; 
use ieee.std_logic_1164.all; 

entity PH_reg_5_bit is 
    port (
     reset:  in std_logic; 
     clk:  in std_logic; 
     LD_EN:  in std_logic; 
     SHR_EN:  in std_logic; 
     FA_in:  in std_logic_vector (4 downto 0); 
     c_in:  in std_logic; 
     c_out:  out std_logic; 
     PH_reg_out: out std_logic_vector (4 downto 0) 
    ); 
end entity; 

ARCHITECTURE behavioral OF PH_reg_5_bit IS 
    SIGNAL count : STD_LOGIC_VECTOR(4 DOWNTO 0); 

BEGIN 
    PROCESS (reset, clk) -- , SHR_EN) 
     BEGIN 
-- Check if asynchronous reset is 0 
     IF reset = '0' THEN --ERROR OCCURS HERE 
       count <= "00000"; 
-- Check if rising edge 
     ELSIF (clk'EVENT AND clk = '1') THEN 
       IF LD_EN = '1' THEN 
        count <= FA_in; 
     -- Check if SHR_EN is active 
       ELSIF (SHR_EN = '1') THEN 
         count(4) <= c_in; 
         count(3) <= count(4); 
         count(2) <= count(3); 
         count(1) <= count(2); 
         count(0) <= count(1); 
       END IF; 
-- -- Check if SHR_EN is active 
--   ELSIF (SHR_EN = '1') THEN 
--     count(4) <= c_in; 
--     count(3) <= count(4); 
--     count(2) <= count(3); 
--     count(1) <= count(2); 
--     count(0) <= count(1); 
--     c_out <= count(0); 
     END IF; 
    END PROCESS; 

    c_out <= count(0); -- c_out not separately registered 
    PH_reg_out <= count; 
END behavioral; 

とあなたのコードが正常に分析しています。

エンティティ名は、デザインをシミュレートしていないことを示す良い指標です。

条件の順序は、読み込みが読み込みよりも優先されることを示しています。

c_outは、シフトレジスタインスタンスをc_inとc_outを使用してより大きなシフトレジスタに連結できるように登録しないでください。これは、クロックエッジイベントを含むifステートメントの外側に配置する必要があることを意味し、他の出力ピン割り当ての隣に行くことができます。

+0

ありがとうございます。私は自分のコードを修正しました。 JSYKという名前は、元の名前が私の実際の名前で始まったので数字で始まりました。匿名性のために削除しました。私のプロフィールに実際に私の名前が表示されるようになったのは分かります。 –

関連する問題

 関連する問題