USRP 一般常见问题[ << USRP 简介 | ^ USRP FAQ 首页 ^ | FPGA/Verilog >> ] 闪烁的 LED
LED 指示灯是由母板上的 FX2 USB 控制器控制。当 USRP 刚一上电,一段特别小的程序从 256 byte 的 EEPROM 中载入。这段代码把 AD9862 设置成低功耗状态同时快速循环使得 LED 灯每秒闪烁三次。参见如下代码: 一旦“常规”固件载入,定时器中断服务例程 (isr_tick)使得闪烁变慢,参见如下代码: 输 出 "O" "U" "u" "a" 的意义
"u" = USRP "a" = audio (声卡) "O" = overrun (PC 无法同步地接受来自 USRP 或 声卡的数据 - PC not keeping up with received data from usrp or audio card) "U" = underrun(PC 无法快速的提供数据 - PC not providing data quickly enough) aUaU == audio underrun (PC 无法快速地给“漏”- 声卡提供数据 - not enough samples ready to send to sound card sink) uUuU == USRP underrun (PC 无法快速地给“漏”- USRP提供数据 - not enough sample ready to send to USRP sink) uOuO == USRP overrun (USRP 采样掉链源于它没有及时准备到位 - USRP samples dropped because they weren't read in time) 是的,速度快的计算机可以避免问题。当然,前提是没有让 USB 干它负荷不起的事情。理想的情况是 USB 负荷 32MB/s。建议尽量避免使用 Intel 的 Celeron 或 “缓存能力不强”的部件。 是否‘uO' 出现的频率同采样丢失的频率相同?- Does the number of 'uO's correspond to the number of samples dropped?
不是的。Overrun 的检测显示是由一个大概 10Hz 频率的循环来控制的。 如果以数据流的频率(显示),将无法看见 uO 字符。 USRP 的启动过程如何
USRP 自身不带任何性质的 ROM 固件,(EEPROM 内)仅仅几个字节的数据用来标识设备编号(VID),产品编号(PID)和版本修正号。当 USRP 第一次插入 PC 的 USB 连接器中,宿主机(上的 gnu radio)程序库便发现了一个没有被配置的 USRP。通过设备编号(VID),产品编号(PID)和版本修正号,程序库便可确认 USRP 是否被配置。此后它要做的第一件事就是下载描述 USB 外围控制器的(固件 -firmware)代码到母板上的 8051 器件中。当下载的代码一旦运行,USRP 便模拟常规 USB 的断开和重新连接的过程。
一旦重新连接,计算机便检测到不同的设备编号(VID),产品编号(PID)和版本修正号。正在运行的(固件 -firmware)代码同时定义了 USB 的端点(endpoints),接口(interfaces)和命令句柄(command handlers)。此时一条应当被 USB 控制器解释的命令便是下载 FPGA - 也就是说程序库识别到通过重新连接被配置成一个新设备的 USRP,它便进入启动的另一个阶段,下载配置 FPGA 的数据流。 一旦(固件 -firmware)代码被下载到FX2,它便配置其内部寄存器并重新启动它,同时将呈现出,通过 FX 断开再相连而标识出的,同USB相连的设备的“最终”的设备编号(VID),产品编号(PID)。 使用什么工具
编写 FPGA 程序使用 Verilog,编译使用 Altera 公司的 Quartus 。母板用 PADS 布局(PCB),但不提供布局(PCB)文件。原理图使用 gEDA。 5V 足以驱动 USRP
USRP 母板可以由 5V 电源驱动。但是大多数的子板需从 6V 调整到 5V,也就是说需要的正确电压是 5.5 到 5.75 V。只有只有 BasixRX 和 BasicTX 不需 6V。 USRP 的最大供电电压
不,不可以。USRP 使用线性调节器,所以加载 13.8V 结果导致负荷额外的10瓦能量。而且,母板上的很多电容器的电压范围是 6V, 10V 将毁坏它们。 USRP 母板保险丝
保险丝的尺 寸是 0603。规格 3Amps。 FPGA 时钟频率
当 Fmax 工作大于 64MHz 的频率时,FPGA 是足以胜任的(或者,我这么认为). 控制及协议
src = usrp.source_c (0, decim) src.set_rx_freq (0, IF_freq) src.set_pga(0,20) 请参阅代码 usrp_standard.{h,cc}, usrp_basic.{h,cc}, and usrp_prims.{h,cc}。它们都作为控制信息通过 USB 到端点 0(endpoint 0)。这些控制信息在 FX2 被解释并被执行。一般而言,通过 I2C 和 SPI 总线实现其意图。 通过 SPI 总线读写 FPGA 寄存器,AD9862 寄存器和子板。通过 I2C 配置 EEPROM 和子板。详细信息参阅 USRP 原理图。代码 usrp/firmware/include/usrp_spi_defs.h 包含 SPI 总线的定义。代码 usrp/firmware/include/usrp_i2c_addr.h 包含标准的 I2C 的地址的定义。还有一些子板用另外的子板插入时所赋予的插槽的功能。 缓存空间
USRP 在以下三个地方具有缓存: 在计算机: 目前 8MB 用于 TX, 8MB 用于 Rx. ( #如果有错的话# ) 在 Cypress FX2 USB 的外设: 2KB TX 和 2KB Rx. ( #FIXME# ) 在 FPGA: 4KB TX 和 4KB RX. 缓存两路 RX 链路
两个不同的链路交替的先进先出 FIFO。其数据如下顺序: CH1-I CH1-Q CH2-I CH2-Q 诸如此类... 配置 1TX, 1RX
编辑 config.vh,去掉 // ,开启下行命令: //`include "../include/common_config_1rxhb_1tx.vh" 用 // 关闭后面的命令 : `include "../include/common_config_2rxhb_2tx.vh" 通过 // 的使用,这样一来只有一个 RX 链路带半带滤波和一个 TX。 Python 中的可控参数
ADCs 总是用 12 位
采样。ADCs 是 14 位。USRP 内的数据处理是16位的。用 Python 你可以通过 USB 把它切换到 8 位。这可以让你加倍你的采样速率(16MSPS)。 控 制 I2C, 存储器映射,读EEPROM
PYTHON 可以干这些事情,出错大概用错了 I2C 的地址。 参看: [source:gnuradio/trunk/usrp/firmware/include/usrp_i2c_addr.h
usrp/firmware/include/usrp_i2c_addr.h]. 可与核实其地址。 但请注意,如仅想去读 EEPROM 的内容,最好请使用 read_eeprom。 python 的有关代码如下: u = usrp.sink_c(0) # or u = usrp.source_c(0) # returns a string s = u.read_eeprom(i2c_addr, eeprom_offset, nbytes) print s # returns a string s = u.read_i2c(i2c_addr, nbytes) print s 收/发 开关时延
通过 Python,在使用外部收/发开关时可以手动的调整自动收/发开关的时间偏置,以便更好的调整发射数据。 在早期的代码中,自动收/发功的能是基于 FPGA 的发送 FIFO 寄存器中是否有数据来切换的。然而这没有考虑到 FPGA 插值器和 AD9862 的DAC 上变频的管道时滞(pipeline delay)问题。尽管实际情况取决于发射端的插值速率,在发送数据被全部传送完之前这有可能导致 ATR (自动收/发功能切换)信号或早 25 us,或迟 35us。如果使用用高速外部 Rx/Tx 切换的话,可能会导致发射数据流的切分( slicing off the end of a transmission)。 新添加的功能是在 ATR (自动收/发功能切换)信号的上升和下降沿添加了一个独立的,可配置的精确到一个时钟的时延。在需要配置 ATR (自动收/发功能切换)时,只需调用下面所示的两个新的子板的功能: subdev.set_atr_tx_delay(clock_ticks_to_delay_tx) # Rising edge subdev.set_atr_rx_delay(clock_ticks_to_delay_rx) # Falling edge ... 其中的‘subdev’ 是在使用子板时生成的对象。 (目前的) 困难是如何找出合适的偏置值,这个偏置值能很好的表达从ATR (自动收/发功能)信号突发到子板信号发射完毕的震荡。 目前采用的方法是让 FPGA 确定应当放置什么值( 或甚至放置缺省值),但还没有找到一个最好的方法来实现它。不同的外部 Rx/Tx 切换需配置需要不同的参数,没有找到一个统一的答案。 在这儿给出经验性的估计, 通过 USRP 发射链路的管道时延大约是 50 + 3x (插值速率)个时钟。似乎下降沿需要比这长的时延才能使信号能量降到零,这似乎还同具体的数据相关联。总之最佳值取决于具体的应用。 USRP参考时钟的稳定度
时钟具有 20 ppm 的精度,但是在室温的情况,一般都在 5 ppm 内. 带内发射时间戳
温度特性
USRP 上的所有芯片的温度特性都在 0 - 70 C 的范围。在室温的情况下 USRP 能够连续工作好多天。任何附件单元(子板)都会消耗电源。取决于不同子板,这可高达 15 - 18 Watts。 本地环回接口
FPGA 代码有本地环回接口。它通过写 FR_MODE 存储器使能。在 Verilog 代码中查找“loopback", 并查找 fpga_regs_common.{h,v}。 USB: 480MBit/sec => 32MByte/sec
USRP 很容易达到 256 Mbits/s (也就是 32 MByte/sec)。USB 2.0 的信号处理速率可达 480 MBits/sec,或者说 60 MByte/sec。由于数据包头数据和数据包之间的空闲间隔的存在,无法占满整个 480 MByte/sec 的信道。可以通过压缩来扩展一些带宽,但这不是当务之急。USRP 需要双向(双工)通信,这也导致接口芯片中的 8位微处理器也有微码的时延(firmware delays)。 如果有人对此感兴趣,可以重编该微码(firmware)使得在没有数据传输时,硬件使用自动模式。(重编后的)微码应当知道或被告知,什么时候切换为传入或什么时候切换为传出。这也需要占用25%的带宽。 RFX: 20MHz 带宽信号
20 MHz 表示的是基带滤波器的的带宽。所以可以从 LO(本地振荡缓冲器)任意的上下 +/- 10MHz 来调整。如果使用 16 位采样,只需顾及 USB 的带宽。 为何 20 MHz 很有用?有以下三个例证:
DC 偏置的去除
注: General Questions(原文出处,翻译整理仅供参考!) |