2024年2月20日发(作者:索晟睿)
本科学生设计性实验报告
项目组长 学号
成 员 无
专 业 通信工程___ 班级 101
实验项目名称VGA图片(动态)显示与乐曲硬件演奏电路设计
指导教师及职称
开课学期 2012 至 2013 学年 第二 学期
上课时间 2013 年 05 月 05 日
一、实验设计方案
实验名称:乐曲硬件演奏电路设计与VGA图片(动实验时间:20130505
态)显示
小组合作: 是○ 否○ 小组成员:
实验目的和要求
1.学习利用数控分频器设计硬件乐曲演奏电路
2.掌握模块化和层次化的设计方法以及音符编码的设计思想
3. 学习VGA图像显示控制电路设计
4.根据VGA的工作时序,然后完成VGA图片动态显示。
5.熟悉和掌握基于ROM的VGA显示原理以及ROM的使用方法。
1、实验场地及仪器、设备和材料:
PC计算机,Quartus II 9.0软件,EDA/SOPC实验箱
2、实验思路(实验内容、数据处理方法及实验步骤等):
一.VGA图片(动态)显示
1.实验原理:VGA工业标准显示模式要求,行同步,场同步都为负极性,即同步脉冲要求是负脉冲。设计VGA图像显示控制要注意两个问题:一个是时序驱动,这是完成设计的关键,时序有偏差,显示必然不正常;另一个是VGA显示信号电平驱动
我选的是800X600时钟为40MHZ的工业标准显示模式。
所以我的相应的时序控制的程序如下:
module vga(clk,hs,vs,r,g,b,rgbin,dout);
input clk;
output hs,vs;
output r,g,b;
input [2:0] rgbin;
output[14:0] dout;
reg [10:0] hcnt;
reg[9:0] vcnt;
reg r,g,b;
reg hs,vs;
assign dout={vcnt[6:0],hcnt[6:0]};
always @(posedge clk) begin
if(hcnt<1056) hcnt<=hcnt+1;
else hcnt<={11{1'b0}};end
always @(posedge clk) begin
if(hcnt==825)begin
if(vcnt<628) vcnt<=vcnt+1;
else vcnt<={10{1'b0}};end
end
always @(posedge clk) begin
if((hcnt>=840)&(hcnt<=968))
hs<=1'b0;
else hs<=1'b1;end
always @(vcnt) begin
if((vcnt>=601)&(vcnt<=605))
vs<=1'b0;else vs<=1'b1;end
always @(posedge clk) begin
if(hcnt<800&vcnt<600)
begin r<=rgbin[2];g<=rgbin[1];b<=rgbin[0];end
else begin r<=1'b0;g<=1'b0;b<=1'b0;end end
endmodule
2. 基于ROM的VGA显示原理
(1)ROM的原理及使用
Altera的器件内部提供了各种存储器模块(RAM、ROM或双口RAM),可以在设计中使用MegaWizard Plug-In Manager,执行【Tools】|【MegaWizard Plug-In Manager】菜单命令来创建所需要的存储器模块。也可以使用Altera提供的宏功能模块LPM_ROM来创建存储器模块。
每个ROM模块有CLOCK(时钟)、address(地址)这两个输入信号和一个q(值)输出信号。ROM在每个时钟上升沿取出由地址信号所指定的存储单元中的值并输出。ROM内的值通过加载MIF(Memory Initialization File,存储器初始化文件)文件来实现。
(2)如何生成MIF文件:
如果已经有BMP格式的图片,则可以使用我们提供的BmpToMif这个软件,从现有的BMP格式图片生成MIF文件。其使用非常简单,注意要适当调整原图片的大小,这可以通过各种图形编辑软件修改,如Windows自带的画图程序、Photoshop等。
BmpToMif软件的功能有:
① 将bmp图片转为mif文件:将黑白图片转换为单色mif文件;将彩色图片转换为三色mif文件。
② 将二进制文件转为mif文件,如将中英文点阵字库转换为mif文件。
3.实验过程:
(1)时序控制子模块vga的设计:
功能:根据VGA显示器的工作原理,提供同步信号和像素位置信息,以及寻址ROM的地址信号。
程序代码如下:
module vga(clk,hs,vs,r,g,b,rgbin,dout);
input clk;
output hs,vs;
output r,g,b;
input [2:0] rgbin;
output[14:0] dout;
reg [10:0] hcnt;
reg[9:0] vcnt;
reg r,g,b;
reg hs,vs;
assign dout={vcnt[6:0],hcnt[6:0]};
always @(posedge clk) begin
if(hcnt<1056) hcnt<=hcnt+1;
else hcnt<={11{1'b0}};end
always @(posedge clk) begin
if(hcnt==825)begin
if(vcnt<628) vcnt<=vcnt+1;
else vcnt<={10{1'b0}};end
end
always @(posedge clk) begin
if((hcnt>=840)&(hcnt<=968))
hs<=1'b0;
else hs<=1'b1;end
always @(vcnt) begin
if((vcnt>=601)&(vcnt<=605))
vs<=1'b0;else vs<=1'b1;end
always @(posedge clk) begin
if(hcnt<800&vcnt<600)
begin r<=rgbin[2];g<=rgbin[1];b<=rgbin[0];end
else begin r<=1'b0;g<=1'b0;b<=1'b0;end end
endmodule
注解:本模块是时序控制也就是行与场信号的同步与消隐的问题;还有映射出rom的存储地址并取出相应的图片信号来显示;
(2)使用MegaWizard Plug-In Manager创建存储RGB值的ROM模块:
把字长设为32768words也就是128X128的图像,并把相应的mif文件加入进去就可以了;
(3)实现动画显示:
动画的本质就是多个静态画面的切换。动画利用了人眼的视觉暂留效应,连续播放内容连续的静止图片而给人以活动的感觉。当一系列形成图像的画面按一定的速度在人的视线中经过时,人脑便会产生物体运动的印象,即产生动画的效果。
实现简单的动画显示的原理是采用一套扫描和输出信号,并通过多路选择器使能多个ROM,这样就可以在多个画面中反复切换,形成动画。
在这里ROM图像集有两个(图像大小为128×128),如图2. 14所示。动态显示控制逻辑由多路选择器和分频器组成。地址转换函数整合在vga中并分别创建tupian和rtupian两个ROM模块,用来分别存储两幅图像和的颜色值,存储器字数为128×128=2×2=16384,字长为3。它们对应的MIF文件分别为和。
77与
两幅图画显示的时间间隔是1S,由于时钟频率是40MHZ所以要进行40M分频因为这个分频器产
生的信号是用来控制多路选择器的所以要是方波(这里程序的占空比是1:1)分频程序如下:
module clk1s(clk,clk1s);
input clk;
reg [26:0] q;
output clk1s;
reg clk1s;
always @(posedge clk)
if (q==40000000) q<=0;
else q<=q+1;
always @(posedge clk)
if(q==40000000) clk1s=~clk1s;
endmodule
用元件库来建立多路选择器:
两个ROM模块的输出分别接至多路选择器的输入,使用上面的分频子模块产生周期为2s的输出时钟信号,来选择两个通路,即两幅图像以2s的周期轮换显示。多路选择器可以使用Quartus Ⅱ提供的参数化多路选择器LPM_MUX。
(4)创建顶层图形文件如图:
(5)配置引脚:
(6)下载到试验箱
二.乐曲硬件演奏电路设计
① 先用quartusII 建立相应的演奏的歌曲的mif文件: 这要注意乐谱上的某个音的停留时间以及相应的音符,然后在查F_CODE模块中的对应的音符音准表。
② 用quartusII生成相应的满足要求的锁相环与存演奏文件的rom
③ 这里要特别提醒一定要注意相应模块的输入的时钟频率,因为时钟频率不对就不可能产生准确的音符。
④ 并编写如下程序:
并把这些程序生成相应的模块图
module FP16(CLK,Q);
output [3:0] Q;
input CLK;
reg [3:0] Q1;
always @(posedge CLK)
begin Q1<=Q1+1;
end
assign Q=Q1;
endmodule
module FP2(CLK,Q);
output Q;
input CLK;
reg Q1;
always @(posedge CLK)
begin Q1<=Q1+1;
end
assign Q=Q1;
endmodule
module CNT138T (CLK,CNT8);
input CLK; output [7:0] CNT8; reg[7:0] CNT; wire LD;
always @(posedge CLK or posedge LD) begin
if (LD) CNT<=8'b00000000; else CNT<=CNT+1; end
assign CNT8=CNT; assign LD=(CNT==138);
endmodule
module F_CODE (INX,CODE,H,TO);
input [3:0] INX; output [3:0] CODE; output H; output [10:0] TO;
reg [10:0] TO; reg [3:0] CODE; reg H;
always @(INX) begin
case (INX)
0:begin TO<=11'H7FF;CODE<=0;H<=0;end
1:begin TO<=11'H305;CODE<=1;H<=0;end
2:begin TO<=11'H390;CODE<=2;H<=0;end
3:begin TO<=11'H40C;CODE<=3;H<=0;end
4:begin TO<=11'H45C;CODE<=4;H<=0;end
5:begin TO<=11'H4AD;CODE<=5;H<=0;end
6:begin TO<=11'H50A;CODE<=6;H<=0;end
7:begin TO<=11'H55C;CODE<=7;H<=0;end
8:begin TO<=11'H582;CODE<=1;H<=1;end
9:begin TO<=11'H5C8;CODE<=2;H<=1;end
10:begin TO<=11'H606;CODE<=3;H<=1;end
11:begin TO<=11'H640;CODE<=4;H<=1;end
12:begin TO<=11'H656;CODE<=5;H<=1;end
13:begin TO<=11'H684;CODE<=6;H<=1;end
14:begin TO<=11'H69A;CODE<=7;H<=1;end
15:begin TO<=11'H6C0;CODE<=1;H<=1;end
default : begin TO<=11'H6C0; CODE<=1; H<=1; end
endcase end endmodule
module SPKER(CLK,TN,SPKS);
input CLK; input [10:0] TN; output SPKS;
reg SPKS; reg [10:0] CNT11;
always @(posedge CLK) begin :CNT11B_LOAD
if(CNT11==11'H7FF) begin CNT11=TN; SPKS<=1'B1; end
else begin CNT11=CNT11+1; SPKS<=1'b0; end end
endmodule
module FDIV(CLK,PM);
input CLK; output PM;
reg [8:0] Q1; reg FULL; wire RST;
always @(posedge CLK or posedge RST) begin
if(RST) begin Q1<=0; FULL<=1; end
else begin Q1<=Q1+1;FULL<=0;end end
assign RST=(Q1==499); assign PM=FULL; assign DOUT=Q1;
endmodule
⑤ 连接好各模块如下所示:⑥
在按照需求配上相应的引脚
指导老师对实验设计方案的意见:
指导老师签名: 年 月 日
二、实验结果与分析
1、实验目的、场地及仪器、设备和材料、实验思路等见实验设计方案
2、实验现象、数据及结果
VGA会有图片(动态)显示,但是它的图片会重复显示满整个频幕,所以我们应该要改进它;
音乐演奏会发出相应的歌曲,并没有什么异常。
3、对实验现象、数据及观察结果的分析与讨论:
这些实验现象都是非常合理的。
4、结论:
VGA图片(动态)显示,是通过在两个图片存储的ROM中每隔固定的时间来选通相应的图片输出地址与相应的图片信息,然后显示在频幕上。所以我们要在静态显示图片的基础上再加一个rom或者更多的rom然后通过多路选择器(两路或者多路)选择哪个rom的信息通过;在控制时间时我们要设置一个分频器(这里要是方波)来是多路选择器改变选通信息。
乐曲硬件演奏电路,是通过一定频率的矩形波通过扬声器可以发出相应频率的声音,乐曲是由一系列的音符组成的。所以,如果我们通过控制每个音符的发音频率值及其持续的时间,就可以以纯硬件的手段,利用这些数值来实现所希望演奏的乐曲。在这个实验中要注意自己设计的相应模块的输入时钟频率
5、实验总结
⑴本次实验成败之处及其原因分析:VGA图片动态显示要特别注意的是时序控制也就是模块vga要特别注意,如果它没设定好,图片的信息就会显示不正确;乐曲硬件演奏电路的各部分的频率输入要控制好,不然声音就会变得不对。
⑵本实验的关键环节及改进措施:
VGA图片(动态)显示使其在频幕中间显示单张图像动态显示而不是重复的多张来回显示,因此我们只要把时序控制模块的vga程序相应的改变一下
module vga(clk,hs,vs,r,g,b,rgbin,dout);
input clk;
output hs,vs;
output r,g,b;
input [2:0] rgbin;
output[15:0] dout;
reg[15:0] dout;
reg [10:0] hcnt;
reg[9:0] vcnt;
reg r,g,b;
reg hs,vs;
always @ (posedge clk )
Begin//这里是更改的程序处,而这里并不是使其不输出地址信号而是让他始终输出该图片地址0
//的图片信息,所以如果要效果更佳,我们可以把相应图片的mif文件的地址0改成黑色也就是rgb信
//息为000;
if((hcnt>=271 & hcnt<=399)&(vcnt>=171 & vcnt<=299))
dout<=(vcnt-171) *128 +(hcnt-271);
else dout<=0;
end
always @(posedge clk) begin
if(hcnt<1040) hcnt<=hcnt+1;
else hcnt<={11{1'b0}};end
always @(posedge clk) begin
if(hcnt==853)begin
if(vcnt<666) vcnt<=vcnt+1;
else vcnt<={11{1'b0}};end
end
always @(posedge clk) begin
if((hcnt>=853)&(hcnt<=973))
hs<=1'b0;
else hs<=1'b1;end
always @(vcnt) begin
if((vcnt>=635)&(vcnt<=641))
vs<=1'b0;else vs<=1'b1;end
always @(posedge clk) begin
if((hcnt<800)&(vcnt<600))
begin r<=rgbin[2];g<=rgbin[1];b<=rgbin[0];end
else begin r<=1'b0;g<=1'b0;b<=1'b0;end end
endmodule
②若重做本实验,为实现预期效果,仪器操作和实验步骤应如何改善:
a. 看懂vga时序控制的那段程序是非常重要的,只要理解了那段程序的意思,整个程序也就基本上理解了,其他的模块就是按照步骤操作就行了。
b. 看懂F_CODE的作用,可以帮我们快速理解这个程序。这个模块是音符的预置数,决定了音准。所以在制作某个歌曲的曲谱时就是按照这个来弄,选择音符并根据持续时间来做mif曲谱。
⑶对实验的自我评价:
通过认真的学习和查阅相关的资料,了解了这两个程序的意义和相应的每个模块所要达到的目的。所以很好的完成了这个实验。
指导老师评语及得分:
签名: 年 月 日
2024年2月20日发(作者:索晟睿)
本科学生设计性实验报告
项目组长 学号
成 员 无
专 业 通信工程___ 班级 101
实验项目名称VGA图片(动态)显示与乐曲硬件演奏电路设计
指导教师及职称
开课学期 2012 至 2013 学年 第二 学期
上课时间 2013 年 05 月 05 日
一、实验设计方案
实验名称:乐曲硬件演奏电路设计与VGA图片(动实验时间:20130505
态)显示
小组合作: 是○ 否○ 小组成员:
实验目的和要求
1.学习利用数控分频器设计硬件乐曲演奏电路
2.掌握模块化和层次化的设计方法以及音符编码的设计思想
3. 学习VGA图像显示控制电路设计
4.根据VGA的工作时序,然后完成VGA图片动态显示。
5.熟悉和掌握基于ROM的VGA显示原理以及ROM的使用方法。
1、实验场地及仪器、设备和材料:
PC计算机,Quartus II 9.0软件,EDA/SOPC实验箱
2、实验思路(实验内容、数据处理方法及实验步骤等):
一.VGA图片(动态)显示
1.实验原理:VGA工业标准显示模式要求,行同步,场同步都为负极性,即同步脉冲要求是负脉冲。设计VGA图像显示控制要注意两个问题:一个是时序驱动,这是完成设计的关键,时序有偏差,显示必然不正常;另一个是VGA显示信号电平驱动
我选的是800X600时钟为40MHZ的工业标准显示模式。
所以我的相应的时序控制的程序如下:
module vga(clk,hs,vs,r,g,b,rgbin,dout);
input clk;
output hs,vs;
output r,g,b;
input [2:0] rgbin;
output[14:0] dout;
reg [10:0] hcnt;
reg[9:0] vcnt;
reg r,g,b;
reg hs,vs;
assign dout={vcnt[6:0],hcnt[6:0]};
always @(posedge clk) begin
if(hcnt<1056) hcnt<=hcnt+1;
else hcnt<={11{1'b0}};end
always @(posedge clk) begin
if(hcnt==825)begin
if(vcnt<628) vcnt<=vcnt+1;
else vcnt<={10{1'b0}};end
end
always @(posedge clk) begin
if((hcnt>=840)&(hcnt<=968))
hs<=1'b0;
else hs<=1'b1;end
always @(vcnt) begin
if((vcnt>=601)&(vcnt<=605))
vs<=1'b0;else vs<=1'b1;end
always @(posedge clk) begin
if(hcnt<800&vcnt<600)
begin r<=rgbin[2];g<=rgbin[1];b<=rgbin[0];end
else begin r<=1'b0;g<=1'b0;b<=1'b0;end end
endmodule
2. 基于ROM的VGA显示原理
(1)ROM的原理及使用
Altera的器件内部提供了各种存储器模块(RAM、ROM或双口RAM),可以在设计中使用MegaWizard Plug-In Manager,执行【Tools】|【MegaWizard Plug-In Manager】菜单命令来创建所需要的存储器模块。也可以使用Altera提供的宏功能模块LPM_ROM来创建存储器模块。
每个ROM模块有CLOCK(时钟)、address(地址)这两个输入信号和一个q(值)输出信号。ROM在每个时钟上升沿取出由地址信号所指定的存储单元中的值并输出。ROM内的值通过加载MIF(Memory Initialization File,存储器初始化文件)文件来实现。
(2)如何生成MIF文件:
如果已经有BMP格式的图片,则可以使用我们提供的BmpToMif这个软件,从现有的BMP格式图片生成MIF文件。其使用非常简单,注意要适当调整原图片的大小,这可以通过各种图形编辑软件修改,如Windows自带的画图程序、Photoshop等。
BmpToMif软件的功能有:
① 将bmp图片转为mif文件:将黑白图片转换为单色mif文件;将彩色图片转换为三色mif文件。
② 将二进制文件转为mif文件,如将中英文点阵字库转换为mif文件。
3.实验过程:
(1)时序控制子模块vga的设计:
功能:根据VGA显示器的工作原理,提供同步信号和像素位置信息,以及寻址ROM的地址信号。
程序代码如下:
module vga(clk,hs,vs,r,g,b,rgbin,dout);
input clk;
output hs,vs;
output r,g,b;
input [2:0] rgbin;
output[14:0] dout;
reg [10:0] hcnt;
reg[9:0] vcnt;
reg r,g,b;
reg hs,vs;
assign dout={vcnt[6:0],hcnt[6:0]};
always @(posedge clk) begin
if(hcnt<1056) hcnt<=hcnt+1;
else hcnt<={11{1'b0}};end
always @(posedge clk) begin
if(hcnt==825)begin
if(vcnt<628) vcnt<=vcnt+1;
else vcnt<={10{1'b0}};end
end
always @(posedge clk) begin
if((hcnt>=840)&(hcnt<=968))
hs<=1'b0;
else hs<=1'b1;end
always @(vcnt) begin
if((vcnt>=601)&(vcnt<=605))
vs<=1'b0;else vs<=1'b1;end
always @(posedge clk) begin
if(hcnt<800&vcnt<600)
begin r<=rgbin[2];g<=rgbin[1];b<=rgbin[0];end
else begin r<=1'b0;g<=1'b0;b<=1'b0;end end
endmodule
注解:本模块是时序控制也就是行与场信号的同步与消隐的问题;还有映射出rom的存储地址并取出相应的图片信号来显示;
(2)使用MegaWizard Plug-In Manager创建存储RGB值的ROM模块:
把字长设为32768words也就是128X128的图像,并把相应的mif文件加入进去就可以了;
(3)实现动画显示:
动画的本质就是多个静态画面的切换。动画利用了人眼的视觉暂留效应,连续播放内容连续的静止图片而给人以活动的感觉。当一系列形成图像的画面按一定的速度在人的视线中经过时,人脑便会产生物体运动的印象,即产生动画的效果。
实现简单的动画显示的原理是采用一套扫描和输出信号,并通过多路选择器使能多个ROM,这样就可以在多个画面中反复切换,形成动画。
在这里ROM图像集有两个(图像大小为128×128),如图2. 14所示。动态显示控制逻辑由多路选择器和分频器组成。地址转换函数整合在vga中并分别创建tupian和rtupian两个ROM模块,用来分别存储两幅图像和的颜色值,存储器字数为128×128=2×2=16384,字长为3。它们对应的MIF文件分别为和。
77与
两幅图画显示的时间间隔是1S,由于时钟频率是40MHZ所以要进行40M分频因为这个分频器产
生的信号是用来控制多路选择器的所以要是方波(这里程序的占空比是1:1)分频程序如下:
module clk1s(clk,clk1s);
input clk;
reg [26:0] q;
output clk1s;
reg clk1s;
always @(posedge clk)
if (q==40000000) q<=0;
else q<=q+1;
always @(posedge clk)
if(q==40000000) clk1s=~clk1s;
endmodule
用元件库来建立多路选择器:
两个ROM模块的输出分别接至多路选择器的输入,使用上面的分频子模块产生周期为2s的输出时钟信号,来选择两个通路,即两幅图像以2s的周期轮换显示。多路选择器可以使用Quartus Ⅱ提供的参数化多路选择器LPM_MUX。
(4)创建顶层图形文件如图:
(5)配置引脚:
(6)下载到试验箱
二.乐曲硬件演奏电路设计
① 先用quartusII 建立相应的演奏的歌曲的mif文件: 这要注意乐谱上的某个音的停留时间以及相应的音符,然后在查F_CODE模块中的对应的音符音准表。
② 用quartusII生成相应的满足要求的锁相环与存演奏文件的rom
③ 这里要特别提醒一定要注意相应模块的输入的时钟频率,因为时钟频率不对就不可能产生准确的音符。
④ 并编写如下程序:
并把这些程序生成相应的模块图
module FP16(CLK,Q);
output [3:0] Q;
input CLK;
reg [3:0] Q1;
always @(posedge CLK)
begin Q1<=Q1+1;
end
assign Q=Q1;
endmodule
module FP2(CLK,Q);
output Q;
input CLK;
reg Q1;
always @(posedge CLK)
begin Q1<=Q1+1;
end
assign Q=Q1;
endmodule
module CNT138T (CLK,CNT8);
input CLK; output [7:0] CNT8; reg[7:0] CNT; wire LD;
always @(posedge CLK or posedge LD) begin
if (LD) CNT<=8'b00000000; else CNT<=CNT+1; end
assign CNT8=CNT; assign LD=(CNT==138);
endmodule
module F_CODE (INX,CODE,H,TO);
input [3:0] INX; output [3:0] CODE; output H; output [10:0] TO;
reg [10:0] TO; reg [3:0] CODE; reg H;
always @(INX) begin
case (INX)
0:begin TO<=11'H7FF;CODE<=0;H<=0;end
1:begin TO<=11'H305;CODE<=1;H<=0;end
2:begin TO<=11'H390;CODE<=2;H<=0;end
3:begin TO<=11'H40C;CODE<=3;H<=0;end
4:begin TO<=11'H45C;CODE<=4;H<=0;end
5:begin TO<=11'H4AD;CODE<=5;H<=0;end
6:begin TO<=11'H50A;CODE<=6;H<=0;end
7:begin TO<=11'H55C;CODE<=7;H<=0;end
8:begin TO<=11'H582;CODE<=1;H<=1;end
9:begin TO<=11'H5C8;CODE<=2;H<=1;end
10:begin TO<=11'H606;CODE<=3;H<=1;end
11:begin TO<=11'H640;CODE<=4;H<=1;end
12:begin TO<=11'H656;CODE<=5;H<=1;end
13:begin TO<=11'H684;CODE<=6;H<=1;end
14:begin TO<=11'H69A;CODE<=7;H<=1;end
15:begin TO<=11'H6C0;CODE<=1;H<=1;end
default : begin TO<=11'H6C0; CODE<=1; H<=1; end
endcase end endmodule
module SPKER(CLK,TN,SPKS);
input CLK; input [10:0] TN; output SPKS;
reg SPKS; reg [10:0] CNT11;
always @(posedge CLK) begin :CNT11B_LOAD
if(CNT11==11'H7FF) begin CNT11=TN; SPKS<=1'B1; end
else begin CNT11=CNT11+1; SPKS<=1'b0; end end
endmodule
module FDIV(CLK,PM);
input CLK; output PM;
reg [8:0] Q1; reg FULL; wire RST;
always @(posedge CLK or posedge RST) begin
if(RST) begin Q1<=0; FULL<=1; end
else begin Q1<=Q1+1;FULL<=0;end end
assign RST=(Q1==499); assign PM=FULL; assign DOUT=Q1;
endmodule
⑤ 连接好各模块如下所示:⑥
在按照需求配上相应的引脚
指导老师对实验设计方案的意见:
指导老师签名: 年 月 日
二、实验结果与分析
1、实验目的、场地及仪器、设备和材料、实验思路等见实验设计方案
2、实验现象、数据及结果
VGA会有图片(动态)显示,但是它的图片会重复显示满整个频幕,所以我们应该要改进它;
音乐演奏会发出相应的歌曲,并没有什么异常。
3、对实验现象、数据及观察结果的分析与讨论:
这些实验现象都是非常合理的。
4、结论:
VGA图片(动态)显示,是通过在两个图片存储的ROM中每隔固定的时间来选通相应的图片输出地址与相应的图片信息,然后显示在频幕上。所以我们要在静态显示图片的基础上再加一个rom或者更多的rom然后通过多路选择器(两路或者多路)选择哪个rom的信息通过;在控制时间时我们要设置一个分频器(这里要是方波)来是多路选择器改变选通信息。
乐曲硬件演奏电路,是通过一定频率的矩形波通过扬声器可以发出相应频率的声音,乐曲是由一系列的音符组成的。所以,如果我们通过控制每个音符的发音频率值及其持续的时间,就可以以纯硬件的手段,利用这些数值来实现所希望演奏的乐曲。在这个实验中要注意自己设计的相应模块的输入时钟频率
5、实验总结
⑴本次实验成败之处及其原因分析:VGA图片动态显示要特别注意的是时序控制也就是模块vga要特别注意,如果它没设定好,图片的信息就会显示不正确;乐曲硬件演奏电路的各部分的频率输入要控制好,不然声音就会变得不对。
⑵本实验的关键环节及改进措施:
VGA图片(动态)显示使其在频幕中间显示单张图像动态显示而不是重复的多张来回显示,因此我们只要把时序控制模块的vga程序相应的改变一下
module vga(clk,hs,vs,r,g,b,rgbin,dout);
input clk;
output hs,vs;
output r,g,b;
input [2:0] rgbin;
output[15:0] dout;
reg[15:0] dout;
reg [10:0] hcnt;
reg[9:0] vcnt;
reg r,g,b;
reg hs,vs;
always @ (posedge clk )
Begin//这里是更改的程序处,而这里并不是使其不输出地址信号而是让他始终输出该图片地址0
//的图片信息,所以如果要效果更佳,我们可以把相应图片的mif文件的地址0改成黑色也就是rgb信
//息为000;
if((hcnt>=271 & hcnt<=399)&(vcnt>=171 & vcnt<=299))
dout<=(vcnt-171) *128 +(hcnt-271);
else dout<=0;
end
always @(posedge clk) begin
if(hcnt<1040) hcnt<=hcnt+1;
else hcnt<={11{1'b0}};end
always @(posedge clk) begin
if(hcnt==853)begin
if(vcnt<666) vcnt<=vcnt+1;
else vcnt<={11{1'b0}};end
end
always @(posedge clk) begin
if((hcnt>=853)&(hcnt<=973))
hs<=1'b0;
else hs<=1'b1;end
always @(vcnt) begin
if((vcnt>=635)&(vcnt<=641))
vs<=1'b0;else vs<=1'b1;end
always @(posedge clk) begin
if((hcnt<800)&(vcnt<600))
begin r<=rgbin[2];g<=rgbin[1];b<=rgbin[0];end
else begin r<=1'b0;g<=1'b0;b<=1'b0;end end
endmodule
②若重做本实验,为实现预期效果,仪器操作和实验步骤应如何改善:
a. 看懂vga时序控制的那段程序是非常重要的,只要理解了那段程序的意思,整个程序也就基本上理解了,其他的模块就是按照步骤操作就行了。
b. 看懂F_CODE的作用,可以帮我们快速理解这个程序。这个模块是音符的预置数,决定了音准。所以在制作某个歌曲的曲谱时就是按照这个来弄,选择音符并根据持续时间来做mif曲谱。
⑶对实验的自我评价:
通过认真的学习和查阅相关的资料,了解了这两个程序的意义和相应的每个模块所要达到的目的。所以很好的完成了这个实验。
指导老师评语及得分:
签名: 年 月 日