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
最初Lチカをした時は、既存ふぁりうを開くだけだったのでAdd Filesを押したが今回は一から自分で作ってみる。Create File. File nameの欄に適当な名前をつける"adder"としFinishwo押す。モジュールの名前とか、はじめからinputとかの入出力信号の宣言のダイヤログが開く。
冒頭のmodule adder のinput,outputの情報を入れる。ここはそのままOKして、自分でタイプしても同じ。OKを押すとソースコードのひな形が排出さえる。Design Sourcesの下にadder.vができているのでダブルクリックして開く。ひな形のコメントアウト部分はうめてもよいし、決してもOK
次に、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)を加える。
コメント
コメントを投稿