私はシリアル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;
だから 'r_final'の更新を' r_reg <= r_final'の下に移動すると、私のコードは私の望むように動作しますか?そして、 'r_final'はあなたの場合のシグナルか変数ですか? –
私は 'r_final'はシグナルでなければならないが、実際にはプロセス変数でもよいが、共有変数にしないことをお勧めします。シミュレーションで動作を確認することができます。サイクルレベルの要件仕様に応じて、 'r_reg <= r_final + r_min1'を割り当てる必要があります。 –
これは私の問題を解決しました。 –