EDA2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

EDA设计(二)课程设计报告
南京理工大学
2015 年月
目录
1 引言 (2)
2 系统总体设计 (2)
2.1 系统功能概述 (2)
2.2 系统总体组成结构 (2)
3 系统各组成模块详细设计 (3)
3.1 地址发生器模块 (3)
3.2 分频预置数模块 (4)
3.3 分频模块 (5)
4 系统调试 (7)
4.1 系统仿真调试 (7)
4.2 系统实际验证 (8)
4.3 调试程序遇到的问题及解决方法 (8)
5 总结与体会心得 (8)
6 参考文献 (9)
1 引言
电子设计自动化技术(Electronic Design Automation,EDA)已经成为现代电子设计技术的核心。

EDA技术就是依赖功能强大的计算机,在EDA工具平台上,对以硬件描述语言(HDL)为系统逻辑描述手段完成的设计文件,自动的完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至下载到可编程逻辑器件CPLD/FPGA或专用集成电路ASIC芯片中。

硬件描述语言(HDL)是EDA技术的重要组成部分,其中VHDL语言应用广泛,是电子设计主流硬件的描述语言之一,它以强大的系统描述能力、规范的程序设计结构、灵活的语句表达风格和多层次的仿真测试手段,受到了业界的普遍认同和广泛接受。

本设计采用SE-5M 型EDA 实验开发系统,以Altera 公司的MAX+PLUS II 为开发软件,用VHDL语言采用自顶向下的设计方法,实现了一个音乐播放器,实现播放完整曲目的动能。

2 系统总体设计
2.1 系统功能概述
本文设计的数字系统是一个音乐播放器,其主要功能如下:
(1)对系统时钟频率进行分频,可以发出高音、中音、低音区任意的音符。

(2)可以播放完整的曲目《怒放的生命》,此外,也可以输入其他乐谱,演奏
相应的曲目。

2.2系统总体组成结构
系统由地址发生器模块、分频预置数模块、分频模块3个模块构成。

硬件电路的发生原理是利用程序来控制FPGA某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。

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

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

而要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间(即乐曲的节拍)。

由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素。

地址发生器将乐谱转化成代码,存储了乐谱音符code和每个音符持续的拍数cnt;
分频预置数模块将音符code转化为对应的频率所需的分频预置数值(即
计数初值tone);
分频模块不仅产生节拍频率(8HZ),而且根据分频系数值产生所需要的音调频率,来驱动蜂鸣器的发声。

音乐播放器的整体功能流程图如下:
3系统各组成模块详细设计
3.1 地址发生器模块
地址发生器模块按顺序存储了《怒放的生命》乐谱中的每一个音符和每个音符持续的时间(即乐曲的节拍)。

这首歌是4/4拍,如果将全音符的持续时间设为0.5s的话,那么一拍所应该持续的时间为0.125s,则只需要再提供一个8HZ 的时钟频率即可产生四分音符的时长。

在地址发生器中音符是按地址存放的,当系统工作时就按8HZ的频率地址不断加1,依次读取简谱,当系统读到某个音符的简谱时就对应发这个音符的音调,持续时间为0.125秒,如果在曲谱文件中这个音符为4拍音长只要将该音符连续书写4遍,这时系统读乐曲文件的时候就会连续读到4次,也就会发4个0.125秒的音长,这时我们听上去就会持续了四拍的时间,通过这样一个简单的操作就可以控制音乐的音长了。

计数时钟频率越快,输出的节拍持续时间越短,播放速度越快。

怒放的生命的乐谱一共有280个节拍,当节拍数cnt等于280时,赋值cnt<=0;即地址复位了,因此可以循环演奏。

乐谱中一共包含了低音6到高音1这几个音调,各音符编码code和音名之
间的关系表如下:

中音部分就是按照BCD编码来的,高音部分就是首位为1。

3.2 分频预置数模块
分频预置数模块将音符code转化为对应的频率所需的分频系数值(即计数初值tone)。

在EDA开发板上,选取cp2=262kHZ作为时钟输入频率的基准频率,
17
==。

为了提高输出信号的驱动能力,以扬声器有足够的262kHz262144Hz2Hz
功率发声,需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波,但这时得到的频率将是原来的1/2,所以本实验的基准频率为131kHZ。

乐谱中一共包含了低音6到高音1这几个音调,选取的最低频率为低音6,频率为495.376HZ,根据131072÷495.376=265,最大分频系数为265,故分频器采用9位二进制计数器即可以满足要求。

预置数即可用公式“模-分频系数=预置数”。

分频器采用9位二进制计数器,2的9次方为512,所以模为512,例如对于休止符,设置频率为131072HZ,分频系数为1,预置数(计数初值)=512-1=511。

各音符和计数初值关系如表3-2所示。

