2

ザイリンクスSpartan6FPGAのコアで生成されたブロックRAMを双方向データバスに接続する方法を理解しようとしています。私が見つけることができるすべての例は、入力データポートと出力データポートを個別に使用することを示していますが、私の場合、双方向データバスとして使用することを余儀なくされています。

VHDLを使用しています。

生成されたコンポーネントの定義は次のとおりです。

COMPONENT ram
    PORT (
       clka  : IN STD_LOGIC;
       wea   : IN STD_LOGIC_VECTOR(0 DOWNTO 0);
       addra : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
       dina  : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
       douta : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
    );
END COMPONENT;

これは次のようにインスタンス化されます。

ram1 : ram
  PORT MAP (
    clka => clk,
    wea => r_w,
    addra => addr,
    dina => din,
    douta => dout
  );

dina誰かが私に接続しdoutainout呼ばれるポートに接続するプロセスブロックを見せてもらえますかdata

私は次のことを試しましたが、0%の成功でした:

process(clk)
begin
  if rising_edge(clk) then
    if r_w = "1" then
      -- Write
      din <= data;
      dout <= temp;
    else
      -- Read
      din <= (others => 'Z');
      data <= dout;
    end if;
  end if;
end process;

ご協力いただきありがとうございます!

4

2 に答える 2

3

まず第一に、最新のFPGA(あなたが話しているザイリンクスSpartan-6など)の内部には、真の双方向ルーティングは実際には存在しないことを理解することが重要です。実際の双方向/トライステート信号は、I/Oピンでのみ使用できます。内部双方向/トライステート信号をエミュレートできますが、これは通常、レガシーHDLとのインターフェースのためにのみ行われ、新しいものに対しては行われません。

さて、真のトライステートがあったかどうかに関係なく、単方向dinadouta「双方向」dataに接続するには、メモリが駆動しているかどうかを制御するための信号が必要です。oeすでに短い名前があるので、単に「出力イネーブル」と呼びましょう。この信号は、意味のある方法で設計によって制御する必要があります。

その場合、2つの単方向信号を異なる方向に変換し、さらに出力イネーブル方向セレクターを次の同時コード(プロセス内ではない)を使用して論理的に双方向のデータバスに変換できます。

dina <= data;
data <= douta when oe = '1' else (others => 'Z');
于 2012-06-14T04:22:17.740 に答える
1

ブロック内では、ポートによって駆動される信号if r_w = "1"に駆動しようとしているように見えます。それは1つの問題を説明するかもしれません(すべての「Z」でない限り)。doutdoutatemp

次の点に注意してください。現在、これをテストするものがないため、すべて頭から離れています。役に立たない場合はお知らせください。

同期プロセスがこれにアプローチする最良の方法だとは思いません。私がこれをする必要があったのは久しぶりですが、これがあなたが必要だと思うものです。これはプロセスではなく、アーキテクチャに正しく組み込まれていることに注意してください。

din <= data when (r_w = '1') else (others => 'Z');
data <= dout when (r_w = '0') else (others => 'Z');

説明:信号が複数のソースによって駆動されている(または割り当てられている)場合、1つを除くすべてが「Z」でなければなりません。2番目のラインはdata「Z」によって駆動されるように設定されていますが、これは実際には(リゾルバーの観点から)ポートによって駆動されるように「解放」されます。

これを同期させる必要がある場合、これを適応させるのは簡単なはずですが、それが唯一の可能性のあるケースではないこと'0'を覚えておいてください。したがって、句またはブロックについて考えてください。'1'std_logicelseotherscase

于 2012-06-14T04:21:43.780 に答える