跳到主要内容
B205mini FPGA 工程架构与开发流程解析 | 极客日志
编程语言 AI 算法
B205mini FPGA 工程架构与开发流程解析 B205mini FPGA 工程基于 Spartan-6 芯片和 AD9364 RFIC,采用 AXI4 总线架构。系统包含 bus_clk 和 radio_clk 双时钟域,通过 FIFO 实现跨域通信。核心模块涵盖顶层 b205.v、AD9364 接口、核心处理及 FX3 USB 接口。数据流涉及 DDC/DUC 链路的数字下变频与上变频,包含 NCO、CORDIC、CIC 滤波器等 DSP 组件。开发环境需配置 Xilinx ISE 14.7 虚拟机,支持 Python 3.6 编译构建。工程提供 SPI 控制、GPIO ATR 管理及 AXI4 流接口,资源利用率适中,适用于 SDR 二次开发与信号处理应用。
PhpPioneer 发布于 2026/2/20 更新于 2026/5/31 25 浏览USRP B210/B205 系列 FPGA 工程架构与开发流程总结。
1. 硬件架构概览
1.1 硬件规格
组件 型号/规格 说明 FPGA Spartan-6 XC6SLX75-FGG484-3 B200mini 使用 75K 逻辑单元 FPGA Spartan-6 XC6SLX150-FGG484-3 B205mini 使用 150K 逻辑单元 RFIC AD9364 单通道收发器,70MHz-6GHz USB 接口 Cypress FX3 (CYUSB3014) USB 3.0 SuperSpeed 主时钟 40MHz 板载晶振 参考时钟 10MHz 外部参考输入 PPS 1PPS 脉冲每秒输入
1.2 系统架构图
总线接口
核心处理
IO 接口
时钟子系统
外部接口
40MHz
int_40mhz
bus_clk 100MHz
ref_pll_clk 200MHz
12 位 DDR 数据
radio_clk
32 位数据
AD9364 RFIC
FX3 USB 3.0
时钟源
40MHz/10MHz/PPS
前端控制
RF 开关/LED/GPIO
b205_clk_gen
时钟生成器
b205_ref_pll
参考 PLL
b205_io
AD9364 接口
gpio_atr_io
GPIO ATR 控制
b205_core
核心处理
radio_legacy
无线电处理
DDC Chain
数字下变频
DUC Chain
数字上变频
gpif2_slave_fifo32
FX3 接口
AXI4 总线
100MHz
1.3 模块层次结构
b205.v (顶层模块)
├── b205_clk_gen (时钟生成器)
├── b205_ref_pll (参考时钟 PLL)
├── b205_io (AD9364 接口)
├── b205_core (核心处理)
│ ├── radio_legacy (无线电处理)
│ │ ├── ddc_chain (数字下变频链)
│ │ │ ├── NCO (数控振荡器)
│ │ │ ├── CORDIC (坐标旋转数字计算机)
│ │ │ ├── CIC Decimator (级联积分梳状滤波器)
│ │ │ └── Half-band Decimators (半带滤波器)
│ │ ├── duc_chain (数字上变频链)
│ │ │ ├── Half-band Interpolators (半带插值器)
│ │ │ ├── CIC Interpolator (级联积分梳状插值器)
│ │ │ ├── CORDIC (坐标旋转)
│ │ │ └── NCO (数控振荡器)
│ │ ├── radio_ctrl_proc (无线电控制处理器)
│ │ ├── timekeeper (时间管理器)
│ │ └── gpio_atr (GPIO ATR 控制)
│ ├── radio_ctrl_proc (总线控制处理器)
│ ├── simple_spi_core (SPI 控制器)
│ └── axi_mux4/demux4 (AXI 路由)
├── gpio_atr_io (GPIO ATR IO)
└── gpif2_slave_fifo32 (FX3 接口)
├── RX FIFO (8 K 样本)
└── TX FIFO (8 K 样本)
2. 系统时钟架构
2.1 时钟域概览
时钟使用
时钟域
时钟生成
40MHz 晶振
b205_clk_gen
bus_clk 100MHz AXI4 总线
radio_clk 61.44MHz AD9364 数据时钟
int_40mhz 40MHz 内部时钟
ref_pll_clk 200MHz PLL 输入
AXI4 接口 控制逻辑
DSP 处理 DDC/DUC
AD9364 接口
参考 PLL
2.2 时钟域详细说明 时钟域 频率 用途 说明 bus_clk 100 MHz AXI4 总线、控制逻辑 由 b205_clk_gen 从 40MHz 生成 radio_clk 变量 (通常 61.44 MHz) AD9364 数据时钟、DSP 处理 从 AD9364 的 CAT_DCLK_P 恢复 int_40mhz 40 MHz 内部时钟、参考 PLL 输入 直接来自 40MHz 晶振 ref_pll_clk 200 MHz 参考 PLL 输入时钟 由 b205_clk_gen 生成 FX3_PCLK 100 MHz GPIF 接口时钟 与 bus_clk 同步
2.3 时钟域交叉 // 示例:控制数据从 bus_clk 到 radio_clk 的 CDC
axi_fifo_2clk #(.WIDTH(65), .SIZE(0)) ctrl_fifo (
.reset(bus_rst),
.i_aclk(bus_clk),
.i_tvalid(ctrl_tvalid),
.i_tready(ctrl_tready),
.i_tdata({ctrl_tlast, ctrl_tdata}),
.o_aclk(radio_clk),
.o_tvalid(ctrl_tvalid_r),
.o_tready(ctrl_tready_r),
.o_tdata({ctrl_tlast_r, ctrl_tdata_r})
);
3. 核心模块详解
3.1 b205.v - 顶层模块
实例化所有子模块
连接外部接口
生成系统时钟
处理复位逻辑
module b205 (
// AD9364 - SPI 接口
output CAT_SPI_EN,
input CAT_SPI_DO,
output CAT_SPI_DI,
output CAT_SPI_CLK,
// AD9364 - 控制
output CAT_EN,
output CAT_EN_AGC,
output CAT_RESETn,
output CAT_TXnRX,
output [3:0] CAT_CTL_IN,
input [7:0] CAT_CTL_OUT,
// AD9364 - 数据接口
input CAT_DCLK_P,
output CAT_FBCLK_P,
input [11:0] CAT_P0_D,
output [11:0] CAT_P1_D,
input CAT_RX_FR_P,
output CAT_TX_FR_P,
// 时钟
input CLK_40MHz_FPGA,
// FX3 GPIF 接口
output FX3_PCLK,
output FX3_CTL0,
output FX3_CTL1,
output FX3_CTL2,
output FX3_CTL3,
output FX3_CTL7,
input FX3_CTL4,
input FX3_CTL5,
input FX3_CTL6,
input FX3_CTL8,
output FX3_CTL11,
output FX3_CTL12,
inout [31:0] FX3_DQ,
input FX3_CTL9,
// LED 和 GPIO
output cLED_TRX_G,
output cLED_TRX_B,
output cLED_TRX_R,
output cLED_RX2_G,
output cLED_RX2_B,
output cLED_RX2_R,
output cLED_S0,
output cLED_S1,
inout [7:0] fp_gpio,
// PPS 和参考时钟
input PPS_IN,
input CLKIN_10MHz,
output CLKIN_10MHz_REQ,
// DAC 控制
output CLK_40M_DAC_nSYNC,
output CLK_40M_DAC_SCLK,
output CLK_40M_DAC_DIN,
// RF 硬件控制
output cFE_SEL_TRX_TX,
output cFE_SEL_TRX_RX,
output cFE_SEL_RX_TRX,
output cFE_SEL_RX_RX2,
output cTXDRV_PWEN
);
3.2 b205_io.v - AD9364 接口模块
处理 AD9364 的 DDR 数据接口
时钟恢复和缓冲
I/Q 数据解复用
module b205_io (
input reset,
// 基带采样接口
output radio_clk,
output [11:0] rx_i0,
output [11:0] rx_q0,
input [11:0] tx_i0,
input [11:0] tx_q0,
// Catalina 接口
input rx_clk,
input rx_frame,
input [11:0] rx_data,
output tx_clk,
output tx_frame,
output [11:0] tx_data
);
CAT_DCLK_P
AD9364 RX 时钟
IBUFG
全局时钟缓冲
BUFIO2 LT
左上角 Bank
BUFIO2 LB
左下角 Bank
siso_clk
1x 时钟
radio_clk
全局时钟
IDDR2
DDR 接收器
RX I/Q 数据
// 使用 IDDR2 接收 DDR 数据
IDDR2 #(.DDR_ALIGNMENT("C0")) iddr2_i0 (
.Q0(rx_q[0]),
.Q1(rx_i[0]),
.C0(io_clk_lb),
.C1(io_clk_lb_b),
.CE(1'b1),
.D(rx_data[0]),
.R(1'b0),
.S(1'b0)
);
3.3 b205_core.v - 核心处理模块
AXI4 总线路由
控制命令处理
响应数据多路复用
PPS 时间同步
用户设置寄存器
module b205_core #(
parameter R0_CTRL_SID = 8'h10, // 无线电控制流 ID
parameter U0_CTRL_SID = 8'h30, // 用户控制流 ID
parameter L0_CTRL_SID = 8'h40, // 本地控制流 ID
parameter R0_DATA_SID = 8'h50, // 无线电数据流 ID
parameter EXTRA_BUFF_SIZE = 12, // 额外缓冲大小
parameter RADIO_FIFO_SIZE = 11, // 无线电 FIFO 大小
parameter SAMPLE_FIFO_SIZE = 11 // 采样 FIFO 大小
)
控制输入
ctrl_tdata
axi_demux4
控制解复用器
R0 控制
无线电控制
L0 控制
本地控制
U0 控制
用户控制
3.4 radio_legacy.v - 无线电处理模块
无线电信号处理
DDC/DUC 链路控制
GPIO ATR 控制
时间戳管理
用户设置寄存器
module radio_legacy #(
parameter RADIO_FIFO_SIZE = 13, // 无线电 FIFO 大小
parameter SAMPLE_FIFO_SIZE = 11, // 采样 FIFO 大小
parameter FP_GPIO = 0, // 前面板 GPIO
parameter NEW_HB_INTERP = 1, // 新型半带插值器
parameter NEW_HB_DECIM = 1, // 新型半带抽取器
parameter SOURCE_FLOW_CONTROL = 0, // 源流控
parameter USER_SETTINGS = 0, // 用户设置寄存器
parameter DEVICE = "SPARTAN6" // 器件类型
)
地址 功能 说明 0x06 LOOPBACK 回环模式 0x08 SPI SPI 接口控制 0x12-0x18 ATR GPIO ATR 控制 0x21 TEST 测试寄存器 0x22 CODEC_IDLE 编解码器空闲值 0x32 READBACK 读回地址选择 0x64 TX_CTRL TX 控制 0x96 RX_CTRL RX 控制 0x128-0x130 TIME 时间戳 0x136 RX_FMT RX 格式 0x138 TX_FMT TX 格式 0x144-0x183 RX_DSP RX DSP 参数 0x184-0x1C3 TX_DSP TX DSP 参数 0x200-0x206 FP_GPIO 前面板 GPIO 0x253-0x254 USER_SR 用户设置寄存器 0x255 USER_RB_ADDR 用户读回地址
3.5 gpif2_slave_fifo32.v - FX3 接口模块
实现 GPIF Slave FIFO 模式
32 位数据总线
RX/TX FIFO 缓冲
数据包处理
gpif2_slave_fifo32 #(
.DATA_RX_FIFO_SIZE(13), // RX FIFO: 8K 样本
.DATA_TX_FIFO_SIZE(13) // TX FIFO: 8K 样本
) slave_fifo32 (
.gpif_clk(bus_clk),
.gpif_rst(bus_rst),
.gpif_enb(1'b1),
.gpif_ctl({FX3_CTL8, FX3_CTL6, FX3_CTL5, FX3_CTL4}),
.fifoadr({FX3_CTL11, FX3_CTL12}),
.slwr(FX3_CTL1),
.sloe(FX3_CTL2),
.slcs(FX3_CTL0),
.slrd(FX3_CTL3),
.pktend(FX3_CTL7),
.gpif_d(FX3_DQ),
.fifo_clk(bus_clk),
.fifo_rst(bus_rst),
.tx_tdata(tx_tdata),
.tx_tlast(tx_tlast),
.tx_tvalid(tx_tvalid),
.tx_tready(tx_tready),
.rx_tdata(rx_tdata),
.rx_tlast(rx_tlast),
.rx_tvalid(rx_tvalid),
.rx_tready(rx_tready),
.ctrl_tdata(ctrl_tdata),
.ctrl_tlast(ctrl_tlast),
.ctrl_tvalid(ctrl_tvalid),
.ctrl_tready(ctrl_tready),
.resp_tdata(resp_tdata),
.resp_tlast(resp_tlast),
.resp_tvalid(resp_tvalid),
.resp_tready(resp_tready)
);
4. 数据流分析
4.1 RX 数据流 主机接口
总线接口
DSP 处理
FPGA 接口
AD9364
RF 输入
ADC
DDR 输出
b205_io
DDR 接收
解复用
DDC Chain
数字下变频
NCO
混频
CORDIC
旋转
CIC 抽取器
半带滤波器
AXI FIFO
时钟域交叉
数据包门控
gpif2_slave_fifo32
FX3 接口
FX3 USB
主机 PC
AD9364 采样 : RF 信号经过 ADC 转换为 12 位 I/Q 数据
DDR 传输 : 通过 12 位 DDR 接口传输到 FPGA
解复用 : b205_io 将 DDR 数据解复用为 I 和 Q 分量
DDC 处理 :
NCO 混频:将信号下变频到基带
CORDIC 旋转:执行复数旋转
CIC 抽取:降低采样率
半带滤波:抗混叠滤波
时钟域交叉 : 通过 AXI FIFO 从 radio_clk 域到 bus_clk 域
数据包化 : 将样本打包成数据包
USB 传输 : 通过 FX3 传输到主机
4.2 TX 数据流 AD9364
FPGA 接口
DSP 处理
总线接口
主机接口
主机 PC
FX3 USB
gpif2_slave_fifo32
FX3 接口
AXI FIFO
时钟域交叉
DUC Chain
数字上变频
半带插值器
CIC 插值器
CORDIC
旋转
NCO
混频
复用
b205_io
DDR 发送
DDR 输入
DAC
RF 输出
USB 接收 : 主机通过 USB 发送 I/Q 样本
FIFO 缓冲 : gpif2_slave_fifo32 缓冲数据
时钟域交叉 : 通过 AXI FIFO 从 bus_clk 域到 radio_clk 域
DUC 处理 :
半带插值:提高采样率
CIC 插值:进一步提高采样率
CORDIC 旋转:执行复数旋转
NCO 混频:将信号上变频到 RF
复用 : 将 I 和 Q 分量复用到 DDR 接口
DDR 传输 : 通过 12 位 DDR 接口传输到 AD9364
DAC 转换 : AD9364 将数字信号转换为 RF
5. DSP 处理链
5.1 DDC Chain (数字下变频链) RX 输入
12 位 I/Q
输入复用
I/Q 交换/取反
NCO
数控振荡器
CORDIC
坐标旋转
CIC 抽取器
可配置抽取率
半带滤波器 1
2 倍抽取
半带滤波器 2
2 倍抽取
缩放
RX 输出
16 位 I/Q
地址 位宽 功能 BASE+0 32 NCO 相位增量 (频率控制) BASE+1 18 缩放因子 BASE+2 10 CIC 抽取率 + HB 使能 BASE+3 4 I/Q 交换、取反、实模式 BASE+4 22 半带滤波器系数重载
phase_inc = (f_desired / f_sample) * 2^32
f_desired: 期望的频率偏移
f_sample: 采样率
范围:1-128
总抽取率 = CIC 率 × 2^HB 使能数
最大抽取率:128 × 2 × 2 = 512
// NCO 相位累加器
always @(posedge clk)
if(rst)
phase <= 0;
else if(~run)
phase <= 0;
else
phase <= phase + phase_inc;
// CORDIC 旋转
cordic_z24 #(.bitwidth(cwidth)) cordic(
.clock(clk),
.reset(rst),
.enable(run),
.xi(to_cordic_i),
.yi(to_cordic_q),
.zi(phase[31:32-zwidth]),
.xo(i_cordic),
.yo(q_cordic),
.zo()
);
5.2 DUC Chain (数字上变频链) TX 输入
16 位 I/Q
半带插值器 1
2 倍插值
半带插值器 2
2 倍插值
CIC 插值器
可配置插值率
CORDIC
坐标旋转
NCO
数控振荡器
TX 输出
12 位 I/Q
地址 位宽 功能 BASE+0 32 NCO 相位增量 (频率控制) BASE+1 18 缩放因子 BASE+2 10 CIC 插值率 + HB 使能
CIC 插值率:1-128
半带插值:每个使能的 HB 提供 2 倍插值
总插值率 = CIC 率 × 2^HB 使能数
最大插值率:128 × 2 × 2 = 512
5.3 CORDIC 算法 CORDIC (Coordinate Rotation Digital Computer) 用于执行复数旋转:
x_out = x_in * cos(θ) - y_in * sin(θ)
y_out = x_in * sin(θ) + y_in * cos(θ)
24 位精度
算法增益:1.647
实现增益:0.5
总增益:0.8235
最大旋转增益:1.4142 (sqrt(2))
最坏情况总增益:1.1646
6. 控制接口
6.1 SPI 接口
配置 AD9364 寄存器
支持多从设备
可配置时钟极性和相位
output [7:0] sen, // 从设备使能
output sclk, // SPI 时钟
output mosi, // 主出从入
input miso // 主入从出
6.2 GPIO ATR 控制
根据 TX/RX 状态自动切换 GPIO
支持三种状态:IDLE、TX、RX
可配置每个状态的 GPIO 输出
初始状态
开始发送
开始接收
发送完成
接收完成
立即切换
立即切换
IDLE
TX
RX
地址 功能 SR_ATR+0 IDLE 状态 GPIO 值 SR_ATR+1 RX 状态 GPIO 值 SR_ATR+2 TX 状态 GPIO 值 SR_ATR+3 DDR 控制 (1=输出)
6.3 AXI4 流接口 // 数据通道
input [63:0] tdata, // 数据
input tlast, // 最后一个数据
input tvalid, // 数据有效
output tready // 准备接收
流类型 SID 方向 说明 R0_CTRL 0x10 双向 无线电控制 R0_DATA 0x50 双向 无线电数据 U0_CTRL 0x30 双向 用户控制 L0_CTRL 0x40 双向 本地控制
7 开发环境配置指南
7.1 ISE_14.7 虚拟机初始配置
步骤 1:创建虚拟机
在 Xilinx ISE 14.7 安装目录下,找到并运行 xsetup.exe。
安装时,把下载好的 uhd 驱动的宿主文件夹路径填写到对应的共享文件夹位置。本例子中为 E:\projects\fpgaFilter\uhd,映射到虚拟机里是 ~/projects/fpgaFilter/uhd。
安装完毕后,会创建一个新的虚拟机,默认名称为 ISE_14.7_VIRTUAL_MACHINE。
步骤 2:虚拟机配置 AI 辅助开发模式在 Windows 10 上运行 Oracle Linux 6 虚拟机,用于 Xilinx ISE 14.7 的 Spartan-6 FPGA 开发环境。
配置项 值 操作系统 Oracle Linux 6 虚拟机平台 Windows 10 + 虚拟化 FPGA 工具 Xilinx ISE 14.7 Python 版本 Python 3.6 (rh-python36) SSH 用户 ise SSH 地址 192.168.56.102 项目路径 ~/projects/fpgaFilter
步骤 3:系统基础配置 虚拟机使用双网卡,网卡 1 是 Hostonly 模式,用于与 Windows 主机通信。
网卡 2 是 NAT 或桥接模式,确保 Windows 主机可以通过 SSH 访问 192.168.56.102。
Oracle Linux 6 默认使用 Python 2.6,需要通过 Software Collections 安装 Python 3.6。
sudo yum install oracle-softwarecollection-release-el6.x86_64
sudo yum -y install scl-utils rh-python36
scl --list
scl enable rh-python36 bash
python --version
pip --version
7.2 从 Trar 主机连接到虚拟机
生成 SSH 密钥对
ssh-keygen -t rsa -b 4096
配置虚拟机 SSH
cat ~/.ssh/id_rsa.pub
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
7.3 AI 辅助开发集成 AI 辅助开发模式 SSH FPGA 构建任务提示词:
基本信息:
服务器地址 : 192.168.56.102
用户名 : ise
密码 : ise
项目路径 : 本地项目路径中的 projects 层级被网盘映射到 192.168.56.102 的/projects 文件夹,因此,本地的子路径都可以用这个规律推定。例如,本地项目路径为/projects/fpgaFilter,在服务器上的路径就是~/projects/fpgaFilter。
ISE 版本 : 14.7 (Spartan-6)
Python 版本 : 3.6 (通过 scl enable rh-python36 启用)
完整构建命令 ssh [email protected] "scl enable rh-python36 'cd ~/projects/path/to/top && source /opt/Xilinx/14.7/ISE_DS/settings64.sh && make B205mini'"
8. 构建与调试
8.1 构建流程 源代码
.v 文件
创建 ISE 项目
Makefile.b205.inc
综合
XST
映射
MAP
布局布线
PAR
位流生成
BitGen
生成报告
check_timing.py
8.2 输出文件 文件 位置 说明 b205.bit build/ FPGA 位流 (带头部) b205.bin build/ FPGA 位流 (无头部) b205.syr build/ 综合报告 b205.twr build/ 时序报告 b205.rpt build/ 利用率和时序摘要
8.3 资源利用率 典型资源使用 (B205mini, XC6SLX150):
资源 使用 总数 利用率 Slice Registers ~33,000 184,304 ~18% Slice LUTs ~73,000 184,304 ~40% Block RAM ~188 268 ~70% DSP48A1 ~151 180 ~84%
8.4 时序约束 // 时钟约束示例 (timing.ucf)
NET "bus_clk" TNM_NET = "bus_clk";
TIMESPEC "TS_bus_clk" = PERIOD "bus_clk" 10 ns HIGH 50%;
NET "radio_clk" TNM_NET = "radio_clk";
TIMESPEC "TS_radio_clk" = PERIOD "radio_clk" 16.276 ns HIGH 50%;
NET "FX3_PCLK" TNM_NET = "FX3_PCLK";
TIMESPEC "TS_FX3_PCLK" = PERIOD "FX3_PCLK" 10 ns HIGH 50%;
// 跨时钟域约束
TIMESPEC "TS_bus_to_radio" = FROM "bus_clk" TO "radio_clk" TIG;
9. 总结 B205mini FPGA 工程是一个完整的 SDR 平台,提供了灵活的硬件架构和丰富的 DSP 功能。通过理解其架构和模块,开发者可以轻松添加自定义功能。
9.1 关键要点
时钟域 : 理解 bus_clk 和 radio_clk 的交叉
数据流 : 掌握 RX/TX 数据流的完整路径
DSP 链 : 熟悉 DDC/DUC 的处理流程
控制接口 : 了解 SPI、GPIO ATR 和 AXI4 流
用户扩展 : 利用 USER_SETTINGS 添加自定义功能
9.2 进一步学习
9.3 社区资源 相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online