3

VGA コントローラで使用するために、50MHz クロックを 25.175MHz まで遅くしようとしています。クロック分周器は既に持っていますが、現在のクロック速度と目的のクロック速度を除算した結果が整数でない場合は常に、クロックを遅くするのに問題があります。IE 50000000/25175000 ~ 1.98. クロック分周器はコンパイルして実行しますが、分周が 10 進数の場合は何も出力しません。これが私のコードです:

    LIBRARY IEEE;
    USE  IEEE.STD_LOGIC_1164.ALL;

    ENTITY Clockdiv IS PORT (
        Clkin: IN STD_LOGIC;
        Clk: OUT STD_LOGIC);
    END Clockdiv;

    ARCHITECTURE Behavior OF Clockdiv IS
        CONSTANT max: INTEGER := 50000000/25175000;
        CONSTANT half: INTEGER := max/2;
        SIGNAL count: INTEGER RANGE 0 TO max;
    BEGIN
        PROCESS
        BEGIN
            WAIT UNTIL Clkin'EVENT and Clkin = '1';

            IF count < max THEN
                count <= count + 1;
            ELSE
                count <= 0;
            END IF;

            IF count < half THEN
                Clk <= '0';
            ELSE
                Clk <= '1';
            END IF;
        END PROCESS;
    END Behavior;

Google で検索したところ、REAL データ型を使用すると 10 進数を使用できることがわかりましたが、使用している変数を REAL に変更すると、Quartus からエラーが表示されます: Error (10414): VHDL Unsupported Feature error at Clockdiv.vhd(12): cannot synthesize non-constant real objects or values.

次に、「カウント」をCONSTANTタイプに変更すると、エラーが発生します: Error (10477): VHDL error at Clockdiv.vhd(18): name "count" must represent signal.

クロックを 25.175MHz まで下げる方法を知っている人はいますか? また、コンパイラが結果の除算が10進数値であることに満足できるように、クロックを遅くする方法を知っている人はいますか?

ありがとう

4

2 に答える 2

4

一般に、実数は合成できないため、整数ベースのソリューションを考え出す必要があります。

この比率はほぼ2:1であるため、かなり注意が必要ですが、完全ではありません。ほとんどのエッジベースのクロック分周回路は元のクロックの一方のエッジでのみ動作するため、分周できる最小の比率は2です。この場合、クロックの両端で動作する必要があります。

比率の分母で増分するカウンターが必要であり、分子を超えている場合は、クロックエッジを出力します。

PROCESS
    BEGIN
        WAIT UNTIL Clkin'EVENT;

        IF count < max THEN
            count <= count + DENOMINATOR;
        ELSE
            count <= 0;
        END IF;

        IF count > NOMINATOR THEN
            Clk <= ~Clk;
        END IF;
    END PROCESS;

この比率の場合、それを表すことができる最小の方法は2000/1007だと思います。

これに伴う問題は、基本的に25MHzのクロックが得られることですが、場合によっては(2000/7回の反復ごとに)余分なエッジが得られます。25.175MHzのクロックにはなりません。PLLなしでは50MHzから25.175MHzを取得することは不可能です。

于 2012-06-18T14:43:11.677 に答える
2

私はたくさんのVGAコントローラーを作成しましたが、25MHzのクロックを使用するだけではそれほど問題にはなりませんでした。ただし、どうしても近づきたい場合は、FPGAに何らかのクロックマネージャ(私はザイリンクスデバイスに精通しているだけです)があり、入力クロックを乗算およ​​び除算することで出力クロックを合成できます。

また、この場合、派生/ゲーテッドクロック(プロセスで値を直接設定するクロック)を使用すると機能する可能性がありますが、デバッグが困難な多くの問題が発生する可能性があります。より良い解決策は、クロックイネーブルを生成してから、すべてを同じ(高速)クロックで実行することです。

そして最後に、それはおそらく好ましいスタイルの問題ですが、私は通常、ステートメントの代わりにクロックプロセスステートメントを使用しますWAIT(立ち上がりエッジトリガー、同期リセット、およびクロックイネーブルとともに以下に示されています)。wait for 10ns;読んで理解する方が明確であり、、、または複数WAITのsを含むステートメントなどの合成できない構造を書く傾向が少ないと思います。

process(clk)
begin
    if(rising_edge(clk)) then
        if(sync_reset = '1') then
            --Reset logic
        elsif(clk_enable = '1') then
            --Actual functionality
        end if;
    end if;
end process;
于 2012-06-18T19:27:21.837 に答える