在數(shù)字電路教程的組合邏輯部分,最經(jīng)典的示例除了加法器以外就是:
Encoder - 編碼器
Decoder - 譯碼器
Multiplexer - 簡(jiǎn)寫Mux,多路復(fù)用器,也叫數(shù)據(jù)選擇器
Demultiplexer - 簡(jiǎn)寫Demux,解復(fù)用器,也叫數(shù)據(jù)分配器
其實(shí)是兩對(duì)概念:Encoder/Decoder是跟code(碼)相關(guān)的正反兩個(gè)操作,Mux/Demux是跟數(shù)據(jù)流相關(guān)的正反兩個(gè)操作。
翻看各種教科書,我們很難理清楚它們之間的功能差異以及相互之間的關(guān)系,只是有一些點(diǎn)滴應(yīng)用在書本上提及。
這兩組概念其實(shí)是非常重要的,是構(gòu)成我們信息組織和信息傳輸?shù)闹匾A(chǔ),并且在我們的生活中處處都能夠找到與之對(duì)應(yīng)的應(yīng)用:
比如我們看諜戰(zhàn)片中神秘的電報(bào)編碼(要用密碼本來(lái)翻譯);我們用的鍵盤上面有100多個(gè)按鍵、而幾根線就可以將它跟計(jì)算機(jī)連接;我們使用的旋轉(zhuǎn)撥碼開關(guān)、模數(shù)轉(zhuǎn)換器中通過(guò)比較器輸出的比較結(jié)果到最終用于表征模擬信號(hào)大小的數(shù)據(jù),這些都被稱為Encode - 編碼。

單刀八擲的旋轉(zhuǎn)開關(guān)可以用3根二進(jìn)制數(shù)據(jù)線來(lái)表征其狀態(tài)
上述開關(guān)編碼器部分的圖示

