跳转至

数电实验提高班入门教程

**by PB23111709 李梓煊 **

由于大家还没有数字电路开发的经验,这份教程重在提供资料与入门引导,需要同学们根据兴趣自行学习,就算其中的某些地方大家目前不懂也没关系,可能将来的某一天,当你调试完一个bug后,你会恍然大悟,原来当初这份教程说的是这个意思啊! 因此,这份资料可能不只是入门,在整个数字电路提高班的过程中,都希望你们能运用助教的一些经验,避免一些坑。。。


1.数字电路设计前瞻

此节内容比较务虚,主要意图是让大家对数字电路设计有一个宏观的视角,因此在阅读本章节时,不要纠结于具体的知识或技术,而是对整体流程有一个把握。

在数电理论课上,大家会了解FPGA(现场可编程门阵列,Field Programmable Gate Array)的一些简单知识,而在实验课中,我们则主要利用FPGA进行数字电路的设计与开发。

FPGA是一种特殊的集成电路,这种特殊性体现在它的电路功能在芯片被制造出来以后,可以通过编程配置进行调整,而传统的专用集成电路(Application Specific Integrated Circuit,简称ASIC)则不具备这种特性。打个比方,传统的专用集成电路芯片设计就像是在一张纸上画画,画好之后就没办法再修改了;而FPGA芯片设计就像是在黑板上画画,画好以后觉得不合适可以擦掉重新画。

FPGA的这种可编程的特点为我们开展数字电路、组成原理、体系结构等实验课程提供了绝佳的硬件平台。

了解了我们所使用的硬件平台后,我们从“形而上”的角度再讲讲FPGA一般设计流程,它分为五个步骤,下面我们将分别介绍。

  1. 电路设计
  2. 代码编写
  3. 功能仿真
  4. 综合实现
  5. 上板调试

1.1 电路设计

在正式编写代码之前,我们通常要对电路有一个宏观的顶层设计,比如我们要将数字电路分为几个模块,每个模块要实现哪些功能,我们要把这个需求一步步分解、细化。通常我们将电路设计细化到RTL级即可,无需精确到逻辑门级别。

根据助教的经验,我强烈建议先把电路结构设计考虑周全,再动手写代码。在实际工作中,有些人喜欢“加一点,调试一下,再加一点,再调试一下”,或许这适合于软件开发,但并不适合电路系统的设计,这是因为电路系统中,各部分往往是紧密耦合的,常常出现牵一发而动全身的情况,改动越多,出错的可能性也越大。因此,强烈建议大家一定等思路理顺了,方案成熟了再动手写代码

1.2 代码编写

代码编写阶段的工作是把第1步中完成的电路设计方案用HDL语言表述出来,成为一种EDA工具能够看得懂的形式。我们使用Verilog语言或者System Verilog语言

1.3 功能仿真

所谓功能仿真验证,就是通过软件仿真模拟的方式查看电路的逻辑功能行为是否符合最初的设计需求,仿真就是我们在数字电路中debug的最主要的方式。

通常我们给电路输入指定的激励,观察电路输出是否符合预期,如果不符合则表明电路逻辑功能有错误。这种错误要么是因为第1步的电路设计就有错误,要么是第2步编写的代码不符合电路设计。发现功能错误后需要返回前面相应的步骤进行修正,然后再按照流程一步步推进。如此不断迭代,直到不再发现错误,就可以进入下一阶段了。

1.4 综合实现

综合实现阶段完成从HDL代码到真实芯片电路的转换过程。这个过程类似于编译器把高级编程语言转换成目标机器的二进制代码的过程。这个阶段分为综合和实现两个子阶段。综合阶段将HDL描述的设计编译为由基本逻辑单元连接而成的逻辑网表,不过此时的网表还不是最终的门级电路网表。实现阶段才会将综合出的逻辑网表映射为FPGA中的具体电路,即将逻辑网表中的基本逻辑单元映射到FPGA芯片内部固有的硬件逻辑模块上(称为“布局”)。随后,基于布局的拓扑,利用FPGA芯片内部的连线资源,将各个映射后的逻辑模块连接起来(称为“布线”)。

如果整个综合实现过程没有发生异常,EDA工具将生成一个比特流(Bitstream)文件。通俗来说,这个比特流文件描述了最终的电路实现,只不过这个文件是让FPGA芯片来看的。

1.5 上板调试

