项目概述

HackRF CPLD固件是HackRF软件定义无线电设备中的关键组件,负责在LPC43xx微控制器的SGPIO外设和MAX5864射频编解码器之间提供接口。该固件使用VHDL硬件描述语言编写,运行在Xilinx CoolRunner-II XC2C64A CPLD芯片上。

项目结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
cpld/
├── README                          # 主要说明文件
├── sgpio_if/                       # 主要SGPIO接口模块
│   ├── README.md                   # 详细构建和编程说明
│   ├── top.vhd                     # 主要VHDL源代码
│   ├── top.ucf                     # 用户约束文件(引脚分配)
│   ├── top_tb.vhd                  # 测试台文件
│   ├── sgpio_if.xise               # Xilinx ISE项目文件
│   ├── top.jed                     # JEDEC编程文件
│   ├── default.xsvf                # 主要编程文件(二进制)
│   └── program                     # 编程脚本
└── sgpio_if_passthrough/           # 直通模式模块
    ├── README.md                   # 说明文件
    ├── top.vhd                     # 直通模式VHDL源代码
    ├── top.ucf                     # 约束文件
    ├── sgpio_if_passthrough.xise   # ISE项目文件
    ├── sgpio_if_passthrough.svf    # 编程文件
    └── program                     # 编程脚本

核心模块分析

1. sgpio_if 模块(主要接口)

功能概述

这是HackRF的主要CPLD固件,实现了LPC43xx微控制器SGPIO外设与MAX5864射频编解码器之间的数据接口。

端口定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
entity top is
    Port(
        -- 主机接口(SGPIO)
        HOST_DATA       : inout std_logic_vector(7 downto 0);  -- 8位双向数据总线
        HOST_CAPTURE    : out   std_logic;                     -- 数据捕获信号
        HOST_DISABLE    : in    std_logic;                     -- 禁用信号
        HOST_DIRECTION  : in    std_logic;                     -- 传输方向控制
        HOST_DECIM_SEL  : in    std_logic_vector(2 downto 0);  -- 抽取选择
        HOST_Q_INVERT   : in    std_logic;                     -- Q通道反相控制
           
        -- 编解码器接口
        DA              : in    std_logic_vector(7 downto 0);  -- ADC数据输入
        DD              : out   std_logic_vector(9 downto 0);  -- DAC数据输出

        -- 时钟信号
        CODEC_CLK       : in    std_logic;                     -- 编解码器时钟
        CODEC_X2_CLK    : in    std_logic                      -- 2倍编解码器时钟
    );
end top;

核心功能

1. 时钟管理

  • CODEC_CLK: 编解码器基础时钟,用于I/Q数据同步
  • CODEC_X2_CLK: 2倍频时钟,通过BUFG缓冲器作为主机时钟

2. 数据传输方向控制

1
2
3
4
5
type transfer_direction is (from_adc, to_dac);
signal transfer_direction_i : transfer_direction;

transfer_direction_i <= to_dac when HOST_DIRECTION = '1'
                               else from_adc;

3. I/Q数据处理

  • 接收模式(from_adc)

    • I通道:data_to_host_o <= adc_data_i xor X"80"(非反相)
    • Q通道:data_to_host_o <= adc_data_i xor rx_q_invert_mask(可配置反相)
  • 发送模式(to_dac)

    • I通道:dac_data_o <= (data_from_host_i xor X"80") & "00"
    • Q通道:dac_data_o <= (data_from_host_i xor tx_q_invert_mask) & tx_q_invert_mask(0) & tx_q_invert_mask(0)

4. 抽取功能

1
2
3
4
5
signal decimate_count : std_logic_vector(2 downto 0) := "111";
signal decimate_sel_i : std_logic_vector(2 downto 0);
signal decimate_en : std_logic;

decimate_en <= '1' when decimate_count = "111" else '0';
  • 支持可配置的数据抽取率,用于降低数据速率
  • 抽取计数器从HOST_DECIM_SEL值开始递增到"111"

5. 捕获信号生成

  • 接收模式:在Q通道时钟下降沿且抽取使能时产生捕获信号
  • 发送模式:在I通道时钟上升沿产生捕获信号

引脚分配(top.ucf)

时钟信号

  • CODEC_CLK: 引脚23(25ns周期约束)
  • CODEC_X2_CLK: 引脚27

ADC数据输入(DA[7:0])

  • DA[7]: 引脚35 → DA[0]: 引脚43

DAC数据输出(DD[9:0])

  • DD[9]: 引脚17 → DD[0]: 引脚34

主机接口

  • HOST_DATA[7:0]: 引脚77,61,64,67,72,74,79,89
  • HOST_CAPTURE: 引脚91
  • HOST_DIRECTION: 引脚71
  • HOST_DISABLE: 引脚76
  • HOST_DECIM_SEL[2:0]: 引脚78,81,90
  • HOST_Q_INVERT: 引脚70

2. sgpio_if_passthrough 模块(直通模式)

功能概述

这是一个简化的直通模式固件,允许LPC43xx微控制器的SGPIO外设直接连接到外部引脚,绕过射频编解码器。

端口定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
entity top is
    Port(
        SGPIO           : inout std_logic_vector(15 downto 0); -- 16位SGPIO信号
        DA              : in    std_logic_vector(7 downto 0);  -- ADC数据(未使用)
        DD              : out   std_logic_vector(9 downto 0);  -- DAC数据(固定输出)
        CODEC_CLK       : in    std_logic;                     -- 编解码器时钟
        CODEC_X2_CLK    : in    std_logic;                     -- 2倍编解码器时钟
        B1AUX           : in    std_logic_vector(16 downto 9); -- 辅助输入
        B2AUX           : inout std_logic_vector(16 downto 1)  -- 辅助双向
    );
