西南科技大学FPGA实验报告四2015
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(!reset) counter <= 2'b000; else if(counter == 4)//分频预置数4,实际上的频率是12.5MHZ
counter <= 2'b00; else counter <= counter + 1'b1; always @ (posedge clk_50M or negedge reset) if(!reset) clk_12MHZ <= 1'b0; else begin if(counter ==2'b11)
西南科技大学 实验报告
课程名称: 实验名称:
姓 名: 学 号: 班 级: 指导教师:
FPGA 硬件电子琴电路设计
2012 电子12
西南科技大学信息工程学院制
实验题目
1、 实验原理
主系统由3个模块组成,例1是顶层设计文件,其内部有三个功 能模块(如图1所示):Speakera.v(例4) 和ToneTaba.v (例3), NoteTabs.v (例2)。
.Index(Index), .Code(Code), .High(High), .Tone(Tone) ); initial begin Index = 0; #50; Index=1; #30; Index=2; #20; Index=3; #100; end endmodule 4、 顶层模块的例化,然后进行综合,布局布线,生成课执行文件.bit 文件,下载到板子上去。 顶层模块代码: module songer(clk_50M,reset,Code1,High1,Spkout); input clk_50M;//CLK=50MHZ input reset; output[3:0] Code1; output High1,Spkout;
3、 实验结果及分析
50MHZ分为12MHZ的代码:
module div_50_12(clk_50M,clk_12MHZ,reset); input clk_50M; input reset; output clk_12MHZ; reg [1:0] counter; reg clk_12MHZ; always @ (posedge clk_50M or negedge reset)
3、 ToneTaba模块的仿真与测试 仿真波形为:
分析:可知当index=0001时,tone=1403d=01100000101b,符合要求, 正确 测试代码:module TestToneTaba;
reg [3:0] Index; wire [3:0] Code; wire High; wire [10:0] Tone; ToneTaba uut (
的’5’。 附:仿真的test fixture文件 module test_NoteTabs;
reg Clk; wire [3:0] ToneIndex; NoteTabs uut (
.Clk(Clk), .ToneIndex(ToneIndex) ); initial begin
Clk = 0; forever #10 Clk=~Clk;//因为时钟是50MHZ,所以 1/2T=10ns end initial #1000 $stop; endmodule
增加一个NoteTabs模块用于产生节拍控制(Index数据存留时 间)和音阶选择信号,即在NoteTabs模块放置一个乐曲曲谱真值表, 由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数 时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲 自动演奏电路。
2、 实验步骤
分四步 1、 将待播放的《梁祝》音乐音符存入ROM:建立一个.txt的文本文 件,将梁祝的音乐音乐音符数据写入,再将后缀名改为.coe文件。 建立一个IP core,名为MUSIC.将MUSIC.core添加到IP core中。 2、 建立一个NoteTabs.V文件,从Music.v的ROM(只读存储器)读取数 据,进行节拍控制,和音阶选择。经过仿真无误后进行下一步。 3、 建立 div_50_12 module,将50MHZ的时钟频率转化成12.5MHZ近似 为12MHZ。 4、 建立 div_50_4 module,对50MHZ的时钟频率分频成4HZ。 5、 建立ToneTaba module,获得该音阶的分频预置值,音阶简谱的显示 数码,音阶高8度显示。 6、建立 Speakera module,获得分频预置值,对端口Clk12MHZ输入的 频率进行分频,之后由Spkout向扬声器输出发声。
wire[10:0] Tone;
Hale Waihona Puke Baidu
wire[3:0] ToneIndex;
wire
clk_4HZ,clk_12M;
NoteTabs u0( .Clk(clk_4HZ),
.ToneIndex(ToneIndex) );
ToneTaba u1( .Index(ToneIndex),
.Code(Code1),
endmodule
4、 实验思考题解答(实验指导书要求的思考题)
1、答:输出的频率要在扬声器的工作频率范围内,输出的电流要能够
直接驱动扬声器的正常工作
2、答:将存储音符的ROM里面的内容改变,将notetabs里面的读取乐符
数改变
5、 体会
这是我第一次的实验成功,主要归结于自己平时下课后不停的摸索,预
习。学会了自己编写激励文件,改变了原始的画波形方式。
对于实验的波形观察也有了深刻的理解,但是我们所有的模块都是用的
always语句,可以尝试一下用其他的语句实现同样的功能,增加我们对
于语言使用的灵活性。
.High(High1),
.Tone(Tone) );
Speakera u2( .Clk(clk_12M),
.Tone(Tone),
.SpkS(Spkout) );
div_50_12 u3(clk_50M,clk_12M,reset);
div_50_4HZ u4(clk_50M,clk_4HZ,reset);
clk_12MHZ <= 1'b1; else
clk_12MHZ <= 1'b0; end Endmodule 仿真波形:
分析:频率近似为12分频,因为在always中同一个变量counter的指不 能被赋值两次,否则容易引起竞争冒险等问题。 2、NoteTabs模块的测试,仿真波形如图所示:
分析:因为梁祝音乐中写入的开头有1拍的‘3’,又因为是以1/4拍的 形式存放在ROM里的,所以NoteTabs是4个1/4拍的’3’。3/4拍
模块ToneTaba是音阶发生器,当8位发声控制输入Index中某一 位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得 该音阶的分频预置值;同时由Code输出对应该音阶简谱的显示数码, 如‘5’,并由High输出指示音阶高8度显示。
模块Speakera中的主要电路是一个数控分频器,它由一个初值 可预置的加法计数器构成,当模块Speakera由端口Tone获得一个2进 制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率 进行分频,之后由Spkout向扬声器输出发声。
counter <= 2'b00; else counter <= counter + 1'b1; always @ (posedge clk_50M or negedge reset) if(!reset) clk_12MHZ <= 1'b0; else begin if(counter ==2'b11)
西南科技大学 实验报告
课程名称: 实验名称:
姓 名: 学 号: 班 级: 指导教师:
FPGA 硬件电子琴电路设计
2012 电子12
西南科技大学信息工程学院制
实验题目
1、 实验原理
主系统由3个模块组成,例1是顶层设计文件,其内部有三个功 能模块(如图1所示):Speakera.v(例4) 和ToneTaba.v (例3), NoteTabs.v (例2)。
.Index(Index), .Code(Code), .High(High), .Tone(Tone) ); initial begin Index = 0; #50; Index=1; #30; Index=2; #20; Index=3; #100; end endmodule 4、 顶层模块的例化,然后进行综合,布局布线,生成课执行文件.bit 文件,下载到板子上去。 顶层模块代码: module songer(clk_50M,reset,Code1,High1,Spkout); input clk_50M;//CLK=50MHZ input reset; output[3:0] Code1; output High1,Spkout;
3、 实验结果及分析
50MHZ分为12MHZ的代码:
module div_50_12(clk_50M,clk_12MHZ,reset); input clk_50M; input reset; output clk_12MHZ; reg [1:0] counter; reg clk_12MHZ; always @ (posedge clk_50M or negedge reset)
3、 ToneTaba模块的仿真与测试 仿真波形为:
分析:可知当index=0001时,tone=1403d=01100000101b,符合要求, 正确 测试代码:module TestToneTaba;
reg [3:0] Index; wire [3:0] Code; wire High; wire [10:0] Tone; ToneTaba uut (
的’5’。 附:仿真的test fixture文件 module test_NoteTabs;
reg Clk; wire [3:0] ToneIndex; NoteTabs uut (
.Clk(Clk), .ToneIndex(ToneIndex) ); initial begin
Clk = 0; forever #10 Clk=~Clk;//因为时钟是50MHZ,所以 1/2T=10ns end initial #1000 $stop; endmodule
增加一个NoteTabs模块用于产生节拍控制(Index数据存留时 间)和音阶选择信号,即在NoteTabs模块放置一个乐曲曲谱真值表, 由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数 时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲 自动演奏电路。
2、 实验步骤
分四步 1、 将待播放的《梁祝》音乐音符存入ROM:建立一个.txt的文本文 件,将梁祝的音乐音乐音符数据写入,再将后缀名改为.coe文件。 建立一个IP core,名为MUSIC.将MUSIC.core添加到IP core中。 2、 建立一个NoteTabs.V文件,从Music.v的ROM(只读存储器)读取数 据,进行节拍控制,和音阶选择。经过仿真无误后进行下一步。 3、 建立 div_50_12 module,将50MHZ的时钟频率转化成12.5MHZ近似 为12MHZ。 4、 建立 div_50_4 module,对50MHZ的时钟频率分频成4HZ。 5、 建立ToneTaba module,获得该音阶的分频预置值,音阶简谱的显示 数码,音阶高8度显示。 6、建立 Speakera module,获得分频预置值,对端口Clk12MHZ输入的 频率进行分频,之后由Spkout向扬声器输出发声。
wire[10:0] Tone;
Hale Waihona Puke Baidu
wire[3:0] ToneIndex;
wire
clk_4HZ,clk_12M;
NoteTabs u0( .Clk(clk_4HZ),
.ToneIndex(ToneIndex) );
ToneTaba u1( .Index(ToneIndex),
.Code(Code1),
endmodule
4、 实验思考题解答(实验指导书要求的思考题)
1、答:输出的频率要在扬声器的工作频率范围内,输出的电流要能够
直接驱动扬声器的正常工作
2、答:将存储音符的ROM里面的内容改变,将notetabs里面的读取乐符
数改变
5、 体会
这是我第一次的实验成功,主要归结于自己平时下课后不停的摸索,预
习。学会了自己编写激励文件,改变了原始的画波形方式。
对于实验的波形观察也有了深刻的理解,但是我们所有的模块都是用的
always语句,可以尝试一下用其他的语句实现同样的功能,增加我们对
于语言使用的灵活性。
.High(High1),
.Tone(Tone) );
Speakera u2( .Clk(clk_12M),
.Tone(Tone),
.SpkS(Spkout) );
div_50_12 u3(clk_50M,clk_12M,reset);
div_50_4HZ u4(clk_50M,clk_4HZ,reset);
clk_12MHZ <= 1'b1; else
clk_12MHZ <= 1'b0; end Endmodule 仿真波形:
分析:频率近似为12分频,因为在always中同一个变量counter的指不 能被赋值两次,否则容易引起竞争冒险等问题。 2、NoteTabs模块的测试,仿真波形如图所示:
分析:因为梁祝音乐中写入的开头有1拍的‘3’,又因为是以1/4拍的 形式存放在ROM里的,所以NoteTabs是4个1/4拍的’3’。3/4拍
模块ToneTaba是音阶发生器,当8位发声控制输入Index中某一 位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得 该音阶的分频预置值;同时由Code输出对应该音阶简谱的显示数码, 如‘5’,并由High输出指示音阶高8度显示。
模块Speakera中的主要电路是一个数控分频器,它由一个初值 可预置的加法计数器构成,当模块Speakera由端口Tone获得一个2进 制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率 进行分频,之后由Spkout向扬声器输出发声。