fpga实验报告李聪组Word下载.docx

上传人:b****4 文档编号:7942420 上传时间:2023-05-09 格式:DOCX 页数:28 大小:1.65MB
下载 相关 举报
fpga实验报告李聪组Word下载.docx_第1页
第1页 / 共28页
fpga实验报告李聪组Word下载.docx_第2页
第2页 / 共28页
fpga实验报告李聪组Word下载.docx_第3页
第3页 / 共28页
fpga实验报告李聪组Word下载.docx_第4页
第4页 / 共28页
fpga实验报告李聪组Word下载.docx_第5页
第5页 / 共28页
fpga实验报告李聪组Word下载.docx_第6页
第6页 / 共28页
fpga实验报告李聪组Word下载.docx_第7页
第7页 / 共28页
fpga实验报告李聪组Word下载.docx_第8页
第8页 / 共28页
fpga实验报告李聪组Word下载.docx_第9页
第9页 / 共28页
fpga实验报告李聪组Word下载.docx_第10页
第10页 / 共28页
fpga实验报告李聪组Word下载.docx_第11页
第11页 / 共28页
fpga实验报告李聪组Word下载.docx_第12页
第12页 / 共28页
fpga实验报告李聪组Word下载.docx_第13页
第13页 / 共28页
fpga实验报告李聪组Word下载.docx_第14页
第14页 / 共28页
fpga实验报告李聪组Word下载.docx_第15页
第15页 / 共28页
fpga实验报告李聪组Word下载.docx_第16页
第16页 / 共28页
fpga实验报告李聪组Word下载.docx_第17页
第17页 / 共28页
fpga实验报告李聪组Word下载.docx_第18页
第18页 / 共28页
fpga实验报告李聪组Word下载.docx_第19页
第19页 / 共28页
fpga实验报告李聪组Word下载.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

fpga实验报告李聪组Word下载.docx

《fpga实验报告李聪组Word下载.docx》由会员分享,可在线阅读,更多相关《fpga实验报告李聪组Word下载.docx(28页珍藏版)》请在冰点文库上搜索。

fpga实验报告李聪组Word下载.docx

六、实验感想与收获17

6.1、感想17

6.2、一些Verilog语句归纳:

18

七.附录:

20

1.Kintex-7FPGA主要包括特性:

2.FPGA主要原理21

3.FPGA的基本特点:

22

4.FPGA一些应用22

实验

(一)——认识FPGA开发板

一、实验目的

1、了解FPGA开发流程

2、了解XilinxKC705开发平台

二、实验原理

1.FPGA组成

FPGA是FieldProgrammableGateArray的缩写,即现场可编程门阵列,它是在CPLD的基础上发展起来的新型高性能可编程逻辑器件,它一般采用SRAM工艺,也有一些专用器件采用Flash工艺或反熔丝(Anti-Fuse)工艺等。

FPGA的集成度很高,其器件密度从数万系统门到数千万系统门不等,可以完成极其复杂的时序与组合逻辑电路功能,适用于高速、高密度的高端数字逻辑电路设计领域。

FPGA的基本组成部分有可编程输入/输出单元、基本可编程逻辑单元、嵌入式RAM、丰富的布线资源、底层嵌入功能单元、内嵌专用硬核等。

2.FPGA设计流程

一般来说,完整的FPGA设计流程包括电路设计与输入、功能仿真、综合优化、综合后仿真、布局布线、布局布线后仿真、板级验证与加载配置调试等主要步骤,如图1所示。

(1)电路设计与输入。

电路设计与输入是指通过某些规范的描述方式,将工程师电路构思输入给EDA工具。

常用的设计输入方法有硬件描述语言(HDL)和原理图设计输入方法等。

HDL语言中,应用最为广泛的是VHDL和VerilogHDL。

(2)功能仿真。

电路设计完成后,要用专用的仿真工具对设计进行功能仿真,验证电路功能是否符合设计要求。

