VHDLシーケンシャルプロセスにアドレスカウンターがあります。そのアイドル値は、構成レジスタで特定の最大値に設定されます。その後、特定の状態に入ると、1ずつ増加する必要があります。
最大値を取得するために、入力std_logic_vectorのサブセットをエイリアスとして宣言します。
address_intを符号なし変数として宣言しました。次に、感度リストでclkとリセットを使用して順次プロセスを定義しました。リセットがアサートされると、アドレスカウンタがエイリアス値に設定されます。リセットが解除された後、特定の状態になると、カウンタは立ち上がりエッジでロールオーバー/インクリメントされます。
合成ツールから次のメッセージが表示されます。*警告:Xst:819行134:プロセス感度リストに次のシグナルがありません:DL_CADU_SIZE *
そして、すべてのアドレスラインが非同期信号になりました!ここで何が起こっているのですか?整数では発生しない、符号なしの奇妙な動作はありますか?私は通常ここで整数を使用しますが、コード保守の目的で、変換は符号なしからより簡単に見えました。エイリアスを捨ててストレート変換を試みましたが、役に立ちませんでした。
library IEEE;
use ieee.std_logic_1164.a
use ieee.numeric_std.all;
-- entity declaration, ports, architecture, etc.
signal address_int : unsigned(8 downto 0);
alias aMaxWords : std_logic_vector(8 downto 0) is DL_CADU_SIZE(10 downto 2);
begin
WADDR <= std_logic_vector(address_int);
OUT_PROC: process (CLK_CORE, RST_N_CORE)
begin
if RST_N_CORE = '0' then
address_int <= unsigned(aMaxWords);
elsif rising_edge(CLK_CORE) then
if next_state = WRITE_WORD then
if address_int = unsigned(aMaxWords) then
address_int <= (others => '0');
else
address_int <= address_int + 1;
end if;
end if; -- WRITE_WORD
end if; -- rising_edge
end process OUT_PROC;
end RTL;