版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章数字系统设计实例7.1半整数分频器的设计7.2音乐发生器7.32FSK/2PSK信号产生器7.4实用多功能电子表7.5交通灯控制器7.6数字频率计习题
7.1半整数分频器的设计在数字系统设计中,分频器是一种基本电路。分频器的实现非常简单,可采用标准的计数器,也可采用可编程逻辑器件来实现一个整数分频器。分频器通常用来对某个给定频率进行分频,得到所需的频率。在某些场合下,用户所需要的频率与频率时钟源不是整数倍关系,此时可采用小数分频器进行分频。7.1.1小数分频的基本原理设有一个5MHz的时钟源,但电路中需要产生一个2MHz的时钟信号,由于分频比为2.5,因此整数分频器将不能胜任。采用可编程逻辑器件实现分频系数为2.5的分频器,可采用以下方法:设计一个模3的计数器,再设计一个扣除脉冲电路,加在模3计数器输出之后,每来两个脉冲就扣除一个脉冲(实际上是使被扣除的脉冲变成很窄的脉冲,可由异或门实现),就可以得到分频系数为2.5的小数分频器。采用类似方法,可以设计分频系数为任意半整数的分频器。小数分频的基本原理为脉冲吞吐计数法:设计两个不同分频比的整数分频器,通过控制单位时间内两种分频比出现的不同次数,从而获得所需的小数分频值。例如设计一个分频系数为10.1的分频器,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为(9×10+1×11)/(9+1)=10.1
从这种实现方法的特点可以看出,由于分频器的分频值在不断改变,因此分频后得到的信号抖动较大。当分频系数为N-0.5(N为整数)时,可控制扣除脉冲的时间,使输出为一个稳定的脉冲频率,而不是一次N分频,一次N-1分频。7.1.2电路组成设需要设计一个分频系数为N-0.5的分频器,其电路可由一个模N计数器、一个二分频器和一个异或门组成,如图7-1所示。在实现时,模N计数器可设计成带预置的计数器,这样就可以实现任意分频系数为N-0.5的分频器。
图7-1通用半整数分频器7.1.3VHDL程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdeccountISPORT(inclk:INSTD_LOGIC; --时钟源
preset:INSTD_LOGIC_VECTOR(3DOWNTO0);
--预置分频值Noutclk1:OUTSTD_LOGIC;outclk2:BUFFERSTD_LOGIC --输出时钟);ENDdeccount;
ARCHITECTUREdeccount_archOFdeccountISSIGNALclk,divide2:STD_LOGIC;SIGNALcount:STD_LOGIC_VECTOR(3DOWNTO0);BEGINclk<=inclkXORdivide2; --inclk与divide2异或后作为模N计数器的时钟outclk1<=inclk;PROCESS(clk)BEGINIF(clk'eventANDclk='1')THENIF(count="0000")THEN
count<=preset-1; --置整数分频值Noutclk2<='1';ELSEcount<=count-1; --模N计数器减法计数
outclk2<='0';ENDIF;ENDIF;ENDPROCESS;
PROCESS(outclk2)BEGINIF(outclk2'eventANDoutclk2='1')THENdivide2<=NOTdivide2; --输出时钟二分频
ENDIF;ENDPROCESS;ENDdeccount_arch;图7-2半整数分频器外部接口以上程序实现对时钟源inclk进行分频系数为N-0.5的分频,得到输出频率outclk2。preset输入端口是预置分频值N,本例中preset设为4位宽的位矢量,也即分频系数为16以内的半整数值。若分频系数大于16,需同时增大preset和count的位宽,两者的位宽则要求始终一致。本设计的外部接口如图7-2所示,程序中设置outclk1是为了方便观察输入信号的波形,以与输出信号outclk2比较。7.1.4仿真结果上述半整数分频器的仿真波形如图7-3所示。图7-3半整数分频器仿真波形图7.1.5下载验证锁定引脚时将inclk连至CLK1,preset连至K0~K3,outclk1连至TESTOUT1(测试1脚),outclk2连至TESTOUT2(测试2脚),综合适配后将配置数据下载入EDA实验平台(技术资料详见附录)的FPGA中(有关CLK1等引脚在FPGA芯片引脚中的序号,请参见附录的附图1),通过改变K0~K3状态观察测试1脚和测试2脚上的波形,测试结果与仿真结果一致。7.2音乐发生器本设计利用可编程逻辑器件配以一个小扬声器设计了一个音乐发生器,其结构如图7-4所示。本例产生的音乐选自“梁祝”片段。图7-4音乐产生器原理框图7.2.1音名与频率的关系音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个八度音之间,又可分为十二个半音,每两个半音的频率比为。另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中从低音1至高音1之间每个音名的频率如表7-1所示。表7-1简谱中的音名与频率的关系音名频率/Hz音名频率/Hz音名频率/Hz低音1261.63中音1523.25高音11046.50低音2293.67中音2587.33高音21174.66低音3329.63中音3659.25高音31318.51低音4349.23中音4698.46高音41396.92低音5391.99中音5783.99高音51567.98低音6440中音6880高音61760低音7493.88中音7987.76高音71975.52由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然误码差变小,但分频结构将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。本例中选取4MHz的基准频率。若无4MHz的时钟频率,则可以先分频得到4MHz或换一个新的基准频率。实际上,只要各个音名间的相对频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。本例需要演奏的是“梁祝”片段,此片段内各音阶频率及相应的分频比如表7-2所示。为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表7-2中的分频比就是从4MHz频率二分频得到的2MHz频率基础上计算得出的。表7-2各音阶频率对应的分频值音名分频系数初始值音名分频系数初始值低音360672124中音234054786低音551023089中音330345157低音645453646中音525515640低音740504141中音622735918中音138224369高音119116280由于最大的分频系数为6067,故采用13位二进制计数器已能满足分频要求。在表7-2中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的初始值。对于不同的分频系数,只要加载不同的初始值即可。采用加载初始值而不是将分频输出译码反馈,可以有效地减少本设计占用可编程逻辑器件的资源,这也是同步计数器的一个常用设计技巧。对于乐曲中的休止符,只要将分频系数设为0,即初始值为213-1=8191即可,此时扬声器将不会发声。7.2.2音长的控制本例演奏的“梁祝”片段,最小的节拍为1/4拍。将1拍的时长定为1秒,则只需要再提供一个4Hz的时钟频率即可产生1/4拍的时长。演奏的时间控制通过记谱来完成,对于占用时间较长的节拍(一定是1/4拍的整数倍),如2/4拍,只需将该音名连续记录两次即可。本例要求演奏时能循环进行,因此需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。7.2.3演奏时音名的动态显示如果有必要,可以通过一个数码管或LED来显示乐曲演奏时对应的音符。如用三个数码管,分别显示本例中的高、中、低音名,就可实现演奏的动态显示,且十分直观。本设计通过三个数码管来动态显示演奏时的音名,其中HIGH显示为高音区音阶(仅高音1),MED[2..0]显示的是中音区音阶(中音6,5,3,2,1),LOW[2..0]显示的是低音区音阶(低音7,6,5,3)。数码管显示的七段译码电路在此不作专门讨论。需要说明的是,七段译码电路输入为4位,而将HIGH、MED、LOW用作输入时,不足4位的高位均为低电平“0”。图7-5音乐产生器外部接口7.2.4VHDL程序本设计的外部接口如图7-5所示,程序中定义了一个5位宽的zero[4..0],这是由于实验平台上连向数码管的引脚在不赋值的情况下为高电平,这将导致显示音名错误,设置zero[4..0]就是要将没用到的引脚(高音的高3位、中音的高1位和低音的高1位)赋一个低电平,从而避免显示错误。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYsongISPORT(clk_4MHz,clk_4Hz:INSTD_LOGIC; --预置计数器和乐谱产生器的时钟
digit:BUFFERSTD_LOGIC_VECTOR(6DOWNTO0);
--高、中、低音数码管指示
zero:OUTSTD_LOGIC_VECTOR(4DOWNTO0);
--用于数码管高位置低
speaker:outSTD_LOGIC
--扬声器);ENDsong;ARCHITECTUREsong_archOFsongISSIGNALdivider,origin:STD_LOGIC_VECTOR(12DOWNTO0); --13位计数值和预置值SIGNALcounter:integerrange0to140; --7位计数器SIGNALcount:STD_LOGIC_VECTOR(1DOWNTO0); --记录1/4拍SIGNALcarrier:STD_LOGIC;BEGINzero<="00000";PROCESS(clk_4MHz)BEGINIF(clk_4MHz'eventANDclk_4MHz='1')THENIF(divider="1111111111111")THENcarrier<='1';divider<=origin;ELSEdivider<=divider+'1';carrier<='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(carrier)BEGINIF(carrier'eventANDcarrier='1')THENcount<=count+'1'; --输出时钟四分频
IFcount="00"THENspeaker<='1';ELSEspeaker<='0';ENDIF;ENDIF;ENDPROCESS;PROCESS(clk_4Hz)BEGINIF(clk_4Hz'eventANDclk_4Hz='1')THENIF(counter=140)THENcounter<=0;ELSEcounter<=counter+1;ENDIF;ENDIF;CASEcounterISWHEN0=>digit<="0000011"; WHEN1=>digit<="0000011"; WHEN2=>digit<="0000011"; WHEN3=>digit<="0000011"; WHEN4=>digit<="0000101"; WHEN5=>digit<="0000101"; WHEN6=>digit<="0000101"; WHEN7=>digit<="0000110"; WHEN8=>digit<="0001000"; WHEN9=>digit<="0001000"; WHEN10=>digit<="0001000"; WHEN11=>digit<="0010000"; WHEN12=>digit<="0000110"; WHEN13=>digit<="0001000";WHEN14=>digit<="0000101"; WHEN15=>digit<="0000101"; WHEN16=>digit<="0101000"; WHEN17=>digit<="0101000"; WHEN18=>digit<="0101000"; WHEN19=>digit<="1000000"; WHEN20=>digit<="0110000"; WHEN21=>digit<="0101000";
WHEN22=>digit<="0011000"; WHEN23=>digit<="0101000"; WHEN24=>digit<="0010000"; WHEN25=>digit<="0010000"; WHEN26=>digit<="0010000"; WHEN27=>digit<="0010000"; WHEN28=>digit<="0010000"; WHEN29=>digit<="0010000"; WHEN30=>digit<="0010000"; WHEN31=>digit<="0000000"; WHEN32=>digit<="0010000"; WHEN33=>digit<="0010000"; WHEN34=>digit<="0010000"; WHEN35=>digit<="0011000"; WHEN36=>digit<="0000111"; WHEN37=>digit<="0000111"; WHEN38=>digit<="0000110"; WHEN39=>digit<="0000110"; WHEN40=>digit<="0000101"; WHEN41=>digit<="0000101"; WHEN42=>digit<="0000101"; WHEN43=>digit<="0000110";WHEN44=>digit<="0001000"; WHEN45=>digit<="0001000"; WHEN46=>digit<="0010000"; WHEN47=>digit<="0010000"; WHEN48=>digit<="0000011"; WHEN49=>digit<="0000011"; WHEN50=>digit<="0001000"; WHEN51=>digit<="0001000"; WHEN52=>digit<="0000110"; WHEN53=>digit<="0000101"; WHEN54=>digit<="0000110"; WHEN55=>digit<="0001000"; WHEN56=>digit<="0000101"; WHEN57=>digit<="0000101"; WHEN58=>digit<="0000101"; WHEN59=>digit<="0000101"; WHEN60=>digit<="0000101"; WHEN61=>digit<="0000101"; WHEN62=>digit<="0000101"; WHEN63=>digit<="0000101";WHEN64=>digit<="0011000"; WHEN65=>digit<="0011000"; WHEN66=>digit<="0011000"; WHEN67=>digit<="0101000"; WHEN68=>digit<="0000111"; WHEN69=>digit<="0000111"; WHEN70=>digit<="0010000"; WHEN71=>digit<="0010000";WHEN72=>digit<="0000110"; WHEN73=>digit<="0001000";
WHEN74=>digit<="0000101";
WHEN75=>digit<="0000101"; WHEN76=>digit<="0000101"; WHEN77=>digit<="0000101"; WHEN78=>digit<="0000101"; WHEN79=>digit<="0000101"; WHEN80=>digit<="0000011"; WHEN81=>digit<="0000101"; WHEN82=>digit<="0000011"; WHEN83=>digit<="0000011"; WHEN84=>digit<="0000101"; WHEN85=>digit<="0000110"; WHEN86=>digit<="0000111"; WHEN87=>digit<="0010000"; WHEN88=>digit<="0000110"; WHEN89=>digit<="0000110"; WHEN90=>digit<="0000110"; WHEN91=>digit<="0000110"; WHEN92=>digit<="0000110"; WHEN93=>digit<="0000110"; WHEN94=>digit<="0000101"; WHEN95=>digit<="0000110"; WHEN96=>digit<="0001000"; WHEN97=>digit<="0001000"; WHEN98=>digit<="0001000"; WHEN99=>digit<="0010000";
WHEN100=>digit<="0101000"; WHEN101=>digit<="0101000"; WHEN102=>digit<="0101000"; WHEN103=>digit<="0011000"; WHEN104=>digit<="0010000"; WHEN105=>digit<="0010000"; WHEN106=>digit<="0011000"; WHEN107=>digit<="0010000"; WHEN108=>digit<="0001000"; WHEN109=>digit<="0001000"; WHEN110=>digit<="0000110"; WHEN111=>digit<="0000101"; WHEN112=>digit<="0000011"; WHEN113=>digit<="0000011"; WHEN114=>digit<="0000011"; WHEN115=>digit<="0000011"; WHEN116=>digit<="0001000"; WHEN117=>digit<="0001000"; WHEN118=>digit<="0001000"; WHEN119=>digit<="0001000"; WHEN120=>digit<="0000110"; WHEN121=>digit<="0001000"; WHEN122=>digit<="0000110"; WHEN123=>digit<="0000101"; WHEN124=>digit<="0000011"; WHEN125=>digit<="0000101";WHEN126=>digit<="0000110"; WHEN127=>digit<="0001000"; WHEN128=>digit<="0000101"; WHEN129=>digit<="0000101"; WHEN130=>digit<="0000101"; WHEN131=>digit<="0000101"; WHEN132=>digit<="0000101"; WHEN133=>digit<="0000101"; WHEN134=>digit<="0000101"; WHEN135=>digit<="0000101"; WHEN136=>digit<="0000000"; WHEN137=>digit<="0000000"; WHEN138=>digit<="0000000"; WHEN139=>digit<="0000000"; WHENothers=>digit<="0000000";ENDCASE;CASEdigitIS
WHEN"0000011"=>origin<="0100001001100"; --2124WHEN"0000101"=>origin<="0110000010001"; --3089WHEN"0000110"=>origin<="0111000111110"; --3646WHEN"0000111"=>origin<="1000000101101"; --4141WHEN"0001000"=>origin<="1000100010001"; --4369WHEN"0010000"=>origin<="1001010110010";
--4786WHEN"0011000"=>origin<="1010000100101"; --5157WHEN"0101000"=>origin<="1011000001000"; --5640WHEN"0110000"=>origin<="1011100011110"; --5918WHEN"1000000"=>origin<="1100010001000"; --6280WHENothers=>origin<="1111111111111"; --8191
ENDCASE;ENDPROCESS;ENDsong_arch;7.2.5仿真结果音乐发生器的仿真波形如图7-6所示。图7-6音乐发生器仿真波形图7.2.6下载验证锁定引脚时将clk_4MHz和clk_4Hz分别连至CLK1和CLK2,speaker接扬声器,zero[4..2]、digit[6]接一个数码管,zero[1]、digit[5..3]接一个数码管,zero[0]、digit[2..0]接另一个数码管。综合适配后将配置数据下载入EDA实验平台(技术资料详见附录)的FPGA中(有关CLK1等引脚在FPGA芯片引脚中的序号,请参见附录的附图1),扬声器短接线短路(接入扬声器),即可听到MIDI音乐。7.32FSK/2PSK信号产生器7.3.12FSK基本原理在通信领域中,为了传送信息,一般都将原始的信号进行某种变换变成适合于通信传输的信号形式。在数字通信系统中,一般将原始信号(图像、声音等)经过量化编码变成二进制码流,称为基带信号。但数字基带信号一般不适合于直接传输。例如,通过公共电话网络传输数字信号时,由于电话网络的带宽为4kHz以下,因此数字信号不能直接在其上传输。此时可将数字信号进行调制,FSK即为一种常用的数字调制方式,由FSK调制的波形如图7-7示。
FSK又称移频键控,它利用载频频率的变化来传递数字信息。数字调频信号可以分为相位离散和相位连续两种。若两个载频由不同的独立振荡器提供,它们之间相位互不相关,就称相位离散的数字调频信号;若两个频率由同一振荡信号源提供,只是对其中一个载频进行分频,这样产生的两个载频就是相位连续的数字调频信号。图7-7FSK调制的波形7.3.22FSK信号产生器由于FSK为模拟信号,而FPGA只能产生数字信号,因此需对正弦信号采样并经模数变换来得到所需的FSK信号。本例由FPGA产生正弦信号的采样值。FSK信号发生器框图如图7-8所示,整个系统共分为分频器、m序列产生器、跳变检测、2:1数据选择器、正弦波信号产生器和DAC数模变换器等6部分,其中前5部分由FPGA器件完成。图7-8FSK调制信号发生器框图1.分频器本实例中数据速率为1.2kHz,要求产生1.2kHz和2.4kHz两个正弦信号。对正弦信号每周期取100个采样点,因此要求能产生3个时钟信号:1.2kHz(数据速率)、120kHz(产生1.2kHz正弦信号的输入时钟)和240kHz(产生2.4kHz正弦信号的输入时钟)。基准时钟由一个12MHz的晶振提供。设计中要求一个50分频(产生240kHz信号),再2分频(产生120kHz信号)和100分频(产生1.2kHz信号),共有三个分频值。
2.m序列产生器
m序列是伪随机序列的一种,它的显著特点是:随机特性,预先可确定性,循环特性。正因为这些特性,使得m序列产生器在通信领域得到了广泛的应用。本例用一种带有两个反馈抽头的3级反馈移位寄存器,得到一串“1110010”循环序列,并采取措施防止进入全“0”状态。通过更换时钟频率可以方便地改变输入码元的速率。m序列产生器的电路结构如图7-9所示。图7-9m序列产生器电路结构3.跳变检测将跳变检测引入正弦波的产生中,可以使每次基带码元上升沿或下降沿到来时,对应输出波形位于正弦波形的sin0处。引入跳变检测主要是为了便于观察,确保示波器上显示为一个连续的波形。基带信号的跳变检测可以有很多方法,图7-10为一种便于在可编程逻辑器件中实现的方案。图7-10信号跳变检测电路4.2:1数据选择器2:1数据选择器用于选择正弦波产生器的两个输入时钟。一个时钟的频率为120kHz,此时正弦波产生器产生一个1.2kHz的正弦波,代表数字信号“0”;另一个时钟的频率为240kHz,此时产生一个2.4kHz的正弦波信号,代表数字信号“1”。5.正弦信号的产生用数字电路和DAC变换器可以产生要求的模拟信号。根据抽样定理可知,当用模拟信号最大频率两倍以上的速率对该模拟信号采样时,便可将原模拟信号不失真地恢复出来。本例要求得到的是两个不同频率的正弦信号,实验中对正弦波每个周期采样100个点,即采样速率为原正弦信号频率的100倍,因此完全可以在接收端将原正弦信号不失真地恢复出来,从而可以在接收端对FSK信号正确地解调。经DAC转换后,可以在示波器上观察到比较理想的波形。本实验中每个采样点采用8位量化编码,即8位分辨率。采样点的个数与分辨率的大小主要取决于CPLD/FPGA器件的容量,其中分辨率的高低还与DAC的位数有关。实验表明,采用8位分辨率和每周期100个采样点可以达到相当不错的效果。具体的正弦信号产生器可以用状态机来实现。按前面的设计思路,本实现方案共需100个状态,分别为s1~s100。同时设计一个异步复位端,保证当每个“1”或“0”到来时其调制信号正好位于坐标原点,即sin0处。状态机共有8位输出(Q7~Q0),经DAC变换为模拟信号输出。为得到一个纯正弦波形,应在DAC的输出端加上一个低通滤波器,由于本例仅观察FSK信号,因此省去了低通滤波器。本设计中,数字基带信号与FSK调制信号的对应关系为“0”对应1.2kHz,“1”对应2.4kHz,此二载波的频率可以方便地通过软件修改。图7-112FSK/2PSK信号产生器外部接口7.3.32FSK/2PSK信号产生器在2FSK的基础上,可以较容易地设计出2PSK信号产生器,其接口如图7-11所示。在检测到基带码元的上升沿或下降沿时,使输出波形位于sinπ处,即可使波形倒相,产生2PSK信号。在设计的最后,应考虑选用DAC器件将波形数据转换为模拟波形输出。本实验箱上选用8位并行DAC器件TLC7528,将8位数据输出连至DAC器件的8位数据输入端,即可观察到产生的2FSK/2PSK波形。为了观察波形的方便,我们将TLC7528连接成电压输出的方式(器件本身是电流输出方式),后面跟一个射随器以增强带载能力。7.3.42FSK信号产生器的VHDL程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYfskISPORT(clock:INSTD_LOGIC; --正弦波发生器时钟
dout:OUTSTD_LOGIC_VECTOR(7DOWNTO0); --并行数据DATAcode:BUFFERSTD_LOGIC --输出m序列);
ENDfsk;ARCHITECTUREfsk_archOFfskISSIGNALcount100:STD_LOGIC_VECTOR(6DOWNTO0);--记录100个状态SIGNALcount50:STD_LOGIC_VECTOR(5DOWNTO0);SIGNALsinclk1:STD_LOGIC;SIGNALsinclk,coderate:STD_LOGIC;SIGNALtemp,jump_high:STD_LOGIC;SIGNALm:STD_LOGIC_VECTOR(2DOWNTO0); --m序列BEGINPROCESS(clock)BEGINIF(clock'eventANDclock='1')THEN --产生FSK所需的另一个频率sinclk1=clock/2sinclk1<=NOTsinclk1;ENDIF;ENDPROCESS;PROCESS(sinclk1) ---sinclk1100分频得到coderate码元速率BEGINIF(sinclk1'eventANDsinclk1='1')THENIF(count50="110001")THENcount50<="000000";coderate<=NOTcoderate;ELSEcount50<=count50+'1';ENDIF;ENDIF;ENDPROCESS;m_sequence_form: --产生"1110010"m序列PROCESS(coderate)BEGINIF(coderate'eventANDcoderate='1')THENm(0)<=m(1);m(1)<=m(2);ENDIF;ENDPROCESS;PROCESS(coderate)BEGINIF(coderate'eventANDcoderate='1')THENm(2)<=(m(1)XORm(0))OR(NOT(m(0)ORm(1)orm(2)));ENDIF;ENDPROCESS;
code<=m(0);
PROCESS(sinclk1,clock,code)BEGINIF(code='0')THENsinclk<=sinclk1;ELSEsinclk<=clock;--选择正弦波产生器的时钟频率
ENDIF;ENDPROCESS;jump_high<=(nottemp)ANDcode;--0到1跳变PROCESS(sinclk) --2FSK跳变的不同处理BEGINIF(sinclk'eventANDsinclk='1')THENtemp<=code;IF((count100="1100011")OR(jump_high='1'))THENcount100<="0000000";ELSEcount100<=count100+'1';ENDIF;ENDIF;ENDPROCESS;PROCESS(count100) --产生正弦周期波形的一个周期内的100个样点值BEGINCASEcount100ISWHEN"0000000"=>dout<="01111111"; WHEN"0000001"=>dout<="10000111";WHEN"0000010"=>dout<="10001111"; WHEN"0000011"=>dout<="10010111";WHEN"0000100"=>dout<="10011111"; WHEN"0000101"=>dout<="10100110";WHEN"0000110"=>dout<="10101110"; WHEN"0000111"=>dout<="10110101";WHEN"0001000"=>dout<="10111100"; WHEN"0001001"=>dout<="11000011";WHEN"0001010"=>dout<="11001010"; WHEN"0001011"=>dout<="11010000";WHEN"0001100"=>dout<="11010110"; WHEN"0001101"=>dout<="11011100";WHEN"0001110"=>dout<="11100001"; WHEN"0001111"=>dout<="11100110";WHEN"0010000"=>dout<="11101011"; WHEN"0010001"=>dout<="11101111";WHEN"0010010"=>dout<="11110010"; WHEN"0010011"=>dout<="11110110";WHEN"0010100"=>dout<="11111000"; WHEN"0010101"=>dout<="11111010";
WHEN"0010110"=>dout<="11111100"; WHEN"0010111"=>dout<="11111101";WHEN"0011000"=>dout<="11111110"; WHEN"0011001"=>dout<="11111111";WHEN"0011010"=>dout<="11111110"; WHEN"0011011"=>dout<="11111101";WHEN"0011100"=>dout<="11111100"; WHEN"0011101"=>dout<="11111010";WHEN"0011110"=>dout<="11111000"; WHEN"0011111"=>dout<="11110110";WHEN"0100000"=>dout<="11110010"; WHEN"0100001"=>dout<="11101111";WHEN"0100010"=>dout<="11101011"; WHEN"0100011"=>dout<="11100110";WHEN"0100100"=>dout<="11100001"; WHEN"0100101"=>dout<="11011100";WHEN"0100110"=>dout<="11010110"; WHEN"0100111"=>dout<="11010000";WHEN"0101000"=>dout<="11001010"; WHEN"0101001"=>dout<="11000011";WHEN"0101010"=>dout<="10111100"; WHEN"0101011"=>dout<="10110101";WHEN"0101100"=>dout<="10101110"; WHEN"0101101"=>dout<="10100110";WHEN"0101110"=>dout<="10011111"; WHEN"0101111"=>dout<="10010111";WHEN"0110000"=>dout<="10001111"; WHEN"0110001"=>dout<="10000111";WHEN"0110010"=>dout<="01111111"; WHEN"0110011"=>dout<="01110111";
WHEN"0110100"=>dout<="01101111"; WHEN"0110101"=>dout<="01100111";WHEN"0110110"=>dout<="01011111"; WHEN"0110111"=>dout<="01011000";WHEN"0111000"=>dout<="01010000"; WHEN"0111001"=>dout<="01001001";WHEN"0111010"=>dout<="01000010"; WHEN"0111011"=>dout<="00111011";WHEN"0111100"=>dout<="00110100"; WHEN"0111101"=>dout<="00101110";WHEN"0111110"=>dout<="00101000"; WHEN"0111111"=>dout<="00100010";WHEN"1000000"=>dout<="00011101"; WHEN"1000001"=>dout<="00011000";WHEN"1000010"=>dout<="00010011"; WHEN"1000011"=>dout<="00001111";WHEN"1000100"=>dout<="00001100"; WHEN"1000101"=>dout<="00001000";WHEN"1000110"=>dout<="00000110"; WHEN"1000111"=>dout<="00000100";WHEN"1001000"=>dout<="00000010"; WHEN"1001001"=>dout<="00000001";WHEN"1001010"=>dout<="00000000"; WHEN"1001011"=>dout<="00000000";WHEN"1001100"=>dout<="00000000"; WHEN"1001101"=>dout<="00000001";WHEN"1001110"=>dout<="00000010"; WHEN"1001111"=>dout<="00000100";WHEN"1010000"=>dout<="00000110"; WHEN"1010001"=>dout<="00001000";
WHEN"1010010"=>dout<="00001100"; WHEN"1010011"=>dout<="00001111";WHEN"1010100"=>dout<="00010011"; WHEN"1010101"=>dout<="00011000";WHEN"1010110"=>dout<="00011101"; WHEN"1010111"=>dout<="00100010";WHEN"1011000"=>dout<="00101000"; WHEN"1011001"=>dout<="00101110";WHEN"1011010"=>dout<="00110100"; WHEN"1011011"=>dout<="00111011";WHEN"1011100"=>dout<="01000010"; WHEN"1011101"=>dout<="01001001";WHEN"1011110"=>dout<="01010000"; WHEN"1011111"=>dout<="01011000";WHEN"1100000"=>dout<="01011111"; WHEN"1100001"=>dout<="01100111";WHEN"1100010"=>dout<="01101111"; WHEN"1100011"=>dout<="01110111";WHENothers=>null;ENDCASE;ENDPROCESS;ENDfsk_arch;7.3.52PSK信号产生器的VHDL程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYpskISPORT(clock:INSTD_LOGIC; --正弦波发生器时钟
dout:OUTSTD_LOGIC_VECTOR(7DOWNTO0); --并行数据DATAcode:BUFFERSTD_LOGIC
--输出m序列);ENDpsk;ARCHITECTUREpsk_archOFpskISSIGNALcount100:STD_LOGIC_VECTOR(6DOWNTO0); --记录100个状态SIGNALcount50:STD_LOGIC_VECTOR(5DOWNTO0);SIGNALsinclk1:STD_LOGIC;SIGNALsinclk,coderate:STD_LOGIC;SIGNALtemp,jump_low,jump_high:STD_LOGIC;SIGNALm:STD_LOGIC_VECTOR(2DOWNTO0); --m序列BEGINPROCESS(clock)BEGINIF(clock'eventANDclock='1')THEN --产生FSK所需的另一个频率sinclk1=clock/2sinclk1<=NOTsinclk1;ENDIF;ENDPROCESS;PROCESS(sinclk1) --sinclk1100分频得到coderate码元速率BEGINIF(sinclk1'eventANDsinclk1='1')THENIF(count50="110001")THENcount50<="000000";coderate<=NOTcoderate;ELSEcount50<=count50+'1';ENDIF;ENDIF;ENDPROCESS;m_sequence_form: ---产生"1110010"m序列PROCESS(coderate)BEGINIF(coderate'eventANDcoderate='1')THENm(0)<=m(1);m(1)<=m(2);ENDIF;ENDPROCESS;
PROCESS(coderate)BEGINIF(coderate'eventANDcoderate='1')THENm(2)<=(m(1)XORm(0))OR(NOT(m(0)ORm(1)ORm(2)));ENDIF;ENDPROCESS;code<=m(0);jump_low<=(notcode)ANDtemp; --0到1跳变jump_high<=(nottemp)ANDcode; --1到0跳变PROCESS(clock) --2PSK对跳变的不同处理BEGINIF(clock'eventANDclock='1')THENtemp<=code;IF(jump_low='1')THENcount100<="0110010";ELSIF(jump_high='1')THENcount100<="0000000";ELSIF(count100="1100011")THENcount100<="0000000";ELSEcount100<=count100+'1';ENDIF;ENDIF;ENDPROCESS;PROCESS(count100) --产生正弦周期波形的一个周期内的100个样点值BEGINCASEcount100ISWHEN"0000000"=>dout<="01111111"; WHEN"0000001"=>dout<="10000111";WHEN"0000010"=>dout<="10001111"; WHEN"0000011"=>dout<="10010111";WHEN"0000100"=>dout<="10011111"; WHEN"0000101"=>dout<="10100110";WHEN"0000110"=>dout<="10101110"; WHEN"0000111"=>dout<="10110101";WHEN"0001000"=>dout<="10111100"; WHEN"0001001"=>dout<="11000011";WHEN"0001010"=>dout<="11001010"; WHEN"0001011"=>dout<="11010000";WHEN"0001100"=>dout<="11010110"; WHEN"0001101"=>dout<="11011100";WHEN"0001110"=>dout<="11100001"; WHEN"0001111"=>dout<="11100110";WHEN"0010000"=>dout<="11101011"; WHEN"0010001"=>dout<="11101111";WHEN"0010010"=>dout<="11110010"; WHEN"0010011"=>dout<="11110110";WHEN"0010100"=>dout<="11111000"; WHEN"0010101"=>dout<="11111010";WHEN"0010110"=>dout<="11111100"; WHEN"0010111"=>dout<="11111101";WHEN"0011000"=>dout<="11111110"; WHEN"0011001"=>dout<="11111111";WHEN"0011010"=>dout<="11111110"; WHEN"0011011"=>dout<="11111101";
WHEN"0011100"=>dout<="11111100"; WHEN"0011101"=>dout<="11111010";WHEN"0011110"=>dout<="11111000"; WHEN"0011111"=>dout<="11110110";WHEN"0100000"=>dout<="11110010"; WHEN"0100001"=>dout<="11101111";WHEN"0100010"=>dout<="11101011"; WHEN"0100011"=>dout<="11100110";WHEN"0100100"=>dout<="11100001"; WHEN"0100101"=>dout<="11011100";WHEN"0100110"=>dout<="11010110"; WHEN"0100111"=>dout<="11010000";WHEN"0101000"=>dout<="11001010"; WHEN"0101001"=>dout<="11000011";WHEN"0101010"=>dout<="10111100"; WHEN"0101011"=>dout<="10110101";WHEN"0101100"=>dout<="10101110"; WHEN"0101101"=>dout<="10100110";WHEN"0101110"=>dout<="10011111"; WHEN"0101111"=>dout<="10010111";WHEN"0110000"=>dout<="10001111"; WHEN"0110001"=>dout<="10000111";WHEN"0110010"=>dout<="01111111"; WHEN"0110011"=>dout<="01110111";WHEN"0110100"=>dout<="01101111"; WHEN"0110101"=>dout<="01100111";
WHEN"0110110"=>dout<="01011111"; WHEN"0110111"=>dout<="01011000";WHEN"0111000"=>dout<="01010000"; WHEN"0111001"=>dout<="01001001";WHEN"0111010"=>dout<="01000010"; WHEN"0111011"=>dout<="00111011";WHEN"0111100"=>dout<="00110100"; WHEN"0111101"=>dout<="00101110";
WHEN"0111110"=>dout<="00101000"; WHEN"0111111"=>dout<="00100010";WHEN"1000000"=>dout<="00011101"; WHEN"1000001"=>dout<="00011000";WHEN"1000010"=>dout<="00010011"; WHEN"1000011"=>dout<="00001111";WHEN"1000100"=>dout<="00001100"; WHEN"1000101"=>dout<="00001000";WHEN"1000110"=>dout<="00000110"; WHEN"1000111"=>dout<="00000100";WHEN"1001000"=>dout<="00000010"; WHEN"1001001"=>dout<="00000001";WHEN"1001010"=>dout<="00000000"; WHEN"1001011"=>dout<="00000000";WHEN"1001100"=>dout<="00000000"; WHEN"1001101"=>dout<="00000001";WHEN"1001110"=>dout<="00000010"; WHEN"1001111"=>dout<="00000100";WHEN"1010000"=>dout<="00000110"; WHEN"1010001"=>dout<="00001000";WHEN"1010010"=>dout<="00001100"; WHEN"1010011"=>dout<="00001111";WHEN"1010100"=>dout<="00010011"; WHEN"1010101"=>dout<="00011000";WHEN"1010110"=>dout<="00011101"; WHEN"1010111"=>dout<="00100010";WHEN"1011000"=>dout<="00101000"; WHEN"1011001"=>dout<="00101110";WHEN"1011010"=>dout<="00110100"; WHEN"1011011"=>dout<="00111011";
WHEN"1011100"=>dout<="01000010"; WHEN"1011101"=>dout<="01001001";WHEN"1011110"=>dout<="01010000"; WHEN"1011111"=>dout<="01011000";WHEN"1100000"=>dout<="01011111"; WHEN"1100001"=>dout<="01100111";WHEN"1100010"=>dout<="01101111"; WHEN"1100011"=>dout<="01110111";WHENothers=>null;ENDCASE;ENDPROCESS;ENDpsk_arch;7.3.6仿真结果2FSK信号产生器的仿真波形如图7-12所示;2PSK信号产生器的仿真波形如图7-13所示。
图7-122FSK信号产生器仿真波形图图7-132PSK信号产生器仿真波形图7.3.7下载验证锁定引脚时将clock连至CLK1,dout连至DA输入端,code连至TESTOUT1(测试1脚)。综合适配后将配置数据下载入EDA实验平台(技术资料详见附录)的FPGA中(有关CLK1等引脚在FPGA芯片引脚中的序号,请参见附录的附图1),即可用双踪示波器同时观察m序列及其对应的2FSK或2PSK波形。7.4实用多功能电子表7.4.1功能描述多功能电子表共有5种功能:功能1为数字钟;功能2为数字跑表;功能3为调时;功能4为闹钟设置;功能5为日期设置。除调时功能以外,电子表处于其他功能状态下时并不影响数字钟的运行。使用数字钟功能时,还可以通过按键快速查看当前的闹钟设置时间和当前日期。该电子表利用EDA实验平台的扬声器整点报时和定时报时,设置3个按键分别作为功能键和调整键。实用多功能电子表外部接口如图7-14所示。图7-14实用多功能电子表外部接口
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024至2030年中国水冷型高效空气冷却器数据监测研究报告
- 2024至2030年中国数字音视频技术行业投资前景及策略咨询研究报告
- 2024至2030年中国对-特辛基苯酚数据监测研究报告
- 光刻设备行业报告:光刻机
- 内蒙古呼和浩特市(2024年-2025年小学五年级语文)人教版小升初模拟(上学期)试卷及答案
- 四川省泸州市(2024年-2025年小学五年级语文)统编版质量测试((上下)学期)试卷及答案
- 河南省鹤壁市(2024年-2025年小学五年级语文)人教版开学考试((上下)学期)试卷及答案
- 电子竞技选手聘用合同
- 合租别墅租赁合同样本
- 生态园区绿色住宅租赁合同
- 医院药房人员培训课件
- 2024年度Logo设计及品牌形象重塑合同
- 中小学学校国家智慧教育云平台应用项目实施方案
- 2024-2030年中国干细胞医疗行业趋势分析及投资战略研究报告
- 2024-2030年铝型材行业市场深度调研及前景趋势与投资战略研究报告
- 2024-2030年辣椒种植行业市场深度分析及发展策略研究报告
- 通信工程施工方案
- 初中英语研修方案
- 化工厂拆除施工方案
- 海南自贸港优化营商环境条例7大亮点解读课件
- 中国邮政储蓄银行2024年下半年社会招聘高频难、易错点500题模拟试题附带答案详解
评论
0/150
提交评论