ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

加法器设计入门:原理图与VHDL实现全解析

加法器设计入门:原理图与VHDL实现全解析 1. 加法器到底是什么从真值表到门电路很多初次接触数字电路设计的朋友可能觉得加法器是个不起眼的小东西。毕竟现在随便一个单片机、FPGA里都集成了算术运算单元谁还需要自己动手画一个加法器但实际上加法器是整个数字系统最底层的基石。你可能没意识到CPU里的ALU算术逻辑单元核心运算就是加法减法、乘法、地址计算、计数器这些统统要依赖加法器来完成。换句话说你把加法器弄明白了数字电路的大门就推开了一半。这篇博文就围绕加法器设计展开重点讲两条路线一条是传统的原理图设计路线即用门电路符号在原理图编辑器中画出半加器、全加器并联级联成多位加法器另一条是VHDL硬件描述语言路线用代码描述逻辑功能通过仿真验证并最终下载到FPGA芯片里跑起来。两条路线对应的是两种不同的设计思维原理图偏重电路结构VHDL偏重逻辑行为两者结合理解你才能建立起完整的数字系统设计观。这篇内容适合谁看如果你正在学《数字电子技术》或者《EDA技术》课程第一次接触Quartus、ModelSim这类工具被老师布置的用原理图和VHDL分别设计一个加法器作业折磨得头疼那这篇文章就是给你准备的。哪怕你完全没碰过FPGA开发板只要跟着把逻辑捋清楚也能在软件里完成设计和仿真验证。我会尽量把每一步的原理和操作都讲透包括我在实际调试中踩过的坑。2. 加法器设计的核心逻辑半加器与全加器的关系2.1 半加器连进位的资格都没有先看最基础的半加器Half Adder。它的功能很简单把两个1位二进制数A和B相加输出本位和S以及进位Cout。两位二进制数相加只有四种情况000011101112。问题来了二进制里没有2这个数字所以11的结果要表示为本位为0向高位进1即S0Cout1。由此可以得到半加器的真值表ABS本位和Cout进位0000011010101101观察真值表你会发现一个很有意思的现象S在A和B不同的时候为1相同的时候为0这就是异或逻辑Cout只有当A和B都为1时才为1这就是与逻辑。所以半加器的逻辑表达式就是S A XOR BCout A AND B。电路结构上只需要一个异或门和一个与门简单到不能再简单。但半加器这个名字里的半字是有讲究的——它只考虑了两个加数本身的相加没有考虑来自低位的进位输入。换句话说半加器只能处理最低位的加法往上的任何一位都不能直接用半加器搞定因为高位相加时还必须加上低位的进位。这就引出了真正实用的全加器。2.2 全加器把进位链串起来才算能用全加器Full Adder在输入上比半加器多了一个信号Cin表示来自低位的进位。它要完成的任务是A B Cin输出本位和S以及向高位的进位Cout。全加器才是组成多位加法器的基本单元。全加器的真值表如下ABCinSCout0000000110010100110110010101011100111111卡诺图化简后的逻辑表达式有两种常见形式。一种是把全加器拆成两个半加器S A XOR B XOR CinCout (A AND B) OR (Cin AND (A XOR B))。这种形式在原理图设计时特别直观一个全加器差不多就是两个半加器再加一个或门。另一种是从真值表出发观察Cout的规律当A、B、Cin三个输入中至少有两个为1时Cout就为1这也对应了数字电路中经典的多数表决逻辑。从速度方面考虑Cout表达式也可以写成Cout (A AND B) OR (A AND Cin) OR (B AND Cin)这种形式更接近与或式标准型逻辑综合工具更容易优化。但初学者不必纠结性能优化先理解功能实现才是关键。2.3 多位加法器行波进位结构的本质有了全加器多位加法器就顺理成章了。以4位加法器为例把4个全加器首尾相接低位的Cout连到高位的Cin最低位的Cin直接接地因为最低位没有来自更低的进位最高位的Cout作为整个加法器的进位输出。这就是著名的行波进位加法器Ripple Carry Adder也叫串行进位加法器。这种结构理解起来非常舒服每一位的进位像波浪一样从低位向高位逐级传递。但它的缺点也显而易见——速度慢。因为高位的和必须等低位的进位稳定之后才能算出来位数越多进位链越长延迟越大。假如一个全加器的进位输出相对于输入有2个门级延迟那32位加法器最坏情况要64个门级延迟才能出结果这在高速CPU里是无法接受的。所以工程上还会用超前进位加法器Carry Look-ahead Adder这类改进结构用并行逻辑同时算出所有位的进位牺牲硬件面积换取速度。不过对于入门设计行波进位完全够用也最能帮助理解位宽扩展的基本思路。你只需要记住一个扩展规律N位加法器需要N个全加器第0位最低位的Cin固定为0第i位的Cout是第i1位的Cin。3. 原理图设计实战从放置元件到仿真通过3.1 工具选型Quartus还是Multisim说到原理图设计第一个问题就是选工具。很多高校的数字电路课程会用到Multisim或Proteus做仿真这些工具擅长模拟电路元件的封装库也很丰富画完原理图可以直接跑仿真适合纯粹验证逻辑。但是如果你最终的目标是FPGA开发那更适合用Quartus PrimeAltera/Intel家或VivadoXilinx家这些FPGA厂商的IDE自带原理图输入方式画好原理图后可以直接编译、仿真甚至生成比特流下载到板子上。这篇博文以Quartus Prime为例来讲原理图输入流程。主要原因有三点一是很多学校EDA课程用的就是Quartus二是Quartus的原理图输入模块Block Editor本身就内置了基本门电路符号不需要额外装元件库三是画好的原理图可以直接导入到同一个工程的VHDL模块中一起使用正好对接后面的VHDL设计部分。如果你手头只有Multisim逻辑流程也是一样的差别只在操作细节。需要强调一点Quartus原理图输入其实不是让你从零画门电路它更接近用现成的门电路符号搭积木。比如半加器需要的异或门XOR、与门AND在全加器里还要用到或门OR这些在基本库primitive/logic里都能直接找到。3.2 半加器原理图搭建步骤全记录用Quartus画半加器原理图整个过程大致分为五步。第一步新建工程。打开Quartus选File New Project Wizard工程名取名为half_adder顶层实体类型选择Schematic原理图类型。这一步容易踩坑的地方在于工程名、顶层文件名、实体名必须完全一致否则编译时Quartus会报错或者要求你重新指定顶层实体。我见过太多同学在这里翻车。建议工程路径不要带空格和中文一切用英文小写加下划线。第二步新建原理图文件。选File New在弹出的对话框里选Block Diagram/Schematic File点击OK。此时会出现一个图纸编辑窗口这就是Block Editor。默认的图纸大小是A4横向如果需要调整右键选择Properties在Drawing Size选项卡中修改图纸尺寸。别小看这一步我画过一张8位加法器原理图器件多了之后图纸太小根本放不下密密麻麻没法看。原理图绘制规范里第一条就是图纸大小要匹配内容规模这和网络热词里大家问的AD原理图图纸大小设置其实是同一个问题。第三步放置元件。在原理图编辑窗口空白处双击会弹出Symbol对话框。在Libraries展开路径primitives/logic选中xnor异或门和and2二输入与门点击OK放置到图纸上。放置多个实例时可以用复制粘贴快速操作。如果只想快速搜索元件也可以在Name栏直接输入元件名Quartus会自动拉取搜索结果。第四步连线并添加引脚。从原理图工具栏中选择输入引脚input和输出引脚output分别命名为A、B、S、Cout。然后用连线工具正交线连接模式效率最高把元件和引脚连接起来。连线时注意不要出现悬空导线悬空的输入在编译时会有警告。线连完后双击引脚名称可以重命名名称建议与顶层端口一致。第五步保存并编译。保存文件名为half_adder.bdfQuartus的原理图文件后缀是.bdf然后执行Processing Start Compilation开始编译。编译通过后你就可以在RTL Viewer中查看Quartus自动生成的硬件结构看它怎么理解你的原理图。这个功能很有用可以验证你的连接是否正确。3.3 全加器原理图两个半加器加一个或门有了半加器基础全加器原理图就会顺畅很多。全加器的结构正如前文逻辑表达式所示是两个半加器组合后把两个进位输出再做一次或运算得到最终进位Cout。具体连接方式是第一个半加器的A、B分别接输入A、B它的S输出接到第二个半加器的一个输入第二个半加器的另一个输入接Cin它的S输出就是最终的本位和S。两个半加器的进位输出分别接到一个或门的两个输入或门的输出作为Cout。在Quartus里如果你已经画好了半加器可以直接把半加器封装成一个符号使用这叫做层次化设计。右键半加器原理图文件选择Create Symbol Files for Current File然后在新原理图文件中双击空白处就能在Project目录下找到半加器符号。这种方式特别适合多位加法器画4位加法器时你只需要放4个全加器符号而不是重复放一堆门。连好全加器后别急着编译先检查一遍输入引脚A、B、Cin是否都正确连接输出引脚S、Cout有没有挂到正确的位置或门的两个输入是否分别来自两个半加器的进位输出。这类原理图有没有连上的问题在Allegro、AD、Quartus等工具中都是初学者最容易犯的错误。有一个简便的检查法在原理图中点住一个网络看高亮连线是否覆盖了你想要的所有路径高亮缺失就是没连上。3.4 仿真验证原理图激励波形怎么设置原理图画完编译通过只说明语法结构正确不代表功能一定正确。验证逻辑正确性的手段是仿真。Quartus支持功能仿真和时序仿真功能仿真不考虑器件延迟只验证逻辑行为时序仿真会带入布局布线后的真实延迟。对于加法器这个规模的设计功能仿真就能说明问题时序仿真一般也不会出意外。执行仿真的流程是Assignments Settings EDA Tool Settings Simulation将Simulation Mode改为Functional然后Processing Generate Functional Simulation Netlist最后新建一个Vector Waveform FileVWF文件在波形编辑器里添加输入输出端口给A、B、Cin设置合适的激励。激励设置有一个小技巧对A、B、Cin分别设置为周期性的时钟型波形但周期长度不同。比如A的周期设为40nsB设为80nsCin设为160ns这样组合出来的所有8种输入情况会以不同的时刻点出现相当于自动遍历了真值表的全部行。运行仿真后观察S和Cout的波形是否与真值表一致。我一般习惯在仿真波形上点击右键选择Bus Format快速切换显示模式或者直接把光标移到每个变化的边沿逐点核对接线情况。需要特别留意的是Quartus默认的仿真输出可能不会立即更新你需要先执行Processing Start Simulation。如果波形里所有信号都是红色或者没有数据大多数情况是Functional Simulation Netlist没生成或者仿真器路径配置有问题。4. VHDL设计初步用代码描述硬件行为4.1 VHDL到底是什么实体与架构的对应关系很多人第一次看到VHDL代码会觉得头疼又是ENTITY又是ARCHITECTURE明明一个简单的与门代码却写了十来行。但如果你换个角度理解VHDL其实没有那么神秘。它本质上是一种用文本描述硬件结构和行为的语言描述的对象依然是电路只不过把原理图里的图形符号变成了文字。VHDL设计的基本单元是实体Entity和架构Architecture两个部分这种划分方式对应了数字电路设计中的黑盒和内部结构概念。实体部分相当于原理图中元件的引脚图定义了对外接口——端口叫什么名字、什么方向输入还是输出、什么类型架构部分相当于原理图里元件内部的电路连接定义了逻辑功能是如何实现的。以半加器为例它的实体定义是这样的entity half_adder is port( A : in bit; B : in bit; S : out bit; Cout : out bit ); end entity half_adder;这里的bit类型只能取值0或1适合入门学习。到了真实工程中大家更多使用std_logic类型因为它支持Z高阻、X未知等多种状态更贴近实际硬件的电气特性。使用std_logic需要调用库library ieee; use ieee.std_logic_1164.all;这两行代码在几乎所有VHDL文件里都会出现几乎可以当作模板。架构部分的写法就灵活了可以用数据流描述直接写逻辑表达式、行为描述用进程和if/case语句、结构化描述实例化其他模块三种风格。对同一个半加器数据流风格的架构最简洁architecture data_flow of half_adder is begin S A xor B; Cout A and B; end architecture data_flow;看到没有这两行代码对应的就是半加器原理图里的异或门和与门。如果你画过原理图再看这段代码会有一种原来如此的熟悉感。4.2 半加器与全加器的VHDL实现对比全加器用VHDL实现数据流风格依然很简洁。这里给出两种写法。第一种是直接按照逻辑表达式来写直观也便于理解entity full_adder is port( A : in bit; B : in bit; Cin : in bit; S : out bit; Cout : out bit ); end entity full_adder; architecture data_flow of full_adder is begin S A xor B xor Cin; Cout (A and B) or (Cin and (A xor B)); end architecture data_flow;第二种是用行为描述方式在进程里使用when/else语句这种写法是逐行翻译真值表逻辑上不容易出错也更接近软件思维architecture behavior of full_adder is begin process(A, B, Cin) begin if (A 1 and B 1 and Cin 1) then S 1; Cout 1; elsif (A 1 and B 1 and Cin 0) then S 0; Cout 1; -- 其他情况按真值表补充 end if; end process; end architecture behavior;我建议初学者至少把两种风格都写一遍。数据流风格帮你建立逻辑表达式与硬件结构的对应关系行为风格帮你理解VHDL的顺序执行与并发执行差异。注意架构里的进程语句是顺序执行的而进程外部的信号赋值是并发执行的这是VHDL初学者最容易混淆的概念。一个进程里的if/else语句在硬件上最终会综合成多路选择器或者优先级编码逻辑并不是真的顺序执行这一点要在脑子里反复提醒自己。4.3 从半加器到4位加法器用generate批量例化有了全加器模块设计4位加法器就变成了怎么把4个模块连接起来的问题。VHDL提供了两种方式一种是手动例化component instantiation一个元件一个元件地连清晰但代码长另一种是用generate语句批量生成适合规则化的阵列结构。手动例化的方式先要声明组件component full_adder然后为每个元件起一个实例名在port map中把信号对应连起来U1 : entity work.full_adder port map( A A(0), B B(0), Cin Cin, S S(0), Cout C(1) ); U2 : entity work.full_adder port map( A A(1), B B(1), Cin C(1), S S(1), Cout C(2) );这种方式在3位、4位加法器时可以接受但如果要做32位加法器手动例化32遍绝对写到手软。所以用generate语句才是正解。generate相当于VHDL中的循环展开告诉综合器重复例化N次并按规则连接端口process: for i in 0 to 3 generate U : entity work.full_adder port map( A A(i), B B(i), Cin C(i), S S(i), Cout C(i1) ); end generate;注意这里的C是一个中间信号向量C(0)要预先赋值为0代表最低位的进位输入接地。整个设计的代码量瞬间缩短到十几行这就是描述性语言的优势——原理图设计画32位加法器能画到怀疑人生VHDL写一个for循环就完事。实体定义里端口用std_logic_vector来表示多位信号entity adder4 is port( A : in std_logic_vector(3 downto 0); B : in std_logic_vector(3 downto 0); Cout : out std_logic; S : out std_logic_vector(3 downto 0) ); end entity adder4;这里有个细节值得多说一句std_logic_vector的下标方向downto还是to决定了位序。downto表示从高到低A(3)是最高位to则反过来。坚持所有多位信号统一使用downto方向是避免后期端口连接错位的一项重要经验。我见过有人混用两种方向结果综合出来的电路功能完全不对排查了一下午。4.4 仿真与综合验证VHDL设计的完整闭环写完了4位加法器VHDL代码下一步就是仿真验证。仿真流程与原理图仿真相似但VHDL仿真更推荐使用专业的仿真工具常见的是ModelSimMentor出品Intel版随Quartus一并安装或Questa。Quartus里可以配置ModelSim路径然后一键启动。在ModelSim里仿真VHDL工程核心动作是写测试平台testbench——用VHDL写一段代码来给待测设计产生输入激励并监视输出。测试平台不参与综合只是仿真验证用语法风格和正常设计代码稍有不同。以下是一个针对4位加法器的测试平台示例演示了如何产生两组加数并自动检查输出entity tb_adder4 is end entity tb_adder4; architecture sim of tb_adder4 is signal A, B, S : std_logic_vector(3 downto 0); signal Cout : std_logic; begin UUT : entity work.adder4 port map( A A, B B, S S, Cout Cout ); process begin A 0000; B 0000; wait for 10 ns; A 0011; B 0101; wait for 10 ns; A 1010; B 0110; wait for 10 ns; A 1111; B 0001; wait for 10 ns; wait; end process; end architecture sim;A 0011十进制3加 B 0101十进制5应该得到 S 1000十进制8Cout 0A 111115加 B 00011应该得到 S 0000Cout 1。把仿真波形拉出来对照一下相加结果一目了然。综合是整个VHDL设计流程的最后关卡也是从仿真能过到硬件能跑的分水岭。在Quartus里执行Analysis Synthesis工具会把你的VHDL代码翻译成底层门级网表映射到FPGA内部的查找表LUT和触发器上。这个阶段如果出现警告需要认真阅读。常见的警告包括某个输入信号在使用时总是一个固定值某些信号被综合优化掉了synthesized away通常是因为逻辑冗余或者某个寄存器被识别为锁存器通常是因为if语句缺少else分支导致的意外推断。5. 原理图设计与VHDL设计怎么选两种思路的取舍5.1 原理图设计的特点与适用场景原理图设计最直观的优点是所见即所得——你画出来的结构就是最终硬件电路的抽象表示信号走向一目了然非常适合教学演示和中小规模逻辑设计。对于只有几个门电路的组合逻辑模块原理图方式几秒钟就能画完比写代码还要快。而且很多教材、参考设计仍然以原理图为主阅读别人画的原理图也是一项基本功。但原理图设计的缺点也很明显。第一可扩展性差位宽增加时图纸大小和连接复杂度几乎是线性增长画一个8位加法器还能勉强接受画64位加法器就完全不可行了。第二设计复用困难想在其他工程里复用某个模块只能通过生成符号Symbol的方式远不如VHDL代码复制粘贴方便。第三接口约束少原理图里连线错误编译器有时检测不出来必须靠人工反复核对在大工程里这是巨大的时间成本。第四原理图设计对版本控制不友好文本格式的代码可以用Git管理、对比差异二进制的BDF文件很难做类似的协作。5.2 VHDL设计是现代数字系统的主流选择VHDL以及Verilog之所以在现代数字系统设计中占据统治地位核心原因是它们把设计从画电路提升到了描述行为的层次。设计者不再需要关心每个门怎么连而是专注于逻辑功能本身综合工具会自动完成逻辑优化和结构映射。这听起来更像写软件但最终产出的是硬件电路——这正是硬件描述语言这个名字的含义。VHDL设计的另一个优势是跨平台可移植。一个用VHDL写的加法器模块可以轻松移植到Altera的Cyclone系列、Xilinx的Artix系列或者ASIC设计流程中只需要在顶层约束文件里做少量调整核心逻辑代码几乎不需要改动。相比之下原理图设计是跟具体工具绑定的换一个EDA软件原来的原理图文件基本就作废了。但我要说句公道话原理图设计并没有过时它在混合信号电路设计、PCB硬件设计中依然是主流方式。你去看网络热搜词里大量关于AD原理图绘制PCB原理图分析原理图分区域原理图检查有没有连上的讨论说明在实际硬件产品研发中原理图仍然是沟通设计和制造的关键载体。所以正确的态度是两种技能都要掌握原理图帮你理解电路连接关系VHDL帮你实现复杂逻辑功能。5.3 两种方法的结合层次化设计思维在实际工程中原理图和VHDL完全可以混用。Quartus等FPGA开发工具支持在一个工程中同时包含BDF原理图文件和VHDL文件顶层既可以是原理图也可以是VHDL层次之间可以互相符号化封装。这意味着你可以用VHDL写好一个功能强大的算术模块生成一个黑盒符号然后在原理图中像放置普通元件一样使用它反过来你也可以把别人提供的原理图模块封装成VHDL元件例化使用。这种层次化设计思维是工程规模日益增长的必然要求。单层原理图在几百个门电路时还能应付到了几万门的系统级设计必须分层次、分模块每层只要关注本层的功能和接口。VHDL的entity/architecture结构和原理图的symbol本质上都是接口实现的封装两者在结构层次上是统一的概念。能理解这一点你就真正入门了数字系统设计方法论。6. 常见问题排查与设计经验实录6.1 原理图设计过程中的典型问题速查问题一Quartus编译报错Top-level entity is undefined。原因是工程顶层实体没有指定为对应的BDF文件。解决方法是Assignments Settings General在Top-level entity栏里选择正确的实体名或者在工程文件列表中右键需要设为顶层的文件选择Set as Top-Level Entity。问题二原理图仿真波形文白输出全是高阻态Z。大概率是功能仿真网表没有重新生成执行Processing Generate Functional Simulation Netlist再重跑一次仿真即可。如果依然没有输出检查输入激励波形文件是否给了赋值VWF文件里没有赋值的输入信号默认保持高阻态。问题三门电路符号查找困难。Quartus自带库的路径比较复杂建议直接在Symbol对话框的Name输入框里输入门电路名称比如xnor、and3、or2不熟悉库结构也可以快速获取。另外把常用元件放进用户自定义库可以大幅提升效率。问题四图纸上的标注文字太小或者覆盖了连线。在原理图空白处右键Document Properties可以设置文本字体大小把标注文本移动到空白区域。一个规范化的原理图应当注意标注清晰、电源地线命名规范、引脚命名有意义这些习惯在以后画PCB原理图时同样重要。问题五原理图中page number重复的问题。当工程有多个原理图页面时每个页面都要单独设置页码否则导出PDF或者生产制造时会出现歧义。网络热词里有人专门问OrCAD中有2张或以上原理图页面page number都设成了1怎么办本质上是所有页面默认页码都相同导致的。在每张原理图的Title Block中修改对应的Page Number即可同时要确保总页数Sheet Total填写正确。6.2 VHDL代码常见错误和排查思路VHDL报错最常见的是Entity name does not match file name。VHDL规定实体名必须与保存的文件名一致这是因为综合工具需要根据文件名索引设计单元。强迫自己形成一个习惯文件名为adder4.vhd里面实体的名字就一定叫adder4。另一个高频问题是把std_logic_vector的信号直接用于数值比较或算术运算编译器报错Relational operator cannot be used with std_logic_vector。解决办法是引入numeric_std库然后使用无符号数类型unsigned或者有符号数类型signed。例如library ieee; use ieee.numeric_std.all; signal A : unsigned(3 downto 0); signal B : unsigned(3 downto 0); signal S : unsigned(4 downto 0); S (0 A) (0 B);这里把A和B扩展到5位再相加是为了给进位留出空间避免最高位溢出。这个细节在原理图设计里对应的是4位加法器的进位输出需要一位额外的空间来存放。很多人在仿真时发现结果不对其实不是逻辑错是位数不够截断了最高位。还有一种隐蔽问题进程中对同一个信号在多个位置赋值导致综合出多驱动或锁存器。VHDL要求一个信号在一个进程中只能有一个驱动源if语句里必须覆盖所有分支。常见的Incomplete assignment警告就是if语句缺少else。养成else分支完整、case语句加when others的习惯可以避免大多数这类问题。6.3 关于EDAPrinciple的实用心得个人经验上我认为在原理图和VHDL之间切换设计方式时最重要的是把握网络net这个核心概念。原理图里的每根导线就是一条网络VHDL里的每个信号也是网络两者在最终综合结果上是同一个东西。当你理解了网络是全局的同一个网络在所有页面、所有模块里共享同一个名称很多奇怪的错误就能想通了。比如明明在原理图两个页面里画了同名的网络以为是两个网络实际上是连接到一起了这往往会导致逻辑错误。仿真波形图是调试的好工具。我特别建议初学者花点时间掌握ModelSim的波形操作尤其是分组显示、总线值切换、加光标测量延迟这些功能。软件工具虽然看着复杂但熟练后能节省大量时间。不要只盯着数据结果看还应该观察毛刺和时序违规特别是涉及跨时钟域时稍不留神就会出现仿真功能正常、真实板上运行异常的情况。6.4 加法器的扩展思考超前进位与流水线设计加法器设计学完之后可以沿着几个方向继续深入。第一个方向是超前进位加法器Carry Look-ahead Adder它通过预先计算进位生成函数G A AND B和进位传播函数P A XOR B用额外的组合逻辑同时算出所有位的进位从而打破行波进位链的延迟瓶颈。第二个方向是流水线设计在高频数字系统中可以把N位加法器拆成多级流水线每级只处理一部分位宽在寄存器之间插入时钟节拍用延迟换取高吞吐率。第三个方向是BCD加法器即十进制编码加法在数字时钟、计算器等场景有实际应用需要加6调整逻辑。这些进阶方向听起来高大上但底层都绕不开你对半加器、全加器、进位链的理解。所以别急先把基础的加法器吃透后面的路自然会越走越宽。说到实际设计中的体会我最想强调的还是那句老话仿真通过只是第一步板级功能正确才算真正完成。加法器看似简单但管脚分配、电气特性、时序约束、电源去耦这些工程问题都会直接影响最终效果。做设计时多想一想这段代码在FPGA内部会被综合成什么电路而不是只满足于功能仿真正确这会让你的VHDL设计能力产生质的飞跃。最后再分享一个小技巧在Quartus里做完一次完整的加法器设计流程后把工程文件夹完整备份一份包括BDF、VHD、VWF和Quartus的数据库文件。等你学SPI、I2C协议设计时把加法器模块当作IP核复用你会感谢自己当初保留了一份干净可复用的设计模板。
返回列表