投稿

ラベル(FPGA)が付いた投稿を表示しています

FPGA:MicroBlaze LED

イメージ
前回のHelloのプリントと同じ要領でVitisの「File → New → Application Project」からplatform projectを作っていく。テンプレートでhelloを選ぶところまでは同じ。 今回は、#include "xparameters.h"としてxparameters.hをまず読み込む。このファイルは どのメモリアドレスに IP コアを割り当てたかなどの情報を持っている。 #define LED *((volatile unsigned int*) (XPAR_GPIO_0_BASEADDR + 0x00)) #define LED_ctrl *((volatile unsigned int*) (XPAR_GPIO_0_BASEADDR + 0x04)) XPAR_GPIO_0_BASEADDRが、GPIOの先頭アドレスを示すとの事で、先頭から4ビット離れたところが、コントロールビットなるとの事だが、ここがわからない。 XPAR_GPIO_0_BASEADDRを選択してOpen Declarationで定義に飛んでみると確かにXPAR_GPIO_0_BASEADDR が定義されている。 /* Canonical definitions for peripheral AXI_GPIO_0 */ #define XPAR_GPIO_0_BASEADDR 0x40000000 #define XPAR_GPIO_0_HIGHADDR 0x4000FFFF #define XPAR_GPIO_0_DEVICE_ID XPAR_AXI_GPIO_0_DEVICE_ID #define XPAR_GPIO_0_INTERRUPT_PRESENT 0 #define XPAR_GPIO_0_IS_DUAL 0 ハードウェア構成のときに”AXI GPIO”というIPをブロックダイアグラムに追加しました。この数値は”AXI GPIO”における各レジスタのベースアドレス0x40000000になっている (後で確認してみる) しかし4ビット目がコントロールだというのは??? https://www.xilinx.com/support/documentation/ip_documentation/axi_gpio/v2_0/pg14...

FPGA:MicroBlaze Hello

イメージ
  Vitis IDEを立ち上げる。Vivadoから Tools-Launch Vitis IDEを選択する。 Create Platform Projectを選択する。 Platform project name:に適当な名前を入れる。blink_microblaze_plattformとした。 XSAファイルのありかを聞かれるので、Browseのボタンを押して先ほどVivadoで保存した、.xsaを指定しFinish。Vivadoのprojectフォルダーの直下に通常はある。 EclipseベースのIDEが立ち上がってくる。使いなれたIDEで少し安心する・・・ File-New-Appication-project 案内が出るがNEXT 次もNEXT 適当なプロジェクト名をつける。連動してsysyem project nameもかわる。 Domainの確認画面がでるので、Nextを押す。 いくつかのテンプレートが表示される。Hello Worldを選択しFinish. 何も考えずテンプレートなのでエラーもでないから、ビルトしてエラーなく終了する事を確認する。続いてデバッグで走らせる。Vitis Serial Terminalというのが下に出ているので+のマークを押す。 ここでデバイスマネージャーで確認したポート番号に設定を行う。 F8を押していくと以下のように実行される。 これは、FPGA上に作ったマイコンに命令を送って、そのマイコンがUARTを経由して文字を返してるという事になる。

FPGA:MicroBlaze

イメージ
 ソフトマクロCPU MicroBlaze File-NewからXDCファイルと空の.Vファイルを作るところまではこれまでを参考に。 新しい機能としてIP INTEGRATORを使う。Create Block Designを選択する。 Block Designのダイヤログが開く。nameを適当に変更する 真っ白な枠が表示されるが、上の方に+のマーク(Add IP)が出るので押しIPを追加する。 リストの中からMicroBlazeを選んで選択するとMicroBlazeの箱が現れる。 上の緑の部分にRun Block Automationと文字があるのでクリックする。設定画面が出てくるので設定を行う。 Presetが選べるが調べると以下 マイクロコントローラー: ベアメタル コードの実行する時 リアルタイム プロセッサ: RTOS 上でリアルタイム処理したい時 アプリケーション プロセッサ: 組み込み Linux を使う時 Okを押すと上のように箱が自動で追加される。この箱のなかClock Wizardというのがあるのでダブルクリックする。 CLK_1N1がCustomになっているのとsysclockに変更する。 またOutpu Clocksのタブをひらき クロックが100MHz、リセットがActiveHighとしておく(デフォルトでなっているはず) 入力ポートをつける事をする。このClock箱にCLK_IN1_Dの左にカーソルをもっていくペンの形になるが右クリックーMake Externalとすると外部接続端子が生成される。 CLKとRST側も同じく外部端子を作る。 外部端子をつけたあとは下のようになる。 GPIOのIPをさらに追加する。同じように上の+ボタンAdd  IPから選択する。 AXI GPIOの箱がおかれるのでダブルクリックする。 追加するGPIOのポート数32になっているのを適当な数に変更しOKを押す。 すると上の方に緑のバーが出て、Run Connection Automationが現れるのでクリック S-AXIにチェックいれてOKを押すと、自動では配線される。 配線された様子が以下 ポート名の修正を行う。ポートCLK_IN1_D_0といったような名前になっていて制約ファイルと一致しないのでが変更する。右クリックし、External ...

FPGA:Verilog HDL 電子サイコロ

イメージ
 電子サイコロをVivadoで実装して、FPFAで実際に動かしてみる事をめざす。 ここまでと同じで新規プロジェクトを立ち上げ、Add Sourcesでソースを加える。 moduleの定義を行う。(LEDがMSB6、LSB0、上は入れ忘れて手動で入れた) ひな形が生成されるのでElectronicDice.vをタイプする。 `timescale 1ns / 1ps module ElectronicDice(     input CLK,     input RST,     input ENABLE,     output [6:0] LED     );          reg [2:0] cnt;          //hexadecimal counter     always @ (posedge CLK) begin     if (RST)         cnt <=3'h1; //start from 1         else if (ENABLE)             if (cnt==3'h6) //when cnt is h6, cnt is back to 1.                 cnt <= 3'h1;                  else                 cnt <=cnt+3'h1;     end          //Dice data     ...

FPGA:Verilog HDL 4ビット加算回路のシュミレーション

イメージ
FPGA:Verilog HDL  4ビット加算回路のFPGAへの実装 を進め、実際のFPGAでの動作の確認をしてきた。しかし実際の開発ではいきなりFPGAに書き込む前に、シュミレーションして動作の確認をする。シュミレーションをしてみる。(引き続き、入門Verilog HDL記述―ハードウェア記述言語の速習&実践の書籍の内容をVivadoで実行する手順) File-Newと進み、適当な名前をつけてプロジェクトを作り、Add SourcesのダイヤログっでAdd or create design sourcesにチェックを入れ、Createを選択して、adder.vを作る。 module adder(a,b,q);     input [3:0] a;     input [3:0] b;     output [3:0] q;         assign q=a+b; endmodule ここまでは以前と同じ。 その後、今度は再度、Add Sourcesのダイヤログ Add or create simulation sourcesを選択しNextを押す。   ここも、.vを作成したのと同じ要領で、Create Fileのボタンを押し、ファイル名を入れる。名前はなんでもよいが、よくつけるのはテストベットという事で、_tbをつける。この場合Adder_tb。 シュミレーションをするための、モジュールを作成する。 `timescale 1ns / 1ps module adder_tb; reg [3:0] a,b; wire [3:0] q; //set 1 clock parameter STEP = 100000; //call test module  adder  addr (a,b,q); //test input initial begin             a = 4'b0000; b=4'b0000;     #STEP   a = 4'b0101; b=4'b1010;     #STEP...