ZynqのCPU Interconnectに接続するためには、AXI経由でブロックモジュールを作成する必要がある。これらの部品は自分で作っても良いのだが、どうにもエラーが取り切れないところもあるし、きちんと作れているのかいまいち自信が無かったので、ADIのデザインを再利用して作ることにした。
例えば上記のリポジトリ内にある、 library/axi_clkgen/
などを見てみよう。 axi_clkgen.v
を開くと、まずはAXI信号を受け取り、up_axiというADIのモジュールを使ってアドレスとデータを同期させていることが分かる。
これらは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を作ってみよう。
こんな感じにしてみた。合っているかはよく分からん。
.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ファイルが作れるところまでは確認できた。