FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Vivado でZynqのブロックデザインをTCLで生成する方法の調査(2. ADIのモジュールを利用してブロック部品を作成する)

ZynqのCPU Interconnectに接続するためには、AXI経由でブロックモジュールを作成する必要がある。これらの部品は自分で作っても良いのだが、どうにもエラーが取り切れないところもあるし、きちんと作れているのかいまいち自信が無かったので、ADIのデザインを再利用して作ることにした。

github.com

例えば上記のリポジトリ内にある、 library/axi_clkgen/などを見てみよう。 axi_clkgen.v を開くと、まずはAXI信号を受け取り、up_axiというADIのモジュールを使ってアドレスとデータを同期させていることが分かる。

github.com

f:id:msyksphinz:20170802003836p:plain

これらはAXIを変換したもので、アドレスとデータが同期しているので扱いやすい。信号線も、

  wire            up_wreq_s;
  wire    [13:0]  up_waddr_s;
  wire    [31:0]  up_wdata_s;
  wire            up_wack_s;
  wire            up_rreq_s;
  wire    [13:0]  up_raddr_s;
  wire    [31:0]  up_rdata_s;
  wire            up_rack_s;

と数が少ないので、何のための信号かすぐに分かる。

これらを使ってブロックを構成する。例えば、axi_blockramを作ってみよう。

github.com

こんな感じにしてみた。合っているかはよく分からん。

    .up_wreq  (up_wreq_s),
    .up_waddr (up_waddr_s),
    .up_wdata (up_wdata_s),
    .up_wack  (up_wack_s),
    .up_rreq  (up_rreq_s),
    .up_raddr (up_raddr_s),
    .up_rdata (up_rdata_s),
    .up_rack  (up_rack_s));

  reg [31: 0]     reg_mem [1023: 0];

  assign up_wack_s = 1'b1;

  always @ (posedge clk) begin
    if (up_wreq_s) begin
      reg_mem[up_waddr_s[9:0]] <= up_wdata_s[31: 0];
    end
  end

  always @ (posedge clk) begin
    up_rack_s  <= up_rreq_s;
    up_rdata_s <= reg_mem[up_raddr_s[9:0]];
  end

endmodule

とりあえず、これで一通り論理合成を流して、Vivadoでbitファイルが作れるところまでは確認できた。

f:id:msyksphinz:20170802005258p:plain