﻿DOCX D:\Project\spinal_stim\详细设计\spinal_stim_FPGA详细设计文档.docx
paragraphs=284 tables=26 shapes=0
P6|Normal|drawings=0|rels=|脊髓电刺激（Spinal Stimulation）
FPGA 详细设计文档
P9|Normal|drawings=0|rels=|文档版本：V1.0
P10|Normal|drawings=0|rels=|硬件平台：Xilinx XC7Z020CLG400-2 (Zynq-7000)
P11|Normal|drawings=0|rels=|开发工具：Vivado 2023.1
P12|Normal|drawings=0|rels=|FPGA 版本号：32'h20000005
P13|Normal|drawings=0|rels=|系统时钟：100MHz（PS FCLK_CLK0）
P14|Normal|drawings=0|rels=|编制日期：2026年8月
P16|Heading 1|drawings=0|rels=|目录
P17|Normal|drawings=0|rels=|1. 系统框图
P18|Normal|drawings=0|rels=|2. 系统原理
P19|Normal|drawings=0|rels=|3. 时钟框图
P20|Normal|drawings=0|rels=|4. 复位框图
P21|Normal|drawings=0|rels=|5. 各模块详细介绍
P22|Normal|drawings=0|rels=|5.1 eeg_top 模块（EEG 采集顶层）
P23|Normal|drawings=0|rels=|5.2 eeg_top1 / EMG 采集模块
P24|Normal|drawings=0|rels=|5.3 cur_mon_top 模块（电流监测顶层）
P25|Normal|drawings=0|rels=|5.4 upload_top 模块（数据上传）
P26|Normal|drawings=0|rels=|5.5 eeg_emg_upload 模块（EEG/EMG 合并上传）
P27|Normal|drawings=0|rels=|5.6 stim_config 模块（全局配置寄存器）
P28|Normal|drawings=0|rels=|5.7 led_ctrl 模块（LED 控制）
P29|Normal|drawings=0|rels=|5.8 通用工具模块
P30|Normal|drawings=0|rels=|6. PS-PL 通信架构
P31|Normal|drawings=0|rels=|7. 逻辑资源评估
P32|Normal|drawings=0|rels=|8. 附录：寄存器地址映射总表
P34|Heading 1|drawings=0|rels=|1. 系统框图
P35|Normal|drawings=0|rels=|本系统基于 Xilinx Zynq-7000 SoC (XC7Z020CLG400-2) 平台，由 PS（ARM Cortex-A9 处理器系统）和 PL（可编程逻辑）两部分协同工作，实现 64 通道脊髓电刺激控制、EEG/EMG 生物电信号采集、实时电流监测与故障保护等功能。系统整体架构如下图所示：
P37|Normal|drawings=0|rels=|【图1-1 系统整体框图】
P38|Normal|drawings=0|rels=|┌──────────────────────────────────────────────────────────────────────┐
│                        Xilinx Zynq-7000 (XC7Z020)                     │
│                                                                       │
│  ┌──────────────────┐          ┌──────────────────────────────────┐  │
│  │   PS (ARM A9)    │          │          PL (FPGA Logic)          │  │
│  │                  │  AXI     │                                   │  │
│  │  ┌────────────┐  │◄───────►│  ┌─────────────────────────────┐  │  │
│  │  │ DDR3 Ctrl  │  │  BRAM   │  │   Config Registers (BRAM)   │  │  │
│  │  └────────────┘  │  x8     │  │   stim/eeg/emg/cur/msg/imp  │  │  │
│  │                  │         │  └─────────────────────────────┘  │  │
│  │  ┌────────────┐  │  DMA    │                                   │  │
│  │  │ DMA Engine │  │◄───────►│  ┌─────────────────────────────┐  │  │
│  │  └────────────┘  │  AXI-S  │  │   PL 功能模块                │  │  │
│  │                  │         │  │                              │  │  │
│  │  ┌────────────┐  │  GPIO   │  │  ┌──────────┐ ┌──────────┐  │  │  │
│  │  │ AXI GPIO   │──┼────────►│  │  │ eeg_top  │ │ eeg_top1 │  │  │  │
│  │  └────────────┘  │         │  │  │ (EEG采集)│ │ (EMG采集)│  │  │  │
│  │                  │         │  │  └──────────┘ └──────────┘  │  │  │
│  │  ┌────────────┐  │  EMIO   │  │  ┌──────────┐ ┌──────────┐  │  │  │
│  │  │ SPI/GPIO   │──┼────────►│  │  │cur_mon_  │ │upload_   │  │  │  │
│  │  │ Peripherals│  │         │  │  │top(电流) │ │top(上传) │  │  │  │
│  │  └────────────┘  │         │  │  └──────────┘ └──────────┘  │  │  │
│  │                  │         │  │  ┌──────────────────────┐    │  │  │
│  └──────────────────┘         │  │  │ eeg_emg_upload(合并) │    │  │  │
│                              │  │  └──────────────────────┘    │  │  │
│                              │  │  ┌──────────┐ ┌──────────┐  │  │  │
│                              │  │  │stim_     │ │led_ctrl  │  │  │  │
│                              │  │  │config    │ │(LED控制) │  │  │  │
│                              │  │  └──────────┘ └──────────┘  │  │  │
│                              │  └─────────────────────────────┘  │  │
│                              │                                   │  │
│                              │  外部接口                          │  │
│                              │  ┌─────────────────────────────┐  │  │
│                              │  │ ADS1299x5 | AD7689x2 | LED  │  │  │
│                              │  │ ZCHECK    | STIM    | GPIO  │  │  │
│                              │  └─────────────────────────────┘  │  │
└──────────────────────────────────────────────────────────────────────┘
P39|Normal|drawings=0|rels=|系统分为两大功能域：
P40|List Bullet|drawings=0|rels=|（1）PS 域（ARM Cortex-A9）：运行嵌入式 Linux/裸机程序，负责任务调度、数据存储、网络通信和人机交互。通过 AXI BRAM 控制器配置 PL 寄存器，通过 AXI DMA 传输刺激波形和采集数据，通过 EMIO SPI/GPIO 控制部分外设。
P41|List Bullet|drawings=0|rels=|（2）PL 域（FPGA 逻辑）：实现实时信号采集（EEG/EMG）、电流监测与故障保护、数据传输协议封装、刺激控制等硬件加速功能。PL 内部模块通过 BRAM 寄存器与 PS 交互，通过 AXI Stream 总线传输高速数据。
P43|Heading 1|drawings=0|rels=|2. 系统原理
P44|Heading 2|drawings=0|rels=|2.1 整体工作原理
P45|Normal|drawings=0|rels=|脊髓电刺激系统通过植入电极阵列向脊髓特定区域施加微电流刺激，同时采集 EEG/EMG 生物电信号进行闭环反馈控制。系统工作流程如下：
P46|Normal|drawings=0|rels=|(1) PS 端应用程序通过 BRAM 接口配置各模块工作参数（采样率、通道映射、阈值等）；
P47|Normal|drawings=0|rels=|(2) PS 端通过 DMA 将刺激波形数据（DDS 正弦波或脉冲波形）传输至 PL；
P48|Normal|drawings=0|rels=|(3) PL 端 stim_config 解析全局配置，控制 EEG/EMG 采集和上传数据流路由；
P49|Normal|drawings=0|rels=|(4) PL 端 eeg_top/eeg_top1 控制 ADS1299 芯片以 250SPS~16kSPS 采样率采集 32 通道 EEG 和 8 通道 EMG；
P50|Normal|drawings=0|rels=|(5) PL 端 cur_mon_top 控制 AD7689 以 1kSPS 采样率监测 64 通道刺激电流；
P51|Normal|drawings=0|rels=|(6) PL 端 cur_monitor 实时比较电流值与预设阈值，检测过流/短路等故障并产生中断；
P52|Normal|drawings=0|rels=|(7) PL 端 upload_top 将采集数据按 Intan RHD 或自定义 QL 协议封装打包；
P53|Normal|drawings=0|rels=|(8) PL 端 eeg_emg_upload 合并 EEG/EMG 数据流并计算 CRC16 校验；
P54|Normal|drawings=0|rels=|(9) 合并后的数据通过 DMA S2MM 通道传输至 PS 端 DDR 内存，供后续处理。
P55|Heading 2|drawings=0|rels=|2.2 工作模式
P56|Normal|drawings=0|rels=|系统支持以下工作模式，由 stim_config 模块的 eeg_emg_sel 寄存器控制：
P58|Heading 2|drawings=0|rels=|2.3 数据流架构
P59|Normal|drawings=0|rels=|系统内部数据流路径如下：
P60|Normal|drawings=0|rels=|┌─────────┐     DMA MM2S      ┌──────────────┐
│ PS DDR  │ ────(32bit)──────►│ stim_config  │
└─────────┘                    └──────────────┘