(3)综合优化。

综合优化(Synthesize)是指将HDL语言、原理图等设计输入翻译成由与、或、非门,RAM,触发器等基本逻辑单元组成的逻辑连接(网表),并根据目标与要求(约束条件)优化所生成的网表,输出edf和edn等标准格式的网表文件,供FPGA厂家的布局布线器进行实现。

(4)综合后仿真。

综合完成后需要检查综合结果是否与原设计一致,做综合后仿真。

在仿真时,把综合生成的标准延时文件反标到综合仿真模型中去,可估计门延时带来的影响。

(5)实现与布局布线。

综合结果的本质是一些与、或、非门,触发器,RAM等基本逻辑单元组成的逻辑网表,它与芯片实际的配置情况有较大差距。

此时,应该使用FPGA厂商提供的软件工具,根据所选芯片型号,将综合输出的逻辑网表适配到具体FPGA器件上,这个过程叫做实现过程。

在实现过程中,最主要的过程就是布局布线。

所谓布局(Place)是指将逻辑网表中的硬件原语或者底层单元合理地适配到FPGA内部的固有硬件结构上;

所谓布线(Route)是指根据布局的拓扑结构,利用FPGA内部的各种连线资源,合理正确连接各个元件的过程。

(6)时序仿真与验证。

将布局布线的时延信息反标到设计网表中,所进行的仿真就叫时序仿真或布局布线后仿真,简称后仿真。

布局布线后仿真的主要目的在于发现时序违规(TimingViolation),即不满足时序约束条件或者器件固有时序规则(建立时间、保持时间)的情况。

(7)板级仿真与验证。

在有些高速设计情况下还需要使用第三方的板极验证工具进行仿真与验证。

这些工具通过对设计的IBIS、HSPICE等模型的仿真,能较好地分析高速设计的信号完整性、电磁干扰(EMI)等电路特性等。

(8)对器件下载调试。

设计开发的最后步骤是在线调试或者将生成的配置文件写入芯片中进行测试。

示波器和逻辑分析仪是逻辑设计的主要测试工具。

以上任何仿真或者验证步骤出现问题,就需要根据错误的定位返回到相应的步骤更改或者重新设计。

本实验采用的是Xilinx公司的带有Kintex-7FPGA的KC705开发平台。

Xilinx的7系列FPGA包括Artix-7,Kintex-7和Virtex-7三个系列。

具有超高端连接带宽,逻辑容量和信号完整性,提供低成本,小型尺寸和大容量的要求严格的高性能应用。

其中,Kintex-7FPGA具有较高的性价比,其组成的收发器从600Mbps到最高的6.6Gbps,达到28.05Gbps。

主要用在航空电子、LED背光的平板电视和3DTV、LTE基带、手持超声设备、多模式无线电、Prosumer数码单反照相机和视频IP网关。

图1FPGA开发流程

为了了解并掌握FPGA开发流程,本实验在KC705平台设计设计一个分频计数的实验,用FPGA内部逻辑控制LED灯的亮灭。

KC705平台自带的8个LED灯原理图如图3所示,当GPIO输入端为高电平时,二极管导通,灯变亮。

当输入端为低电平时,二极管截止,灯变暗。

本实验通过Verilog代码进行计数分频,控制GPIO_LED_0的周期性变化。

在Verilog代码设计中,把分频输出信号与GPIO_LED_0管脚相连,大家就可以感受到分频产生的效果了。

在代码里,使用的200M的差分时钟,一个周期是5ns,在代码里24位计数器cnt进行循环计数,一个周期有224个时钟周期,大约是80ms,所以LED0以80ms为周期变化。

三、实验步骤

3.1新建ISE工程

(a)打开ISE软件,新建工程,如图4所示

图4新建ISE工程

图5输入工程名称和路径

然后输入工程名称和路径,其余选择默认选项,点击finish,如图5所示。

