0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >计算机及配件 > 基于FPGA的正交数控振荡器(NCO)的设计与实现

基于FPGA的正交数控振荡器(NCO)的设计与实现

来源: 维库电子网
2021-11-04
类别:计算机及配件
eye 5
文章创建人 拍明

原标题:基于FPGA的正交数控振荡器(NCO)的设计与实现

基于FPGA的正交数控振荡器(NCO)的设计与实现

引言

在现代通信、雷达、电子对抗以及信号处理等众多领域,数字信号处理技术发挥着至关重要的作用。正交数控振荡器(Numerical Controlled Oscillator,NCO)作为数字信号处理中的关键组件,能够产生可控的正弦波和余弦波,为各种数字调制解调、频率合成等操作提供精确的载波信号。FPGA(Field Programmable Gate Array,现场可编程门阵列)以其高度的可编程性、灵活性和并行处理能力,成为实现正交NCO的理想平台。通过在FPGA上设计并实现正交NCO,可以满足不同应用场景对频率、相位和幅度的精确控制需求,提高系统的性能和效率。

image.png

正交NCO的基本原理

NCO的组成结构

正交NCO主要由相位累加器、正弦查找表和数字到模拟转换器(DAC)三个核心部分组成。

相位累加器是NCO的核心模块,它由一个加法器和一个寄存器构成。在系统时钟的驱动下,相位累加器不断累加输入的频率控制字(Frequency Control Word,FCW),产生连续的相位值。这个相位值决定了输出信号在正弦查找表中的位置,其累加过程类似于一个计数器,每接收到一个时钟脉冲,就按照频率控制字的值进行递增。例如,若频率控制字为K,系统时钟频率为fc,相位累加器的位数为N,则在每个时钟周期,相位累加器的值会增加K。经过一定数量的时钟周期后,相位累加器的值会溢出,重新从零开始累加,从而实现相位的循环。

正弦查找表存储了正弦波的离散样本值。根据相位累加器输出的相位值,查找表能够输出相应的正弦波样本值。为了提高资源利用率和减少存储空间,通常利用正弦波在一个周期内的对称性,只存储部分样本值,然后通过一定的算法和逻辑电路来生成完整的正弦波。例如,可以利用正弦波关于x轴和y轴的对称性,将查找表的大小减少到原来的四分之一。在实际应用中,查找表的数据位数和地址位数会根据系统对频率分辨率和信号精度的要求进行选择。

数字到模拟转换器将查找表输出的数字信号转换为模拟信号,以供后续的信号处理或调制使用。DAC的转换精度和速度会影响NCO输出信号的质量和性能。高精度的DAC可以提供更平滑的模拟信号,减少量化噪声;快速的DAC则可以满足高速信号处理的需求。

正交NCO的工作原理

正交NCO的工作过程如下:首先,系统接收输入的频率控制字和相位控制字(Phase Control Word,PCW)。频率控制字决定了输出信号的频率,相位控制字则用于设置输出信号的初始相位。在每个系统时钟周期,相位累加器将频率控制字与自身的反馈值相加,得到当前的相位值。这个相位值经过适当的处理(如截断、偏移等)后,作为正弦查找表的地址。查找表根据该地址输出相应的正弦波和余弦波样本值(正交输出),这些数字样本值再经过DAC转换为模拟信号,最终得到所需的正交正弦波和余弦波信号。

例如,假设系统时钟频率fc = 100MHz,相位累加器位数N = 32,频率控制字K = 268435456(对应输出频率fout = K * fc / 2N = 25MHz)。在每个时钟周期,相位累加器的值会增加268435456。当相位累加器的值达到232时,会发生溢出并重新从零开始累加。相位累加器输出的高16位作为正弦查找表的地址,查找表根据该地址输出相应的正弦波和余弦波样本值,经过DAC转换后得到25MHz的正交正弦波和余弦波信号。

FPGA实现正交NCO的关键技术

相位累加器的设计

相位累加器是NCO性能的关键因素之一,其设计需要考虑速度、资源和精度等因素。在FPGA中,可以利用进位链和流水线技术来提高相位累加器的性能。

进位链是FPGA中一种特殊的逻辑结构,它能够快速传递进位信号,实现高速的加法运算。利用进位链可以实现快速、高效的相位累加器电路结构。然而,长的进位链会减少其他逻辑使用的布线资源,并且过长的进位链会制约整个系统速度的提高。因此,在实际设计中,通常会采用进位链和流水线技术相结合的方法。

