3.4 显示模块DISP设计
显示模块DISP是以CNT_SM为扫描计数器,是对1kHz进行三位循环计数,由前述的时钟计数产生模块产生,WLl~WL8为待送出显示的8个8位字型码,由前述的移位模块YW提供;SW[7..O]为行扫描输出信号,连接至点阵的8个行;DATA[7..0]为行扫描时对应的列输出字型码,对外连至点阵的8列。该模块参考文献中数码管动态显示程序进行设计如下:
4 硬件实现
上述各模块分别在QualtusⅡ中通过了仿真验证,最后对整体设计进行了硬件验证。将设计载入KH31001开发板的Cyclone工系列EPlC6Q-240C8FPGA器件中,实验证明汉字滚动显示扫描情况均正常,能够按照预想进行移位显示,这说明。FPGA的内核硬件工作良好,可以正确地实现所要求的设计功能。
5 系统扩展
本文是针对8×8点阵设计,故每次取8个字形码,如果是16×16点阵,将RONZI中存储的字形码改为16位,数据线改为16位,一个汉字需要16个16位的字形码,数据分配模块MUX、移位模块YW、显示模块DISP,均要将输入输出数据中的原来的8位改成相应的16位。扫描及取字型码计数器CNT_SM应改为CNT计数器的低4位。一个16×16点阵汉字的移进移出共需32个状态。由5位的计数器提供。如用CNT[16..0]中的14~10位作为该计数器,这可在时钟计数器产生单元CLK_GE中应做相应修改,字计数器CNT WORD按照每取16个字进行加1统计。显示DISP部分的译码器要由3-8译码改为4-16译码。显示的汉字信息越多,ROM的地址线位数越多,字计数器CNT_WORD应在时钟计数器产生单元GE_CLK中,将相应的计数器位数扩展,由CNT计数器的最高位到位15来承担。若还是8个汉字,计数器应为CNT[17..O],CNT[17..15]为字计数器;若为16个汉字,计数器应为CNT[18..O],CNT[18..15]为字计数器,…,依次类推。
6 结语
本文在KH31001开发板上实现了基于Altera公司的Cyclone I系列FPGA器件EPlC6Q240C8硬件及VHDL硬件描述语言设计的LED点阵汉字滚动显示,能在8×8点阵上滚动显示“元旦生日开心快乐”8个汉字。文中从LED点阵显示汉字的原理阐述出发,给出了点阵汉字滚动显示控制器的原理图,部分模块的VHDL源程序及时序仿真图,并能由按键选择其滚动方式:左移、右移、上移、下移等,给出了系统扩展成16×16点阵汉字滚动的改动思路。从文中描述的系统扩展方案中看出,当系统显示字符个数变化时,只需对控制逻辑和连接关系做适当的修改,再将修改完成的程序下载到器件即可,显然,系统的维护和修改是极其方便和容易的,本文对同类设计也具有一定的参考价值。
四、数字控制振荡器(NCO)的FPGA实现
NCO(N umerically Controlled Oscillator)是用于产生一个理想的、数字可控的正弦或余弦波的数字控制式振荡器,其实现方法有实时计算法和查表法等多种。实时计算法的正弦波样本以实时计算产生,该方法因其计算需要耗费很多时间,因而只能产生较低频率的正弦波,而且存在计算精度与计算时间的矛盾。由于在需要产生高速的正交信号时,实时计算法将无法实现。因此,在实际应用中一般采用最有效、最简单的查表法,即事先根据各个NCO正弦波的相位计算好相位的正弦值,并按相位作为地址信息存储该相位的正弦值数据。
1 NCO的基本原理
在通过相位累加产生地址信息时,通常需要输出当前时刻的相位值所对应的正弦值,即以参考频率源对相位进行等可控间隔采样。众所周知,理想的正弦波信号S(t)可以表示成:
式(1)说明,信号s(t)在振幅A和初相φ确定之后,其频率可以由相位来唯一确定。即:
NCO就是利用式(2)中φ(t)与时间t成线性关系的原理来进行频率合成的,也就是说,在时间t=△t间隔内,正弦信号的相位增量△φ与正弦信号的频率f可构成一一对应关系,也就是说,对式(2)两端进行微分后有:
。
由上面的讨论可知:
其中,△θ为一个采样间隔△t之间的相位增量,采样周期
。故式(3)可改写为:
由式(4)可知,如果可以控制△θ,就可以控制不同的频率输出。由于△θ受频率控制字FCW的控制,即:
,所以,改变FCW就可以得到不同的输出频率f0,然后经代换处理可得如下方程:
式(5)和式(6)中的L为相位累加器的位数。根据Nyquist准则,允许输出的频率最高为FCLK/2,即
。但在实际工程中,由于受到低通滤波器的限制,一般输出的频率
。
2 NCO的性能指标
NCO的性能指标包括信号频率分辨率、信噪比(SNR)、无杂散动态范围(SFDR)和输出的信号正交性。这些性能指标取决于NCO的数据位数。NCO的数据位数包括用于表示相位数据的位数n和表示相位的正弦值数据的位数nb,二者之间存在nb取决于n的关系,且前者必须能够表示相位变化时其相位正弦值变化的最小值和最大值。而这又分为两种情况:
第一种情况是相位最小变化值的正弦值最小变化发生在π/2-△φ~π/2,π/2~π/2+△φ,3π/2-△φ~3π/2,3π/2~3π/2+△φ,同时其相位的取值是在0~2π间且等间隔地分为2n爪取值点,因此,由正弦波的特性可知:只需要讨论相位在π/2-△φ与π/2取值点的正弦值之差:
第二种情况是相位最小变化值的正弦值的最大变化发生在0~△φ,π-△φ~π,π~π+△φ,2π-△φ~2π取值点处。该情况可以通过类似于第一种情况的推导方法得到:
设计时可以根据式(9)和式(10)较好地取值n和nb,以避免相位的分辨率发生钝化,并很好地达到设计要求。
NCO的噪声是因为存在正弦值的量化误差而引入的,且量化误差由表示正弦值的位数决定,其近似关系为:
式中,B是作为寻址ROM的地址的舍位位数,n是相位位数。NCO的另一个性能参数是频率分辨率△f,该参数取决于相位位数,其关系式为:
3 NCO在FPGA中的实现
NCO的查找表是一个正弦值表,该表的正弦值是按照相位作为存储地址来进行存储的,而且一般以相位递增的方式存储。利用正弦波的奇偶对称性,可以把2π相位分成4等份,然后利用各等份之间的对称性来实现地址信息的映射,通常只存储[0,π/2]象限内的幅度码。
相位累加器可完成相位累加,即每来1个时钟就累加1次φ=φ+△φ,且采用流水线方式工作。本设计采用QUARTUS II中IP核自带的一种32位累加器来实现相位的累加。
逻辑转换完成后,可采用小表结构功能块把相位累加器产生的最高2位信号转换为地址控制信号和象限转换控制信号。其中地址控制信号是根据最高两位信号来控制地址从0开始递增方式产生还是从2L开始以递减方式产生。
正弦表是每来一个时钟输出一个大于零的正弦值数据,这些数据可作为象限变换器的输入,由象限变换器完成数据的象限变换。其转换原则是:象限控制信号根据正弦信号的对称性把查表得到的数据转换为正负数据,并对于正弦信号的1、2象限数据进行加零操作,而对3、4象限的数据进行求补运算。余弦数据也同样,在1、4象限对数据进行加零操作,2、3象限数据进行求补运算。
4 仿真结果
利用上述小表结构实现的NCO可以输出多种频率信号并减少资源消耗,影响系统输出频率的因素主要是工作频率和器件性能。
图1所示是整个NCO在QUARTUS II中的仿真波形图。
在图1所示的波形图中,CLK是时钟输入频率(为65.6 MHz),CLR为系统复位信号,相位累加器的位数L为32位,输出信号幅度位数为12位(包括符号位),相位宽度为12位,这样,由式(5)便可得到频率控制字FCW为269591793,图1中的COS_OUT与SIN_OUT是系统输出信号,频率为4.08 MHz。
由式(11)、(12)、(13)可得,此系统的信噪比和SFDR分别为74 dB和84 dB。
图2所示是将波形文件中的正弦余弦数据读入MATLAB中所显示出来的波形。
5 结束语
本文通过分析数控振荡器的实现原理和性能,给出了通过FPGA来实现NCO的具体方法,同时通过QUARTUSⅡ中的仿真验证了本设计的正确性。结果证明,用该方法设计的NCO可以输出多种频率的信号,同时也可以减少资源消耗。
评论
查看更多