1. 程式人生 > >組建一臺計算機3_硬體3 多位運算器

組建一臺計算機3_硬體3 多位運算器

前言:

放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。

=========================================================================

閱讀此文,你需要擁有以下基礎:

1.小學代數相關知識;2.初中電路;3.高中閘電路相關知識;4.本系列之前兩節的內容;5.二進位制和十進位制的轉換(這一點不會也沒有關係)。

之前已經做好了一個對位加法器,對於減法和負數的運算支援的不是很好。所以現在應該研究一下負數和減法運算應該如何實現。

在解決這個問題之前,會遇到另一個問題:我們日常生活中,想表達一個負數是很自然的事情:-2,-33.2,-10等等。但是在計算機裡可不是這麼容易。首先他沒有‘-’這個符號,它所能接受,處理以及儲存的東西只有兩個——0和1.我們在大學生計算機基礎課上學過:在機器中的數字用補碼的形式儲存。但是當時沒有人深究它的原因也沒有人思考前輩們是如何想到用補碼來儲存一個數字的。非常巧,這個問題在研究減法運算的時候解決了。

如果想表示一個負數,那麼應該用某一個位來表示正負。既然我們通常愛把正負號放在數字的最左端,那麼何不把一個對位(這裡以8位舉例)的最左端的那個位的0,1狀態定位正,負的表達呢?但這意味著能表示的數的絕對值範圍縮減了一半,但是為了能達到負數的表示,這樣做是值得的——大不了把機器字長再擴大一倍。

如果現在想計算253-176是多少,也就是在計算1111 1101 – 1011 0000.

不難發現253 – 176 = 253 + ((255 - 176)+ 1) – 256。

先不用想為什麼要這樣變換,馬上就會明白。

化成二進位制之後就變成:1111 1101 +  ((1111 1111 – 1011 0000) + 0000 0001) – 1 0000 0000

首先計算括號裡的。非常明顯,1111 1111 – 1011 0000這一步是在對1011 0000取反。那麼我們用一個取反器就可以實現(8位取反器也就是8個(甚至可以壓縮至一個)非門的並聯)。最後一個減法是9位運算,只需要使之前運算的第九個進位溢位拋棄即可(當然也可以存下來)。而其他的又是我們在之前非常熟悉的純加法運算了。

這樣一來,很容易回答之前的問題——為什麼要這樣變換?——就是為了能夠把減法湊成取補和溢位拋棄這兩種閘電路運算,這樣就能讓電路能實現減法運算了。

回頭再想一想大一上學期剛剛學習過的補碼:正數不變,負數絕對值取反後加1,不正是兩個括號裡的運算嗎?

然後,負數運算器便可以順利成章的畫出來:

首先,我們要製作一個取反器:

image  image

最上方的輸入是決定是否取反,如左圖,讓取反位為1的時候,對資料取反,左邊的資料輸入為0101 0101,輸出為1010 1010.當取反位為0,則不取反,左右相同。本電路僅僅使用了‘抑或’門,它的電路圖在之前的加法器中已經做過介紹。

緊接著,我們要把之前做好的8位加法器和這個取反器相連:

image

這裡需要說明的是,兩個元件的電路圖都可以在這一篇和上一篇文章中得到。紅色框所圈的輸入位代表應該執行加法還是減法,當執行加法,位值為0,當是減法,位值為1.很顯然,當是減法的時候,輸入1,取反器對藍框輸入的數字進行取反,8位加法器對粉色框的被減數和藍色框的減數的逆進行相加,得出的值就是相減的結果。當是加法,紅色框位值為0,則取反器不取反,加法器將兩數相加。

但是一定會有人有這樣的問題:取反後的加一哪去了?我保證仔細讀下去5分鐘內你就會明白——這是這個設計的最精妙之處。

這裡還有兩處非常精妙的地方:黑框和8位加法器上方的輸入。這裡給出解釋:

1.上下溢位問題:我們應該都思考過這2個問題——如果兩個加數相加和超過了8為儲存的範圍該怎麼辦?兩數相減如果減出負數怎麼辦?這兩個問題分別成為上溢和下溢。為了解決這個問題,可以設計出黑框裡的輸出位——第9輸出位,當是減法並且下溢的時候,它會輸出1,這一點不難分析得知。當是加法並且發生上溢,他也會輸出1.這樣一來,完美的解決了這個問題。

