1. 为什么计组实验离不开Quartus II?

如果你正在学习计算机组成原理,或者任何数字逻辑相关的课程,那么“计组实验”这个词对你来说肯定不陌生。这些实验通常要求你设计一个CPU部件,比如一个简单的ALU(算术逻辑单元),或者一个状态机控制器。纸上谈兵总是容易的,但怎么验证你的设计真的能工作呢?这时候,你就需要一个强大的工具,把抽象的电路图或者代码,变成实实在在可以验证的逻辑。Quartus II,就是Intel(以前是Altera)公司为这个目的打造的“神器”。

简单来说,Quartus II是一个FPGA/CPLD开发套件。FPGA你可以理解为一堆可以随意连接的门电路和触发器,而Quartus II就是那个帮你“画”连接图、并最终把这张图“烧录”进FPGA芯片里的软件。对于计组实验,我们往往不需要真的去买一块FPGA开发板,Quartus II自带的功能仿真和时序仿真功能,就足以让我们在电脑上验证设计的正确性。我当年做实验的时候,就是靠着它,一步步从连一个与非门都手忙脚乱,到最后能搭出一个简单的单周期CPU模型。这个过程,Quartus II就像你的数字实验室,所有的门电路、寄存器、时钟信号,都任你摆布。

很多同学一开始会被它的英文界面和复杂的菜单吓到,觉得这软件“不友好”。其实不然,一旦你掌握了几个核心流程——新建项目、画原理图、做仿真——你就会发现,它逻辑非常清晰。我们这篇文章的目标,就是帮你绕开我当年踩过的那些坑,用最直白的方式,带你走完一个完整的计组实验流程。我们会以Quartus II 9.0sp2 Web Edition(一个经典且资源丰富的免费版本)为例,手把手操作。放心,即使你完全是零基础,跟着做下来,也能独立完成你的第一个数字电路设计。

2. 第一步:搭建你的数字工作台——新建项目

万事开头难,但在Quartus II里,新建项目是最好上手的一步。你可以把这个过程理解为:你要开始做一个大模型了,首先得给你的模型起个名字,找个地方(文件夹)放它,并且告诉软件你这个模型的“顶层”是什么。

启动Quartus II后,别急着到处点。找到菜单栏的 File -> New Project Wizard...。没错,是“向导”,它会一步步引导你。第一个页面是介绍,直接点“Next”。

接下来是关键的三步:

  1. 工作目录与项目名:Working Directory 就是你打算把这个项目所有文件放在哪个文件夹。我强烈建议你为每个实验单独建一个文件夹,比如 D:\MyProjects\计组实验1。Project Name 就是项目名称,比如我们设计一个D触发器,就叫 DFLOP。这里有个血泪教训:千万不要用中文和空格! 最好只用英文字母、数字和下划线。因为很多底层工具对中文路径支持不好,编译时可能报一些莫名其妙的错误。Top-Level Design Entity 通常和项目名一致,也填 DFLOP 即可。
  2. 添加设计文件:如果你已经有画好的原理图(.bdf文件)或者写好的代码(.v文件),可以在这里添加。但我们是从零开始,所以这里直接点“Next”,跳过。
  3. 选择目标器件:这是很多新手会卡住的地方。因为我们只是做仿真,并不需要实际下载到某块具体的FPGA开发板上,所以器件的选择可以“随意”一点。在 Family 里,选择一个比较通用的系列,比如 Cyclone II。然后在 Available devices 里,随便选一个逻辑单元(LE)数量足够的器件,比如 EP2C5T144C8。记住它的型号,后续如果有需要,我们可以在设置里改。最后一直“Next”到完成。

项目创建好后,你的主界面左边会有一个 Project Navigator,里面显示你的项目层级。现在,你的数字工作台就搭好了,一个空的项目框架已经建立。接下来,我们就要在这个框架里“造东西”了。

2.1 理解项目文件:.qpf与.qsf

保存项目后,你会发现工作目录里多了几个文件。最重要的两个是:

  • .qpf文件:Quartus II项目文件。双击它就能直接打开整个项目。我们常说的“打开之前的项目”,就是打开这个文件。
  • .qsf文件:Quartus II设置文件。里面记录了你的器件选择、引脚分配、编译选项等所有设置。这个文件一般不用手动编辑,但如果你从别人那里拷贝项目,确保这个文件一起拷贝,否则设置可能丢失。

理解这两个文件,能帮你更好地管理你的实验。每次做完一部分工作,记得保存项目(Ctrl+S),其实就是更新了这些文件。

