FPGA:Verilog HDL 4ビット加算回路のFPGAへの実装(フルアド)


前回、FPGA:Verilog HDL 4ビット加算回路のFPGAへの実装をしてみた。

 入門Verilog HDL記述―ハードウェア記述言語の速習&実践の本では、次に同じ回路だが、フルアダーにより加算回路の実現が扱われている。実際にこれもVivado上でやってみた。

詳細は前回と手順が同じで、Creatするファイルが、fulladd.vと本体のadder.vの2つになる点以外は同じなので詳細は割愛する。

fulladd.vは以下

module fulladd (A, B, CIN, Q, COUT);
input A, B, CIN;
output Q, COUT;
assign Q = A^B^CIN;
assign COUT = (A&B) | (B&CIN)|(CIN &A);
endmodule

また、adder.vは以下となる

module adder2(a,b,q);
input [3:0] a,b;
output [3:0] q;
wire [3:0] cout;

fulladd add0 ( a[0],b[0],   1'b0,q[0],cout[0]);
fulladd add1 ( a[1],b[1],cout[0],q[1],cout[1]);
fulladd add2 ( a[2],b[2],cout[1],q[2],cout[2]);
fulladd add3 ( a[3],b[3],cout[2],q[3],cout[3]);

endmodule

これを前回と同じくRTL ANALYSIS-Open Elaborated Designを押し、Schematicを見てみると


となって、fulladdで定義されたadderが4つつながった内部回路が生成される。
これもXDCファイル(これは前回と同じ)を用意し、上位モジュールのaをswにbをbtnにqをledに変更し、FPGAにbitファイルを書き込んでやると同じ動作をする。

fulladd add0 ( sw[0],btn[0],   1'b0,led[0],cout[0]);
fulladd add1 ( sw[1],btn[1],cout[0],led[1],cout[1]);
fulladd add2 ( sw[2],btn[2],cout[1],led[2],cout[2]);
fulladd add3 ( sw[3],btn[3],cout[2],led[3],cout[3]);

わざわざこれをしているのは名前による呼び出しについて勉強するためで、
fulladd add1 ( sw[1],btn[1],cout[0],led[1],cout[1]);
この時は、
module fulladd (A, B, CIN, Q, COUT);
の引数の順番を守らないといけないが、名前での呼び出しの場合は、順番は関係なく任意になる。
fulladd add1 ( .A(sw[1]),.B(btn[1]),.CIN(cout[0]),.Q(led[1]),.COUT(cout[1]));
これだと順番は変わっていないけど、変えてもOK.実質的には、抜けがあるといやらしいので順番にすると思うけど・・・







コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法