USB 之傳輸編碼格式 NRZI 介紹

NRZI (Non-Return-to-Zero Inerted code) 非歸零翻轉編碼,以前,我先稍微記錄一下他的前身異步

RZ 編碼(Return- to - zero coding)

  RZ 編碼,簡單的來講,就是在每一位普通的編碼後面加了一個零電平。因此叫作歸零編碼,正電平表明1,後面再接一個0電平,告訴接收器該同步了,負電平表明0,而後又接一個0電平。 以下圖所示。編碼

  能夠看到,每一位後面都接了一位0電平,因此接收器在接收到 0 之後採樣便可,這樣就不用單獨的時鐘信號,實際上,RZ編碼就至關於把時鐘信號用 0 編碼在數據以內,這樣的信號也叫自同步(self-clocking)信號。 這樣的作法雖然在物理上少了一根時鐘線,可是在帶寬上確有一大部分都用在歸零上面了。spa

第二種演變,去掉歸零 NRZ (Non - Return - to - Zero - code)編碼,就是講 RZ 編碼的歸零去掉

  NRZ編碼既是將邏輯1編碼做爲一個DC電平,邏輯0作爲另外一個DC電平。它與RZ碼的區別就是它不用歸零,也就是說,一個週期能夠所有用來傳輸數據,這樣傳輸的帶寬就能夠徹底利用。通常常見的帶有時鐘線的傳輸協議都是使用NRZ編碼或者差分的NRZ編碼。所以,使用NRZ編碼若想傳輸高速同步數據,基本上都要帶有時鐘線,由於自己NRZ編碼沒法傳遞時鐘信號。但在低速異步傳輸下能夠不存在時鐘線,但在通訊前,雙方設備要約定好通訊波特率,例如UART。code

NRZ通常用於設備內的信號傳輸,對於串行傳輸,它有許多缺點:blog

(1)數據自己不攜帶時鐘信息,所以不能自定時(即這樣作雖然咱們帶寬不浪費了,可是咱們的時鐘線的同步信號又要另外給。);此外,一個全是1或全是0的長串編碼結果就是一個固定的電平,沒有跳變。同步

(2)它的DC份量隨着數據流內容的變化而變化,低頻內容每每占主導地位。class

        因爲這些緣由,除了低速短距離通信,好比SPI等 外,NRZ不多用於串行傳輸。coding

第三種演變,NRZI(Non - Return - to - Zero - Inverted - code) 非歸零反相編碼

  和NRZ 編碼不一樣的是,NRZI 編碼利用的電平的翻轉來表明一個邏輯,當前電平相對於前一個電平不變表明0,當前電平相對於前一個電平相反表明1 USB 的傳輸就是用的 NRZI 編碼格式,在USB 中,電平翻轉表明邏輯1,電平不變表明邏輯0。限定最大0的數目,NRZI就能夠實現自定時能力。好比,將全0的同步碼反向,因而產生連續的跳變,這樣便於PLL鎖定。NRZI頻譜依然有一個相對較高的低頻份量,且它的直流份量也不是自由的(反轉用0或是1,並非必定的)。技巧

 

 

數據同步問題

  NRZ 和 NRZI 都沒有同步的特性,可是,能夠用一些比較特殊的技巧來解決,好比,先發送一個同步頭,內容是0101010, 讓接收着經過這個同步頭來計算髮出的頻率,而後再用這個頻率去接收以後的數據信號。方法

  在USB 中,每個USB的數據包,最開始的時候都有一個同步域,這個域定義爲 0000 0001,這個域經過 NRZI 編碼後,就是一個正負正負的方波,接收者能夠經過這個方波計算頻率,而後同步後面的數據。

  此外,由於在USB的NRZI編碼下,邏輯1會形成電平翻轉,因此接受者在接收數據時,根據接收的翻轉信號調整頻率,保證數據傳輸正確

  可是,這樣還會有一個問題,接收者能夠主動和發送者之間頻率匹配,可是二者之間總會有偏差,假如數據是1000個邏輯0,通過 NRZI 編碼後,很長時間都是同一個電平,這種狀況下,便是接收者和發送者之間的頻率相差千分之一,就是形成採樣 999 個0或者是1001 個0

  USB 對這種問題的解決方法就是強制插一個1,規定爲傳輸6個0後在數據中插入一個1,即發送前就會在第6個0後面強制插入一個1,就讓發送的信號強制出現翻轉,從而強制接受者調整頻率,接受者只要刪除6個1以後的那個0,就能夠恢復原有的數據。

相關文章
相關標籤/搜索