色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于FPGA的Varint編碼設計原理和實現

電子工程師 ? 來源:FPGA技術江湖 ? 作者:FPGA技術江湖 ? 2021-04-02 16:29 ? 次閱讀

今天是畫師第二次和各位大俠見面,執筆繪畫FPGA江湖,本人最近項目經驗,寫了篇基于FPGA的Varint編碼(壓縮算法)實現,這里分享給大家,僅供參考。如有轉載,請在文章底部留言,請勿隨意轉載,否則有責必究。

1

概念

什么是Varint編碼呢?首先我們來介紹一下Varint編碼,Varint編碼就是一種用一個或多個字節將數據序列化,并對數據進行壓縮的方法,因此也可以稱之為Varint壓縮算法。

在進行數據傳輸過程,我們經常用大位寬來進行數據的傳輸。有時候是32位或者64位傳輸某個數據,然而,一直使用大位寬來傳輸數據也有它的缺點,比如傳輸很小的數據時,會造成資源的浪費。

例如,我們要傳送一個1,而用64位來傳輸的話就需要表示為00000000_00000000_00000000_00000000_00000000_000000000_00000000_00000001,用這樣的方式來傳輸一個1需要消耗8Byte的存儲,屬實是很浪費存儲空間,而使用Varint編碼對它進行壓縮后,我們只需要一個Byte就能將它傳輸出去,大大節省了存儲空間,避免了資源的浪費。

2

設計原理

下面我們就來介紹一下Varint編碼是如何對原有數據進行編碼處理的。在介紹Varint編碼原理之前,我們先介紹一下字節數據的兩種排序方式,大端和小端。大端數據指的是將高位的數據存在低位的地址中,例如將0x01234567存入一個64位的寄存器reg,則存入高位reg[7]的是7,然后依次是reg[6]=6、reg[5]=5、reg[4]=4、reg[3]=3、reg[2]=2、reg[1]=1、reg[0]=0,即逆序存入寄存器中,這種方式就稱之為大端序。小端序即反之,高位的數據存入高地址,低位的數據放入低地址。

在這基礎上我們再來講Varint編碼的原理,Varint編碼使用的就是大端序。Varint編碼將有無效數據去除,然后將效數據分成若干個組,每個組為8位,即一個字節,除去最后一個字節外,其余有效組最高位均為1,最后一個字節最高位為0。有效組最高位為1即代表這個字節后面還有有效數據組,當有效數據組最高位為0時則代表當前有效組為最后一個有效字節,除去最高位,其余位均為有效數據。

我們可以舉個例子來更加詳細的說明這個原理。 仍然以64位數據為例,如00000000_00000000_00010001_11011001_00110011_10101001_11001100_00110011。編碼步驟如下:

(1)首先從最后一個字節開始進行編碼,最后一個字節為00110011,按照編碼規則我們取后七位,即截取0110011,因為后面還有數據,則最高位取1,然后與截取的有效數據組合在一起組成第一個有效數據組10110011,然后放在整個數據的最高位。

(2)然后是第二個數據,同樣往前取七位,得到0011000,同樣在本組最高位補1,即得到10011000,組合第一個數據組則為10110011_10011000。

(3)第三個數據,再往前取七位,得到0100111,在本有效數據組最高位補1,得到10100111,再拼接到前面的有效數據組之后,即10110011_10011000_10100111。

(4)第四個數據,同樣的方式往前取七位,得到0011101,最高位補1,得到10011101,繼續拼接在有效數據組后面,即10110011_10011000_10100111_10011101。

(5)第五個數據,再往前取七位,得到0010011,在最高位補1,得到10010011,繼續往有效數據組后拼接,得到10110011_10011000_10100111_10011101_10010011。

(6)第六個數據,按照上述方法,可得10111011,拼接后可得10110011_10011000_10100111_10011101_10010011_10111011。