在上板调试阶段,首先要将综合实现阶段生成的比特流文件下载到FPGA芯片中,随后运行电路观察其工作是否正常。

一般来说,如果出现仿真通过,上板不过的情况,多半是时序出了问题,这种情况是最难解决的,没有固定的方法,只能靠大家的聪明才智了。


小结一下,上面介绍的FPGA一般设计流程给出了总的脉络,以便同学们先建立一个正确的整体概念。因为FPGA设计流程中还包含很多细节,上面的某些地方同学们就算不理解也没关系,我们会在后续的课程中陆续介绍这些细节,以免同学们一时间难以全部消化吸收


2. Vivado的下载与使用教程

在本门课程中,我们使用Vivado帮助我们完成电路的设计。Vivado系列软件是Xilinx公司开发的数字电路设计集成环境, 主要用于将硬件描述高级语言编译实现为物理电路,并部署到对应的实验平台上,同时也是硬件描述语言代码纠错的利器。

通俗的说,vivado作用就是帮助我们将代码转变为电路,并且提供一些基础的代码检查

2.1 Vivado的下载

助教在这里主要提供两种下载方法:

  1. 助教为你准备好了下载速度较快的Vivado睿客网盘链接,安装方法请点击这里
  2. 自行前往官网下载安装,建议下载版本为2023.1或2023.2,具体教程同学们可自行上网搜索

注意事项: 1. 如果自行前往官网下载,由于某些原因,需要注意注册时学校不要选择科大,邮箱也不要使用科大邮箱,或许你可以成为thu学子( 2. 决定在 Windows 系统上装 Vivado 的同学需要注意:Vivado 会在 C 盘生成一个系统权限文件,然后检查路径合法性。此时的路径上不能有特殊字符(例如中文,空白字符,下划线等)。所以现在 C 盘用户名还是中文的同学,请在网络上查找方法将其改为英文。

2.2 基于Vivado的FPGA实现流程

Vivado具体使用流程,请参考提高班实验文档Vivado的使用 - Digital Lab Pro 2025

2.3 开发环境配置

如何为自己编写代码提供一个高效的开发环境?

主要参考普通班实验文档配置基本的开发环境3. Verilog 编程 - Digital Lab 2025

注意提高班文档中代码编写辅助工具一节中有介绍Verilator,需要在wsl下使用。 因为数字电路实验部分verilator并不是刚需,因此同学们可以不进行配置,对其感兴趣的同学可以自行探索下。


3 数字电路设计基础

3.1 Verilog编程语言基础

首先建议根据普通版的实验文档学习Verilog的基础语法实验介绍 - Digital Lab 2024

然后学习提高班的System Verilog专属特性https://soc.ustc.edu.cn/Digital-Pro/lab0/SV/

3.2 电路设计经验

本节及之后的内容主要聚焦于具体的开发经验,同学们在课程开始前无需掌握这些内容,这些经验助教会在接下来的课程学习中慢慢教给大家的

在学习过Verilog的语法后,会发现他的语法相当简单,可设计好一个数字电路,却不是一件容易的事情。这是因为语言只是一种手段,对编程语言的掌握与语言本身无关。比如C语言的语法很简单,用短时间就能学会,但能在短时间内能成为C语言编程高手吗?当然不可能。高水平的C语言编程人员在数据结构和算法方面有良好的基础,并且透彻的掌握了编译、汇编等知识。Verilog语言也是一样,要想达到比较高的Verilog编程水平,首先要有电路的意识,其次要知道不同的电路如何用Verilog语言来描述,还要知道如Vivado这样的EDA工具在仿真、综合、实现时如何对Verilog代码进行处理,这么看来,学好Verilog确实不容易。

因此,助教总结了以下经验,将在以后课程中的每节课为大家搭配实例再详细讲解:

  1. 面向硬件电路的设计方式
  2. 自顶向下的设计划分过程
  3. 行为描述的编程风格

3.3 Verilog编程经验

在这里推荐之前提高班助教马子睿学长编写的教程,如果想要掌握较高的Verilog代码能力,请大家一定反复翻阅马哥圣经。

https://github.com/USTC-System-Courses/MA-Digital-Lab-Guide

3.4 仿真的常见错误及调试方法

先鸽子一下,等大家真正开始数字电路实验,有了具体的数字电路开发经验后再介绍,大家的理解会更深刻

3.5 提高仿真效率的小技巧

理由同上