┌─────────┐   ADS1299 SPI    ┌──────────────┐   AXI Stream    ┌──────────────┐
│ADS1299x5│ ◄──────────────► │   eeg_top /  │ ───(32bit)─────►│  upload_top  │
└─────────┘                   │   eeg_top1   │                 └──────┬───────┘
                              └──────────────┘                        │
                                                                      ▼
┌─────────┐   AD7689 SPI     ┌──────────────┐   AXI Stream    ┌──────────────┐
│ AD7689  │ ◄──────────────► │ cur_mon_top  │ ───(32bit)─────►│eeg_emg_upload│
└─────────┘                   └──────┬───────┘                 └──────┬───────┘
                                     │ 中断(过流/故障)                │
                                     ▼                                │
                              ┌──────────────┐                        │
                              │   PS GIC     │                        │
                              └──────────────┘                        │
                                                                      │
                              ┌──────────────────────────────────────┘
                              ▼  DMA S2MM (8bit)
                        ┌─────────┐
                        │ PS DDR  │
                        └─────────┘
P62|Heading 1|drawings=0|rels=|3. 时钟框图
P63|Normal|drawings=0|rels=|系统采用单一全局时钟方案。所有 PL 逻辑模块共用同一 100MHz 时钟，来自 PS 端 FCLK_CLK0 输出。设计中没有使用 MMCM/PLL 进行时钟倍频或分频（原设计的 clk_wiz_0 已注释不用），简化了时钟域交叉和时序收敛复杂度。
P64|Normal|drawings=0|rels=|PS (ARM Cortex-A9)
                               │
                     FCLK_CLK0 │ 100MHz
                               ▼
                    ┌─────────────────────┐
                    │   clk (100MHz)      │
                    │   全局 PL 时钟网络   │
                    └──────────┬──────────┘
                               │
          ┌────────────────────┼────────────────────┐
          │                    │                    │
          ▼                    ▼                    ▼
   ┌─────────────┐    ┌─────────────┐     ┌─────────────┐
   │  分频器      │    │  BRAM 接口   │     │  AXI Stream│
   │  /250       │    │  (异步时钟)  │     │  (同步时钟)  │
   └──────┬──────┘    └─────────────┘     └──────────── ┘
          │
          ▼
   ┌─────────────┐
   │stim_clk400k │
   │  400kHz 输出 │
   └─────────────┘
P66|Caption|drawings=0|rels=|【图3-1 时钟框图】
P68|Normal|drawings=0|rels=|关键设计要点：
P69|List Bullet|drawings=0|rels=|BRAM 接口使用独立的 bram_*_clk（由 PS 端 BRAM 控制器产生），与 PL 主时钟 clk 异步。BRAM 为双端口真双口 RAM，天然支持跨时钟域读写。
P70|List Bullet|drawings=0|rels=|stim_clk400k 由简单的 8 位计数器从 100MHz 分频产生，cnt 范围 0~249，cnt≥125 时输出高电平，实现 50% 占空比。
P71|List Bullet|drawings=0|rels=|SPI 时钟通过各模块内部计数器从 clk 分频：ADS1299 的 SPI 时钟为 100MHz/(CLK_DIV+1)=25MHz（CLK_DIV=3），AD7689 的 SPI 时钟为 100MHz/6≈16.7MHz（CLK_DIV=6）。
P73|Heading 1|drawings=0|rels=|4. 复位框图
P74|Normal|drawings=0|rels=|系统复位方案采用全局异步复位、同步释放的设计模式。复位源为 PS 端产生的低电平有效 复位信号 rst_n。所有 PL 模块统一连接该复位信号，PS 端通过 rst_ps7_0_50M 复位生成器 以及 AXI Interconnect 的互联复位（ARESETN）确保上电后各 IP 有序复位。
P75|Normal|drawings=0|rels=|┌─────────────────────────┐
                      │   PS7 Processing System  │
                      │                          │
                      │   FCLK_RESET0_N          │
                      └────────────┬────────────┘
                                   │
                                   ▼
                      ┌─────────────────────────┐
                      │  rst_ps7_0_50M           │
                      │  (Processor System Reset) │
                      │  POLARITY = ACTIVE_LOW   │
                      └────────────┬────────────┘
                                   │
                                   │  rst_n (低电平有效)
                                   ▼
          ┌────────────────────────┼────────────────────────┐
          │                        │                        │
          ▼                        ▼                        ▼
   ┌─────────────┐        ┌─────────────┐          ┌─────────────┐
   │  eeg_top    │        │ cur_mon_top │          │ upload_top  │
   │  (EEG采集)  │        │ (电流监测)   │          │ (数据上传)  │
   └─────────────┘        └─────────────┘          └─────────────┘
          │                        │                        │
          ▼                        ▼                        ▼
   ┌─────────────┐        ┌─────────────┐          ┌─────────────┐
   │  eeg_top1   │        │ stim_config │          │ led_ctrl    │
   │  (EMG采集)  │        │ (全局配置)  │          │ (LED控制)   │
   └─────────────┘        └─────────────┘          └─────────────┘
