Logisim實(shí)戰(zhàn):從數(shù)據(jù)表示到簡單CPU,手把手搭建計(jì)算機(jī)核心電路
1. 項(xiàng)目概述從零開始理解計(jì)算機(jī)的“語言”如果你剛開始接觸計(jì)算機(jī)組成原理可能會覺得那些二進(jìn)制、補(bǔ)碼、校驗(yàn)碼的概念離我們?nèi)粘G玫拇a、用的軟件很遠(yuǎn)。但事實(shí)上理解數(shù)據(jù)在計(jì)算機(jī)內(nèi)部是如何被表示和處理的是理解整個計(jì)算機(jī)如何工作的基石。這就好比你要學(xué)一門外語總得先認(rèn)識它的字母和基本單詞。這次我們要做的就是利用Logisim這個直觀的電路仿真工具親手搭建一些最基礎(chǔ)的數(shù)字電路來“看見”和“觸摸”計(jì)算機(jī)的數(shù)據(jù)表示。Logisim對于學(xué)習(xí)計(jì)組來說是個不可多得的好工具。它把抽象的二進(jìn)制位、邏輯門、寄存器變成了可以拖拽、連線的可視化元件。你不再需要去死記硬背“與門真值表是111”而是可以自己接上兩個開關(guān)和一個燈泡親手撥動開關(guān)觀察燈泡的亮滅來理解“與”的邏輯。這種從抽象理論到具象操作的轉(zhuǎn)變對于建立直觀理解至關(guān)重要。我們這次實(shí)驗(yàn)的核心目標(biāo)就是通過幾個經(jīng)典的實(shí)驗(yàn)案例將《計(jì)算機(jī)組成原理》課本上前幾章關(guān)于數(shù)制轉(zhuǎn)換、原反補(bǔ)碼、字符編碼、校驗(yàn)碼等知識從紙面公式變成可以運(yùn)行、可以調(diào)試的電路模型。這個實(shí)驗(yàn)非常適合兩類朋友一是正在學(xué)習(xí)計(jì)算機(jī)組成原理課程的學(xué)生無論是為了應(yīng)對實(shí)驗(yàn)課作業(yè)還是為了深化對課本知識的理解二是對計(jì)算機(jī)底層工作原理充滿好奇的自學(xué)者想要擺脫純理論的枯燥通過動手實(shí)踐來一探究竟。整個過程不需要任何實(shí)際的物理電路板只需要一臺電腦和Logisim軟件就能開啟你的計(jì)算機(jī)內(nèi)部世界探索之旅。我會基于常見的實(shí)驗(yàn)安排和教學(xué)重點(diǎn)帶你一步步拆解其中關(guān)鍵的數(shù)據(jù)表示實(shí)驗(yàn)分享從電路搭建到調(diào)試排錯的全過程心得。2. 實(shí)驗(yàn)環(huán)境準(zhǔn)備與Logisim核心操作速成工欲善其事必先利其器。在開始構(gòu)建復(fù)雜的加法器或存儲器之前我們必須先和Logisim這個工具混個臉熟。很多初學(xué)者卡在第一步不是不理解原理而是不熟悉工具的操作導(dǎo)致連線混亂、信號無法傳遞最終挫敗感滿滿。我們先花點(diǎn)時間把Logisim的核心操作邏輯和幾個必知必會的技巧搞清楚。2.1 Logisim的安裝與界面初識Logisim是一款用Java編寫的開源軟件因此你需要在電腦上先安裝Java運(yùn)行環(huán)境JRE。完成之后直接從其官網(wǎng)下載jar包雙擊即可運(yùn)行非常綠色便攜。啟動后的主界面主要分為幾個區(qū)域左側(cè)是元件庫面板像工具箱一樣分門別類地存放著各種邏輯門、導(dǎo)線、輸入輸出設(shè)備等中間大片區(qū)域是電路繪制主畫布我們在這里進(jìn)行搭建右側(cè)是屬性表當(dāng)你選中某個元件時這里可以修改它的屬性比如位寬、標(biāo)簽名稱等。首先你需要建立的第一個重要認(rèn)知是Logisim中的電路是分層次的。主畫布默認(rèn)打開的是一個叫“main”的電路。你可以通過“項(xiàng)目”菜單創(chuàng)建新的電路比如“加法器”、“移位器”。這些電路本身可以被打包成一個“子電路”元件然后像使用普通門電路一樣被拖放到更高層級的電路中使用。這種模塊化設(shè)計(jì)對于構(gòu)建大型實(shí)驗(yàn)項(xiàng)目至關(guān)重要。我建議在實(shí)驗(yàn)開始時就規(guī)劃好電路模塊為每個核心功能創(chuàng)建獨(dú)立的子電路這樣畫布不會變得一團(tuán)糟調(diào)試時也能隔離問題。一個非常實(shí)用的技巧是善用“手形工具”和“選擇工具”。手形工具用于拖動整個畫布視圖而選擇工具用于選中和移動元件。在連線時Logisim會自動在導(dǎo)線交叉且連接的地方顯示一個圓點(diǎn)沒有圓點(diǎn)則表示只是跨過而未連接。務(wù)必注意這些連接點(diǎn)這是排查電路不通時第一個要檢查的地方。2.2 核心元件庫詳解與位寬設(shè)置要點(diǎn)左側(cè)的元件庫是我們所有的“磚瓦”。幾個最常用的庫需要重點(diǎn)掌握導(dǎo)線庫提供普通導(dǎo)線和總線??偩€用于傳輸多位數(shù)據(jù)比如8位、16位。在放置總線時務(wù)必在屬性表中設(shè)置正確的“數(shù)據(jù)位寬”這是后續(xù)所有操作的基礎(chǔ)。門電路庫包含與、或、非、異或等所有基本邏輯門以及多輸入的門電路。拖出門后同樣可以在屬性中設(shè)置輸入端口數(shù)量和位寬。例如你可以設(shè)置一個2輸入、8位寬的與門它會對兩個8位向量的每一位分別進(jìn)行與操作。** plexer庫**包含多路選擇器、解碼器、分路器等組合邏輯元件。多路選擇器MUX在數(shù)據(jù)通路中選擇信號時極其常用。算術(shù)庫這里有加法器、減法器、比較器、移位器等。我們實(shí)驗(yàn)的核心之一——可控加減法器就會直接用到這里的加法器元件或者用更基礎(chǔ)的門電路來構(gòu)建它。存儲器庫包含觸發(fā)器、寄存器、RAM、ROM等。做存儲器實(shí)驗(yàn)或需要暫存數(shù)據(jù)時必不可少。輸入輸出庫這是你和電路交互的窗口。包括針腳用于子電路接口、常量、按鈕、開關(guān)、鍵盤、LED、七段數(shù)碼管等。開關(guān)和按鈕提供輸入信號LED和數(shù)碼管用于觀察輸出結(jié)果。這里有一個貫穿始終的關(guān)鍵概念位寬一致性。Logisim中絕大多數(shù)元件都有“數(shù)據(jù)位寬”屬性。你必須保證連接到一個元件輸入端口的所有導(dǎo)線其位寬與該端口期望的位寬一致。例如如果你用一個8位寬的開關(guān)組輸出連接到另一個元件比如加法器的輸入那么加法器的輸入位寬也必須設(shè)置為8位。位寬不匹配是導(dǎo)致電路行為詭異甚至無法仿真的最常見原因之一。在開始連線前花幾秒鐘雙擊每個重要元件檢查一下位寬設(shè)置能省去后面大量的調(diào)試時間。3. 實(shí)驗(yàn)一漢字編碼轉(zhuǎn)換器的設(shè)計(jì)與實(shí)現(xiàn)很多計(jì)組實(shí)驗(yàn)都會從字符編碼開始因?yàn)樗B接了人類可讀的信息和計(jì)算機(jī)內(nèi)部的二進(jìn)制世界。其中漢字國標(biāo)碼GB2312及其相關(guān)的區(qū)位碼、機(jī)內(nèi)碼的轉(zhuǎn)換是一個非常經(jīng)典且能串聯(lián)多個知識點(diǎn)的實(shí)驗(yàn)項(xiàng)目。這個實(shí)驗(yàn)不僅能讓你理解編碼原理還能熟練掌握Logisim中常數(shù)、加法器、顯示器的使用。3.1 區(qū)位碼、國標(biāo)碼與機(jī)內(nèi)碼的關(guān)系梳理在動手畫電路之前我們必須把轉(zhuǎn)換關(guān)系的數(shù)學(xué)本質(zhì)搞清楚。對于GB2312編碼的漢字區(qū)位碼可以看作一個漢字的“坐標(biāo)”。它由一個區(qū)號1-94和一個位號1-94組成。例如“啊”字的區(qū)位碼是160116區(qū)01位。注意這里的區(qū)號和位號都是十進(jìn)制數(shù)。國標(biāo)碼為了傳輸和交換將區(qū)位碼的區(qū)號和位號分別加上32十進(jìn)制即20H得到。因?yàn)锳SCII碼中0-31是控制字符32是空格從32開始才是可顯示字符。加上32是為了避開控制字符區(qū)域?!鞍 弊值膰鴺?biāo)碼就是 (1632, 132) (48, 33)用十六進(jìn)制表示為3021H。機(jī)內(nèi)碼在計(jì)算機(jī)內(nèi)部存儲時為了與ASCII碼區(qū)分避免二義性將國標(biāo)碼的兩個字節(jié)的最高位都置為1。即分別在國標(biāo)碼的兩個字節(jié)上加上128十進(jìn)制80H。所以“啊”字的機(jī)內(nèi)碼 國標(biāo)碼3021H 8080H B0A1H。轉(zhuǎn)換公式總結(jié)如下區(qū)位碼十進(jìn)制區(qū)、位 - 國標(biāo)碼十六進(jìn)制國標(biāo)高字節(jié) 區(qū)號 20H國標(biāo)低字節(jié) 位號 20H國標(biāo)碼 - 機(jī)內(nèi)碼機(jī)內(nèi)碼 國標(biāo)碼 8080H區(qū)位碼 - 機(jī)內(nèi)碼一步到位機(jī)內(nèi)高字節(jié) 區(qū)號 A0H機(jī)內(nèi)低字節(jié) 位號 A0H因?yàn)?0H80HA0H3.2 在Logisim中搭建轉(zhuǎn)換電路理解了公式電路設(shè)計(jì)就清晰了我們需要一個輸入接口用于輸入?yún)^(qū)號和位號兩個加法器分別計(jì)算高字節(jié)和低字節(jié)以及一個輸出顯示接口。步驟一建立輸入模塊。創(chuàng)建兩個輸入引腳分別命名為“Qu”和“Wei”作為區(qū)號和位號的輸入端口。它們的位寬設(shè)置為8位因?yàn)槲覀円M(jìn)行加法運(yùn)算8位足夠表示94以內(nèi)的數(shù)。為了便于測試我們可以用兩個“常量”元件來代替手動輸入。放置兩個常量分別設(shè)置其值為16和1代表“啊”字并將其輸出連接到“Qu”和“Wei”引腳。注意常量元件的“數(shù)據(jù)位寬”也要設(shè)為8位數(shù)值格式可以選十進(jìn)制或十六進(jìn)制但心里要清楚其二進(jìn)制值。步驟二構(gòu)建加法計(jì)算模塊。從算術(shù)庫拖出兩個加法器。每個加法器有兩個輸入A, B和一個輸出Sum。對于高字節(jié)通路將“Qu”輸入連接到第一個加法器的A端。加法器的B端我們需要連接一個常數(shù)A0H即十進(jìn)制的160。在Logisim中你可以直接放置一個“常量”元件將其值設(shè)置為“0xA0”十六進(jìn)制或“160”十進(jìn)制位寬設(shè)為8位然后連接到加法器的B端。對于低字節(jié)通路完全對稱。將“Wei”輸入連接到第二個加法器的A端B端同樣連接常量0xA0。關(guān)鍵點(diǎn)加法器的“數(shù)據(jù)位寬”必須設(shè)置為8位。同時注意觀察加法器輸出是否有“溢出”標(biāo)識。因?yàn)槲覀冇?jì)算的范圍94160254小于255所以8位內(nèi)不會溢出溢出引腳可以忽略。步驟三實(shí)現(xiàn)輸出與顯示。兩個加法器的輸出就是機(jī)內(nèi)碼的高字節(jié)和低字節(jié)。我們可以用兩個“探針”或“LED陣列”來顯示它們。放置兩個“LED陣列”元件位寬設(shè)為8位分別連接到兩個加法器的輸出。LED陣列會以一排小圓點(diǎn)亮/滅的形式顯示8位二進(jìn)制值非常直觀。為了更友好地顯示我們還可以添加“十六進(jìn)制顯示器”。放置兩個“十六進(jìn)制數(shù)字顯示”元件位寬設(shè)為8位分別連接到高、低字節(jié)。這樣就能直接看到“B0”和“A1”這樣的十六進(jìn)制結(jié)果。最后為了將高低字節(jié)合并成一個16位的機(jī)內(nèi)碼輸出可以使用“隧道”標(biāo)簽。分別給高字節(jié)和低字節(jié)的輸出線命名標(biāo)簽例如“HIGH_BYTE”和“LOW_BYTE”。然后在一個新的地方放置一個“引腳”位寬設(shè)為16位在其屬性中“輸出類型”選擇“輸出”然后在“標(biāo)簽”欄輸入“HIGH_BYTE[7..0] LOW_BYTE[7..0]”。Logisim會自動將兩個8位總線合并成一個16位總線輸出。你也可以用“分路器/合并器”元件來實(shí)現(xiàn)總線合并。實(shí)操心得與排錯常量值格式Logisim中常量支持十進(jìn)制、十六進(jìn)制、二進(jìn)制等多種格式。在涉及編碼轉(zhuǎn)換時使用十六進(jìn)制如0xA0最不容易出錯也最貼近原理描述。位寬匹配再強(qiáng)調(diào)確保輸入常量、加法器、顯示器的位寬全部一致本例中均為8位。如果顯示器不亮或顯示異常首先檢查整條通路上的位寬設(shè)置。子電路封裝完成上述電路后強(qiáng)烈建議將其封裝成子電路。選中所有相關(guān)元件點(diǎn)擊“項(xiàng)目”-“添加電路”命名為“漢字機(jī)內(nèi)碼轉(zhuǎn)換器”。然后在子電路界面定義好輸入引腳區(qū)、位和輸出引腳16位機(jī)內(nèi)碼、高字節(jié)、低字節(jié)等。這樣在主電路中你就可以像一個黑盒元件一樣使用它方便后續(xù)集成到更復(fù)雜的系統(tǒng)中。測試用例除了“啊”1601 - B0A1多測幾個字比如“中”5448 - D6D0。用計(jì)算器或心算驗(yàn)證結(jié)果確保電路邏輯正確。4. 實(shí)驗(yàn)二8位可控加減法器的邏輯設(shè)計(jì)與優(yōu)化加減法器是運(yùn)算器的核心。一個“可控”的加減法器意味著它能通過一個控制信號在加法和減法功能之間切換。這個實(shí)驗(yàn)?zāi)茏屇闵羁汤斫鉁p法如何通過補(bǔ)碼轉(zhuǎn)化為加法以及如何用邏輯門來實(shí)現(xiàn)這一控制邏輯。4.1 補(bǔ)碼運(yùn)算原理與電路實(shí)現(xiàn)基礎(chǔ)計(jì)算機(jī)內(nèi)部使用補(bǔ)碼來表示有符號數(shù)最大的好處就是可以將減法運(yùn)算統(tǒng)一為加法運(yùn)算。對于兩個數(shù)A和BA - B等價于A (-B)而-B就是B的補(bǔ)碼按位取反再加1。所以一個可控加減法器的核心思想就是當(dāng)進(jìn)行加法時直接計(jì)算AB當(dāng)進(jìn)行減法時計(jì)算A(~B1)。在Logisim中我們可以利用一個控制信號Sub0表示加1表示減來控制這個過程被加數(shù)A通路直接進(jìn)入加法器。加數(shù)B通路需要經(jīng)過一個受控的變換。當(dāng)Sub0時B原樣進(jìn)入加法器當(dāng)Sub1時B需要先按位取反然后再加上1這個“加1”可以通過設(shè)置加法器的低位進(jìn)位輸入Cin為1來實(shí)現(xiàn)。4.2 逐位搭建可控加減法器電路我們不直接使用Logisim算術(shù)庫里的現(xiàn)成加法器而是從門電路開始搭建以理解其內(nèi)部構(gòu)造。這里我們采用經(jīng)典的行波進(jìn)位加法器結(jié)構(gòu)并加入控制邏輯。步驟一構(gòu)建一位全加器FA子電路。全加器有三個輸入A_i, B_i, 低位進(jìn)位C_i-1兩個輸出和S_i, 向高位進(jìn)位C_i。 其邏輯表達(dá)式為S_i A_i ⊕ B_i ⊕ C_i-1 異或C_i (A_i B_i) | ((A_i ⊕ B_i) C_i-1)新建一個子電路命名為“FullAdder”。放置三個輸入引腳A, B, Cin。放置兩個輸出引腳Sum, Cout。用異或門、與門、或門按照上述表達(dá)式搭建電路??梢韵扔?jì)算A⊕B將其結(jié)果與Cin再進(jìn)行一次異或得到Sum。同時用與門得到AB再用與門得到(A⊕B)Cin最后用一個或門將這兩個結(jié)果相或得到Cout。封裝好這個一位全加器它將是我們構(gòu)建多位加法器的基本單元。步驟二構(gòu)建8位行波進(jìn)位加法器。新建子電路“RippleCarryAdder_8bit”。放置兩個8位輸入引腳A[7..0]和B[7..0]一個1位輸入引腳Cin一個8位輸出引腳S[7..0]一個1位輸出引腳Cout表示最高位進(jìn)位。從元件庫中將剛才制作的“FullAdder”子電路拖入8次排成一排。連線將A[0]和B[0]連接到第一個全加器的A和B將外部Cin連接到第一個全加器的Cin。將第一個全加器的Sum連接到S[0]將其Cout連接到第二個全加器的Cin。以此類推串聯(lián)所有全加器。最后一個全加器的Cout連接到外部Cout引腳。這樣一個8位的行波進(jìn)位加法器就完成了。它的缺點(diǎn)是進(jìn)位信號需要從最低位依次傳遞到最高位速度較慢但結(jié)構(gòu)簡單易于理解。步驟三加入“可控”邏輯形成最終加減法器。核心在于輸入到加法器B端的數(shù)需要根據(jù)Sub信號進(jìn)行變換Sub0時為B原值Sub1時為B的反碼。新建頂層電路“ControlledALU_8bit”。放置輸入8位A8位B1位Sub。放置輸出8位Result1位Cout進(jìn)位/借位1位Overflow溢出。B輸入變換電路我們需要8個二輸入異或門。將B的每一位B[0]到B[7]分別連接到一個異或門的一個輸入端。所有異或門的另一個輸入端都連接到Sub信號。根據(jù)異或門的特性輸出 B_i ⊕ Sub。當(dāng)Sub0時輸出等于B_i當(dāng)Sub1時輸出等于~B_i因?yàn)榕c1異或等于取反。這樣我們就得到了B或者~B。連接加法器將A[7..0]連接到我們自建的8位行波進(jìn)位加法器的A端。將8個異或門的輸出連接到加法器的B端。將Sub信號直接連接到加法器的Cin輸入端。這里非常巧妙當(dāng)做減法時Sub1我們不僅將B取反通過異或門同時將Cin置為1這就完成了“取反加一”得到補(bǔ)碼的操作。當(dāng)做加法時Sub0B不變Cin0就是普通的加法。溢出判斷對于有符號數(shù)加減溢出發(fā)生在正數(shù)加正數(shù)得負(fù)數(shù)或負(fù)數(shù)加負(fù)數(shù)得正數(shù)。具體到電路可以通過檢查最高位的進(jìn)位輸入倒數(shù)第二個全加器的Cout和最高位的進(jìn)位輸出最后一個全加器的Cout是否不同來判斷。即Overflow C_in[最高位] ⊕ C_out[最高位]。你需要從加法器子電路中引出相應(yīng)的中間信號來實(shí)現(xiàn)這個異或判斷。結(jié)果輸出加法器的Sum輸出即為最終的Result。加法器的最終Cout可以作為無符號數(shù)加法的進(jìn)位或有符號數(shù)減法的借位標(biāo)志通常需要結(jié)合Sub信號解讀。注意事項(xiàng)與優(yōu)化思考子電路封裝與測試將完整的可控加減法器封裝好提供清晰的輸入輸出接口。測試時使用Logisim的“手戳”工具模擬輸入信號用LED或十六進(jìn)制顯示器觀察輸出。測試用例要覆蓋正數(shù)、負(fù)數(shù)、加法、減法、溢出、進(jìn)位等各種邊界情況。行波進(jìn)位的性能問題我們搭建的是最基礎(chǔ)的行波進(jìn)位加法器。在實(shí)際的計(jì)算機(jī)組成原理課程中你可能會進(jìn)一步實(shí)驗(yàn)“超前進(jìn)位加法器”來加速進(jìn)位鏈。這需要根據(jù)進(jìn)位生成G和進(jìn)位傳播P信號來提前計(jì)算所有位的進(jìn)位電路更復(fù)雜但速度更快。這是對加法器的一個很好的優(yōu)化方向。關(guān)于“可控”的擴(kuò)展我們這個電路只實(shí)現(xiàn)了加/減控制。一個完整的簡易算術(shù)邏輯單元ALU還會有控制信號來選擇與、或、非等邏輯運(yùn)算。你可以嘗試增加多路選擇器根據(jù)不同的控制信號碼選擇將加法器結(jié)果、邏輯運(yùn)算結(jié)果等輸出到最終結(jié)果總線上。5. 實(shí)驗(yàn)三漢明校驗(yàn)碼生成與檢錯電路設(shè)計(jì)數(shù)據(jù)在存儲和傳輸過程中可能會出錯校驗(yàn)碼就是用來檢測甚至糾正這些錯誤的。漢明碼是一種高效的線性糾錯碼它通過在數(shù)據(jù)位中插入多個校驗(yàn)位使得碼字之間存在特定的監(jiān)督關(guān)系。設(shè)計(jì)漢明碼電路能讓你深入理解奇偶校驗(yàn)、監(jiān)督關(guān)系等概念并鍛煉復(fù)雜的組合邏輯設(shè)計(jì)能力。5.1 漢明碼編碼原理與位序安排漢明碼的核心思想是將校驗(yàn)位插入到數(shù)據(jù)位中特定的位置這些位置是2的冪次方即1, 2, 4, 8...每個校驗(yàn)位負(fù)責(zé)校驗(yàn)一組特定的數(shù)據(jù)位。 以一個簡單的例子說明對4位數(shù)據(jù)位D3, D2, D1, D0進(jìn)行漢明編碼需要3位校驗(yàn)位P2, P1, P0。確定編碼后總位長滿足 2^r m r 1其中m是數(shù)據(jù)位長4r是校驗(yàn)位長。計(jì)算可得r3總位長N7。安排位序?qū)⑽恢镁幪枮?到7。校驗(yàn)位P0放在位置12^0P1放在位置22^1P2放在位置42^2。數(shù)據(jù)位按順序填入剩余位置3,5,6,7。位置1: P0位置2: P1位置3: D0位置4: P2位置5: D1位置6: D2位置7: D3確定校驗(yàn)關(guān)系每個校驗(yàn)位負(fù)責(zé)校驗(yàn)?zāi)切┪恢镁幪栔袑?yīng)二進(jìn)制位為1的所有位。P0位置1二進(jìn)制001校驗(yàn)所有位置編號第0位為1的位1,3,5,7 (即 P0, D0, D1, D3)P1位置2二進(jìn)制010校驗(yàn)所有位置編號第1位為1的位2,3,6,7 (即 P1, D0, D2, D3)P2位置4二進(jìn)制100校驗(yàn)所有位置編號第2位為1的位4,5,6,7 (即 P2, D1, D2, D3)計(jì)算校驗(yàn)位使所負(fù)責(zé)的位進(jìn)行異或運(yùn)算偶校驗(yàn)結(jié)果為0。即P0 D0 ⊕ D1 ⊕ D3P1 D0 ⊕ D2 ⊕ D3P2 D1 ⊕ D2 ⊕ D3這樣我們就得到了7位的漢明碼P2 D3 D2 P1 D1 P0 D0按位置7到1排列。5.2 在Logisim中搭建編碼與檢錯電路我們將設(shè)計(jì)兩個主要模塊編碼器根據(jù)4位輸入數(shù)據(jù)生成7位漢明碼和檢錯器根據(jù)接收到的7位碼字判斷是否出錯并定位錯誤位。步驟一搭建漢明碼編碼器電路。新建子電路“Hamming_Encoder_4bit”。放置4個輸入引腳代表原始數(shù)據(jù)位D3, D2, D1, D0通常D3為最高位。根據(jù)上面的公式我們需要用異或門來計(jì)算三個校驗(yàn)位。放置一個三輸入異或門連接D0, D1, D3其輸出即為P0。放置另一個三輸入異或門連接D0, D2, D3其輸出為P1。放置第三個三輸入異或門連接D1, D2, D3其輸出為P2。Logisim默認(rèn)可能只有兩輸入異或門你可以將兩個兩輸入異或門級聯(lián)來實(shí)現(xiàn)三輸入異或A⊕B⊕C或者使用“異或門”屬性將輸入端口數(shù)改為3。按照漢明碼的最終位序位置7到1P2, D3, D2, P1, D1, P0, D0將7個信號輸出。你可以使用一個“隧道”或“分路器”來合并這7位輸出也可以直接放置7個獨(dú)立的輸出引腳并按順序命名。封裝電路提供4位數(shù)據(jù)輸入和7位編碼輸出。步驟二搭建漢明碼檢錯譯碼電路。檢錯原理接收端重新計(jì)算三個校驗(yàn)因子SyndromeS2, S1, S0。計(jì)算方法與發(fā)送端計(jì)算校驗(yàn)位類似但這次是用接收到的所有位包括校驗(yàn)位和數(shù)據(jù)位按照同樣的監(jiān)督關(guān)系進(jìn)行計(jì)算。 對于接收到的碼字 R7, R6, R5, R4, R3, R2, R1 (對應(yīng)位置7到1)S0 R1 ⊕ R3 ⊕ R5 ⊕ R7 即P0, D0, D1, D3的位置S1 R2 ⊕ R3 ⊕ R6 ⊕ R7 即P1, D0, D2, D3的位置S2 R4 ⊕ R5 ⊕ R6 ⊕ R7 即P2, D1, D2, D3的位置如果S2S1S0 000則認(rèn)為無錯。如果不為000則其二進(jìn)制值直接指出了出錯的位置編號。例如S2S1S0101二進(jìn)制5則表示位置5即D1出錯了。新建子電路“Hamming_Decoder_7bit”。放置7個輸入引腳對應(yīng)接收到的7位漢明碼R7..R1。放置三個四輸入異或門分別按照上述公式計(jì)算S0, S1, S2。同樣可能需要用多個兩輸入異或門組合實(shí)現(xiàn)四輸入。將S2, S1, S0合并為一個3位的二進(jìn)制數(shù)這個數(shù)就是錯誤位置。可以將其連接到一個3位的輸出引腳命名為“Error_Position”。錯誤糾正可選如果想實(shí)現(xiàn)糾錯功能需要根據(jù)Error_Position的值對相應(yīng)位進(jìn)行取反。這可以通過一個3-8線解碼器和一個多路選擇網(wǎng)絡(luò)來實(shí)現(xiàn)復(fù)雜度較高。作為基礎(chǔ)實(shí)驗(yàn)通常做到檢錯并指出位置即可。無錯指示添加一個邏輯電路來判斷S2S1S0是否全為0。可以用一個三輸入或非門輸入為S2,S1,S0輸出為“No_Error”信號。當(dāng)No_Error為1時表示傳輸正確。調(diào)試技巧與深入應(yīng)用分層設(shè)計(jì)與測試先單獨(dú)測試編碼器輸入不同的4位數(shù)據(jù)手動計(jì)算或?qū)φ毡砀駲z查輸出的7位編碼是否正確。再單獨(dú)測試檢錯器可以手動修改編碼器輸出的某一位模擬傳輸錯誤輸入檢錯器觀察Error_Position輸出是否正確指出了錯誤位置??梢暬@示使用LED陣列或十六進(jìn)制顯示器來顯示輸入數(shù)據(jù)、輸出編碼、校驗(yàn)因子和錯誤位置讓整個流程一目了然。擴(kuò)展到更多數(shù)據(jù)位4位數(shù)據(jù)只是一個起點(diǎn)。你可以挑戰(zhàn)設(shè)計(jì)對8位數(shù)據(jù)需要4位校驗(yàn)位總長12位進(jìn)行漢明編碼和檢錯的電路。這需要你重新計(jì)算校驗(yàn)位的位置和監(jiān)督關(guān)系是很好的練習(xí)。理解局限性漢明碼只能糾正單比特錯誤檢測雙比特錯誤。你可以思考一下如果發(fā)生兩位錯誤你的檢錯電路會有什么表現(xiàn)如何修改電路使其能檢測但不糾正雙比特錯誤這涉及到擴(kuò)展?jié)h明碼增加一個總體奇偶校驗(yàn)位的概念。6. 實(shí)驗(yàn)四Logisim中的存儲器模型與簡單CPU數(shù)據(jù)通路初探在理解了基本的數(shù)據(jù)表示和運(yùn)算后我們可以嘗試將這些模塊組合起來形成一個最簡單的、能夠執(zhí)行指令的模型。這個實(shí)驗(yàn)通常被稱為“理想流水線設(shè)計(jì)”或“簡單CPU設(shè)計(jì)”的起點(diǎn)其核心是構(gòu)建一個將運(yùn)算器、寄存器、存儲器連接起來的數(shù)據(jù)通路。6.1 寄存器與存儲器的搭建與使用Logisim的存儲器庫提供了現(xiàn)成的寄存器Register和RAM/ROM組件我們可以直接使用。寄存器用于暫存數(shù)據(jù)。放置一個“寄存器”元件設(shè)置其位寬如8位或16位。它有一個數(shù)據(jù)輸入D一個時鐘輸入一個使能端有時叫“加載”Load以及數(shù)據(jù)輸出Q。當(dāng)時鐘上升沿到來且使能有效時輸入D的值會被鎖存到寄存器中并從Q端輸出。在簡單的同步電路中我們通常用一個全局時鐘來驅(qū)動所有寄存器。RAM隨機(jī)存取存儲器用于存儲程序和數(shù)據(jù)。放置一個“RAM”元件。你需要配置的關(guān)鍵屬性包括地址位寬決定尋址空間大小如10位可尋址1024個單元、數(shù)據(jù)位寬每個單元存儲的數(shù)據(jù)位數(shù)如8位、內(nèi)容可以初始化為特定值。RAM有地址輸入、數(shù)據(jù)輸入、數(shù)據(jù)輸出、讀寫控制等端口。ROM只讀存儲器用于存儲固定的程序或數(shù)據(jù)。其配置與RAM類似但沒有寫端口。你可以通過編輯其內(nèi)容將預(yù)先編寫好的機(jī)器指令碼存入其中。實(shí)操要點(diǎn)在連接存儲器和總線時一定要注意三態(tài)門的概念??偩€是共享的通信線路同一時刻只能有一個設(shè)備向總線輸出數(shù)據(jù)。寄存器或RAM的輸出端不能直接并聯(lián)到總線上否則會發(fā)生信號沖突。我們需要用“三態(tài)門”來控制輸出。Logisim中有“三態(tài)緩沖器”元件。將寄存器的輸出連接到三態(tài)緩沖器的輸入將三態(tài)緩沖器的輸出連接到總線用一個控制信號如Reg_OUT來控制三態(tài)門的使能。只有當(dāng)Reg_OUT有效時寄存器的值才會被放到總線上。6.2 構(gòu)建一個極簡的累加器ACC型數(shù)據(jù)通路我們設(shè)計(jì)一個能執(zhí)行“從內(nèi)存取數(shù)到ACC”和“ACC加內(nèi)存數(shù)”兩條指令的簡單數(shù)據(jù)通路。元件準(zhǔn)備一個程序計(jì)數(shù)器PC寄存器用于存放下一條指令的地址。一個指令寄存器IR寄存器用于存放當(dāng)前執(zhí)行的指令。一個累加器ACC寄存器用于存放操作數(shù)和結(jié)果。一個算術(shù)邏輯單元ALU可以使用我們之前做的可控加減法器固定為加法模式。一個存儲器RAM存放指令和數(shù)據(jù)。多個多路選擇器MUX用于選擇不同的數(shù)據(jù)來源。一個時鐘源用于提供時鐘信號。必要的三態(tài)門和導(dǎo)線。取指階段通路設(shè)計(jì)PC的輸出通過三態(tài)門控制信號PC_OUT送到地址總線。地址總線連接到RAM的地址輸入端。將RAM的數(shù)據(jù)輸出端連接到指令總線。指令總線連接到IR的輸入端。當(dāng)時鐘上升沿到來且IR_LOAD有效時指令被存入IR。PC自增邏輯用一個加法器將PC的當(dāng)前值與常數(shù)1相加結(jié)果在下一個時鐘上升沿當(dāng)PC_INC有效時存回PC。這可以通過將加法器輸出通過一個MUX選擇后反饋給PC輸入來實(shí)現(xiàn)。執(zhí)行階段通路設(shè)計(jì)以加法指令為例假設(shè)指令格式為操作碼高幾位| 內(nèi)存地址低幾位。IR的高位部分譯碼產(chǎn)生ADD控制信號低位部分是操作數(shù)地址。當(dāng)ADD有效時將IR中的地址字段送到地址總線通過一個MUX選擇控制信號可能是ADDR_FROM_IR從RAM中讀取操作數(shù)到數(shù)據(jù)總線。同時將ACC的輸出通過三態(tài)門ACC_OUT有效送到ALU的A輸入端。將從數(shù)據(jù)總線讀出的操作數(shù)送到ALU的B輸入端。ALU執(zhí)行加法結(jié)果輸出到數(shù)據(jù)總線。在下一個時鐘上升沿將數(shù)據(jù)總線上的結(jié)果寫回ACCACC_LOAD有效??刂菩盘柕漠a(chǎn)生這是最復(fù)雜的部分。你需要一個“控制單元”根據(jù)當(dāng)前指令I(lǐng)R中的操作碼和時鐘周期產(chǎn)生一系列有序的控制信號如PC_OUT,IR_LOAD,PC_INC,ACC_OUT,ALU_OP,ACC_LOAD等。在最初的模型中你可以用一個“只讀存儲器ROM”作為硬連線控制器將指令操作碼作為地址ROM中存儲的內(nèi)容就是對應(yīng)指令所需的所有控制信號組成的位模式。調(diào)試與心得分模塊調(diào)試先讓取指周期跑通確保PC能自動遞增并能從RAM中正確讀出指令加載到IR。你可以將RAM的前幾個地址預(yù)先存入一些簡單的、你知道的指令碼比如全0代表NOP空操作用時鐘單步推進(jìn)觀察各總線和寄存器的值??刂菩盘柕臅r序這是成敗關(guān)鍵。每個控制信號必須在正確的時鐘周期內(nèi)有效。畫一個詳細(xì)的時序圖會非常有幫助。在Logisim中你可以通過“仿真”菜單啟用時鐘自動步進(jìn)或者手動點(diǎn)擊時鐘按鈕來單步觀察。從簡單開始不要一開始就追求復(fù)雜的指令集。先實(shí)現(xiàn)一條指令比如LOAD再實(shí)現(xiàn)第二條比如ADD。每增加一條指令就仔細(xì)測試其執(zhí)行通路和控制信號??梢暬顷P(guān)鍵大量使用LED陣列、十六進(jìn)制顯示器、甚至簡單的七段數(shù)碼管來顯示PC、IR、ACC、總線、控制信號等的當(dāng)前值。這能讓你直觀地看到數(shù)據(jù)在通路中的流動是排查問題最有效的手段。這個簡單的數(shù)據(jù)通路實(shí)驗(yàn)是理解現(xiàn)代CPU工作原理的敲門磚。雖然它離真正的流水線、高速緩存、超標(biāo)量等復(fù)雜技術(shù)還很遠(yuǎn)但它清晰地展示了指令如何被讀取、解碼、執(zhí)行數(shù)據(jù)如何在寄存器、運(yùn)算器、存儲器之間流動。通過Logisim親手搭建并調(diào)試這樣一個系統(tǒng)所獲得的直觀感受是任何教科書和理論講解都無法替代的。