end top;

核心功能

方向控制

1
2
transfer_direction_i <= to_sgpio when B1AUX(9) = '0'
                                 else from_sgpio;

数据路由

  • B1AUX(9) = '0': 输入模式,B2AUX[1-16] → SGPIO[0-15]
  • B1AUX(9) = '1': 输出模式,SGPIO[0-15] → B2AUX[1-16]

DAC输出

1
DD <= (DD'high => '1', others => '0'); -- 固定输出模式

时序约束分析

主要时序约束

  1. CODEC_X2_CLK周期: 25ns(40MHz)
  2. ADC数据建立时间: 输入偏移16ns
  3. DAC数据保持时间: 输出偏移15ns
  4. 主机数据偏移: 输出偏移20ns

时钟域

  • adc_data: ADC数据输入时钟域
  • dac_data: DAC数据输出时钟域
  • to_host: 主机数据输出时钟域

编程和部署

开发环境要求

  • Xilinx WebPACK 13.4(Windows或Linux)
  • Dangerous Prototypes Bus Blaster v2(配置JTAGKey缓冲器)
  • urJTAG(支持libftdi)
  • Xilinx CoolRunner-II XC2C64A BSDL模型文件

编程流程

  1. 生成XSVF文件

    • 在ISE中双击"Configure Target Device"
    • 使用iMPACT生成XSVF文件
    • 执行擦除、编程、验证步骤
  2. CPLD编程

    1
    2
    3
    4
    5
    
    # 使用主要固件
    hackrf_cpldjtag -x sgpio_if/default.xsvf
    
    # 或使用编程脚本
    ./program

测试台分析

测试台文件(top_tb.vhd)提供了完整的仿真环境:

时钟生成

  • CODEC_X2_CLK: 40MHz(25ns周期)
  • CODEC_CLK: 20MHz(50ns周期)

测试场景

  1. ADC数据模拟: I/Q交替数据模式
  2. SGPIO控制: 接收/发送模式切换
  3. 抽取测试: 可配置抽取率验证

技术特点

优势

  1. 低延迟: 直接硬件实现,最小化数据传输延迟
  2. 灵活配置: 支持多种抽取率和I/Q反相选项
  3. 双向传输: 同时支持接收和发送模式
  4. 时钟同步: 精确的时钟域管理确保数据完整性

应用场景

  1. 主要模式(sgpio_if): 正常的SDR收发操作
  2. 直通模式(sgpio_if_passthrough): 调试、测试或特殊应用

SVF/XSVF文件详解

什么是SVF/XSVF文件?

SVF (Serial Vector Format)XSVF (Xilinx Serial Vector Format) 是用于JTAG编程的标准文件格式:

  • SVF文件: 标准的IEEE 1149.1 JTAG测试向量格式,包含了对CPLD进行擦除、编程和验证的完整指令序列
  • XSVF文件: Xilinx的压缩版SVF格式,文件更小,执行更快

文件内容

这些文件包含:

  1. JTAG指令序列: 具体的位流数据和控制命令
  2. 编程数据: CPLD的配置比特流
  3. 验证数据: 用于确认编程成功的校验信息

为什么需要这些文件?

  • CPLD是可编程器件,需要通过JTAG接口加载配置
  • SVF/XSVF文件就像是"安装包",包含了完整的硬件配置信息
  • 通过JTAG编程器(如Bus Blaster)将这些配置写入CPLD芯片

CPLD功能的实际价值

虽然CPLD的逻辑看起来简单,但它解决了几个关键问题:

1. 接口匹配问题

  • 时钟域转换: 微控制器和射频芯片工作在不同的时钟域
  • 电平转换: 确保信号电平兼容
  • 时序同步: 精确控制数据采样时机

2. 实时性要求

  • 硬件实现: 避免软件处理延迟,确保实时数据流
  • 零延迟切换: I/Q通道切换无需软件干预
  • 高速数据流: 支持高采样率的连续数据传输

3. 灵活性配置

  • 可重配置: 通过不同固件支持不同工作模式
  • 参数调整: 抽取率、反相等参数可动态配置
  • 调试支持: 直通模式便于系统调试

4. 系统架构优化

1
2
[LPC43xx微控制器] ←→ [CPLD接口层] ←→ [MAX5864射频芯片]
     软件控制           硬件桥接         模拟前端

简单但关键的设计哲学

  • 专用化: 每个组件做好自己最擅长的事
  • 解耦合: CPLD隔离了数字和模拟部分的复杂性
  • 可维护: 硬件逻辑简单,便于调试和修改

总结

HackRF CPLD固件虽然逻辑相对简单,但它是整个系统的关键"胶水层":

核心价值

  • 解决了不同芯片间的接口匹配问题
  • 提供了硬件级的实时数据处理能力
  • 通过可编程特性支持系统的灵活配置

设计理念

  • 简单可靠:避免过度复杂化,确保稳定性
  • 专业分工:让每个组件专注于自己的核心功能
  • 可扩展性:通过重新编程支持新功能

SVF/XSVF文件就是这个"胶水层"的"安装程序",将精心设计的接口逻辑烧录到CPLD芯片中,使整个HackRF系统能够正常工作。这种看似简单的设计,实际上体现了优秀的系统架构思维。