基于FPGA和SRAM的数控振荡器的设计与实现
1 引言
数控振荡器是数字通讯中调制解调单元必不可少的部分,同时也是各种数字频率合成器和数字信号发生器的核心。随着数字通信技术的发展,对传送数据的精度和速率要求越来越高。如何得到可数控的高精度的高频载波信号是实现高速数字通信系统必须解决的问题,可编程逻辑器件和大容量存储器的发展为这一问题的解决带来了曙光。本文介绍如何用fpga(现场可编程逻辑门阵列)和sram(静态随机存储器)实现高精度数控振荡器。
2 nco概述
nco(numerical controlled oscillator)即数控振荡器用于产生可控的正弦波或余弦波,其实现的方法目前主要有计算法和查表法等。计算法以软件编程的方式通过实时计算产生正弦波样本,该方法耗时多且只能产生频率相对较低的正弦波,而需要产生高速的正交信号时,用此方法无法实现。因此,在实际应用中一般采用最有效、最简单的查表法,即事先根据各个nco正弦波相位计算好相位的正弦值,并以相位角度作为地址把该相位的正弦值数据存储在表中,然后通过相位累加产生地址信息读取当前时刻的相位值在表中对应的正弦值,从而产生所需频率的正弦波。
用查表法实现nco的性能指标取决于查表的深度和宽度,即取决于表示相位数据的位数(查表存储器地址线的位数)和表示正弦值数据的位数(查表存储器数据线的位数)。改善nco性能最简单和最根本的方法是加大查找表的深度和宽度。目前,用查找表法实现nco的普遍做法是用片内rom作为查找表,由于片内资源的限制,查找表的深度和宽度一般不会很大(通常为256×8bits),大大限制了nco性能的提高,用独立的大容量sram作为查找表,把查找表从片内移到片外,可以较好解决这个问题,基于这种思想,笔者成功地用fpga(xilinx公司的xc2v1000型门阵列)和sram(cypress公司的cy7c1021型存储器)实现了nco。
3 nco的实现
3.1 结构设计
用fpga和sram实现的nco的结构如图1所示。大框内部分是由fpga完成,主要部件分为频率控制字寄存器,相位控制字寄存器、通道控制字寄存器、累加器、加法器、通道选择器和锁存器等。微处理器对nco进行控制,可用单片机或dsp(数字信号处理器)实现。