鍵盤上用到的對(duì)多個(gè)按鍵的編碼
簡(jiǎn)而言之,編碼器是一種把熟悉的數(shù)字、字符或符號(hào)轉(zhuǎn)換成二進(jìn)制代碼的裝置,它將給定的信息編碼成更緊湊的形式,主要用于減少表示給定信息所需的比特?cái)?shù)。在數(shù)字系統(tǒng)中,編碼器用來(lái)傳輸或存儲(chǔ)信息,通過(guò)編碼傳輸鏈路可以使用更少的線路來(lái)傳輸或更少的空間來(lái)存儲(chǔ)。將量化的音樂(lè)通過(guò)編碼器轉(zhuǎn)換為MP3格式,將采集到的視頻流通過(guò)編碼器轉(zhuǎn)換為MP4的數(shù)據(jù)格式,這些過(guò)程都統(tǒng)稱為“編碼” ,當(dāng)然在我們的數(shù)字電路教程中,只是通過(guò)最簡(jiǎn)單的示例來(lái)講述其原理。
就像電報(bào)中的編碼有很多中一樣,用二進(jìn)制來(lái)表征數(shù)字、字符或符號(hào)也有多種不同的方式,比如BCD、5421碼、2421碼、余3碼、格雷碼等,每種編碼方式都有其優(yōu)缺點(diǎn),因此有用于不同的場(chǎng)景。
譯碼器(Decoder)是編碼器的逆過(guò)程,它是把二進(jìn)制表征的信息給翻譯過(guò)來(lái),或者說(shuō)映射過(guò)來(lái),我們生活中的門牌號(hào)、車牌號(hào)、郵箱、組合開關(guān)對(duì)多個(gè)燈的控制、嵌入式系統(tǒng)中的存儲(chǔ)器/外設(shè)尋址,這些都是譯碼的過(guò)程,通過(guò)代碼中的數(shù)字,找到其對(duì)應(yīng)的對(duì)象。在數(shù)字計(jì)算中,代碼中的數(shù)字都是用二進(jìn)制(擴(kuò)展為8進(jìn)制、16進(jìn)制等,本質(zhì)上也是2進(jìn)制)。數(shù)字電路教程中,在譯碼器部分最常用到的例子就是3:8譯碼器,這是因?yàn)?4HC138就是這么一個(gè)IC,比較適合做各種實(shí)驗(yàn),當(dāng)然7段數(shù)碼管的控制也是非常重要的實(shí)驗(yàn)項(xiàng)目讓同學(xué)們來(lái)體會(huì)譯碼的過(guò)程,通過(guò)幾根控制線的電平組合,可以點(diǎn)亮數(shù)碼管上7個(gè)LED燈中的若干個(gè),從而組合出我們需要顯示的數(shù)字。
我們硬禾學(xué)堂也專門針對(duì)譯碼部分制作了兩個(gè)視頻案例,一個(gè)是2:4譯碼,一個(gè)是3:8譯碼,雖然看起來(lái)沒(méi)啥大的區(qū)別,但我們還是通過(guò)這兩個(gè)實(shí)例來(lái)讓大家體會(huì)Verilog代碼實(shí)現(xiàn)的不同方式,希望對(duì)學(xué)習(xí)Verilog的同學(xué)有幫助。
FPGA中的邏輯單元的基本構(gòu)成就是LUT - 查找表,其理論基礎(chǔ)就是譯碼,比如我們小腳丫FPGA中采用的是4輸入LUTS,通過(guò)查找表的方式代替邏輯門的構(gòu)成,4個(gè)輸入作為RAM的地址,可以尋址16個(gè)不同的地址空間內(nèi)存儲(chǔ)的信息。
是不是感覺(jué)編碼器/譯碼器用途很廣?
那Mux/Demux呢?想象一下從四條不同路徑過(guò)來(lái)的車輛要并線到一條路上,由紅綠燈控制,控制部分就相當(dāng)于一個(gè)分時(shí)切換的開關(guān),根據(jù)開關(guān)的控制碼來(lái)決定哪一路的車輛通行,Mux又稱為多路數(shù)據(jù)選擇器,Demux又被稱為數(shù)據(jù)分配器。
其實(shí)MUX不僅用于數(shù)字器件中,模擬電路中也有這個(gè)概念,我們所說(shuō)的模擬開關(guān),可以切換不同的輸入與輸出的連接,在模擬電路中Mux和Demux是一體的,同一個(gè)電路即是Mux又是Demux。而數(shù)字的Mux和Demux需要使用不同的器件。
復(fù)用器的構(gòu)成
module mult4(input wire a, //定義四位輸入input wire b,input wire c,input wire d,input wire [1:0] sel, //定義輸出的選擇變量output reg led //定義選擇器輸出結(jié)果對(duì)應(yīng)的led);always@(sel) //根據(jù)sel結(jié)果選擇輸出,當(dāng)sel變化時(shí)執(zhí)行begincase(sel)2'b00: led = a;2'b01: led = b;2'b10: led = c;2'b11: led = d;endcaseendendmodule
從這幾行代碼看,F(xiàn)PGA的使用非常簡(jiǎn)單,不需要你畫門與門之間的邏輯關(guān)系圖,只需要用Verilog這種硬件描述語(yǔ)言來(lái)描述一下其因果關(guān)系就可以了。
與Encoder、Decoder、Mux、Demux相關(guān)的案例及其FPGA實(shí)現(xiàn)都匯總在www.stepfpga.com的網(wǎng)站百科中,如果您使用我們的Web IDE(不需要下載安裝FPGA工具),也可以找到相關(guān)的參考案例,自己去發(fā)掘嘍。
祝大家節(jié)日快樂(lè)!玩得開心!
淺談“數(shù)字電路”的學(xué)習(xí)(7)- 一切數(shù)字計(jì)算的核心功能、被教程忽略的加法器
淺談“數(shù)字電路”的學(xué)習(xí)(6) - 看視頻了解什么是FPGA?
淺談“數(shù)字電路”的學(xué)習(xí)(5) - “組合邏輯”的學(xué)習(xí)邏輯。
淺談"數(shù)字電路"的學(xué)習(xí) (4) - 學(xué)用FPGA從點(diǎn)燈開始
淺談“數(shù)字電路”的學(xué)習(xí)(3)- 不需要安裝軟件、人人一學(xué)就會(huì)的FPGA學(xué)習(xí)板
淺談“數(shù)字電路”的學(xué)習(xí)(2)- 在興趣和體驗(yàn)中高效學(xué)習(xí)
淺談“數(shù)字電路”的學(xué)習(xí)(1)- 我們身處的“數(shù)字邏輯”世界