EDA技术及应用实验报告参考答案docx.docx
《EDA技术及应用实验报告参考答案docx.docx》由会员分享,可在线阅读,更多相关《EDA技术及应用实验报告参考答案docx.docx(28页珍藏版)》请在冰点文库上搜索。
![EDA技术及应用实验报告参考答案docx.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/e284f200-e1cd-4c9c-8ab5-2555c251f268/e284f200-e1cd-4c9c-8ab5-2555c251f2681.gif)
EDA技术及应用实验报告参考答案docx
《EDA技术及应用》
实验报告
系部:
电子通信工程系
指导教师:
学号:
班级:
姓名:
实验一点亮LED设计
一、实验目的
通过此试验可以让大家逐步了解,熟悉和掌握FPGA开发软件QuartusII的使用方法及VerilogHDL的编程方法。
二、实验内容
本实验是一个简单的点亮LED灯的实验,具体包括:
1)使用QuartusII建立一个工程;
2)QuartusII工程设计;
3)设置编译选项并编译硬件系统;
4)下载硬件设计到目标FPGA;
5)观察LED的状态;
三、实验原理
和单片机一样,向片子里写进数据,输出高电平(对于共阴极的),
或者输出低电平(对于共阳极)。
根据Cyclone片子已经分配好的针
脚设置好针脚。
四、实验步骤
建立一个工程一输入程序一软件编译一生成下载文件一下载一调试
五、实验程序
//模块名Ied1
//定义输出端口
〃定义寄存器
//过程1
end
endmodule
六、思考题
(1)写出使用QuartusII软件开发工程的完整的流程。
建立一个工程一输入程序一软件编译综合一生成下载文件
下载一硬件调试
实验二流水灯实验
一、实验目的
通过此试验让大家进一步了解熟悉和掌握FPGA开发软件的使用方法及软件编程方法。
学习简单的时序电路的设计和硬件测试。
二、实验内容
本实验的内容是建立用于控制LED流水灯的简单硬件电路,要求在
SmartSOPC上实现LED1-LED8发光二极管流水灯的显示。
三、实验原理
这里的显示用分频模块(int_div)得到的较低的始终作为信号,在此
时钟下,对输入数据进行移位,就得到了流水灯的效果。
四、实验步骤
建立工程一输入源程序一调用模块一生成符号一调用符号一连成电
路图一编译一下载一调试
五、实验程序
原理图:
六、思考题
1.本实验顶层采用了图形输入的方式,若采用文本输入方式,如何编写顶层文件?
写出相应程序。
moduleled2(clock,led):
inputclock;
output[7:
0]led;
wirep;
int_divul(.clock(clock),,elkout(p)):
ledwateru2(.elk(p),.led(led));
endmodule
实验三键盘、LED发光实验
一、实验目的
本实验的主要目的是联系顶层模块的设计。
学习和体会分支条件语句case的使用及FPGA的I/O控制。
二、实验内容
用跳线把keyl-key8和指定的引脚连起来,以实现功能控制。
三、实验原理
FPGA的所有的I/O控制块允许每个引脚单独的配置为输入口。
只要配置正确,则一暗淡几个键中有键输入,在检测到键盘输入的情况下,
继续判断其键盘值并作出相应的处理。
四、实验步骤
1:
按以前的步骤建立工程,并按说明书进行配置引脚,未用的按三态
处理。
2:
对文件进行编译,并检错。
3:
按说明短接跳帽和连接跳线。
4:
观察输入情况。
五、实验程序
modulekeyled(key,led);
input[7:
0]key;
output[7:
0]led;
reg[7:
0]led_r;
reg[7:
0]buffer_r;
assignled二ledr;
always®(key)
begin
buffer_r=key;
case(buffer_r)
8'blllllllO:
ledr=
=8^11111110;
〃模块名keyled
〃定义键盘输入口
〃定义发光管输出口
〃定义寄存器
〃输出键值
〃过程1
〃读取键值
〃是键KEY1,则给寄存器赋值Oxfe
8'bllllll01:
led_r二
二8^11111100;
〃是键KEY2,
则给寄存器赋值Oxfc
8'blllll011:
led_r二
二8^11111000;
〃是键KEY3,
则给寄存器赋值0xf8
8fbllllOlll:
ledr-
=8^11110000;
〃是键KEY4,
则给寄存器赋值0xf0
8fblllOllll:
ledr-
=8^11100000;
〃是键KEY5,
则给寄存器赋值0xe0
8'bllOlllll:
ledr=
=8^11000000;
〃是键KEY6,
则给寄存器赋值0xc0
8'blOllllll:
ledr=
=8^10000000;
〃是键KEY7,
则给寄存器赋值0x80
8'bOlllllll:
ledr=
=8^00000000;
〃是键KEY8,
则给寄存器赋值0x00
default:
led_r=
二8^11111111;
〃否则给寄存器赋值Oxff
endcase
end
endmodule
六、思考题
1.能否用if语句改写本实验程序?
如果能,写出相应程序。
//模块名keyled
moduIekeyIed(key,Ied);
input[7:
0]key;
〃定义键盘输入口
output[7:
0]Ied;
〃定义发光管输出口
reg[7:
0]led_r;
〃定义寄存器
reg[7:
0]buffer_r;
assignled=led_r;
〃输出键值
always®(key)
//过程1
begin
buffer_r=key;
〃读取键值
if(buffer_r=8,b11111110)led_r二8*b11111110;
eIseif(buffer_r=8,b11111101)
led_r二8'b11111100;
elseif(buffer_r=8‘b11111011)
led_r二8'b11111000;
elseif(buffer_r==8,b11110111)
led_r=8*611110000;
elseif(buffer_r=8‘b11101111)
led_r二8'b11100000;
eIseif(buffer_r==8,b10111111)
led_r=8'b10000000;
else(buffer_r=8,b01111111)
led_r二8'bOOOOOOOO;
end
endmoduIe
实验四静态数码管显示实验
一、实验目的
学习LPM兆模块的调用。
二、实验内容
建立7段译码显示模块,用于控制LED数码管的静态显示。
要求在实验箱上的数码管依显示0—9和A-F16个字符。
三、实验原理
本实验通过分频模块int_div分频得到1HZ的频率信号,加载4位计数器的时钟输入端,计数循环输出0-9,A-F16个数,最后通过七段译码后在数码显示出来。
四、实验步骤
1:
立源程序文件decl7s.v,输入程序代码并保存,并对此生成符号。
2:
添加LPM模块并按需要生成相应的文件。
五、实验程序
六、思考题
1.本实验采用的是共阳极数码管,若采用共阴极数码管,有什么不
同?
对应显示相同的数时,输入的不同。
2.如何显示和PPPPPPPP?
H对应的89h,P对应的是73h;
实验五动态数码管显示实验
、实验目的学习动态扫描显示的原理图及电路的设计。
二、实验内容1:
在SmartSOPC试验箱上完成LED数码管的动态显示“1-8”个数字。
2:
放慢扫描速度演示动态显示的原理过程。
三、实验原理
虽然每次只有一个LED显示,但只要扫描显示速率够快,由于人的视觉余辉效应,使我们仍会感觉所有的数码管都在同时显示。
四、实验步骤1:
建立一个空白工程,并命名。
2:
对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更改,直至编译成功为止。
3:
从设计文件创建模块。
4:
将光盘中EDA目录文件拷贝到工程目录。
5:
添加常量兆功能模块。
五、实验程序
modulescan_led(clk_lk,d,dig,seg);
inputclk_lk;
input[31:
0]d;
output[7:
0]dig;
output[7:
0]seg;
reg[7:
0]seg_r;
reg[7:
0]dig_r;
reg[3:
0]disp_dat;
reg[2:
0]count;
assigndig=dig_r;
〃模块名scan_led
〃输入时钟
〃输入要显示的数据
//数码管选择输出引脚
〃数码管段输出引脚
〃定义数码管输出寄存器
〃定义数码管选择输出寄存器
〃定义显示数据寄存器
〃定义计数寄存器
〃输出数码管选择assignseg=seg_r;
always@(posedgeclk_lk)
begin
count<=count+1'bl;
end
always@(posedgeclk_lk)
begin
case(count)
3*d0:
disp_dat=d[31:
28];
3*dl:
disp_dat=d[27:
24];
3*d2:
disp_dat=d[23:
20];
3'd3:
disp_dat=d[19:
16];
3*d4:
disp_dat=d[15:
12];
3'd5:
disp_dat=d[ll:
8];
3*d6:
disp_dat=d[7:
4];
3'd7:
disp_dat=d[3:
0];
endcase
case(count)
3,d0:
dig_r=8,b01111111;
3,dl:
dig_r=8'bl0111111;
3,d2:
dig_r=8'bll011111;
3,d3:
dig_r=8,blll01111;
3,d4:
dig_r=8'bllll0111;
3,d5:
dig_r=8,blllll011;
3,d6:
dig_r=8,bllllll01;
3,d7:
dig_r=8'blllllll0;
endcase
end
always@(disp_dat)
begin
case(disp_dat)
4'h0:
seg_r=8*hc0;
4'hl:
seg_r=8*hf9;
4*h2:
seg_r=8*ha4;
4*h3:
seg_r=8*hb0;
//输出数码管译码结果
〃定义上升沿触发进程
〃选择扫描显示数据
〃第一个数码管
〃第二个数码管
//第三个数码管
//第四个数码管
〃第五个数码管
〃第六个数码管
//第七个数码管
〃第八个数码管
〃选择数码管显示位
〃选择第一个数码管显示
〃选择第二个数码管显示
〃选择第三个数码管显示
〃选择第四个数码管显示
〃选择第五个数码管显示
〃选择第六个数码管显示
〃选择第七个数码管显示
〃选择第八个数码管显示
〃七段译码
〃显示0
〃显示1
〃显示2
〃显示3
4'h4:
seg_r=8*h99;
〃显示4
4'h5:
seg_r=8'h92;
〃显示5
4'h6:
seg_r=8'h82;
〃显示6
4'h7:
seg_r=8'hf8;
〃显示7
4'h8:
seg_r=8'h80;
〃显示8
4'h9:
seg_r=8'h90;
〃显示9
4'ha:
seg_r=8'h88;
〃显示a
4'hb:
seg_r=8'h83;
〃显示b
4'hc:
seg_r=8'hc6;
〃显示C
4'hd:
seg_r=8*hal;
〃显示d
4'he:
seg_r=8'h86;
〃显示e
4'hf:
seg_r=8'h8e;
〃显示f
endcase
end
endmodule
六、思考题
1.说出数码管动态显示的原理。
每一位都是将8个发光二极管(下面简称LED)的负极接在一块,就有8个负极,接上8个10□,这个就是位选,相应I。
口输出低电平算是选通该位。
相同字段LED的正极连在一起,也有八根线,接上8个I。
口,这就是段选,相应10口输出高电平算是选通该段。
实验六按键去抖动实验
一、实验目的
学习按键去抖动电路的硬件设计。
二、实验内容
本实验的内容是建立按键消抖模块,对比有加消抖模块和没加消抖模块电路的区别。
三、实验原理作为机械开关的键盘,在按键操作时,机械触点的弹性及电压突跳等
原因,在触点或开启的瞬间会出现电压抖动。
四、实验步骤1:
启动QuartusII建立一个空白工程并命名。
2:
将电路用VerilogVHDL语言描述出来,并扩展多个通道。
3:
从设计文件创建模块,由debounce.v生成命名为debounce.vbsfo4:
其他步参考顶层模块原理图。
五、实验程序
〃按键消抖模块
moduledebounce(clk,key_in,key_out);
inputelk;
//系统时钟输入
〃按键消抖输出
assignkey_out=(doutlIdout2Idout3);
always@(posedgeelk)begin
doutl<=key_in;
dout2<=doutl;
dout3<=dout2;
endendmodule
六、思考题
always®(posedgeelk)begin
doutl<=key_in;//非阻塞赋值
dout2<=doutl;
dout3<=dout2;
end//其RTL描述为:
always©(posedgeelk)
begin
doutl=key_in;//阻塞赋值
dout2=doutl;
dout3=dout2;
end//其RTL描述为:
实验七硬件电子琴实验
I、实验目的
学习利用蜂鸣器和按键设计硬件电子琴。
二、实验内容
在SmartSOPC实验箱上的实现一个简单的电子琴。
三、实验原理
由于组成乐曲的每个音符的频率值及其持续时间是乐曲演奏的2个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。
四、实验步骤
1:
在QuartusII中建立一个工程项目文件,输入程序代码并保存。
2:
选择目标器件并对相应的引脚进行锁定。
3:
对该工程文件进行全程编译处理,若在编译过程中发现错误,则找
出并更改,直至编译成功为止。
4:
打开电源,执行下载命令。
五、实验程序
default:
count_end=16'hffff;
endcaseend
assignbeep=beep_r;
assignled=key_r;
endmodule
六、思考题
1.举例说明产生不同音符的原理。
由于组成乐曲的每个音符的频率值及其持续时间是乐曲演奏的2个基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。
频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率关系是对应的,只要求出对应的分频分数,这样利用程序可以很轻松的得到相应的乐声。
实验八数字时钟设计
一、实验目的
学习数字时钟的硬件设计。
二、实验内容
在SmartSOPC试验箱上完成一个可以计时的数字时钟,其显示时间
范围是00:
00:
00-23:
59:
59
三、实验原理
一个完整的时钟应由3部分组成,秒脉冲发生电路,计数显示部分和时钟调整部分。
本实验的校时电路在此仅仅完成了暂停,清零的基本功能。
四、实验步骤
1:
在QuartusII中建立一个工程项目文件。
2:
选择目标器件并对相应的引脚进行锁定。
3:
对该工程文件进行全程编译处理。
4:
硬件连接,下载程序。
五、实验程序
moduleclock(clk,key,dig,seg);
inputelk;
input[l:
O]key;
output[7:
0]dig;
output[7:
0]seg;
reg[7:
0]seg_r;
reg[7:
0]dig_r;
reg[3:
0]disp_dat;
reg[24:
0]count;
reg[23:
0]hour;
regsec,keyen;
reg[1:
0]dout1,dout2,dout3;
wire[l:
0]key_done;
assigndig=dig_r;
assignseg=seg_r;
〃秒信号产生部分
always@(posedgeelk)
begin
count=count+1'bl;
if(count==25^24000000)
begin
count=25'dO;
sec=〜sec;
end
end
〃按键消抖处理部分
〃模块名clock
〃输入时钟
〃输入按键
〃数码管选择输出引脚
〃数码管段输出引脚
〃定义数码管输出寄存器
〃定义数码管选择输出寄存器
〃定义显示数据寄存器
〃定义计数寄存器
〃定义现在时刻寄存器
〃定义标志位
〃寄存器
〃按键消抖输出
〃输出数码管选择
〃输出数码管译码结果
〃定义clock上升沿触发
//0.5S到了吗?
〃计数器清零
〃置位秒标志
//按键消抖输出
assignkey_done=(doutlIdout2Idout3);
always@(posedgecount[17])
begin
doutl<=key;
dout2<=doutl;
dout3<=dout2;
end
always@(negedgekey_done[0])
begin
keyen=〜keyen;
end
〃数码管动态扫描显示部分
always@(posedgeelk)
begin
case(count[17:
15])
3*d0:
disp_dat=hour[3:
0];
3*dl:
disp_dat=hour[7:
4];
3'd2:
disp_dat=4'ha;
3'd3:
disp_dat=hour[ll:
8];
3*d4:
disp_dat=hour[15:
12];
3'd5:
disp_dat=4'ha;
3*d6:
disp_dat=hour[19:
16];
3'd7:
disp_dat=hour[23:
20];
endcase
case(count[17:
15])
3,dO:
dig_r=8,blllllllO;
3,dl:
dig_r=8,bllllll01;
3,d2:
dig_r=8,blllll011;
3'd3:
dig_r=8'bllll0111;
3,d4:
dig_r=8'blll01111;
3,d5:
dig_r=8'bll011111;
3,d6:
dig_r=8'bl0111111;
3'd7:
dig_r=8'b01111111;
end
always@(posedgeelk)
begin
case(disp_dat)
〃将琴键开关转换为乒乓开关
//count[17:
15]大约1ms改变一次
〃选择扫描显示数据
〃秒个位
〃秒十位
〃显示
〃分个位
//分十位
〃显示
//时个位
〃时十位
〃选择数码管显示位
〃选择第一个数码管显示
〃选择第二个数码管显示
〃选择第三个数码管显示
〃选择第四个数码管显示
〃选择第五个数码管显示
〃选择第六个数码管显示
〃选择第七个数码管显示
endcase
4'h0:
seg_r=8*hcO;
4'hl:
seg_r=8'hf9;
4'h2:
seg_r=8*ha4;
4'h3:
seg_r=8'hbO;
4'h4:
seg_r=8'h99;
4'h5:
seg_r=8'h92;
4'h6:
seg_r=8'h82;
4'h8:
seg_r=8'h80;
4'h9:
seg_r=8'h90;/
4'ha:
seg_r=8'hbf;
default:
seg_r=8'hff;
endcase
if((count[17:
15]==3'd2)&sec)
seg_r=8'hff;
end
always@(negedgesecornegedgekey_done[l])//
begin
if(!
key_done[l])
begin
hour=24'hO;
end
elseif(!
keyen)
begin
hour[3:
0]=hour[3:
0]+1'bl;
if(hour[3:
0]==4'ha)
begin
hour[3:
0]=4'hO;
hour[7:
4]=hour[7:
4]+1'bl;
if(hour[7:
4]==4'h6)
begin
hour[7:
4]=4'hO;
hour[ll:
8]=hour[U:
8]+1'bl;
if(hour[ll:
8]==4'ha)
begin
hour[ll:
8]=4'h0;
hour[15:
12]=hour[15:
12]+1'bl;
if(hour[15:
12]==4*h6)
begin
hour[15:
12]=4'h0;
hour[19:
16]=hour[19:
16]+1'bl;
if(hour[19:
16]==4'ha)
begin
hour[19:
16]=4*h0;
hour[23:
20]=hour[23:
20]+1'bl;
end
if(hour[23:
16]==8'h24)
hour[23:
16]=8'h0;
end
end
end
end
end
end
endmodule
六、思考题
1.自己动手添加校时程序,
moduleclock(clk,key,dig,seg);
inputelk;
input[l:
0]key;
output[7:
0]dig;
output[7:
0]seg;
reg[7:
0]seg_r;
reg[7:
0]dig_r;
reg[3:
0]disp_dat;
reg[24:
0]count;
reg[23:
0]hour;
regsec,keyen;
reg[1:
0]dout1,dout2,dout3;
wire[1:
0]key_done;
assigndig=dig_r;
assignseg=seg_r;
〃秒信号产生部分
always@(posedgeelk)
写出相应程序。
〃模块名clock
〃输入时钟
〃输入按键
〃数码管选择输出引脚
〃数码管段输出引脚
〃定义数码管输出寄存器
〃定义数码管选择输出寄存器
〃定义显示数据寄存器
〃定义计数寄存器
〃定义现在时刻寄存器
〃定义标志位
〃寄存器
〃按键消抖输出
〃输出数码管选择