2016-04-25 7 views
0

私はシリアルsquarerを設計しています。私のプログラムは基本的なバイナリカウンタをとり、カウンタの各カウントを使って一連の正方形を計算します。私のコードを合成しようとすると、自分のコードをどのように配置するかによって、合成がほぼ無限に実行されるか、合成が完全にクラッシュするだけです。だから、信号r_final => r_final + r_min1を更新できないと思ったのは、vhdlのものではないことを覚えているからです。そこで私は信号の代わりにr_finalを変数に設定する必要があると決めました。私はどのように変数としてr_finalを宣言しなければならないのか分かりません。誰も私がr_finalをどのようにして更新できるかについてのいくつかの洞察を提供できますか?変数または信号が必要ですか?

これは私のメインのコードで、問題の部分はコメントの下にある - 次の状態論理:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use ieee.numeric_std.all; 

entity serial_square is 
    port(
    clk, reset: in std_logic; 
    q: out std_logic_vector (3 downto 0)); 
end serial_square; 

architecture behavioral of serial_square is 
    signal r_reg : unsigned (3 downto 0) := "0000"; 
    signal r_next : unsigned (3 downto 0); 
    signal r_2i : unsigned (3 downto 0); 
    signal r_min1 : unsigned (3 downto 0); 
    shared variable r_final : unsigned := "0000"; 

begin 
-- register 
    process(clk,reset) 
    begin 
     if (reset='1') then 
      r_reg <= (others => '1'); 
     elsif (clk'event and clk='1') then 
      r_reg <= r_final; 
      end if; 
    end process; 
     -- next state logic 
     r_next <= r_reg +1; -- r_reg + 1 
     r_2i <= r_next(2 downto 0) & '0'; -- multiply by 2 
     r_min1 <= r_2i - 1; -- minus one 
     r_final := r_min1 + r_final; -- add r_min1 to r_final, output should be the count r_next, squared. 
     --output logic 
     q <= std_logic_vector(r_reg); 
end behavioral; 

答えて

0

次の値を介して生成されるようにr_finalの更新は、クロックドプロセスである必要がありますこれは、使用可能なハードウェアと一致する構造であるため、同期(クロック)更新となります。

共有変数は合成できませんが、テストベンチにのみ使用される機能です。

+0

だから 'r_final'の更新を' r_reg <= r_final'の下に移動すると、私のコードは私の望むように動作しますか?そして、 'r_final'はあなたの場合のシグナルか変数ですか? –

+0

私は 'r_final'はシグナルでなければならないが、実際にはプロセス変数でもよいが、共有変数にしないことをお勧めします。シミュレーションで動作を確認することができます。サイクルレベルの要件仕様に応じて、 'r_reg <= r_final + r_min1'を割り当てる必要があります。 –

+0

これは私の問題を解決しました。 –

関連する問題