3. 从想法到图纸:创建你的第一张原理图

原理图设计是最直观的设计方式,特别适合计组实验入门。它就像画画一样,把逻辑门、触发器这些基本元件用线连起来。Quartus II里,原理图文件的后缀是 .bdf。

在项目中,点击 File -> New,在弹出的窗口中选择 Design Files 标签页下的 Block Diagram/Schematic File,然后点击“OK”。一个空白的绘图区域就出现了。

怎么放元件呢?看工具栏,有一个图标像 “与门” 的按钮,叫 Symbol Tool。点击它,会弹出一个巨大的元件库窗口。你可以直接在 Name 框里搜索你想要的元件。比如:

  • 搜索 and2,会找到一个2输入端的与门。
  • 搜索 not,找到非门。
  • 搜索 dff,找到D触发器。
  • 搜索 input 和 output,找到输入和输出引脚。

我们以构建一个带复位端的D触发器为例。你需要拖入的元件有:dff (一个D触发器),input (两个,分别命名为 D 和 CLK),output (一个,命名为 Q),以及 not、and2 等(用于构建复位逻辑)。把元件拖到绘图区后,用工具栏上的 Orthogonal Node Tool(画线工具)把它们按逻辑连接起来。

连接好后,最重要的一步是给输入输出引脚命名。双击 input 或 output 引脚上的 pin_name,将其改为有意义的名称,如 D, CLK, Q。这关系到后续仿真时能否正确识别信号。

画完后,按 Ctrl+S 保存。这里有个关键点:保存的文件名最好与你的顶层实体名一致。我们项目名叫 DFLOP,顶层实体也是 DFLOP,那么这张原理图就保存为 DFLOP.bdf。软件会问你是否将此文件设为顶层实体,选择“是”。这样,Quartus II就知道,你当前项目要编译的核心,就是这张图。

3.1 编译:检查你的“图纸”是否合格

画完原理图不等于完事,你得检查一下有没有连接错误。点击工具栏上那个蓝色的三角形开始按钮(Start Compilation),或者从菜单 Processing -> Start Compilation。编译过程会进行语法检查、逻辑综合、布局布线(虽然我们只仿真,但步骤一样)。

如果编译成功,下方 Messages 窗口会显示绿色的 Info: Quartus II Full Compilation was successful.。如果有错误(通常是红色 Error),会提示哪根线没接好、哪个引脚名字冲突等,根据提示回去修改即可。第一次编译成功,意味着你的数字电路在逻辑描述上没有硬伤,可以进入测试阶段了。

4. 让电路动起来:仿真波形测试

编译通过只说明电路“语法”正确,但逻辑功能对不对,必须通过仿真来验证。仿真是计组实验中最有趣也最重要的一环,你能看到信号随时间的变化,直观验证设计。

我们需要创建一个波形文件来给电路加输入信号,并观察输出。点击 File -> New,选择 Verification/Debugging Files 标签页下的 Vector Waveform File,新建一个 .vwf 文件。

一个空白的波形窗口出现后,第一步是添加你需要观察的节点。在左边空白区域双击,或者右键选择 Insert -> Insert Node or Bus...,会弹出 Node Finder 对话框。点击 List 按钮,下方会列出你原理图中所有的输入输出节点。点击 >> 按钮,把它们全部添加到右边。这样,你的 D、CLK、Q 等信号就出现在波形窗口了。

接下来是赋予输入信号值。我们需要模拟一个真实的时钟和输入数据。

  • 设置时钟CLK:单击 CLK 信号的 Value 列,会弹出一个小时钟图标,点击它,可以设置时钟周期。比如设置周期为 20ns(纳秒),占空比50%。
  • 设置数据D:单击 D 信号,你可以用左侧的工具栏手动绘制高低电平。比如,前40ns为低电平(0),后40ns为高电平(1)。更复杂的数据模式可以用计数器的值来设置。
  • 设置网格和仿真时间:在波形窗口上方,可以设置网格大小(如 10ns)和仿真结束时间(如 100ns)。这决定了你观察多长时间的波形。

信号设好后,最关键的一步来了:更改仿真模式。在菜单栏找到 Assignment -> Settings,打开设置窗口。在左侧选择 Simulator Settings。在右侧,将 Simulation mode 从默认的 Timing 改为 Functional。功能仿真只验证逻辑正确性,忽略所有门电路的延迟,非常适合初期设计验证。时序仿真则会考虑延迟,更接近真实芯片,但初期容易因延迟问题掩盖逻辑错误。

