在 Vivado 中将蜂鸟 E203 RISC-V 内核封装为 IP 核并添加 AXI 总线的步骤如下:
1. 准备工作
2. 封装 E203 为 IP 核
(1) 创建 IP 核框架
- Tools → Create and Package New IP → Next
- 选择 Create a new AXI4 peripheral(即使 E203 无原生 AXI 接口,此模板简化总线添加)。
- 设置 IP 名称(如
e203_axi_wrapper)和位置。
(2) 添加 E203 源代码
(3) 创建顶层包装模块
新建 e203_axi_wrapper.v 作为 IP 顶层:
module e203_axi_wrapper (
// 时钟和复位
input wire aclk,
input wire aresetn,
// AXI4-Lite 从设备接口(用于调试/控制)
input wire s_axi_awvalid,
output wire s_axi_awready,
input wire [31:0] s_axi_awaddr,
... // 完整 AXI 信号列表
// E203 原生接口
output wire core_clk,
output wire core_rstn,
input wire jtag_TCK,
... // 其他 E203 信号
);
//-----------------------------------
// E203 实例化
//-----------------------------------
e203_soc_top u_e203_core (
.hfextclk (aclk), // 外部时钟
.hfxoscen (1'b1), // 时钟使能
.io_pads_jtag_TCK_i_ival (jtag_TCK),
... // 信号连接
);
//-----------------------------------
// AXI 接口逻辑(关键步骤)
//-----------------------------------
// 例1:添加 AXI 寄存器桥接 E203 的外设总线
wire [31:0] e203_periph_addr;
wire [31:0] e203_periph_wdata;
wire e203_periph_we;
// 实例化 AXI-Lite 到 E203 外设总线的适配器
axi_lite_to_e203_bridge u_bridge (
.s_axi_aclk (aclk),
.s_axi_aresetn (aresetn),
// AXI 接口(连接至 IP 端口)
.s_axi_awvalid (s_axi_awvalid),
.s_axi_awready (s_axi_awready),
...
// E203 总线接口
.periph_addr (e203_periph_addr),
.periph_wdata (e203_periph_wdata),
.periph_we (e203_periph_we)
);
// 将适配器连接到 E203 的外设总线
assign u_e203_core.io_sys_periph_awvalid = e203_periph_we;
assign u_e203_core.io_sys_periph_wvalid = e203_periph_we;
assign u_e203_core.io_sys_periph_arvalid = ~e203_periph_we;
assign u_e203_core.io_sys_periph_wdata = e203_periph_wdata;
assign u_e203_core.io_sys_periph_araddr = e203_periph_addr;
assign u_e203_core.io_sys_periph_awaddr = e203_periph_addr;
// 例2:直接暴露 JTAG 调试接口
assign jtag_TCK = ...; // 连接至 E203 的 JTAG 引脚
endmodule
3. 添加 AXI 总线接口
(1) 在 IP 打包器中定义总线
- 进入 IP Catalog → 右键 IP → Edit in IP Packager。
- 在 Ports and Interfaces 选项卡:
- 添加 AXI4-Lite 从接口:
- 点击
+ → 选择 AXI4 → Lite → Slave。
- 设置名称(如
S_AXI)。
- 映射信号:
- 将
s_axi_awvalid, s_axi_awready 等信号关联到顶层模块端口。
- 配置接口参数:
- 数据宽度:32-bit(与 E203 总线匹配)。
- 地址范围:设置寄存器空间大小(如 64KB)。
(2) 生成地址映射
- 在 Addressing and Memory 中指定偏移地址(如
0x0000_0000)。
4. 封装 IP 并导出
- 保存 IP:
- Review and Package → Re-Package IP。
- 在项目中引用:
- 关闭 IP 打包器,返回主工程。
- IP Catalog → User Repository 中找到
e203_axi_wrapper。
5. 在 Block Design 中使用
- 创建 Block Design:
- 连接总线:
- 自动连接
S_AXI 到 AXI Interconnect。
- 连接
aclk 和 aresetn 到系统时钟/复位。
- 添加必要外设:
- BRAM 控制器(用于 E203 内存)。
- UART/AXI Timer(示例外设)。
- 生成输出产品:
- Generate Block Design → Create HDL Wrapper。
关键注意事项
- 总线适配逻辑:
- E203 使用自定义总线(类似 Wishbone),需设计 AXI 到 E203 总线的转换桥(参考示例中的
axi_lite_to_e203_bridge)。若需高性能,可改用 AXI4 全功能适配器。
- 时钟与复位:
- E203 需独立的低速时钟(如 16MHz),使用 Clocking Wizard 分频。
- 调试接口:
- 暴露 JTAG 端口(TCK/TDI/TDO/TMS)以支持 OpenOCD 调试。
- 地址映射:
- 确保外设地址与 E203 的
hbirdv2 SoC 定义一致(检查源码中的 Memmap.h)。
验证流程
- 生成 Bitstream 并下载到 FPGA。
- 使用 RISC-V 工具链编译测试程序:
riscv64-unknown-elf-gcc -march=rv32imac -o test.elf test.c
- 通过 OpenOCD + GDB 加载程序并调试:
openocd -f board/hbird_e203.cfg
riscv64-unknown-elf-gdb test.elf
提示:首次封装建议从最小系统入手(仅保留核心+内存)。完整移植需处理中断控制器、GPIO 等外设的 AXI 化封装。参考官方 hbirdv2 SoC 中的 AXI 集成示例。