1

FPGAをVHDLプログラミングするのは初めてですが、モジュール(以下の完全なコードを参照)が機能しません。

このモジュールは、ユーザーが使用できるレジスタに基づいて、ユーザーI / O設定を処理することになっています(したがって、FPGAファームウェアに触れることなくレジスタを介してモードを変更できます)。8つの入力ピンと8つの出力ピンがあり、1x8、2x8、4x8、8x8の4つの動作モードがあります。出力は遅延/ゲートジェネレータモジュールに入り、次に出力されます。このモジュールのもう1つの機能は、32ビット入力ベクトルを変換することです。実際には8ピンのみが割り当てられ、値(FPGA-ボードの相互作用に固有)をより意味のあるものに変換します。

現在のように、clockcontrolREGの値に関係なく、1x8モードに対応するelse catch all(00)モードが機能しています。(私はオシロスコープで正しい出力を観察しています)ので、ピンの割り当てに問題はありません。何らかの理由で、すべてのwhen句が無視されているように見えます。

clockcontrolREGの初期値を「00000011」(モードを8x8に設定する必要があります)に設定し、レジスタにアクセスして、値が実際に存在することを確認しました。

同じものを記述する2つの異なる構文方法(行:signalforclkgen(1))を試しましたが、効果はありませんでした。

非常に基本的なものが欠けているようですが、3日目ですが結果はありません。事前にすべての助けをありがとう。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity clkgencontrol is
    port(
        clockcontrolREG : in  std_logic_vector(31 downto 0);
        signalinput     : in  std_logic_vector(31 downto 0);
        signalforclkgen : out std_logic_vector(7 downto 0)

        );
end clkgencontrol;


architecture rtl of clkgencontrol is

begin


    signalforclkgen(0) <= signalinput(31);

    signalforclkgen(1) <= signalinput(15) when (clockcontrolREG(0) = '1' and clockcontrolREG(1) = '1') else
                          signalinput(31);

    signalforclkgen(2) <= signalinput(30) when (clockcontrolREG = "00000011") else
                          signalinput(15) when (clockcontrolREG = "00000010") else
                          signalinput(31);

    signalforclkgen(3) <= signalinput(14) when (clockcontrolREG = "00000011") else
                          signalinput(15) when (clockcontrolREG = "00000010") else
                          signalinput(31);

    signalforclkgen(4) <= signalinput(19) when (clockcontrolREG = "00000011") else
                          signalinput(30) when (clockcontrolREG = "00000010") else
                          signalinput(15) when (clockcontrolREG = "00000001") else
                          signalinput(31);

    signalforclkgen(5) <= signalinput(3) when (clockcontrolREG = "00000011") else
                          signalinput(30)when (clockcontrolREG = "00000010") else
                          signalinput(15)when (clockcontrolREG = "00000001") else
                          signalinput(31);


    signalforclkgen(6) <= signalinput(18) when (clockcontrolREG = "00000011") else
                          signalinput(14) when (clockcontrolREG = "00000010") else
                          signalinput(15) when (clockcontrolREG = "00000001") else
                          signalinput(31);

    signalforclkgen(7) <= signalinput(2) when (clockcontrolREG = "00000011") else
                          signalinput(14) when (clockcontrolREG = "00000010") else
                          signalinput(15) when (clockcontrolREG = "00000001") else
                          signalinput(31);
end rtl;
4

1 に答える 1

4

比較に16進定数を使用するつもりですか?コンパイルで長さが一致しないという警告が表示されるはずです。clockcontrolREG(b00000000_00000000_00000000_00010000)で0x00000010の16進値を期待している場合、比較しているバイナリ値と一致しません:bxxxxxxxx_xxxxxxxx_xxxxxxxx_00000010

clockcontrolREGの比較に32ビットの16進定数を使用してみて、それが役立つかどうかを確認してください。

signalforclkgen(2)  <= signalinput(30) when ( clockcontrolREG = x"00000011" ) else 
                  signalinput(15) when ( clockcontrolREG = x"00000010" ) else 
                  signalinput(31);
于 2012-07-02T11:32:04.627 に答える