相關(guān)新聞

X-Macro(X 宏)案例解析

X-Macro(X 宏)案例解析

X-Macro 模式解讀 這是 C/C 中經(jīng)典的 X-Macro 技術(shù),核心思想是:一份數(shù)據(jù)定義,多種用途展開。 數(shù)據(jù)源(唯一真源) 在 light_strip_config.h 中,LIGHT_SCENE_STRIP_CONFIGS 是所有燈條配置的唯一列表&#xff…

2026/8/1 4:09:44 閱讀更多
STM32模擬遙控器:PWM信號驅(qū)動無刷電調(diào)初始化與校準(zhǔn)全解析

STM32模擬遙控器:PWM信號驅(qū)動無刷電調(diào)初始化與校準(zhǔn)全解析

1. 項(xiàng)目緣起:為什么需要自己動手初始化電調(diào)?玩過四軸無人機(jī)或者航模的朋友,對“電調(diào)”和“遙控器”這兩個詞肯定不陌生。電調(diào),全稱電子調(diào)速器,是無刷電機(jī)的“大腦”,它接收來自飛控或遙控接收機(jī)的PWM信號&a…

2026/8/1 4:09:44 閱讀更多
大模型思維鏈可視化方案:分步推理的流式渲染與交互折疊

大模型思維鏈可視化方案:分步推理的流式渲染與交互折疊

