📜  代码转换器——二进制到/从格雷码

📅  最后修改于: 2021-09-28 10:16:58             🧑  作者: Mango

先决条件 –数字系统和基数转换

格雷码系统是一种二进制数系统,其中每对连续的数字只有一位不同。它用于硬件生成的正常二进制数序列在从一个数转换到下一个数期间可能产生错误或歧义的应用中。
例如,系统的状态可能会从 3(011) 变为 4(100) 为- 011 — 001 — 101 — 100。因此,当系统从初始状态更改时,很可能会读取错误状态到最终状态。
这可能会对使用该信息的机器造成严重后果。格雷码消除了这个问题,因为在两个数字之间的任何转换过程中只有一位改变其值。

将二进制转换为格雷码 –

b_0,\:b_1,\:b_2\:,\:and\:b_3是表示二进制数的位,其中b_0是 LSB 和b_3是 MSB,并且
g_0,\:g_1,\:g_2\:,\:and\:g_3是表示二进制数的格雷码的位,其中g_0是 LSB 和g_3是 MSB。
转换的真值表是-
 \begin{tabular}{||c|c|c|c||c|c|c|c||} \hline  \multicolumn{4}{||c||}{Binary} & \multicolumn{4}{|c||}{Gray Code}\\ \hline  b_3 & b_2 & b_1 & b_0 & g_3 & g_2 & g_1 & g_0 \\ \hline \hline  0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\  \hline  0 & 0 & 0 & 1 & 0 & 0 & 0 & 1 \\  \hline  0 & 0 & 1 & 0 & 0 & 0 & 1 & 1 \\  \hline  0 & 0 & 1 & 1 & 0 & 0 & 1 & 0 \\  \hline \hline  0 & 1 & 0 & 0 & 0 & 1 & 1 & 0 \\  \hline  0 & 1 & 0 & 1 & 0 & 1 & 1 & 1 \\  \hline  0 & 1 & 1 & 0 & 0 & 1 & 0 & 1 \\  \hline  0 & 1 & 1 & 1 & 0 & 1 & 0 & 0 \\  \hline \hline  1 & 0 & 0 & 0 & 1 & 1 & 0 & 0 \\  \hline  1 & 0 & 0 & 1 & 1 & 1 & 0 & 1 \\  \hline  1 & 0 & 1 & 0 & 1 & 1 & 1 & 1 \\  \hline  1 & 0 & 1 & 1 & 1 & 1 & 1 & 0 \\  \hline \hline  1 & 1 & 0 & 0 & 1 & 0 & 1 & 0 \\  \hline  1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 \\  \hline  1 & 1 & 1 & 0 & 1 & 0 & 0 & 1 \\  \hline  1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\  \hline \hline \end{tabular}
为了找到相应的数字电路,我们将对每个格雷码位使用 K-Map 技术作为输出,并将所有二进制位作为输入。
K图为g_0 ——

K图为g_1 ——

K图为g_2 ——

K图为g_3 ——

对应于格雷码位的最小化布尔表达式 –
 g_0 = b_0b_1^\prime + b_1b_0^\prime = b_0 \oplus b_1\\ g_1 = b_2b_1^\prime + b_1b_2^\prime = b_1 \oplus b_2\\ g_2 = b_2b_3^\prime + b_3b_2^\prime = b_2 \oplus b_3\\ g_3 = b_3
对应的数字电路——

将格雷码转换为二进制 –

可以以类似的方式将格雷码转换回二进制。
b_0,\:b_1,\:b_2\:,\:and\:b_3是表示二进制数的位,其中b_0是 LSB 和b_3是 MSB,并且
g_0,\:g_1,\:g_2\:,\:and\:g_3是表示二进制数的格雷码的位,其中g_0是 LSB 和g_3是 MSB。
真值表——
 \begin{tabular}{||c|c|c|c||c|c|c|c||} \hline  \multicolumn{4}{||c||}{Gray Code} & \multicolumn{4}{|c||}{Binary}\\ \hline  g_3 & g_2 & g_1 & g_0 & b_3 & b_2 & b_1 & b_0\\ \hline \hline  0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\  \hline  0 & 0 & 0 & 1 & 0 & 0 & 0 & 1 \\  \hline  0 & 0 & 1 & 0 & 0 & 0 & 1 & 1 \\  \hline  0 & 0 & 1 & 1 & 0 & 0 & 1 & 0 \\  \hline \hline  0 & 1 & 0 & 0 & 0 & 1 & 1 & 1 \\  \hline  0 & 1 & 0 & 1 & 0 & 1 & 1 & 0 \\  \hline  0 & 1 & 1 & 0 & 0 & 1 & 0 & 0 \\  \hline  0 & 1 & 1 & 1 & 0 & 1 & 0 & 1 \\  \hline \hline  1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\  \hline  1 & 0 & 0 & 1 & 1 & 1 & 1 & 0 \\  \hline  1 & 0 & 1 & 0 & 1 & 1 & 0 & 0 \\  \hline  1 & 0 & 1 & 1 & 1 & 1 & 0 & 1 \\  \hline \hline  1 & 1 & 0 & 0 & 1 & 0 & 0 & 0 \\  \hline  1 & 1 & 0 & 1 & 1 & 0 & 0 & 1 \\  \hline  1 & 1 & 1 & 0 & 1 & 0 & 1 & 1 \\  \hline  1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 \\  \hline \hline \end{tabular}

使用 K-map 从格雷码中取回二进制位——
K图为b_0 ——

K图为b_1 ——

K图为b_2 ——

K图为b_3 ——

对应的布尔表达式——

     \begin{align*} b_0 &=g_3^\prime g_2^\prime g_1^\prime g_0 + g_3^\prime g_2^\prime g_1g_0^\prime + g_3^\prime g_2g_1^\prime g_0^\prime  + g_3^\prime g_2g_1g_0 +g_3g_2^\prime g_1^\prime g_0^\prime  + g_3g_2^\prime g_1g_0 \\ &\:\:\:+g_3g_2g_1^\prime g_0 + g_3g_2g_1g_0^\prime \\ &= g_3^\prime g_2^\prime( g_1^\prime g_0 +  g_1g_0^\prime) + g_3^\prime g_2(g_1^\prime g_0^\prime  + g_1g_0) +g_3g_2^\prime(g_1^\prime g_0^\prime  +  g_1g_0 )\\ &\:\:\:+g_3g_2 (g_1^\prime g_0 + g_1g_0^\prime) \\ &= g_3^\prime g_2^\prime(g_0\oplus g_1) + g_3^\prime g_2(g_0\odot g_1)+g_3g_2^\prime(g_0\odot g_1) + g_3g_2 (g_0\oplus g_1) \\ &= (g_0\oplus g_1)(g_2\odot g_3) + (g_0\odot g_1)(g_2\oplus g_3)\\ &= g_3\oplus g_2\oplus g_1\oplus g_0\\ b_1 &= g_3^\prime g_2^\prime g_1 + g_3^\prime g_2g_1^\prime  + g_3g_2g_1 + g_3g_2^\prime g_1^\prime \\ &= g_3^\prime(g_2^\prime g_1 + g_2g_1^\prime)  + g_3(g_2g_1 + g_2^\prime g_1^\prime) \\ &= g_3^\prime(g_2\oplus g_1)  + g_3(g_2\odot g_1) \\ &= g_3\oplus g_2\oplus g_1\\ b_2 &= g_3^\prime g_2 + g_3g_2^\prime\\ &= g_3\oplus g_2\\ b_3 &= g_3 \end{align*}

对应的数字电路——

参考 –

数字设计,第 5 版,Morris Mano 和 Michael Ciletti