FPGA:Verilog HDL 4ビット加算回路のFPGAへの実装

 Verilog HDL

いろいろ試してみるしかない。 Verilog HDLの教科書として入手したのは

入門Verilog HDL記述―ハードウェア記述言語の速習&実践

4ビットの加算回路がまず出てくる。

module adder (a,b,q);

input [3:0] a;

input [3:0] b;

output [3:0] q;

assign q = a+b;

endmodule

これをVivadoで実践してFPGAに実装する事をやってみる。



File- Project - New

Project nameに”4bitsAdder”とでもいれる。
RTL Project を選択。Do not specify sources at this timeにはチェック、NEXT
ボードの選択画面になるので、使っているボードを選択、サマリーが表示されるので内容を確認してFinish
Add Sourcesをクリックして、Add Sourcesのダイアログを開く。

Add or create design sourcesを選択しNEXT


最初Lチカをした時は、既存ふぁりうを開くだけだったのでAdd Filesを押したが今回は一から自分で作ってみる。Create File. File nameの欄に適当な名前をつける"adder"としFinishwo押す。モジュールの名前とか、はじめからinputとかの入出力信号の宣言のダイヤログが開く。


冒頭のmodule adder のinput,outputの情報を入れる。ここはそのままOKして、自分でタイプしても同じ。OKを押すとソースコードのひな形が排出さえる。Design Sourcesの下にadder.vができているのでダブルクリックして開く。ひな形のコメントアウト部分はうめてもよいし、決してもOK


追記するのはendmoduleの上に、assign q = a+b;を追加する。保存したら、RTL ANALYSIS-Open Elaborated Designを押し、Schematicを見てみる。
次に、RunSynthesisを押してしばらく待つ、生成されるので
これもSchematicを見てみる。

こちらは入出のバッファーを介して、組み合わせ分のルックアップテーブル(LUT)が表示される。

このままだと実際にFPGAの評価ボードは無関係の状態なので、実際に4ビットの加算器をFPGAボードに実装してみる

Arty A7 35Tを使っているが、スイッチは4つ、押しボタンが4つ、LEDは3色を一つとしてLED0-3と、単色のLEDがLDD4-LED7の4つある。

Add Sourcesで今度は Add or create cnstraintsで制約ファイルの追加、生成を選択する。これも今回は読み込んでもよいが、つくる(といいってもコピーしてくる)のでCreate Fileを選択する。名前を聞かれるのでAdderとしFinishを押す。

SourcesのConstraintsの下に、Adder.xdcができているのでダブルクリックする。
制約ファイルだが、
に行って対応するものを開く
## Switches
#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L12N_T1_MRCC_16 Sch=sw[0]
#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L13P_T2_MRCC_16 Sch=sw[1]
#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L13N_T2_MRCC_16 Sch=sw[2]
#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L14P_T2_SRCC_16 Sch=sw[3]


## LEDs
#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L24N_T3_35 Sch=led[4]
#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_25_35 Sch=led[5]
#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L24P_T3_A01_D17_14 Sch=led[6]
#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L24N_T3_A00_D16_14 Sch=led[7]
## Buttons
#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { btn[0] }]; #IO_L6N_T0_VREF_16 Sch=btn[0]
#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { b
tn[1] }]; #IO_L11P_T1_SRCC_16 Sch=btn[1]
#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { btn[2] }]; #IO_L11N_T1_SRCC_16 Sch=btn[2]
#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { btn[3] }]; #IO_L12P_T1_MRCC_16 Sch=btn[3]
今回は、スイッチとLED,ボタンをそれぞれ4つ使うのでAdder.xdcにコピーし、冒頭の#をとる。ちょうどそれぞれ4ビット分でsw, led, btnという名になっている
必要部分を記載したAdder.xdcは以下のようになる。
続いてさっき作った4ビットの加算回路のVerilogHDLの方を編集する。aの4ビットをswで与えて、bをbtnの4ビットで与える。加算結果は4つのLEDで表示する。
module adder(
    input [3:0] sw,
    input [3:0] btn,
    output [3:0] led
    );
    assign led = sw+btn;
endmodule

RunSynthesisを押してしばらく待つ、生成されるので再度Schematicを確認すると入出力が代わっている事が見える。

Generate Bitstream を押してbitファイルを吐き出し、Open Hardware Manager でボードを繋いでProgram deviceで生成されたbitファイルを指定して書き込んでみる。

ボード上のスイッチSW2とSW0をON側に倒して0101(十進数で5)に設定する。
すると対応したLEDが点灯して左からOFF,ON,OFF,ONになる。
手で例えば右二つのボタンを同時に押す、つまり0011なので(十進数で3)を加える。
すると、結果は1000で左のLEDのみが点灯し、4ビットの加算回路ができている事が確認できる。

他にもSWの組み合わせで、ボタンを押すと2進数の足し算の結果にLEDが点灯する事が確認できる。



















コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

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