635 lines
52 KiB
Plaintext
635 lines
52 KiB
Plaintext
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 | 加速度计配置(已禁用)
|