EDA课程综述Word格式文档下载.docx

上传人:b****6 文档编号:21757500 上传时间:2023-02-01 格式:DOCX 页数:17 大小:204.32KB
下载 相关 举报
EDA课程综述Word格式文档下载.docx_第1页
第1页 / 共17页
EDA课程综述Word格式文档下载.docx_第2页
第2页 / 共17页
EDA课程综述Word格式文档下载.docx_第3页
第3页 / 共17页
EDA课程综述Word格式文档下载.docx_第4页
第4页 / 共17页
EDA课程综述Word格式文档下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

EDA课程综述Word格式文档下载.docx

《EDA课程综述Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《EDA课程综述Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。

EDA课程综述Word格式文档下载.docx

实现方法有许多种,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。

如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。

使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。

FPGA预装了很多已构造好的参数化库单元LPM器件。

通过引入支持LPM的EDA软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。

本课设在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计乐曲硬件演奏电路,并定制LPM-ROM存储音乐数据,以“梁祝”乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。

只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。

第2章乐曲演奏电路原理

2.1音乐演奏电路原理

先介绍一下硬件电路的发声原理。

声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。

乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。

乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。

而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。

2.2音符频率的获得

多个不同频率的信号可通过对某个基准频率进行分频器获得。

由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。

若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。

若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。

实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频率。

本文中选取750KHz的基准频率。

由于现有的高频时钟脉冲信号的频率为12MHz,故需先对其进行16分频,才能获得750KHz的基准频率。

对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数)。

为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2),但这时的频率将是原来的1/2。

由于最大分频系数是1274,故分频器采用11位二进制计数器能满足要求,乐曲中的休止符,只要将分频系数设为0,即初始值=211-1=2047,此时扬声器不会发声。

2.3乐曲节奏的控制

本课设的梁祝乐曲,最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要提供一个4Hz的时钟频率即可产生1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。

计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低。

第3章总体程序设计

3.1顶层模块设计流程图

图3—1乐曲演奏电路结构框图

图3—2顶层模块设计流程图

3.2顶层电路VHDL程序设计

Libraryieee;

--硬件演奏电路顶层设计

port(CLK12MHZ:

instd_logic;

--音调频率信号

CLK8HZ:

--节拍频率用于控制节拍的时钟频率

sel:

--音乐选择键

Rst:

--复位键

code1:

outstd_logic_vector(3downto0);

--简谱码输出显示

high1:

outstd_logic;

--高8度指示

spkout:

outstd_logic);

--声音输出

end;

architectureoneofsongeris

componentNoteTabs--元件u1例换化

port(clk:

rst:

ToneIndex:

outstd_logic_vector(3downto0));

endcomponent;

componentToneTaba--元件u2例换化

port(Index:

instd_logic_vector(3downto0);

code:

outstd_logic_vector(3downto0);

high16:

Tone:

outstd_logic_vector(10downto0));

endcomponent;

componentspeakera--元件u3例换化

Tone:

instd_logic_vector(10downto0);

Spks:

SignalTone:

std_logic_vector(10downto0);

SignalToneIndex:

std_logic_vector(3downto0);

begin

u1:

NoteTabsportmap(clk=>

CLK8HZ,rst=>

rst,sel=>

sel,ToneIndex=>

ToneIndex);

u2:

ToneTabaportmap(Index=>

ToneIndex,Tone=>

Tone,

code=>

code1,high16=>

high1);

u3:

speakeraportmap(clk=>

CLK12MHZ,Tone=>

Spks=>

spkout);

3.3硬件乐曲演奏电路顶层文件模块的仿真

将所编写的顶层文件模块songer的程序设为工程,选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。

仿真结果如图3—3所示。

图3—3顶层文件电路仿真波形

第4章单元模块程序设计

根据顶层原理图,共分为music模块,地址发生器模块,分频预置数模块,十六进制模块,数控分频模块这五个模块。

Music模块存放乐曲中的音符数据,地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器,分频预置数模块提供分频预置数即给数控分频模块提供技术初值,十六进制模块对12MHZ的时钟脉冲进行16分频,得到750KHZ的频率,给数控分频模块提供时钟脉冲。

数控分频模块根据分频预置数输出各个音符所对应的频率。

4.1音乐节拍和音调发生器模块

图4—1NoteTabs模块

4.1.1音乐节拍和音调发生器模块VHDL的源程序

Useieee.std_logic_1164.all;

Useieee.std_logic_unsigned.all;

entityNoteTabsis

port(clk:

sel:

instd_logic;

rst:

ToneIndex:

outstd_logic_vector(3downto0));

ArchitectureoneofNoteTabsis

Componentmusic

port(address:

instd_logic_vector(7downto0);

inclock:

q:

endcomponent;

signalcounter:

std_logic_vector(7downto0);

begin

cnt8:

process(clk,counter,sel,rst)

if((clk'

eventandclk='

1'

)and(counter=256orrst='

0'

))then

counter<

="

00000000"

;

=counter+1;

endif;

)and(sel='

))thencounter<

10010000"

;

endprocess;

u1:

musicportmap(address=>

counter,q=>

ToneIndex,inclock=>

clk);

end;

4.1.2地址发生器模块

地址发生器模块设置了一个8位二进制计数器(计数器最大值为256),作为音符数据ROM的地址发生器。

每来一个时钟脉冲信号(CLK),8位二进制计数器就计数一次,ROM文件中的地址也就随着递减,音符数据ROM中的音符也就一个接一个连续的取出来了。

在地址发生器的VHDL设计中,这个计数器的技术频率选为4HZ,即每一个计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。