3.1.1 频率控制字寄存器、相位控制字寄存器、累加器和加法器
频率控制字寄存器和相位控制字寄存器都是32位并行输入/并行输出寄存器,它们通过微处理器接口进行读写。频率控制字寄存器确定载波的频率,相位控制字寄存器确定载波的初始相位。32位累加器对代表频率的频率控制字进行累加运算,累加结果与代表初始相位的相位控制字通过32位加法器进行相加运算,相加结果的高16位数据读取查找表的地址信息。频率控制字寄存器、相位控制字寄存器、累加器和加法器可以用vhdl语言描述,集成在一个模块中,其vhdl源程序如下:
entity
addr_sin is
port(clock:in std_logic;——时钟信号
reset:in std_logic;——同步复位信号
——定义频率控制字寄存器
g_sin:in std_logic;
data_con_sin:in std_logic_vector(31 downto 0);
d_con_sin:out std_logic_vector(31 downto 0);
——定义相位控制字寄存器
g_sin1:in std_logic;
data_con_sin1:in std_logic_vector(31 downto 0);
d_con_sin1:out std_logic_vector(31 downto 0);
dout:out std_logic_vector(15 downto 0)——加法器输出信号
);
end addr_sin;
architecture behavioral of addr_sin is
signal a_sin,a_sin1,count,count1:std_logic_vector(31downto0):=“00000000000000000000000000000000”;——定义中间变量并初始化
begin
d_con_sin<=a_sin;——用于微处理器读频率控制字寄存器
d_con_sin<=a_sin1;——用于微处理器读相位控制字寄存器
dout<=count1(31 downto 16);——加法器输出
process(g_sin,data_con_sin)——写频率控制字寄存器
begin
if(g_sin=“1”)then
a_sin<=data_con_sin;
end if;
end process;
process(g_sin1,data_con_sin1)——写相位控制字寄存器
begin
if(g_sin1=‘1’)then
a_sin1<=data_con_sin1;
end if;
end process;
process(clock,reset)——加法器输出逻辑
begin
if reset=‘1’then
count<=“00000000000000000000000000000000”;——累加器清零
count1<=“00000000000000000000000000000000”;——加法器清零
elsif(clock=‘1’and clock’ event)then
count<=count+a_sin;——累加器输出
count1<=count+a_sin1;——加法器输出
end if ;
end process;
end behavioral;
3.1.2 通道控制字寄存器和通道选择器
通道控制字寄存器和频率控制字寄存器与相位控制字寄存器的结构完全一样,都是32位并行输入/并行输出寄存器,通过微处理器接口进行读写。通道控制字寄存器仅用最后一位对通道选择器进行控制。通道选择器是二选一复用器,当sel控制端为0时选择通道1,当sel控制端为1时选择通道2,通道选择器作为sram与fpga的接口,每个通道不仅包括16条地址线,而且还有3条控制线和32条数据线,在图1中,为了使nco的结构更加清晰,通道选择器的控制线和数据线没有表示出来。
3.1.3 sram和锁存器
sram是64k×32的高性能静态ram,由2个cy7c1021(64k×16)并联构成,用作查找表。sram通过微处理器进行配置,直接存放2路、1个周期、65 536个16位载波样本(高16位存放正弦波,低16位存放余弦波)。虽然sram是异步器件,但由于工作速度极高,在简单控制逻辑配合下完全可以工作在同步模式下。nco工作时,控制逻辑(用vhdl语言描述)通过通道1使sram的控制信号线处于读有效电平,用相位地址直接驱动sram,从sram读出的数据进入32位锁存器,分2路直接输出,不需要任何地址和数据转换逻辑。用于锁存器的时钟和用于累加器、加法器时钟在相位上相差180°,这是由sram的开关特性决定的。
3.2 nco的工作过程
nco工作前必须对sram进行初始化,图2示出nco的工作流程。首先,微处理器向通道控制字寄存器写入1,使通道选择器选择微处理器接口。然后,微处理器对sram进行配置,向sram中写入载波样本,接着,微处理器向频率控制字寄存器和相位控制字寄存器写入频率控制字和相位控制字,确定载波的频率和初始相位,最后,向通道控制字寄存器写入0,通道选择器选择通道1,使nco处于工作状态。此时微处理器可以对频率控制字寄存器和相位控制字寄存器进行动态读写,实现对nco的动态实时控制,完成nco频率与初始相位的调整。

3.3 nco性能评估
按照上述结构,笔者设计了一种nco系统。该系统的工作时钟为80mhz,用dsp作为微处理器。通过系统测试,该nco的性能指标达到了设计要求,频率分辨率δf=0.0186hz,信噪比(snr)在100db以上,图3示出nco的典型特性曲线。

4 结构特点
用fpga和sram实现数控振荡器有许多特点。
首先,查找表的容量可以进一步加大。此设计的结构把相位累加部分和查找表分开单独实现,由于fpga具有可重复编程性且有丰富的i/o资源,因此只要稍加改动fpga内的逻辑设计就可以外挂更大容量的sram。
其次,载波样本的数据位数可以灵活控制。在查找表容量一定的情况下,可以根据具体应用调整载波样本的数据宽度。实现的手段有二:一是在对sram配置时通过微处理器以软件编程的方式直接调整sram的数据宽度;二是在fpga内对sram输出数据的位数进行截位处理,可通过调整fpga中锁存器的输出实现。
第三,能够灵活应用到其他领域中,该nco只消耗fpga中的6%的slices资源,大量资源包括片内ram和硬件乘法器都没有用到,利用这些资源可以对nco进行功能扩展,实现数字下变频器(digital down converter——ddc)、数字频率合成器(direct digital synthesizer——dds)和调制解调器等。
5 结束语
本文介绍了一种新的nco实现方法,用该方法设计的nco可实现对载波的频率、相位和幅度的完全控制,由于用独立的大容量sram作为查找表,使得nco有较高的精度,同时该nco有很大的发挥空间,能够灵活的运用到其他领域。
评论