ZedBoardのIPデザインに対して、BlockRAMのモジュールを挿入する。
BlockRAMの設計
AXI4のインタフェースを持ったBlockRAMデザインを設計する。AXI4のインタフェースは他のデザインから取ってくる。
github.com
blockram_test_v1_0
- blockram_test_v1_0_S00_AXI
blockram_test_v1_0はAXI4のインタフェースを持たせた。
module blockram_test_v1_0 #
(
parameter integer C_s_axi_ID_WIDTH = 1,
parameter integer C_s_axi_DATA_WIDTH = 32,
parameter integer C_s_axi_ADDR_WIDTH = 6,
parameter integer C_s_axi_AWUSER_WIDTH = 0,
parameter integer C_s_axi_ARUSER_WIDTH = 0,
parameter integer C_s_axi_WUSER_WIDTH = 0,
parameter integer C_s_axi_RUSER_WIDTH = 0,
parameter integer C_s_axi_BUSER_WIDTH = 0
)
(
input wire s_axi_aclk,
input wire s_axi_aresetn,
input wire [C_s_axi_ID_WIDTH-1 : 0] s_axi_awid,
input wire [C_s_axi_ADDR_WIDTH-1 : 0] s_axi_awaddr,
input wire [7 : 0] s_axi_awlen,
input wire [2 : 0] s_axi_awsize,
input wire [1 : 0] s_axi_awburst,
input wire s_axi_awlock,
input wire [3 : 0] s_axi_awcache,
input wire [2 : 0] s_axi_awprot,
...
これ、まだ良く分かっていないのだが、インタフェースの名前をs_axi_xxx
としているとBlockデザインをインテグレートするときにC_s_axi_ID_WIDTH
と同様のフォーマットに合わせないとインテグレートに失敗する?
まず、IPをビルドするためのスクリプトを用意する。
source ../scripts/adi_env.tcl
source $ad_hdl_dir/library/scripts/adi_ip.tcl
adi_ip_create blockram_test_v1_0
adi_ip_files blockram_test_v1_0 [list \
"hdl/blockram_test_v1_0_S00_AXI.v" \
"hdl/blockram_test_v1_0.v" \
]
ipx::package_project -root_dir . \
-vendor analog.com \
-library user \
-taxonomy /Analog_Devices
set_property vendor_display_name {Analog Devices} [ipx::current_core]
set_property company_url {www.analog.com} [ipx::current_core]
set_property supported_families {\
virtex7 Production \
qvirtex7 Production \
kintex7 Production \
kintex7l Production \
qkintex7 Production \
qkintex7l Production \
artix7 Production \
artix7l Production \
aartix7 Production \
qartix7 Production \
zynq Production \
qzynq Production \
azynq Production \
virtexu Production \
kintexuplus Production \
zynquplus Production \
kintexu Production \
virtex7 Beta \
qvirtex7 Beta \
kintex7 Beta \
kintex7l Beta \
qkintex7 Beta \
qkintex7l Beta \
artix7 Beta \
artix7l Beta \
aartix7 Beta \
qartix7 Beta \
zynq Beta \
qzynq Beta \
azynq Beta \
virtexu Beta \
virtexuplus Beta \
kintexuplus Beta \
zynquplus Beta \
kintexu Beta}\
[ipx::current_core]
ipx::remove_all_bus_interface [ipx::current_core]
set memory_maps [ipx::get_memory_maps * -of_objects [ipx::current_core]]
foreach map $memory_maps {
ipx::remove_memory_map [lindex $map 2] [ipx::current_core ]
}
ipx::infer_bus_interface {\
s_axi_awid \
s_axi_awaddr \
s_axi_awlen \
s_axi_awsize \
s_axi_awburst \
s_axi_awlock \
s_axi_awcache \
s_axi_awprot \
s_axi_awqos \
s_axi_awregion \
s_axi_awuser \
s_axi_awvalid \
s_axi_awready \
s_axi_wdata \
s_axi_wstrb \
s_axi_wlast \
s_axi_wuser \
s_axi_wvalid \
s_axi_wready \
s_axi_bid \
s_axi_bresp \
s_axi_buser \
s_axi_bvalid \
s_axi_bready \
s_axi_arid \
s_axi_araddr \
s_axi_arlen \
s_axi_arsize \
s_axi_arburst \
s_axi_arlock \
s_axi_arcache \
s_axi_arprot \
s_axi_arqos \
s_axi_arregion \
s_axi_aruser \
s_axi_arvalid \
s_axi_arready \
s_axi_rid \
s_axi_rdata \
s_axi_rresp \
s_axi_rlast \
s_axi_ruser \
s_axi_rvalid \
s_axi_rready} \
xilinx.com:interface:aximm_rtl:1.0 [ipx::current_core]
ipx::infer_bus_interface s_axi_aclk xilinx.com:signal:clock_rtl:1.0 [ipx::current_core]
ipx::infer_bus_interface s_axi_aresetn xilinx.com:signal:reset_rtl:1.0 [ipx::current_core]
ipx::add_memory_map {s_axi} [ipx::current_core]
set_property slave_memory_map_ref {s_axi} [ipx::get_bus_interfaces s_axi -of_objects [ipx::current_core]]
ipx::add_address_block {axi} [ipx::get_memory_maps s_axi -of_objects [ipx::current_core]]
set_property range {65536} [ipx::get_address_blocks axi \
-of_objects [ipx::get_memory_maps s_axi -of_objects [ipx::current_core]]]
ipx::add_bus_parameter ASSOCIATED_BUSIF [ipx::get_bus_interfaces s_axi_aclk \
-of_objects [ipx::current_core]]
set_property value s_axi [ipx::get_bus_parameters ASSOCIATED_BUSIF \
-of_objects [ipx::get_bus_interfaces s_axi_aclk \
-of_objects [ipx::current_core]]]
adi_ip_constraints blockram_test_v1_0 [list \
"blockram_test_constr.xdc" \
"$ad_hdl_dir/library/common/ad_axi_ip_constr.xdc" ]
ipx::save_core [ipx::current_core]
IPのインテグレート
作成したIPをインテグレートするためのスクリプトを用意する。
update_compile_order -fileset sources_1
open_bd_design {./adv7511_zed.srcs/sources_1/bd/system/system.bd}
update_ip_catalog -rebuild
startgroup
create_bd_cell -type ip -vlnv analog.com:user:blockram_test_v1_0:1.0 blockram_test_0
endgroup
apply_bd_automation -rule xilinx.com:bd_rule:axi4 \
-config {Master "/sys_ps7/M_AXI_GP0" intc_ip "Auto" Clk_xbar "Auto" Clk_master "Auto" Clk_slave "Auto" } \
[get_bd_intf_pins blockram_test_0/S_AXI]
regenerate_bd_layout
reset_run synth_1
reset_run system_xbar_0_synth_1
launch_runs impl_1 -to_step write_bitstream -jobs 2
wait_on_run impl_1
save_bd_design
おそらく重要なのは
- create_bd_cell : サブブロックをインスタンスする。
- apply_bd_automation : ルーティングを実行する
である。これで自分の好きなIPをインテグレートする訳だ。
github.com
rm -rf *.cache *.data *.xpr *.log *.jou xgui *.runs *.srcs *.sdk *.hw *.sim .Xil *.ip_user_files
vivado -mode batch -source system_project.tcl >> adv7511_zed_vivado.log 2>&1