新建工程结束之后,右击新建的工程名称,选择addnewsource,可以向工程中添加源文件,在这里选择verilogmodule,在左侧对话框输入文件名称和路径,如图6所示。

3.2添加源文件

图6添加verilog源文件

回到设计页面,可以发现在工程下面多了一个.v文件,点开文

件,输入下面代码:

moduleclk_div(clk_p,clk_n,rst,clk_div);

inputclk_p,rst;

inputclk_n;

//定义输出输入端口,差分输入的脉冲,复位输入

outputclk_div;

//定义输出端口

regclk_div;

//为了操作方便定义了一个与输出端口同名的寄存器

reg[23:

0]count;

//定义24位变量用于分频是计数

wireclk;

always@(posedgeclk)//always例化语句,每到下降沿是执行

if(rst)//检查是否有按键按下

begin

count<

=1'

b0;

//对输出和计数值进行初始化

clk_div<

end

else

if(count!

=24'

hffffff)//计数最大值为ffffff,如果没有加到ffffff折继续加

=count+1'

b1;

else//计数到ffffff个时钟周期后开始对计数值初始化,然后输出电平求反

=~clk_div;

//差分时钟例化原语

IBUFDSUUT_IBUFG(.I(clk_p),

.IB(clk_n),

.O(clk));

Endmodule

代码功能分析:

这段程序的主要功能就是对输入时钟进行分频,每到ffffff个时钟周期,输出则求一次反,这样输出的脉冲则会是对时钟脉冲ffffff分频。

3.3代码综合

代码输入完成之后对代码进行综合,双击Synthesize-XST,综合成功后会显示对号或感叹号,如图7所示。

如果是感叹号,代表有警告,可右击Synthesize-XST查看综合报告,对这里出现的警告可以忽略。

图10布局布线

3.4添加约束文件

(c)为了使我们的代码与硬件映射,还需要进行管脚约束,管脚约束文件格式为ucf,与添加verilogmodule文件相同的方法,添加一ucf文件,不同的是在图8的左侧界面中选择ImplementationConsraintsFile。

图8添加ucf文件

回到设计界面,开始编辑ucf文件,打开KC705的datasheet,我们可以找到要使用的LED0与FPGA管脚AB8相连,如图9所示

图9LED0与FPGA管脚对应关系

同样的方法,再对时钟和复位信号进行配置。

时钟选用200M的systemclocksource,复位信号选用SW3,确定了管脚对应关系之后,开始编辑ucf文件,输入下列内容,其中IOSTANDARD为电压约束,在KC705的datasheet中可以找到。

NET"

clk_p"

LOC=AD12|IOSTANDARD=LVDS;

//200M

clk_n"

LOC=AD11|IOSTANDARD=LVDS;

rst"

LOC=AG5|IOSTANDARD=LVCMOS15;

//sw3

clk_div"

LOC=AB8|IOSTANDARD=LVCMOS15;

//LED0

3.5布线

d)以上工作做完之后,就要对代码进行布局布线,生成可下载的比特流,如图10所示,双击GenerateProgrammingFile。

3.6生成比特流并下载到FPGA上

上面步骤完成之后,开始将生成的比特流下载到FPGA板,如11所示,连接开发板与电脑

图11连接FPGA与电脑

点击configuretargetdevice,打开Impact,如图12所示

12打开iMPACT软件

点击箭头所示按钮,出现图13界面,点击OK

图13扫描设备

如图14所示,软件识别出所连接设备,点击OK

图14设别设备

双击设备,找到生成的比特流,出现图15对话框选择no

图15生成PROM

然后选择program,将比特流下载到FPGA板,下载成功后出现programsuccessed标志,如图16所示

图16下载比特流成功

(f)观察实验结果。

按下SW3,发现LED0是灭的,然后它会由暗到明周期性的变化,如图17,18所示

图17LED0变亮

图18LED0变暗

四、实验拓展

