FPGA Verilog 问题 是的,可以被修改。FPGA 的 Verilog 的顶层文件可以在 usrp/fpga/toplevel/usrp_std/usrp_std.v 找到,其它的代码在 usrp/fpga/sdr_lib/*.v。 如果想从源代码来构建 FPGA 的 .rbf 文件(这其实没有必要,在 usrp/fpga/rbf 的目录下已经提供预编译好的 .rbf 文件),便需要 Altera 公司的免费工具软件 Qutarus II。我们使用的是 Quartus II Web 版。 ( 对于FPGA 接收(RX )链路而言,DC 偏置 (DC offset) 去除的过程中,其输入被赋值如下: .adc_in({adc0[11],adc0,3'b0}) 其中,1位符号延伸,12位原始数据位,然后3位0标志。 对于FPGA 的发射(TX)链路而言,可参看 [source:gnuradio/trunk/usrp/fpga/toplevel/usrp_std/usrp_std.v#L179
usrp_std.v] 它没有被使能(激活)。如果被激活的话,它将替代 AD9862 中的 DUC 在 FPGA 中起上变频的作用。请注意,此代码多年都没有做过任何测试,(所以对它想做些工作)是有些困难的。 serial_io.v 仅仅用于读写 FPGA 的寄存器。
真实的进出 DACs/ADCs (DUCs/DDCs) 的数据是通过 16-位 GPIF 总线。(#帮帮我# 我没有回答这儿的所有的问题!)
参考: AD9862 Data Sheet. #FIXME: cannot reference attachments of other objects USB 的时钟由 FX2 提供,它的频率是 48 MHz。 8051 位拆裂的(bit-bangs -软件替代专职硬件的串行通信的技术产生的) SDI (串行数据输入)、时钟、及选通脉冲信号。相比 FPGA 的其它功用它的响应很“慢”,源码参考:usrp/firmware/src/usrp2/spi.c。 FIFO 段的长度是 4K行,每行是 16 位。
正确。
它的调整原理如下。如果角度是正值便减少;如果角度是负值便增加。它是不停地趋近零值。 写测试用例 (testbench),必须恰当的设置内插频率。如果想用 CORDIC 还必须设置好相位累积器。应当把(选通)采样频率设置为 Fs。其 Fs 是小于时钟频率并且满足 Fs x interp_rate = the clock rate。这样一来以频率 Fs 把采样数据(选通)送往链路。 还应当确认内插频率(定时或同步的选通脉冲)和采样频率(定时或同步的选通脉冲)的一致连贯性 -- 比如说:每 15 个时钟(补插和采样一次)。不能随机设置或撤销。 并不需要一组(测试)频率。只需这么一些频率,这些频率之间应当具有2*PI 的相位差,而每个 CORDIC 的采样频率值是处于 231-1 之内。可能需要 sine 函数波形或者一些滤波信号,尝试一下脉冲链{1,0,1,0,...}或者下载 [source:gnuradio/branches/developers/zhuochen/simulations/burst_test/math_real.v math_real.v] 模块,如下的测试用例 [source:gnuradio/branches/developers/zhuochen/simulations/burst_test/test_chan_fifo_reader.v test_chan_fifo_reader.v] 可以被用来产生一些 sine 和 cosines 函数。 对于前期综合、RTL仿真和测试,使用 Linux 版本的 ICARUS Verilog 和 GTKWave。 (这里)值得注意的是,如若计划使用 ICARUS Verilog,需参阅最新的开发者指导简介,因为此前编写的代码在使用中发现有些纰漏。 在这里肯定得不到赞同的是,在对自己所做的事情没有把握的情况下,却简单地把这些代码下载到 FPGA 去运行它。精确地建模会节约大量的诊错时间。 头文件 config.vh(骨架?)掌控着配置的构建而且是功能化的。修改它 // Uncomment this for 1 RX channel (w/ halfband) & 1 transmit channel这样便可节省出 FPGA 大量的资源!
decimator_strobe 是由抽取器-级联积分梳状滤波器(CIC Filters)产生,用于特定和抽取频率下用。如果抽取系数为N,你会得到一个 1/N 周期的采样。这个比率在此链路中一直被保存。 hb_strobe 来自于半带(HB FIR)滤波器。它是一个抽取系数为常数 2 ,在半带(HB FIR) 滤波器需要把数据送出 RX 链路时被使能。serial_* serial_* (serial_addr, serial_data, serial_strobe)是用来写寄存器的接口。如果你想在模块内修改任何寄存器,简单的串行接口 FX2 -> FPGA 便能改变它们。在这种情况下,他们一般被用于 FPGA 的 CORDIC 的相位累加器相关联的寄存器。 debug* (debugdata, debugctrl )正如名字暗示是用于诊错。在目前的构架中,它好像是输入到半带(HB FIR) 滤波器是诊错总线的输出(#帮帮我,可能有错#) 仅用作提供一点信息,插值选通(interpolation strobes)和滤波模块可参考 [source:gnuradio/trunk/usrp/fpga/sdr_lib/master_control.v master_control.v]。 管道流水线模块(pipeline module)全速的采样信号,它需 12 个管道流水线阶段并输出旋转向量(rotated vector)。为何是12,仅仅是用于生成寄存器并表示阶段用。也可以表现更深的管道流水线(更多的管道流水线阶段),甚至用变量表现管道流水线阶段。TODO 在此被建议用来关联变量的长度 - 不太确定是运行还是构建阶段,无论如何值得去尝试。 是的、可以, 比如,在构建 tx_usb_fifo 和 rx_usb_fifo 中,可以让 Quartus 产生一个合适的双时钟 FIFO 巨集(megacell)。基于此,Matt 已经产生 fifo_2k 和 fifo_4k 模块。参考Quartus的手册和《Cyclone Device Handbook》。 module setting_reg(input clock, input reset, input strobe, input wire [6:0] addr, input wire [31:0] in, output reg [31:0] out, output reg changed); 在[source:gnuradio/trunk/usrp/fpga/sdr_lib/master_control.v master_control.v] 所谈及的模块中, 发现 setting_reg 被如下方式调用: setting_reg #(`FR_MASTER_CTRL) sr_mstr_ctrl(.clock(master_clk),.reset(1'b0),.strobe(serial_strobe), .addr(serial_addr),.in(serial_data),.out(master_controls)); 然而,在[source:gnuradio/trunk/usrp/fpga/sdr_lib/setting_reg.v setting_reg.v] 所涉及的模块中, setting_reg 模块有一个输出信号被称为 "changed". 有人能告诉我 "changed" 信号的情况吗? “changed” 已不使用, 被淘汰了. 注:FPGA Verilog Questions(原文出处,翻译整理仅供参考!) |