P77|Caption|drawings=0|rels=|【图4-1 复位框图】
P78|Normal|drawings=0|rels=|复位设计要点：
P79|List Bullet|drawings=0|rels=|复位极性：低电平有效（ACTIVE_LOW），所有 PL 模块使用 `if (!rst_n)` 的异步复位描述风格。
P80|List Bullet|drawings=0|rels=|复位释放：PS 端在系统上电后、时钟稳定后释放复位，PL 端无需额外同步处理。
P81|List Bullet|drawings=0|rels=|各模块内部无局部复位生成逻辑，统一使用全局 rst_n，保证复位行为的确定性和可预测性。
P82|List Bullet|drawings=0|rels=|BRAM 控制器的复位（bram_*_rst）由 PS 端独立控制，与 PL 主复位 rst_n 独立。
P84|Heading 1|drawings=0|rels=|5. 各模块详细介绍
P85|Heading 2|drawings=0|rels=|5.1 eeg_top 模块（EEG 采集顶层）
P86|Heading 3|drawings=0|rels=|5.1.1 模块概述
P87|Normal|drawings=0|rels=|eeg_top 是 EEG 信号采集的顶层模块，负责控制 4 片 ADS1299 生物电采集芯片（通过 2 条 SPI 总线，每条总线挂载 2 片），实现最多 32 通道 EEG 信号的同步采集。模块内部集成了 BRAM 配置寄存器、SPI 传输调度、SPI 主控制器、数据接口适配和数据上传汇聚等功能。
P88|Heading 3|drawings=0|rels=|5.1.2 输入输出接口
P90|Heading 3|drawings=0|rels=|5.1.3 模块原理
P91|Normal|drawings=0|rels=|eeg_top 模块内部包含 4 个子模块，协同完成从配置到数据输出的完整流程：
P92|List Number|drawings=0|rels=|eeg_config：BRAM 配置寄存器模块，提供 ER（使能寄存器）、CR（控制寄存器）、SR（状态寄存器）、TR（发送寄存器数组）、RR（接收寄存器数组）等寄存器接口，PS 端通过 BRAM 读写这些寄存器来控制 ADS1299 的行为。
P93|List Number|drawings=0|rels=|ads1299_arrange（×2）：SPI 传输调度状态机，每条 SPI 总线一个实例。负责将 BRAM 中的配置命令组装成 AXI Stream 格式的 SPI 传输请求，并调度配置模式（SEND）和连续采集模式（RDATAC）的切换。
P94|List Number|drawings=0|rels=|ads1299_if（×2）：SPI 接口适配模块，每条 SPI 总线一个实例。内部例化 ads1299_spi 全双工 SPI 主控制器（SPI 时钟 25MHz），同时负责将原始 SPI 字节流组装为 24 位采样的结构化数据。
P95|List Number|drawings=0|rels=|eeg_upload：数据上传汇聚模块，将 2 条 SPI 总线的采集数据合并为单路 AXI Stream 输出，按芯片顺序排列通道数据。
P97|Normal|drawings=0|rels=|工作流程：PS 通过 BRAM 写入配置命令 → arrange 状态机检测到使能后发起 SPI 传输 → ads1299_spi 驱动硬件 SPI 总线与 ADS1299 芯片通信 → ADS1299 返回 27 字节数据块（每个芯片 24 字节采样 + 3 字节状态）→ ads1299_if 将字节拆分为 24 位通道数据 → eeg_upload 按顺序输出到 AXI Stream 总线。
P98|Heading 3|drawings=0|rels=|5.1.4 模块状态机
P99|List Bullet|drawings=0|rels=|5.1.4.1 ads1299_arrange 状态机
P100|Normal|drawings=0|rels=|ads1299_arrange 模块是核心调度单元，其状态机包含两种工作路径：
P103|List Bullet|drawings=0|rels=|状态转移条件：
P104|List Bullet|drawings=0|rels=|IDLE → TRANS_ST：send_enable=1 且 send_cs_n 非全 1（有芯片被选中）
P105|List Bullet|drawings=0|rels=|IDLE → RDATAC_ST：rdatac_enable=1（记录使能）
P106|List Bullet|drawings=0|rels=|TRANS_ST → WAIT_ST：发送长度 send_length 字节后自动跳转
P107|List Bullet|drawings=0|rels=|WAIT_ST → IDLE：等待 SPI 传输完成（t_tready 恢复）后返回
P108|List Bullet|drawings=0|rels=|REVC_1_ST / REVC_2_ST → RDATAC_ST：上传轮次完成或 rdatac_enable 清零
P110|List Bullet|drawings=0|rels=|5.1.4.2 ads1299_spi 状态机
P111|Normal|drawings=0|rels=|SPI 主控制器为标准 4 态 SPI 状态机：
P113|Heading 3|drawings=0|rels=|5.1.5 模块寄存器介绍
P116|List Bullet|drawings=0|rels=|EEG_CR 寄存器格式详解：
P117|Normal|drawings=0|rels=|EEG_CR[31]     : record_enable   = 1 使能 RDATAC 连续采集模式
EEG_CR[1:0]    : SPI0 芯片选择   (00=全不选, 01=芯片0, 10=芯片1, 11=双芯片)
EEG_CR[3:2]    : SPI0 传输长度   (00=1字节, 01=2字节, 10=3字节, 11=4字节)
EEG_CR[5:4]    : SPI1 芯片选择
EEG_CR[7:6]    : SPI1 传输长度
P118|Heading 3|drawings=0|rels=|5.1.6 模块仿真
P119|Normal|drawings=0|rels=|eeg_top 模块具有完整的仿真验证环境（eeg_top_tb.v），仿真架构如下：
P120|List Bullet|drawings=0|rels=|DUT：eeg_top 模块例化（参数 CHIPSET_QTY=8, SPIS_QTY=4）
P121|List Bullet|drawings=0|rels=|ADS1299 模型：8 个 ads1299_mod 实例，模拟真实芯片的 SPI 从设备行为
P122|List Bullet|drawings=0|rels=|BRAM 操作 Task：提供 write_bram_eeg() 和 read_bram_eeg() 函数模拟 PS 端寄存器访问
P123|List Bullet|drawings=0|rels=|仿真流程：复位释放 → SDATAC 配置 → 读 ID 验证 → 写寄存器配置 → RDATAC 连续采集
P124|List Bullet|drawings=0|rels=|MISO 信号路由：通过 generate 语句模拟 2 条 SPI 总线各自 2 片芯片的 MISO 线与逻辑
P125|Heading 3|drawings=0|rels=|5.1.7 模块信号时序框图
P127|Caption|drawings=0|rels=|【图5.1-1 ADS1299 SPI 配置时序】
P128|Normal|drawings=0|rels=|┌──────┐              ┌──────┐              ┌──────┐
clk      ┤      └──────────────┘      └──────────────┘      └──
         ┌┐                                                ┌┐
cs_n     ┘└────────────────────────────────────────────────┘└──
             ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐
sclk     ────┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──────────────
             ┌────────────────────────────────────────────┐
mosi     ────┘ D7  D6  D5  D4  D3  D2  D1  D0          └──────
             ┌────────────────────────────────────────────┐
miso     ────┘ D7  D6  D5  D4  D3  D2  D1  D0          └──────

  <──T_SCCS──> <──────────── 8-bit SPI 传输 ────────────> <T_SCH>
  (2000ns)                                                (600ns)
P130|Caption|drawings=0|rels=|【图5.1-2 RDATAC 连续采集时序】
P131|Normal|drawings=0|rels=|drdy_n    ───┐     ┌──────────────────────────┐     ┌─────────
             └─────┘                          └─────┘
                  │<── 检测下降沿，启动采集 ──>│

state     ────────RDATAC_ST──┬──REVC_1_ST──┬──REVC_2_ST──┬──
                              │  读芯片0     │  读芯片1     │
                              │  (27字节)    │  (27字节)    │

cnv_start ──────────────────┐┌─────────────┐┌─────────────┐──
                             ┘└─────────────┘└─────────────┘

axis_tdata ───────────────────X──Ch0~Ch7──X──Ch8~Ch15─X──────
axis_tlast ───────────────────┐              ┌┐             ──
                               └──────────────┘└─────────────