改完后,必须先点击旁边的 Generate Functional Simulation Netlist 按钮,生成功能仿真网表。这个步骤很多新手会忘,导致仿真失败。成功后会有一个提示。

最后,点击工具栏上那个带紫色三角形的运行按钮(Start Simulation)。几秒钟后,你就能看到输出 Q 的波形了!根据波形判断,你的D触发器是否在时钟上升沿采样了 D 的值?复位信号是否有效?通过观察和分析波形,你就能彻底理解自己设计的电路行为。

5. 进阶技巧:封装模块与使用总线

当你设计好一个可靠的模块(比如一个完整的ALU、一个寄存器文件),你肯定希望像搭积木一样,在更大的设计中重复使用它。这就需要封装。

假设你已经在一个项目中完成了 DFLOP.bdf 的设计和仿真,验证无误。现在你想在一个新的项目里使用这个D触发器。你需要先把它封装成一个“黑盒子”符号。

  1. 打开你的 DFLOP.bdf 文件。
  2. 点击菜单 File -> Create/Update -> Create Symbol Files for Current File。
  3. 软件会提示创建成功,生成一个 DFLOP.bsf 文件。

这个 .bsf 文件就是封装好的符号。现在,你可以在任何新的原理图项目中,像调用与门、非门一样调用它了。在 Symbol Tool 的元件库中,切换到 Project 目录,你就能找到自己刚封装的 DFLOP 符号,拖出来用即可。切记:原始的 .bdf 和生成的 .bsf 文件需要放在新项目能找得到的路径下(通常放在同一目录最省事),并且不要删除它们。

另一个计组实验常见的需求是处理多位数据,比如8位、16位的总线。在Quartus II原理图中,总线用一根粗线表示。

  • 创建总线:放置一个 Input 引脚,命名时用类似 D[7..0] 的格式,表示一个8位从D7到D0的输入总线。画线时,用 Orthogonal Bus Tool 来画粗的总线。
  • 连接总线与单线:总线需要和具体的逻辑门连接时,需要引出单根线。使用 Orthogonal Node Tool 从总线上拉出一根细线,软件会自动提示你输入要连接的是哪一位(比如 D[0])。反向操作也一样,多根单线可以通过一个 Bus 符号合并成总线。 掌握总线和模块封装,你就能构建越来越复杂的系统,比如将8个D触发器封装成一个8位寄存器,再将多个寄存器与ALU连接,逐步向一个真正的CPU核心迈进。

6. 避坑指南与高效操作心得

走完整个流程,你可能觉得也就那么回事。但实际做实验时,总会遇到一些让人抓狂的小问题。这里分享几个我踩过的坑和总结的技巧,希望能帮你节省时间。

编译报错“Can‘t find design entity”:这通常是因为顶层设计实体设置错了。确保你保存的 .bdf 文件名与顶层实体名一致,并且在 Project Navigator 的顶层(Top-Level Entity)是正确的。可以右键点击你的 .bdf 文件,选择 Set as Top-Level Entity。

仿真结果全是红线(未知状态):这多半是仿真设置问题。首先检查是否执行了 Generate Functional Simulation Netlist。其次,检查你的输入信号是否在整个仿真时间段内都有明确定义(不是高阻态Z)。最后,确保仿真模式是 Functional 而不是 Timing,初期先用功能仿真排除逻辑错误。

封装模块后在新项目里找不到:确保你的 .bsf 文件和当前项目的 .qpf 文件在同一个目录,或者被添加到了项目的库路径中。最保险的做法是,把模块的 .bdf 和 .bsf 文件都拷贝到新项目的目录下。

高效操作技巧:

  • 快捷键:多使用 Ctrl+S(保存),Ctrl+鼠标滚轮(缩放原理图),F9(开始编译)。
  • 节点查找器过滤:在 Node Finder 中,Filter 下拉框选择 Pins: all,可以快速列出所有引脚。
  • 波形编辑:选中一段波形区域,按 Ctrl+B 可以将其反相,快速生成测试序列。

最后,也是最重要的心态:别怕出错。Quartus II的报错信息有时不太友好,但每一次编译失败、仿真异常,都是你理解数字电路底层逻辑的绝佳机会。从点亮一个LED的逻辑,到让一串数据在寄存器间流动,这个过程本身就是计组实验最大的魅力。工具只是帮手,你的思考和设计才是核心。多动手,多试错,你很快就能从Quartus II的入门者,变成驾驭它的熟手。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