概述
在译码器基础和译码器应用中分别对译码器的真值表、电路图、逻辑符号等进行了较为详细的讲解。编码可以看成是译码的逆过程。通常,编码是将计算机无法直接识别的数据,翻译成二进制码。
大家学习C语言时,一定对ASCII码有所了解,它用8位二进制串表示26个字母大小写、数字以及一些常见的控制符等;coding较多的童鞋肯定也对UTF-8,UTF-16等概念比较熟悉,这些编码将全球所有的字符(特别是中日韩、阿拉伯等国家字符)进行了统一的编码,感兴趣的童鞋可以查看相关的国际标准。
编码的原理较为直接简单,本文余下部分主要介绍编码器的基本原理和优先权编码器。
基本编码器
最基本的编码器,莫过于十进制数用二进制表示,这是我们学习数字逻辑第一章的内容,即0~9这十个数字用二进制串表示,其真值表如下图所示:
根据真值表,输出与输入之间的关系为:
除了我们熟悉的二-十进制编码器,还有典型的n位二进制编码器,即用n位二进制串对m(m <= 2n)个数字进行编码,这个比较容易理解。
在基本编码器中,要求编码器在任意时刻,输入端的m个输入,只能有一个有效;若两个输入(如I1和I2)同时有效,则基本编码器就会犯晕了。于是就有了下面的优先权编码器。
优先权编码器
在讲解优先权编码器原理之前,先介绍一下它的背景。基本编码器的局限在于其一个时刻只能有一个输入有效,然而,这种要求太过苛刻。在现实世界中,很多事情往往是一起来的,并且通常当你越忙的时候,外来的任务会越多(个人感受)。这个时候,我通常会给事情分一个优先级,孰轻孰重评估一下,列一个清单,先做什么,后做什么,这是一个正常人干活的逻辑。
对于计算机而言,上面这个逻辑照样成立。计算机分为CPU、存储器、IO几大部件,IO上面挂的外设如键盘、鼠标、usb等等,它们与计算机之间的通讯是通过中断来响应的。最简单的例子,当我们敲击键盘的时候,键盘电路会向操作系统发起一个中断请求(每一个中断请求都对应一个中断号(整数)),操作系统会暂停当前工作,调用相应的中断处理程序,将我们敲击的字符显示在屏幕上。我们的计算机上有很多外设,包括网络上的通讯。在很多情况下,操作系统可能同时接收到多个中断请求,这个时候,操作系统只能根据中断请求的优先级别从高到低来处理。这正是优先权编码器做的事情。
我们以8-3优先权编码器进行说明,其逻辑功能图如下所示:
如图所示,8-3优先权编码器由两部分组成:优先权处理逻辑和基本的8-3编码器。其中,优先权处理逻辑中的输入与输出之间的关系为:
H7 = I7
H6 = I6 * !I7 (*表示逻辑与,!表示逻辑非,下同)
H5 = I5 * !I6* !I7
...
H0 = I0 * !I1* !I2...*I7
上面的关系表达的意思是:I7的优先级最高,I0的优先级最低。当I7输入有效时,不管其它输入是否有效,优先处理逻辑将其转变为H7;当I7无效,且I6输入有效,不管其它输入是否有效,转换为H6...
回归到中断,假设操作系统处理8个中断,依次命名为I0, I1, ..., I7,,其优先级如上所述,A0,A1,A2指示中断响应程序的地址,当同时有多个中断请求时,你应该能解释清楚了。