FPGA和外围接口-第一章 爱上FPGA(1.7 爱上FPGA从流水灯开始)

2020-06-30 10:14:29 浏览数 (1)

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上,基本一周一更新。

0 人点赞