2.進位問題:還記得之前我們如何製作8位加法器的嗎?我們把8個單位加法器相連。但是我們把最低位的那個單位加法器的進位輸入位給接地了——也就是預設為二進位制的‘個位’沒有接收到進位。但是當我們要實現減法的時候,就不是這麼輕鬆了——還記得之前那個算式嗎?對減數取反後要加上一。如何實現呢?因為如果是減法,紅框將會輸入1,那麼何不把這個‘1’加到取反之後的那個減數上呢?bingo!就這麼辦,直接把這個1當成個位的進位就好了~比如說23+45本來等於68,給他的個位進上一位就是69,自然就是+1的效果啦~

好啦,所有原理都解釋清楚了,那就試一試吧!

算一算圖靈的生日吧~他是6月23日出生,那麼我們分別計算6+23,6-23,23-6是多少。

首先6,23的二進位制分別是0000 0110和0001 0111.,下面三幅圖分別是上面三個運算:

image image image

口算一下,答案完全正確!分別是29(0001 1101),-17(m1110 1111),17(0001 0001).

需要注意的是:第二個-17正是-17的補碼——17的反碼加1.

再看看第三個結果17,對比一下-17和17的二進位制碼,再想想補碼的定義,你一定能感到非常奇妙和有趣!

最後的最後我們再來看看開始的那個問題:

253 – 176 = 253 + ((255 - 176)+ 1) – 256 = ?

用我們的運算器來做一下!

image 運算器給出的結果是0100 1101,也就是77的二進位制,口算一下。。恩。。。完全正確!

至此,我們已經做出了一個比較完善的運算器。

但是人類永遠不會滿足——我怎麼樣才能把計算的資料和結果一直存到電腦裡,這樣我就可以不擔心我能忘掉他們了。

相關推薦

組建計算機3_硬體3 運算器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

組建計算機2_硬體2 加法器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

組建計算機5_硬體5 儲存器&累加器&初始彙編(1)

閱讀此文,你需要擁有以下基礎: 1.能理解本系列第2節和第4節;2.已經閱讀了第4節。 ========================================================================= (為什麼mac總是配圖失敗呢,,)   很久沒有更新本系列了誒

組建計算機1_硬體1 單位加法器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

組建計算機4_硬體4 單位儲存器

前言: 放假有一週的時間,到家也有四五天的時間了,這幾天把《code》好好的看了一遍。儘管之前也有草草翻過,但是把時候我就曾告訴自己,無論如何都是要把書中的這些東西都實現一遍的。於是說幹就幹,這幾天基本上就在搞這些東西了。這些學習成果要感謝餘富帥給我傳的軟體以及一些推薦。 ================

centos7.5主機實現實例mysql