(7)第七個數據,取得0000100,由觀察得知,這個有效數據組之后均為0,即有效數據已全部截取完畢,則按照Varint編碼規則,最高位補0,完成編碼,將數據全部拼接后得到進行Varint編碼后的數據,即10110011_10011000_10100111_10011101_10010011_10111011_00000100。

將上述進行Varint編碼后得到的有效數據組與原數據相比,節省了一個字節的存儲資源。解碼只要將上述過程逆序進行即可,這里就不過多贅述。熟悉完了Varint編碼的原理,下面我們就可以開始進行設計了。

3

架構設計

設計架構如下圖:

bf80dd5a-9384-11eb-8b86-12bb97331649.png

將本設計模塊命名為varint_encode,clk為輸入時鐘rst_n為復位信號,idata為64位是輸入數據,ivalid為數據有效信號,odata0~odata7為輸出的有效數據,ovalid0~ovalid7為伴隨輸出有效數據的數據有效信號。由于FPGA輸出的數據位寬都是固定的,因此需要將各個壓縮后的位寬都定義一遍。

仿真測試及結果

仿真測試代碼如下:

`timescale 1ns/1ps

module varint_encode_tb;

reg clk; reg rst_n; reg ivalid; reg [63:0] idata; wire [63:0] odata0; wire [55:0] odata1; wire [47:0] odata2; wire [39:0] odata3; wire [31:0] odata4; wire [23:0] odata5; wire [15:0] odata6; wire [7:0] odata7; wire ovalid0; wire ovalid1; wire ovalid2; wire ovalid3; wire ovalid4; wire ovalid5; wire ovalid6; wire ovalid7;

varint_encode varint_encode_inst(

.clk (clk), .rst_n (rst_n), .idata (idata), .ivalid (ivalid), .odata0 (odata0), .odata1 (odata1), .odata2 (odata2), .odata3 (odata3), .odata4 (odata4), .odata5 (odata5), .odata6 (odata6), .odata7 (odata7), .ovalid0 (ovalid0), .ovalid1 (ovalid1), .ovalid2 (ovalid2), .ovalid3 (ovalid3), .ovalid4 (ovalid4), .ovalid5 (ovalid5), .ovalid6 (ovalid6), .ovalid7 (ovalid7) );

initial clk = 1‘b0; always # 10 clk = ~clk; initial begin rst_n = 1’b0; ivalid = 1‘b0; idata = 64’d0; # 201; rst_n = 1‘b1; # 200;

@ (posedge clk); # 2; idata = 64’b00000000_00000000_00010001_11011001_00110011_10101001_11001100_00110011; ivalid = 1‘b1; @ (posedge clk); # 2; idata = 64’d0; ivalid = 1‘b0; @ (posedge clk); # 2; idata = 64’b00000000_00000001_00010001_11011001_00110011_10101001_11001100_00110011; ivalid = 1‘b1; @ (posedge clk); # 2; idata = 64’d0; ivalid = 1‘b0; @ (posedge clk); # 2; idata = 64’b00000000_00000000_00000001_11011001_00110011_10101001_11001100_00110011; ivalid = 1‘b1; @ (posedge clk); # 2; idata = 64’d0; ivalid = 1‘b0; @ (posedge clk); # 2; idata = 64’b00000000_00000000_00000000_00000001_00110011_10101001_11001100_00110011; ivalid = 1‘b1; @ (posedge clk); # 2; idata = 64’d0; ivalid = 1‘b0; @ (posedge clk); # 2; idata = 64’b00000000_00000000_00000000_00000000_00000000_10101001_11001100_00110011; ivalid = 1‘b1; @ (posedge clk); # 2; idata = 64’d0; ivalid = 1‘b0; # 2000; $stop; end

endmodule

仿真結果:

bf8bdcaa-9384-11eb-8b86-12bb97331649.png

bfb83bc4-9384-11eb-8b86-12bb97331649.png

將得到的仿真結果與上文經過Varint編碼壓縮后的結果對比可知,仿真結果正確。

6

總結

在進行原理理解與設計實現的時候,需要注意,逆序是字節的逆序,并非每一bit的數據都要進行逆序,且最高位是補位,代表后面還有無數據,并非是實際數據,在進行解碼的時候要注意去掉每一個有效數據組的最高位,再進行拼接,這樣得到的數據才是正確的數據,否則得到的將是錯誤數據。考慮到FPGA位寬定義的局限性,需要對每一個可能性的位寬大小均進行定義,并且定義一個相應的脈沖信號,告訴后級模塊哪一個數據是有效的,這樣設計才不會出錯,否則輸出的大小與原來輸入的大小相同,也就失去了設計的意義。

原文標題:壓縮算法 | 基于FPGA的Varint編碼實現(附代碼)

文章出處:【微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21796

    瀏覽量

    605725
  • 編碼
    +關注

    關注

    6

    文章

    957

    瀏覽量

    54944

原文標題:壓縮算法 | 基于FPGA的Varint編碼實現(附代碼)

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    利用FPGA實現USB 2.0通信接口

    USB?2.0接口的實現方式 利用FPGA實現USB 2.0接口的方式一般有兩種,一是借助外圍的USB接口芯片,二是FPGA內部實現USB
    的頭像 發表于 12-30 13:59 ?703次閱讀
    利用<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b>USB 2.0通信接口

    基于FPGA實現圖像直方圖設計

    簡單,單采用FPGA實現直方圖的統計就稍顯麻煩。若使用Xilinx和Altera的FPGA芯片,可以使用HLS來進行圖像的加速處理。但這暫時不是我的重點。 用C語言實現直方圖統計:u
    的頭像 發表于 12-24 10:24 ?203次閱讀
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b>圖像直方圖設計

    FPGA驅動AD芯片之實現與芯片通信

    概述:?利用FPGA實現AD芯片的時序,進一步實現與AD芯片數據的交互,主要熟悉FPGA對時序圖的實現,掌握時序圖轉換Verilog硬件描述
    的頭像 發表于 12-17 15:27 ?422次閱讀
    <b class='flag-5'>FPGA</b>驅動AD芯片之<b class='flag-5'>實現</b>與芯片通信

    編碼器邏輯功能解析與實現

    在現代電子技術與自動化控制系統中,編碼器作為一種關鍵性傳感器,扮演著舉足輕重的角色。它通過將機械位移或旋轉轉換成數字信號,為各種設備提供了精確的位置、速度和方向信息。本文將深入探討編碼器的邏輯功能,并解析其在實際應用中的實現方式
    的頭像 發表于 11-30 14:35 ?572次閱讀

    如何在FPGA實現按鍵消抖

    FPGA(現場可編程門陣列)中實現按鍵消抖是一個重要的設計環節,特別是在處理用戶輸入時,由于物理按鍵的機械特性和電氣特性,按鍵在按下和釋放的瞬間會產生抖動現象,這種抖動可能導致系統錯誤地識別為多次
    的頭像 發表于 08-19 18:15 ?2204次閱讀

    FPGA在視頻編碼方面的應用有大佬做過嗎?

    有大佬做過FPGA在視頻編碼方面的應用嗎?有沒有芯片的推薦?或者了解的路線?
    發表于 07-29 15:37

    分享幾個用FPGA實現的小型神經網絡

    今天我們分享幾個用FPGA實現的小型神經網絡,側重應用。
    的頭像 發表于 07-24 09:30 ?1301次閱讀
    分享幾個用<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b>的小型神經網絡

    如何在FPGA實現神經網絡

    可編程門陣列(FPGA)作為一種靈活、高效的硬件實現方式,為神經網絡的加速提供了新的思路。本文將從FPGA實現神經網絡的基本原理、關鍵技術、實現
    的頭像 發表于 07-10 17:01 ?2280次閱讀

    FPGA實現SDIO訪問需要注意的問題

    FPGA實現SDIO訪問時,需要注意以下幾個關鍵問題和細節: 初始化過程: SDIO總線的初始化是確保FPGA與SD卡能夠正常通信的第一步。這包括設置時鐘頻率、配置數據傳輸模式以及校驗協議等
    發表于 06-27 08:38

    珠海鏨芯實現28納米FPGA流片

    近日,珠海鏨芯半導體有限公司在其官方微博上宣布,已成功實現28納米流片。此次流片成功的CERES-1 FPGA芯片,不僅對標國際主流28納米FPGA架構,還實現了管腳和比特流的完全兼容
    的頭像 發表于 06-03 11:11 ?866次閱讀

    FPGA實現什么樣的算法?

    FPGA功能如此強大,請問用FPGA實現或者比較適合實現什么樣的算法?
    發表于 05-26 20:18

    AG32:工業伺服編碼器應用

    編碼器又可以分為光電編碼器和磁性編碼器。 傳統編碼器的架構設計中,很多采用了MCU+CPLD(FPGA)的設計方案,CPLD/
    發表于 05-08 11:16

    基于FPGA的TMDS編碼

    音頻或視頻信號,接下來就著重了解一下TMDS編碼。 TMDS(最小化傳輸差分信號)中,有四個通道,其中包含了三個數據通道和一個時鐘通道。其中數據通道用來傳輸顏色、音頻、控制等信號。HDMI默認
    發表于 04-09 15:45

    基于FPGA 的DDS正弦信號發生器的設計和實現

    電子發燒友網站提供《基于FPGA 的DDS正弦信號發生器的設計和實現.pdf》資料免費下載
    發表于 03-24 09:34 ?8次下載

    FPGA處理編碼信號進行毛刺濾波的方法實現

    在利用處理編碼信號時,一般在較為理想的環境下可以很方便進行計算,判斷等。
    的頭像 發表于 02-21 14:46 ?1661次閱讀
    <b class='flag-5'>FPGA</b>處理<b class='flag-5'>編碼</b>信號進行毛刺濾波的方法<b class='flag-5'>實現</b>
    主站蜘蛛池模板: 午夜人妻理论片天堂影院 | 国产精品亚欧美一区二区三区 | 国产av免费观看日本 | 亚洲 日韩 欧美 另类 蜜桃 | 国产精品午夜福利在线观看 | 草久热的视频在线观看 | 俄罗斯少女人体 | 性色香蕉AV久久久天天网 | xx69美国 | 久久亚洲这里只有精品18 | 中文字幕在线永久 | 日本久久和电影 | 奇米精品一区二区三区在线观看 | 女人被躁到高潮嗷嗷叫免费 | 亚洲AV永久无码精品澳门 | 国产a级黄色毛片 | 中文无码第3页不卡av | www.伊人| 交换邻居波多野结衣中文字幕 | 日韩精品一区二区中文 | yellow在线观看免费观看大全 | 日日踫夜夜爽无码久久 | 成年人视频免费在线播放 | 无码国产精品高潮久久9 | 日本日本熟妇中文在线视频 | 国产一卡2卡3卡4卡孕妇网站 | 国产精品麻豆高潮刺激A片 国产精品麻豆a在线播放 | 亚洲精品乱码久久久久久中文字幕 | 国产欧美另类久久久品 | 999精品影视在线观看 | 牢记永久免费网址 | 含羞草免费完整视频在线观看 | 亚洲伊人色 | AV国产乱码一区二区三视频 | 国产亚洲精品高清视频免费 | 久草在线在线精品观看 | 免费精品一区二区三区在线观看 | 成人区精品一区二区不卡AV免费 | 成熟YIN荡美妞A片视频麻豆 | JK白丝校花爽到娇喘视频 | 亚洲一区日韩一区欧美一区a |