这篇文章带来ECE111第二节课的Slides以及自己的一些补充。
该课程的网站如下:
第一页slide给了一个加法器的例子。该例子加法的实现方式对于初学者来说可能难以理解,实际上这是超前进位加法器。对于单比特的加法而言,使用该加法器没有意义,但是对于较高比特的加法而言,该加法器会有明显的速度优势(如果比特数过高则消耗资源过多,不太划算)。超前进位加法器主要是针对普通全加器串联时互相进位产生的延迟进行了改良,这里不详细介绍。有兴趣的朋友可以去搜索相关的资料,该课程代码写成这样只是一个引子而已,此处可暂时不掌握。
然后介绍了一个四位的加法器,该加法器就是行波进位加法器。非常的好理解,跟我们人自己算加法是差不多的,从低位算到高位,中间可能会产生进位。这页slide的重点仍然是掌握如何例化子模块,这个图使用的隐式连接,也就是没有标注出来子模块的信号名,该方法是不推荐的。因为很有可能产生连接错误。有关显示连接和隐式连接的区别可以参考显示连接与隐式连接区别的13点。
然后介绍了一下从算法层面实现两个数的加法,非常的简单。直接A+B即可。其中的assign语句是连续赋值语句,可以理解成一根线,把等号左右两侧连接起来了。该slide表明,Verilog编译器会使用默认的逻辑实现算术运算符(e.g.行波进位加法器)。大家实际做项目的时候加法直接这么写即可,目前的编译器优化一个加法还是没有问题的。当然大家可以动手,从逻辑门层面去实现自己的加法器,造个小轮子可以更加深刻的领会数字电路的神奇所在。
然后介绍了一下Verilog/SV中的数字表示方法。形式为N'Bvalue。其中的N代表有多少比特,B代表多少进制,这种写法是较为推荐的。因为可以确定用了多少比特(如果不这么写只写个数字,默认是十进制,并且多少比特是不可控的!尽管多数编译器会视作32bit,但是仍然有可能导致意想不到的错误)。所以大家一律写成标准的形式即可。如3'd6代表十进制的6,用3个比特实现。即二进制的110。
然后讲解了一下位运算的拼接操作。使用大括号实现不同信号(比特)之间的拼接。如slide所示。下划线仅仅方便阅读,没有实际意义。
然后基于位操作和实例化,将两个4位的mux拼成了一个8位的mux。
接下来讲了更多的例子。这些操作符可以参考Verilog菜鸟教程。