《第7章数字系统设计实例精选文档.ppt》由会员分享,可在线阅读,更多相关《第7章数字系统设计实例精选文档.ppt(170页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第7章章 数字系统设计数字系统设计实例实例本讲稿第一页,共一百七十页7.1 半整数分频器的设计半整数分频器的设计 在数字系统设计中,分频器是一种基本电路。分频器的实现非常简单,可采用标准的计数器,也可采用可编程逻辑器件来实现一个整数分频器。分频器通常用来对某个给定频率进行分频,得到所需的频率。在某些场合下,用户所需要的频率与频率时钟源不是整数倍关系,此时可采用小数分频器进行分频。本讲稿第二页,共一百七十页 7.1.1 小数分频的基本原理 设有一个5 MHz的时钟源,但电路中需要产生一个2 MHz的时钟信号,由于分频比为2.5,因此整数分频器将不能胜任。采用可编程逻辑器件实现分频系数为2.5的
2、分频器,可采用以下方法:设计一个模3的计数器,再设计一个扣除脉冲电路,加在模3计数器输出之后,每来两个脉冲就扣除一个脉冲(实际上是使被扣除的脉冲变成很窄的脉冲,可由异或门实现),就可以得到分频系数为2.5的小数分频器。采用类似方法,可以设计分频系数为任意半整数的分频器。本讲稿第三页,共一百七十页 小数分频的基本原理为脉冲吞吐计数法:设计两个不同分频比的整数分频器,通过控制单位时间内两种分频比出现的不同次数,从而获得所需的小数分频值。例如设计一个分频系数为10.1的分频器,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为 (910+111)/(9+1)=10.1 本讲稿第四页,共一
3、百七十页 从这种实现方法的特点可以看出,由于分频器的分频值在不断改变,因此分频后得到的信号抖动较大。当分频系数为N-0.5(N为整数)时,可控制扣除脉冲的时间,使输出为一个稳定的脉冲频率,而不是一次N分频,一次N-1分频。本讲稿第五页,共一百七十页 7.1.2 电路组成 设需要设计一个分频系数为N-0.5的分频器,其电路可由一个模N计数器、一个二分频器和一个异或门组成,如图7-1所示。在实现时,模N计数器可设计成带预置的计数器,这样就可以实现任意分频系数为N-0.5的分频器。本讲稿第六页,共一百七十页 图7-1 通用半整数分频器本讲稿第七页,共一百七十页7.1.3 VHDL程序LIBRARY
4、IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY deccount IS PORT(inclk:IN STD_LOGIC;-时钟源 preset:IN STD_LOGIC_VECTOR(3 DOWNTO 0);-预置分频值N本讲稿第八页,共一百七十页outclk1:OUT STD_LOGIC;outclk2:BUFFER STD_LOGIC-输出时钟 );END deccount;ARCHITECTURE deccount_arch OF deccount ISSIGNAL clk,divide2:S
5、TD_LOGIC;SIGNAL count:STD_LOGIC_VECTOR(3 DOWNTO 0);本讲稿第九页,共一百七十页BEGINclk=inclk XOR divide2;-inclk与divide2异或后作为模N计数器的时钟outclk1=inclk;PROCESS(clk)BEGIN IF(clkevent AND clk=1)THEN IF(count=0000)THEN本讲稿第十页,共一百七十页 count=preset-1;-置整数分频值N outclk2=1;ELSE count=count-1;-模N计数器减法计数 outclk2=0;END IF;END IF;END
6、 PROCESS;PROCESS(outclk2)本讲稿第十一页,共一百七十页BEGIN IF(outclk2event AND outclk2=1)THEN divide2=NOT divide2;-输出时钟二分频 END IF;END PROCESS;END deccount_arch;本讲稿第十二页,共一百七十页图7-2 半整数分频器外部接口本讲稿第十三页,共一百七十页 以上程序实现对时钟源inclk进行分频系数为N-0.5的分频,得到输出频率outclk2。preset输入端口是预置分频值N,本例中preset设为4位宽的位矢量,也即分频系数为16以内的半整数值。若分频系数大于16,需
7、同时增大preset和count的位宽,两者的位宽则要求始终一致。本设计的外部接口如图7-2所示,程序中设置outclk1是为了方便观察输入信号的波形,以与输出信号outclk2比较。本讲稿第十四页,共一百七十页 7.1.4 仿真结果 上述半整数分频器的仿真波形如图7-3所示。本讲稿第十五页,共一百七十页图7-3 半整数分频器仿真波形图 本讲稿第十六页,共一百七十页 7.1.5 下载验证 锁定引脚时将inclk连至CLK1,preset连至K0K3,outclk1连至TESTOUT1(测试1脚),outclk2连至TESTOUT2(测试2脚),综合适配后将配置数据下载入EDA实验平台(技术资料
8、详见附录)的FPGA中(有关CLK1等引脚在FPGA芯片引脚中的序号,请参见附录的附图1),通过改变K0K3状态观察测试1脚和测试2脚上的波形,测试结果与仿真结果一致。本讲稿第十七页,共一百七十页7.2 音音 乐乐 发发 生生 器器 本设计利用可编程逻辑器件配以一个小扬声器设计了一个音乐发生器,其结构如图7-4所示。本例产生的音乐选自“梁祝”片段。本讲稿第十八页,共一百七十页图7-4 音乐产生器原理框图本讲稿第十九页,共一百七十页 7.2.1 音名与频率的关系 音乐的十二平均率规定:每两个八度音(如简谱中的中音1与高音1)之间的频率相差一倍。在两个八度音之间,又可分为十二个半音,每两个半音的频
9、率比为。另外,音名A(简谱中的低音6)的频率为440 Hz,音名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低
10、音7493.88中音7987.76高音71975.52本讲稿第二十一页,共一百七十页 由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得到的分频数四舍五入取整。若基准频率过低,则由于分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然误码差变小,但分频结构将变大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取合适的基准频率。本例中选取4 MHz的基准频率。若无4 MHz的时钟频率,则可以先分频得到4 MHz或换一个新的基准频率。实际上,只要各个音名间的相对频率关系不变,C作1与D作1演奏出的音乐听起来都不会“走调”。本讲稿第二十二页,共一百七十页 本例需要演
11、奏的是“梁祝”片段,此片段内各音阶频率及相应的分频比如表7-2所示。为了减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,因此在到达扬声器之前,有一个二分频的分频器。表7-2中的分频比就是从4 MHz频率二分频得到的2 MHz频率基础上计算得出的。本讲稿第二十三页,共一百七十页表7-2 各音阶频率对应的分频值 音名分频系数初始值音名分频系数初始值低音360672124中音234054786低音551023089中音330345157低音645453646中音525515640低音740504141中音622735918中音138224369高音119116280本讲稿第二十四页,共一
12、百七十页 由于最大的分频系数为6067,故采用13位二进制计数器已能满足分频要求。在表7-2中,除给出了分频比以外,还给出了对应于各个音阶频率时计数器不同的初始值。对于不同的分频系数,只要加载不同的初始值即可。采用加载初始值而不是将分频输出译码反馈,可以有效地减少本设计占用可编程逻辑器件的资源,这也是同步计数器的一个常用设计技巧。对于乐曲中的休止符,只要将分频系数设为0,即初始值为213-1=8191即可,此时扬声器将不会发声。本讲稿第二十五页,共一百七十页 7.2.2 音长的控制 本例演奏的“梁祝”片段,最小的节拍为1/4拍。将1拍的时长定为1秒,则只需要再提供一个4 Hz的时钟频率即可产生
13、1/4拍的时长。演奏的时间控制通过记谱来完成,对于占用时间较长的节拍(一定是1/4拍的整数倍),如2/4拍,只需将该音名连续记录两次即可。本例要求演奏时能循环进行,因此需另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。本讲稿第二十六页,共一百七十页 7.2.3 演奏时音名的动态显示 如果有必要,可以通过一个数码管或LED来显示乐曲演奏时对应的音符。如用三个数码管,分别显示本例中的高、中、低音名,就可实现演奏的动态显示,且十分直观。本设计通过三个数码管来动态显示演奏时的音名,其中HIGH显示为高音区音阶(仅高音1),MED2.0显示的是中音区音阶(中音6,5,3,2,1),LO
14、W2.0显示的是低音区音阶(低音7,6,5,3)。数码管显示的七段译码电路在此不作专门讨论。需要说明的是,七段译码电路输入为4位,而将HIGH、MED、LOW用作输入时,不足4位的高位均为低电平“0”。本讲稿第二十七页,共一百七十页图7-5 音乐产生器外部接口本讲稿第二十八页,共一百七十页 7.2.4 VHDL程序 本设计的外部接口如图7-5所示,程序中定义了一个5位宽的zero4.0,这是由于实验平台上连向数码管的引脚在不赋值的情况下为高电平,这将导致显示音名错误,设置zero4.0就是要将没用到的引脚(高音的高3位、中音的高1位和低音的高1位)赋一个低电平,从而避免显示错误。本讲稿第二十九
15、页,共一百七十页LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY song IS PORT(clk_4MHz,clk_4Hz:IN STD_LOGIC;-预置计数器和乐谱产生器的时钟本讲稿第三十页,共一百七十页 digit:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 0);-高、中、低音数码管指示 zero:OUT STD_LOGIC_VECTOR(4 DOWNTO 0);-用于数码管高位置低 speaker:out STD_LOGIC -扬声器 );END so
16、ng;ARCHITECTURE song_arch OF song IS本讲稿第三十一页,共一百七十页SIGNALdivider,origin:STD_LOGIC_VECTOR(12 DOWNTO 0);-13位计数值和预置值SIGNAL counter:integer range 0 to 140;-7位计数器SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);-记录1/4拍SIGNAL carrier:STD_LOGIC;BEGINzero=00000;PROCESS(clk_4MHz)本讲稿第三十二页,共一百七十页BEGIN IF(clk_4MHzeven
17、t AND clk_4MHz=1)THEN IF(divider=1111111111111)THEN carrier=1;divider=origin;ELSE divider=divider+1;carrier=0;END IF;END IF;END PROCESS;本讲稿第三十三页,共一百七十页PROCESS(carrier)BEGIN IF(carrierevent AND carrier=1)THEN count=count+1;-输出时钟四分频 IF count=00 THEN speaker=1;ELSE speaker=0;END IF;END IF;END PROCESS;本
18、讲稿第三十四页,共一百七十页PROCESS(clk_4Hz)BEGIN IF(clk_4Hzevent AND clk_4Hz=1)THEN IF(counter=140)THEN counter=0;ELSE counterdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdi
19、gitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdi
20、gitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitdigitoriginoriginoriginoriginoriginoriginoriginoriginoriginoriginorigin=1111111111111;-
21、8191本讲稿第四十二页,共一百七十页 END CASE;END PROCESS;END song_arch;本讲稿第四十三页,共一百七十页7.2.5 仿真结果音乐发生器的仿真波形如图7-6所示。图7-6 音乐发生器仿真波形图 本讲稿第四十四页,共一百七十页 7.2.6 下载验证 锁定引脚时将clk_4 MHz和clk_4 Hz分别连至CLK1和CLK2,speaker接扬声器,zero4.2、digit6接一个数码管,zero1、digit5.3接一个数码管,zero0、digit2.0接另一个数码管。综合适配后将配置数据下载入EDA实验平台(技术资料详见附录)的FPGA中(有关CLK1等引
22、脚在FPGA芯片引脚中的序号,请参见附录的附图1),扬声器短接线短路(接入扬声器),即可听到MIDI音乐。本讲稿第四十五页,共一百七十页7.3 2FSK/2PSK信号产生器信号产生器 7.3.1 2FSK基本原理 在通信领域中,为了传送信息,一般都将原始的信号进行某种变换变成适合于通信传输的信号形式。在数字通信系统中,一般将原始信号(图像、声音等)经过量化编码变成二进制码流,称为基带信号。本讲稿第四十六页,共一百七十页 但数字基带信号一般不适合于直接传输。例如,通过公共电话网络传输数字信号时,由于电话网络的带宽为4 kHz以下,因此数字信号不能直接在其上传输。此时可将数字信号进行调制,FSK即
23、为一种常用的数字调制方式,由FSK调制的波形如图7-7示。本讲稿第四十七页,共一百七十页 FSK又称移频键控,它利用载频频率的变化来传递数字信息。数字调频信号可以分为相位离散和相位连续两种。若两个载频由不同的独立振荡器提供,它们之间相位互不相关,就称相位离散的数字调频信号;若两个频率由同一振荡信号源提供,只是对其中一个载频进行分频,这样产生的两个载频就是相位连续的数字调频信号。本讲稿第四十八页,共一百七十页图7-7 FSK调制的波形 本讲稿第四十九页,共一百七十页 7.3.2 2FSK信号产生器 由于FSK为模拟信号,而FPGA只能产生数字信号,因此需对正弦信号采样并经模数变换来得到所需的FS
24、K信号。本例由FPGA产生正弦信号的采样值。FSK信号发生器框图如图7-8所示,整个系统共分为分频器、m序列产生器、跳变检测、2:1数据选择器、正弦波信号产生器和DAC数模变换器等6部分,其中前5部分由FPGA器件完成。本讲稿第五十页,共一百七十页图7-8 FSK调制信号发生器框图 本讲稿第五十一页,共一百七十页 1分频器 本实例中数据速率为1.2 kHz,要求产生1.2 kHz和2.4 kHz两个正弦信号。对正弦信号每周期取100个采样点,因此要求能产生3个时钟信号:1.2 kHz(数据速率)、120 kHz(产生1.2 kHz正弦信号的输入时钟)和240 kHz(产生2.4 kHz正弦信号
25、的输入时钟)。基准时钟由一个12 MHz的晶振提供。设计中要求一个50分频(产生240 kHz信号),再2分频(产生120 kHz信号)和100分频(产生1.2 kHz信号),共有三个分频值。本讲稿第五十二页,共一百七十页 2m序列产生器 m序列是伪随机序列的一种,它的显著特点是:随机特性,预先可确定性,循环特性。正因为这些特性,使得m序列产生器在通信领域得到了广泛的应用。本例用一种带有两个反馈抽头的3级反馈移位寄存器,得到一串“1110010”循环序列,并采取措施防止进入全“0”状态。通过更换时钟频率可以方便地改变输入码元的速率。m序列产生器的电路结构如图7-9所示。本讲稿第五十三页,共一百
26、七十页图7-9 m序列产生器电路结构本讲稿第五十四页,共一百七十页 3跳变检测 将跳变检测引入正弦波的产生中,可以使每次基带码元上升沿或下降沿到来时,对应输出波形位于正弦波形的sin0处。引入跳变检测主要是为了便于观察,确保示波器上显示为一个连续的波形。基带信号的跳变检测可以有很多方法,图7-10为一种便于在可编程逻辑器件中实现的方案。本讲稿第五十五页,共一百七十页图7-10 信号跳变检测电路本讲稿第五十六页,共一百七十页 42:1数据选择器 2:1数据选择器用于选择正弦波产生器的两个输入时钟。一个时钟的频率为120 kHz,此时正弦波产生器产生一个1.2 kHz的正弦波,代表数字信号“0”;
27、另一个时钟的频率为240 kHz,此时产生一个2.4 kHz的正弦波信号,代表数字信号“1”。本讲稿第五十七页,共一百七十页 5正弦信号的产生 用数字电路和DAC变换器可以产生要求的模拟信号。根据抽样定理可知,当用模拟信号最大频率两倍以上的速率对该模拟信号采样时,便可将原模拟信号不失真地恢复出来。本例要求得到的是两个不同频率的正弦信号,实验中对正弦波每个周期采样100个点,即采样速率为原正弦信号频率的100倍,因此完全可以在接收端将原正弦信号不失真地恢复出来,从而可以在接收端对FSK信号正确地解调。经DAC转换后,可以在示波器上观察到比较理想的波形。本讲稿第五十八页,共一百七十页 本实验中每个
28、采样点采用8位量化编码,即8位分辨率。采样点的个数与分辨率的大小主要取决于CPLD/FPGA器件的容量,其中分辨率的高低还与DAC的位数有关。实验表明,采用8位分辨率和每周期100个采样点可以达到相当不错的效果。本讲稿第五十九页,共一百七十页 具体的正弦信号产生器可以用状态机来实现。按前面的设计思路,本实现方案共需100个状态,分别为s1s100。同时设计一个异步复位端,保证当每个“1”或“0”到来时其调制信号正好位于坐标原点,即sin0处。状态机共有8位输出(Q7Q0),经DAC变换为模拟信号输出。为得到一个纯正弦波形,应在DAC的输出端加上一个低通滤波器,由于本例仅观察FSK信号,因此省去
29、了低通滤波器。本设计中,数字基带信号与FSK调制信号的对应关系为“0”对应1.2 kHz,“1”对应2.4 kHz,此二载波的频率可以方便地通过软件修改。本讲稿第六十页,共一百七十页图7-11 2FSK/2PSK信号产生器外部接口本讲稿第六十一页,共一百七十页 7.3.3 2FSK/2PSK信号产生器 在2FSK的基础上,可以较容易地设计出2PSK信号产生器,其接口如图7-11所示。在检测到基带码元的上升沿或下降沿时,使输出波形位于sin处,即可使波形倒相,产生2PSK信号。本讲稿第六十二页,共一百七十页 在设计的最后,应考虑选用DAC器件将波形数据转换为模拟波形输出。本实验箱上选用8位并行D
30、AC器件TLC7528,将8位数据输出连至DAC器件的8位数据输入端,即可观察到产生的2FSK/2PSK波形。为了观察波形的方便,我们将TLC7528连接成电压输出的方式(器件本身是电流输出方式),后面跟一个射随器以增强带载能力。本讲稿第六十三页,共一百七十页7.3.4 2FSK信号产生器的VHDL程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY fsk ISPORT(clock:IN STD_LOGIC;-正弦波发生器时钟 本讲稿第六十四页,共一百七十页 dout:OUT STD
31、_LOGIC_VECTOR(7 DOWNTO 0);-并行数据DATA code:BUFFER STD_LOGIC -输出m序列 );END fsk;本讲稿第六十五页,共一百七十页ARCHITECTURE fsk_arch OF fsk ISSIGNAL count100:STD_LOGIC_VECTOR(6 DOWNTO 0);-记录100个状态SIGNAL count50:STD_LOGIC_VECTOR(5 DOWNTO 0);SIGNAL sinclk1:STD_LOGIC;SIGNAL sinclk,coderate:STD_LOGIC;SIGNAL temp,jump_ high:
32、STD_LOGIC;SIGNAL m:STD_LOGIC_VECTOR(2 DOWNTO 0);-m序列本讲稿第六十六页,共一百七十页BEGINPROCESS(clock)BEGIN IF(clockevent AND clock=1)THEN -产生FSK所需的另一个频率sinclk1=clock/2 sinclk1=NOT sinclk1;END IF;END PROCESS;本讲稿第六十七页,共一百七十页PROCESS(sinclk1)-sinclk1 100分频得到coderate码元速率BEGIN IF(sinclk1event AND sinclk1=1)THEN IF(count
33、50=110001)THEN count50=000000;coderate=NOT coderate;ELSE count50=count50+1;END IF;END IF;END PROCESS;本讲稿第六十八页,共一百七十页m_sequence_form:-产生 1110010 m序列PROCESS(coderate)BEGIN IF(coderateevent AND coderate=1)THEN m(0)=m(1);m(1)=m(2);END IF;END PROCESS;本讲稿第六十九页,共一百七十页PROCESS(coderate)BEGIN IF(coderateevent
34、 AND coderate=1)THEN m(2)=(m(1)XOR m(0)OR(NOT(m(0)OR m(1)or m(2);END IF;END PROCESS;本讲稿第七十页,共一百七十页code=m(0);PROCESS(sinclk1,clock,code)BEGIN IF(code=0)THEN sinclk=sinclk1;ELSE sinclk=clock;-选择正弦波产生器的时钟频率 END IF;END PROCESS;本讲稿第七十一页,共一百七十页jump_high=(not temp)AND code;-0到1跳变PROCESS(sinclk)-2FSK跳变的不同处理
35、BEGIN IF(sinclkevent AND sinclk=1)THEN temp=code;IF(count100=1100011)OR(jump_high=1)THEN count100=0000000;ELSE count100doutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutd
36、outdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutnull;END CASE;END PROCESS;END fsk_arch;本讲稿第七十六页,共一百七十页7.3.5 2PSK信号产生器的VHDL程序LIBRA
37、RY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY psk ISPORT(clock:IN STD_LOGIC;-正弦波发生器时钟 本讲稿第七十七页,共一百七十页dout:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-并行数据DATA code:BUFFER STD_LOGIC -输出m序列 );END psk;本讲稿第七十八页,共一百七十页ARCHITECTURE psk_arch OF psk ISSIGNAL count100:STD_LOGIC_VECTOR(6 DO
38、WNTO 0);-记录100个状态SIGNAL count50:STD_LOGIC_VECTOR(5 DOWNTO 0);SIGNAL sinclk1:STD_LOGIC;SIGNAL sinclk,coderate:STD_LOGIC;SIGNAL temp,jump_low,jump_high:STD_LOGIC;SIGNAL m:STD_LOGIC_VECTOR(2 DOWNTO 0);-m序列本讲稿第七十九页,共一百七十页BEGINPROCESS(clock)BEGIN IF(clockevent AND clock=1)THEN -产生FSK所需的另一个频率sinclk1=clock
39、/2 sinclk1=NOT sinclk1;END IF;END PROCESS;PROCESS(sinclk1)-sinclk1 100分频得到coderate码元速率本讲稿第八十页,共一百七十页BEGIN IF(sinclk1event AND sinclk1=1)THEN IF(count50=110001)THEN count50=000000;coderate=NOT coderate;ELSE count50=count50+1;END IF;END IF;END PROCESS;m_sequence_form:-产生 1110010 m序列PROCESS(coderate)本讲
40、稿第八十一页,共一百七十页BEGIN IF(coderateevent AND coderate=1)THEN m(0)=m(1);m(1)=m(2);END IF;END PROCESS;PROCESS(coderate)BEGIN IF(coderateevent AND coderate=1)THEN m(2)=(m(1)XOR m(0)OR(NOT(m(0)OR m(1)OR m(2);END IF;END PROCESS;本讲稿第八十二页,共一百七十页code=m(0);jump_low=(not code)AND temp;-0到1跳变jump_high=(not temp)AND
41、 code;-1到0跳变PROCESS(clock)-2PSK对跳变的不同处理BEGIN IF(clockevent AND clock=1)THEN本讲稿第八十三页,共一百七十页 temp=code;IF(jump_low=1)THEN count100=0110010;ELSIF(jump_high=1)THEN count100=0000000;ELSIF(count100=1100011)THEN count100=0000000;ELSE count100doutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutd
42、outdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutd
43、outdoutdoutdoutdoutdoutdoutdoutdoutnull;END CASE;END PROCESS;END psk_arch;本讲稿第八十八页,共一百七十页 7.3.6 仿真结果 2FSK信号产生器的仿真波形如图7-12所示;2PSK信号产生器的仿真波形如图7-13所示。本讲稿第八十九页,共一百七十页图7-12 2FSK信号产生器仿真波形图 本讲稿第九十页,共一百七十页图7-13 2PSK信号产生器仿真波形图 本讲稿第九十一页,共一百七十页 7.3.7 下载验证 锁定引脚时将clock连至CLK1,dout连至DA输入端,code连至TESTOUT1(测试1脚)。综合适配
44、后将配置数据下载入EDA实验平台(技术资料详见附录)的FPGA中(有关CLK1等引脚在FPGA芯片引脚中的序号,请参见附录的附图1),即可用双踪示波器同时观察m序列及其对应的2FSK或2PSK波形。本讲稿第九十二页,共一百七十页7.4 实用多功能电子表实用多功能电子表 7.4.1 功能描述 多功能电子表共有5种功能:功能1为数字钟;功能2为数字跑表;功能3为调时;功能4为闹钟设置;功能5为日期设置。除调时功能以外,电子表处于其他功能状态下时并不影响数字钟的运行。使用数字钟功能时,还可以通过按键快速查看当前的闹钟设置时间和当前日期。该电子表利用EDA实验平台的扬声器整点报时和定时报时,设置3个按
45、键分别作为功能键和调整键。实用多功能电子表外部接口如图7-14所示。本讲稿第九十三页,共一百七十页图7-14 实用多功能电子表外部接口 本讲稿第九十四页,共一百七十页 1输入 (1)func_key:功能键,控制电子表的功能号。(2)key1:调整key1,功能1时按下可显示闹钟设置时间;功能2时用作跑表暂停键;功能3、4时分别用于调数字钟和闹钟的小时数;功能5时用于调日期的月份。(3)key2:调整key2,功能1时按下可显示当前日期;功能2时用作跑表清零键;功能3、4时分别用于调数字钟和闹钟的分钟数;功能5时用于调日期的日期数。本讲稿第九十五页,共一百七十页 (4)clk_1 Hz:数字钟
46、时钟(1 Hz)输入。(5)clk_1 kHz:1 kHz时钟,是整点报时和定点报时所需的频率。另外,10分频后还可得到100 Hz频率信号作为数字跑表时钟输入。本讲稿第九十六页,共一百七十页 2输出 (1)mode:显示电子表的功能号15。(2)hour:功能1、3和4时显示小时数;功能2时显示跑表的分钟数;功能5时显示月份。(3)minute:功能1、3和4时显示分钟数;功能2时显示跑表的秒数;功能5时显示日期数。(4)second:功能1时显示秒数;功能2时显示1%秒;功能3、4和5时均显示0。(5)alarm:连至扬声器,用于整点报时及闹钟报时。本讲稿第九十七页,共一百七十页 7.4.
47、2 电路组成 在明确电子表的功能后,可对电子表进行模块划分得到电子表设计的结构框图,如图7-15所示。本讲稿第九十八页,共一百七十页图7-15 实用多功能电子表结构框图 本讲稿第九十九页,共一百七十页 从结构框图中可以看出,模块划分与功能划分存在不同之处。下面分别对几个模块加以说明。1数字钟与调时模块 由于调时功能改变的就是数字钟的时和分,因此应将这两个功能合在同一模块中。这是因为在VHDL和Verilog HDL中都不允许两个进程对同一信号进行赋值(即多重驱动)。此模块的输入有下面3个。本讲稿第一百页,共一百七十页 (1)clk_1:时钟输入。当处在数字钟功能时,clk_1应为1 Hz的时钟
48、信号;当处在调时功能时,clk_1应为按key1和key2调整键产生的adjust_key1和adjust_key2脉冲信号。因此可描述clk_1为clk_1=(clk_1 Hz&mode!=3)|(mode=3&(adjust_key1|adjust_key2);即当不处于功能3时为1 Hz时钟信号,处于功能3时为adjust_key1或adjust_key2脉冲信号。这样,当将电子表调整到数字钟功能外的其他功能时将不会影响数字钟的运行。本讲稿第一百零一页,共一百七十页 (2)adjust_key1和adjust_key2:在EDA实验平台上实现时,key1(KEY2)和key2(KEY3)
49、两个调整键是乒乓开关,即每按动一次,相应引脚上的电平就翻转一次。这里需将其变为琴键开关,即每按动一次将产生一个上跳脉冲,从而启动进程的运行。有关乒乓开关和琴键开关的说明请参见附录。此模块的输出为6位时、7位分和7位秒,采用BCD码表示。本讲稿第一百零二页,共一百七十页 2跑表模块 跑表的设计与数字钟的设计基本相同,不同的是其输入时钟应为100 Hz的信号,同时还应增加暂停键(key1)和清零键(key2)。因此其时钟clk_2应描述为 clk_2=clk_100 Hz&mode=2&!key1;即当电子表处于功能2时启动跑表模块运行,时钟为100 Hz,key1(乒乓开关)则作为时钟使能信号,
50、也即作为跑表的暂停键。跑表模块的输出为7位分、7位秒和8位1%秒,采用BCD码显示。本讲稿第一百零三页,共一百七十页 3闹钟设置模块 闹钟设置模块的输入为两个调整键clk_key1和clk_key2,分别描述为 clk_key1=adjust_key1&mode=4;clk_key2=adjust_key2&mode=4;表示在闹钟功能时key1和key2分别作为调时键和调分键。闹钟的输出为6位时和7位分,采用BCD码显示。本讲稿第一百零四页,共一百七十页 4日期设置模块 日期设置模块输入为两个调整键clk_key3和clk_key4,分别描述为 clk_key3=adjust_key1&mo