流水线技术是将一个复杂的逻辑操作分解为多个简单的步骤,并在每个步骤之间插入寄存器,将数据流分成多个阶段进行处理。这样可以提高系统的数据吞吐率,减少关键路径的延迟。例如,对于一个32位的相位累加器,可以将其分解为多个8位或16位的加法器,并在每个加法器之间插入寄存器,形成流水线结构。这样,每个时钟周期可以完成一个阶段的加法运算,经过几个时钟周期后,就可以得到最终的相位累加结果。采用流水线技术设计的相位累加器既能保证具有较高的资源利用率,又能大幅提高系统的性能和速度。

正弦查找表的优化设计

正弦查找表的设计直接影响NCO的频率分辨率、信号精度和资源消耗。为了在满足系统性能要求的前提下,尽可能减少存储资源的开销,可以采用以下几种优化方法:

利用正弦波的对称性:正弦波在一个周期内具有关于x轴和y轴的对称性。利用这些对称性,可以将查找表的大小减少到原来的四分之一。例如,只需要存储正弦波在0到π/2区间内的样本值,然后通过对称变换得到其他区间的样本值。具体实现时,可以根据相位累加器输出的相位值进行判断和处理,将相位值映射到0到π/2区间内,然后从查找表中读取相应的样本值,再根据相位值所在的区间进行适当的变换(如取反、移位等)得到完整的正弦波和余弦波样本值。

采用分级查找表结构:对于需要高频率分辨率和高精度的NCO,可以采用分级查找表结构。分级查找表将整个查找表分成多个子查找表,每个子查找表存储一部分相位区间的正弦波样本值。通过相位累加器输出的相位值的高位选择相应的子查找表,低位作为子查找表的地址,从而减少每个子查找表的大小,降低资源消耗。例如,对于一个16位的相位累加器,可以将查找表分成16个子查找表,每个子查找表存储256个样本值。相位累加器输出的高4位用于选择子查找表,低12位作为子查找表的地址。

采用压缩存储技术:除了利用对称性和分级结构外,还可以采用一些压缩存储技术来进一步减少查找表的存储空间。例如,可以采用差分编码、游程编码等方法对查找表中的数据进行压缩,然后在读取数据时进行解压缩。这种方法可以在一定程度上减少存储资源的消耗,但会增加一定的硬件复杂度和处理延迟。

CORDIC算法在NCO中的应用

CORDIC(Coordinate Rotation Digital Computer)算法是一种用于计算三角函数、双曲函数等超越函数的迭代算法,它只需要通过简单的移位和加法运算即可实现复杂的函数计算,非常适合在FPGA中实现。在NCO中,CORDIC算法可以用于替代正弦查找表,生成正弦波和余弦波样本值,从而避免使用大容量的存储器,节省资源。

CORDIC算法的基本思想是通过一系列固定角度的不断旋转逼近所需旋转的角度,实现向量旋转和三角函数计算。假设初始向量V1(x1, y1)旋转角度θ后得到向量V2(x2, y2),若每次旋转的角度θi是正切值为2的倍数,即θi = arctan(2^(-i)),则可以通过一系列的迭代运算逐步逼近最终的旋转结果。在每次迭代中,根据当前旋转角度的正切值和旋转方向,对向量的x和y分量进行移位和加法运算,同时更新剩余的旋转角度。经过多次迭代后,向量的x和y分量将趋近于初始向量旋转θ角度后的结果,即x2 = x1 * cosθ - y1 * sinθ,y2 = x1 * sinθ + y1 * cosθ。通过选择合适的初始向量和迭代次数,可以得到所需的正弦波和余弦波样本值。

在FPGA中实现CORDIC算法时,为了提高运算速度,通常采用流水线结构。将CORDIC算法的每次迭代运算设计为一个流水线级,每个流水线级包含移位器和加法器等基本运算单元。级与级之间直接相连,不需要额外的寄存器,数据在流水线中连续流动,每个时钟周期可以输出一个计算结果。例如,对于一个16级的CORDIC流水线结构,经过16个时钟周期后,就可以得到一个完整的正弦波和余弦波样本值。采用流水线结构可以大大提高CORDIC算法的运算速度,满足实时信号处理的需求。

基于FPGA的正交NCO的硬件设计

整体硬件架构

基于FPGA的正交NCO的硬件架构主要包括频率控制字寄存器、相位控制字寄存器、相位累加器、相位相加器、CORDIC算法模块(或正弦查找表模块)、输出寄存器和DAC接口等部分。

