Files
BSI-901-fpga-software/tmp/fpga_doc2/old_dump.txt
T
2026-09-11 16:18:36 +08:00

635 lines
52 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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=|系统时钟:100MHzPS 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) 平台,由 PSARM 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=|1PS 域(ARM Cortex-A9):运行嵌入式 Linux/裸机程序,负责任务调度、数据存储、网络通信和人机交互。通过 AXI BRAM 控制器配置 PL 寄存器,通过 AXI DMA 传输刺激波形和采集数据,通过 EMIO SPI/GPIO 控制部分外设。
P41|List Bullet|drawings=0|rels=|2PL 域(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)=25MHzCLK_DIV=3),AD7689 的 SPI 时钟为 100MHz/6≈16.7MHzCLK_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_configBRAM 配置寄存器模块,提供 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_STsend_enable=1 且 send_cs_n 非全 1(有芯片被选中)
P105|List Bullet|drawings=0|rels=|IDLE → RDATAC_STrdatac_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=|DUTeeg_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_configBRAM 配置寄存器模块,提供使能、ADC 配置、采集周期、阈值和通道映射等寄存器。支持 64 通道独立配置。
P156|List Number|drawings=0|rels=|ad7689_dual_ctrlAD7689 转换时序控制。产生 CNV 方波信号控制 ADC 的转换/采集周期,默认周期 1ms(100000 个时钟周期),在采集阶段通过 SPI 发送通道配置字。
P157|List Number|drawings=0|rels=|ad7689_dual_ifAD7689 SPI 采集接口。实现 16 位 SPI 通信(CLK_DIV=6SPI 时钟约 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_time64 位毫秒级运行时间计数器,每 100000 个时钟周期(1ms)产生一个脉冲,为数据包提供时间戳。
P191|List Number|drawings=0|rels=|upload_configBRAM 配置寄存器,提供协议选择、通道映射、采样率等配置参数。
P192|List Number|drawings=0|rels=|upload_sort:通道排序模块。根据 ch_mapping2pc_array 将 PL 内部通道号重新映射到 PC 端逻辑通道号,根据 upload_ch_array 位图过滤被禁用的通道。
P193|List Number|drawings=0|rels=|upload_protocol_intanIntan RHD 协议编码器。将通道数据封装为 Intan RHD 2000 数据包格式(含 Magic Number、时间戳、通道数据)。
P194|List Number|drawings=0|rels=|upload_protocol_qlQL 自定义协议编码器。将通道数据封装为自定义数据包格式(含帧头、帧序号、通道数、采样数据、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_09 位宽,{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=3SPI 时钟=25MHz),DATA_WIDTH=8NO_OF_SLAVES=1
P250|List Bullet|drawings=0|rels=|AD7689 实例:CLK_DIV=6SPI 时钟≈16.7MHz),DATA_WIDTH=16NO_OF_SLAVES=1
P251|List Bullet|drawings=0|rels=|RHS2116 实例:CLK_DIV=4SPI 时钟=20MHz),DATA_WIDTH=32NO_OF_SLAVES=1(已禁用)
P253|Heading 1|drawings=0|rels=|6. PS-PL 通信架构
P254|Normal|drawings=0|rels=|PS 与 PL 之间的通信通过 Vivado Block Designdesign_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-2Zynq-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 | 加速度计配置(已禁用)