0

ADC の逐次比較レジスタ用に記述しようとしている VHDL コードについて質問があります。

以下に示すコードでは、DigitalOutTemp は for ループ全体で継続的に更新されますか? または、プロセスの最後に OutTemp の値のみを受け取りますか?

ロジックが間違っている可能性があると思いますが、私がやろうとしているのは、DigitalOutTemp をデジタルからアナログへのコンバーターを通過させてから、測定しているアナログ信号を使用してコンパレーターに送ることです。その後、コンパレータはレジスタにフィードバックします。  

LIBRARY ieee;
USE     ieee.std_logic_1164.all;

ENTITY SARegister IS
PORT (
    Comparator, Clock                     : IN std_logic;
    DigitalOutFinal, DigitalOutTemp   : OUT std_logic_vector (13 downto 0)
);
END;

ARCHITECTURE Behavioural OF SARegister IS
BEGIN

PROCESS (CompIn, Clock)
    VARIABLE OutTemp : std_logic_vector (13 downto 0);
BEGIN
    IF (rising_edge(Clock)) THEN
        OutTemp := "10000000000000";

        FOR i IN 13 downto 0 LOOP

            IF (Comparator = '0') THEN
                OutTemp(i) := '0';
            END IF;

            IF (i > 0) THEN
                OutTemp(i - 1) := '1';
            END IF;

            DigitalOutTemp <= OutTemp;

        END LOOP;

        DigitalOutFinal <= OutTemp;

    END IF;

END PROCESS;
END;
4

2 に答える 2

0

私はあなたの変換について明確に理解していません.あなたのコードはあまりにも奇妙です. しかし、あなたのコードのどこが間違っているかを指摘します。コメントは2つの狭い範囲で書くため、ANSWERではありません。あなたのコードがより良くなることを願っています。

PROCESS (CompIn, Clock)

CompInこの機密リストは、あなたのコードでシグナルをもう見ることができないため、私が知らない何かにつながる可能性があります. レジスタが必要な場合は、このリストにclockorsetまたは信号のみを追加してください (またはクロック ゲーティングを使用してください。resetenable

VARIABLE OutTemp : std_logic_vector (13 downto 0);
BEGIN
    IF (rising_edge(Clock)) THEN
    OutTemp := "10000000000000";

    FOR i IN 13 downto 0 LOOP

        IF (Comparator = '0') THEN
            OutTemp(i) := '0';
        END IF;

        IF (i > 0) THEN
            OutTemp(i - 1) := '1';
        END IF;

2if番目は最初に上書きされるため、2 番目の方が良い結果にはなりません。OutTempこの後すべてを取得すると確信してい1111..11ます(ループも)。

        DigitalOutTemp <= OutTemp;

この割り当てをこのループに入れないでください。無限の時間を割り当てても、このプロセスはクロックのrising_eedgeの場合にのみ実行されます。

    END LOOP;

    DigitalOutFinal <= OutTemp;

END IF;
END PROCESS;

CompIn がないため、コードをコンパイルできないと確信できます。CompIn を追加しても、結果DigitalOut...は常に1111...1(すべて 1) になります。

于 2012-10-26T09:05:37.700 に答える
0

以下に示すコードでは、DigitalOutTemp は for ループ全体で継続的に更新されますか? または、プロセスの最後に OutTemp の値のみを受け取りますか?

DigitalOutTemp に書き込むたびに、シグナルは更新予定の新しい値を取得します。ただし、現在のデルタ サイクルが終了するまで (つまり、トリガーされたすべてのプロセスが終了した後)、更新は行われません。

その時点まで、(同じプロセスまたは他のプロセスで) シグナルを読み取ると、同じ (開始) 値を読み取ることが保証されます。

于 2012-10-26T14:41:51.330 に答える