P133|Heading 2|drawings=0|rels=|5.2 eeg_top1 / EMG 采集模块
P134|Heading 3|drawings=0|rels=|5.2.1 与 eeg_top 的差异
P135|Normal|drawings=0|rels=|eeg_top1 是 eeg_top 的变体，专用于 EMG（肌电图）信号采集。与 eeg_top 的主要差异为：
P137|Heading 3|drawings=0|rels=|5.2.2 输入输出接口
P138|Normal|drawings=0|rels=|eeg_top1 接口与 eeg_top 基本一致，差异点如下：
P140|Normal|drawings=0|rels=|EMG 复位信号：顶层额外提供 emg_ads1299_reset_n 和 emg_ads1299_pwdn_n，当前设计中硬连线为 1（常高），即芯片不复位、不进入低功耗模式。
P141|Heading 3|drawings=0|rels=|5.2.3 状态机与寄存器
P142|Normal|drawings=0|rels=|eeg_top1 内部复用与 eeg_top 相同的子模块（eeg_config、ads1299_arrange、ads1299_if、eeg_upload），状态机和寄存器映射基本一致。主要不同在于：
P143|List Bullet|drawings=0|rels=|ads1299_arrange 只例化 1 个实例（for SPIS_QTY=1）
P144|List Bullet|drawings=0|rels=|ads1299_if 只例化 1 个实例，SPI_SLAVE_QTY=1
P145|List Bullet|drawings=0|rels=|CR 控制寄存器中每 SPI 总线的控制域从 4 位扩展为 5 位：send_cs_n[1:0] + send_length[2:0]
P146|List Bullet|drawings=0|rels=|数据输出到 axis_emg_tdata_tmp，经过 diff_pkt_data_sel 选择后输出
P148|Heading 2|drawings=0|rels=|5.3 cur_mon_top 模块（电流监测顶层）
P149|Heading 3|drawings=0|rels=|5.3.1 模块概述
P150|Normal|drawings=0|rels=|cur_mon_top 是 64 通道刺激电流监测的顶层模块，通过控制 AD7689 16 位 8 通道 SAR ADC 实现多通道电流采集，并集成电流故障检测引擎，实时监测过流和短路等异常情况。模块支持 64 个通道的独立阈值配置、通道映射和故障锁存。
P151|Heading 3|drawings=0|rels=|5.3.2 输入输出接口
P153|Heading 3|drawings=0|rels=|5.3.3 模块原理
P154|Normal|drawings=0|rels=|cur_mon_top 包含以下子模块，形成完整的电流采集与监测数据链：
P155|List Number|drawings=0|rels=|cur_mon_config：BRAM 配置寄存器模块，提供使能、ADC 配置、采集周期、阈值和通道映射等寄存器。支持 64 通道独立配置。
P156|List Number|drawings=0|rels=|ad7689_dual_ctrl：AD7689 转换时序控制。产生 CNV 方波信号控制 ADC 的转换/采集周期，默认周期 1ms（100000 个时钟周期），在采集阶段通过 SPI 发送通道配置字。
P157|List Number|drawings=0|rels=|ad7689_dual_if：AD7689 SPI 采集接口。实现 16 位 SPI 通信（CLK_DIV=6，SPI 时钟约 16.7MHz），自动切换 8 个通道的 CFG 配置字。输出 24 位 AXI Stream（{通道号[7:0], ADC数据[15:0]}）。
P158|List Number|drawings=0|rels=|acq_collect：采集数据收集器。汇总 8 个通道的 ADC 采样数据，更新 cur_rt（实时电流）寄存器。
P159|List Number|drawings=0|rels=|cur_ch_map：通道映射模块。将物理 ADC 通道映射到逻辑刺激通道，支持任意顺序排列。
P160|List Number|drawings=0|rels=|cur_monitor：电流故障检测引擎。扫描 64 通道，比较实时电流与阈值，使用 3 个并行加法器 IP 计算总电流、正向总电流、负向总电流。
P161|Heading 3|drawings=0|rels=|5.3.4 模块状态机
P162|List Bullet|drawings=0|rels=|5.3.4.1 cur_monitor 故障检测状态机
P165|List Bullet|drawings=0|rels=|故障类型编码 flt_bits[3:0]：
P166|Normal|drawings=0|rels=|flt_bits[0] : cur_flt_ch    = 通道级故障（任意通道电流超过该通道阈值）
flt_bits[1] : cur_flt_total = 总电流故障（全部通道绝对值之和超过 THR_TOTAL_CUR）
flt_bits[2] : cur_flt_pos   = 正向电流故障（正向通道电流之和超过 THR_POS_CUR）
flt_bits[3] : cur_flt_neg   = 负向电流故障（负向通道电流绝对值之和超过 THR_NEG_CUR）
P168|List Bullet|drawings=0|rels=|5.3.4.2 ad7689_dual_if SPI 采集状态机
P170|Heading 3|drawings=0|rels=|5.3.5 模块寄存器介绍
P172|Heading 3|drawings=0|rels=|5.3.6 模块仿真
P173|Normal|drawings=0|rels=|cur_mon_top 仿真环境（cur_mon_top_tb.v）特点：
P174|List Bullet|drawings=0|rels=|参数 CH_QTY=16（仿真模式下减少通道数以加快仿真速度）
P175|List Bullet|drawings=0|rels=|例化 2 个 ad7689_mod 仿真模型，init_data 设置为 i*-256 产生不同的测试数据
P176|List Bullet|drawings=0|rels=|依次配置 CFG 寄存器、采集周期、通道映射、阈值和使能
P177|List Bullet|drawings=0|rels=|仿真时长 6ms，覆盖多轮采集和故障检测周期
P178|Heading 3|drawings=0|rels=|5.3.7 模块信号时序框图
P180|Caption|drawings=0|rels=|【图5.3-1 AD7689 采集时序】
P181|Normal|drawings=0|rels=|cnv       ───┐                    ┌──────────────────────────┐
             └────────────────────┘                          └──
              │<── 转换阶段 ────>│<────── 采集阶段 ──────────>│
              │   (T_DEAD=250)   │    (发送 CFG + 读数据)      │

sck       ────────────────────────┐┌─┐┌─┐┌─┐┌─┐..┌─┐┌─┐──────
                                   ┘└─┘└─┘└─┘└─┘  └─┘└─┘
                                   │<── 16-bit SPI ──>│

mosi      ──────────────────────────────────────────────────
                  ┌──────────────────────────────────┐
miso      ────────┘ D15 D14 ............... D1 D0   └─────────

tlast     ──────────────────────────────────┐┌─────────────────
                                             ┘└
                                            (ch=7)