在看了实验指导书之后,我发现实现输出的波形都是方波,这时候,我打算改一下程序,让它输出PWM波,通过占空比来改变灯的亮度,通过PWM波的频率来改变闪烁的频率,经过仿真和下载到FPGA上面,得到了比较好的效果。

如图19,计数值count一直线性增长,输入脉冲每来一个上升沿,计数值就会加1,当计数值达到dutycycle(占空比)时,则输出低电平,当达到frequence时候,则计数值会变为0,同时输出高电平,通过改变frequence计数值和dutycycle值来分别改变频率和占空比

图19

源文件

modulevanpersie(clk_p,clk_n,clk_div,rst1,rst2,rst3);

inputrst1,rst2,rst3;

//rst1复位,rst2用于改变灯闪烁的频率,rst3用于改变灯闪烁的亮度,rst4用于改变闪烁的模式

inputclk_p,clk_n;

//差分时钟输入口

//计数值

0]freqence;

//设置输出脉冲的频率

0]duty;

//用于设置输出脉冲的占空比

reg[0:

0]i=0;

//标志i初始化为0用来判断按键是否释放

always@(posedgeclk)//输入脉冲下降沿时执行

if((rst1)&

&

(!

i))//判断是否按下按键rst1,rst1用于初始化

i<

=1'

//按键按下则将标志位置位

freqence<

=24'

hffffff;

//初始化频率,这是后输出脉冲的频率等于上一个实验输出方波频率

duty<

//占空比先设置为1,这是输出脉冲一直未高电平

//初始化计数值为0

//输出为高电平

elseif((rst2)&

i))//判断按键rst2是否有按下(rst2用于改变频率,变为原来两倍)

//有按键按下则置位标志位

=freqence/2'

d2;

//每按一下,frequence计数值变为原来一半,频率变为原来两倍

elseif((rst3)&

i))//判断rst3是否按下,rst3用于改变占空比

//置位标志位i,用于显示按键已经按下

=duty/2'

//duty减半,占空比变为原来一半

elseif((!

rst1)&

rst2)&

(rst3))//如果此时没有按键按下

begin

i<

//复位标志位i,用于告诉系统没有按键按下

if(count!

=freqence)//如果计数值没有达到frequence则计数值加1

begin

count<

=count+1'

if(count>

=duty)//如果计数值达到duty则输出低电平

clk_div<

else;

end

else//否则(计数值达到frequence),置位输出,复位计数值

begin

count<

end

end

.IB(clk_n),

.O(clk));

约束文件

rst1"

LOC=AG5|IOSTANDARD=LVCMOS15;

rst2"

LOC=AB12|IOSTANDARD=LVCMOS15;

//sw4

rst3"

LOC=AC6|IOSTANDARD=LVCMOS15;

//sw5

仿真文件

modulevanpersie_test;

//定义模块

//Inputs//定义输入

regclk_p;

regclk_n;

regrst1;

regrst2;

regrst3;

//Outputs//定义输出

wireclk_div;

//InstantiatetheUnitUnderTest(UUT)

vanpersieuut(

.clk_p(clk_p),

.clk_n(clk_n),

.clk_div(clk_div),

.rst1(rst1),

.rst2(rst2),

.rst3(rst3)

);

//Addstimulushere

initialbegin

//InitializeInputs//初始化

clk_p=0;

clk_n=1;

rst1=1;

//先按下按键rst1,这样先对输出初始化

rst2=0;

rst3=1;

//按下rst3,这样输出的方波占空比减半

#100;

foreverbegin

rst3=1;

#100;

rst3=0;

clk_p=#1~clk_p;

clk_n=~clk_n;

end

#80;

rst1=0;

//释放按键

rst2=0;

#200;

rst3=0;

end

endmodule

五、思考题

(1)本实验中代码实现的是偶数分频,试编写奇数分频,如3分频代码。

1.首先,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数1时,输出时钟进行翻转,计数到2时再次进行翻转。

