2
type dmemSpace is array(0 to 1023) of std_logic_vector(31 downto 0);
signal dataMem : dmemSpace := ( 
  400 => X"00000000",
  404 => X"00001000",
  408 => X"FFFFEFFF",
  others => X"00000000"
);

signal dAddr : std_logic_vector(31 downto 0);
signal check : integer; 


dAddr(31 downto 0) <= Addr(31 downto 2) & "00";  
check <= to_integer(unsigned(dAddr));
DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

その私は再び....単一サイクルのCPUと他のすべてに取り組んでいると、メモリ内のこの特定の行以外はすべて正常に動作します。

DataOut <= dataMem(to_integer(unsigned(dAddr))) when (check > 0); 

DataOutの範囲外のインデックスエラーを防ぎたいのですが、これは機能しません。何か案は?

  • Check > 0すべてのデータが出てこないようにします。
  • Check >= 0例外の原因となるインデックスが-4の場合、エラーを通過させます。
4

3 に答える 3

1

プロセス内にある場合は、「dAddr」と「check」を変数にする必要があります。そうでない場合は、使用しているアドレスではなく、前のアドレスが有効かどうかに基づいて2クロックサイクルかかります。

于 2011-11-03T00:41:41.433 に答える
0

メモリに1024の場所がある場合、アドレスは現在の32ビットではなく10ビットである必要があります。アドレスがunsigned(9 downto 0)、の場合、そのすべての値はメモリ配列の有効な入力です。

アドレス400、404、408にデータを配置することに注意してください。各データ要素の間に3つの空白スペースを残しています。データの幅は4バイトですが、すべてのアドレスは4バイトのデータワード全体を占めます。

于 2011-11-03T07:32:33.400 に答える
-1

この試みと提供された回答に関する他のいくつかの問題:-4のインデックスを適用できなかった可能性があります。dAddrは、UNSIGNEDにキャストされたタイプstd_logic_vectorです。したがって、それは常に正またはゼロです。シミュレーションを行うだけの場合は、VARIABLESを使用することが解決策です。実装が何をしているのかを知りたい場合は、SYNTHESISの場合でもSIGNALSである必要があります。あなたの記憶は読み取り専用です。読み取り/書き込みメモリが必要な場合は、クロックプロセスでこれを使用して、LATCHESではなくREGISTERSを生成する必要があります。宣言の配列部分割り当てで何をしているのかわかりません。はい、それは構文的に正しいですが、宣言での割り当てはSYNTHESIZEDロジックには適用されません。これは実際には定数に対してのみ機能します(公平を期すために、dataMemシグナルは定数です。)クロックプロセスのRESETブロックで必要なメモリを初期化するには、forループを使用してすべてをx "00"に設定し、続いて[dataMem(404)<= xを使用して400、404、408の3つの割り当てを行います。 "08";] DataOutをすべてのクロックに割り当てますif(check <1024)then DataOut <= dataMem(check); else DataOut <=(others => "0"); - 多分?または単に古い値を保持しますか?
次の場合に終了します。

于 2013-08-13T13:44:35.780 に答える