《FPGA全程進階---實戰演練》第十二章 二進位碼與格雷碼PK

来源:http://www.cnblogs.com/raymon-tec/archive/2016/01/17/5136985.html
-Advertisement-
Play Games

大家在寫程式的時候,可能會聽聞,什麼獨熱碼,什麼格雷碼,什麼二進位碼等等,本節意在解釋這幾種編碼之間的區別和優勢以及用verilog怎麼去實現,下麵先介紹這幾種編碼的區別。1 基礎理論部分1.1 獨熱碼 獨熱碼,在英文文獻中稱做 one-hot code, 直觀來說就是有多少個狀態就有多少比特,而....


  大家在寫程式的時候,可能會聽聞,什麼獨熱碼,什麼格雷碼,什麼二進位碼等等,本節意在解釋這幾種編碼之間的區別和優勢以及用verilog怎麼去實現,下麵先介紹這幾種編碼的區別。

1 基礎理論部分

1.1 獨熱碼

  獨熱碼,在英文文獻中稱做 one-hot code, 直觀來說就是有多少個狀態就有多少比特,而且只有一個比特為1,其他全為0的一種碼制。

  如,有十六個狀態的獨熱碼狀態編碼應該是:0000000000000001,0000000000000010,0000000000000100,0000000000001000,0000000000010000,0000000000100000 ,……,10000000000000000。但是通常我們為了方便書寫,將二進位簡化為十六進位表示(從右往左每四位二進位位用一位十六進位數表示),那麼,以上十六狀態的獨熱碼可以表示成0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, ……, 0x8000。

1.2 格雷碼

  在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進位數不同,則稱這種編碼為格雷碼(Gray Code),另外由於最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱迴圈碼或反射碼。

1.3 二進位碼

  二進位代碼:由兩個基本字元'0'、'1'組成的代碼。其中,碼元:"一位"二進位代碼。碼字:N個碼元可以組成的不同組合,任意一個組合稱一個碼字。

1.4 二進位編和格雷碼利弊

  二進位編碼、格雷碼編碼使用最少的觸發器,消耗較多的組合邏輯,而獨熱碼編碼反之。獨熱碼編碼的最大優勢在於狀態比較時僅僅需要比較一個位,從而一定程度上簡化了解碼邏輯。雖然在需要表示同樣的狀態數時,獨熱編碼占用較多的位,也就是消耗較多的觸發器,但這些額外觸發器占用的面積可與解碼電路省下來的面積相抵消。

  由於CPLD更多地提供組合邏輯資源,而FPGA更多地提供觸發器資源,所以CPLD多使用gray-code,而FPGA多使用one-hot編碼。另一方面,對於小型設計使用gray-code和binary編碼更有效,而大型狀態機使用one-hot更高效。

  關於獨熱碼,我們在使用狀態機的時候,會詳細解釋。為了更進一步說明二進位碼和格雷碼之間的關係,可以查看下圖12.1。

方法一:

wps3066.tmp

圖12.1 二進位碼與獨熱碼

  上述的方法可以稱為遞歸法,從0~7的高位都是0,後8~15的高位都是1,那麼由二進位怎麼去實現格雷碼,如下圖12.2所示。

方法二:適合於編程實現

wps3086.tmp

圖12.2 計算格式

  也即對原位進行移位,然後和原位進行求抑或操作。

  那麼格雷碼怎麼去實現二進位呢?且看下圖12.3解釋:

wps3097.tmp

wps30A8.tmp

圖12.3

  由上圖可以分析得出,最高位是保持不變的,然後以後每一位都要和前幾位進行求異或操作。下麵我們就用verilog來實現。

2 Verilog代碼實現部分

2.1 二進位轉格雷碼

講解最重要的代碼部分,如圖12.4

wps30B8.tmp

圖12.4 代碼實現部分

  最重要的代碼一行搞定。請大家看懂。

2.2 格雷碼轉二進位

  讓大家感受一下FPGA的並行的魅力,重要代碼如圖12.5所示,利用FPGA的並行加速,可以實現其他CPU不能比擬的速度。

wps30B9.tmp

圖12.5 轉換實現部分

3 Modelsim模擬部分

  部分重要代碼如圖12.6所示

wps30CA.tmp

圖12.6 模擬程式

  將輸入數據封裝成一個任務,然後在initial中直接調用任務即可,但要註意,data_init為輸入數據的初始化,一定要放在task_reset複位信號的前面,這一點不容忽視。

圖12.7為binary2gray模擬的波形。

wps30CB.tmp

圖12.7 模擬波形

  關於板級模擬,大家可以去利用四位LED或者數位管去實現,這裡不再贅述。

  圖12.8為testbench代碼部分,gray2binary

wps30DC.tmp

圖12.8 代碼實現部分

圖12.9為gray2binary模擬的波形

wps30EC.tmp

圖12.9 模擬波形


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、配置在需要上傳的工程中的pom.xml文件中加入下麵的配置releaseRelease Repositoryhttp://ip/nexus/content/repositories/releasessnapshotSnapshot Repositoryhttp://ip/nexus/conten...
  • 對於一個學過C和Objective-C的程式猿來講,Swift編程語言的語法基礎非常簡單。但是Swift也是添加了很多新的語法,比如元組、可選類型等等。一、類型轉換和C、Objective-C中的類型強轉類似,只需要將常量或者變數放進 '()' 內,然後在括弧前面加上目標類型就可以了。 1 let ...
  • 面向對象編程簡單來說就是基於對類和對象的使用,所有的代碼都是通過類和對象來實現的編程就是面向對象編程!面向對象的三大特性:封裝、繼承、多態首先創建一個類#使用class創建一個School類,類中有個student方法class School: def student(self): ...
  • 登錄nexus私服後臺,按照下圖1-3的順序進行添加倉庫;其中步驟3有三種倉庫類型(Type)進行選擇1、 Hosted Repository:本地倉庫,在私服伺服器上存放用戶自行上傳的jar包;2、 Proxy Repository:遠程代理倉庫,從遠程下載jar包,並保存在私服伺服器;3、 Re...
  • 一、玩一玩playground首先要新建一個playground,創建完成之後,你會看到程式裡面有一個定義好的變數 str,在右邊的側欄中會顯示出變數的值,也就是說,我們在編程的過程中就能對變數進行實時監測。1.點擊右邊欄對應行的圓圈圖標,變數的值就會顯示在這行代碼的下麵2.點擊右邊欄對應行的眼睛圖...
  • log4jdbc是一個JDBC驅動器,能夠記錄SQL日誌和SQL執行時間等信息。log4jdbc使用SLF4J(Simple Logging Facade)作為日誌系統。特性:1.支持JDBC3和JDBC4。 2.支持現有大部分JDBC驅動。 3.易於配置(在大部分情況下,只需要改變驅動類名並...
  • 一、前言 一切的謎都解開了!在寫這篇隨筆之前,我的心情只能用金田一每次破案後的這句臺詞來表達。 其實從開始寫Java代碼以來,遇到過無數次亂碼與轉碼問題,比如從文本文件讀入到String出現亂碼,JSP獲取HTTP請求參數出現亂碼等問題,由於這些問題很常見,遇到的時候隨手百度一下一般都可以順...
  • process,字面意義,進程,看看它的結構 1 struct process { 2 struct process *next; 3 #if PROCESS_CONF_NO_PROCESS_NAMES 4 #define PROCESS_NAME_STRING(process) "" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...