1

VHDL で FPGA プロジェクトに取り組んでいます。

FIFO がいっぱいになるたびに、16 ビット シフト レジスタを FIFO にコピーする必要があります (たとえば、16 個の新しいデータ ビットがシフト レジスタに供給された後、新しく形成された 16 ビット ワードを取り出して FIFO に送信したい)。

私の質問は、FIFO のクロック ラインをアサートする前に、FIFO の入力でデータを設定する必要があるかどうかです。これは実際には一般的な VHDL に関する質問であり、fifo に固有のものではありません。

基本的に、同じ操作でデータを設定してクロックをトグルすることは可能ですか、それとも 1 つのクロック エッジでデータをセットアップし、次のクロック エッジで fifo クロックをトグルする基本的なステート マシンが必要ですか?

例えば:

fifo_d_in( 7 downto 0 ) <= shift_register;
fifo_clk <= '1';

また

if( state = one ) then
    fifo_d_in( 7 downto 0 ) <= shift_register;
    state <= two;
elsif( state = two ) then
    fifo_clk <= '1';
end if;

私の直感は、入力レジスタのセットアップとホールドの要件を満たすために、最初にデータをセットアップする必要があることを教えてくれます。

ありがとう!

4

1 に答える 1

0

データは、クロック エッジの前のセットアップ タイムの間存在している必要があるため、可能なデータ変更と同時にクロックをアサートすると、動作が不安定になる可能性があります。

シフト レジスタを構成する 1 つの方法は、データの最後のビットがクロックインされた後にアサートする出力を持つことです。8 ビット シフト レジスタの場合、8 番目のクロックの後に信号がアサートされます。これを実現する簡単な方法は、3 ビット カウンターを使用することです。すべてのビットが 1 の場合、出力は 1 です。この信号は fifo の CLKEN に接続され、9 番目のクロック エッジでシフトの出力のデータがレジスタは fifo にクロックインされます。9 番目のクロックで次のシリアル ビット データをシフト レジスタにクロックインすることもできます。

       shift reg             FIFO
       -------------        ---------
      -|DIN   DOUT |--------| DIN   |
       |      FULL |--------| CLKEN |
     - |>          |      --|>      |
     | -------------      | ---------
     |                    | 
CLK -----------------------

上の図では、データの最後のビットがシフト レジスタを埋めるためにクロックインされた直後に FULL がアサートされ、次のサイクルでアサート解除されます。 FULL組み合わせ論理になる可能性があります。

于 2013-04-09T05:00:45.173 に答える