频率控制字寄存器用于存储输入的频率控制字,它决定了NCO输出信号的频率。相位控制字寄存器用于存储输入的相位控制字,用于设置输出信号的初始相位。相位累加器在系统时钟的驱动下,不断累加频率控制字,产生连续的相位值。相位相加器将相位累加器的输出与相位控制字相加,得到当前的相位值。CORDIC算法模块(或正弦查找表模块)根据当前的相位值生成正弦波和余弦波样本值。输出寄存器用于缓存生成的样本值,保证数据的稳定输出。DAC接口将数字样本值转换为适合DAC输入的格式,并控制DAC进行模拟信号转换。

元器件选型及作用

FPGA芯片选型

在选择FPGA芯片时,需要考虑其资源、性能、功耗、成本等因素。以下是一些常用的FPGA芯片型号及其特点:

Xilinx Artix - 7系列:Artix - 7系列FPGA具有较高的性价比,适合对成本和功耗有一定要求的应用场景。它提供了丰富的逻辑资源、DSP slices和Block RAM,能够满足中等规模的正交NCO设计需求。例如,XC7A35T - 1FGG484I芯片具有33280个逻辑单元、90个DSP slices和1.8Mb的Block RAM,工作时钟频率可达200MHz以上,能够支持较高频率的正交NCO实现。

Xilinx Kintex - 7系列:Kintex - 7系列FPGA在性能和资源方面比Artix - 7系列更加强大,适合对性能要求较高的应用场景。它具有更多的逻辑资源、DSP slices和Block RAM,以及更高的工作时钟频率。例如,XC7K325T - 2FFG900I芯片具有326080个逻辑单元、840个DSP slices和16.02Mb的Block RAM,工作时钟频率可达300MHz以上,能够实现高速、高精度的正交NCO。

Intel Cyclone V系列:Cyclone V系列FPGA是Intel公司推出的一款低功耗、高性能的FPGA产品,具有丰富的逻辑资源和I/O接口,适合对功耗和成本敏感的应用场景。例如,5CGXFC9E7F35C8N芯片具有93270个逻辑单元、150个18x18乘法器和4.9Mb的嵌入式存储器,工作时钟频率可达200MHz左右,能够满足一般正交NCO的设计要求。

选择FPGA芯片时,需要根据具体的应用需求、开发成本和开发周期等因素进行综合考虑。如果应用场景对性能要求较高,需要实现高速、高精度的正交NCO,可以选择Xilinx Kintex - 7系列或更高性能的FPGA芯片;如果对成本和功耗有一定要求,可以选择Xilinx Artix - 7系列或Intel Cyclone V系列FPGA芯片。

DAC芯片选型

DAC芯片的作用是将NCO输出的数字信号转换为模拟信号,其性能直接影响正交NCO输出信号的质量。在选择DAC芯片时,需要考虑其分辨率、转换速度、线性度、功耗等因素。以下是一些常用的DAC芯片型号及其特点:

AD9767:AD9767是一款双通道、14位、200MSPS的DAC芯片,具有高速、高精度的特点。它采用了多比特架构,能够提供良好的动态性能和低噪声特性。AD9767的输出电压范围可调,支持多种输出模式,适合与高速正交NCO配合使用,实现高质量的模拟信号输出。

DAC908E:DAC908E是一款单通道、14位、165MSPS的DAC芯片,具有低功耗、小封装的特点。它采用了电流输出架构,输出电流范围可调,能够与外部运算放大器配合实现不同的输出电压范围。DAC908E的建立时间短,能够满足高速信号转换的需求,适合对功耗和成本有一定要求的应用场景。

AD9122:AD9122是一款双通道、16位、1200MSPS的高性能DAC芯片,具有极高的转换速度和精度。它采用了先进的架构和工艺,能够提供出色的动态性能和低失真特性。AD9122支持多种输入数据格式和时钟模式,具有丰富的控制接口,适合与高端正交NCO配合使用,实现超高速、高精度的模拟信号输出。

选择DAC芯片时,需要根据正交NCO的输出频率、精度要求以及系统对功耗、成本等因素的限制进行选择。如果需要实现高速、高精度的模拟信号输出,可以选择AD9767或AD9122等高性能DAC芯片;如果对功耗和成本有一定要求,可以选择DAC908E等低功耗、小封装的DAC芯片。

各元器件功能详解

FPGA芯片功能

