最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

數(shù)字ic手撕代碼-格雷碼的編碼與解碼

2022-03-10 21:26 作者:不吃蔥的酸菜魚  | 我要投稿

????????大家好我是酸菜魚,這個(gè)系列著重講解數(shù)字ic或FPGA實(shí)習(xí)面試及秋招面試的高頻手撕代碼題。

????????往期專欄:

數(shù)字ic手撕代碼-導(dǎo)覽目錄 - 嗶哩嗶哩 (bilibili.com)?

數(shù)字IC手撕代碼-異步復(fù)位同步釋放 - 嗶哩嗶哩 (bilibili.com)

數(shù)字ic手撕代碼-邊沿檢測(上升沿、下降沿、雙邊沿) - 嗶哩嗶哩 (bilibili.com)

專欄眾多,不一一列舉,詳情請(qǐng)看導(dǎo)覽目錄...


格雷碼

????????格雷碼的主要特點(diǎn)是相鄰編碼值中只有一個(gè)比特發(fā)生改變,如下表所示。

從表中可以看到,相鄰編碼值中只有一個(gè)比特發(fā)生改變,那么這個(gè)特性有什么用呢?

這非常重要!

? ? ? ? 當(dāng)今格雷碼被廣泛應(yīng)用于 使用兩個(gè)不同時(shí)鐘的異步FIFO(First In First Out,先入先出存儲(chǔ)器)中。當(dāng)數(shù)值從一個(gè)時(shí)鐘域傳遞到另一個(gè)時(shí)鐘域時(shí),單比特翻轉(zhuǎn)的特性就會(huì)變得極為重要。

?????? ?在異步FIFO中,寫地址和度地址是根據(jù)讀寫操作,發(fā)生連續(xù)的改變,其地址是用二進(jìn)制計(jì)數(shù)器進(jìn)行表示的。以4比特計(jì)數(shù)器為例,該計(jì)數(shù)器從0計(jì)數(shù),數(shù)到15,到達(dá)15后歸零。在FIFO里,首先我們要使用轉(zhuǎn)換公式把二進(jìn)制編碼轉(zhuǎn)換成格雷碼,并使用格雷碼值從一個(gè)時(shí)鐘域傳遞到另一個(gè)時(shí)鐘域,然后使用另一個(gè)轉(zhuǎn)換公式將格雷碼轉(zhuǎn)換為二進(jìn)制碼。

????? ?當(dāng)多比特位寬的信號(hào)從一個(gè)時(shí)鐘域到另一個(gè)時(shí)鐘域時(shí),需要使用上面電路。開始時(shí),信號(hào)轉(zhuǎn)換成格雷碼,然后進(jìn)入CLKA時(shí)鐘域的寄存器。此后,通過兩級(jí)同步器(稱為打兩拍)同步到目的時(shí)鐘域。實(shí)現(xiàn)同步后,通過相反的譯碼過程(gray2bin)就可以實(shí)現(xiàn)多比特在兩個(gè)時(shí)鐘域之間的傳遞,看似繁瑣,但這一轉(zhuǎn)換是必要的!

? ? ????比如三比特的二進(jìn)制進(jìn)行跨時(shí)鐘域轉(zhuǎn)換。當(dāng)CLKA時(shí)鐘域中,數(shù)值從5變到6時(shí),經(jīng)同步器后,目的時(shí)鐘域的格雷碼變?yōu)?01,或者因?yàn)檠舆t,數(shù)值沒有改變,格雷碼還是111,要等到下一個(gè)周期(第三拍)之后才能變成101??梢钥闯?,無論是101還是111,最終傳遞的結(jié)果都是按照順序出現(xiàn)合法的編碼值。假如不使用這種二進(jìn)制-格雷碼、格雷碼-二進(jìn)制的轉(zhuǎn)換電路,直接在CLKB時(shí)鐘域打兩拍接收數(shù)據(jù)會(huì)出現(xiàn)什么情況呢?

