sanguisorba が 2025年11月08日00時17分21秒 に編集
初版
タイトルの変更
FPGAでLチカやってみた (Nexys A7)
タグの変更
FPGA
Vivado
記事種類の変更
セットアップや使用方法
Lチカの変更
ライセンスの変更
(MIT) The MIT License
本文の変更
自分用メモ # 用意したもの * Nexys A7 (Artix-7 A7-100T)  * Vivado 2022.2 が入ったそこそこ強めのWindows PC 読者は最新版入れたらいいと思う。 # Projectを立ち上げる まずはVivadoを立ち上げてCreate Projectを選択。  続いてProjectの名前と保存場所を指定。 Create project subdirectoryはチェックをつけておくとProject nameのフォルダを作ってそこにデータが格納される。  Project TypeはRTL project. RTLソースコードは後回しにするのでDonot specify sources at this time.  続いてターゲットデバイスを指定。 左上のBoardsをクリック → 左下のRefreshをクリック → しばらくまつ リストが更新されたらSearch: Nexysと打ち、Nexys A7-100Tを選択。 初回の場合はStatusのダウンロードボタンをクリックする。  Finishを押したらとりあえずProjectの完成。  最後に初期設定。今回はボードに書き込むのでbitファイルの吐き出しを行う。 Tools → Settings でSettingsウィンドウを開き、 Bitstream → -raw_bitfile にチェックを入れてOK。  # xdcを記述する Flow Navigator のAdd Sourcesをクリックして、まずはconstraintsを選択。  ConstraintsファイルはDigilent配布のコードを使用します。 https://github.com/Digilent/Nexys-A7-100T-XADC/blob/master/src/constraints/Nexys-A7-100T-Master.xdc  Copy constraints files into projectにチェックをいれて、Finishを押してください。 するとSources > Constraints > constrs_1に先程のxdcファイルが追加されます。  Constraints, 制約ファイルはクロックの制約とポートの定義を行うファイルですが、FPGAボードでは入力クロックが固定なのでいじる必要はありませんし、そもそもいじれません。ここでは、 * FPGAにおいてどのピンを使うか * HDLコードにおけるポート名とFPGAのピン番号の関連付け の2点のみを行うこととして認識してもらえば良いかと思います。 私たちが変更できるのはコメントアウトの有無とget_ports の後に定義されたポート名のみです。 今回は以下4行以外を全てコメントアウトします。 sw[0], LED[0] はそれぞれ1ビットしかないため、バス表記をやめて単にsw, LEDとしました。 これをxdcファイルとして記述してもOK。 ``` set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk100mhz create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { clk }]; set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw }]; #IO_L24N_T3_RS0_15 Sch=sw[0] set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { LED }]; #IO_L18P_T2_A24_15 Sch=led[0] ``` # RTLを記述する 続いてRTLコードを記述します。ちなみに自分はSystem Verilog派です。 Flow Navigator のAdd Sourcesをクリックして、design sourcesを選択。  今回は新規でRTLを記述するためCreate Fileをクリック。 File typeをSystemVerilogにし、Filenameの拡張子は .sv となるようにファイル名を入力します。  Finishを押すとDefine Moduleとしてポート名と方向、バスのサイズを聞かれます。 原則としてポート名の定義は設計者の自由ですが、最上位(TOP)モジュールはxdcファイルと結びつくため、xdcファイルで規定したポート名を過不足なく記述します。  OKを押すとヘッダ付きのSystemVerilogコードがDesign Sources > SystemVerilog > xil_defaultlib内に作成されます。  今回、以下のコードを作成しました。 約0.17秒周期で1週するカウンタの最上位ビットをLEDに割り当てることで、約0.8秒ON、約0.8秒OFFを繰り返します。 ``` `timescale 1ns / 1ps module top( input clk, input sw, output logic LED ); logic [23:0] count; assign LED = count[23]; always_ff @(posedge clk) begin if(!sw) count <= '0; else count <= count + 24'd1; end endmodule ``` # 合成して書き込んでみる 今回は一気にすっとばします。 Flow Navigator のGenerate Bitstreamをクリックし、OKを押して実行してください。 非常に小さいデザインなのでjobsは1で良いと思います。 合成が終わったら、Open Hardware Managerを選択してOKを押してください。  HARDWARE MANAGERが開いたら、ターゲットボードを接続し、ボードの電源を入れます。 この時、Nexys A7のジャンパはJP1=JTAG, JP3=USB としてください。 電源を入れたら、Open targetをクリックします。  ターゲットボードを認識できたら、Program deviceをクリックします。  冒頭でbitファイルを吐き出すオプションを指定していたので、Bitstreamファイルにはできたてほやほやのbitファイルが既に指定されています。そのままProgramを押してください。  書き込みが完了するとDONEのライトが点灯し、プログラムが動作します。  一番右下 J15のスイッチを下にやるとOFF、上にやると上にあるH17のLEDが点滅します。  動作確認おわり