107 lines
4.7 KiB
Markdown
107 lines
4.7 KiB
Markdown
@[TOC](apb2axi DS文档)
|
||
|
||
# 1 功能概述
|
||
本设计模块是面向eth MAC CSR的AXI接口,设计apb2axi_bridge来进行给MAC CSR下发配置,考虑该模块具有一般通用性,可作为后续的通用性;
|
||
## 1.1 MAC IP CSR
|
||
1. 统一使用AXI总线管理控制信号和状态反馈
|
||
2. 内置事务超时机制和死锁预防电路
|
||
3. 集成中断仲裁器,多中断源合并为单输出
|
||
4. 各功能通道寄存器采用线性地址映射
|
||
5. 写1清除(Write-1-to-Clear)中断标志位
|
||
6. 每个中断源有独立使能寄存器
|
||
7. 基于功能通道的中断分组机制
|
||
|
||
# 2 接口列表及相关时序
|
||
## 2.1 APB
|
||
apb相关接口应该是为了保持统一而使用32bit(待确认,因为脚本是支持生成64bit的),apb相关接口时序如下:
|
||
信号包括:PCLK, PRESETn, PSEL, PENABLE, PADDR, PWRITE, PWDATA, PRDATA, PREADY, PSLVERR。
|
||
传输分为两个阶段:Setup阶段(PSEL=1,PENABLE=0)和Access阶段(PSEL=1,PENABLE=1)。当PREADY=1时,传输完成。
|
||
|
||
|
||
|
||
## 2.2 AXI
|
||
### 2.2.1 AXI拓扑结构()
|
||
64bit Data;
|
||
链式设备传递:
|
||

|
||
|
||

|
||
|
||
担心是否会在某一个串联的slave挂死--内置超时机制;
|
||
伪代码如下:
|
||
```python
|
||
def handle_transaction(addr):
|
||
if (MY_BASE_ADDR <= addr <= MY_END_ADDR): # 地址匹配本模块
|
||
process_locally() # 本地处理
|
||
return TERMINATED # 终止传递
|
||
else:
|
||
forward_to_next() # 转发至下一级
|
||
return FORWARDED
|
||
```
|
||
|
||
### 2.2.2 接口时序
|
||
AXI的读写Single接口时序:
|
||

|
||
|
||

|
||
|
||
### 2.2.3 AXI features
|
||
支持功能如下:
|
||
1.基本接口规范:64位总线宽度、支持burst;
|
||
2.地址操作:固定地址(同一地址连续写入--填充缓冲区)、递增地址突发(地址自动递增的连续传输--内存拷贝);
|
||
3.特殊访问类型;支持非64位对齐的内存操作;支持32bit窄访问;
|
||
|
||
不支持功能:
|
||
1.不支持非对齐访问下或窄访问下或回环下的突发操作;
|
||
2.保护访问:不支持特权内存级保护机制;
|
||
3.不支持原子读写;
|
||
4.严格执行顺序执行、不支持乱序处理;
|
||
5.不支持8位/16位窄访问;
|
||
|
||
## 2.3 bridge接口时序
|
||
该bridge转换接口
|
||
### 2.3.1 bridge接口写时序
|
||
接口写时序如下所示:
|
||

|
||
|
||
### 2.3.2 bridge接口读时序
|
||
接口读时序如下所示:
|
||

|
||
|
||
# 3 模块结构图
|
||
|
||
# 4 详细设计
|
||
在这里不支持burst和outsanding,每次只处理传输一个APB,因此其转换为AXI4的单个传输(读或写);
|
||
寄存器位宽是64bit;相邻寄存器间隔是8;
|
||
## 4.1 读写操作
|
||
### 4.1.1 写操作(32-->64)
|
||
APB发起写:设置PADDR, PWDATA, PWRITE=1, PSEL=1,紧接着PENABLE=1。
|
||
桥接模块需要将此次写转换到AXI4的写地址通道和写数据通道。
|
||
1.先发送写地址(AWVALID=1,等待AWREADY=1); 同时(或之后)发送写数据(WVALID=1,等待WREADY=1)
|
||
2.写响应通道:等待BVALID=1,然后桥接模块设置PREADY=1,并传递BRESP(给PSLVERR,0表示OK,1表示错误)。
|
||
注意:AXI4的写操作是先发送地址和数据,然后等待响应,而APB是先设置地址和数据,再使能传输。
|
||
|
||
特别地在这里对于AXI 64bit wdata中通过APB32bit总线配置写,寄存器地址位宽是64bit,连续相邻寄存器地址间隔是8;
|
||

|
||
在这里AXI地数据位宽是64bit,而APB的总线位宽是32bit,支持窄访问是32bit;
|
||

|
||
假如说想配置写0x19f0的64bit; 我理解是:
|
||
APB(32位)发起两笔写transaction:
|
||
第一笔写低32位:paddr = 0x19f0; pwdata = 32'xx; ----> AXI: awaddr = 0x19f0; wdata = pwdata; wstrb = 8'h0F;wsize = 3'b010;
|
||
第二笔写高32位:paddr = 0x19f4; pwdata = 32'xxx; ----> AXI: awaddr = 0x19f4; wdata = pwdata ; wstrb = 8'hF0; wsize = 3'b010;
|
||
|
||
### 4.1.2 读操作
|
||
APB发起读:设置PADDR, PWRITE=0, PSEL=1,紧接着PENABLE=1。
|
||
1.桥接模块将读地址发送到AXI4的读地址通道(ARVALID=1,等待ARREADY=1)。
|
||
2.等待读数据通道返回(RVALID=1),然后读取数据,传递给PRDATA,并设置PREADY=1,同时传递RRESP(给PSLVERR)。
|
||
|
||
特别地在这里进行对于AXI 64bit中 rdata访问获取32bit;
|
||

|
||
假如说想配置读0x19f0的64bit; 我理解是:
|
||
APB(32位)发起两笔读transaction:
|
||
第一笔写低32位:paddr = 0x19f0; ; ----> AXI: awaddr = 0x19f0; prdata = (paddr[2]) ? rdata[64 -1:32] : [32 -1:0];
|
||
第二笔写高32位:paddr = 0x19f4; ; ----> AXI: awaddr = 0x19f4;prdata = (paddr[2]) ? rdata[64 -1:32] : [32 -1:0] ;
|
||
|
||
## 4.2 状态机设计
|
||
|
||
 |