mariadb mysl shutdown shu config 端口 symbol starting def 實驗:一臺centos7.5主機實現多實例mysql規劃: 3306 3307 3308 端口,共3個實例目錄: /data/mysql{3306,3

電腦上單獨部署個獨立的tomcat 服務

1.首先下載tomcat (解壓版的); 2.配置環境變數 CATALINA_BASE 和  CATALINA_HOME     如圖 3.修改conf/server.xml 中的埠 <Server port

如何理解伺服器可以繫結個ip,一個ip可以繫結個域名

一個域名只能對應一個IP的意思是域名在DNS伺服器裡做解析的時候 一條記錄只能指向一個IP地址。這個是死規定,試想一下,如果一個子域名指向了2個ip ,當訪問者開啟這個域名的時候,瀏覽器是展示哪個IP上的網站呢?一個IP可以對於多個域名的意思是:一個IP繫結到一臺伺服器的時候,在伺服器上可以設定多個主機頭,每

Nginx機器上負載均衡個Tomcat

預設你的機器上安裝了Java環境,解壓了Tomcat,安裝了Nginx。預設這幾個tomcat都部署在一臺機器上。   對於Tomcat需要改三個地方【你部署的所有tomcat這三個地方都不能一樣,如果你部署在不同機器上就不用改了】 vi [你的tomcat路徑]/conf/

把資料通過串列埠或USB以1秒間隔實時發給另外計算機,在另外計算機上以同樣方式顯示條形圖或趨勢曲線。

前面兩篇文章已經講過了隨機資料產生,繪製直方圖,趨勢圖,資料儲存,串列埠傳送。接下來則是串列埠接收部分的程式。 注意:如果在一臺電腦上進行除錯,需要用虛擬串列埠軟體把串列埠1,2連結起來。 // 作業Dlg.cpp : 實現檔案 // #includ

將檔案從linux機器拷貝到的方法

首先你所操作的各臺linux機器間必須設定了ssh免密碼登入,具體方法可上網檢視。將檔案從一臺linux機器拷貝到多臺分為以下幾個步驟: 第一步:建立指令碼檔案remotecopy.sh #!/bin/bash while getopts f: OPT; do case

電腦上如何配置個版本JDK,並進行自由切換

針對單個JDK的安裝非常簡單,網上資料很多,在這裡就不作講述。接下來講一下多版本的切換,以jdk從1.7切換到1.6為例,操作步驟如下: 1.修改登錄檔:HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environm

如何在電腦上同時啟動個tomcat

學習Javaweb開發有一段時間了,在開發過程中一直用的是一個Tomcat,最近開發與同時聯調,為了不影響開發進度,本人想給他單獨開一個伺服器供他聯調使用,於是在網上找了好多資料,有的說增加環境變數C

ECS伺服器,部署(兩)應用,且應用配置不同域名

場景 產品環境伺服器有兩臺,前後端各分配一臺伺服器。現在在不增加機器的情況下,需要增加部署一套服務給臺北地區服務。 現有的前端部署方案。 產品環境部署方案詳解 實現 配置NAT步驟 ECS配置多網絡卡,以及網絡卡繫結私有IP。參考 建立NAT閘道器。 建立兩個EIP。 配置D

在安裝Win7時,出現提示“Windows無法安裝到這個磁碟。這計算機硬體可能不支援啟動到此磁碟。請確保在計算機的bios選單中啟用了磁碟的控制器。”

        博主為小白,我在通過U盤安裝win7系統的過程中遇到了很多問題。在這裡向大家分享其中之一的解決方法。        博主電腦型號:話說(ASUS) VM590Z題外話,在安裝win7時需要將U盤插入usb2.0的插口中,避免安裝過程中的USB驅動問題。接下來回

發現機器中同時執行個Oracle例項時。。。

發現一臺機器中同時執行多個Oracle例項時,最好保證 [OracleHome]/network/admin/listener.ora 檔案的 SID_LIST_LISTENER 段中 要對應每個例項都有一段宣告 其實這是個很簡單的問題,呵呵,只是偶以前一直沒留意過,今天剛剛

java實現遠端喚醒計算機

1. 在BIOS設定支援網路喚醒大多數整合網絡卡都能實現網路喚醒功能,不過需要事先進入BIOS中開啟網路喚醒功能,不同主機板的設定不一樣,以VIA 主機板為例,在BIOS中找到“OnBoard LAN”選項,將它設成“Enabled”。同時將“POWER MANAGEMENT

從微軟的萬物互聯到騰訊的三網:當今世界就是計算機

智造觀點如今,以物聯網、人工智慧、大資料、雲端計算等技術為核心的科技研究已成為了不

【Jboss】伺服器上如何部署個jboss

一臺伺服器上如何部署多個jboss呢?直接把整個部署環境copy一份到相應的目錄下?這樣只是前提,但是啟動複製後的jboss就會發現,有很多埠被佔用3873,8080,8009,8443,8083,1098,1099,4444,4445,4446等很多埠都會提示already

電腦 如何切換登入個mysql

1.電腦上有多個mysql版本,通過windows的dos視窗進行登入,因為登入埠不一樣可以使用命令mysql -P 3307 -u root -p 3307-為登入mysql的埠號然後回車,輸入密碼,如果報下面的錯誤 C:\Users\hu>mysql -P 33