1

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;
4

2 に答える 2

0

これ:

if RST_N_CORE = '0' then
    address_int <= unsigned(aMaxWords)

非同期リセットについて説明します。したがってaMaxWords、シンセサイザーは、非同期リセットであるかどうかに関係なく、非同期として扱われます。

シンセサイザーがコードを「rst_n_coreが低いときに、aMaxWordsの値をaddress_intにコピーする」と解釈するため、リセット中にaMaxWordsが変更された場合は、値をコピーする必要があります。感度リストにその信号がないということは、シンセサイザーが言語の指示とは異なる動作をする回路を作成していることを意味します。したがって、警告が表示されます。


実際にはこれを行うべきではありません。感度リストに信号がない場合は、リセットラインの立ち下がりエッジで信号をキャプチャする必要があります。しかし、それはほとんどのチップの動作方法ではないため、シンセサイザーの設計者は(無限の知恵で)何年も前に、設計者が感度リストにその信号を含めることを意図していると想定し、「これは機能しません」と言うのではなく、警告を発することを決定しました、 修理する"。したがって、シミュレーションと合成で異なる動作をするコードを取得します。暴言を終わらせる。

于 2012-11-05T15:20:05.623 に答える
-1

あなたのリセットコード:

if RST_N_CORE = '0' then
    address_int <= unsigned(aMaxWords);

間違っている。リセットの定義は、回路を既知の状態に設定することです。しかし、あなたのコードはそれをシグナルに割り当てます。リセットにはall0または allとして割り当てる必要があります。そうでない場合は定数にする必要があります (シンセサイザーは既知のものに対して十分な知性を持たない可能性があるため、定数として割り当てる必要があることに注意してください)。1aMaxWords

if RST_N_CORE = '0' then
    address_int <= (others => '0');

また

if RST_N_CORE = '0' then
    address_int <= (others => '1');
于 2012-11-02T05:52:30.117 に答える