大模型思維鏈可視化方案:分步推理的流式渲染與交互折疊 一、黑箱輸出的信任困境:為什么推理步驟需要前端展示 去年我們給一個金融分析產(chǎn)品接帶 reasoning 的模型,客戶試用第一天就問"它到底怎么算出來的"。這事我見過太多團(tuán)隊(duì)栽進(jìn)…

2026/8/1 4:09:44 閱讀更多
iOS 開發(fā)證書與描述文件創(chuàng)建指南

iOS 開發(fā)證書與描述文件創(chuàng)建指南

iOS 開發(fā)證書與描述文件創(chuàng)建指南 前言 作為 iOS 開發(fā)新手,在準(zhǔn)備打包 App 進(jìn)行內(nèi)測分發(fā)時,經(jīng)常會遇到證書(Certificate)和描述文件(Provisioning Profile)的概念。這兩者是 iOS 應(yīng)用能夠安裝到真機(jī)和分發(fā)的基礎(chǔ)。本文將從頭到尾詳細(xì)講解這些文件的用途、格式以及完整的…

2026/8/1 13:50:45 閱讀更多
AI服務(wù)日志爆炸式增長:單日2TB日志如何壓縮92%存儲成本并保留100%可追溯性?

AI服務(wù)日志爆炸式增長:單日2TB日志如何壓縮92%存儲成本并保留100%可追溯性?

