李振荣老师FPGA可编程逻辑器件上机大作业西安电子科技大学微电子学院.docx
《李振荣老师FPGA可编程逻辑器件上机大作业西安电子科技大学微电子学院.docx》由会员分享,可在线阅读,更多相关《李振荣老师FPGA可编程逻辑器件上机大作业西安电子科技大学微电子学院.docx(22页珍藏版)》请在冰豆网上搜索。
李振荣老师FPGA可编程逻辑器件上机大作业西安电子科技大学微电子学院
三、实验题目
题目1:
多模式LED发光控制器(逻辑设计)
设计要求:
1)采用16个并排LED实现跑马灯发光器件;
2)具有异步复位功能(按钮),复位时,LED全亮;
3)模式选择(利用两位滑动开关):
00—左循环跑马灯,01—右循环跑马灯,10—交叉闪烁跑马灯,11—全亮全灭闪烁
4)速度选择(利用两位滑动开关):
通过00—11实现四个可视速度等级闪烁效果
题目2:
多模式运动计时器(逻辑设计)
设计要求:
1)具有计时和倒计时功能(最低位滑动开关进行模式选择)
2)数码管显示分钟和秒,格式mm:
ss,最长时间为59分59秒
3)倒计时时长可配置(15位滑动开关控制倒计时值)
4)具有启动/暂停功能,具有异步复位功能(按钮控制)
题目3:
液晶屏显示字符(选作)
设计要求:
1)在液晶屏上显示欢迎语句
2)通过滑动开关控制语句切换
3)具有异步复位功能(按钮控制)
4)部分开发板需外接Pmod液晶屏
FPGA实验报告
班级:
学号:
姓名:
一、实验目的
1.熟悉FPGA软件基本使用方法;
2.掌握电路的基本设计、仿真、布线方法;
3.掌握FPGA开发板的应用。
二、实验器材
1)开发板描述:
本次我利用的是XilinxBasys3开发平台
开发平台特性:
FPGA
XC7A35T-1CPG236C
I/OInterfaces
USB-UARTforprogrammingandserialcommunication
USB-UARTBridge
12-bitVGAoutput
USBHIDHostformice,keyboardsandmemorysticks
Memory
32MbitSerialFlash
Displays
One4-digit7-Segmentdisplays
SwitchesandLEDs
16Slideswitches
16LEDs
5Push-buttons
Clocks
One100MHzcrystaloscillator
Expansionports
PmodforXADCsignals
3Pmodports
2)软件工具描述:
本次我利用的是Vivado2014.4软件开发工具、在仿真测试时利用的是ModelSimSE-6410.4。
三、实验原理
题目1:
多模式LED发光控制器(逻辑设计)
设计要求:
1.采用16个并排LED实现跑马灯发光器件;
2.具有异步复位功能(按钮),复位时,LED全亮;
3.模式选择(利用两位滑动开关):
00—左循环跑马灯,01—右循环跑马灯,10—交叉闪烁跑马灯,11—全亮全灭闪烁
4.速度选择(利用两位滑动开关):
通过00—11实现四个可视速度等级闪烁效果
------------------------------------------------------------------------------------------------------------------------------------
设计思路:
题目要求有四个跑马灯花样,所以我用了m1和m2这两个变量组成一个两位的二进制数来作为输入控制四个不同的花样。
同样,题目要求有四个速度选择(利用两位滑动开关):
通过00—11实现四个可视速度等级闪烁效果,所以我用了v1和v2这两个变量组成一个两位的二进制数来作为输入控制四个不同的速度。
速度控制时,考虑到开发板的频率问题,我引入了count变量,通过count的变化来依次扩大时间间隔,其中count1在变化到24’b1111_1111_1111_1111_1111_1111时才使count2变化一次,count2变化三次后count3变化一次,以此类推,达到了控制速度的要求。
源代码中用到了两个case语句,用来选择花样和速度。
1)代码设计:
见附录
2)仿真:
仿真代码见附录
利用ModelSimSE-6410.4仿真测试后的截图如下:
3)综合
我利用了V16、V17、W16、W17这四个滑动开关来连接m1、m2、v1、v2。
利用Vivado2014.4软件开发工具进行分析和约束文件综合后形成的网表截图如下:
可以看到各种器件的使用情况
4)布局布线
利用Vivado2014.4软件开发工具进行布局布线后截图如下:
局部放大之后:
5)生成数据文件
----------------------------------------------------------------------------------------------------------
题目2:
多模式运动计时器(逻辑设计)
设计要求:
1.具有计时和倒计时功能(最低位滑动开关进行模式选择)
2数码管显示分钟和秒,格式mm:
ss,最长时间为59分59秒
3.倒计时时长可配置(15位滑动开关控制倒计时值)
4.具有启动/暂停功能,具有异步复位功能(按钮控制)
----------------------------------------------------------------------
设计思路:
题目要求具有计时和倒计时功能,所以我用m变量来控制(m=1’b1为计时功能,m=1’b0时为倒计时功能)。
数码管显示分钟和秒用8位的q变量来表示,连接到开发板的数码管引脚上。
且具有15位的倒计时时长输入端t和异步功能rst。
1)代码设计:
见附录
2)仿真:
仿真代码见附录
利用ModelSimSE-6410.4仿真测试后的截图如下:
3)综合
放大之后:
4)布局布线
局部放大之后:
5)生成数据文件
可以看到相关器件的利用率情况
五、实验思考,课程认识
结合实验过程总结个人的实验心得,本课程及前景的认识和展望(300字)。
经过两次的上机和课外自己的研究,现在已经会用了Vivado2014.4软件开发工具和ModelSimSE-6410.4工具,在这些过程中我又重新复习了一遍VerilogHDL的编写和仿真,发现了很多以前在学习硬件描述语言的时候没有注意到的相关问题,经过一遍遍的反复改正和测试,最终达到了实验的要求后感觉特别开心,不仅是对自己努力后结果的一种肯定,更是一种乐趣。
看到一个个步骤显示成功的时候,更是感觉非常兴奋。
其中的约束文件是第一次尝试自己编写,开始看着那些例题的文件感觉很难,但只要仔细去看了,上网找相关的开发手册然后一一对应起来就很简单了。
在写源代码的时候也要考虑很多问题,逻辑和语言的正确性都是要准一的问题。
总之,这次的上机让我受益匪浅,也感受到了从描述到布局布线后的直观体验的兴奋,这次上机实验和大作业的完成十分有用,在未来,可编程逻辑器件用的也会越来越多,我们也要不断学习,不断去掌握,未来开发自己的东西的时候就简单一点了。
六、附录
1、代码
----------------------------------------------------------------------------------------------------------
题目一源程序代码:
moduleLED
(
rst,
clk,
led,m1,m2,v1,v2
);
inputrst,clk;
inputm1,m2,v1,v2;
output[15:
0]led;
reg[15:
0]led;
reg[23:
0]count,count1,count2,count3,count4,count5;
always@(posedgeclkorposedgerst)
begin
if(rst==1'b1)
begin
led[15:
0]<=16'b1111_1111_1111_1111;
end
else
begin
case({v1,v2})
2'b00:
count<=count2;
2'b01:
count<=count3;
2'b10:
count<=count4;
2'b11:
count<=count5;
endcase
case({m1,m2})
2'b00:
if(count==24'b0000_0000_0000_0000_0000_0010)
beginled<=(led<<1);end
2'b01:
if(count==24'b0000_0000_0000_0000_0000_0010)
beginled<=(led>>1);end
2'b10:
if(count==24'b0000_0000_0000_0000_0000_0010)
beginled=24'b1010_1010_1010_1010_1010_1010;
#5led=24'b0101_0101_0101_0101_0101_0101;end
2'b11:
if(count==24'b0000_0000_0000_0000_0000_0010)
beginled<=16'b1111_1111_1111_1111_1111;
#5led<=16'b0000_0000_0000_0000_0000;end
endcase
end
end
always@(posedgeclkornegedgerst)
begin
if(rst==1'b1)
begin
count1<=24'b0;
count2<=24'b0;
count3<=24'b0;
count4<=24'b0;
count5<=24'b0;
end
else
begin
count1<=count1+1'b1;
if(count1==24'b1111_1111_1111_1111_1111_1111)
begincount2<=count2+1;end
if(count2==24'b0000_0000_0000_0000_0000_0010)
begincount3<=count3+1;end
if(count3==24'b0000_0000_0000_0000_0000_0010)
begincount4<=count4+1;end
if(count4==24'b0000_0000_0000_0000_0000_0010)
begincount5<=count5+1;end
end
end
endmodule
----------------------------------------------------------------------------------------------------------
题目一测试仿真代码:
moduleLED_tb;
wire[15:
0]led;
regrst,clk,m1,m2,v1,v2;
LEDU1(rst,clk,led,m1,m2,v1,v2);
initial
begin
clk=0;
rst=0;
#5rst=1'b1;
#5m1=1'b1;m2=1'b1;
#5v1='b0;v2=1'b1;
#5rst=1'b0;
end
always#5clk=~clk;
endmodule
题目二源程序代码:
moduletimer
(q,m,t,p,rst,clk);
inputrst,clk;
inputm,t,p;
output[7:
0]q;
reg[7:
0]q;
reg[23:
0]count;
wire[14:
0]t;
always@(posedgeclkorposedgerst)
begin
if(rst==1'b1)
begin
q<=8'b0000_0000;
end
else
case(m)
1'b0:
begin
if(count==24'b1111_1111_1111_1111_1111_1111)
beginq[1:
0]<=(q[1:
0]+1'b1);
if(q[1:
0]==2'b11)
beginq[3:
2]<=q[3:
2]+1'b1;
if(q[3:
0]==4'b1111)
beginq[5:
4]<=q[5:
4]+1'b1;
if(q[5:
4]==2'b11)
beginq[7:
6]<=q[7:
6]+1'b1;
endendendend
end
1'b1:
begin
q[7:
0]<=t[7:
0];
if(count==24'b1111_1111_1111_1111_1111_1111)
beginq[1:
0]<=q[1:
0]-1'b1;
if(q[1:
0]==2'b00)
beginq[3:
2]<=q[3:
2]-1'b1;
if(q[3:
0]==4'b0000)
beginq[5:
4]<=q[5:
4]-1'b1;
if(q[5:
4]==2'b00)
beginq[7:
6]<=q[7:
6]-1'b1;
endendendend
end
endcase
end
always@(posedgeclkornegedgerst)begin
if(rst==1'b1)begin
count<=24'b0;
end
elsebegin
count<=count+1'b1;
end
end
endmodule
题目二仿真测试程序代码:
moduletimer_tb;
wireq;
regm,t,p,rst,clk;
timerU1(q,m,t,p,rst,clk);
initial
begin
clk=0;
rst=0;
#5rst=1;
#5rst=0;
#5m=1;
#5t=15'b111_0000_1111_0000;
end
always#5clk=~clk;
endmodule
----------------------------------------------------------------------------------------------------------
2、引脚定义
本设计管脚约束语句,能够正确执行,保证书写整齐。
----------------------------------------------------------------------------------------------------------题目一约束文件:
##Clocksignal
set_propertyPACKAGE_PINW5[get_portsclk]
set_propertyIOSTANDARDLVCMOS33[get_portsclk]
##LEDs
set_propertyPACKAGE_PINU16[get_ports{led[0]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[0]}]
set_propertyPACKAGE_PINE19[get_ports{led[1]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[1]}]
set_propertyPACKAGE_PINU19[get_ports{led[2]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[2]}]
set_propertyPACKAGE_PINV19[get_ports{led[3]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[3]}]
set_propertyPACKAGE_PINW18[get_ports{led[4]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[4]}]
set_propertyPACKAGE_PINU15[get_ports{led[5]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[5]}]
set_propertyPACKAGE_PINU14[get_ports{led[6]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[6]}]
set_propertyPACKAGE_PINV14[get_ports{led[7]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[7]}]
set_propertyPACKAGE_PINV13[get_ports{led[8]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[8]}]
set_propertyPACKAGE_PINV3[get_ports{led[9]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[9]}]
set_propertyPACKAGE_PINW3[get_ports{led[10]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[10]}]
set_propertyPACKAGE_PINU3[get_ports{led[11]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[11]}]
set_propertyPACKAGE_PINP3[get_ports{led[12]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[12]}]
set_propertyPACKAGE_PINN3[get_ports{led[13]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[13]}]
set_propertyPACKAGE_PINP1[get_ports{led[14]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[14]}]
set_propertyPACKAGE_PINL1[get_ports{led[15]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[15]}]
##Buttons
set_propertyPACKAGE_PINU18[get_portsrst]
set_propertyIOSTANDARDLVCMOS33[get_portsrst]
set_propertyPACKAGE_PINV16[get_portsm1]
set_propertyIOSTANDARDLVCMOS33[get_portsm1]
set_propertyPACKAGE_PINV17[get_portsm2]
set_propertyIOSTANDARDLVCMOS33[get_portsm2]
set_propertyPACKAGE_PINW16[get_portsv1]
set_propertyIOSTANDARDLVCMOS33[get_portsv1]
set_propertyPACKAGE_PINW17[get_portsv2]
set_propertyIOSTANDARDLVCMOS33[get_portsv2]
##Clocksignal
set_propertyPACKAGE_PINW5[get_portsclk]
set_propertyIOSTANDARDLVCMOS33[get_portsclk]
##LEDs
set_propertyPACKAGE_PINU16[get_ports{led[0]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[0]}]
set_propertyPACKAGE_PINE19[get_ports{led[1]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[1]}]
set_propertyPACKAGE_PINU19[get_ports{led[2]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[2]}]
set_propertyPACKAGE_PINV19[get_ports{led[3]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[3]}]
set_propertyPACKAGE_PINW18[get_ports{led[4]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[4]}]
set_propertyPACKAGE_PINU15[get_ports{led[5]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[5]}]
set_propertyPACKAGE_PINU14[get_ports{led[6]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[6]}]
set_propertyPACKAGE_PINV14[get_ports{led[7]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[7]}]
set_propertyPACKAGE_PINV13[get_ports{led[8]}]
set_propertyIOSTANDARDLVCMOS33[get_ports{led[8]}]
set_propertyPACKAGE_PINV3[