欢迎光临散文网 会员登陆 & 注册

数字IC手撕代码-半加器、全加器

2022-03-16 14:59 作者:不吃葱的酸菜鱼  | 我要投稿

        大家好我是酸菜鱼,这个系列着重讲解数字IC或FPGA实习面试及秋招面试的高频手撕代码题 。

往期代码题:

数字ic手撕代码-导览目录 - 哔哩哔哩 (bilibili.com)

数字IC手撕代码-分频器(任意奇数分频) - 哔哩哔哩 (bilibili.com)

数字IC手撕代码-序列检测(状态机写法) - 哔哩哔哩 (bilibili.com)

数字IC手撕代码-分频器( 任意小数分频) - 哔哩哔哩 (bilibili.com)

......

完全内容,请前往导览目录查看。

半加器:

        所谓半加器,就是不考虑进位的加法器,只有两个输入和两个输出;输入A和B,输出和数sum和进位cout,半加器真值表如下:

半加器真值表

        写一个半加器其实就是把各个参数之间的关系用verilog描述出来。很容易可以得到:

从而有verilog代码:

1bit 半加器

        然而大多数公司的手撕代码完半加器和全加器后,还会让你手绘门电路,所以在这里我也提一下门电路画法。

        门电路其实很好画,知道了信号之间的与非关系,就很好处理了,比如半加器的cout就是A和B的与,直接用一个两输入与门就能连接。而sum是A和B的异或,用一个异或门就可以得到,当然也不排除公司故意不让你用异或门的情况。异或转换成与门如下:

异或会用门电路画了,那么半加器的门电路就很简单了。

全加器:

        全加器就是在半加器的基础上引入一个进位输入,总共三个输入两个输出。全加器真值表如下:

1bit全加器真值表

        这个不要背表达式,如果背表达式,正式手撕代码的时候很容易忘记,然后写错(虽然全加器很简单。)我们推导一下表达式。

        这里的输出一共有两个,一个sum,一个进位cout。sum的值是A+B+cin然后去掉进位得到的,也就是说A、B、cin 中,如果输入1的个数是奇数,则sum为1,输入1的个数为偶数(含零)则sum为0。根据这个奇偶判定,可以想到用异或操作,所以得到表达式:

        cout的值也好分析,cout是加和出来的进位,也就是说,如果A、B、cin三个数中,有两个及以上个1,则cout为1,这个容易得到表达式:

代码:

        全加器的门电路就不画了,原理和半加器是一致的,信号有点多容易弄混,所以画的时候细心一点,就没什么问题。

数字IC手撕代码-半加器、全加器的评论 (共 条)

分享到微博请遵守国家法律