2020/08/16

ultra96 vio を試す

FPGA   

ultra96で、vioのテストをした。vioは簡単に扱えると聞いたので、試してみました。

最初は、ultra96のチュートリアルベースに、ZYNQを追加します。

https://www.element14.com/community/docs/DOC-91053/l/01ultra96vivadointro2018201zip

そして、Add IPから VIO (Virtual input/output)を検索して、追加します。

今回は、2つのレジスタを作成します。

・レジスタに1ライトしたら、input probeが1になる

・output probeを1にしたら、レジスタが1になる。

AXI Liteのテンプレートに、外部入出力を追加します。

  1.         // Users to add ports here
  2.         output wire REG_VALUE,
  3.  
  4.         input wire PROBE_VALUE,
  5.         // User ports ends
  6.  

1ライトしたら、REG_VALUEを出力します。

  1.     // Add user logic here
  2.     reg reg_value;
  3.     always @( posedge S_AXI_ACLK )
  4.     begin
  5.         if ( S_AXI_ARESETN == 1'b0 ) begin

  6.             reg_value <= 1'b0;
  7.         end else begin
  8.             if (slv_reg0[0] == 1'b1) begin

  9.                 reg_value <= 1'b1;
  10.             end else begin
  11.                 reg_value <= 0'b0;
  12.             end
  13.         end
  14.     end
  15.     assign REG_VALUE = reg_value;
  16.     // User logic ends

次に、レジスタの値を出力します。レジスタの値を更新している箇所で、レジスタの値を出力します。

  1.      end else begin
  2.              slv_reg1[0] <= PROBE_VALUE;
  3.      end
  4.  


できたIP(myip)をブロックデザインに追加して、probeと接続します。

そして、GenerateBitStreamを実行します。

次に、ソフトウェアですが、10秒間隔で、レジスタを1→0に変化するソフトと、10秒間隔で、レジスタをリードするソフトウェアを作成します。

  1.     print("Hello World\n\r");
  2.     u32 * ptr = 0xa0000000;
  3.     *ptr = 0x1;
  4.     xil_printf("%x %x\n\r", ptr, *ptr);
  5.     sleep(10);
  6.     *ptr = 0x0;
  7.     xil_printf("%x %x\n\r", ptr, *ptr);
  8.     sleep(10);
  9.     *ptr = 0x1;
  10.     xil_printf("%x %x\n\r", ptr, *ptr);
  11.     sleep(10);
  12.     *ptr = 0x0;
  13.     xil_printf("%x %x\n\r", ptr, *ptr);
  14.     sleep(10);
  15.     *ptr = 0x1;
  16.     xil_printf("%x %x\n\r", ptr, *ptr);
  17.     sleep(10);
  18.     *ptr = 0x0;
  19.     xil_printf("%x %x\n\r", ptr, *ptr);
  20.     sleep(10);
  21.     *ptr = 0x1;
  22.     xil_printf("%x %x\n\r", ptr, *ptr);
  23.     sleep(10);
  24.     *ptr = 0x00;
  25.     xil_printf("%x %x\n\r", ptr, *ptr);
  26.     sleep(10);
  27.     ptr = 0xa0000004;
  28.     for(;;) {
  29.    sleep(10);
  30.    xil_printf("%x %x\n\r", ptr, *ptr);
  31.     }

実行します。実行時は、VitisでRunすると、program FPGAも実行してくれるので、VitisでRun して、Vivadoで、Refresh Deviceを実行するのが良いと思います。

Refresh Deviceを実行すると自動で、hw_vio_1が現れる。

hw_vio_1をダブルクリックすると、dashboard追加の画面がでるので、OKで、追加する。

追加DashBoard上で、+ボタンを押して、観測するProbeを選択する。

追加したら、outのprobe側は、0と1が選択できるようになる。

input側は、ソフトウェアの結果に応じて、0⇔1の変化がおきる。output側は、probeの値を変化させると、ソフトの実行結果が変化するはずだ。

0xa0000000が、inputのprobeに接続されていて、0xa0000004がouputのprobeに接続されている。

以下に、FPGAとソフトウェア環境をおいておくー。

https://github.com/y38y38/fpga/tree/master/vio_test

説明は省略しているので、詳細な手順が知りたい方は連絡ください!

« »