Mailbox 功能设计讲解
✅ Mailbox 功能设计讲解(cndm_micro_cmd_mbox)
非常棒!你提供的 RTL 和驱动代码让我能给出完整且准确的设计说明。整体设计很清晰:把寄存器访问(AXI Lite)和命令通道(AXI Stream)分离,既保证软件可控,又支持硬件流水。
1. 软件端逻辑(cndm_cmd.c)
cndm_exec_mbox_cmd():- 将 16 个 32bit 字写入硬件 mailbox 区:
hw_addr + 0x10000 + k*4 - 写入后
wmb()强同步,写命令寄存器0x0200的 bit0=1 发起执行 - 轮询
0x0200bit0 清零表示完成(最多 10 次 100us) - 读回 16 个 32bit 响应:
hw_addr + 0x10040 + k*4 - 互斥锁
mbox_lock序列化访问
- 将 16 个 32bit 字写入硬件 mailbox 区:
cndm_access_reg():用 mailbox 实现寄存器读写,依raw/write标志构造命令。
2. 硬件 cndm_micro_cmd_mbox 模块结构
- AXI-Lite 接口 (
s_axil_wr,s_axil_rd) -> 读写内部 RAM(命令/响应存储) - AXIS 命令接口:
m_axis_cmd:从 mailbox 内部 RAM 读出命令数据发送到硬件命令处理链s_axis_rsp:接收处理结果写回 mailbox RAM
- 控制信号:
start:接受客户端启动(读指针从0开始发命令)busy:当前命令流是否处理中
3. 内部 RAM 结构(taxi_ram_2rw_1c)
- 一组 32-bit x 32 的双端口 RAM:
a端:AXI-lite 读写,axil_mem_addr,axil_mem_wr_en/rd_enb端:CMD/RSP 读写,cmd_mem_addr,cmd_mem_wr_en/rd_en
- 地址逻辑:
- 5-bit 地址 (
ADDR_W=7,VALID_ADDR_W=5) -> 用于 32 个 32-bit 字 => 128B 区域 - 低 16 words 替成命令,另外16 words 可作为应答缓存(通过高位
cmd_mem_addr[4]区分)
- 5-bit 地址 (
4. 命令处理流程(状态机)
- 读指针
rd_ptr_reg、写指针wr_ptr_reg递增 - CMD 发送:
(!m_axis_cmd_tvalid || m_axis_cmd.tready) && (rd_ptr != 0 || start)- 从 RAM 读
cmd_mem_addr = {0, rd_ptr} - 通过
m_axis_cmd.tvalid/tlast发出 rd_ptr++;busy=1
- RSP 写入:
s_axis_rsp.tvalid && !s_axis_rsp_tready_reg- 写到 RAM
cmd_mem_addr = {1, wr_ptr} - 若
tlast:wr_ptr=0,busy=0;否则wr_ptr++
5. AXI-Lite 读写握手简要
write_eligible/read_eligible判断:AWVALID|WVALID+!BVALID等写条件ARVALID+!RVALID等读条件
last_read_reg处理读写冲突,保证读写顺序互斥- 写成功后
BVALID拉高;读成功后RVALID拉高
6. 关键设计优点
- 交互一致性:
- 驱动端写命令、poll完成、读响应一致
- 双口 RAM:
- AXI-Lite 与 AXIS 并行访问,不冲突
- 简单指针环:
- 以
rd_ptr和wr_ptr做命令窗口(最多 16 个 word 命令)
- 以
start/busy控制:- 外部可知正在命令发射/等待结果
7. 可能扩展点(观察即可)
- 现在
busy在收到s_axis_rsp.tlast清零,client 可以做超时/重试 - 目前没有完整错误码 / FIFO 协议异常处理(可在上层加)
cmd长度固定 16 words;如需要更灵活可在协议里加 length 字段
🔍 读者快速结论
这个 mailbox 设计是一种“AXI-Lite 写/读 + AXIS 流通道”的混合架构:
- CPU 通过寄存器区写命令数据、触发执行、读返回;
- 硬件通过 AXIS 命令/响应通道实际运作;
- 通过双口 RAM 实现“寄存器到流”的桥接,并保留简单状态机控制。
Mailbox 功能设计讲解
http://witbit.cn/FPGA/taxi/Mailbox 功能设计讲解.html