从原理图到Verilog:用Quartus II 13.1完成一个全加器的两种实现与对比

发布时间:2026/6/9 3:13:57

从原理图到Verilog:用Quartus II 13.1完成一个全加器的两种实现与对比 从原理图到Verilog用Quartus II 13.1完成全加器的双路径实践在数字电路设计的入门阶段全加器就像Hello World对于编程语言一样经典。这个能完成1位二进制数带进位加法的基本单元是理解更复杂算术逻辑的基石。本文将带你在Quartus II 13.1环境中体验两种截然不同却又殊途同归的设计方法——就像用铅笔和打字机创作同一篇小说工具不同思维模式也大相径庭。1. 工程准备与环境配置在开始设计之前我们需要确保Quartus II 13.1环境已正确配置。虽然安装过程不是本文重点但有几点值得注意器件选择对于教学性质的简单设计建议选择Cyclone IV E系列的EP4CE6E22C8芯片这个型号在多数入门级FPGA开发板上都能找到工作目录避免使用包含空格或中文字符的路径这是许多仿真失败的罪魁祸首仿真设置提前确认ModelSim路径是否正确配置可在Tools Options General EDA Tool Options中检查提示首次使用时建议关闭杀毒软件实时防护某些情况下会误拦截JTAG通信创建新工程时在New Project Wizard中按以下步骤操作指定工程目录和名称如full_adder跳过添加已有设计文件的步骤选择正确的FPGA器件型号保持默认的综合工具设置完成向导2. 原理图设计可视化搭建逻辑门2.1 构建半加器基础模块原理图设计就像用乐高积木搭建电路每个逻辑门都是看得见的物理模块。新建Block Diagram文件.bdf后通过以下步骤创建半加器双击空白处或点击Symbol Tool调出元件库搜索并添加以下元件xor异或门 - 用于产生和输出and22输入与门 - 用于进位输出添加输入输出引脚输入a、b输出s和、co进位用导线连接时Quartus会自动显示连接点提示。完成后电路应呈现这样的拓扑结构a ----------- XOR ---- s | b ---- AND ---- co保存文件为half_adder.bdf后先进行编译测试CtrlL。此时可以右键点击模块选择Create Symbol File for Current File将其转换为可复用的元件。2.2 升级为全加器新建原理图文件full_adder.bdf这次我们采用层次化设计插入两个刚创建的半加器符号添加一个or2或门处理进位配置三个输入ain,bin,cin和两个输出sum,cout关键连接关系如下表所示连接点说明ain → HA1.a第一个加数输入第一个半加器bin → HA1.b第二个加数输入第一个半加器HA1.s → HA2.a半加器和输出到第二个半加器cin → HA2.b进位输入第二个半加器HA1.co → OR.a第一个半加器进位输出HA2.co → OR.b第二个半加器进位输出HA2.s → sum最终和输出OR.out → cout最终进位输出设置该文件为顶层实体后编译通过Tools Netlist Viewers RTL Viewer可以查看工具自动生成的电路结构图。有趣的是综合器可能会对原始设计进行优化比如将两个级联的异或门合并。3. Verilog实现代码描述硬件行为3.1 数据流建模实现新建Verilog HDL文件.v采用数据流风格编写全加器module full_adder( input ain, bin, cin, output sum, cout ); // 中间信号声明 wire s1, s2, s3; // 数据流赋值 assign sum ain ^ bin ^ cin; // 三位异或 assign s1 ain bin; // 与操作1 assign s2 ain cin; // 与操作2 assign s3 bin cin; // 与操作3 assign cout s1 | s2 | s3; // 或操作 endmodule这种写法直接反映了布尔代数表达式综合后得到的电路与原理图设计基本一致。保存文件后设置为顶层实体编译后查看RTL视图会发现工具生成的电路结构可能比原理图版本更规整。3.2 行为级建模对比为了展示Verilog的灵活性我们再尝试一种更抽象的写法module full_adder_beh( input ain, bin, cin, output reg sum, cout ); always (*) begin {cout, sum} ain bin cin; // 位拼接实现全加 end endmodule这种看似简单的加法操作实际上综合器会将其转换为与前两种设计等价的硬件结构。通过Technology Map Viewer可以观察到虽然代码更简洁但底层仍然由LUT查找表和逻辑门实现。4. 功能验证与实现对比4.1 仿真测试方法创建Vector Waveform File.vwf添加测试激励为三个输入ain, bin, cin设置所有8种可能的组合运行仿真后检查sum和cout输出对比预期真值表ainbincinsumcout0000000110...............11111注意仿真前确保Simulation Input已正确设置为当前顶层实体4.2 两种方法的深度对比通过实际项目体验我们可以总结出以下关键差异维度原理图设计Verilog设计设计效率适合小型电路直观但修改繁琐代码编写快适合复杂设计可读性结构一目了然需要注释说明但抽象层次更高可维护性连线复杂后难以调试模块化设计方便迭代可移植性依赖特定EDA工具代码可跨平台复用综合结果完全按设计实现受综合器优化策略影响较大学习曲线入门简单需要理解硬件描述语言概念在资源利用率方面两种实现最终占用的LE逻辑单元数量通常相同因为实现的都是相同的逻辑功能。但在时序特性上Verilog版本可能略有优势因为综合器可以进行更好的布局优化。5. 工程实践建议经过这个完整项目的实践我有几点经验分享混合使用策略在复杂设计中可以顶层用Verilog例化原理图模块兼顾直观和高效版本控制技巧Verilog文件比原理图更易于版本管理建议优先使用调试方法原理图设计时可逐步编译验证每个子模块Verilog设计时善用$display进行仿真调试性能优化关键路径考虑手动布局对时序要求高的模块可用原理图精确控制当需要将设计下载到FPGA实测时引脚分配文件.qsf的编辑其实可以直接用文本方式完成这对于需要批量修改的情况特别高效。例如set_location_assignment PIN_AB12 -to ain set_location_assignment PIN_AC12 -to bin ...最后提醒初学者全加器虽小但包含了组合逻辑设计的精髓。理解这个案例后可以尝试扩展为串行进位加法器或者探索超前进位等优化技术这些都是很好的进阶练习。

相关新闻