王澤梁,汪麗華
(黃山學(xué)院 信息工程學(xué)院,安徽 黃山 245041)
計(jì)算機(jī)組成原理是計(jì)算機(jī)專業(yè)的一門(mén)專業(yè)基礎(chǔ)核心課程,在專業(yè)硬件課程體系中承擔(dān)著承上啟下的作用。通過(guò)該課程的學(xué)習(xí),不僅能夠使學(xué)生掌握計(jì)算機(jī)硬件系統(tǒng)各組成部件的工作原理和部件之間的聯(lián)系,還可以使學(xué)生理解計(jì)算機(jī)軟件的底層基礎(chǔ)和運(yùn)行機(jī)制,達(dá)到軟硬件知識(shí)融匯貫通的效果,從而有利于學(xué)生構(gòu)建學(xué)科知識(shí)的整體框架。
現(xiàn)有計(jì)算機(jī)組成原理課程教學(xué)模式存在一定的局限性,通過(guò)對(duì)教學(xué)反饋的總結(jié),可以發(fā)現(xiàn)現(xiàn)有教學(xué)表現(xiàn)形式比較單調(diào)枯燥。受芯片集成度不斷提高的影響,課程中講授的原理已很難在現(xiàn)有的計(jì)算機(jī)中找到具體一對(duì)一的實(shí)物,而實(shí)驗(yàn)?zāi)P蜋C(jī)的方式又與實(shí)際脫節(jié),導(dǎo)致課程教學(xué)往往流于枯燥理論的講解,甚至演化為公式的推導(dǎo),曲高和寡直接形成了教師不愿看到的學(xué)生缺乏學(xué)習(xí)興趣的現(xiàn)狀,這種情況是與新工科建設(shè)的要求背道而馳的。專業(yè)知識(shí)的學(xué)習(xí)最終是為了提高學(xué)生解決工程實(shí)際問(wèn)題的能力[1],因此,在硬件課程教學(xué)中,應(yīng)將理論問(wèn)題與工程實(shí)踐結(jié)合,設(shè)計(jì)工程化的實(shí)例,同時(shí)利用可視化的手段展現(xiàn),以提高學(xué)生的學(xué)習(xí)興趣,最終達(dá)到學(xué)懂、弄通、會(huì)用的效果。
漢明碼具有自動(dòng)糾錯(cuò)能力,已被廣泛應(yīng)用于存儲(chǔ)器校驗(yàn)[2]、音頻水印[3]、文本信息隱藏[4]、醫(yī)學(xué)圖像共享[5]等領(lǐng)域中。在教材[6]第四章介紹存儲(chǔ)器的校驗(yàn)原理中,詳細(xì)介紹了漢明校驗(yàn)碼的查錯(cuò)糾錯(cuò)工作原理,并附有例題說(shuō)明漢明校驗(yàn)碼的計(jì)算方法。文獻(xiàn)[7]中基于硬件描述語(yǔ)言VHDL、QuartusII 仿真平臺(tái)和FPGA 芯片實(shí)現(xiàn)漢明碼的編解碼。文獻(xiàn)[8]同樣基于VHDL 和FPGA 芯片實(shí)現(xiàn)漢明碼的編解碼,不同的是采用ModelSim 仿真平臺(tái)。文獻(xiàn)[9]基于MATLAB 和快速分組方法實(shí)現(xiàn)漢明碼仿真。然而已有方法存在某些方面的不足:第一,實(shí)現(xiàn)方法采用的硬件描述語(yǔ)言需要學(xué)生具備較扎實(shí)硬件知識(shí),對(duì)于計(jì)算機(jī)專業(yè)學(xué)生來(lái)說(shuō),各種高級(jí)編程語(yǔ)言的學(xué)習(xí)已應(yīng)接不暇;第二,仿真平臺(tái)軟件或非開(kāi)源,或軟件功能龐大,學(xué)生首先需要花費(fèi)大量精力學(xué)習(xí)仿真平臺(tái)的使用。因此,可采用簡(jiǎn)單易學(xué)的高級(jí)編程語(yǔ)言(如C、Python 等)實(shí)現(xiàn)漢明碼校驗(yàn)展示以減少學(xué)生知識(shí)遷移與吸收的時(shí)間,同時(shí)使枯燥原理的工程實(shí)現(xiàn)達(dá)到可視化的直觀效果。鑒于Python 具有簡(jiǎn)單易學(xué)、跨平臺(tái)和功能強(qiáng)大等各種優(yōu)勢(shì),得以迅速的普及,目前很多高校在非計(jì)算機(jī)專業(yè)也已使用Python 講授程序設(shè)計(jì)課程[10,11]。同時(shí)由于Python 具有豐富的標(biāo)準(zhǔn)庫(kù)和第三方模塊資源,因此可以選用其作為可視化實(shí)現(xiàn)的工具。
信息進(jìn)行傳輸?shù)倪^(guò)程中可能會(huì)出現(xiàn)錯(cuò)誤,且出現(xiàn)一位錯(cuò)誤的概率最大[6]。在信息接收端針對(duì)已收到的數(shù)據(jù)判斷是否與發(fā)送端一致,最基本檢驗(yàn)方法可通過(guò)奇偶校驗(yàn)法。以偶校驗(yàn)為例,在待傳輸信息中加入一位偶校驗(yàn)位,以確保發(fā)送端數(shù)據(jù)中包含偶數(shù)個(gè)1。在信息的接收端如果檢測(cè)到奇數(shù)個(gè)1,則說(shuō)明傳輸?shù)臄?shù)據(jù)發(fā)生了奇數(shù)位變化,但卻無(wú)法確定出錯(cuò)的位置信息,因而無(wú)法糾錯(cuò)。漢明碼就是在奇偶校驗(yàn)碼的基礎(chǔ)上,運(yùn)用編碼糾錯(cuò)理論,在信息編碼中加入若干校驗(yàn)位,以增加編碼最小距離,從而實(shí)現(xiàn)能糾正一位錯(cuò)誤的編碼。其本質(zhì)為分組奇偶校驗(yàn)碼。增加t 位的校驗(yàn)位需滿足關(guān)系式2t≥n + t +1,其中n 為待傳輸?shù)亩M(jìn)制信息位數(shù)。以傳輸16位(n=16)的漢字內(nèi)碼為例,則至少需要的漢明校驗(yàn)碼的位數(shù)t應(yīng)為5,即共分成5組進(jìn)行奇偶校驗(yàn),且發(fā)送端經(jīng)過(guò)漢明編碼后的總數(shù)據(jù)位數(shù)為21。其校驗(yàn)碼和各分組配置規(guī)則如下:
1.校驗(yàn)碼C1、C2、C3、C4、C5依次位于漢明碼的第1、2、4、8、16位(從左往右),即2的指數(shù)次方位置上,待傳輸二進(jìn)制信息按照高位在左、低位在右原則依次填充在剩余的漢明碼位置上;
2.組1由校驗(yàn)碼C1開(kāi)始,依次選取1位、間隔1位,即漢明碼的第1、3、5、7、9、11、13、15、17、19、21位;
3.組2 由校驗(yàn)碼C2開(kāi)始,依次選取2 位、間隔2位,即漢明碼的第2、3、6、7、10、11、14、15、18、19位;
4.組3 由校驗(yàn)碼C3開(kāi)始,依次選取4 位、間隔4位,即漢明碼的第4、5、6、7、12、13、14、15、20、21位;
5.組4 由校驗(yàn)碼C4開(kāi)始,依次選取8 位、間隔8位,即漢明碼的第8、9、10、11、14、15、18、19位;
6.組5 由校驗(yàn)碼C5開(kāi)始,依次選取8 位、間隔8位,即漢明碼的第16、17、18、19、20、21位。
以偶校驗(yàn)為例,各校驗(yàn)碼的設(shè)置需保證每組數(shù)據(jù)中均含有偶數(shù)個(gè)1。在接收端再次對(duì)每組進(jìn)行偶校驗(yàn),并形成新的檢測(cè)位為P1、P2、P3、P4、P5,記錄由P5P4P3P2P1組成的二進(jìn)制數(shù)據(jù),例如(10011)2,則表示第5、2、1 組同時(shí)發(fā)生錯(cuò)誤,由上述配置規(guī)則可知為第19位出錯(cuò),正好為該二進(jìn)制數(shù)據(jù)所對(duì)應(yīng)的十進(jìn)制數(shù)據(jù),故稱為校驗(yàn)和。因此漢明碼具有一位糾錯(cuò)能力。但是上述編碼規(guī)則的漢明碼不能發(fā)現(xiàn)兩位錯(cuò)誤,例如第3、5位同時(shí)出錯(cuò),則校驗(yàn)和為6,此時(shí)漢明碼會(huì)得出第6位出錯(cuò)的結(jié)論,與實(shí)際情況不符。
以培養(yǎng)學(xué)生的工程應(yīng)用能力為目標(biāo),教師對(duì)于知識(shí)點(diǎn)的教學(xué)要求不應(yīng)僅局限于會(huì)進(jìn)行漢明碼的數(shù)學(xué)計(jì)算,還需擴(kuò)展介紹知識(shí)點(diǎn)的真實(shí)應(yīng)用場(chǎng)景。因此設(shè)計(jì)漢字傳輸與校驗(yàn)的教學(xué)實(shí)例,通過(guò)Python程序展示發(fā)送端和接收端的漢字信息,以及漢明校驗(yàn)碼的一位糾錯(cuò)能力。首先,從鍵盤(pán)輸入一個(gè)漢字到字符串變量,完成GB2312 機(jī)內(nèi)碼的轉(zhuǎn)換;其次,對(duì)機(jī)內(nèi)碼進(jìn)行漢明編碼并傳輸;再次,對(duì)發(fā)送的漢明碼分別加入隨機(jī)一位、兩位干擾,并對(duì)接收到的信息僅取出機(jī)內(nèi)碼位信息,轉(zhuǎn)為點(diǎn)陣輸出。同時(shí),對(duì)接收到的信息進(jìn)行漢明解碼,將糾錯(cuò)后的機(jī)內(nèi)碼轉(zhuǎn)為點(diǎn)陣輸出,并與未執(zhí)行校驗(yàn)和糾錯(cuò)的輸出對(duì)比,以展示漢明碼的一位糾錯(cuò)能力。漢明碼教學(xué)案例項(xiàng)目的整體流程如圖1所示。
圖1 漢明碼教學(xué)案例流程圖
漢字的編碼包括機(jī)內(nèi)碼、區(qū)位碼和Unicode 編碼等方式[12]。常用漢字采用分區(qū)管理,進(jìn)而編碼為對(duì)應(yīng)的區(qū)位碼,區(qū)位碼需轉(zhuǎn)為對(duì)應(yīng)的機(jī)內(nèi)碼進(jìn)行存儲(chǔ)。將機(jī)內(nèi)碼的兩個(gè)字節(jié)數(shù)據(jù)分別減去十六進(jìn)制數(shù)A0,可獲得漢字的區(qū)位碼。通過(guò)區(qū)位碼和點(diǎn)陣字庫(kù)信息可獲得漢字的字形碼以輸出顯示。Unicode編碼為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一且唯一的二進(jìn)制編碼,以實(shí)現(xiàn)跨平臺(tái)、跨語(yǔ)言的信息處理與交換。
在Python 中,通過(guò)調(diào)用系統(tǒng)的encode 函數(shù)可實(shí)現(xiàn)GB2312 機(jī)內(nèi)碼的獲取,因該信息為bytes 類型數(shù)據(jù),須通過(guò)調(diào)用字節(jié)類型數(shù)據(jù)到十六進(jìn)制數(shù)據(jù)的轉(zhuǎn)換,而后以Unicode字符進(jìn)行存儲(chǔ)。
在編碼函數(shù)中,主要實(shí)現(xiàn)5位校驗(yàn)位的產(chǎn)生,再將其與機(jī)內(nèi)碼按照漢明碼編碼規(guī)則進(jìn)行組合形成發(fā)送端信息編碼。以進(jìn)行偶校驗(yàn)為例,校驗(yàn)位的產(chǎn)生按照每組配置偶數(shù)個(gè)1 的規(guī)則,又因校驗(yàn)位為每組所獨(dú)有,因此校驗(yàn)位可通過(guò)對(duì)該組其余的信息位進(jìn)行異或運(yùn)算獲得。其實(shí)現(xiàn)代碼如下:
其 中,變 量code_1、code_2、code_4、code_8、code_16分別對(duì)應(yīng)校驗(yàn)碼C1、C2、C3、C4、C5。
在漢明碼解碼函數(shù)中,分別對(duì)組1 到組5 進(jìn)行偶校驗(yàn)以獲得新的檢測(cè)位P1、P2、P3、P4、P5。由其組成的校驗(yàn)和判斷出錯(cuò)的信息位置,若校驗(yàn)和為0,則表示傳輸未出錯(cuò)。若校驗(yàn)和不為0,根據(jù)校驗(yàn)和所對(duì)應(yīng)的位置信息,自動(dòng)進(jìn)行一位糾錯(cuò)。糾錯(cuò)代碼的實(shí)現(xiàn)如下:
其中,變量code_checksum表示校驗(yàn)和。
在漢明碼糾錯(cuò)能力測(cè)試模塊,分別針對(duì)發(fā)送端漢明碼數(shù)據(jù)進(jìn)行無(wú)噪聲、隨機(jī)加入一位噪聲和兩位噪聲的3 種情況,檢測(cè)有無(wú)漢明解碼與糾錯(cuò)對(duì)輸出的影響。漢字點(diǎn)陣輸出的實(shí)現(xiàn)過(guò)程如下:
首先,由接收端漢明碼解析出機(jī)內(nèi)碼;
其次,由機(jī)內(nèi)碼與區(qū)位碼的關(guān)系計(jì)算出漢字的區(qū)位碼;
最后,通過(guò)調(diào)用漢字庫(kù)文件HZK16,使用16*16點(diǎn)陣顯示機(jī)內(nèi)碼對(duì)應(yīng)的中文漢字。
以輸入中文漢字“天”為例,在上述3 種情況下其對(duì)應(yīng)輸出的漢字如圖2 所示,其中第一行展示未采用漢明糾錯(cuò),直接提取機(jī)內(nèi)碼得到的輸出,第二行展示經(jīng)過(guò)漢明碼糾錯(cuò)模塊后得到的輸出。圖2(a)未采用漢明糾錯(cuò)為“天”,校驗(yàn)和為0,校驗(yàn)結(jié)果仍為“天”,表明無(wú)噪聲狀態(tài)下漢明校驗(yàn)有效;圖2(b)中無(wú)漢明糾錯(cuò)輸出為“添”,由校驗(yàn)和21 可知信息傳輸發(fā)生錯(cuò)誤,再由漢明校驗(yàn)糾錯(cuò)恢復(fù)原始漢字“天”,表明漢明校驗(yàn)具有一位檢錯(cuò)糾錯(cuò)能力;圖2(c)中未經(jīng)漢明糾錯(cuò)輸出為“田”,校驗(yàn)和為1,所以漢明糾錯(cuò)模塊僅糾正編碼的第一位。因第一位為校驗(yàn)位而非信息位,故校正與否并不影響輸出結(jié)果,因此仍輸出漢字“田”,表明漢明碼未能實(shí)現(xiàn)兩位出錯(cuò)的糾錯(cuò)。因此若希望漢明碼能夠糾正兩位錯(cuò)誤,需對(duì)原始漢明校驗(yàn)碼進(jìn)行改進(jìn),例如再增添一位檢測(cè)位等。
圖2 漢明碼糾錯(cuò)能力測(cè)試
計(jì)算機(jī)組成原理課程作為計(jì)算機(jī)類專業(yè)的核心課程,其教學(xué)效果直接影響學(xué)生對(duì)硬件知識(shí)的掌握。本文針對(duì)現(xiàn)有教學(xué)與工程實(shí)踐脫節(jié)的問(wèn)題,以漢明碼教學(xué)為例,設(shè)計(jì)并采用Python 語(yǔ)言實(shí)現(xiàn)了漢明碼檢錯(cuò)糾錯(cuò)的案例,達(dá)到了可視化的教學(xué)效果。通過(guò)實(shí)際教學(xué)檢驗(yàn),學(xué)生普遍反饋該方式比傳統(tǒng)教學(xué)方式更加直觀,而且體驗(yàn)到了學(xué)有所用的教學(xué)效果。未來(lái)應(yīng)進(jìn)一步設(shè)計(jì)更多的教學(xué)案例,促進(jìn)課程教學(xué),主動(dòng)適應(yīng)新工科建設(shè)的需要。