210FPGAでLチカやってみた (Nexys A7)
自分用メモ
用意したもの
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のダウンロードボタンをクリックする。
最後に初期設定。今回はボードに書き込むので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が点滅します。
動作確認おわり
投稿者の人気記事

-
sanguisorba
さんが
2025/11/08
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する