例如,地址发生器在以下的VHDL逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。

那么相应随着程序中的计数器按4HZ的时钟频率作加法计数时,即随地址递增时,将从音符数据ROM中将连续取出4个音符“3”通过toneindex[3..0]端口输向分频预置数模块。

这样梁祝乐曲中的音符就一个接一个得通过toneindex[3..0]端口输向分频预置数模块。

4.1.3波形仿真

将所编写的音乐节拍和音调模块NoteTabs的程序设为工程,选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。

仿真结果如图4—2所示。

从图中可以看到,当CLK第一个时钟脉冲到达时,输出相应地址上的音符3,地址值递增1,接下来的三个时钟脉冲到来时,输出也是音符3,地址连续递增3次,第4个脉冲来到时,输出为5,这些都符合模块音符数据文件中的地址/数据表。

图4—2音乐节拍和音调发生器仿真波形

4.2音乐谱对应分频预置数查表电路模块

4.2.1音乐谱分频预置数模块

图4—3ToneTaba模块

4.2.2音乐谱对应分频预置数查表电路VHDL程序设计

音乐谱分频预置数模块是乐曲简码对应分频预置数查表电路。

它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。

分频预置数模块的VHDL设计程序如下:

Useieee.std_logic_1164.all;

EntityToneTabais

Port(Index:

instd_logic_vector(3downto0);

Code:

High16:

outstd_logic_vector(10downto0));

End;

ArchitectureoneofToneTabais

Begin

Search:

process(Index)

CaseIndexis

When"

0000"

=>

Tone<

11111111111"

code<

="

high16<

='

0001"

01100000101"

0010"

01110010000"

0011"

10000001100"

0101"

10010101101"

0110"

10100001010"

0111"

10101011100"

1000"

10110000010"

1001"

10111001000"

1010"

11000000110"

1100"

11001010110"

1111"

11010000000"

whenothers=>

null;

endcase;

4.2.3波形仿真

将所编写的分频预置数查表模块ToneTaba的程序设为工程,选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。

仿真结果如图4—4所示。

从图中可以看到,当Index是“0000”,Tone输出为2047,即休止符的分频预置数,当Index是“0010”时,Tone输出为912,即低音2的分频预置数,当Index为其他状态时,Tone分别输出相应音符的分频预置数。

图4—4音乐谱对应分频预置数查表电路仿真波形

4.3音乐符数控11分频电路模块

4.3.1音乐符数控11分频电路模块

图4—5Speakera模块

4.3.2音乐符数控分频模块VHDL程序

Useieee.std_logic_unsigned.all;

EntitySpeakerais

Port(clk:

instd_logic_vector(10downto0);

ArchitectureoneofSpeakerais

SignalPreCLK,FullSpks:

std_logic;

divideCLK:

process(clk)

Variablecount4:

std_logic_vector(3downto0);

PreCLK<

='

Ifcount4>

11thenPreCLK<

count4:

Elsifclk'

eventandclk='

thencount4:

=count4+1;

Endif;

Endprocess;

genSpks:

process(PreCLK,Tone)

Variablecount11:

std_logic_vector(10downto0);

IfPreCLK'

eventandPreCLK='

then

Ifcount11=16#7FF#thencount11:

=Tone;

FullSpks<

Elsecount11:

=count11+1;

delaySpks:

process(FullSpks)

Variablecount2:

std_logic;

IfFullSpks'

eventandFullSpks='

thencount2:

=notcount2;

Ifcount2='

thenSpks<

ElseSpks<

4.3.3仿真波形

将所编写的音乐符数控分频模块Speakera的程序设为工程,选用选用Altera公司的Cyclone系列中的EPIC3T144C8为目标芯片进行仿真。

仿真结果如图4—6所示。

图4—6音乐数控11分频电路仿真波形

4.4乐曲演奏音符数据文件

图4—7音乐乐谱

33335556

88896855

1212121513121012

99999990

999107766

55568899

33886568

55555555

101010127799

68555555

35335679

66666656

888912121210

991098865

33338888

68653568

55555555

00000000

05135173

50506716

65500321

11321112

32116232

16232000

52671210

03532157

00671112

32000513

51735567

16655032

11132111

23026712

其中WIDTH=4,表示数据输出宽度为4;

DPTH=256,表示共有256个4位数据点;

ADDRESS-RADIX=DEC,表示地址信号用十进制;

DATA-RADIX=DEC,表示输出数据是十进制数据。

4.5定制音符数据的ROM文件

定制好的ROM文件VHDL程序如下:

LIBRARYieee;

USEieee.std_logic_1164.all;

LIBRARYaltera_mf;

USEaltera_mf.all;

ENTITYmusicIS

PORT

address:

INSTD_LOGIC_VECTOR(7DOWNTO0);

inclock:

INSTD_LOGIC;

q:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)

);

ENDmusic;

ARCHITECTURESYNOFmusicIS

SIGNALsub_wire0:

STD_LOGIC_VECTOR(3DOWNTO0);

COMPONENTaltsyncram

GENERIC(

address_aclr_a:

STRING;

init_file:

intended_device_family:

lpm_hint:

lpm_type:

numwords_a:

NATURAL;

operation_mode:

outdata_aclr_a:

outdata_reg_a:

widthad_a:

width_a:

width_byteena_a:

NATURAL

PORT(

clock0:

address_a:

q_a:

ENDCOMPONENT;

BEGIN

q<

=sub_wire0(3DOWNTO0);

altsyncram_component:

altsyncram

GENERICMAP(

address_aclr_a=>

"

NONE"

init_file=>

singer.mif"

intended_device_fami

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1