????????經(jīng)過兩級(jí)同步后,同步之后的二進(jìn)制值可能是101(舊值)、110(新值),但也可能變成100或者111(因?yàn)榇騼膳倪^程是為了解決亞穩(wěn)態(tài),而信號(hào)翻轉(zhuǎn)時(shí)的亞穩(wěn)態(tài)不確定采樣到0還是采樣到1,所以低兩位變化結(jié)果不確定)。由于兩個(gè)時(shí)鐘相互獨(dú)立,同步器輸入的兩個(gè)比特分別進(jìn)行跨時(shí)鐘域同步,這些獨(dú)立同步并輸出的值可能出現(xiàn)在不同的時(shí)鐘周期上。

????????雖然最終所有比特會(huì)輸出正確的值,并且最終輸出將變?yōu)?10。然而,在轉(zhuǎn)變過程中,可能輸出違反技術(shù)規(guī)則的值,這是極其致命的。

????????對(duì)于FIFO來說,其空、滿狀態(tài)是根據(jù)其內(nèi)部數(shù)據(jù)深度進(jìn)行判斷得到的,當(dāng)出現(xiàn)這些臨時(shí)的非法值時(shí),FIFO可能會(huì)產(chǎn)生錯(cuò)誤的空、滿狀態(tài),從而造成外部電路對(duì)其內(nèi)部存儲(chǔ)數(shù)據(jù)量的錯(cuò)誤判斷,把一個(gè)有數(shù)據(jù)的FIFO認(rèn)為是空,把一個(gè)未滿的FIFO認(rèn)為是滿,造成系統(tǒng)錯(cuò)誤,甚至奔潰。

????????說了那么多,我們已經(jīng)知道為什么格雷碼很重要,以及格雷碼的用途(異步FIFO數(shù)據(jù)傳輸),下面我們來給出格雷碼和二進(jìn)制相互轉(zhuǎn)換的模塊。

binary_to_gray:

? ? ?????二進(jìn)制轉(zhuǎn)換格雷碼機(jī)制:格雷碼的最高位和二進(jìn)制的最高位是一樣的,格雷碼的其他位可以用二進(jìn)制對(duì)應(yīng)位和相鄰高位的異或得到,即

????????assign gray_value[ i ] = binary_value[ i ] ^ binary_value[ i + 1 ];

比對(duì)一下格雷碼二進(jìn)制轉(zhuǎn)換表,符合我們上面說的規(guī)律,知道轉(zhuǎn)換原理,寫代碼就簡單了。

代碼:

Testbench:

波形:

gray_to_binary:

????????格雷碼轉(zhuǎn)二進(jìn)制也是一樣的道理,二進(jìn)制最高位和格雷碼最高位一致。二進(jìn)制的其他位可以由格雷碼對(duì)應(yīng)位對(duì)應(yīng)二進(jìn)制的相鄰高位的異或得到。用公式表示即:

Binary[n]? ? = Gray[n];

Binary[n-1] = Binary[n] ^ Gray[n-1];

代碼:

Testbench:

波形:

所有結(jié)果都和我們?cè)O(shè)計(jì)的一樣,好,以上就是格雷碼轉(zhuǎn)二進(jìn)制及二進(jìn)制轉(zhuǎn)格雷碼的全部內(nèi)容。

數(shù)字ic手撕代碼-格雷碼的編碼與解碼的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
浮梁县| 酉阳| 白朗县| 华蓥市| 莱芜市| 方城县| 沧州市| 进贤县| 台江县| 铅山县| 阿拉善右旗| 洛浦县| 固阳县| 西乡县| 衡南县| 鞍山市| 翼城县| 得荣县| 延寿县| 绿春县| 濮阳县| 志丹县| 三明市| 昂仁县| 鹤岗市| 霞浦县| 丽江市| 珲春市| 奎屯市| 荣成市| 巩义市| 碌曲县| 鄂伦春自治旗| 湖南省| 丰原市| 长宁区| 蕲春县| 资阳市| 大姚县| 甘谷县| 临潭县|