FPGA芯片是正交NCO的核心控制和处理单元,它实现了相位累加器、相位相加器、CORDIC算法模块(或正弦查找表模块)等功能。FPGA通过接收输入的频率控制字和相位控制字,控制相位累加器进行相位累加运算,生成连续的相位值。然后,根据设计选择,将相位值送入CORDIC算法模块或正弦查找表模块,生成正弦波和余弦波样本值。最后,通过输出寄存器和DAC接口将样本值输出到DAC芯片进行模拟信号转换。

FPGA芯片还提供了丰富的I/O接口和时钟管理资源,用于与外部设备进行通信和控制。例如,可以通过SPI、I2C等接口与微控制器进行通信,接收频率和相位控制参数;可以利用FPGA内部的PLL(Phase - Locked Loop)模块生成不同频率的时钟信号,满足系统不同模块的时钟需求。

DAC芯片功能

DAC芯片的主要功能是将FPGA输出的数字样本值转换为模拟信号。它接收FPGA输出的数字信号,根据其内部的转换电路将数字量转换为相应的电流或电压信号。DAC芯片的转换精度和速度直接影响输出模拟信号的质量和性能。高精度的DAC芯片能够提供更平滑的模拟信号,减少量化噪声;快速的DAC芯片则能够满足高速信号处理的需求,确保输出信号的实时性。

DAC芯片通常还具有一些控制接口和功能,如输出范围设置、睡眠模式控制等。通过这些接口和功能,可以灵活地配置DAC芯片的工作参数,满足不同应用场景的需求。例如,可以根据系统要求设置DAC芯片的输出电压范围,使其与后续的模拟电路匹配;在不需要使用DAC芯片时,可以将其设置为睡眠模式,降低系统功耗。

基于FPGA的正交NCO的软件设计

开发环境与工具选择

在FPGA开发中,常用的开发工具包括Xilinx公司的Vivado Design Suite和Intel公司的Quartus Prime软件。这些开发工具提供了完整的设计流程,包括设计输入、综合、布局布线、仿真和下载调试等功能。

Vivado Design Suite是Xilinx公司推出的一款集成开发环境,它支持Xilinx全系列FPGA芯片的开发。Vivado具有强大的设计综合和布局布线能力,能够快速将硬件描述语言(如VHDL、Verilog)描述的电路转换为门级网表,并生成最优化的物理连接路径。同时,Vivado还提供了丰富的IP核库,用户可以直接调用这些IP核来快速实现常见的功能模块,如FIFO、DDR控制器、以太网控制器等,大大提高了开发效率。

Quartus Prime软件是Intel公司为其FPGA芯片提供的开发工具,它同样支持从设计输入到下载调试的完整开发流程。Quartus Prime具有直观的用户界面和丰富的设计向导,能够帮助用户快速上手FPGA开发。它还提供了强大的仿真和调试工具,如ModelSim - Intel FPGA Edition,用户可以在软件层面对电路进行功能验证和性能评估,及时发现和解决设计中的问题。

除了上述综合开发工具外,还需要使用硬件描述语言(HDL)进行设计输入。常用的硬件描述语言有VHDL和Verilog HDL。VHDL是一种强类型、结构化的硬件描述语言,具有严谨的语法和丰富的语义,适合描述复杂的数字电路系统。Verilog HDL则是一种类似于C语言的硬件描述语言,语法简洁、易于学习,适合快速进行电路设计和验证。在实际开发中,可以根据个人习惯和项目需求选择合适的硬件描述语言。

软件设计流程

设计输入

设计输入是将正交NCO的功能和结构用硬件描述语言描述出来,形成源文件。在设计输入阶段,需要根据前面确定的硬件架构和算法,编写相位累加器、相位相加器、CORDIC算法模块(或正弦查找表模块)、输出寄存器等模块的代码。同时,还需要定义各个模块之间的接口和信号,确保数据能够正确传输和处理。

例如,使用Verilog HDL编写相位累加器的代码可能如下:

module phase_accumulator (
   input wire clk,          // 系统时钟
   input wire reset,        // 复位信号
   input wire [31:0] fcw,  // 频率控制字
   output reg [31:0] phase // 相位输出
);

always @(posedge clk or posedge reset) begin
   if (reset) begin
       phase <= 32'b0;
   end else begin
       phase <= phase + fcw;
   end
end

endmodule

上述代码实现了一个32位的相位累加器,在系统时钟的上升沿或复位信号有效时,根据复位信号的状态对相位进行初始化或累加频率控制字。

综合

