fpga实验报告李聪组.docx
《fpga实验报告李聪组.docx》由会员分享,可在线阅读,更多相关《fpga实验报告李聪组.docx(28页珍藏版)》请在冰点文库上搜索。
fpga实验报告李聪组
《信息论基础》实验报告
FPGA实验报告
学院电子信息工程学院
专业通信工程
姓名李聪
学号11211060
同组成员:
闫科
吴文文
韩富玮
罗玉明
指导教师张立军
作者:
李聪
时间2014年5月03日
目录
实验
(一)——认识FPGA开发板3
一、实验目的3
二、实验原理3
1.FPGA组成3
2.FPGA设计流程3
3.实验思路:
5
三、实验步骤5
3.1新建ISE工程5
3.2添加源文件6
3.3代码综合8
3.4添加约束文件8
3.5布线9
3.6生成比特流并下载到FPGA上9
四、实验拓展12
设计思路:
12
源文件13
约束文件14
仿真文件14
五、思考题15
测试程序:
15
仿真波形17
六、实验感想与收获17
6.1、感想17
6.2、一些Verilog语句归纳:
18
七.附录:
20
1.Kintex-7FPGA主要包括特性:
20
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开发流程
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所示。
新建工程结束之后,右击新建的工程名称,选择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<=1'b0;
end
else
if(count!
=24'hffffff)//计数最大值为ffffff,如果没有加到ffffff折继续加
begin
count<=count+1'b1;
end
else//计数到ffffff个时钟周期后开始对计数值初始化,然后输出电平求反
begin
count<=1'b0;
clk_div<=~clk_div;
end
//差分时钟例化原语
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
NET"clk_n"LOC=AD11|IOSTANDARD=LVDS;//200M
NET"rst"LOC=AG5|IOSTANDARD=LVCMOS15;//sw3
NET"clk_div"LOC=AB8|IOSTANDARD=LVCMOS15;//LED0
3.5布线
d)以上工作做完之后,就要对代码进行布局布线,生成可下载的比特流,如图10所示,双击GenerateProgrammingFile。
图10布局布线
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;//差分时钟输入口
outputclk_div;
regclk_div;
reg[23:
0]count;//计数值
reg[23:
0]freqence;//设置输出脉冲的频率
reg[23:
0]duty;//用于设置输出脉冲的占空比
reg[0:
0]i=0;//标志i初始化为0用来判断按键是否释放
wireclk;
always@(posedgeclk)//输入脉冲下降沿时执行
if((rst1)&&(!
i))//判断是否按下按键rst1,rst1用于初始化
begin
i<=1'b1;//按键按下则将标志位置位
freqence<=24'hffffff;//初始化频率,这是后输出脉冲的频率等于上一个实验输出方波频率
duty<=24'hffffff;//占空比先设置为1,这是输出脉冲一直未高电平
count<=1'b0;//初始化计数值为0
clk_div<=1'b1;//输出为高电平
end
elseif((rst2)&&(!
i))//判断按键rst2是否有按下(rst2用于改变频率,变为原来两倍)
begin
i<=1'b1;//有按键按下则置位标志位
freqence<=freqence/2'd2;//每按一下,frequence计数值变为原来一半,频率变为原来两倍
end
elseif((rst3)&&(!
i))//判断rst3是否按下,rst3用于改变占空比
begin
i<=1'b1;//置位标志位i,用于显示按键已经按下
duty<=duty/2'd2;//duty减半,占空比变为原来一半
end
elseif((!
rst1)&&(!
rst2)&&(rst3))//如果此时没有按键按下
begin
i<=1'b0;//复位标志位i,用于告诉系统没有按键按下
if(count!
=freqence)//如果计数值没有达到frequence则计数值加1
begin
count<=count+1'b1;
if(count>=duty)//如果计数值达到duty则输出低电平
clk_div<=1'b0;
else;
end
else//否则(计数值达到frequence),置位输出,复位计数值
begin
clk_div<=1'b1;
count<=1'b0;
end
end
//差分时钟例化原语
IBUFDSUUT_IBUFG(.I(clk_p),
.IB(clk_n),
.O(clk));
Endmodule
约束文件
NET"rst1"LOC=AG5|IOSTANDARD=LVCMOS15;//sw3
NET"rst2"LOC=AB12|IOSTANDARD=LVCMOS15;//sw4
NET"rst3"LOC=AC6|IOSTANDARD=LVCMOS15;//sw5
NET"clk_div"LOC=AB8|IOSTANDARD=LVCMOS15;//LED0
NET"clk_p"LOC=AD12|IOSTANDARD=LVDS;//200M
NET"clk_n"LOC=AD11|IOSTANDARD=LVDS;//200M
仿真文件
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;
//Addstimulushere
foreverbegin
rst3=1;
#100;
rst3=0;
clk_p=#1~clk_p;
clk_n=~clk_n;
end
end
initialbegin
#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;
2'b01:
step<=2'b10;
2'b10:
step<=2'b00;
default :
step<=2'b00;
endcase
end
always @(negedge clkin) //数组step1在下降沿是加1,对下降沿独立计数
begin
case (step1)
2'b00:
step1<=2'b01;
2'b01:
step1<=2'b10;
2'b10:
step1<=2'b00;
default :
step1<=2'b00;
endcase
end
assign clkout=~(step[1]|step1[1]); //采用差分脉冲输出,输出的式step,step1第二位求或的反,得到三分频
冲(占空比为1/3或者2/3)
endmodule
方法二:
// 如果duty cycle =50%, 可以第一个周期第二个周期输出原先clock,第三个周期输出低,这样可以实现三分频,输出是占空比1:
1的三分频
.
module three(clk,throut)
input clk
output throut;
reg q1,q2,d,throut;
always @(posedge clk) //q1用于记录上升沿,有1和0两种状态
if(!
d)
q1=1'b1;
else
q1=~q1
always @(negedge clk) //q2用于记录下降沿,有1和0两种状态
if(!
d)
q2=1'b1;
else
q2=~q2
always @(q1 or q2) //用or语句,每当q1,q2中其中一个有变化时
d=q1&q2 //d记录差分时钟
always @(posedge d) //当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@(<敏感信号表达式event-expression>)
begin
//过程赋值
//if-else,case,casex,casez选择语句
//while,repeat,for循环
//task,function调用
end
注意:
1.always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行2.其中敏感信号表达式为
事件表达式或敏感信号列表
当表达式中变量