fpga实验报告-李聪组.doc_第1页
fpga实验报告-李聪组.doc_第2页
fpga实验报告-李聪组.doc_第3页
fpga实验报告-李聪组.doc_第4页
fpga实验报告-李聪组.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

李聪 通信1101班 学号11211060信息论基础实验报告FPGA实验报告 学院 电子信息工程学院 专业 通信工程 姓名 李聪 学号 11211060 同组成员: 闫科 吴文文 韩富玮 罗玉明 指导教师 张立军 作者: 李聪 时间 2014年5月03日 目录实验(一)认识FPGA开发板3一、实验目的3二、实验原理31.FPGA组成32.FPGA设计流程33实验思路:5三、实验步骤53.1新建ISE工程53.2添加源文件63.3代码综合83.4添加约束文件83.5布线93.6生成比特流并下载到FPGA上9四、实验拓展12设计思路:12源文件13约束文件14仿真文件14五、思考题15测试程序:15仿真波形17六、实验感想与收获176.1、感想176.2、一些Verilog语句归纳:18七附录:201.Kintex-7 FPGA 主要包括特性:202.FPGA主要原理213.FPGA的基本特点:224.FPGA一些应用22实验(一)认识FPGA开发板一、实验目的1、了解FPGA开发流程2、了解Xilinx KC705 开发平台二、实验原理1.FPGA组成FPGA是Field Programmable Gate Array 的缩写,即现场可编程门阵列,它是在CPLD的基础上发展起来的新型高性能可编程逻辑器件,它一般采用SRAM工艺,也有一些专用器件采用Flash工艺或反熔丝(Anti-Fuse)工艺等。FPGA 的集成度很高,其器件密度从数万系统门到数千万系统门不等,可以完成极其复杂的时序与组合逻辑电路功能,适用于高速、高密度的高端数字逻辑电路设计领域。FPGA的基本组成部分有可编程输入/输出单元、基本可编程逻辑单元、嵌入式RAM、丰富的布线资源、底层嵌入功能单元、内嵌专用硬核等。2.FPGA设计流程一般来说,完整的FPGA设计流程包括电路设计与输入、功能仿真、综合优化、综合后仿真、布局布线、布局布线后仿真、板级验证与加载配置调试等主要步骤,如图1所示。(1) 电路设计与输入。电路设计与输入是指通过某些规范的描述方式,将工程师电路构思输入给EDA 工具。常用的设计输入方法有硬件描述语言(HDL)和原理图设计输入方法等。HDL语言中,应用最为广泛的是VHDL和Verilog HDL。(2)功能仿真。电路设计完成后,要用专用的仿真工具对设计进行功能仿真,验证电路功能是否符合设计要求。(3)综合优化。综合优化(Synthesize)是指将HDL 语言、原理图等设计输入翻译成由与、或、非门,RAM,触发器等基本逻辑单元组成的逻辑连接(网表),并根据目标与要求(约束条件)优化所生成的网表,输出edf和edn等标准格式的网表文件,供FPGA厂家的布局布线器进行实现。(4)综合后仿真。综合完成后需要检查综合结果是否与原设计一致,做综合后仿真。在仿真时,把综合生成的标准延时文件反标到综合仿真模型中去,可估计门延时带来的影响。(5)实现与布局布线。综合结果的本质是一些与、或、非门,触发器,RAM 等基本逻辑单元组成的逻辑网表,它与芯片实际的配置情况有较大差距。此时,应该使用FPGA厂商提供的软件工具,根据所选芯片型号,将综合输出的逻辑网表适配到具体FPGA器件上,这个过程叫做实现过程。在实现过程中,最主要的过程就是布局布线。所谓布局(Place)是指将逻辑网表中的硬件原语或者底层单元合理地适配到FPGA内部的固有硬件结构上;所谓布线(Route)是指根据布局的拓扑结构,利用FPGA内部的各种连线资源,合理正确连接各个元件的过程。(6)时序仿真与验证。将布局布线的时延信息反标到设计网表中,所进行的仿真就叫时序仿真或布局布线后仿真,简称后仿真。布局布线后仿真的主要目的在于发现时序违规(Timing Violation),即不满足时序约束条件或者器件固有时序规则(建立时间、保持时间)的情况。(7)板级仿真与验证。在有些高速设计情况下还需要使用第三方的板极验证工具进行仿真与验证。这些工具通过对设计的IBIS、HSPICE等模型的仿真,能较好地分析高速设计的信号完整性、电磁干扰(EMI)等电路特性等。(8)对器件下载调试。设计开发的最后步骤是在线调试或者将生成的配置文件写入芯片中进行测试。示波器和逻辑分析仪是逻辑设计的主要测试工具。以上任何仿真或者验证步骤出现问题,就需要根据错误的定位返回到相应的步骤更改或者重新设计。本实验采用的是Xilinx公司的带有Kintex-7 FPGA的KC705开发平台。Xilinx 的7 系列FPGA 包括Artix-7,Kintex-7 和Virtex-7 三个系列。具有超高端连接带宽,逻辑容量和信号完整性,提供低成本,小型尺寸和大容量的要求严格的高性能应用。其中,Kintex-7 FPGA具有较高的性价比,其组成的收发器从600Mbps到最高的6.6 Gbps,达到28.05Gbps。主要用在航空电子、LED背光的平板电视和3D TV、LTE基带、手持超声设备、多模式无线电、Prosumer数码单反照相机和视频IP网关。图1FPGA开发流程3实验思路:为了了解并掌握 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 所示。新建工程结束之后,右击新建的工程名称,选择 add new source,可以向工程中添加源文件,在这里选择verilog module,在左侧对话框输入文件名称和路径,如图 6 所示。3.2添加源文件图6 添加verilog源文件回到设计页面,可以发现在工程下面多了一个.v 文件,点开文件,输入下面代码:module clk_div(clk_p,clk_n,rst,clk_div); input clk_p,rst;input clk_n;/定义输出输入端口,差分输入的脉冲,复位输入output clk_div;/定义输出端口reg clk_div;/为了操作方便定义了一个与输出端口同名的寄存器reg23:0 count;/定义24位变量用于分频是计数wire clk;always (posedge clk)/always例化语句,每到下降沿是执行if(rst)/检查是否有按键按下begincount = 1b0;/对输出和计数值进行初始化clk_div = 1b0;endelseif ( count!=24hffffff)/计数最大值为ffffff,如果没有加到ffffff折继续加begincount = count + 1b1;endelse /计数到ffffff个时钟周期后开始对计数值初始化,然后输出电平求反begincount = 1b0;clk_div = clk_div;end/差分时钟例化原语IBUFDS UUT_IBUFG(.I(clk_p),.IB(clk_n),.O(clk);Endmodule代码功能分析:这段程序的主要功能就是对输入时钟进行分频,每到ffffff个时钟周期,输出则求一次反,这样输出的脉冲则会是对时钟脉冲ffffff分频。3.3代码综合代码输入完成之后对代码进行综合,双击Synthesize-XST,综合成功后会显示对号或感叹号,如图7所示。如果是感叹号,代表有警告,可右击Synthesize-XST查看综合报告,对这里出现的警告可以忽略。图10 布局布线3.4添加约束文件(c)为了使我们的代码与硬件映射,还需要进行管脚约束,管脚约束文件格式为ucf,与添加 verilog module 文件相同的方法,添加一ucf文件,不同的是在图8的左侧界面中选择 Implementation Consraints File。 图 8 添加 ucf 文件回到设计界面,开始编辑ucf文件,打开KC705的datasheet,我们可以找到要使用的 LED0与FPGA 管脚AB8相连,如图9所示图 9 LED0 与 FPGA 管脚对应关系 同样的方法,再对时钟和复位信号进行配置。时钟选用 200M 的 system clock source,复位信号选用 SW3,确定了管脚对应关系之后,开始编辑 ucf 文件,输入下列内容,其中 IOSTANDARD 为电压约束,在 KC705 的 datasheet 中可以找到。NET clk_p LOC=AD12 |IOSTANDARD=LVDS; /200MNET clk_n LOC=AD11 |IOSTANDARD=LVDS; /200MNET rst LOC=AG5|IOSTANDARD=LVCMOS15;/sw3NET clk_div LOC=AB8 |IOSTANDARD=LVCMOS15;/LED03.5布线d) 以上工作做完之后,就要对代码进行布局布线,生成可下载的比特流,如图 10 所示,双击 Generate Programming File。图10 布局布线3.6生成比特流并下载到FPGA上上面步骤完成之后,开始将生成的比特流下载到FPGA板,如11 所示,连接开发板与电脑 图 11 连接 FPGA 与电脑点击 configure target device,打开 Impact,如图 12 所示12 打开iMPACT 软件点击箭头所示按钮,出现图 13 界面,点击 OK图13扫描设备如图 14 所示,软件识别出所连接设备,点击 OK图 14 设别设备双击设备,找到生成的比特流,出现图 15 对话框选择 no图 15 生成 PROM然后选择 program,将比特流下载到 FPGA 板,下载成功后出现 program successed 标志,如图 16 所示图16 下载比特流成功(f)观察实验结果。按下 SW3,发现 LED0 是灭的,然后它会由 暗到明周期性的变化,如图 17,18 所示 图 17 LED0 变亮图 18 LED0 变暗四、实验拓展设计思路:在看了实验指导书之后,我发现实现输出的波形都是方波,这时候,我打算改一下程序,让它输出PWM波,通过占空比来改变灯的亮度,通过PWM波的频率来改变闪烁的频率,经过仿真和下载到FPGA上面,得到了比较好的效果。如图19,计数值count一直线性增长,输入脉冲每来一个上升沿,计数值就会加1,当计数值达到duty cycle(占空比)时,则输出低电平,当达到frequence时候,则计数值会变为0,同时输出高电平,通过改变frequence计数值和duty cycle值来分别改变频率和占空比图19源文件module vanpersie(clk_p,clk_n,clk_div,rst1,rst2,rst3);inputrst1,rst2,rst3;/rst1复位,rst2用于改变灯闪烁的频率,rst3用于改变灯闪烁的亮度,rst4用于改变闪烁的模式input clk_p, clk_n;/差分时钟输入口output clk_div;reg clk_div;reg23:0 count;/计数值reg23:0 freqence;/设置输出脉冲的频率reg23:0 duty;/用于设置输出脉冲的占空比reg0:0 i=0;/标志i初始化为0用来判断按键是否释放wire clk;always(posedge clk)/输入脉冲下降沿时执行if(rst1)&(!i)/判断是否按下按键rst1,rst1用于初始化begini=1b1;/按键按下则将标志位置位freqence = 24hffffff;/初始化频率,这是后输出脉冲的频率等于上一个实验输出方波频率duty = 24hffffff;/占空比先设置为1,这是输出脉冲一直未高电平count = 1b0;/初始化计数值为0clk_div = 1b1;/输出为高电平endelse if(rst2)&(!i)/判断按键rst2是否有按下(rst2用于改变频率,变为原来两倍)begini=1b1;/有按键按下则置位标志位freqence = freqence/2d2;/每按一下,frequence计数值变为原来一半,频率变为原来两倍endelse if(rst3)&(!i)/判断rst3是否按下,rst3用于改变占空比begini=1b1;/置位标志位i,用于显示按键已经按下duty = duty/2d2;/duty减半,占空比变为原来一半endelse if(!rst1)&(!rst2)&(rst3)/如果此时没有按键按下begin i=1b0;/复位标志位i,用于告诉系统没有按键按下if(count!=freqence)/如果计数值没有达到frequence则计数值加1 begin count =duty)/如果计数值达到duty则输出低电平clk_div =1b0;else;end else/否则(计数值达到frequence),置位输出,复位计数值beginclk_div =1b1;count = 1b0;endend/差分时钟例化原语IBUFDS UUT_IBUFG(.I(clk_p), .IB(clk_n), .O(clk);Endmodule约束文件NET rst1 LOC=AG5 | IOSTANDARD=LVCMOS15;/sw3NET rst2 LOC=AB12| IOSTANDARD=LVCMOS15;/sw4NET rst3 LOC=AC6| IOSTANDARD=LVCMOS15;/sw5NET clk_div LOC=AB8 |IOSTANDARD=LVCMOS15;/LED0NET clk_p LOC=AD12 |IOSTANDARD=LVDS; /200MNET clk_n LOC=AD11 |IOSTANDARD=LVDS; /200M仿真文件module vanpersie_test;/定义模块/ Inputs/定义输入reg clk_p;reg clk_n;reg rst1;reg rst2;reg rst3;/ Outputs/定义输出wire clk_div;/ Instantiate the Unit Under Test (UUT)vanpersie uut (.clk_p(clk_p), .clk_n(clk_n), .clk_div(clk_div), .rst1(rst1), .rst2(rst2), .rst3(rst3);/ Add stimulus here initial begin/ Initialize Inputs/初始化clk_p = 0;clk_n = 1;rst1 = 1;/先按下按键rst1,这样先对输出初始化rst2=0;rst3 =1;/按下rst3,这样输出的方波占空比减半#100; / Add stimulus here forever begin rst3=1;#100;rst3=0; clk_p=#1 clk_p; clk_n=clk_n; end endinitial begin#80;rst1 = 0;/释放按键rst2=0;#200;rst3 = 0; end endmodule五、思考题(1)本实验中代码实现的是偶数分频,试编写奇数分频,如3分频代码。 1 首先,完全可以通过计数器来实现,如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转,比如可以在计数器计数1时,输出时钟进行翻转,计数到2时再次进行翻转。即是在计数值在邻近的1和2进行了两次翻转。这样实现的三分频占空比为1/3或者2/3。2. 如果要实现占空比为50%的三分频时钟,可以通过待分频时钟下降沿触发计数,和上升沿同样的方法计数进行三分频,然后下降沿产生的三分频时钟和上升沿产生的时钟进行相或运算,即可得到占空比为50%的三分频时钟。这种方法可以实现任意的奇数分频。测试程序:方法一:/上升沿触发的分频设计modulethree(clkin,clkout);inputclkin;/定义输入端口outputclkout;/定义输出端口reg1:0step1,step;always(posedgeclkin)/数组step在上升沿是加1,对上升沿独立技术begin case(step) 2b00:step=2b01;2b01:step=2b10;2b10:step=2b00;default:step=2b00;endcaseendalways(negedgeclkin)/数组step1在下降沿是加1,对下降沿独立计数begin case(step1) 2b00:step1=2b01;2b01:step1=2b10;2b10:step1=2b00;default:step1=2b00;endcaseendassignclkout=(step1|step11);/采用差分脉冲输出,输出的式step,step1第二位求或的反,得到三分频冲(占空比为1/3或者2/3)endmodule方法二:/如 果dutycycle=50%,可以第一个周期第二个周期输出原先clock,第三个周期输出低,这样可以实现三分频,输出是占空比1:1的三分频.modulethree(clk,throut)inputclkoutputthrout; regq1,q2,d,throut;always(posedgeclk)/q1用于记录上升沿,有1和0两种状态if(!d)q1=1b1; else q1=q1always(negedgeclk)/q2用于记录下降沿,有1和0两种状态if(!d)q2=1b1;else q2=q2always(q1orq2)/用or语句,每当q1,q2中其中一个有变化时d=q1&q2/d记录差分时钟 always(posedged)/当d发生变化时候则输出求反,得到占空比50%的三分频脉冲throut=throut;endmodule 仿真波形(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等例化语句很不熟悉,时常就写错编译不通过,仿真文件编写时候理解有问题,得不到想要的结果,因为这些原因,我花费了很长的一段时间去适应,理解,最后,我做了一些总结如下。6.2、一些Verilog语句归纳:过程语句有:initial、always(可综合) initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的;一般来说always语句使用方法是always ()begin/过程赋值/if-else,case,casex,casez选择语句/while,repeat,for循环/task,function调用end注意:1.always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行2.其中敏感信号表达式为事件表达式或敏感信号列表当表达式中变量的值改变,就会引发块内语句的执行应列出影响块内取值的所有信号,用“or”连接。块语句有:begin-end(可综合)、fork-join块语句是由块标志符begin-end或fork-join界定的一组语句,当块语句只包含一条语句时,块标志符可以缺省。注意:begin-end串行块中的语句按串行方式顺序执行。assign为持续赋值语句,主要用于对wire型变量的赋值。比如:assign c=a&b; 在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b信号的任何变化,都将随时反映到c上来。赋值语句有:assign、=、=。(均可综合)非阻塞(non_blocking)赋值方式 赋值符号为“=” 非阻塞赋值在整个过程块结束时才完成赋值操作阻塞(blocking)赋值方式 赋值符号为“=”, 如:b= a; 阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该条语句结束后立刻改变。条件语句有:if-else、case(前两个可综合)、casez、casexif-else语句使用方法有以下3种:(1)if(表达式) 语句1;(2)if(表达式) 语句1; else 语句2;(3)if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式n) 语句n; else 语句n+1;case (敏感表达式) 值1: 语句1;/case分支项 值2: 语句2; 值n: 语句n; default:语句n+1; endcase循环语句(for、forever、repeat、while)(1)forever:连续地执行语句;多用在“initial”块中,以生成时钟等周期性波形。(2)repeat:连续执行一条语句n次。(3)while:执行一条语句直到某个条件不满足。(4)for:有条件的循环语句(唯一可综合)。七附录:1.Kintex-7 FPGA 主要包括特性:(1)基于6输入查找表(LUT)技术,可配置为分布式内存的,先进的高性能FPGA逻辑。(2)36kB 双端口RAM块,内置片上数据缓冲的FIFO逻辑。(3)高性能的Select IO技术,支持高达1866 Mb/s的DDR3接口。(4)强大的时钟管理瓷砖(CMT),结合锁相环(PLL)和混合模式时钟管理器(MMCM),用于实现高精度和低抖动。(5)低成本,线焊接,无盖倒装芯片,高信号完整性,倒装芯片封装,可以方便在同一系列产品之间互换。所有型号都具有无铅封装,并具有可选铅封装。本实验采用的Kintex-7 FPGA 的KC705 评估板提供了一个硬件环境,用于Kintex-7 XC7K325T-2FFG900C FPGA 的设计开发和评估,KC705开发平台如图2所示。图2 KC705开发平台从图中可以看出 KC705 板提供了许多嵌入式处理系统的共同特性,开发板资源介绍如表 1 所示。2.FPGA主要原理FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。 现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。FPGA利用小型查找表(161RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。3.FPGA的基本特点:1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。 -2)FPGA可做其它全定制或半定制ASIC电路的中试样片。 3)FPGA内部有丰富的触发器和IO引脚。4)FPGA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论