更多請點(diǎn)擊: https://intelliparadigm.com 第一章:AI服務(wù)日志爆炸式增長的根源與挑戰(zhàn) 現(xiàn)代AI服務(wù)在推理、訓(xùn)練、監(jiān)控和A/B測試等環(huán)節(jié)中,日志生成密度遠(yuǎn)超傳統(tǒng)Web應(yīng)用。單個大模型推理請求可能觸發(fā)數(shù)十個微服務(wù)調(diào)用,每個節(jié)點(diǎn)又同步…

2026/8/1 13:50:45 閱讀更多
包裝線二維碼核驗(yàn)方案技術(shù)架構(gòu)解析:高速解碼與智能防混料實(shí)現(xiàn)原理

包裝線二維碼核驗(yàn)方案技術(shù)架構(gòu)解析:高速解碼與智能防混料實(shí)現(xiàn)原理

在電子、汽配、醫(yī)藥、食品、日化等規(guī)?;圃靾鼍爸?amp;#xff0c;包裝工序條碼錯印、漏碼、重復(fù)碼、批次混料問題,是制約產(chǎn)線質(zhì)控標(biāo)準(zhǔn)化的核心痛點(diǎn)。傳統(tǒng)人工抽檢模式受主觀因素、疲勞作業(yè)影響,漏檢、誤檢率居高不下,極易引發(fā)產(chǎn)品返工、客戶退…

2026/8/1 13:50:45 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動化設(shè)備及通用機(jī)械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動機(jī)。額定…

2026/8/1 0:09:33 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/1 0:09:33 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動化設(shè)備及通用機(jī)械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動機(jī)。額定…

2026/8/1 0:09:33 閱讀更多