私は 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