FPGA 论文Word下载.docx
《FPGA 论文Word下载.docx》由会员分享,可在线阅读,更多相关《FPGA 论文Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
THENOUT_RST<
='
;
ELSEOUT_RST<
ENDIF;
LOAD<
OUT_ENA<
=TEMP;
ENDONE
四、计数电路
在数字电路中,计数电路一般是用计数器来实现的。
10进制计数器外部端口如下图所示:
useieee.std_logic_unsigned.all;
entitycnt10is
port(clk,rst,ena:
outy:
outstd_logic_vector(3downto0);
cout:
endcnt10;
architecturetwoofcnt10is
signaltemp:
std_logic_vector(3downto0);
begin;
process(clk,rst,ena);
begin
ifrst='
thentemp<
="
0000"
elsifclk'
eventandclk='
then
ifena='
then
iftemp="
1001"
thentemp<
cout<
elsetemp<
=temp+"
0001"
endif;
outy<
=temp;
endprocess;
endtwo;
四、锁存电路
在数字电路中,锁存电路一般用锁存器来实现。
常用的锁存器的外部端口图如图4所示:
entityreg4is
PORT(LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
endreg4;
architecturethreeofreg4is
process(load,din)
ifload'
eventandload='
thendout<
=din;
endthree;
五、频率计原理图的顶层设计
采用原理图方式设计顶层文件,仿真分析。
顶层仿真波形:
四、频率计误差的来源及如何检测并改进,给出改进方案
基准信号为1Hz,所有的测量频率都是以此为基准进行分频的,所有若基准信号有一点偏差,则之后的信号就偏差很多。
可以通过用频率计测量基准信号的频率,并通过调整实验板上的晶振,对其进行调整。
实验3可编程数字信号源
试设计并制作一个可编程数字信号源,并具有如下指标:
1.输出频率范围1Hz~250Hz的正弦波,输出频率误差小于1Hz;
2.频率可调控,输入频率的数字可获得该频率的信号波形输出,如输入“1”,输出信号的频率即为1Hz,输入“100”,则输出信号的频率为100Hz。
3.有复位和置位功能。
本设计的任务是设计一个可编程数字信号源。
通过编程可实现任意形式的波形(例如三角波以及正弦波),同时输出信号的频率也可以在一定范围内任意改变。
其系统总体结构框图如下图所示:
三、“CONTROL”模块
该模块通过频率输入信号FREQ以及INCLK高速时钟信号(固定为750KHZ)进行处理,并生成地址生成模块“GENADD”所需要的时钟信号。
port(inclk:
freq:
inintegerrange255downto0;
newclk:
architectureoneofcontrolis
begin
PROCESS(INCLK,FREQ)
VARIABLETEMP:
INTEGERRANGE0TO1000000;
IFINCLK'
EVENTANDINCLK='
THENIFTEMP>
749999THEN
TEMP:
=0;
NEWCLK<
ELSE
=TEMP+FREQ*64;
ENDIF;
ENDPROCESS;
endone;
三、“GENADD”模块
该模块通过对输入时钟信号进行处理,从而得到正确的地址信号,为读取SINROM模块中的数据作好准备。
共有64个地址,每一个时钟脉冲的上升沿地址加一,用以保存SINROM模块中的数据。
entitygenaddis
addr:
bufferstd_logic_vector(5downto0));
endgenadd;
architecturetwoofgenaddis
process(inclk)
ifinclk'
eventandinclk='
thenif(addr="
111111"
)then
addr<
000000"
elseaddr<
=addr+1;
四、“SINROM”模块
波形数据ROM中存有波形发生器的波形数据,如正弦波或三角波数据。
当接受来自GENADD模块的地址信号后,将从数据线输出相应的波形数据。
MemoryinitializationFile文件中的数据存储图:
五、顶层文件
采用原理图方式设计顶层文件,仿真分析。
六.D/A转换器
负责将ROM输出的数据转换成模拟信号,经滤波电路后输出。
输出波形的频率上限与D/A器件的转换速度有重要关系,本例采用DAC0832器件。
它是8位D/A转换器,转换周期为1µ
s。
七、思考题
1、采用宏能的方法进行锯齿波的设计
控制模块仍然是产生分频系数可控的频率,只需要在ROM中产生数据的时候设置为等间隔并且锯齿波高度可通过ROM中的位数来控制即可,然后再通过数模转换和低通滤波在示波器上显示即可。
2、可编程数字信号源混合波形输出的设计方案(如输出波形控制端为“1”时,输出方波,否则输出正弦波)。
在设计ROM时,加上一个选择控制信号,不同的控制信号对应的地址中分别存有方波与正弦波的对应抽样值。
这样就可以实现混合波的实现。
实验4乐曲硬件演奏电路
试设计并制作一个乐曲硬件演奏电路,并具有如下指标:
1.能演奏“梁祝”乐曲;
2.控制信号OE可用于控制演奏过程。
即当OE为高电平时,则开始演奏;
否
则停止演奏。
与利用微处理器(CPU或MCU)来实现乐曲演奏相比,以纯硬件来完成乐曲演奏电路的逻辑要复杂得多,如果不借助于EDA工具,仅凭传统的数字逻辑技术,乐曲演奏电路是难以实现的。
我们知道,组成乐曲的每个音符的发音频率值及其持续时间是乐曲能够连续演奏所需的两个基本要素,那么问题就是如何获取这两个要素所对应的数值以及通过纯硬件的手段来实现所希望乐曲的演奏效果。
1、音符频率获取模块—Speekers模块
音符频率可由图1中的“Speekers”模块获取,这是一个数控分频器。
由其CLK端输入一具有较高频率(例如6MHz)的信号,通过“Speekers”分频后由SpkOut输出。
由于直接从数控分频器中出来的信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需要另加一个触发器来均衡其占空比,但需要注意的是这时的频率可能发生变化。
“Speekers”对CLK输入信号的分频系数由TONE决定,这样,分频计数器的输入TONE就与SpkOut的输出频率有了对应关系。
entityspeakeris
port(clk0:
tone1:
inintegerrange0to15610;
spks:
endspeaker;
architectureBehavioralofspeakeris
signalfullspks:
std_logic;
genspks:
process(clk0,tone1)
variablecount11:
integerrange0to16383;
ifclk0'
eventandclk0='
ifcount11<
tone1then
count11:
=count11+1;
fullspks<
elsecount11:
fullspks<
endif;
endprocess;
delaysps:
process(fullspks)
variablecount2:
std_logic:
begin
iffullspks'
eventandfullspks='
thencount2:
=notcount2;
ifcount2='
spks<
elsespks<
endBehavioral;
2.分频模块—ToneTabs模块
音频的持续时间须根据乐曲的速度及每个音符的节拍数来确定。
ToneTabs模块首先为Speekers模块通过查表方式提供决定所发音符的分频系数。
其中设置了在基准信号频率为6MHZ时“梁祝”乐曲全部音符所对应的分频系数,共13个。
entitytonetabsis
inintegerrange15downto0;
tone0:
outintegerrange15610downto0);
end;
architecturetwooftonetabsis
caseinclkis
when0=>
tone0<
=0;
when1=>
=15610;
when2=>
=15471;
when3=>
=9101;
when5=>
=7653;
when6=>
=6818;
when7=>
=6074;
when8=>
=5733;
when9=>
=5108;
when10=>
=4551;
when12=>
=3827;
when13=>
=3409;
when15=>
=2867;
whenothers=>
=null;
endcase;
3.音乐节拍和音调发生器模块—NoteTabs模块
在NoteTabs模块中包含有一个8位二进制计数器,作为乐曲数据ROM的地址发生器。
这个计数器的输入时钟频率选为4Hz,即每一计数值停留时间约为0.25秒。
port(oe,clk:
addr:
bufferintegerrange138downto0);
architecturethreeofgenaddis
process(oe,clk)
ifoe='
thenaddr<
if(addr=138)then
addr<
4.乐曲数据ROM的设计
“梁祝”乐曲音符数据为4位宽度,共139个节拍。
请参照可编程数字信号源的设计方法。
最后生成的符号如下图所示:
entitymusicromis
port(addr:
inintegerrange0to138;
q:
outintegerrange0to15);
architecturefourofmusicromis
process(addr)
caseaddris
q<
=3;
when35=>
=10;
when70=>
=9;
when105=>
when1=>
when36=>
=7;
when71=>
when106=>
when37=>
when72=>
=6;
when107=>
when3=>
when38=>
when73=>
=8;
when108=>
when4=>
=5;
when39=>
when74=>
when109=>
when40=>
when75=>
when110=>
when41=>
when76=>
when111=>
when7=>
when42=>
when77=>
when112=>
when43=>
when78=>
when113=>
when44=>
when79=>
when114=>
when10=>
when45=>
when80=>
when115=>
when11=>
when46=>
when81=>
when116=>
when47=>
when82=>
when117=>
when48=>
when83=>
when118=>
when14=>
when49=>
when84=>
when119=>
when15=>
when50=>
when85=>
when120=>
when16=>
=12;
when51=>
when86=>
when121=>
when17=>
when52=>
when87=>
when122=>
when18=>
when53=>
when88=>
when123=>
when19=>
=15;
when54=>
when89=>
when124=>
when20=>
=13;
when55=>
when90=>
when125=>
when21=>
when56=>
when91=>
when126=>
when22=>
when57=>
when92=>
when127=>
when23=>
when58=>
when93=>
when128=>
when24=>
when59=>
when94=>
when129=>
when25=>
when60=>
when95=>
when130=>
when26=>
when61=>
when96=>
when131=>
when27=>
when62=>
when97=>
when132=>
when28=>
when63=>
when98=>
when133=>
when29=>
when64=>
when99=>
when134=>
when30=>
when65=>
when100=>
when135=>
when31=>
when66=>
when101=>
when136=>
when32=>
when67=>
when102=>
when137=>
when33=>
when68=>
when103=>
when138=>
when34=>
when69=>
when104=>
endprocess;
5、将所有模块都打包到MY_PKG中,打包VHDL程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
PACKAGEMY_PKGIS
COMPONENTCENADD
PORT(CLK,OE:
ADDR:
BUFFERINTEGERRANGE0TO138);
ENDCOMPONENT;
COMPONENTMUSICROM
PORT(
ININTEGERRANGE0TO138;
Q:
OUTINTEGERRANGE0TO15);
COMPONENTTONETABS
PORT(INCLOCK:
ININTEGERRANGE0TO15;
TONES:
OUTINTEGERRANGE0TO15610);
COMPONENTSPEAKER
PORT(CLK0:
TONE1:
ININTEGERRANGE0TO15610;
SPKS:
OUTSTD_LOGIC);
ENDMY_PKG;
6、顶层文件
usework.my_pkg.all;
entitytopis
clk0:
architecturefiveoftopis
signaladdr:
integerrange138downto0;
signalq:
integerrange0