第 2 章 硬件实验平台及FPGA设计流程
【本章学习目标】
了解本书各实践任务所使用的硬件实验平台。
熟练掌握基于Xilinx Vivado集成设计环境,以图形界面下操作的Project方式,完成RTL到比特流文件的FPGA设计流程。
【本章实践目标】
本章只有一个实践任务,请读者在学习完本章内容后,按照本章的介绍完成实践任务。
2.1 硬件实验平台
在本书中,我们使用“龙芯CPU设计与体系结构教学实验系统”或“龙芯计算机系统能力培养远程实验平台”作为设计的FPGA验证平台,其中“龙芯CPU设计与体系结构教学实验系统”是针对本地验证而设计的,“龙芯计算机系统能力培养远程实验平台”是针对远程验证而设计的。
2.1.1 龙芯CPU设计与体系结构教学实验系统
“龙芯CPU设计与体系结构教学实验系统”(以下简称“实验箱”)采用本地使用的方式,即用户可以将综合好的设计文件通过JTAG线缆直接下载到实验箱的FPGA中,同时可以直接操作实验箱内FPGA开发板上的外设。
2.1.1.1 简介
打开实验箱,可以看到其内部有一块FPGA开发板(图2.1中的A)和一系列配件和线缆,包括1个电源适配器(图2.1中的B)、1根连接FPGA下载适配器的USB线缆(图2.1中的C)、1根串口线(图2.1中的D)、1个USB转串口接头(图2.1中的E),1根USB延长线(图2.1中的F)和1根网线(图2.1中的G)。完成本书第二部分的实践任务仅需要使用电源适配器(图2.1中的B)和FPGA下载适配器的USB线缆(图2.1中的C)。建议大家将其余线缆保持在最初的收纳状态,以防损坏、丢失。
当需要将综合好的比特流文件下载到实验箱进行调试时,请先将电源适配器的直流接口插入FPGA开发板上的电源插口(图2.2中的A),并将FPGA下载适配器的USB线缆的方口插入FPGA开发板左侧下方的下载适配器接口中(参考图2.1中C线的连接),将该线缆的USB口连接到调试主机上,随后拨动FPGA开发板上的电源开关(图2.2中的B),正常情况下可见FPGA开发板上电源指示灯(图2.2中的C)亮起,表明FPGA开发板已经上电,可以进行后续操作。
FPGA开发板上的核心器件是中央偏左的FPGA芯片(图2.2中的D)。实验箱选用的是一款Xilinx公司的Airtx-7系列FPGA芯片,具体型号为XC7A200T-FBG676,其内部逻辑单元数目多,芯片引脚数目多,属于Airtx-7系列中的高端产品。
相比大多数用于嵌入式系统开发的Xilinx FPGA开发板而言,实验箱中所集成的FPGA开发板针对数字电路、组成原理、体系结构、操作系统等课程的实验教学需求,集成了丰富的外设,这些外设占据了开发板的大部分面积。这里仅介绍与本书实践任务相关的外设接口,包括:双色LED灯(图2.2中的E)、单色LED灯(图2.2中的F)、数码管(图2.2中的G)、FPGA复位按键(图2.2中的H)、拨码开关(图2.2中的I)、脉冲开关(图2.2中的J)和4×4键盘(图2.2中的K)。读者若对其他接口感兴趣,可以参考附录A的介绍。
2.1.1.2 实验箱使用注意事项
根据以往的使用情况,我们总结一些实验箱使用的建议如下:
- 每次用完实验箱之后,应将配件、线缆收纳整齐,然后缓慢合上实验箱盖。若感觉合上箱盖的阻力较大,请打开箱盖理顺配件、线缆,再尝试合上箱盖,强行合上箱盖可能会损坏实验设备。
- 实验箱仅在功能仿真验证通过且顺利生成比特流文件之后,进行上板调试的时候才需要。在此之前,不需要给实验箱通电并连接到电脑上。
- 使用实验箱时,请将其置于一个平整、稳定且有足够接触面积的地方。切勿应实验箱放在大腿上、书包上、桌子角等地方。
- 下载比特流文件前,请连接好电源线和下载线,并确保FPGA板已上电、确保FPGA板已上电、确保FPGA板已上电(重要的事情说三遍)!
- 绝对不能用导体(导线、潮湿的手、茶或咖啡……)连接FPGA上任何裸露的引脚、插针。
2.1.2 龙芯计算机系统能力培养远程实验平台
“龙芯计算机系统能力培养远程实验平台”(以下简称“远程实验平台”)采用远程使用的方式。在该实验平台中,多块FPGA开发板构成的开发板阵列(如图2.3所示)以服务器的形式置于云端,使用者在本地通过网络登录到FPGA服务器上,间接完成对FPGA的操作。
使用者可以在交互模式的网页上看到一个虚拟的FPGA板卡操作界面(如图2.4所示)。这个界面中的图标对应FPGA板卡上的一些简单外设,包括:界面上部自左向右的2个数码管、16个单色LED灯,界面下部自左向右的32个拨码开关、复位开关、单步时钟开关和4个脉冲开关。当使用者在网页上点击操作界面中的开关时,该操作将通过网络发送至云端的FPGA服务器,并由服务器转换成对于硬件FPGA板卡的实际操作。同时,FPGA板卡上输出的各类信息被服务器接收后,也将通过网络反馈到使用者所看到的网页交互界面上。有关“龙芯计算机系统能力培养远程实验平台”的更多信息,可以查阅该实验平台提供的在线帮助文档。
因为本地和远程两类实验平台在具体操作内容上并无显著差异,所以本书后面有关实践任务的内容将主要针对本地实验平台进行讲解。本书配套的实践任务资料将依照实验平台的不同以不同版本发布,读者可以根据实际情况选择相应的版本。
2.2 FPGA 的设计流程
现场可编程门阵列(Field Programmable Gate Array,简称FPGA)是一种特殊的集成电路。这种特殊性体现在它的电路功能在芯片被制造出来以后,可以通过编程配置进行调整,而传统的专用集成电路(Application Specific Integrated Circuit,简称ASIC)则不具备这种特性。打个比方,传统的专用集成电路芯片设计就像是在一张纸上画画,画好之后就没办法再修改了;而FPGA芯片设计就像是在黑板上画画,画好以后觉得不合适可以擦掉重新画。FPGA的这种可编程的特点为我们开展数字电路、组成原理、体系结构等实验课程提供了绝佳的硬件平台。首先,它是一个实实在在的集成电路芯片,不是仿真软件下电路行为的模拟,可以让硬件实验课能够真正“硬”起来,让学习者的实践经历更加贴近工业界的实际研发工作流程。其次,在FPGA上调整设计不需要重新流片或是重新设计焊接PCB,只需要调整设计代码后重新运行一遍FPGA的综合实现流程,短到几分钟长不过数天就可以获得一个功能调整后的芯片用于调试,省时又省钱。
2.2.1 FPGA 的一般设计流程
FPGA是一种特殊的集成电路,这意味着它首先是一种集成电路。现在的集成电路绝大多数都是晶体管集成电路,大家日常接触最多的是CMOS晶体管集成电路。晶体管集成电路是什么?通俗一点来说,就是用金属导线把许许多多由晶体管构成的逻辑门、存储单元连接成一个电路,具备一定的逻辑功能。不过,各位读者设计数字逻辑电路时,是否进行过用导线连接晶体管的实验?显然没有。大家一般是用一种硬件描述语言(比如VerilogHDL)写写代码,然后运行综合软件(比如Vivado),电路就设计出来了。这一流程并不是各类课程实验中所独有的,它其实与现在工业界常见的ASIC设计流程是一致的。FPGA的设计流程一般有5个步骤:
- 电路设计。
- 代码编写。
- 功能仿真。
- 综合实现。
- 上板调试。
2.2.1.1 电路设计
首先,需要根据需求规格制定电路设计方案。例如,需求是设计一个LoongArch CPU,我们要把这个需求一步步分解、细化,得到一个能够满足需求的电路设计方案。我们要决定分成几个流水级,这里放几个触发器,那里放几个运算器,它们之间怎么连接,整个电路的状态转换行为是怎样的,等等。通常,我们将电路设计细化到寄存器传输级(Register Transfer Level,RTL)就可以了,无须精确到逻辑门级别或是晶体管级别。
2.2.1.2 代码编写
代码编写阶段的工作是把第1步中完成的电路设计方案用硬件描述语言(Hardware Description Language,HDL)表述出来,成为一种EDA工具能够看得懂的形式。本书中我们使用VerilogHDL语言。
2.2.1.3 功能仿真
功能仿真阶段的工作是对第2步中用HDL语言描述出来的设计进行功能仿真验证。所谓功能仿真验证,就是通过软件仿真模拟的方式查看电路的逻辑功能行为是否符合最初的设计需求。通常我们给电路输入指定的激励,观察电路输出是否符合预期,如果不符合则表明电路逻辑功能有错误。这种错误要么是因为第1步的电路设计就有错误,要么是第2步编写的代码不符合电路设计。发现功能错误后需要返回前面相应的步骤进行修正,然后再按照流程一步步推进。如此不断迭代,直到不再发现错误,就可以进入下一阶段了。
需要指出的是,由于我们对于电路是在RTL级建模,因此功能仿真阶段不考虑电路的延迟。
2.2.1.4 综合实现
综合实现阶段完成从HDL代码到真实芯片电路的转换过程。这个过程类似于编译器把高级语言转换成目标机器的二进制代码的过程。这个阶段分为综合和实现两个子阶段。综合阶段将HDL描述的设计编译为由基本逻辑单元连接而成的逻辑网表,不过此时的网表还不是最终的门级电路网表。实现阶段才会将综合出的逻辑网表映射为FPGA中的具体电路,即将逻辑网表中的基本逻辑单元映射到FPGA芯片内部固有的硬件逻辑模块上(称为“布局”)。随后,基于布局的拓扑,利用FPGA芯片内部的连线资源,将各个映射后的逻辑模块连接起来(称为“布线”)。
如果整个综合实现过程没有发生异常,EDA工具将生成一个比特流(Bitstream)文件。通俗来说,这个比特流文件描述了最终的电路实现,只不过这个文件是让FPGA芯片来看的。
2.2.2 基于Vivado的FPGA实现流程
前面提到的FPGA的一般设计流程中,“功能仿真”、“综合实现”和“上板调试”这三个步骤都要使用EDA工具。我们的硬件实验平台选用的是Xilinx公司的FPGA芯片,因此很自然地会使用Xilinx公司提供的Vivado集成设计开发环境。尽管Vivado这个软件的功能仿真和波形调试功能不是特别丰富,但是我们设计的CPU比较小,使用Vivado也能满足要求。如果读者进行实验的环境中还没有Vivado软件,可以参考附录B的说明安装Vivado。
Vivado针对FPGA设计提供了两种工作方式:Project方式和Non-Project方式。其中Project方式可以在Vivado的图形界面下操作或以Tcl脚本方式在Vivado Tcl Shell中运行,Non-Project方式只能以Tcl脚本方式运行,而且Non-Project方式和Project方式下的脚本中使用的命令是不同的。考虑到相比Tcl脚本这种适合大规模工程开发的进阶开发方式,图形界面操作方式更适合初学者,所以本书所述示例以及提供的配套实验环境均采用Project方式下的图形界面操作模式。
如果读者之前没有使用过Vivado软件进行FPGA的开发实现,可以参考附录C的示例来熟悉其基本使用。
2.2.3 Vivado 使用小贴士
根据以往的使用情况,我们总结了一些Vivado使用的建议如下:
- 尽量不要在运行于VMWare、VirtualBox等系统级虚拟机下的系统中安装并使用Vivado。Vivado在综合实现过程中需要较大的内存,因此在虚拟机下运行Vivado的时间会增加,而且是非线性的增加,特别是当分配给虚拟机的内存只有区区1、2GB的时候,等待的时间会长得让人难以忍受。
- 如果电脑上已经安装了Vivado,那么不需要重新安装。如果版本过低可直接升级到最新版本即可。
- 如果在裸机上安装了Linux系统,那么直接安装Linux版的Vivado即可,这比Windows版的Vivado速度要快一点。不过,这时很有可能会在FPGA下载电缆驱动的安装上出现问题。因为这方面问题的原因五花八门,请自行上网查找解决方法。不过,既然你已经在裸机上安装Linux系统了,相信你早已经有了相应的思想准备。
- 不要让工程所在位置的路径上出现中文,也不要让工程所在目录太深导致路径的长度过长。
- 电脑的用户名不要设置为中文,否则会出现各种诡异的问题。虽然在网上可以找到一些解决的方法,但并不能保证对所有问题都适用。
- 在上板调试环节如果发现Vivado不能正常识别开发板,请按照下列步骤排查:
- 检查FPGA开发板是否上电。如果确实已上电,但不放心的话,可以断电后再上一次电。
- 检查FPGA下载适配器的USB线缆是否与电脑以及适配器正常连接。
- 检查Cable Driver是否正常安装。
- 如果是在Windows系统下,若驱动正常安装,就可以在设备管理器的界面中看到“Programming cables\(\rightarrow\)Xilinx USB Cable”这样的条目。如果在设备管理器界面中找不到该条目,说明下载适配器的USB Cable的驱动未正常安装,参考下面步骤4进行安装。
- 如果是在虚拟机上安装的系统,还需要检查虚拟机软件中与USB相关的配置,确保USB全部转发到虚拟机。对于Virtualbox而言,选择“指定虚拟机\(\rightarrow\)设置\(\rightarrow\)USB设备\(\rightarrow\)添加筛选器”。(默认添加一个各个域的值都为空的USB筛选器,此筛选器将会匹配所有连接到电脑上的USB设备。)
- 如果在Windows或Linux下发现下载适配器的USB Cable 的驱动未正常安装,请参考 https://china.xilinx.com/support/answers/59128.html 安装驱动。如果该方法不行,推荐在Xilinx官网上寻找针对问题的解决方法。
- 在Vivado Tcl Console 面板下输入 disconnect_hw_server 命令,并选择“Open target\(\rightarrow\)Auto Connect”。
- 重启Vivado软件,重复步骤5。
- 重启你的电脑,重复步骤3~步骤5。
- 如果条件允许,用另外一台电脑试试该实验箱,或用另一个实验箱试试当前电脑,以确认是实验箱有问题还是电脑有问题。
2.3 任务与实践
2.3.1 本书配套实验环境
从这一章开始,我们将陆续开展一系列实践任务。这些实践任务配套的实验环境有两种获取方式:
- 方式一 读者可以将 https://gitee.com/loongson-edu/cdp_ede_local (对应本地实验箱)或 https://gitee.com/loongson-edu/cdp_ede_remote (对应远程实验平台)上本书整个配套实验环境的仓库克隆到本地的一个路径上没有中文的地方。该仓库的master分支上包含了所有实验开发环境的相关文件。
- 方式二 ,读者可以根据需要进行的实践任务expXX,从 https://gitee.com/loongson-edu/cdp_ede_local/releases (对应本地实验箱)或 https://gitee.com/loongson-edu/cdp_ede_remote\releases (对应远程实验平台)页面中直接下载压缩包 expXX.zip,将其解压到本地的一个路径上没有中文的地方。解压后的目录中将仅包括当次实践任务所需的相关文件,同时还将包括当次实践任务所需的一些生成文件。
我们推荐使用第一种方式,并强烈建议读者采用git工具对自己的开发过程进行代码版本管理。不过在大多数情况下,采用方式一开展实践任务时,需要读者根据待完成的实践任务配置func测试程序的功能测试点,自行编译func程序,重新配置FPGA验证环境中的指令RAM。具体的操作步骤我们会随着实验进度的展开详细介绍。
上述方式中引入的编译func程序环节会要求读者在本地具有Linux环境,如果有读者对此感到为难,则可以考虑使用方式二开展实验任务。采用这种方式时,尽管很多实践任务的配套环境有很大部分(甚至是全部)都是一样的,我们也还是建议读者每个实践任务单独解压一个目录。虽然原始低效,但也不失为一种可行的版本管理方法。
2.3.2 实践任务1:跑马灯
完成本章的学习后,请读者完成以下实践任务:
- 用实验环境中提供的三个文件:led.v(设计文件)、led.xdc(约束文件)和testbench.v(测试文件),构建Vivado工程,完成跑马灯设计的仿真和上板。
为完成以上实践任务,需要参考的文档包括但不限于:
请参照第2.3.1节中介绍的方式获取本次实践任务所需的实验开发环境。具体的实验环境位于 dc_env/exp1/ 目录下,其目录结构如下:
|--led.v 跑马灯的设计源文件
|--led.xdc 跑马灯的设计约束文件
|--testbench.v 跑马灯的仿真源文件