如何在mc里打造一個(gè)計(jì)算器[3] -- 乘法器

在 二進(jìn)制里如何實(shí)現(xiàn)乘法呢?? ?首先來回顧一下小學(xué)學(xué)的乘法:

把4567稱作A, 1023稱作B, 那么可以看到步驟有:
1.?A與B的每一位相乘,? ?2. 根據(jù)B的位置把相乘后的數(shù)字移動(dòng)到相應(yīng)的位置,? 3. 把移動(dòng)后的數(shù)字按位加起來
但是我們不考慮硬件部分有兩個(gè)以上的內(nèi)存器, 所以每計(jì)算好一位的乘法應(yīng)該馬上加起來, 那么稍微調(diào)整順序變?yōu)?
1.?假設(shè)原本輸出C為0,? ?2. A與B的其中一位相乘,? ?3. 根據(jù)B的位置移動(dòng)相乘后的數(shù)字,? 4. 把移動(dòng)后的數(shù)字加起來得到新的C, 返回2
把這個(gè)順序按照小學(xué)方式寫出來就是:

那么對(duì)于二進(jìn)制,? 一位的乘法過于簡單:? ?Ax0=0, Ax1=A,? 那么乘法可以用與門代替
假設(shè)? B 逐位寫成?[B3, B2, B1, B0],? 那么4bits乘法可以寫為:
A*B = (A<<0)&B0 + (A<<1)&B1 + (A<<2)&B2 + (A<<3)&B3

觀察A*B這條式子, 可以看到A的位移是每執(zhí)行一次加法就左移多一位, 那么設(shè)計(jì)部件時(shí)可以把這種位移特性考慮進(jìn)去, 那么可以設(shè)計(jì)出一個(gè)部件:

此處應(yīng)該有以下規(guī)則:? ?A = A`<<1;? ?C = C`+A`&B_i
那么一堆這樣的部件堆在一起就是乘法器了

這種結(jié)構(gòu)的乘法器叫做矩陣式乘法器 (好像是叫行列式乘法器?, 不管了)?
不過可以看到輸入是4bits, 而輸出變?yōu)?bits,? 一般考慮溢出整形的話, 乘法器只拿右邊的6個(gè)全加器組成的部分, 而左邊6個(gè)則直接扔掉? (是哪6個(gè)自己想想吧)
而對(duì)于負(fù)號(hào)的處理,? 直接把兩個(gè)負(fù)號(hào)位做xor就是輸出的負(fù)號(hào)位了

與上篇專欄說的加減法器一樣, 這個(gè)乘法器的輸出只由此時(shí)的輸入確定, 輸入改變了輸出也會(huì)改變,? 同樣也有一種只有"開始運(yùn)算"信號(hào)輸入才會(huì)開始計(jì)算的觸發(fā)型乘法器, 而那種乘法器有很大的化簡空間,? 專欄第一張圖就是一個(gè)32bits的觸發(fā)型乘法器,? 讀者可以思考一下如何化簡乘法器至最簡
下一篇先跳過除法器說一下BCD轉(zhuǎn)BIN和BIN轉(zhuǎn)BCD

為了慶祝300粉(雖然可能馬上就掉下去了),?? ?就來說一下7段數(shù)字顯示屏的ROM吧
把7段顯示分別標(biāo)上序號(hào)

那么數(shù)字4就可以表示在顯示屏上的信號(hào)為: 0011110 (1234號(hào)位的顯像管亮起來),? 同理,? 數(shù)字3的信號(hào)為? 1011011
可以觀察到,? 0011和1011011,? 0100和0011110并不存在必然的運(yùn)算關(guān)系,? 所以這時(shí)候只能夠使用ROM(只讀儲(chǔ)存器),??
以3為例: 假設(shè)輸入為A, rom在3的部分為:? ? if(A3==0, A2==0, A1==1, A0==1):?Out=1011011;? else: Out=0000000,? 添加else部分是避免3的輸出與其他數(shù)字的輸出混淆
稍微使腦細(xì)胞減少一些就可以得到:??if??(not ((A3) or (A2) or (not A1) or (not A0)) == True): Out = 1011011;? else: Out=0000000
如果將1011011與條件部分作and操作就可以免去條件操作, 于是得到:? Out_3 =?(not ((A3) or (A2) or (not A1) or (not A0))) and (1011011)
tips:? ?A and B =?not ((not A) or (not B)),? ?A = not (not A))
于是可以設(shè)計(jì)出3的ROM結(jié)構(gòu):


在這個(gè)結(jié)構(gòu)中, 只有輸入恰好為0011才會(huì)輸出1011011, 否則為000000
同理設(shè)計(jì)出0123456789的rom并把輸出結(jié)果全部作or操作就得到了7段數(shù)字顯示屏的rom部分了
整個(gè)rom都可以寫成一條算式:? ? (水字?jǐn)?shù))
Out =?not(((A3)or(A2)or(A1)or(A0))or(not1110111))or not(((A3)or(A2)or(A1)or(notA0))or(not0010010))or not(((A3)or(A2)or(notA1)or(A0))or(not1101011))or not(((A3)or(A2)or(notA1)or(not A0))or(not1011011))or not(((A3)or(notA2)or(A1)or(A0))or(not0011110))or not(((A3)or(notA2)or(A1)or(not A0))or(not1011101))or not(((A3)or(notA2)or(notA1)or(A0))or(not1111101))or not(((A3)or(notA2)or(notA1)or(not A0))or(not0010011))or not(((notA3)or(A2)or(A1)or(A0))or(not1111111))or not(((notA3)or(A2)or(A1)or(not A0))or(not1011111))
事實(shí)上,? 任何不含環(huán)狀電路的結(jié)構(gòu), 其輸出都可以用一條只包含or和not運(yùn)算的式子表示出來, 包括加減法器, 乘法器, BCD轉(zhuǎn)BIN, BIN轉(zhuǎn)BCD和除法器, 寫出來后可以直接化簡式子來達(dá)到化簡電路的效果, 但是真的太長了