P183|Heading 2|drawings=0|rels=|5.4 upload_top 模块（数据上传）
P184|Heading 3|drawings=0|rels=|5.4.1 模块概述
P185|Normal|drawings=0|rels=|upload_top 是数据上传的顶层模块，负责将采集到的 EEG/EMG 数据按指定协议封装打包，通过 AXI Stream 接口输出至 DMA 通道。模块支持两种数据协议：Intan RHD 协议和自定义 QL 协议，可通过 BRAM 寄存器动态切换。
P186|Heading 3|drawings=0|rels=|5.4.2 输入输出接口
P188|Heading 3|drawings=0|rels=|5.4.3 模块原理
P189|Normal|drawings=0|rels=|upload_top 内部包含 5 个子模块：
P190|List Number|drawings=0|rels=|run_time：64 位毫秒级运行时间计数器，每 100000 个时钟周期（1ms）产生一个脉冲，为数据包提供时间戳。
P191|List Number|drawings=0|rels=|upload_config：BRAM 配置寄存器，提供协议选择、通道映射、采样率等配置参数。
P192|List Number|drawings=0|rels=|upload_sort：通道排序模块。根据 ch_mapping2pc_array 将 PL 内部通道号重新映射到 PC 端逻辑通道号，根据 upload_ch_array 位图过滤被禁用的通道。
P193|List Number|drawings=0|rels=|upload_protocol_intan：Intan RHD 协议编码器。将通道数据封装为 Intan RHD 2000 数据包格式（含 Magic Number、时间戳、通道数据）。
P194|List Number|drawings=0|rels=|upload_protocol_ql：QL 自定义协议编码器。将通道数据封装为自定义数据包格式（含帧头、帧序号、通道数、采样数据、CRC 校验）。
P196|List Bullet|drawings=0|rels=|协议选择由 BRAM 配置寄存器的 protocol_sel 位控制：
P197|List Bullet|drawings=0|rels=|protocol_sel = 0：选择 Intan RHD 协议路径
P198|List Bullet|drawings=0|rels=|protocol_sel = 1：选择 QL 自定义协议路径
P199|List Bullet|drawings=0|rels=|两个协议引擎并行运行，由顶层 MUX 根据 protocol_sel 选择输出数据流。
P200|Heading 3|drawings=0|rels=|5.4.4 数据包结构
P201|List Bullet|drawings=0|rels=|Intan RHD 协议数据包结构：
P202|Normal|drawings=0|rels=|[Header: Magic Number (4 bytes)]
[Header: Timestamp (4 bytes)]
[Header: NumAmplifierCh (2 bytes)]
[Amplifier Data: Ch0 (2 bytes)] [Ch1 (2 bytes)] ... [ChN (2 bytes)]
[Aux Data: Ch0 (2 bytes)] [Ch1 (2 bytes)] ...
[DC/Stim Data: Ch0 (2 bytes)] ...
P204|List Bullet|drawings=0|rels=|QL 自定义协议数据包结构：
P205|Normal|drawings=0|rels=|[Header: 0xAA 0x55 (2 bytes)]
[Frame ID: (2 bytes)]
[Channel Count: (1 byte)]
[Data: Ch0 (3 bytes)] [Ch1 (3 bytes)] ...
[CRC16: (2 bytes)]
P206|Heading 3|drawings=0|rels=|5.4.5 模块仿真
P207|Normal|drawings=0|rels=|upload_top 的仿真集成在 pl_top_tb 系统级仿真中，通过完整的 PS-PL 数据链路验证 上传功能的正确性。仿真覆盖：Intan 协议封装验证、QL 协议封装验证、protocol_sel 动态切换、数据格式正确性检查。
P209|Heading 2|drawings=0|rels=|5.5 eeg_emg_upload 模块（EEG/EMG 合并上传）
P210|Heading 3|drawings=0|rels=|5.5.1 模块概述
P211|Normal|drawings=0|rels=|eeg_emg_upload 是 EEG 和 EMG 数据合并上传的专用模块。它将两个独立的 upload_top 输出流（EEG 和 EMG）合并为单一数据流，并计算 CRC16 校验。模块支持三种工作模式：仅 EEG、仅 EMG、EEG+EMG 合并上传。
P212|Heading 3|drawings=0|rels=|5.5.2 输入输出接口
P214|Heading 3|drawings=0|rels=|5.5.3 模块原理
P215|Normal|drawings=0|rels=|合并策略：
P216|List Number|drawings=0|rels=|仅 EEG 模式（eeg_emg_sel=2'b01）：直接透传 EEG 数据，对 EEG 数据流计算 CRC16。
P217|List Number|drawings=0|rels=|仅 EMG 模式（eeg_emg_sel=2'b10）：直接透传 EMG 数据，对 EMG 数据流计算 CRC16。
P218|List Number|drawings=0|rels=|合并模式（eeg_emg_sel=2'b11）：先传输 EEG 完整数据包（总包数去掉尾部），EEG 完成后从 FIFO 中读取 EMG 数据（去除 85 字节包头），拼接后统一计算 CRC16。
P220|Normal|drawings=0|rels=|CRC16 算法：采用标准 CRC-16-USB 多项式（0x8005），初始值 0xFFFF。每个字节更新一次，尾部/CRC 区域暂停计算。CRC16 计算采用组合逻辑的 crc16_d8() 函数实现，单周期完成 8 位并行 CRC 更新。
P221|Heading 3|drawings=0|rels=|5.5.4 内部 FIFO
P222|Normal|drawings=0|rels=|模块使用 fifo_generator_0（9 位宽，{tlast, data[7:0]}）缓冲 EMG 数据。在合并模式下，EEG 数据发送完毕后，从 FIFO 中读取缓冲的 EMG 数据进行拼接输出。
P224|Heading 2|drawings=0|rels=|5.6 stim_config 模块（全局配置寄存器）
P225|Heading 3|drawings=0|rels=|5.6.1 模块概述
P226|Normal|drawings=0|rels=|stim_config 是全局刺激配置模块（实际为全局系统参数配置模块），通过 BRAM 接口提供 系统级参数寄存器，控制 EEG/EMG 数据流选择和数据包大小等全局参数。
P227|Heading 3|drawings=0|rels=|5.6.2 输入输出接口
P229|Heading 3|drawings=0|rels=|5.6.3 模块寄存器介绍
P232|Heading 2|drawings=0|rels=|5.7 led_ctrl 模块（LED 控制）
P233|Heading 3|drawings=0|rels=|5.7.1 模块概述
P234|Normal|drawings=0|rels=|led_ctrl 是 LED 指示灯控制模块，根据 PS 端下发的命令控制 LED 的亮灭、闪烁和呼吸效果。
P235|Heading 3|drawings=0|rels=|5.7.2 输入输出接口
P237|Heading 3|drawings=0|rels=|5.7.3 LED 控制命令
P240|Normal|drawings=0|rels=|模块内部例化 pwm_gen（通用 PWM 发生器）和 breath_gen（呼吸灯效果 PWM）两个子模块，根据 cmd 选择不同的 LED 驱动源。
P242|Heading 2|drawings=0|rels=|5.8 通用工具模块
P244|Heading 3|drawings=0|rels=|5.8.1 spi_full_duplex_master（通用 SPI 主控制器）
P245|Heading 4|drawings=0|rels=|输入输出接口
P248|List Bullet|drawings=0|rels=|参数配置示例：
P249|List Bullet|drawings=0|rels=|ADS1299 实例：CLK_DIV=3（SPI 时钟=25MHz），DATA_WIDTH=8，NO_OF_SLAVES=1
P250|List Bullet|drawings=0|rels=|AD7689 实例：CLK_DIV=6（SPI 时钟≈16.7MHz），DATA_WIDTH=16，NO_OF_SLAVES=1
P251|List Bullet|drawings=0|rels=|RHS2116 实例：CLK_DIV=4（SPI 时钟=20MHz），DATA_WIDTH=32，NO_OF_SLAVES=1（已禁用）
P253|Heading 1|drawings=0|rels=|6. PS-PL 通信架构
P254|Normal|drawings=0|rels=|PS 与 PL 之间的通信通过 Vivado Block Design（design_a9_1.bd）中的 IP 互连实现，主要包括 BRAM 控制寄存器组、AXI DMA 数据通道和 GPIO/SPI 外设三类接口。
P255|Heading 2|drawings=0|rels=|6.1 BRAM 控制寄存器组
P258|Normal|drawings=0|rels=|每个 BRAM 控制器为 AXI4-Lite 接口的 Block RAM Controller IP，生成双端口真双口 RAM。端口 A 连接 PS 端 AXI Interconnect，端口 B 连接 PL 端各模块的 BRAM 配置接口。BRAM 的端口 B 时钟（bram_*_clk）由 PS 端控制器产生，与 PL 主时钟 clk 异步。
P259|Heading 2|drawings=0|rels=|6.2 DMA 数据通道
P261|Heading 2|drawings=0|rels=|6.3 SPI 外设（PS 端 EMIO 控制）
P264|Normal|drawings=0|rels=|注意：上述 SPI 外设由 PS 端通过 EMIO SPI 控制器直接控制，绕过 PL 端逻辑。这种设计允许PS 端独立管理刺激和阻抗检测功能，与 PL 端实时采集数据通道分离。
P266|Heading 1|drawings=0|rels=|7. 逻辑资源评估
P267|Normal|drawings=0|rels=|以下资源评估基于 Vivado 综合和实现后的报告数据，并结合模块规模进行的分析估算。目标器件：XC7Z020CLG400-2（Zynq-7000，约 85K 逻辑单元）。
P268|Heading 2|drawings=0|rels=|7.1 各模块资源估算
P270|Heading 2|drawings=0|rels=|7.2 资源汇总与利用率
P273|List Bullet|drawings=0|rels=|资源评估结论：
P274|List Bullet|drawings=0|rels=|整体资源利用率较低（LUT<10%，FF<7%，DSP<2%），为后续功能扩展（如重新启用 RHS2116 刺激模块、DDS 波形发生器、触发检测等）预留了充足的逻辑资源。
P275|List Bullet|drawings=0|rels=|BRAM 利用率约 53.6%，主要消耗在 PS 端的 8 个 BRAM 控制器（每个 8KB=2 个 36Kb BRAM，共约 64 个）和各模块配置 BRAM。如果将来需要更多 BRAM 空间，器件仍有约 65 个 36Kb BRAM 可用。
P276|List Bullet|drawings=0|rels=|DSP 资源几乎未使用（当前设计中仅 cur_monitor 的 3 个加法器 IP 使用 DSP48），说明波形生成（DDS）和数学运算（乘法器）等功能尚未在 PL 端展开。
P277|List Bullet|drawings=0|rels=|PS 端资源（ARM Cortex-A9、DDR3 控制器、DMA 引擎等）占用了器件的大部分硬核资源，PL 端逻辑资源余量充足。
P279|Heading 1|drawings=0|rels=|8. 附录：寄存器地址映射总表
P280|Normal|drawings=0|rels=|下表汇总了所有 BRAM 映射模块的寄存器地址空间分配：
P283|Caption|drawings=0|rels=|--- 文档结束 ---
TABLE 0 4x3
模式 | eeg_emg_sel[1:0] | 说明
仅 EEG 采集 | 2'b01 | 仅上传 EEG 数据（32通道），EMG 通道关闭
仅 EMG 采集 | 2'b10 | 仅上传 EMG 数据（8通道），EEG 通道关闭
EEG+EMG 合并 | 2'b11 | EEG 和 EMG 数据合并上传，先 EEG 后 EMG
TABLE 1 5x5
时钟信号 | 频率 | 来源 | 用途 | 备注
clk | 100 MHz | PS FCLK_CLK0 | 所有 PL 逻辑主时钟 | 时钟周期 10ns
stim_clk400k | 400 kHz | clk/250 分频 | 刺激同步时钟输出 | 占空比 50%，cnt≥125 翻高
bram_*_clk | 异步 | PS BRAM 控制器 | BRAM 配置接口时钟 | 独立于 clk 的异步时钟域
clk_8m (未使用) | 8 MHz | clk_wiz_0 (已注释) | 预留 8MHz 时钟 | 当前设计中已禁用
TABLE 2 20x4
信号名 | 方向 | 位宽 | 说明
clk | input | 1 | 系统主时钟 100MHz
rst_n | input | 1 | 低电平有效异步复位
bram_addr | input | 13 | BRAM 地址总线
bram_clk | input | 1 | BRAM 接口时钟（独立于 clk）
bram_din | input | 32 | BRAM 写数据
bram_dout | output | 32 | BRAM 读数据
bram_en | input | 1 | BRAM 使能
bram_we | input | 4 | BRAM 字节写使能
axis_record_tdata | output | 32 | 采集数据 AXI Stream 输出
axis_record_tlast | output | 1 | 数据包结束标志
axis_record_tready | input | 1 | 下游模块就绪
axis_record_tvalid | output | 1 | 数据有效
cs | output | 4 | 4 片 ADS1299 SPI 片选
sclk | output | 2 | 2 条 SPI 总线时钟
mosi | output | 2 | 2 条 SPI 总线 MOSI
miso | input | 2 | 2 条 SPI 总线 MISO
drdy | input | 2 | 2 条 SPI 总线数据就绪（下降沿有效）
start | output | 2 | ADS1299 转换启动
debug_sig | output | 4 | 调试信号
TABLE 3 7x3
状态 | 编码 | 说明
IDLE | 0 | 空闲，等待 send_enable 或 rdatac_enable 触发
TRANS_ST | 1 | 配置传输状态：逐字节发送配置数据到 ADS1299
WAIT_ST | 2 | 等待传输完成：等待 SPI 从设备释放
RDATAC_ST | 3 | 连续采集状态：发送 RDATAC 命令使芯片进入连续模式
REVC_1_ST | 4 | 接收数据状态 1：等待 drdy 下降沿，读取芯片 0 的数据
REVC_2_ST | 5 | 接收数据状态 2：等待 drdy 下降沿，读取芯片 1 的数据
TABLE 4 5x2
状态 | 说明
IDLE | 空闲，等待 AXI Stream 输入有效数据（t_tvalid=1）
TRANS_ST | 传输状态：逐 bit 驱动 SPI 时钟和数据线
SCCS_ST | 片选建立时间：CS 拉低后等待 T_SCCS（200 时钟周期）
CSH_ST | 片选保持时间：传输完成后等待 T_SCH（60 时钟周期）
TABLE 5 6x5
地址偏移 | 寄存器名 | 位宽 | 访问 | 说明
0x0040 | EEG_ER | 32 | R/W | 使能寄存器：bit[i]=1 使能第 i 条 SPI 总线
0x0044 | EEG_CR | 32 | R/W | 控制寄存器：bit31=记录使能，bit[3:0]=芯片选择掩码（每条 SPI）
0x0048 | EEG_SR | 32 | R/W | 状态寄存器：读清除事件标志
0x0100~0x01FF | EEG_TR[n] | 32×N | R/W | 发送寄存器数组：每 SPI 总线 4 字节配置数据
0x0200~0x02FF | EEG_RR[n] | 32×N | R | 接收寄存器数组：每 SPI 总线 4 字节读取数据
TABLE 6 11x3
特性 | eeg_top (EEG) | eeg_top1 (EMG)
芯片数量 | 4 片 ADS1299 | 1 片 ADS1299
SPI 总线数 | 2 条 | 1 条
每总线从设备 | 2 个 | 1 个
参数 CHIPSET_QTY | 4 | 1 (EMG_CHIPSET_QTY)
参数 SPIS_QTY | 2 | 1 (EMG_SPIS_QTY)
参数 SPI_SLAVE_QTY | 2 | 1 (EMG_SPI_SLAVE_QTY)
CR 寄存器位宽 | 每 SPI 总线 4 位 | 每 SPI 总线 5 位（含 3 位长度）
CS 输出位宽 | 4 位 | 1 位
DRDY 输入位宽 | 2 位 | 1 位
输出数据位宽 | 24 位（EEG24） | 24 位（EMG24）
TABLE 7 7x4
信号名 | eeg_top 位宽 | eeg_top1 位宽 | 说明
cs | 4 | 1 | 芯片选择输出
sclk | 2 | 1 | SPI 时钟
mosi | 2 | 1 | SPI MOSI
miso | 2 | 1 | SPI MISO
drdy | 2 | 1 | 数据就绪输入
start | 2 | 1 | 转换启动
TABLE 8 14x4
信号名 | 方向 | 位宽 | 说明
clk | input | 1 | 系统主时钟 100MHz
rst_n | input | 1 | 低电平有效异步复位
bram_addr ~ bram_we | -- | -- | BRAM 配置接口（标准 13 位地址/32 位数据）
stim_state | input | 64 | 刺激状态位图（指示哪些通道正在刺激）
interrupt | output | 1 | 故障中断输出
cnv | output | 1 | AD7689 转换/采集控制
sck | output | 1 | AD7689 SPI 时钟
mosi | output | 1 | AD7689 SPI MOSI
miso | input | 1 | AD7689 SPI MISO
axi_i_out | output | 32 | 电流数据 AXI Stream 输出
axi_i_wr | output | 1 | 输出写使能（tvalid）
axi_i_tlast | output | 1 | 数据包结束标志
debug_sig | output | 4 | 调试信号
TABLE 9 4x2
状态 | 说明
IDLE | 空闲，等待采集周期完成信号触发
SCAN_ST | 扫描状态：逐通道比较 cur_rt > thr，加法器累加正/负/总电流
END_ST | 结束状态：比较累加结果与总阈值，输出故障标志 flt_bits[3:0]
TABLE 10 4x2
状态 | 说明
IDLE | 等待 acq_start 触发
TRANS_ST | 16 位 SPI 传输（发送 CFG + 读取 ADC 数据）
END_ST | 传输完成，更新输出寄存器
TABLE 11 14x6
地址偏移 | 寄存器名 | 位宽 | 访问 | 默认值 | 说明
0x0008 | CUR_EN | 1 | R/W | 0 | 电流监测使能
0x000C | CUR_CLEAR_INT | 1 | R/W | 0 | 清除中断（自清零）
0x0010 | CUR_CFG_REG | 14 | R/W | -- | AD7689 CFG 配置寄存器
0x0014 | CUR_ACQ_PERIOD_US | 32 | R/W | 1000 | 采集周期（微秒）
0x0018 | FLT_CH_L | 16 | R | 0 | 故障通道（低 16 位，只读）
0x0020 | THR_TOTAL_CUR | 32 | R/W | -- | 总电流阈值
0x0024 | THR_POS_CUR | 32 | R/W | -- | 正向电流阈值
0x0028 | THR_NEG_CUR | 32 | R/W | -- | 负向电流阈值
0x0030 | FLT_STATE | 32 | R | 0 | 故障状态位图（只读）
0x0400~0x07FF | CUR_CH_MAP[n] | 8×64 | R/W | -- | 通道映射表
0x0800~0x0BFF | CUR_THR[n] | 16×64 | R/W | -- | 每通道电流阈值
0x0C00~0x0FFF | CUR_RT[n] | 16×64 | R | 0 | 实时电流值（只读）
0x1000~0x13FF | CUR_FAULT[n] | 16×64 | R | 0 | 故障时刻电流值（只读）
TABLE 12 10x4
信号名 | 方向 | 位宽 | 说明
clk | input | 1 | 系统主时钟
rst_n | input | 1 | 低电平有效复位
bram_addr ~ bram_we | -- | -- | BRAM 配置接口
s_axis_trigger_* | input | 32 | 触发数据输入（当前接 0）
s_axis_eeg16_* | input | 32 | EEG16 数据输入（当前接 0）
s_axis_eeg24_* | input | 32 | EEG24 数据输入（主数据通道）
s_axis_emg_* | input | 32 | EMG 数据输入（当前接 0）
accel_data | input | 48 | 加速度计数据（当前接 0）
m_axis_record_* | output | 8 | 封装后的上传数据输出
TABLE 13 17x4
信号名 | 方向 | 位宽 | 说明
clk | input | 1 | 系统主时钟
rst_n | input | 1 | 复位
m_axis_eeg_tdata | input | 8 | EEG 上传数据输入
m_axis_eeg_tlast | input | 1 | EEG 数据包结束标志
m_axis_eeg_tvalid | input | 1 | EEG 数据有效
m_axis_emg_tdata | input | 8 | EMG 上传数据输入
m_axis_emg_tlast | input | 1 | EMG 数据包结束标志
m_axis_emg_tvalid | input | 1 | EMG 数据有效
eeg_emg_sel | input | 2 | EEG/EMG 选择控制
eeg_send_package_num | input | 16 | EEG 数据包大小
emg_send_package_num | input | 16 | EMG 数据包大小
diff_pkt_data_sel | input | 1 | 差分包数据选择
stop_sample | input | 1 | 停止采样
eeg_emg_tdata | output | 8 | 合并后数据输出
eeg_emg_tvalid | output | 1 | 输出数据有效
eeg_emg_tlast | output | 1 | 输出包结束标志
TABLE 14 9x4
信号名 | 方向 | 位宽 | 说明
clk | input | 1 | 系统主时钟
rst_n | input | 1 | 复位
bram_addr ~ bram_we | -- | -- | BRAM 配置接口（连接到 bram_imp）
bram_dout | output | 32 | BRAM 读数据
eeg_emg_sel | output | 2 | EEG/EMG 选择控制
eeg_send_package_num | output | 16 | EEG 数据包数量
emg_send_package_num | output | 16 | EMG 数据包数量
diff_pkt_data_sel | output | 1 | 差分包数据选择
TABLE 15 7x6
地址偏移 | 寄存器名 | 位宽 | 访问 | 默认值 | 说明
0x0000 | TEST_RO | 32 | R | 0x12345678 | 测试只读寄存器
0x0004 | TEST_RW | 32 | R/W | 0 | 测试读写寄存器
0x0030 | EMG_SEL | 2 | R/W | 0 | EEG/EMG 选择：bit1=EMG使能, bit0=EEG使能
0x0034 | EEG_NUM | 16 | R/W | 0 | EEG 数据包数量（典型值: 2059）
0x0038 | EMG_NUM | 16 | R/W | 0 | EMG 数据包数量（典型值: 379）
0x003C | DATA_SEL | 1 | R/W | 0 | 差分包数据选择
TABLE 16 5x4
信号名 | 方向 | 位宽 | 说明
clk | input | 1 | 系统主时钟
rst_n | input | 1 | 复位
cmd | input | 3 | LED 控制命令
led | output | 1 | LED 驱动输出（高有效）
TABLE 17 5x3
cmd[2:0] | 模式 | 说明
3'b000 | 关闭 | LED 常灭
3'b001 | 常亮 | LED 常亮
3'b010 | 闪烁 | PWM 闪烁，周期 200ms，占空比 50%
3'b011 | 呼吸 | 呼吸灯效果（三角波调制 PWM）
TABLE 18 7x3
模块名 | 功能 | 关键参数/特性
spi_full_duplex_master | 通用全双工 SPI 主控制器 | 可配置 CLK_DIV（时钟分频）、DATA_WIDTH（数据位宽）、NO_OF_SLAVES（从设备数）；标准 4 态 SPI 状态机；AXI Stream 接口
pwm_gen | 通用 PWM 发生器 | 可配置 PWM 周期和占空比；用于 LED 闪烁控制
breath_gen | LED 呼吸效果 PWM 发生器 | 三角波调制 PWM，实现 LED 亮度渐变呼吸效果
debouncing | 按键/信号消抖模块 | 基于移位寄存器的消抖算法
run_time | 毫秒级运行时间计数器 | 64 位计数器，每 100000 时钟周期（1ms）产生 1ms 脉冲信号
new_module | 空占位模块 | 预留模块，当前为空壳设计
TABLE 19 15x4
信号名 | 方向 | 位宽 | 说明
clk | input | 1 | 系统时钟
rst_n | input | 1 | 复位
spi_clk | output | NO_OF_SLAVES | SPI 时钟输出
spi_mosi | output | NO_OF_SLAVES | SPI MOSI 输出
spi_miso | input | NO_OF_SLAVES | SPI MISO 输入
spi_cs_n | output | NO_OF_SLAVES | SPI 片选（低有效）
t_cs_n | input | 8 | 传输片选掩码
t_tdata | input | DATA_WIDTH | 发送数据
t_tlast | input | 1 | 最后一个字节标志
t_tvalid | input | 1 | 发送数据有效
t_tready | output | 1 | 发送就绪
r_tdata | output | DATA_WIDTH | 接收数据
r_tlast | output | 1 | 接收最后一个字节
r_tvalid | output | 1 | 接收数据有效
TABLE 20 9x4
BRAM 接口 | 地址空间 | 数据宽度 | 用途
bram_stim | 8KB (13-bit addr) | 32-bit | RHS2116 刺激配置（已禁用）
bram_eeg | 8KB | 32-bit | EEG 配置（ADS1299）
bram_emg | 8KB | 32-bit | EMG 配置（ADS1299）
bram_cur | 8KB | 32-bit | 电流监测配置
bram_accel | 8KB | 32-bit | 加速度计配置（已禁用）
bram_msg | 8KB | 32-bit | EEG 上传/消息配置
bram_msg_emg | 8KB | 32-bit | EMG 上传/消息配置
bram_imp | 8KB | 32-bit | 全局系统配置（stim_config）
TABLE 21 5x5
DMA 通道 | 方向 | 数据宽度 | 用途 | 状态
DMA0 (MM2S) | PS→PL | 32-bit | 刺激波形数据下发（m_axis_stim） | 已禁用
DMA1 (S2MM) | PL→PS | 8-bit | EEG/EMG 合并记录数据上传（s_axis_record） | 工作中
DMA2 (S2MM) | PL→PS | 32-bit | EEG24 原始数据上传（s_axis_record1） | 工作中
DMA3 (S2MM) | PL→PS | 32-bit | 电流监测数据上传（s_axis_record2） | 工作中
TABLE 22 4x4
SPI 外设 | 芯片选择数 | 用途 | 说明
STIM_SPI | 1 | 刺激器 SPI 通信 | PS 端通过 EMIO 直接控制
ZCHECK_SPI | 1 | AD5941 阻抗检查 | PS 端通过 EMIO 直接控制
CUR_SPI | 1 | AD7689 电流 ADC | PS 端通过 EMIO 直接控制（备用通道）
TABLE 23 13x6
模块 | LUT | FF | BRAM(36Kb) | DSP | 说明
c64pro_top | ~500 | ~600 | 0 | 0 | 顶层互连 + stim_clk400k 分频器
design_a9_1 (PS) | -- | -- | ~64 | -- | PS IP 互连（ARM + BRAM + DMA + GPIO）
pl_top | ~300 | ~200 | 0 | 0 | PL 顶层互连、信号路由
eeg_top | ~800 | ~1200 | 0.5 | 0 | EEG 采集（config + arrange×2 + if×2 + upload）
eeg_top1 | ~400 | ~600 | 0.5 | 0 | EMG 采集（config + arrange×1 + if×1 + upload）
cur_mon_top | ~1200 | ~1800 | 1 | 3 | 电流监测（config + ctrl + if×2 + collect + monitor + ch_map）
upload_top（×2） | ~600 | ~800 | 1 | 0 | 2×上传（runtime + config + sort + protocol×2）
eeg_emg_upload | ~300 | ~400 | 0.25 | 0 | EEG/EMG 合并 + CRC16 + FIFO
stim_config | ~100 | ~200 | 0.5 | 0 | 全局配置寄存器
led_ctrl | ~100 | ~150 | 0 | 0 | LED 控制 + PWM + 呼吸灯
通用工具模块 | ~200 | ~300 | 0 | 0 | spi_master + debounce + run_time
ILA 调试核 | ~500 | ~800 | ~4 | 0 | 66+ 信号 ILA 调试探针（见 XDC 约束）
TABLE 24 6x5
资源类型 | 估算用量 | 器件总量 | 利用率 | 余量
Slice LUTs | ~5,000 | 53,200 | ~9.4% | >90%
Slice Registers | ~7,000 | 106,400 | ~6.6% | >93%
Block RAM (36Kb) | ~75 | 140 | ~53.6% | ~46%
DSP Slices | ~3 | 220 | ~1.4% | >98%
BUFG (全局时钟) | ~2 | 32 | ~6.3% | >93%
TABLE 25 17x5
BRAM 接口 | 起始地址 | 结束地址 | 所属模块 | 寄存器内容
bram_imp | 0x0000 | 0x003C | stim_config | 全局配置（测试、EEG/EMG选择、包数量）
bram_eeg | 0x0040 | 0x0048 | eeg_config (EEG) | EEG 使能、控制、状态寄存器
bram_eeg | 0x0100 | 0x01FF | eeg_config (EEG) | EEG SPI 发送寄存器数组
bram_eeg | 0x0200 | 0x02FF | eeg_config (EEG) | EEG SPI 接收寄存器数组
bram_emg | 0x0040 | 0x0048 | eeg_config (EMG) | EMG 使能、控制、状态寄存器
bram_emg | 0x0100 | 0x01FF | eeg_config (EMG) | EMG SPI 发送寄存器数组
bram_emg | 0x0200 | 0x02FF | eeg_config (EMG) | EMG SPI 接收寄存器数组
bram_cur | 0x0008 | 0x0030 | cur_mon_config | 电流监测使能/清除/配置/阈值/故障
bram_cur | 0x0400 | 0x07FF | cur_mon_config | 通道映射表（64通道）
bram_cur | 0x0800 | 0x0BFF | cur_mon_config | 每通道电流阈值（64通道）
bram_cur | 0x0C00 | 0x0FFF | cur_mon_config | 实时电流值（64通道，只读）
bram_cur | 0x1000 | 0x13FF | cur_mon_config | 故障电流值（64通道，只读）
bram_msg | -- | -- | upload_config | EEG 上传配置（协议选择、通道映射等）
bram_msg_emg | -- | -- | upload_config | EMG 上传配置（协议选择、通道映射等）
bram_stim | -- | -- | transmit_config | RHS2116 刺激配置（已禁用）
bram_accel | -- | -- | accel_config | 加速度计配置（已禁用）