具体代码实现如下:
entity tonefreq is
port (code: in std_logic_vector(3 downto 0); --音名编码输入high: out std_logic; --高音标志
tone: out integer range 0 to 511 --计数初值
);
end tonefreq;
architecture three of tonefreq is
begin
three_p1: process(code)
begin
case code is
when "0000"=>tone<=0; high<='0'; --休止符
when "0001"=>tone<=288;high<='0'; --中音1
when "0010"=>tone<=306;high<='0'; --中音2
when "0011"=>tone<=334;high<='0'; --中音3
when "0100"=>tone<=346;high<='0'; --中音4
when "0101"=>tone<=362;high<='0'; --中音5
when "0110"=>tone<=379;high<='0'; --中音6
when "0111"=>tone<=396;high<='0'; --中音7
when "1000"=>tone<=246;high<='0'; --低音3
when "1001"=>tone<=400;high<='1'; --高音1
when "1010"=>tone<=414;high<='1'; --高音2
when "1011"=>tone<=424;high<='1'; --高音3
when "1100"=>tone<=430;high<='1'; --高音4
when "1101"=>tone<=438;high<='1'; --高音5
when "1110"=>tone<=446;high<='1'; --高音6
when "1111"=>tone<=0; high<='0';
when others => null;
end case;
end process three_p1;
end three;
3.3 分频模块
分频模块主要有两大部分构成,speaker.vhd中产生节拍频率(8HZ),divfreq.vhd中根据分频预置数模块输出的分频预置数tone产生所需要的音调频率,以驱动蜂鸣器的发声。

产生的节拍频率使用时钟频率cp1=512HZ,通过64分频产生8HZ的节拍频率。

具体的代码实现如下:
entity divfreq is
port(cp1:in std_logic; --输入频率为512Hz
clk8:out std_logic --输出为8Hz
);
end divfreq;
architecture one of divfreq is
signal cnt:std_logic_vector(8 downto 0);
begin
one_p1: process(cp1)
begin
if cp1'event and cp1='1' then --当cp1处于上升沿时
cnt<=cnt+1;
end if;
end process one_p1;
clk8<=cnt(5); --实现64分频
end one;
speaker.vhd中根据输入音符的计数初值(分频预置数),通过数控分频器产生相应的频率的脉冲(分频器采用9位二进制计数器),由于脉冲的占空过窄,需要对其再进行二分频,变成占空比50%的脉冲,使扬声器有足够的功率发音。

输入时钟CP2选择262kHz。

具体代码如下:
entity speaker is
port(cp2:in std_logic; --262kHz的时钟频率CP2
tone:in integer range 0 to 511; --相应音符的计数初值的范围
spk:out std_logic --输出的驱动蜂鸣器发声的频率
);
end speaker;
architecture four of speaker is
signal spk1:std_logic; --数控分频器得到的相应的脉冲
begin
four_p1:process(cp2,tone)
variable count1:integer range 0 to 511;
begin
if tone=0 then
elsif cp2'event and cp2='1' then --如果cp2处于上升沿
if count1=511 then --如果是休止符,则spk1始终为1
count1:=tone;
spk1<='1';
else
count1:=count1+1;
spk1<='0';
end if;
end if;
end process four_p1;
four_p2: process(spk1)
variable count2:std_logic;
begin
if spk1'event and spk1='1' then --由于spk1脉冲占空比过小,需再进行2分频使之变为占
count2:=not count2; --空比为50%的脉冲,使扬声器有足够功率发声
if count2='1' then --即碰到了休止符
spk<='1';
else
spk<='0';
end if;
end if;
end process four_p2;
end four;
4系统调试
4.1 系统仿真调试
系统的gdf文件如下:
图4-1 音乐播放器模块功能图
系统的仿真波形图如下:
spk=1时代表遇到休止符,spk=0是是非休止符。

high=1时,表示是高音,此时所接的引脚为发光二极管发光。

4.2 系统实际验证
实际运行时,进行如下的引脚分配:
4.3 调试程序遇到的问题及解决方法
1、一开始我们在地址发生器模块没有加休止符,播放出来的音乐听起来很奇怪,后来我们在乐谱中适当的位置添加了休止符,设置休止符的频率为131072HZ,分频系数为1,预置数(计数初值)=512-1=511。

2、在模块化调试过程中,一开始实体名和文件名没有一致导致编译错误,后来把实体名和模块名改成一致的了。

5 总结与体会心得
本次实验的时间有点紧,要用从没有接触过的硬件设计语言设计一个系统,虽然在数字逻辑电路中先知道有VHDL语言,但对于它的语法还是不了解。

通过这次的实验,我更加了解了自顶向下和模块化的设计方法,学会了用硬件电路
描述语言来设计系统。

VHDL作为电路设计语言的方便性,具有很强的硬件描述能力,很强的移植能力,减少硬件电路设计的工作量,缩短了开发周期,同时也省去了电路连线的工作,方便我们更快的查找错误。

这次的实验锻炼了我的动手能力和团队合作能力。

6参考文献
[1] 南京理工大学. EDA设计实验指导书[M]. 南京: 南京理工大学电子技术中心, 2008.
[2] 朱正伟. EDA 技术及应用[M]. 北京: 清华大学出版社, 2005.
[3] 潘松,黄继业.EDA技术与VHDL(第4版)[M]. 北京: 清华大学出版社, 2005.。

相关文档
最新文档