综合是将硬件描述语言描述的电路转换为门级网表的过程。综合工具会根据设计输入的代码和目标FPGA芯片的器件特性,将高级的硬件描述语言转换为由基本逻辑门(如与门、或门、非门、触发器等)组成的门级网表。综合过程会优化电路结构,提高电路的性能和资源利用率。

在Vivado或Quartus Prime中,可以通过简单的操作启动综合过程。综合完成后,会生成综合报告,报告中会显示电路的资源使用情况(如逻辑单元、寄存器、DSP slices、Block RAM等的使用数量)、时序信息(如关键路径的延迟、时钟频率等)以及可能的警告和错误信息。设计人员可以根据综合报告对设计进行优化和调整,确保设计满足系统要求。

布局布线

布局布线是将综合生成的门级网表映射到实际的目标FPGA芯片上,并生成最优化的物理连接路径的过程。布局布线工具会根据FPGA芯片的内部结构和资源分布,将门级网表中的逻辑门和寄存器等元件放置在合适的位置,并使用芯片内部的布线资源将它们连接起来。布局布线过程会考虑时序约束、信号完整性等因素,确保电路在实际芯片上能够正常工作。

在布局布线过程中,设计人员可以设置一些约束条件,如时钟频率约束、I/O引脚约束等。时钟频率约束用于指定系统时钟的最高工作频率,布局布线工具会根据该约束条件优化电路的时序,确保电路在指定的时钟频率下能够满足时序要求。I/O引脚约束用于指定FPGA芯片引脚的功能和连接关系,确保设计中的输入输出信号能够正确连接到外部设备。

布局布线完成后,会生成布局布线报告,报告中会显示详细的资源使用情况、时序分析结果以及物理连接信息等。设计人员可以通过查看布局布线报告,了解电路在FPGA芯片上的实际布局和布线情况,进一步优化设计。

仿真验证

仿真验证是在软件层面对电路进行功能验证和性能评估的过程。通过仿真,可以在实际将设计下载到FPGA芯片之前,发现设计中可能存在的逻辑错误、时序问题等,提高设计的可靠性和稳定性。

常用的FPGA仿真工具有ModelSim、VCS等。ModelSim是一款功能强大的硬件描述语言仿真工具,它支持VHDL和Verilog HDL的混合仿真,具有直观的用户界面和丰富的调试功能。在ModelSim中,可以创建仿真测试平台(Testbench),为设计提供输入激励信号,并观察设计的输出响应,验证设计是否满足功能要求。

例如,编写一个针对相位累加器的测试平台代码可能如下:

`timescale 1ns / 1ps

module phase_accumulator_tb;

   // 输入信号
   reg clk;
   reg reset;
   reg [31:0] fcw;

   // 输出信号
   wire [31:0] phase;

   // 实例化相位累加器模块
   phase_accumulator uut (
      .clk(clk),
      .reset(reset),
      .fcw(fcw),
      .phase(phase)
   );

   // 生成时钟信号
   initial begin
       clk = 0;
       forever #5 clk = ~clk; // 时钟周期为10ns,频率为100MHz
   end

   // 初始化输入信号
   initial begin
       reset = 1;
       fcw = 32'd1000;
       #20 reset = 0;
       #200 $finish;
   end

endmodule

上述测试平台代码生成了一个频率为100MHz的时钟信号,在初始时刻将复位信号置为有效,对相位累加器进行复位,然后设置频率控制字为1000,并在一段时间后结束仿真。通过运行该测试平台,可以在ModelSim中观察相位累加器的输出相位值是否按照预期进行累加,验证相位累加器的功能正确性。

除了功能仿真外,还需要进行时序仿真。时序仿真是在考虑了器件延迟、布线延迟等实际因素的情况下,对电路进行的仿真。时序仿真能够更准确地反映电路在实际芯片上的工作情况,发现可能存在的时序违规问题。在进行时序仿真时,需要加载布局布线后生成的标准延时格式(Standard Delay Format,SDF)文件,该文件包含了电路中各个元件的延迟信息。

下载调试

下载调试是将经过仿真验证的设计程序下载到目标FPGA芯片中,并进行实际测试和调试的过程。在下载调试阶段,需要使用FPGA开发板和下载器等硬件设备。

将设计程序下载到FPGA芯片中通常使用JTAG(Joint Test Action Group)接口。JTAG是一种国际标准测试协议,主要用于芯片内部测试和编程。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

上一篇: 已是第一篇

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
pcb
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告