31 KiB
CCSDS122 Datamover 详细设计方案
版本: 2026-06-30 | 目标器件: Xilinx VU440 + Zynq UltraScale+ ZU4
目录
- 系统架构
- DDR 地址空间分配
- 压缩输出地址空间分配
- 模块划分与职责
- 顶层状态机
- Phase 1: 元数据读取
- Phase 2: 辅助数据 DMA
- Phase 3: 图像压缩搬移
- MM2S 命令流水线
- S2MM 命令策略
- 地址计算模块
- Bubble Removal 改动
- Stream 数据路径
- 信号接口
- 参数配置
1. 系统架构
1.1 整体框图
┌─ PC ──────────────────────────────────────────────────────────────┐
│ upload_compress_download.py │
│ 串口上传原始图像 → 配置压缩参数 → 等待压缩完成 → 下载压缩结果 │
└──────────────────────────────┬──────────────────────────────────────┘
│ UART (COM7, 2M baud)
┌─ Zynq ZU4 (PS) ─────────────┼──────────────────────────────────────┐
│ ccsds_uart_axi │ │
│ ├─ uart_rx / uart_tx │ │
│ └─ axi_uart_upload ◄────────┘ │
│ ├─ m_axi (AXI4 Full) ──→ SmartConnect ──→ PS DDR4 │
│ └─ m_axil (AXI4 Lite) ──→ C2C ──→ VU440 axil_slave │
└────────────────────────────────┬────────────────────────────────────┘
│ C2C (SelectIO, 9对差分)
┌─ VU440 (PL) ──────────────────┼────────────────────────────────────┐
│ ccsds122_datamover │ │
│ ├─ ccsds122_stream_ctrl │ │
│ │ ├─ ccsds122_addr_calc │ │
│ │ └─ (FSM + MM2S/S2MM cmd) │ │
│ ├─ axi_datamover_0 (Xilinx IP) │
│ └─ ccsds122_compression_top │
│ ├─ ccsds122_bubble_removal_ctrl │
│ └─ top_bpe_encoder (CCSDS 122.0-B-2) │
└─────────────────────────────────────────────────────────────────────┘
1.2 数据流向
原始图像:
Zynq DDR4 ──[MM2S Read]──→ Datamover ──[mm2s_stream]──→ stream_ctrl
↓ ↓
(C2C 回传) raw_s_axis
↓
bubble_removal
↓
top_bpe_encoder
↓
压缩数据: pack_m_axis
↓
Zynq DDR4 ←──[S2MM Write]── Datamover ←──[s2mm_stream]── stream_ctrl
↑
(C2C 回传)
辅助数据 (不压缩):
Zynq DDR4 ──[MM2S Read]──→ Datamover ──[mm2s_stream]──→ stream_ctrl
│ (bypass MUX)
Zynq DDR4 ←──[S2MM Write]── Datamover ←──[s2mm_stream]────┘
1.3 图像规格
| 参数 | 值 |
|---|---|
| 像素位深 | 14-bit |
| 每幅图尺寸 | 256 × 256 pixels |
| 每 beat 像素数 | 4 |
| 每幅图 beats | 16,384 |
| 每幅图字节数 | 131,072 (128 KB) |
| 每行取像素 | 256 pixels = 512 bytes |
| 每幅图行数 | 256 rows |
2. DDR 地址空间分配
2.1 总体布局
原始图像存储在 Zynq PS DDR4 的一个连续 128MB(或 64MB)块中,起始地址为 flaw_image_addr。
┌──────────────────────────────────────────────────────────────┐
│ flaw_image_addr (128MB Block) │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ 区域 0: PAN 图像数据 (96MB / 48MB) │ │
│ ├──────────────────────────────────────────────────────┤ │
│ │ 区域 1: B1 图像数据 (6MB / 3MB) │ │
│ ├──────────────────────────────────────────────────────┤ │
│ │ 区域 2: B2 图像数据 (6MB / 3MB) │ │
│ ├──────────────────────────────────────────────────────┤ │
│ │ 区域 3: B3 图像数据 (6MB / 3MB) │ │
│ ├──────────────────────────────────────────────────────┤ │
│ │ 区域 4: B4 图像数据 (6MB / 3MB) │ │
│ ├──────────────────────────────────────────────────────┤ │
│ │ 辅助数据区 (各区域 aux 连续存放) │ │
│ │ PAN_aux + B1_aux + B2_aux + B3_aux + B4_aux │ │
│ ├──────────────────────────────────────────────────────┤ │
│ │ (padding to 128MB - 4KB) │ │
│ ├──────────────────────────────────────────────────────┤ │
│ │ 元数据: 5 × 32-bit row counts @ 最后 4KB │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
2.2 模式 1: PAN + B1~B4
128M Block:
| 区域 | 数据 | 分辨率 | 行跨距 | 原始大小 | 最大行数 | 图像偏移 |
|---|---|---|---|---|---|---|
| PAN | 全色 | 6144×8192×2B | 12288 | 96 MB | 8192 | 0 |
| B1 | 多光谱 | 1536×2048×2B | 3072 | 6 MB | 2048 | 96 MB |
| B2 | 多光谱 | 1536×2048×2B | 3072 | 6 MB | 2048 | 102 MB |
| B3 | 多光谱 | 1536×2048×2B | 3072 | 6 MB | 2048 | 108 MB |
| B4 | 多光谱 | 1536×2048×2B | 3072 | 6 MB | 2048 | 114 MB |
图像数据总量: 120 MB。辅助数据从 flaw_image_addr + 120MB 开始。
原始 DDR 区域示意图:
flaw_image_addr + 0 ──→ PAN (6144 px × 8192 rows × 2B)
flaw_image_addr + 96MB ──→ B1 (1536 px × 2048 rows × 2B)
flaw_image_addr + 102MB ──→ B2 (1536 px × 2048 rows × 2B)
flaw_image_addr + 108MB ──→ B3 (1536 px × 2048 rows × 2B)
flaw_image_addr + 114MB ──→ B4 (1536 px × 2048 rows × 2B)
flaw_image_addr + 120MB ──→ aux 数据区
flaw_image_addr + 128MB - 4KB ──→ 元数据
64M Block:
| 区域 | 数据 | 行跨距 | 原始大小 | 最大行数 | 图像偏移 |
|---|---|---|---|---|---|
| PAN | 全色 | 12288 | 48 MB | 4096 | 0 |
| B1 | 多光谱 | 3072 | 3 MB | 1024 | 48 MB |
| B2 | 多光谱 | 3072 | 3 MB | 1024 | 51 MB |
| B3 | 多光谱 | 3072 | 3 MB | 1024 | 54 MB |
| B4 | 多光谱 | 3072 | 3 MB | 1024 | 57 MB |
图像数据总量: 60 MB。
2.3 模式 2: PAN only
128M Block:
| 区域 | 行跨距 | 原始大小 | 最大行数 | 图像偏移 |
|---|---|---|---|---|
| PAN | 12288 | 120 MB | 10240 | 0 |
图像数据总量: 120 MB。
flaw_image_addr + 0 ──→ PAN (6144 px × 10240 rows × 2B)
flaw_image_addr + 120MB ──→ aux 数据区
flaw_image_addr + 128MB - 4KB ──→ 元数据
64M Block:
| 区域 | 行跨距 | 原始大小 | 最大行数 | 图像偏移 |
|---|---|---|---|---|
| PAN | 12288 | 60 MB | 5120 | 0 |
图像数据总量: 60 MB。
2.4 模式 3: B1~B4
128M Block:
| 区域 | 行跨距 | 原始大小 | 最大行数 | 图像偏移 |
|---|---|---|---|---|
| B1 | 3072 | 30 MB | 10240 | 0 |
| B2 | 3072 | 30 MB | 10240 | 30 MB |
| B3 | 3072 | 30 MB | 10240 | 60 MB |
| B4 | 3072 | 30 MB | 10240 | 90 MB |
图像数据总量: 120 MB。
64M Block:
| 区域 | 行跨距 | 原始大小 | 最大行数 | 图像偏移 |
|---|---|---|---|---|
| B1 | 3072 | 15 MB | 5120 | 0 |
| B2 | 3072 | 15 MB | 5120 | 15 MB |
| B3 | 3072 | 15 MB | 5120 | 30 MB |
| B4 | 3072 | 15 MB | 5120 | 45 MB |
图像数据总量: 60 MB。
2.5 元数据格式
位于 flaw_image_addr + BLOCK_SIZE - 4096,前 20 字节:
Byte 0-3: PAN_row (big-endian 32-bit)
Byte 4-7: B1_row (big-endian 32-bit)
Byte 8-11: B2_row (big-endian 32-bit)
Byte 12-15: B3_row (big-endian 32-bit)
Byte 16-19: B4_row (big-endian 32-bit)
| 字段 | 含义 | 用途 |
|---|---|---|
| PAN_row | PAN 区域实际有效行数 | 决定 PAN 处理多少幅图、aux 大小 |
| B1_row | B1 区域实际有效行数 | 决定 B1 处理多少幅图、aux 大小 |
| B2_row | B2 区域实际有效行数 | 同上 |
| B3_row | B3 区域实际有效行数 | 同上 |
| B4_row | B4 区域实际有效行数 | 同上 |
按模式使用的字段:
| 模式 | 使用字段 |
|---|---|
| 1 | PAN_row, B1_row, B2_row, B3_row, B4_row |
| 2 | PAN_row |
| 3 | B1_row, B2_row, B3_row, B4_row |
3. 压缩输出地址空间分配
3.1 总体布局
压缩数据通过 S2MM 写入 DDR,起始地址为 COMPRESS_BASE_ADDR(parameter)。每区域分配 原始大小 + 1MB 空间。
3.2 模式 1, 128M
COMPRESS_BASE + 0 ──→ PAN aux (PAN_row × 140B)
PAN 压缩数据 (最大 97MB - aux)
COMPRESS_BASE + 97MB ──→ B1 aux (B1_row × 140B)
B1 压缩数据 (最大 7MB - aux)
COMPRESS_BASE + 104MB ──→ B2 aux (B2_row × 140B)
B2 压缩数据 (最大 7MB - aux)
COMPRESS_BASE + 111MB ──→ B3 aux (B3_row × 140B)
B3 压缩数据 (最大 7MB - aux)
COMPRESS_BASE + 118MB ──→ B4 aux (B4_row × 140B)
B4 压缩数据 (最大 7MB - aux)
参数表:
slot 0 (PAN) slot 1 (B1) slot 2 (B2) slot 3 (B3) slot 4 (B4)
roff_q 0 96MB 102MB 108MB 114MB
rstr_q 12288 3072 3072 3072 3072
rwid_q 6144 1536 1536 1536 1536
rmax_q 8192 2048 2048 2048 2048
rraw_q 96MB 6MB 6MB 6MB 6MB
rall_q 97MB 7MB 7MB 7MB 7MB
rpan_q 1 0 0 0 0
| 累加器 | slot 0 | slot 1 | slot 2 | slot 3 | slot 4 | slot 5 |
|---|---|---|---|---|---|---|
| img_cumul_q (图像累计) | 0 | 96MB | 102MB | 108MB | 114MB | 120MB |
| comp_cumul_q (压缩累计) | 0 | 97MB | 104MB | 111MB | 118MB | 125MB |
3.3 模式 2, 128M
slot 0 (PAN) slot 1 slot 2 slot 3 slot 4
roff_q 0 0 0 0 0
rstr_q 12288 0 0 0 0
rwid_q 6144 0 0 0 0
rmax_q 10240 0 0 0 0
rraw_q 120MB 0 0 0 0
rall_q 121MB 0 0 0 0
rpan_q 1 0 0 0 0
rcnt_q = 1
img_cumul_q = [0, 120MB, 120MB, 120MB, 120MB, 120MB]
comp_cumul_q = [0, 121MB, 121MB, 121MB, 121MB, 121MB]
img_total_q = 120MB
3.4 模式 3, 128M
slot 0 (B1) slot 1 (B2) slot 2 (B3) slot 3 (B4) slot 4
roff_q 0 30MB 60MB 90MB 0
rstr_q 3072 3072 3072 3072 0
rwid_q 1536 1536 1536 1536 0
rmax_q 10240 10240 10240 10240 0
rraw_q 30MB 30MB 30MB 30MB 0
rall_q 31MB 31MB 31MB 31MB 0
rpan_q 0 0 0 0 0
rcnt_q = 4
img_cumul_q = [0, 30MB, 60MB, 90MB, 120MB, 120MB]
comp_cumul_q = [0, 31MB, 62MB, 93MB, 124MB, 124MB]
img_total_q = 120MB
4. 模块划分与职责
ccsds122_datamover.sv ← 顶层集成
├── axi_datamover_0 ← Xilinx AXI Datamover IP (DMA 引擎)
├── ccsds122_stream_ctrl.sv ← 主控制器 (FSM + 命令生成 + 流桥接)
│ └── ccsds122_addr_calc.sv ← 地址与布局参数计算器
└── ccsds122_compression_top.sv ← 压缩子系统
├── ccsds122_bubble_removal_ctrl.sv ← 气泡消除 + 流打包
└── top_bpe_encoder ← CCSDS 122.0-B-2 压缩核
| 模块 | 职责 |
|---|---|
ccsds122_addr_calc |
根据 mode + block_size 查表得到全部区域参数;计算 MM2S 行地址、aux 地址、总图像数 |
ccsds122_stream_ctrl |
三段式 FSM 控制全流程;MM2S/S2MM 命令生成与握手;stream MUX(正常/bypass);统计累加 |
ccsds122_bubble_removal_ctrl |
旋转+spill 气泡消除;每图 tlast 生成;raw path 字节计数 |
ccsds122_datamover |
顶层例化 + enable 锁存 + 统计信号透传 |
5. 顶层状态机
5.1 状态定义
typedef enum logic [3:0] {
ST_IDLE = 4'd0, // 等待 enable 上升沿
ST_READ_META_CMD = 4'd1, // 发 MM2S 读 24B 元数据
ST_READ_META_WAIT = 4'd2, // 等 stream 数据 + STS
ST_DMA_AUX_SEL = 4'd3, // 选下一个 aux 区域
ST_DMA_AUX_MM2S_CMD = 4'd4, // 发 MM2S aux 读
ST_DMA_AUX_S2MM_CMD = 4'd5, // 发 S2MM aux 写
ST_DMA_AUX_WAIT_STS = 4'd6, // 等双 STS
ST_PROC_REGION_SEL = 4'd7, // 选下一个图像区域
ST_PROC_IMG_START = 4'd8, // 图像开始, 发 S2MM INDET
ST_PROC_IMG_MM2S = 4'd9, // 256 cmd, 2-in-flight
ST_PROC_IMG_WAIT_COMP = 4'd10, // 等压缩完成
ST_PROC_IMG_NEXT = 4'd11, // 下一幅 / 下一区域
ST_DONE = 4'd12 // 全部完成
} state_t;
5.2 状态转移图
IDLE ──enable_rise──→ META_CMD ──cmd握手──→ META_WAIT ──meta_done──→ AUX_SEL
↑ ↓
│ ┌── size>0 ──→ AUX_MM2S → AUX_S2MM → AUX_WAIT
│ │ ↑ ↓
│ └─ size=0 (skip) ──┘ 双STS就绪 → AUX_SEL
│ ↑
│ ┌─── region未完 ──────┘
│ │
│ AUX_SEL ──all done──→ PROC_SEL
│ ↓
│ ┌── total=0 (skip) ──→ loop
│ │ ↑
│ └─ total>0 ──→ IMG_START → IMG_MM2S
│ ↑ ↓
│ ┌─ 还有图 ─┘ IMG_WAIT_COMP
│ │ ↑ ↓
│ └───┘ IMG_NEXT (双标志)
│ ↓
│ ┌─ 区域未完 → IMG_START
│ └─ 区域完 → PROC_SEL
│ ↓
└────────────────────────── enable=0 ──────────────────── DONE ← proc≥total
5.3 三段式 FSM 结构
Stage 1 (always_ff): state_q <= state_next ← 纯状态寄存器
Stage 2 (always_comb): state_next = f(state_q) ← 纯组合逻辑跳转
Stage 3 (always_ff): case(state_q) ... ← 输出赋值, 不驱动 state_next
Stage 2 所有转移条件使用握手信号或内部标志,Stage 3 不参与状态转移。
6. Phase 1: 元数据读取
6.1 流程
- enable 上升沿 → 锁存
flaw_image_addr,flaw_storage_mode,ac_mode ST_READ_META_CMD: 发一条 MM2S 读命令- 地址:
flaw_image_addr + BLOCK_BYTES - 4096 - BTT: 24 字节 (8B 对齐, 3 个完整 beat)
- 地址:
ST_READ_META_WAIT: 等待 stream 数据 + MM2S STS
6.2 元数据接收 (192-bit shift buffer)
beat0 到达: meta_buf <= {128'd0, beat0}
beat1 到达: meta_buf <= {meta_buf[127:0], beat1} = {64'd0, beat0, beat1}
beat2 到达: meta_buf <= {meta_buf[127:0], beat2} = {beat0, beat1, beat2}
提取:
meta_word0 = meta_buf[191:160] = beat0[63:32] = PAN_row
meta_word1 = meta_buf[159:128] = beat0[31:0] = B1_row
meta_word2 = meta_buf[127:96] = beat1[63:32] = B2_row
meta_word3 = meta_buf[95:64] = beat1[31:0] = B3_row
meta_word4 = meta_buf[63:32] = beat2[63:32] = B4_row
meta_buf[31:0] = beat2[31:0] = 抛弃 (多读的4字节)
6.3 按模式提取
mode 1: row_pan = word0, row_b1 = word1, row_b2 = word2, row_b3 = word3, row_b4 = word4
mode 2: row_pan = word0, row_b1~b4 = 0
mode 3: row_pan = 0, row_b1 = word1, row_b2 = word2, row_b3 = word3, row_b4 = word4
7. Phase 2: 辅助数据 DMA
7.1 流程
逐区域遍历 (aux_region_q = 0 → region_count-1):
ST_DMA_AUX_SEL: 设置ac_region_idx, 等待 addr_calc 输出稳定- 若
aux_size == 0: 跳过该区域 (aux_region_q++) - 若
aux_size > 0:ST_DMA_AUX_MM2S_CMD: 发 MM2S 读 aux 数据ST_DMA_AUX_S2MM_CMD: 发 S2MM 写 aux 数据 (exact BTT)ST_DMA_AUX_WAIT_STS: 分步等待两个 STS
7.2 地址计算
aux 源地址 (MM2S 读):
aux_mm2s_src = flaw_image_addr + img_total_q + cumulative_aux_offset
其中:
img_total_q= 所有区域图像数据总大小 (mode 1: 120MB)cumulative_aux_offset= 前面区域的 aux 数据累加
具体:
| region_idx | cumulative_aux_offset |
|---|---|
| 0 (PAN/B1) | 0 |
| 1 (B1/B2) | calc_aux_size(s0) = s0_row × 140 |
| 2 (B2/B3) | calc_aux_size(s0) + calc_aux_size(s1) |
| 3 (B3/B4) | calc_aux_size(s0) + calc_aux_size(s1) + calc_aux_size(s2) |
| 4 (B4) | ... + calc_aux_size(s3) |
其中 sN 通过 slot_row(mode, N, ...) 获得正确波段的 row_count。
aux 目的地址 (S2MM 写):
aux_s2mm_dst = COMPRESS_BASE_ADDR + comp_cumul_q[region_idx]
comp_cumul_q 是预计算的压缩区域累计偏移数组。
7.3 Bypass 数据路径
DMA_AUX 阶段:
mm2s_stream_tready = s2mm_stream_tready ← 直通
s2mm_stream ← mm2s_stream ← MUX
raw_s_axis 无效 (不进入压缩管线)
pack_m_axis_tready = 0 ← 反压压缩输出
7.4 双 STS 分步跟踪
MM2S STS 和 S2MM STS 可能先后到达,使用独立标志:
aux_mm2s_sts_done: mm2s_sts_tvalid && mm2s_sts_tready → 锁存为 1
aux_s2mm_sts_done: s2mm_sts_tvalid && s2mm_sts_tready → 锁存为 1
两标志都为 1 → aux_region_q++, Stage2 跳回 AUX_SEL
8. Phase 3: 图像压缩搬移
8.1 流程
逐区域遍历 (proc_region_q = 0 → region_count-1):
ST_PROC_REGION_SEL: 设置ac_region_idx, 等待 addr_calc- 若
total_imgs == 0: 跳过该区域 - 否则: 初始化
img_idx=0,ac_img_init=1,s2mm_byte_off = aux_size
- 若
- 逐幅图处理:
ST_PROC_IMG_START: 发 S2MM INDET_BTT 命令ST_PROC_IMG_MM2S: 256 条 MM2S cmd, 2-in-flight 流水线ST_PROC_IMG_WAIT_COMP: 等flaw_compress_validST_PROC_IMG_NEXT: 累加压缩字节, 等 S2MM STS; 判断继续或下一区域
8.2 单幅图 MM2S 搬移
每幅图 = 256 行, 每行 512 字节。MM2S 行地址:
cmd[N]: addr = flaw_image_addr + region_image_offset
+ img_col × 512
+ (img_row_base + N) × row_stride
region_image_offset: 当前区域在 DDR 中的起始偏移 (roff_q)img_col: 当前图在行内的列索引 (0..23 PAN, 0..5 MS)img_row_base: 当前图所在图像行的起始行号 (0, 256, 512, ...)row_stride: PAN=12288 (6144×2), MS=3072 (1536×2)
8.3 图像遍历
每个区域内图像按行优先排列:
img_idx img_col (在行内) img_row_base
0 0 0
1 1 0
...
23 (PAN) 23 0
24 0 256
25 1 256
...
img_col 和 img_row_base 用寄存器递增, 无除法:
img_init → img_col=0, img_row_base=0
img_advance:
if img_col < imgs_per_row-1: img_col++
else: img_col=0, img_row_base += 256
8.4 区域完成判断
total_imgs = imgs_per_row × (row_count / 256)
PAN (24): total = (row_count[31:8] << 4) + (row_count[31:8] << 3) // ×(16+8)
MS (6): total = (row_count[31:8] << 2) + (row_count[31:8] << 1) // ×(4+2)
当 img_idx >= total_imgs 时区域完成, proc_region_q++。
9. MM2S 命令流水线
9.1 2-in-flight 策略
阶段 1 — 初始连续发两条:
Cycle 0: 发 cmd[0] (row=0), valid=1
Cycle 1: 握手完成, cmd_idx→1
Cycle 2: 发 cmd[1] (row=1), valid=1
Cycle 3: 握手完成, cmd_idx→2, pending=2
阶段 2 — 收一条 STS, 发一条 cmd (保持 pending=2):
收到 STS_N → 发 cmd[N+2], cmd_idx++
...
阶段 3 — 最后收尾 (cmd_idx=256, 不发新cmd):
收到 STS_254 → pending: 2→1
收到 STS_255 → pending: 1→0 → 跳转 IMG_WAIT_COMP
9.2 CMD 握手协议
发出: if (!mm2s_cmd_tvalid) → mm2s_cmd_tvalid <= 1, 写入 tdata
检测: if (mm2s_cmd_tvalid && mm2s_cmd_tready) → 握手完成, 状态推进
9.3 STS 处理时序
mm2s_sts_tready: 仅在 cmd_idx ≥ 2 时拉高
- cmd_idx=0,1 时 tready=0 → 忽略提前到达的 STS
- cmd_idx≥2 时 tready=1 → 接收 STS
10. S2MM 命令策略
10.1 三种场景
| 场景 | BTT 类型 | 数量 |
|---|---|---|
| 辅助数据 | Exact BTT (= aux_size) | 每区域 1 条 |
| 压缩图像 | INDET_BTT (eof=1, btt=MAX) | 每幅图 1 条 |
10.2 压缩 S2MM 命令
s2mm_cmd:
addr = COMPRESS_BASE_ADDR + region_comp_offset + s2mm_byte_off
btt = MAX_BTT (23'h7F_FFFF)
eof = 1
s2mm_byte_off 每幅图累加 flaw_compress_len,跨区域时重置为 0。
10.3 S2MM 完成检测
在 ST_PROC_IMG_NEXT 中用双标志:
img_flaw_done: flaw_compress_valid 到达 → 累加压缩字节
img_sts_done: s2mm_sts 握手完成 → 更新 img_idx
双标志就绪 → Stage2 跳转 (继续/下一区域)
无论 flaw_compress_valid 和 s2mm_sts 谁先到, 都不会丢数据。
11. 地址计算模块
11.1 核心函数
| 函数 | 公式 | 说明 |
|---|---|---|
mb_offset(mb) |
mb << 20 |
MB → bytes |
calc_aux_size(rc) |
(rc<<7) + (rc<<3) + (rc<<2) |
rc × 140 = rc×(128+8+4) |
slot_row(mode, s, ...) |
查表 | mode 感知的 slot→row_count 映射 |
11.2 slot_row 映射表
mode 1: s=0→pan, 1→b1, 2→b2, 3→b3, 4→b4
mode 2: s=0→pan, 其余→0
mode 3: s=0→b1, 1→b2, 2→b3, 3→b4, 4→0
11.3 移位乘法
所有乘数分解为 2 的幂之和, 使用移位加法:
| 乘数 | 分解 | 实现 |
|---|---|---|
| ×140 | 128+8+4 | (rc<<7)+(rc<<3)+(rc<<2) |
| ×24 (PAN total_imgs) | 16+8 | (row256<<4)+(row256<<3) |
| ×6 (MS total_imgs) | 4+2 | (row256<<2)+(row256<<1) |
| ×12288 (PAN stride) | 8192+4096 | (row<<13)+(row<<12) |
| ×3072 (MS stride) | 2048+1024 | (row<<11)+(row<<10) |
| ×512 (col offset) | 1<<9 | {27'd0, img_col, 9'd0} |
| ×256 (row base) | 1<<8 | img_row_base + 256 (加法) |
11.4 累积和 (阻塞赋值链)
cumul_img[0] = 0;
for s=0..4: cumul_img[s+1] = cumul_img[s] + rraw_q[s]; // 阻塞 =
for s=0..5: img_cumul_q[s] <= cumul_img[s]; // NBA <=
阻塞赋值保证链式累加正确(cumul_img[2] = cumul_img[1] + rraw[1] 使用刚计算的 cumul_img[1])。
12. Bubble Removal 改动
12.1 新增信号
raw_image_done_q — 每幅图 raw data 收完标志
12.2 生命周期
rst_n → raw_image_done_q = 0
enc_frame_start → raw_image_done_q = 0 (新图像开始)
raw_byte_cnt + beat ≥ 131072 → raw_image_done_q = 1 (当前图像 raw data 收完)
12.3 压缩路径替换 (3 处)
spill_is_last_next = comp_s_axis_tlast && raw_image_done_q (原 raw_all_done_q)
accum_last_next = comp_s_axis_tlast && raw_image_done_q (原 raw_all_done_q)
outbuf_last_next = accum_last_next && raw_image_done_q (原 raw_all_done_q)
旋转+spill 算法完全不动。
13. Stream 数据路径
13.1 tready 控制
mm2s_stream_tready:
ST_READ_META_WAIT → 1'b1 (无条件接收 metadata)
bypass_active → s2mm_stream_tready (bypass 直通)
否则 → raw_s_axis_tready (正常压缩路径)
pack_m_axis_tready:
bypass_active → 1'b0 (反压)
否则 → s2mm_stream_tready
13.2 数据转发
raw_s_axis (仅在 !bypass && state != META_WAIT):
mm2s_stream → raw_s_axis → bubble_removal → encoder
s2mm_stream:
bypass_active: mm2s_stream → s2mm_stream (直通, aux 数据)
!bypass: pack_m_axis → s2mm_stream (压缩数据)
14. 信号接口
14.1 顶层输入 (PS → datamover)
| 信号 | 位宽 | 描述 |
|---|---|---|
enable |
1 | 高有效, 上升沿触发全流程 |
flaw_image_valid |
1 | 单周期脉冲, 锁存 enable_latched |
target_bpp |
3 | CCSDS 目标 bpp (0/2/4/7) |
flaw_image_addr |
32 | 128MB 原始数据块首地址 |
flaw_storage_mode |
2 | 存储模式 (1/2/3) |
14.2 顶层输出 (datamover → PS)
| 信号 | 位宽 | 描述 |
|---|---|---|
compressor_busy |
1 | 高 = 处理中 |
compress_pan_row |
32 | PAN 有效行数 |
compress_b1_row |
32 | B1 有效行数 |
compress_b2_row |
32 | B2 有效行数 |
compress_b3_row |
32 | B3 有效行数 |
compress_b4_row |
32 | B4 有效行数 |
s2mm_total_bytes |
32 | S2MM 写入总字节 (aux + 压缩) |
compress_pan_bytes |
32 | PAN 压缩字节 |
compress_b1_bytes |
32 | B1 压缩字节 |
compress_b2_bytes |
32 | B2 压缩字节 |
compress_b3_bytes |
32 | B3 压缩字节 |
compress_b4_bytes |
32 | B4 压缩字节 |
compress_done_valid |
1 | 单周期脉冲, 全流程完成 |
14.3 内部 AXI 接口
| 接口 | 方向 | 描述 |
|---|---|---|
m_axi_mm2s_* |
输出 | AXI4 Read (Datamover → DDR) |
m_axi_s2mm_* |
输出 | AXI4 Write (Datamover → DDR) |
s_axis_mm2s_cmd |
输出 | MM2S 命令 (72-bit) |
m_axis_mm2s_sts |
输入 | MM2S 状态 (8-bit) |
s_axis_s2mm_cmd |
输出 | S2MM 命令 (72-bit) |
m_axis_s2mm_sts |
输入 | S2MM 状态 (32-bit) |
m_axis_mm2s |
输入 | MM2S stream (64-bit) |
s_axis_s2mm |
输出 | S2MM stream (64-bit) |
15. 参数配置
15.1 stream_ctrl 参数
| 参数 | 默认值 | 描述 |
|---|---|---|
AXI_ADDR_W |
32 | AXI 地址宽度 |
CMD_WIDTH |
72 | Datamover 命令宽度 |
STATUS_WIDTH |
8 | MM2S 状态宽度 |
S2MM_STATUS_WIDTH |
32 | S2MM 状态宽度 |
MEMORY_BLOCK_MB |
128 | DDR 块大小 (128 或 64) |
COMPRESS_BASE_ADDR |
32'h4000_0000 | 压缩输出基地址 |
STORAGE_MODE1 |
2'd1 | 模式 1 编码 |
STORAGE_MODE2 |
2'd2 | 模式 2 编码 |
STORAGE_MODE3 |
2'd3 | 模式 3 编码 |
ROWS_PER_IMAGE |
256 | 每幅图行数 |
BYTES_PER_ROW |
512 | 每行字节数 |
BYTES_PER_IMAGE |
131072 | 每幅图字节数 |
15.2 addr_calc 参数
| 参数 | 默认值 | 描述 |
|---|---|---|
AXI_ADDR_W |
32 | 地址宽度 |
MEMORY_BLOCK_MB |
128 | 块大小 |
COMPRESS_BASE |
32'h4000_0000 | 压缩基地址 |
15.3 bubble_removal 参数
| 参数 | 值 | 描述 |
|---|---|---|
RAW_IMAGE_BYTES |
131072 | 每幅图字节数 (内部 localparam) |
附录 A: 关键时序路径
CMD 握手: 2 拍 (发出 + 检测)
STS 握手: 1 拍 (tready 已预先拉高)
图像间隔: ~5 拍 (IMG_NEXT 收尾 + IMG_START 发 S2MM)
DMA_AUX 区域间隔: 2 拍 (等待 addr_calc)
PROC 区域间隔: 2 拍 (等待 addr_calc) + 空区域跳过 0 拍
附录 B: 文件清单
new/ccsds122_datamover.sv ← 顶层集成
new/ccsds122_stream_ctrl.sv ← 主控制器 (重写)
new/ccsds122_addr_calc.sv ← 地址计算器 (新建)
new/ccsds122_compression_top.sv ← 压缩子系统顶层
new/ccsds122_bubble_removal_ctrl.sv ← 气泡消除 (小改)
new/ccsds122_axil_slave.sv ← AXI-Lite 寄存器
uart/ccsds_uart_axi.sv ← UART + AXI 封装
uart/axi_uart_upload.sv ← UART 协议引擎
scripts/upload_compress_download.py ← PC 控制脚本