EDA技术及应用实验报告完整版纯手打.docx
- 文档编号:28153593
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:30
- 大小:55.10KB
EDA技术及应用实验报告完整版纯手打.docx
《EDA技术及应用实验报告完整版纯手打.docx》由会员分享,可在线阅读,更多相关《EDA技术及应用实验报告完整版纯手打.docx(30页珍藏版)》请在冰豆网上搜索。
EDA技术及应用实验报告完整版纯手打
《EDA技术及应用》
实验报告
系部:
电子通信工程系
指导教师:
王春彦
学号:
081308314
姓名:
刘瑞浩
实验一点亮LED设计
一、实验目的
通过此实验让用户逐步了解、熟悉和掌握FPGA开发软件QuartusII的使用方法及VerilogHDL的编程方法。
本实验力求以详细的步骤和讲解让读者以最快的方式了解EDA技术开发以及软件的使用,从而快速入门并激起读者对EDA技术的兴趣。
二、实验内容
SmartSOPC实验箱上有8个发光二极管LED1~8,并分别与FPGA的50、53~55、176和47~49引脚相连。
本实验的内容是建立可用于控制LED亮/灭的简单硬件电路,要求点亮SmartSOPC实验箱上的4个发光二极管(LED1、LED3、LED5和LED7)。
三、实验原理
FPGA器件同单片机一样,为用户提供了许多灵活独立的输入/输出I/O口(单元)。
FPGA每个I/O口可以配置为输入、输出、双向I/O、集电极开路和三态门等各种组态。
作为输出口时,FPGA的I/O口可以吸收最大为24mA的电流,可以直接驱动发光二极管LED等器件。
所以只要正确分配并锁定引脚后,在相应的引脚上输出低电平“0”,就可以实现点亮该发光二级管的功能。
四、实验步骤
1、启动QuartersII建立一个空白工程,命名为led_test.qpf。
然后分别建立图形设计文件,命名为led_test.bdf,以及文本编辑文件led1.v,将他们都添加进工程中。
2、对工程进行设计。
在led1.v中输入程序代码,并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
从设计文件中创建模块,由led1.v生成名为led1.bsf的模块符号文件。
在led_test.bdf中任意空白处双击鼠标左键,将symbol对话框中libraries:
project下的led1模块添加到图形文件led_test.bdf中,加入输入、输出引脚,双击各管脚符号,进行管脚命名。
完整的顶层模块原理图如下图所示。
选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
3、设置编译选项并编译硬件系统。
将led_test.bdf设置为顶层实体。
对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
4、下载硬件设计到目标FPGA。
将产生的led_test.sof输出对FPGA进行配置。
5、观察LED的状态。
五、实验程序
//利用连续赋值assign语句实现
moduleled1(led);//模块名led1
output[7:
0]led;//定义输出端口、
assignled=8'b10101010;//输出0xAA
endmodule
//利用过程赋值语句实现(暂时已屏蔽)
/*
moduleled1(led);//模块名led1
output[7:
0]led;//定义输出端口
reg[7:
0]led;//定义寄存器
always//过程1,无敏感变量
begin
led=8'b10101010;//输出0xAA
end
endmudule*/
六、思考题
写出使用QuartusII软件开发工程的完整的流程。
实验二流水灯实验
一、实验目的
通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VerilogHDL的编程方法。
学习简单时序电路的设计和硬件测试。
二、实验内容
本实验的内容是建立可用于控制LED流水灯的简单硬件电路,要求在SmartSOPC实验箱上实现LED1~LED8发光二极管流水灯显示。
三、实验原理
1、在LED1~LED8引脚上周期性的输出流水数据,如原来输出的数据是11111100则表示点亮LED1、LED2,流水一次后,输出的数据应该为11111000,而此时则应点亮LED1~LED3三个LED发光二极管,就可以实现LED流水灯。
为了观察方便,流水速率最好在2Hz左右。
在QuickSOPC核心板上有一个48MHz的标准时钟源,该时钟脉冲Clock与芯片的28管脚相连。
为了产生2Hz的时钟脉冲,在此调用了一个分频模块(int_div模块,位于光盘中EDA_Component目录下),通过修改分频系数来改变输出频,当分频系数为24x10^6时,输出即为2Hz的频率信号。
2、Int_div分频模块说明:
int_div模块是一个占空比为50%的任意整数分频器。
输入时钟为clock,输出时钟为clk_out。
其中F_DIV为分频系数,分频系数范围为1~2^n(n=F_DIV_WIDTH),若要改变分频系数,改变参数F_DIV和F_DIV_WIDTH到相应范围即可。
在本例中输入时钟为48MHz,要得到2Hz的信号,所以分频系数为48x10^6/2=24x10^6;对于分频系数为24x10^6的数需要一个25位宽的计数器即可。
四、实验步骤
1、启动QuartersII建立一个空白工程,命名为led_water.qpf。
2、新建VerilogHDL源程序文件ledwater.v,输入程序代码并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
3、从设计文件中创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件。
4、将光盘中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录。
5、新建图形设计文件命名为led_water.bdf并保存。
在空白处双击鼠标左键,分别将symbol对话框中libraries:
project下的ledwater和int_div模块放在图形文件led_water.bdf中,加入输入、输出引脚,双击各管脚符号,进行管脚命名。
双击int_div的参数框,并修改参数,将F_DIV的值改为24000000,F_DIV_WIDTH的值改为25.完整的顶层模块原理图如下图所示。
6、选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
7、将led_water.bdf设置为顶层实体。
对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
8、将产生的led_water.sof输出对FPGA进行配置。
9、更改分频模块(int_div)的分频系数,并重新编译下载,观察流水灯的变化。
五、实验程序
moduleledwater(led,clk);//模块名ledwater
output[7:
0]led;//定义LED输出口
inputclk;//定义时钟输入口
reg[8:
0]led_r;//定义输出寄存器
assignled=led_r[7:
0];//寄存器输出
always@(posedgeclk)//在时钟上升沿触发进程
begin
led_r<=led_r<<1;//是,则输出左移一位
if(led_r==9'd0)//循环完毕吗?
led_r<=9'b111111111;//是,则重新赋初值
end
endmodule
六、思考题
本实验顶层采用了图形输入的方式,若采用文本输入方式,如何编写顶层文件?
写出相应程序。
实验三键盘、LED发光实验
一、实验目的
通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VerilogHDL的编程方法,熟悉以VerilogHDL文件为顶层模块的设计。
学习和体会分支条件语句case的使用方法及FPGAI/O口的输出控制。
二、实验内容
SmartSOPC实验箱上有8个发光二极管LED1~8和8个按键KEY1~KEY8。
本实验的内容要求在SmartSOPC实验箱上完成对8个按键KEY1~KEY8进行监控,一旦有按键输入判断其键值,并点亮相应的发光二极管,如若KEY3按下,则点亮LED1~LED3发光二极管。
三、实验原理
FPGA的所有I/O控制块允许每个I/O口引脚单独配置为输出口,不过这种配置是系统自动完成的,一旦该I/O口被设置为输入口使用时(如定义key0为输入引脚:
inputkey0;)该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O口引脚对外呈高阻态,这样该I/O口引脚即可用作专用输入引脚。
只要正确分配并锁定引脚后,一旦在KEY1~KEY8中有按键输入,在检测到键盘输入的情况下,继续判断其键值并做出相应的处理。
四、实验步骤
1、启动QuartersII建立一个空白工程,命名为keyled.qpf。
2、新建VerilogHDL源程序文件keyled.v,输入程序代码并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
3、选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
4、对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
5、将产生的keyled.sof输出对FPGA进行配置。
按下不同按键观察LED发光管的状态。
五、实验程序
modulekeyled(key,led);//模块名keyled
input[7:
0]key;//定义键盘输入口
output[7:
0]led;//定义发光管输出口
reg[7:
0]led_r;//定义寄存器
reg[7:
0]buffer_r;
assignled=led_r;//输出键值
always@(key)//过程1
begin
buffer_r=key;//读取键值
case(buffer_r)
8'b11111110:
led_r=8'b11111110;//是键KEY1,则给寄存器赋值0xfe
8'b11111101:
led_r=8'b11111100;//是键KEY2,则给寄存器赋值0xfc
8'b11111011:
led_r=8'b11111000;//是键KEY3,则给寄存器赋值0xf8
8'b11110111:
led_r=8'b11110000;//是键KEY4,则给寄存器赋值0xf0
8'b11101111:
led_r=8'b11100000;//是键KEY5,则给寄存器赋值0xe0
8'b11011111:
led_r=8'b11000000;//是键KEY6,则给寄存器赋值0xc0
8'b10111111:
led_r=8'b10000000;//是键KEY7,则给寄存器赋值0x80
8'b01111111:
led_r=8'b00000000;//是键KEY8,则给寄存器赋值0x00
default:
led_r=8'b11111111;//否则给寄存器赋值0xff
endcase
end
endmodule
六、思考题
能否用if语句改写本实验程序?
如果能,写出相应程序。
实验四静态数码管显示实验
一、实验目的
学习7段数码管显示译码器的设计,进一步了解、熟悉和掌握FPGA开发软件QuartusII的使用方法及VerilogHDL的编程方法,学习LPM兆功能模块的调用。
二、实验内容
SmartSOPC实验箱上有2个4位动态共阳极数码管LED12和LED13。
其中8个位码DIG0~DIG7和8位段码SEG0~SEG7分别与FPGA相应的引脚相连。
这样,只要DIG0~DIG7上一直输出低电平“0”,则8个数码管将显示相同的数码(因为8个LED数码管的段码线分别接到了同一引脚上),这样8位动态的LED数码管就变成了静态的LED。
本实验的内容是建立7段译码显示模块,用于控制LED数码管的静态显示。
要求在SmartSOPC实验箱上的数码管依次显示0~9和A~F16个字符。
三、实验原理
数码管LED显示是工程项目中使用较广的一种输出显示器件。
常见的数码管有共阴和共阳2种。
共阴数码管是将8个发光二极管的阴极连接在一起作为公共端,而共阳数码管是将8个发光二极管的阳极连接在一起作为公共端。
公共端常被称作位码,而将其他的8位称作段码。
数码管有8个段分别为:
h、g、f、e、d、c、b和a(h为小数点),只要公共端为高电平“1”,某个段输出低电平“0”则相应的段就亮。
本实验通过分频模块int_div分频得到1Hz的频率信号,加载于4位计数器的时钟输入端,计数循环输出0~9、A~F16个数。
最后通过七段译码模块译码后在数码管上显示出来。
四、实验步骤
1、启动QuartersII建立一个空白工程,命名为sled.qpf。
2、新建VerilogHDL源程序文件decl7s.v,输入程序代码并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
3、从设计文件中创建模块,由decl7s.v生成名为decl7s.bsf的模块符号文件。
4、将光盘中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录。
5、添加4位计数器兆功能模块。
6、新建图形设计文件命名为sled.bdf并保存。
在空白处双击鼠标左键,分别将symbol对话框中libraries:
project下的counter、decl7s和int_div模块放在图形文件sled.bdf中,在symbol对话框中Name:
输入gnd,添加gnd符号。
加入输入、输出引脚,双击各管脚符号,进行管脚命名。
双击int_div的参数框,并修改参数,将F_DIV的值改为48000000,F_DIV_WIDTH的值改为26。
完整的顶层模块原理图如下图所示。
7、选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
8、将sled.bdf设置为顶层实体。
对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
9、将产生的sled.sof输出对FPGA进行配置。
观察LED显示状态。
五、实验程序
moduledecl7s(d,seg);//模块名decl7s
input[3:
0]d;//输入4位二进制码
output[7:
0]seg;//七段译码输出
reg[7:
0]seg_r;//定义数码管输出寄存器
assignseg=seg_r;//输出数码管译码结果
always@(d)
begin
case(d)//七段译码
4'h0:
seg_r=8'hc0;//显示0
4'h1:
seg_r=8'hf9;//显示1
4'h2:
seg_r=8'ha4;//显示2
4'h3:
seg_r=8'hb0;//显示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'ha1;//显示d
4'he:
seg_r=8'h86;//显示e
4'hf:
seg_r=8'h8e;//显示f
endcase
end
endmodule
六、思考题
1.本实验采用的是共阳极数码管,若采用共阴极数码管,有什么不同?
2.如何显示HHHHHHHH和PPPPPPPP?
实验五动态数码管显示实验
一、实验目的
学习动态扫描显示的原理及电路的设计。
二、实验内容
本实验的内容是建立数码管动态扫描显示模块,具体内容如下:
1、在SmartSOPC实验箱上完成LED数码管的动态显示“1~8”8个数字;
2、放慢扫描速度演示动态显示的原理过程。
三、实验原理
一个FPGA的片子如果带动多个(比如说8个)数码管,选用静态显示的话,管脚很容易不够用,于是大多采用动态显示的方式。
本次采用共阳极的数码管,其中每个数码管的8个段:
h、g、f、e、d、c、b和a(h为小数点)都分别连接到SEG0~SEG7,8个数码管分别由8个选通信号DIG0~DIG7来选择。
被选通的数码管显示数据,其余关闭。
如果在某一时刻DIG2为低电平“0”,其余选通信号为高电平“1”,这时仅DIG2对应的数码管显示来自段码信号端的数据,其余7个数码管呈现关闭状态。
根据这种电路状态,如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫描就能实现扫描显示的目的。
虽然每次只有一个LED显示,但只要扫描显示速率足够快,由于人的视觉余辉效应,使我们仍会感觉所有的数码管都在同时显示。
四、实验步骤
1、启动QuartersII建立一个空白工程,命名为dled.qpf。
2、新建VerilogHDL源程序文件scan_led.v,输入程序代码并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
3、从设计文件中创建模块,由scan_led.v生成名为scan_led.bsf的模块符号文件。
4、将光盘中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录。
5、添加常量兆功能模块。
6、新建图形设计文件命名为dled.bdf并保存。
在空白处双击鼠标左键,分别将symbol对话框中libraries:
project下的constant、scan_led和int_div模块放在图形文件dled.bdf中,加入输入、输出引脚,双击各管脚符号,进行管脚命名。
双击int_div的参数框,并修改参数,将F_DIV的值改为48000,F_DIV_WIDTH的值改为16。
完整的顶层模块原理图如下图所示。
7、选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
8、将dled.bdf设置为顶层实体。
对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
9、将产生的sled.sof输出对FPGA进行配置。
观察LED数码管上的数字是否为“12345678”,然后把分频模块的参数改为F_DIV:
24000000,F_DIV_WIDTH:
25,再重新编译下载,观察这次LED数码管上的显示数据,可以看到数据“12345678”动起来了,这正是动态扫描的方法和过程。
五、实验程序
modulescan_led(clk_1k,d,dig,seg);//模块名scan_led
inputclk_1k;//输入时钟
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;//输出数码管选择
assignseg=seg_r;//输出数码管译码结果
always@(posedgeclk_1k)//定义上升沿触发进程
begin
count<=count+1'b1;
end
always@(posedgeclk_1k)
begin
case(count)//选择扫描显示数据
3'd0:
disp_dat=d[31:
28];//第一个数码管
3'd1:
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[11:
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'd1:
dig_r=8'b10111111;//选择第二个数码管显示
3'd2:
dig_r=8'b11011111;//选择第三个数码管显示
3'd3:
dig_r=8'b11101111;//选择第四个数码管显示
3'd4:
dig_r=8'b11110111;//选择第五个数码管显示
3'd5:
dig_r=8'b11111011;//选择第六个数码管显示
3'd6:
dig_r=8'b11111101;//选择第七个数码管显示
3'd7:
dig_r=8'b11111110;//选择第八个数码管显示
endcase
end
always@(disp_dat)
begin
case(disp_dat)//七段译码
4'h0:
seg_r=8'hc0;//显示0
4'h1:
seg_r=8'hf9;//显示1
4'h2:
seg_r=8'ha4;//显示2
4'h3:
seg_r=8'hb0;//显示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'ha1;//显示d
4'he:
seg_r=8'h86;//显示e
4'hf:
seg_r=8'h8e;//显示f
endcase
end
endmodule
六、思考题
说出数码管动态显示的原
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 技术 应用 实验 报告 完整版 纯手打
![提示](https://static.bdocx.com/images/bang_tan.gif)