博宸精芯开源ADC数据采集显示上位机软件功能设计
发布时间: 2026-08-24 14:03
|
作者: yang
|
状态: published
|
更新时间: 2026-08-24 14:17
# net_adc 软件功能设计说明书
> **ADC/DAC 以太网调试工具 — 博宸精芯ADDA调试工具**
>
> | 项目 | 内容 |
|------|------|
| 版本 | v1.0 |
| 平台 | .NET 8.0 WPF (Windows x64) |
| 日期 | 2026-08-24 |
>
>
## 目录
1. [概述](#1-概述)
2. [系统架构](#2-系统架构)
3. [网络通信模块](#3-网络通信模块)
4. [ADC 数据采集模块](#4-adc-数据采集模块)
5. [波形显示模块](#5-波形显示模块)
6. [频谱分析模块](#6-频谱分析模块)
7. [DAC 配置模块](#7-dac-配置模块)
8. [数据管理模块](#8-数据管理模块)
9. [界面设计](#9-界面设计)
10. [构建与部署](#10-构建与部署)
11. [版权信息](#11-版权信息)
## 1. 概述
### 1.1 项目简介
net_adc 是一款基于 C# WPF (.NET 8.0) 开发的高性能 ADC/DAC 调试工具,用于与 FPGA 端的 lwIP 工程进行以太网通信,实现 ADC 数据采集、波形显示、频谱分析及 DAC 参数配置等功能。
### 1.2 设计目标
- **高速数据采集**:支持最大 131072 个采样点的 ADC 数据采集,双通道同步
- **实时波形显示**:示波器风格界面,双通道同时显示,支持缩放与拖动
- **频域分析**:1024 点 FFT 频谱分析,包含峰值检测、SNR 计算、直流分量与峰峰值测量
- **DAC 控制**:波形类型选择、幅度调节(环形旋钮)、频率设置、独立通道使能
- **TCP 通信**:基于 TCP 协议与 FPGA 建立稳定连接
- **数据导出**:支持波形数据导出为文本文件
### 1.3 技术规格
| 参数 | 规格 | 说明 |
|------|------|------|
| 开发框架 | .NET 8.0 WPF | Windows Presentation Foundation |
| 目标平台 | Windows x64 | 自包含发布,无需安装运行时 |
| 通信协议 | TCP | 客户端模式 |
| 数据缓冲区 | 64 MB | 16M × 4 字节,支持大容量采集 |
| 采样率 | 250 MHz | 用于 FFT 频率计算 |
| ADC 分辨率 | 14 位 | 原始 16 位右移 2 位,范围 ±8192 |
| 参考电压 | 2.15 V | 电压换算基准 |
| FFT 点数 | 1024 | Cooley-Tukey 算法 + Hanning 窗 |
| 频率范围 | 0 ~ 125 MHz | 显示范围,分辨率 ~244 kHz |
| DAC 幅度范围 | 0 ~ 1.2 V | 分辨率 0.01 V |
| DAC 频率范围 | 0 ~ 25 MHz | 自动单位转换 |
---
## 2. 系统架构
### 2.1 整体架构图

**架构说明:**
- **网络控制区**:协议选择 (TCP)、客户端/服务端模式、IP 地址/端口设置、连接/断开
- **显示控制区**:X+/X- Y+/Y- 缩放、ADC1/ADC2 通道开关、自动刷新 (50ms)、刷新波形
- **DAC 配置区**:波形类型选择、幅度旋钮 (0~1.2V)、频率设置 (0~25 MHz)、DAC1/DAC2 使能
- **核心业务逻辑层**:Socket 通信 (TCP 收发)、数据解析 (帧校验)、FFT 计算 (1024 点)、DAC 控制
- **波形显示区域**:Canvas 自定义绘制、双通道波形 (ADC1 黄色/ADC2 紫色)、坐标轴标注
- **频谱分析区域**:峰值/SNR/直流/峰峰值、dB 刻度频谱图 (-100~+20 dB)、MHz 频率轴 (0~125)
- **运行日志区**:连接状态、采集进度、数据包计数、错误信息
- **状态栏**:连接指示灯、发送/接收统计、清零按钮、关于本软件按钮
### 2.2 数据流
触发ADC → FPGA采样 → DDR3存储 → 发送读命令 → 数据帧传输 → 数据解析 → FFT计算 → 波形+频谱绘制
### 2.3 核心类与职责
| 类/模块 | 职责 | 关键方法 |
|---------|------|----------|
| MainWindow | 主窗口,统筹所有功能模块 | Connect(), Disconnect(), DrawWaveform() |
| Socket 通信 | TCP 网络收发 | ReceiveTcpData(), SendData() |
| 数据解析 | 帧头校验、地址解析、数据写入缓冲区 | ProcessReceivedData() |
| 波形绘制 | 波形、网格、坐标轴绘制 | DrawWaveform(), DrawGrid(), DrawChannel() |
| FFT 计算 | 频谱分析、峰值检测、SNR | ComputeFFT(), CalculateFFT(), CalculatePeakAndSNR() |
| 频谱绘制 | dB 刻度频谱图绘制 | DrawSpectrum() |
| 数据统计 | 直流分量、峰峰值计算 | CalculateDC(), CalculatePeakPeak() |
| DAC 控制 | 波形预览、旋钮交互、频率显示 | DrawWaveformPreview(), UpdateKnobDisplay() |
| SliderWidthConverter | WPF 值转换器 | Convert() |
---
## 3. 网络通信模块
### 3.1 功能概述
网络通信模块基于 .NET `Socket` 类实现,使用 TCP 协议以客户端模式与 FPGA 端 lwIP 服务端建立连接。
### 3.2 通信配置
| 参数 | 默认值 | 说明 |
|------|--------|------|
| 协议 | TCP | 面向连接的可靠传输 |
| 角色 | 客户端 | 主动连接 FPGA 服务端 |
| 目标 IP | 192.168.1.10 | FPGA 开发板默认地址 |
| 目标端口 | 7 | lwIP 工程监听端口 |
### 3.3 核心实现
```csharp
// TCP 客户端连接
private void ConnectTcpClient(string ip, int port)
{
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.Connect(IPAddress.Parse(ip), port);
Task.Run(() => ReceiveTcpData(_cts!.Token));
}
// 异步数据接收 - 循环接收并写入 64MB 缓冲区
private void ReceiveTcpData(CancellationToken token)
{
uint writeOffset = 0;
while (!token.IsCancellationRequested)
{
var length = _socket.Receive(buffer, (int)writeOffset, ...);
if (length > 0)
{
ProcessReceivedData(data, writeOffset); // 帧解析
writeOffset += (uint)length;
if (writeOffset >= buffer.Length) writeOffset = 0; // 环形缓冲
}
}
}
```
### 3.4 缓冲区设计
- **缓冲区大小**:64 MB (16,777,216 × 4 字节),初始化时全部清零
- **环形写入**:接收数据顺序写入缓冲区,写满后回绕到起始位置
- **帧定向写入**:解析出数据帧后,根据帧中的地址字段将 1024 字节数据写入缓冲区对应位置
---
## 4. ADC 数据采集模块
### 4.1 采集流程
ADC 数据采集分为两步:先触发 FPGA 端 ADC 采样,然后分批从 FPGA DDR3 中读取采样数据。
```
1.触发ADC → 2.FPGA采样到DDR3 → 3.发送读命令 → 4.接收数据帧 → 5.写入缓冲区 → 6.绘制波形
```
### 4.2 采样点数配置
| 采样点数 | 数据包数 | 数据大小 | 时间跨度 (4ns/点) |
|----------|----------|----------|---------------------|
| 1,024 | 4 | 4 KB | 4.096 μs |
| 2,048 | 8 | 8 KB | 8.192 μs |
| 4,096 | 16 | 16 KB | 16.384 μs |
| 8,192 | 32 | 32 KB | 32.768 μs |
| 16,384 | 64 | 64 KB | 65.536 μs |
| 32,768 | 128 | 128 KB | 131.072 μs |
| 65,536 | 256 | 256 KB | 262.144 μs |
| 131,072 | 512 | 512 KB | 524.288 μs |
### 4.3 数据采集逻辑
- **分包读取**:每次读取 256 个采样点 (1024 字节),地址递增 1024
- **重试机制**:每包最多重试 3 次,超时 100ms
- **轮询间隔**:5ms 轮询接收计数,包间间隔 20ms
- **进度显示**:实时更新进度条和百分比
- **完成刷新**:所有包接收完成后自动调用 DrawWaveform()
### 4.4 ADC 数据格式
```csharp
// 每个采样点 4 字节 (32位),小端序存储
uint adc_buf = data[i*4] | (data[i*4+1] << 8) | (data[i*4+2] << 16) | (data[i*4+3] << 24);
// 高 16 位 = ADC1 原始值,低 16 位 = ADC2 原始值
short raw_adc1 = (short)((adc_buf >> 16) & 0xFFFF);
short raw_adc2 = (short)(adc_buf & 0xFFFF);
// 右移 2 位,得到 14 位有效数据 (范围: -8192 ~ +8191)
short adc1 = (short)(raw_adc1 / 4);
short adc2 = (short)(raw_adc2 / 4);
// 电压换算: ADC值 × 2.15V / 8192
double voltage = adc_value * 2.15 / 8192.0;
```
---
## 5. 波形显示模块
### 5.1 显示特性
| 特性 | 说明 |
|------|------|
| 示波器风格 | 黑色背景,白色点线网格,8 行 10 列虚线 |
| 双通道显示 | ADC1 (黄色) + ADC2 (紫色) 同时显示,可独立开关 |
| 缩放控制 | X 轴 1~N 倍 (2 倍步进),Y 轴 1~16 倍 (2 倍步进) |
| 拖动浏览 | 鼠标拖动波形水平滚动,查看不同区域 |
### 5.2 抽取显示算法
固定显示 1024 个点,当采样点数大于 1024 时自动抽取:
```csharp
// 显示数据范围 = 总采样数 / X轴缩放
displayDataRange = currentSampleCount / _zoomX
// 抽取系数 = 显示范围 / 1024
decimationFactor = displayDataRange / 1024
// 从 dataOffset 开始,每隔 decimationFactor 取一个点
for (i = 0; i < 1024; i++)
displayAdc1[i] = adc1[dataOffset + i * decimationFactor]
```
### 5.3 坐标轴标注
| 标注 | 位置 | 内容 |
|------|------|------|
| Y 轴左侧 | 画布左边缘 | ADC 数值 (-8192 ~ +8192,考虑 Y 缩放) |
| Y 轴右侧 | 画布右边缘 | 电压值 (±2.15V,考虑 Y 缩放) |
| X 轴顶部 | 画布上方 | 时间标注 (4ns/点,自动单位: ns/μs/ms/s) |
| X 轴底部 | 画布下方 | 采样点索引 |
### 5.4 自动刷新
勾选"自动刷新"后,启动 50ms 定时器周期性调用 DrawWaveform(),实现波形实时刷新。
---
## 6. 频谱分析模块
### 6.1 FFT 算法
采用经典 Cooley-Tukey 基-2 蝙式 FFT 算法,固定 1024 点计算,包括位反转和蝶形运算两个阶段。
- **窗函数**:Hanning 窗 `0.5 × (1 - cos(2πi/(N-1)))`
- **输入数据**:ADC 值转换为电压后加窗 `v = adc × 2.15/8192 × window`
- **频率分辨率**:250 MHz / 1024 ≈ 244 kHz/bin
- **显示范围**:0 ~ 125 MHz (512 个频点)
- **幅度归一化**:DC 和 Nyquist 分量除以 N,其余乘以 2/N
- **显示刻度**:dB 刻度,范围 -100 dB ~ +20 dB
### 6.2 分析指标
| 指标 | 计算方法 | 显示格式 |
|------|----------|----------|
| 峰值频率 | 0~125MHz 范围内幅度最大的频点 | XX.XX MHz |
| SNR (信噪比) | 10×log10(信号功率/噪声功率),排除峰值±5个频点 | XX.XX dB |
| 直流分量 | 所有采样点的算术平均值 | ADC:XXX, X.XXXV |
| 峰峰值 | 最大值 - 最小值 | ADC:XXX, X.XXXV |
### 6.3 频谱绘制
- **双通道频谱**:ADC1 (黄色) + ADC2 (紫色) 叠加显示
- **Y 轴**:8 等分 dB 刻度,-100 ~ +20 dB
- **X 轴**:10 MHz 间隔标注,0 ~ 120 MHz
- **网格**:白色点线虚线网格
---
## 7. DAC 配置模块
### 7.1 功能概述
DAC 配置模块提供波形参数设置界面,包括波形类型选择、幅度调节、频率设置和通道使能控制。
### 7.2 波形类型
| 索引 | 波形 | 数学表达式 |
|------|------|------------|
| 0 | 正弦波 | y = A × sin(2π × t × 3) |
| 1 | 方波 | y = A × sign(sin(2π × t × 3)) |
| 2 | 三角波 | y = A × (1 - 4\|frac(t×3) - 0.5\|) |
| 3 | 脉冲 | y = A × (frac(t×3) < 0.1 ? 1 : 0) |
| 4 | 白噪声 | y = A × (Random × 2 - 1),固定种子 42 |
### 7.3 幅度旋钮
采用自定义 Canvas 绘制的环形旋钮控件,角度范围 -135° ~ +135°,对应 0 ~ 1.2V。
- **角度映射**:`angle = -135 + (value / 1.2) × 270`
- **鼠标交互**:根据鼠标相对中心位置的角度计算幅度值
- **分辨率**:0.01V (保留两位小数)
- **视觉元素**:环形背景弧、进度弧、中心圆、指示线
### 7.4 频率设置
- **输入范围**:0 ~ 25,000,000 Hz
- **自动单位转换**:<1000 Hz / <1 MHz 显示 KHz / ≥1 MHz 显示 MHz
- **实时显示**:输入变化时立即更新单位标注
### 7.5 DAC 通道使能
DAC1 和 DAC2 独立控制,按钮点击切换状态,指示灯红色表示关闭,绿色表示开启。
---
## 8. 数据管理模块
### 8.1 数据导出
支持将 ADC1 通道的波形数据导出为文本文件,每行一个 ADC 原始值 (int16),可通过采样点数选择框控制导出数据量。
```csharp
// 导出格式 - 每行一个 short 值
using (StreamWriter writer = new StreamWriter(filePath))
{
for (int i = 0; i < sampleCount; i++)
{
short adcValue = BitConverter.ToInt16(_dataBuffer, i * 2);
writer.WriteLine(adcValue);
}
}
```
### 8.2 统计信息
| 统计项 | 说明 |
|--------|------|
| 发送次数 | 累计发送数据包次数 |
| 发送字节数 | 累计发送字节数 |
| 接收次数 | 累计接收数据包次数 |
| 接收字节数 | 累计接收字节数 |
| 清零 | 一键重置所有统计数据 |
| 关于本软件 | 显示软件版本、发布日期及版权信息 |
### 8.3 运行日志
红色文字显示在浅蓝色背景区域,记录所有关键操作和事件,包括连接状态、采集进度、数据包计数、错误信息等,支持清空操作。
---
## 9. 界面设计
### 9.1 布局结构
```
┌────────────────────────────────────────────────────────────────────┐
│ [BCJX Logo] 博宸精芯ADDA调试工具 协议|模式|地址|端口|连接 │ ← 标题栏
├──────────────────┬───────────────────────────────────────────────────┤
│ │ ADC波形 │
│ 运行日志 │ ┌──────────────────────────────────────────────┐ │
│ ┌────────────┐ │ │ 黑色背景 波形画布 │ │
│ │ 红色文字 │ │ │ 黄色ADC1 紫色ADC2 白色网格 │ │
│ │ 日志输出 │ │ │ Y轴:ADC值/电压 X轴:时间/采样点 │ │
│ └────────────┘ │ └──────────────────────────────────────────────┘ │
│ [清空日志] │ [刷新波形][显示ADC1][显示ADC2][自动刷新] │
│ │ [X+][X-][Y+][Y-][复位] │
│ 波形设置 │ ┌──────────────┬─────────────────────────────┐ │
│ [波形类型▼] │ │ 频谱分析结果 │ 频谱画布 │ │
│ ┌──────────┐ │ │ ADC1: │ 黄色ADC1 + 紫色ADC2 │ │
│ │波形预览 │ │ │ 峰值/SNR │ dB刻度 -100~+20 │ │
│ └──────────┘ │ │ 直流/峰峰值 │ MHz刻度 0~125 │ │
│ 幅度 [旋钮] 1.0V│ │ ADC2: │ │ │
│ 频率 [____] Hz │ │ 峰值/SNR │ │ │
│ [DAC1使能][DAC2]│ │ 直流/峰峰值 │ │ │
│ │ └──────────────┴─────────────────────────────┘ │
├──────────────────┴───────────────────────────────────────────────────┤
│ [触发ADC采样] | 采集点数[1024▼] | 采集进度[█████░░] 50% | [数据采集]│ ← 控制面板
├────────────────────────────────────────────────────────────────────────┤
│ ● 已连接 | 发送: N次(XXXB) 接收: N次(XXXB) [清零] [关于本软件] │ ← 状态栏
└────────────────────────────────────────────────────────────────────────┘
```
### 9.2 设计规范
| 元素 | 样式 |
|------|------|
| 主色调 | #4A90D9 (蓝色) |
| 背景色 | #F5F7FA (浅灰白) |
| 卡片背景 | #FFFFFF 白色 + 阴影 |
| 波形区域 | #000000 纯黑背景 |
| ADC1 波形 | Yellow (黄色) |
| ADC2 波形 | Purple (紫色) |
| 网格线 | White 白色点线 (1,10 虚线) |
| 状态栏 | #2D3748 深灰背景,白色文字 |
| 日志区 | #E3F2FD 浅蓝背景,#FF0000 红色文字 |
| 字体 | Microsoft YaHei (中文) / Consolas (等宽) |
---
## 10. 构建与部署
### 10.1 项目配置
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType> <!-- WPF 窗口应用 -->
<TargetFramework>net8.0-windows</TargetFramework> <!-- .NET 8.0 -->
<UseWPF>true</UseWPF> <!-- 启用 WPF -->
<SelfContained>true</SelfContained> <!-- 自包含发布 -->
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- Windows x64 -->
<PublishSingleFile>true</PublishSingleFile> <!-- 单文件打包 -->
<PublishReadyToRun>true</PublishReadyToRun> <!-- 预编译提升启动速度 -->
<Company>博宸精芯</Company>
<Copyright>Copyright (C) 2026 博宸精芯</Copyright>
<Version>1.0.0</Version>
<Product>博宸精芯 ADDA 调试工具</Product>
</PropertyGroup>
</Project>
```
### 10.2 构建命令
```bash
# 清理旧构建
dotnet clean -c Release
# 构建 (Release 模式)
dotnet build -c Release
# 发布自包含单文件可执行程序
dotnet publish -c Release -o bin/publish
```
### 10.3 产物说明
| 文件 | 说明 |
|------|------|
| net_adc.exe | 自包含单文件可执行程序,内嵌 .NET 运行时,无需额外安装 |
> **注意:** 由于采用 `SelfContained=true` 和 `PublishSingleFile=true` 配置,生成的 exe 文件包含完整的 .NET 运行时,在目标机器上无需安装 .NET SDK 或运行时即可直接运行。
### 10.4 运行环境
- **操作系统**:Windows 10/11 (x64)
- **运行时**:无需额外安装 (自包含)
- **硬件**:FPGA 开发板 (运行 lwIP 工程,默认 IP 192.168.1.10)
- **网络**:PC 与 FPGA 同网段,端口 7 可用
---
## 11. 版权信息
| 项目 | 内容 |
|------|------|
| 软件名称 | 博宸精芯 ADDA 调试工具 |
| 版本 | v1.0 |
| 发布日期 | 2026-08-24 |
| 版权所有 | Copyright (C) 2026 博宸精芯 |
| 关于本软件 | 点击状态栏右侧【关于本软件】按钮查看 |
*未经授权不得复制或分发。*
```
```
加载中...
正在加载内容...
评论
正在加载评论...