即是在计数值在邻近的1和2进行了两次翻转。

这样实现的三分频占空比为1/3或者2/3。

2.如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。

这种方法可以实现任意的奇数分频。

方法一:

//上升沿触发的分频设计

module 

three(clkin, 

clkout);

input 

clkin;

//定义输入端口

output 

clkout;

reg 

[1:

0] 

step1, 

step;

always 

@(posedge 

clkin) 

//数组step在上升沿是加1,对上升沿独立技术

begin 

case 

(step) 

2'

b00:

step<

=2'

b01;

b01:

b10;

b10:

b00;

default 

:

endcase 

@(negedge 

//数组step1在下降沿是加1,对下降沿独立计数

(step1) 

step1<

assign 

clkout=~(step[1]|step1[1]);

//采用差分脉冲输出,输出的式step,step1第二位求或的反,得到三分频

冲(占空比为1/3或者2/3)

方法二:

// 

如果duty 

cycle 

=50%, 

可以第一个周期第二个周期输出原先clock,第三个周期输出低,这样可以实现三分频,输出是占空比1:

1的三分频

.

three(clk,throut) 

clk 

throut;

q1,q2,d,throut;

clk) 

//q1用于记录上升沿,有1和0两种状态

if(!

d) 

q1=1'

else 

q1=~q1 

//q2用于记录下降沿,有1和0两种状态

q2=1'

q2=~q2 

@(q1 

or 

q2) 

//用or语句,每当q1,q2中其中一个有变化时

d=q1&

q2 

//d记录差分时钟

//当d发生变化时候则输出求反,得到占空比50%的三分频脉冲

throut=~throut;

仿真波形

(2)本实验中把比特流下载到FPGA开发板是通过USB接口,除USB之外还有哪些下载方式?

奇数倍分频有两种实现方法:

下载FPGA里面有三种方式

JTAG:

下载sof文件,掉电丢失可以将sof转换为jic文件,用EPCSx配置,掉电不丢失

AS:

下载pof文件,配置EPCSx,掉电不丢失

PS:

比较老的下载方式,很少使用

六、实验感想与收获

6.1、感想

通过这次FPGA实验,我有很深的感触。

之前在做实验之前,就对FPGA早有耳闻,最早是在学习verilog时候老师提到过fpga是可编程电路,能够并行地处理数据,运算快,后来在实验室参观的时候,老师提到FPGA说现在数据处理能力要求越来越高,很多时候,会用到FPGA,它速度很快,普通电脑做一些数据处理可能要花费将近一年时间,而FPGA则只要花费一天,因为是程序执行可以是并行的,因此速度快,在很多领域内都有很广的用途。

后来在实验课上,助教老师给我们介绍了FPGA和xilinux的软件ISE,我越来越喜欢这款开发工具,因为功能强大,运算能力强,普通的DSP芯片做数据处理时候时序控制能力较弱,而且受到时钟约束,在越来越追求速度的今天,它时序控制能力强(时序能力强,没有指令周期,速度快),控制能力较强的特点得到了很好的发挥,而且ISE软件还带有仿真器,能够在没有硬件的时候能够比较好地仿真出时序逻辑。

回去后,自己开始仿真,发现很多时候都出问题,最开始是编译不通过,对verilog语言数据表示,块语句,always,assign,case,if等例化语句很不熟悉,时常就写错编译不通过,仿真文件编写时候理解有问题,得不到想要的结果,因为这些原因,我花费了很长的一段时间去适应,理解,最后,我做了一些总结如下。

过程语句有:

initial、always(可综合)

initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;

always块内的语句则是不断重复执行的;

一般来说always语句使用方法是

always@(<

敏感信号表达式event-expression>

//过程赋值

//if-else,case,casex,casez选择语句

//while,repeat,for循环

//task,function调用

注意:

1.always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行2.其中敏感信号表达式为

事件表达式或敏感信号列表

当表达式中变量

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2