ARTICLE DETAIL

资讯详情

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

图灵完备8位无符号比较器:补码加法器与Cout跳转逻辑

图灵完备8位无符号比较器:补码加法器与Cout跳转逻辑 在图灵完备里8位无符号数比较大小是很多人从单纯搭逻辑门转向小型运算单元时绕不开的一道坎。你可能已经能拼出加法器、寄存器、计算单元也能让程序计数器按顺序跑起来但一到“A大于B就跳转”这种需求就容易卡在比较器上。这个主题适合正在通关图灵完备、想自己搓ALU、或者被补码反码绕晕的玩家。核心目标很明确输入两个8位无符号数A和B输出AB、AB、AB三个结果并且要稳定、互斥、能接进后续的控制逻辑。补码和反码会在这里冒出来是因为用加法器做减法时必须把B变成补码形式但要注意无符号比较和有符号比较是两码事最高位的含义完全不同。1. 先搞懂8位无符号数比较的底层逻辑1.1 无符号数的“字典序”比较直觉8位无符号数的范围是0到255二进制从0000 0000到1111 1111。它的比较规则和比较两个十进制数没有本质区别都是从最高位往最低位看谁在更高的位上先出现1谁就更大。比如128是1000 0000127是0111 1111虽然127的低七位全是1但128的最高位是1所以无符号数里128 127。这一点非常关键因为很多从有符号数思维过来的人会下意识觉得1000 0000是负数但在无符号语境里它就是正正经经的128。在游戏里搭比较器最忌讳的就是脑子里还想着“最高位是符号位”。无符号比较时第7位只是权重为128的数值位和第0位的权重1没有性质区别。你可以把8位无符号数想象成八把不同面额的筹码最高位是128元筹码最低位是1元筹码。比较两个总额当然先看有没有128元筹码再看64元、32元依次往下。这个直觉能帮你理解后面逐位扫描比较器为什么从高位往低位扫。无符号比较的第三个输出是“等于”。等于不是简单看最高位也不是看减法结果的正负而是要求8个二进制位完全一致。很多新手搭比较器时只做了大于和小于结果等于被归到大于里或者小于里导致程序跳转逻辑出现边界错误。比如A和B都是100时减法结果是0如果只判断借位可能会误判成A不小于B于是认为AB这就错了。无符号数比较还有一个隐藏陷阱比较结果必须互斥。也就是说AB、AB、AB三个输出在任意时刻只能有一个为1不能出现两个同时为1的情况。游戏里的控制单元通常会用这些信号去驱动多路选择器或者程序计数器如果信号不互斥轻则跳转乱飞重则整个计算单元进入不确定状态。所以从设计一开始就要把等于单独拎出来用“大于 不小于且不等于”这种方式保证互斥。1.2 补码和反码为什么总在这时候冒出来用加法器实现减法时标准做法是把减数B取反再加1也就是变成B的补码。8位无符号数A减去B可以写成A (~B) 1。这里的~B就是按位取反也就是反码的数值部分再加1就得到了补码。图灵完备里通常已经有现成的8位加法器直接拿来加一下比从头搭8位全减器省事得多。所以补码反码不是故意来添乱的而是复用加法器时顺带产生的中间形态。这里必须分清一个概念无符号数的补码运算只是为了完成减法不代表A和B被当成了有符号数。比如A200B100A-B100用补码加法算~B1001 1011加A1100 1000得到1 0110 0011丢掉最高进位后是0110 0011也就是99等一下这里要仔细。200~1001~1001552001551356356-256100没错低8位是0110 0100也就是100。整个过程里B的补码只是工具最终我们看的是加法器的进位和差值而不是把B解释成-100。补码反码之所以容易混淆是因为很多人学有符号数时先接触了原码、反码、补码就以为只要看到取反加一就是在处理负数。其实在无符号比较器里取反加一只是“减去B”的实现技巧。真正涉及有符号比较时才需要关心符号位、溢出、负数补码这些概念。把这两件事分开你的思路会清晰很多。我见过不少玩家在比较器关卡里卡了半天就是因为把无符号减法借位和有符号补码比较混在一起结果越调越乱。另外补码还有一个很实用的性质在8位加法器里A (~B) 1的最终进位Cout可以反过来判断A和B的大小关系。当A B时加法结果会超过或等于256Cout为1当A B时结果不到256Cout为0。这个性质是无符号比较器最省门的核心后面实操部分会详细展开。1.3 比较器的三种输出与互斥关系一个完整的8位无符号比较器建议至少定义三个输出GT表示ABEQ表示ABLT表示AB。输入则是A[7:0]和B[7:0]一共16根信号线。在图灵完备里你可以用8位输入引脚也可以用两个8位寄存器的输出。建议在组件内部先把A和B各拆成8根线方便接门电路也方便后期调试。三个输出的逻辑关系可以总结成一句话先判断是否等于再判断是否小于剩下的就是大于。用加法器方案时LT通常等于最终进位的反EQ等于差值8位全0GT等于进位为1且差值不全0。用全减器方案时LT等于最终借位EQ还是差值全0GT等于借位为0且差值不全0。两种方案的进位和借位含义相反接线时一定要看清你用的是哪一种。互斥关系不能靠“大概不会同时出现”来保证必须用逻辑门显式实现。比如GT Cout AND NOT EQ这样当AB时Cout虽然为1但EQ也为1GT被强制拉低。LT NOT Cout在AB时Cout1所以LT0。EQ单独由8位差值的NOR得到。这样三个信号天然互斥。如果你把GT直接接到Cout上就等于时GT也会为1控制单元就会误判。2. 方案选型减法借位、逐位扫描还是级联比较器2.1 减法借位法复用已有加法器最省事减法借位法是我最推荐的方案尤其在图灵完备这种已经有8位加法器的环境里。它的核心思路是A - B A (~B) 1然后用加法器的进位Cout和结果S来判断。Cout1说明A BCout0说明A B。再检查S是否全0如果S全0且Cout1就是AB。如果Cout1且S不全0就是AB。这个方案的好处是逻辑门用得少一个8位加法器加8个非门再加几个判断门就够了。为什么Cout能判断大小你可以用十进制类比。假设你有一个只能表示0到255的计数器现在要算A-B。如果AB那么A加上B的补码后结果会超过255产生进位相当于借了第9位的1。如果AB结果不到256不会产生进位说明需要向更高位借位但更高位没有所以表现为Cout0。这个“进位”和“借位”是相反的概念加法器看Cout全减器看Bout千万别搞混。减法借位法还有一个好处它天然复用了补码概念。B取反再输入加法器的最低位进位这个过程本身就是求B的补码。你在搭电路的同时也能直观看到补码是怎么参与运算的。对于后面理解有符号数比较这是一个很好的铺垫。不过要注意加法器的最低位进位必须接1不能悬空也不能接0。漏掉这个1整个减法就会变成A ~B结果永远比正确值小1等于判断也会出错。2.2 逐位扫描法从最高位开始像比分数逐位扫描法更接近人的直觉。从第7位开始比较A和B的每一位。如果之前所有高位都相等就看当前位A_i1且B_i0说明A更大A_i0且B_i1说明B更大如果当前位也相等就继续往低位看。这个过程需要维护三个状态已经确定大于、已经确定小于、仍然相等。可以用三个信号来传递从高位到低位逐级级联。逐位扫描法的优点是逻辑清晰不需要减法器也不需要理解补码。对于刚接触比较器的新手先搭一个4位逐位比较器再扩展到8位理解起来会容易很多。缺点也很明显门数偏多每一级都要处理A_i、B_i和上一级的相等信号8位下来接线会比较乱。如果你在图灵完备里追求紧凑布局逐位扫描法可能不是最优选。具体逻辑可以写成这样对于第i位GT_i GT_{i1} OR (EQ_{i1} AND A_i AND NOT B_i)LT_i LT_{i1} OR (EQ_{i1} AND NOT A_i AND B_i)EQ_i EQ_{i1} AND (A_i XNOR B_i)。初始化EQ_81GT_80LT_80。从高到低依次计算最后得到GT_0、LT_0、EQ_0。这个公式里EQ_{i1}表示“更高位全部相等”只有更高位全部相等时当前位才有决定权。一旦高位分出大小低位的比较就不再影响结果。2.3 级联比较器法模块化但门数偏多级联比较器法是把多个1位比较器串起来每个1位比较器接收A_i、B_i、上一级的GT、LT、EQ输出新的GT、LT、EQ。它和逐位扫描法本质一样只是更强调模块化。你可以在图灵完备里先做一个1位比较器组件然后复制8次级联起来。这样做的好处是调试方便哪一位出问题就查哪一级适合大工程或者需要反复复用的场景。不过级联比较器法的门数并不少。每个1位比较器都需要几个与门、或门、非门8级下来可能比加法器方案多出不少元件。图灵完备的关卡有时候对元件数量或者延迟有要求门数太多可能导致信号传播太慢或者布局拥挤到看不清线。我的建议是如果是学习理解可以用级联法如果是通关或者做实际计算单元优先用减法借位法。级联法还有一个细节信号方向。从高位到低位级联和从低位到高位级联逻辑是不一样的。比较大小必须从高位开始因为高位权重更大。如果你习惯加法器从低位到高位进位可能会顺手把比较器也做成从低位到高位那就错了。低位比较结果不能决定高位只有高位相等时低位才有意义。所以级联比较器一定要从第7位往第0位传。2.4 我的选型建议与关卡适配综合来看图灵完备里实现8位无符号比较器我首推减法借位法尤其是用8位加法器加非门的方式。它元件少、延迟低、复用现有组件而且能顺带复习补码。逐位扫描法适合教学和4位以下的小比较器。级联比较器法适合模块化大工程但要注意门数和布局。如果你正在打图灵完备里涉及比较器或者计算单元的关卡可以先看看关卡有没有提供现成的8位加法器。如果有直接用加法器方案把B取反最低位进位接1然后引出Cout和8位结果。如果没有现成加法器那就先搭一个8位加法器再拿来做比较器。很多关卡其实允许你用更少的元件通关关键就是别重复造轮子。还有一个实际考虑比较器的输出往往要接寄存器或者控制单元。组合逻辑的比较器输出可能会有毛刺尤其是在输入信号同时变化的时候。如果你的控制单元对毛刺敏感可以在比较器输出后面加一级寄存器用时钟打一拍。这样虽然多了一个时钟周期但信号稳定得多。在图灵完备里程序计数器的跳转通常是在时钟边沿触发的组合逻辑毛刺一般不会直接导致错误但如果你做的是异步控制就要小心。3. 在图灵完备里手搓8位无符号比较器3.1 引脚约定与输入输出定义开始接线之前先把引脚约定写清楚。输入端定义A[7:0]和B[7:0]A7和B7是最高位A0和B0是最低位。输出端定义GT、EQ、LT三个信号分别表示AB、AB、AB。另外建议留一个调试输出S[7:0]也就是A-B的低8位差值方便用测试用例检查。S不一定要引到组件外部但在内部调试时非常有用。在图灵完备里你可以用8位输入引脚来提供A和B也可以从两个8位寄存器取数。如果输入是寄存器要注意读取时机最好在时钟稳定后读取避免寄存器正在更新时比较器输出抖动。如果输入是开关那就可以手动逐位设置适合做静态测试。我一般会先用手动开关把A和B设成已知值验证比较器逻辑然后再接到寄存器或者计算单元的总线上。输出信号建议用LED或者探针显示。GT、EQ、LT三个信号最好各接一个LED这样测试时一眼就能看出哪个为1。如果游戏里没有LED可以用输出引脚接到后续逻辑再用其他方式观察。内部差值S也可以接8个LED这样当等于判断出错时你能直接看到S是不是全0排查起来快很多。3.2 用8位加法器完成A-B的补码运算现在进入核心接线。第一步把B的8根线分别接非门得到~B[7:0]。第二步把A[7:0]和~B[7:0]接到8位加法器的两个输入端。第三步把加法器的最低位进位Cin接常量1。这一步就是补码里的“加1”。第四步加法器输出S[7:0]和最终进位Cout。到这里你已经完成了A - B的运算。用十进制例子验证一下。假设A100B50。B的二进制是0011 0010取反得到1100 1101也就是205。A1001002051306。8位加法器只能保留低8位306-25650所以S0011 0010Cout1。ABCout1正确。再假设A50B100。B0110 0100取反1001 1011也就是155。501551206小于256Cout0S1100 1110。ABCout0正确。最后假设A100B100。B取反1001 10111001551256S0000 0000Cout1。ABS全0且Cout1正确。这里有一个容易忽略的点加法器的位宽必须是8位而不是9位。如果你用了9位加法器Cout会变成第9位的结果低8位仍然对但判断逻辑就要相应调整。图灵完备里的8位加法器通常输出8位和和一个进位直接用就行。如果你自己搭加法器记得最后一级的进位就是Cout。3.3 从Cout和差值中提取大于、小于、等于拿到Cout和S[7:0]之后判断逻辑就很简单了。先做等于判断把S的8位全部接到一个8输入NOR门或者用两个4输入NOR再与一下输出EQ。只有当S的8位全0时EQ才为1。然后做小于判断LT NOT Cout。因为Cout0表示AB所以直接取反。接着做大于判断GT Cout AND NOT EQ。当Cout1且EQ0时说明AB且A!B也就是AB。这样三个输出天然互斥。如果你手头没有8输入NOR可以用树形结构先把S0和S1或起来S2和S3或起来再把结果或起来最后取反。或者用两个4输入NOR得到两个中间信号再与一下。图灵完备里通常有现成的多输入门如果没有就用多个2输入门拼。等于判断的关键是“全部为0”不是“部分为0”所以必须是NOR不是OR。用OR再取反就是NOR逻辑上等价。还有一个细节Cout在AB时为1所以LT NOT Cout在AB时为0这没问题。但如果你的加法器进位含义和标准加法器不同比如某些自定义加法器输出的是借位而不是进位那LT和GT就要反过来。判断依据很简单拿A0、B255测试。A-B应该产生借位标准加法器Cout0所以LTNOT Cout1正确。如果测试出来LT0说明你的进位信号反了。3.4 完整接线与测试用例完整接线可以总结成一张清单B取反接加法器输入B端A直接接加法器输入A端加法器Cin接1加法器输出S接8输入NOR得到EQ加法器Cout接非门得到LTCout和EQ经过一个与门再接非门得到GT或者用Cout AND NOT EQ。最后GT、EQ、LT三个信号输出。整个电路用到的元件包括8个非门、1个8位加法器、1个8输入NOR、1个非门、1个与门。如果你把8输入NOR拆成小门数量会多一点但逻辑不变。测试用例一定要覆盖边界。我通常会用下面这组值逐个测试A0B0期望EQA0B1期望LTA1B0期望GTA255B0期望GTA0B255期望LTA128B127期望GT因为无符号数128大于127A127B128期望LTA200B150期望GTA150B200期望LTA255B255期望EQ。这些用例能覆盖最高位翻转、全0、全1、等于、大于、小于各种情况。测试时建议一次只改一个输入观察三个输出的变化。如果GT和EQ同时亮说明GT逻辑没有排除等于如果LT和EQ同时亮说明LT逻辑有问题如果GT和LT同时亮说明Cout可能悬空或者接反了。用手动开关逐位设置虽然慢但比直接接寄存器更容易定位问题。等所有用例通过后再接到寄存器或者总线上做动态测试。3.5 接入寄存器、计算单元和跳转逻辑比较器本身只是一个组合逻辑组件真正发挥作用是在接入寄存器、计算单元和跳转逻辑之后。比如你想实现“如果AB程序计数器跳转到某个地址”就可以把GT接到程序计数器的加载使能或者多路选择器的选择端。当GT1时下一个PC值来自跳转地址当GT0时PC正常加1。这里要注意时序比较器的输入如果来自寄存器那么比较结果会在时钟边沿后经过一段组合逻辑延迟才稳定。如果跳转逻辑也是在同一个时钟边沿采样可能会采到旧值。稳妥的做法是让比较结果也经过一级寄存器或者在时钟周期足够长的情况下使用。在图灵完备的“计算单元”关卡里比较器经常和ALU放在一起。ALU负责加减乘除和逻辑运算比较器可以看作ALU的一个扩展输出。你可以把A和B同时接到ALU和比较器根据指令选择输出GT、EQ、LT中的某一个。这样就能实现条件跳转、循环终止判断、大小排序等功能。寄存器之间的数据传递要注意总线冲突比较器只读输入不写总线所以不会冲突但它的输出如果直接接总线最好加三态缓冲或者多路选择器。跳转逻辑方面GT、EQ、LT三个信号可以组合成各种条件。比如“大于等于”就是GT OR EQ“小于等于”就是LT OR EQ“不等于”就是GT OR LT。这些组合信号可以直接接到控制单元。注意不要用NOT EQ来表示不等于因为EQ是组合逻辑输出NOT EQ在时序上可能会有毛刺最好用GT OR LT。虽然逻辑等价但GT OR LT直接来自比较结果路径更短更稳定。4. 补码、反码、原码为有符号比较埋下伏笔4.1 原码、反码、补码的换算表既然标题里带了补码反码这里就把8位数的三种表示法理一遍。原码是最直观的最高位是符号位0表示正1表示负低7位是绝对值。反码的规则是正数与原码相同负数符号位不变低7位按位取反。补码的规则是正数与原码相同负数在反码基础上加1。补码的好处是加减法统一而且没有正零和负零的歧义。下面这张表可以帮你快速对照十进制原码反码补码50000 01010000 01010000 0101-51000 01011111 10101111 101100000 00000000 00000000 0000-01000 00001111 11110000 0000-128无法表示无法表示1000 0000从表里能看到8位原码的范围是-127到127因为它有两个零0和-0。反码同样有两个零范围也是-127到127。补码只有一个零范围是-128到127。1000 0000在补码里表示-128这是原码和反码做不到的。所以现代计算机里基本都用补码表示有符号整数。补码求原码的方法也很实用如果补码的符号位是1保持符号位不变把低7位取反加1就得到原码。比如-5的补码是1111 1011符号位1不变低7位111 1011取反得到000 0100加1得到000 0101原码就是1000 0101。或者你也可以对整个补码取反加1再补上符号位结果一样。这个方法在做有符号数比较时很有用因为有时候需要把补码还原成直观的数值来验证。4.2 8位有符号数的比较为什么不能照搬无符号8位有符号数用补码表示时范围是-128到127。最高位不再是权重128的数值位而是符号位0表示非负1表示负数。如果你把有符号数直接丢进无符号比较器结果会完全乱套。比如-1的补码是1111 1111无符号解释是2551的补码是0000 0001无符号解释是1。无符号比较会认为2551也就是-11这显然错了。有符号比较的正确规则是先看符号位。如果A的符号位是0B的符号位是1那么A肯定大于B因为A是非负数B是负数。如果A的符号位是1B的符号位是0那么A肯定小于B。如果两个符号位相同都是0或者都是1那么再比较低7位。同号时补码的低7位比较结果和无符号比较一致。比如-5是1111 1011-3是1111 1101低7位111 1011和111 1101无符号比较是251253所以-5-3正确。还有一种更通用的方法用有符号减法A-B然后看结果符号和溢出标志。如果结果为正且没有溢出或者结果为负且有溢出那么AB。如果结果为负且没有溢出或者结果为正且有溢出那么AB。等于还是看差值全0。这个方法和无符号比较的加法器方案很像只是多了溢出判断。溢出标志可以由A的符号位、B的符号位和结果符号位异或得到。不过在图灵完备里如果你只是做无符号比较不需要引入溢出判断否则电路会复杂很多。4.3 有符号比较的修正思路如果你已经搭好了无符号比较器想把它扩展成有符号比较器有两种思路。第一种是符号位优先法先比较A7和B7。如果A70且B71直接输出GT如果A71且B70直接输出LT如果A7B7再把A[6:0]和B[6:0]送进无符号比较器用低位比较结果作为最终结果。这种方法思路清晰但需要两个比较器和一些多路选择逻辑。第二种是减法溢出修正法直接用有符号减法A-B得到差S和进位Cout然后计算溢出V。对于有符号减法溢出V (A7 AND NOT B7 AND NOT S7) OR (NOT A7 AND B7 AND S7)。有符号GT NOT (S7 XOR V)有符号LT S7 XOR V有符号EQ EQ。这个公式看起来有点绕但实际接线不算多。如果你对溢出标志不熟悉建议先用符号位优先法更容易理解和调试。在图灵完备里有符号比较通常出现在后面的关卡或者自定义计算机里。如果你只是想过“8位无符号数比较大小”这一关先把无符号比较器吃透。等你想做更复杂的指令集时再回过头来处理有符号比较。补码和反码的知识在这里就派上用场了你需要知道1111 1111是-1而不是255才能正确解释比较结果。4.4 无符号与有符号比较对照表为了更直观下面这张表对比几种典型情况A二进制B二进制无符号比较有符号比较补码1111 11110000 0001A B2551A B-111000 00000111 1111A B128127A B-1281271111 10111111 1101A B251253A B-5-30000 01011111 1111A B5255A B5-11000 00001000 0001A B128129A B-128-127这张表能帮你快速检查自己的比较器是否有符号/无符号混用。尤其是第一行和第四行无符号和有符号的结果完全相反。如果你在调试时发现“明明A更大输出却小于”很可能就是输入被当成了有符号数。检查一下最高位有没有被特殊处理或者有没有错误地接入了有符号比较逻辑。5. 常见问题与排查技巧实录5.1 借位信号反了小于变大于最常见的坑就是借位信号接反。用减法器方案时最终借位Bout1表示ABBout0表示AB。用加法器方案时最终进位Cout1表示ABCout0表示AB。两种方案正好相反。如果你从网上抄了一个全减器电路又用加法器的判断逻辑去接就会把大于和小于完全颠倒。排查方法很简单设A0B1看LT输出是不是1。如果不是就把进位/借位信号取反试试。还有一种情况是进位信号悬空。图灵完备里如果加法器的 Cout 没有接任何东西可能会默认为0或者不确定。你必须在 Cout 后面接一个非门得到 LT或者接判断逻辑。悬空的信号在仿真里有时看起来“能用”但接上控制单元后就会出问题。我建议所有中间信号都显式接出来哪怕不接负载也接个探针或者LED方便观察。5.2 等于判断被吞掉只看了Cout第二个常见问题是等于判断丢失。很多新手只判断Cout认为Cout1就是AB。但AB时Cout也为1所以AB被误判成AB。正确的做法是先用8位差值的NOR得到EQ再用Cout AND NOT EQ得到GT。这样等于就不会被吞掉。如果你发现A和B相等时GT亮而EQ不亮先检查S[7:0]是不是真的全0。如果S不全0说明减法有问题可能是Cin没有接1或者B取反没接对。等于判断还有一个细节8位差值的NOR门输入顺序无所谓但必须所有8位都参与。如果你只接了低4位高4位悬空那么当高4位非零时EQ仍然可能为1导致误判。检查方法设A1000 0000B0000 0000S应该非零EQ应该为0。如果EQ为1说明高4位没有接入NOR。把8根线全部接进去问题就解决了。5.3 补码加1漏了结果总是差一用加法器做减法时最低位进位Cin必须接1这是补码“反码加1”里的那个1。如果漏了A~B的结果会比正确值小1。比如A100B50正确差是50漏加1后差是49。更严重的是等于判断AB时A~B255S1111 1111EQ0等于判断失败。很多人在调试时发现“大于和小于基本对就是等于不亮”十有八九就是漏了Cin1。排查方法把A和B设为相等值比如A100B100看S是不是0000 0000。如果不是检查Cin。如果S是1111 1111那就是标准的漏加1。如果S是其他值可能是B取反接错了。图灵完备里常量1很容易接但也容易忘。接完线后对着清单检查一遍B取反、A直连、Cin接1、Cout引出、S引出五件事缺一不可。5.4 常见问题速查表下面这张表可以贴在你的工程旁边出问题时逐项排查现象可能原因解决方法GT和LT同时为1Cout悬空或接反检查Cout是否接了非门和与门AB时GT为1GT没有排除EQ用Cout AND NOT EQAB时EQ为0Cin漏接1或S未全接NOR检查Cin18位S全部接NOR大于和小于完全相反进位/借位含义搞反用A0,B1测试必要时取反结果不稳定偶尔跳动组合逻辑毛刺输出加一级寄存器打拍高位数比较错误位序接反或扫描方向错确认A7/B7接最高位从高到低比较128和127比较错误把无符号当有符号无符号比较时不要处理符号位255和0比较错误全1全0边界未测试加入边界用例单独验证5.5 我在实操中踩过的坑和调试方法我自己第一次搭这个比较器时最大的坑是把加法器的Cout直接当成了GT。测试A100B100时GT和EQ同时亮我还以为是游戏显示bug后来才发现Cout在等于时也是1。加了一个NOT EQ的与门之后问题立刻解决。这个教训让我养成了一个习惯任何比较器输出都要先想清楚等于情况下的表现不能只测大于和小于。另一个坑是位序。图灵完备里的8位输入引脚有时候低位在上、高位在下或者反过来。我一开始没注意把A0接到了加法器的A7上结果比较结果完全乱套。排查方法很简单设A0000 0001B0000 0000应该是AB。如果输出AB说明最低位和最高位反了。重新按位接好即可。做8位电路时我建议在纸上画一个位序表标清楚哪根线接哪一位比在屏幕上瞎点高效得多。最后再分享一个小技巧把测试用例做成常量输入用开关逐一切换比每次改寄存器快很多。你可以在工程里放一排开关每个开关控制一位旁边接LED显示。调通静态逻辑后再把A和B换成寄存器输出做动态测试。动态测试时如果结果不对先切回静态开关确认逻辑本身没问题再查寄存器时序和总线冲突。这样分层排查能省下大量返工时间。
返回列表