2

私は Verilog と HDL 全般に非常に慣れていません。私は最近 Mojo FPGA (Spartan 6) 開発ボードを購入し、いろいろ試しています。

私が興味を持っている概念の 1 つは、シフト レジスタです。具体的には、ATmega を FPGA に接続して、FPGA にシフト レジスタをロードします。私はこのVerilogとの間でこれを機能させています:

module sr8(
    input clk,        // FPGA clock
    input sshift,     // Shift signal from ATmega
    input sdata,      // Data from ATmega
    output [7:0] PO   // Parallel output
);

// Shift register
reg [7:0] srdata = 8'd0;

reg sshift_FF;
wire sshift_en;
always @(posedge clk) begin
    sshift_FF <= sshift;
end
assign sshift_en = sshift & !sshift_FF;

always @(posedge clk) begin
    if ( sshift_en ) begin
        srdata <= { srdata[6:0], sdata };
    end
end

assign PO = srdata;

endmodule

これは非常に単純で、sshift_en が 1 の場合、クロック (50 MHz) の正のエッジでデータをシフトインします。sshift_en は、sshift の現在の値とフリップフロップ sshift_FF の出力の補数を AND 演算した結果です (つまり、立ち上がりエッジをチェックします)。

ここでの私の本当の質問:これはこれを行うための良い/適切な方法ですか? Verilog でのシフト レジスタの実装についてかなりの量の調査を行いましたが、私のコンセプトは基本的に同じですが、シフト レジスタの「シフト」信号を AVR によって決定する必要があるだけです (50 MHz クロックよりもはるかに遅く動作します)。 FPGA) ではなく、クロック信号 (私が見たすべての例のように) ではありません。

ここで何かについてさらに情報を提供する必要がある場合は、お知らせください。

前もって感謝します!

編集: 同期セクションを含めるようにコードを変更しました:

module sr8(
    input clk,
    input sshift,
    input sdata,
    output [7:0] PO
);

// Shift register
reg [7:0] srdata = 8'd0;

// Start of modified synchronization section
reg sshift_d, sshift_dd, sshift_ddd, sshift_en;
always @(posedge clk) begin
    sshift_d <= sshift;
    sshift_dd <= sshift_d;
    sshift_ddd <= sshift_dd;
    sshift_en <= sshift_dd & ~sshift_ddd;
end
// End of modified section

always @(posedge clk) begin
    if ( sshift_en ) begin
        srdata <= { srdata[6:0], sdata };
    end
end

assign PO = srdata;

endmodule
4

1 に答える 1

1

あなたのシフトレジスタの説明は私には問題ないようです。

sshiftAVR からの信号は、FPGA クロックに対して非同期信号であり、メタスタビリティの原因となる可能性があります。可能性を減らすためにシンクロナイザーを使用します。

このドキュメントの「同期レジスタ」セクションを参照してください。

http://www.altera.com/literature/wp/wp-01082-quartus-ii-metastability.pdf

もう1つのマイナーポイント:あなたの例の場合は交換可能ですが、! (&& および || と一緒に) は論理演算に使用されますが、 ~ はビットごとの否定に使用されます。これは、このコンテキストにより適しています。! の一般的な使用法 は:

if (!condition)

于 2014-03-28T20:46:22.800 に答える