3. Zynq LEDのIPコアを作り接続する

Vivadoでやらなければいけないのは

  1. LEDのIPを作る
  2. それをAXIバスと、外部端子に接続する
  3. ハードウェアデザインとbitstreamを作る

です。まずは今あるLEDのIPを消しちゃいましょう。
Diagramの中央右辺りにLEDs_4BitsというIPがあると思います。これを右クリックして「Delete」

lb8

消すと、配線が消えてLEDの外部端子だけが取り残されます。

lb11

また、ProjectSettingからIPのベンダー名を変更するようです。
IPのPackagerのVendorをDigilentにしてOKを押します

lb16

新しいIPを作る

ここで、新しいIPを作りましょう。Linuxからアドレスでアクセスできて、4つのLEDを操作するIPです。「Tools」->「Create and Package IP」を押します

lb12

Nextを押し、「Create a new AXI4 peripheral」を選びます。

lb17

名前などはチュートリアルに従ってmyLedとmyLed_v1.0にします。 次へ

lb18

AXIインターフェイスの設定画面になります。やることはNameをS_AXIにすることです。

lb19

これで完了です。Edit IPを選んでFinishしましょう。

lb20

すると、プロジェクトが開かれます。

lb21

この新品のプロジェクトはAXIバスに繋がるようになってはいますが、出力するようにはなっていません。なので、4bitの出力端子を作成します。
Verilogのファイルが2つあります。両方編集します。
myLed_v1_0_S_AXIの2箇所に以下のように
output wire [3:0] led,

assign led = slv_reg0[3:0];
を追加します

lb79

lb80

また、myLed_V1.0の方は
output [3:0]led,

.led(led),
を以下のように追加します。

lb22

lb25

編集はこれだけです。
これはつまり出力端子を4bit幅で用意してslv_reg0がそのまま出るようにしています。
あとはIPの作成です。
Package IPを押します。

lb26

そうするとIPのパッケージ画面が出てきます。
lb27

「Customization Parameter」の「Merge Changes From,,,」を押します

lb28

そうすると「Ports and Interfaces」でledが見えてきます

lb29

「Customization GUI」でも問題なさそうです。変更しちゃダメですよ。

lb30

ここまできたら「Review and Package」 の下にある「Package」ボタンを押します。lb31

2回目以降は「Re-Package IP」になりますけどね。
正常に終了したら「前のプロジェクトに戻りますか?」と聞かれるのでOKを押して戻りましょう。
lb32

 追加する

作成したIPを追加してつなぎます。AddIPからmyLedを追加します。

lb33

きれいな場所に出ることもあれば変な場所に出ることもあります。今回はちょっと変。

lb34

正しい場所へ移動します。

lb35

そしたらS_AXI端子を右クリックしてMakeConnectionをおしましょう。するとAXIを自動的に配線してくれます。

lb36

どのAXIか聞かれます。まぁ1つなのでこれを選んでOK

lb37

s_axi_aclkとs_axi_aresetnは自分でマウスの左クリックで配線します。

lb39

今度はLEDです。今あるのは邪魔なので右クリックで削除

lb40

IPの出力端子を右クリックして「Create Port」から外部出力端子を作ります。

lb41

名前はledにします。あとはデフォルトのままで大丈夫です。

lb42

これでIPの出力がledという外部端子になりました。ただ、番号をまだ決めてないので(あとでやります)何番ピンかは不明です

lb43

ここで、http://marsee101.blog19.fc2.com/blog-entry-2915.htmlによるとAXIのslaveとしてアドレスが割り当てられていないとのこと(ほんとにこういうの助かります)
上の「Address Editor」を押します。
lb44

Unmapped SlavesにいるmyLed_0を右クリックし、「Auto Assign Address」を押します。

lb45

これでmyLed_0に0x43C30000からのアドレスが割り当てられました。
これはLinuxからアクセスするときのアドレスになります。

lb46

ピンアサイン

ledのピンをアサインします。base.xdcを開きましょう。
ここではダイアグラム上のピンが何番ピンなのかとか、ピンの制約は何かとかを設定します。
7~11にさっき消した古いledのアサイン情報が残ってます。名前だけ変えちゃいましょう

lb47

これが古いもので、これのleds_4bits_tri_oを

lb48

ledに変更します。
leds_4bits_tri_oを選択して右クリックから「Replace」を選びReplace: led とすると一気に変更してくれます。

lb55

この時にxdcファイルだけでなく他のファイルにも文字が見つかった場合はそれも変更します。
変更が終わったらGenerateBlockDiagramを押して再度確認してみましょう。
「Toolf」->「Find」からleds_4bits_tri_oで検索して本当に亡くなったか確認できれば完了です。

BitStream作成

Bitstreamを作成しましょう。

lb50

カスタムIPのプロジェクトを保存するか聞かれると思うので、保存します。

lb51

また、論理合成や実装もやるよねって聞いてくるのでYESで実行しましょう。

lb52

幾つかWarningが出てくると思いますが、大丈夫です。lb53

出力する

Bitsreamの作成が完了したら、出力しちゃいましょう。
「File」->「Export」->「Export Hardware」を押します

lb56

Include Bitstreamにチェックを入れてOKを押して出力します。

lb57

これでVivadoでやることは終了です。大変でしたね。

次はUbuntuにてU-Bootを作成します。
VivadoなしのUbuntuでGCCだけでU-Bootを作る


 

メモ カスタムIPを再編集する

今回LEDのIP作りましたが、後からでも再編集してIPを再度作ることが出来ます。
「Verilog間違えた!」ってときとかですね。
編集したいIPを右クリックして「Edit in IP Packager」を押すと、またIPの編集画面を開いてVerilogの変更などが出来ます。

lb78

変更したらRe-Packageを押してプロジェクトを閉じると新しいIPで自動的にリロードしてくれるので元のプロジェクトで変更がすぐに反映されます。