FPGA和外围接口-第一章 爱上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就耽误时间了。

  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的工具为ISE\Vivado,目前比较常用的是Vivado,由于Vivado的工程目录名称建立的比较符合大众,所以在使用Vivado时本人很少修改文件夹目录,所以Vivado建立工程过程比较常规,在此不再赘述,工程源码和上个例子一样。

  这里介绍几个常见的后缀名称的含义:

              表1-14 Vivado工程目录下常见后缀及含义

在这里插入图片描述

  OK,这部分就简单介绍到这里,后面的更新也基本以实际例程为主,介绍部分会砍掉,但是会在每周更新的文档里体现。

代码地址 github

你笑一次,我就可以高兴好几天;可看你哭一次,我就难过了好几年…
https://github.com/suisuisi/FPGA/tree/master/FPGAandPI

在这里插入图片描述

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值