FPGA和外围接口-第一章 爱上FPGA
第1章 爱上FPGA-
1.7 爱上FPGA从流水灯开始
爱上FPGA从流水灯开始
流水灯可能大部分文章都有介绍,但是本节主要目的是看下两家FPGA的EDA工具的使用流程及建立一个清爽的文件目录。 |
---|
Intel FPGA流水灯
本次建立的目录只是本人习惯这样建立工程目录,方便后期维护,肯定不局限于这一种,大家可以根据自己的习惯维护一种工程目录。 |
---|
在进行流水灯工程实验建立前,需要先了解Quartus II工程目录下常见的后缀名及含义。
表1-13 Quartus II工程目录下常见后缀及含义
1.在工程目录下分别建立core、dev、doc、mif、(out、sim)src、tcl目录,如图1-24所示:以下的操作过程基本都是基于表1-13进行操作的。
图 1-24 Intel FPGA Quartus II工程目录
3.在doc目录下放入需要用到的文档,本次需要用到FPGA板子的原理图,原理图用来确定LED灯是高电平控制还是低电平控制(即是共阴极还是共阳极),其他文档可以在设计过程中用到在添加进去。2.在core目录下导入写好的IP文件,因为本次设计并没有引入可以利用的IP文件,所以略过(后期的数码管控制文件在写好后,后期其他工程就可以直接利用该文件直接控制数码管,不需要每次都重新进行编写)。
4.在mif目录下放入需要进行内存初始化的初始化文件,本次设计不涉及到内存问题所以本目录放空。
5.在tcl目录下放入和FPGA板子对应的引脚分配文件(正常情况下,在第一次拿到一个板子时,就应该拿到这个板子的所有管脚分配文件),将和本次设计相关的引脚保留,其他管脚删除就可以。具体如下:
#------------------GLOBAL--------------------#
set_global_assignment-name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED"
set_global_assignment-name ENABLE_INIT_DONE_OUTPUT OFF
#复位引脚
set_location_assignment PIN_M1 -toRESET
#时钟引脚
set_location_assignment PIN_R9 -toCLOCK
#LED对应的引脚
set_location_assignment PIN_J1 -toLED[0]
set_location_assignment PIN_J2 -toLED[1]
set_location_assignment PIN_K1 -toLED[2]
set_location_assignment PIN_K2 -toLED[3]
第一句话:设置不用的引脚为输入三态;
第二句话:设置启用“初始化完成”输出关闭;
第三句话:设置RESET引脚;
第四句话:设置CLOCK引脚;
第五、六、七、八句话:设置四个LED对应引脚。
· 为什么不用的引脚要设置为输入三态?· 这个设置是有FPGA以来的基本要求,否则可能导致CMOS同时输出而烧毁。 |
---|
· 不能把全部输出信号放在一个bank上一个BANK的输出电流是有限的,约250ma,如果多根输出线放同一个bank(比如32根数据总线),同时翻转,有可能超出负载能力,导致异常。 |
· IO输出阻抗要根据实际调整一般PCB的标准阻抗是50欧,FPGA缺省输出阻抗也是50欧,可以调整FPGA的输出电流来改变输出阻抗,进而改善信号完整性。这点在对硬件验收的时候要特别注意,示波器打到最大分辨率,观察信号有无阶梯或过冲,否则出现误码去检查FPGA就耽误时间了。 |
- 一个BANK的输出电流是有限的,约250ma,如果多根输出线放同一个bank(比如32根数据总线),同时翻转,有可能超出负载能力,导致异常。
· IO输出阻抗要根据实际调整
- 一般PCB的标准阻抗是50欧,FPGA缺省输出阻抗也是50欧,可以调整FPGA的输出电流来改变输出阻抗,进而改善信号完整性。这点在对硬件验收的时候要特别注意,示波器打到最大分辨率,观察信号有无阶梯或过冲,否则出现误码去检查FPGA就耽误时间了。
6.在src目录下放入本次设计的源代码,命名为:Run_LED.v(本次设计释义Verilog进行设计的,其他方法根据需要新建对应的文件)。
右击Run_LED.v以Sublime打开(其他编辑器一样),如果不习惯的话,可以略过本步骤,在后面新建完工程后在原生编辑器里进行编辑;
编写代码如下:
//***************************************//
//# @Author: 碎碎思
//# @Date: 2019-04-14 19:54:50
//# @LastModified by: zlk
//# @LastModified time: 2019-04-14 21:36:06
//****************************************//
module Run_LED
(
CLOCK,
RESET,
LED
);
////////////////////////////////////////////
input CLOCK,RESET;
output reg [3:0]LED;
////////////////////////////////////////////
//
//首先定义一个时间计数寄存器counter,每当达到预定的100ms时,
//计数寄存器就清零,否则的话寄存器就加1。
//然后计算计数器计数的最大值。时钟频率为50MHZ,
//也就是周期为1/50M 为20ns,要计数的最大值为T100MS=100ms/20ns-1 = 4999_999。
//
reg[25:0]counter;
parameter T100MS= 23'd5_000_000;
always @(posedge CLOCK or negedge RESET)
if(!RESET) //高电平复位
counter<=25'd0;
else if(counter==T100MS)
counter<=25'd0;
else
counter<=counter 1'b1;
////////////////////////////////////////////
always @(posedge CLOCK or negedge RESET)
if(!RESET)
LED<=4'b0001; //初值,最低位led[0]灯亮
elseif(counter==T100MS)
begin
if(LED==4'b0000) //当溢出最高位时
LED<=4'b0001; //回到复位时的状态
else
LED<=LED<<1; //循环左移一位
end
endmodule //Run_LED
其中所有的输入输出引脚名需要根据tcl目录下的引脚分配文件中定义的名称相匹配。
LED电路原理图如下,可知其为共阴极设计,需要高电平点亮,所以FPGA引脚只要设置为“1”对应的LED就会被点亮。
图 1-24 LED原理图
程序就不多进行解释就是简单的流水灯程序,其中“<<”为循环左移一位的运算符。
7.打开Quartus II程序,点击New ProjectWizard;
点击NEXT;
设置工程目录选择上几步设置的目录下的dev目录和工程的名称;
点击NEXT;
选择Empty project;
Add file页面选择src目录下的源文件;
点击NEXT;
选择FPGA Device,根据自己的情况选择FPGA型号;
一路点击NEXT;
点击Finsh。
图 1-25 Quartus II设置工程目录和工程的名称
8.引脚分配,ToolsàTCL scriptsà选择引脚分配的TCL文件àRun,就会看到执行成功提示,注意:如果TCL文件和工程文件是在同一个文件夹内就会直接看到该TCL文件,不在同一个文件夹需要点击Add to Project按钮进行添加,具体如下:
图 1-26 TCL脚本加载过程
这个时候就可以在DeviceàPin Planner下看到所有的引脚都已经分配好。
9.编译,下载程序就可以看到流水灯现象了。
最后,看下整个工程文件/夹构成:
<00_Intel_Run_LED>
├<core>
├<dev>
│ ├Run_LED.qpf
│ ├Run_LED.qsf
│ ├<db>
│ │ ├.cmp.kpt
│ │ ├prev_cmp_Run_LED.qmsg
│ │ ├Run_LED.(0).cnf.cdb
│ │ ├Run_LED.(0).cnf.hdb
│ │ ├Run_LED.asm.qmsg
│ │ ├Run_LED.asm.rdb
│ │ ├Run_LED.asm_labs.ddb
│ │ ├Run_LED.cbx.xml
│ │ ├Run_LED.cmp.bpm
│ │ ├Run_LED.cmp.cdb
│ ├<incremental_db>
│ │ ├README
│ │ ├<compiled_partitions>
│ │ │ ├Run_LED.db_info
│ │ │ ├Run_LED.root_partition.cmp.ammdb
│ │ │ ├Run_LED.root_partition.cmp.cdb
│ │ │ ├Run_LED.root_partition.cmp.dfp
│ │ │ ├Run_LED.root_partition.cmp.hdb
│ │ │ ├Run_LED.root_partition.cmp.logdb
│ │ │ ├Run_LED.root_partition.cmp.rcfdb
│ │ │ ├Run_LED.root_partition.map.cdb
│ │ │ ├Run_LED.root_partition.map.dpi
│ │ │ ├Run_LED.root_partition.map.hbdb.cdb
│ │ │ ├Run_LED.root_partition.map.hbdb.hb_info
│ │ │ ├Run_LED.root_partition.map.hbdb.hdb
│ │ │ ├Run_LED.root_partition.map.hbdb.sig
│ │ │ ├Run_LED.root_partition.map.hdb
│ │ │ ├Run_LED.root_partition.map.kpt
│ │ │ └Run_LED.rrp.hdb
│ ├<output_files>
│ │ ├Run_LED.asm.rpt
│ │ ├Run_LED.done
│ │ ├Run_LED.fit.rpt
│ │ ├Run_LED.fit.smsg
│ │ ├Run_LED.fit.summary
│ │ ├Run_LED.flow.rpt
│ │ ├Run_LED.jdi
│ │ ├Run_LED.map.rpt
│ │ ├Run_LED.map.summary
│ │ ├Run_LED.pin
│ │ ├Run_LED.sld
│ │ ├Run_LED.sof
│ │ ├Run_LED.sta.rpt
│ │ └Run_LED.sta.summary
├<doc>
│ ├DB4CE15底板.pdf
│ └DB4CE15核心板.pdf
├<mif>
├<src>
│ ├Run_LED.v
│ └Run_LED.v.bak
├<tcl>
│ └PIN_ASSIGN.tcl
Xilinx FPGA流水灯
Xilinx的FPGA的工具为ISEVivado,目前比较常用的是Vivado,由于Vivado的工程目录名称建立的比较符合大众,所以在使用Vivado时本人很少修改文件夹目录,所以Vivado建立工程过程比较常规,在此不再赘述,工程源码和上个例子一样。
这里介绍几个常见的后缀名称的含义:
表1-14 Vivado工程目录下常见后缀及含义
后缀 | 含义 | 后缀 | 含义 |
---|---|---|---|
.v | verilog 文件 | .vhd | vhdl 文件 |
.dcp | 不论是综合还是布局布线都只会产生一种格式的文件,即.dcp文件,每个阶段的.dcp文件都是下一阶段的输入文件,.dcp文件实际上包含了对应阶段处理的信息,用vivado可以直接打开,File->Open Checkpoint。.dcp文件主要包括Physical Constraints, Device Constraints, Netlists以及device的信息。 | ||
.xdc | 这个是vivado的约束文件,vivado的约束文件和ise中的约束文件.ucf或者.pcf相比有很大不同,.xdc中的约束文件其实就是一系列的tcl语句,所以对于vivado中的约束文件,可以作为一个源文件放在工程里,在综合和布局布线中调用;也可以在tcl console中输入,立即执行。 | ||
.xci | 这是定制ip产生的文件,里面包含了定制的ip核的所有信息,可以通过这个文件产生需要的ip核,作用和.dcp文件差不多。ip核中也有.dcp文件,关于选择.xci文件还是.dcp文件,在vivado中的ip定制中会总结。 | ||
.rpt | 这个是每个过程结束输出的一个report文件,用来记录各个过程中的一些信息,和ise中的多种输出文件格式相比,这样的统一格式显然更好一点。 |
OK,这部分就简单介绍到这里,后面的更新也基本以实际例程为主,介绍部分会砍掉,但是会在每周更新的文档里体现。实际的代码会更新到GitHub上,基本一周一更新。