0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于FPGA的Varint編碼設(shè)計(jì)原理和實(shí)現(xiàn)

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

今天是畫師第二次和各位大俠見面,執(zhí)筆繪畫FPGA江湖,本人最近項(xiàng)目經(jīng)驗(yàn),寫了篇基于FPGA的Varint編碼(壓縮算法)實(shí)現(xiàn),這里分享給大家,僅供參考。如有轉(zhuǎn)載,請(qǐng)?jiān)谖恼碌撞苛粞裕?qǐng)勿隨意轉(zhuǎn)載,否則有責(zé)必究。

1

概念

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

在進(jìn)行數(shù)據(jù)傳輸過程,我們經(jīng)常用大位寬來進(jìn)行數(shù)據(jù)的傳輸。有時(shí)候是32位或者64位傳輸某個(gè)數(shù)據(jù),然而,一直使用大位寬來傳輸數(shù)據(jù)也有它的缺點(diǎn),比如傳輸很小的數(shù)據(jù)時(shí),會(huì)造成資源的浪費(fèi)。

例如,我們要傳送一個(gè)1,而用64位來傳輸?shù)脑捑托枰硎緸?0000000_00000000_00000000_00000000_00000000_000000000_00000000_00000001,用這樣的方式來傳輸一個(gè)1需要消耗8Byte的存儲(chǔ),屬實(shí)是很浪費(fèi)存儲(chǔ)空間,而使用Varint編碼對(duì)它進(jìn)行壓縮后,我們只需要一個(gè)Byte就能將它傳輸出去,大大節(jié)省了存儲(chǔ)空間,避免了資源的浪費(fèi)。

2

設(shè)計(jì)原理

下面我們就來介紹一下Varint編碼是如何對(duì)原有數(shù)據(jù)進(jìn)行編碼處理的。在介紹Varint編碼原理之前,我們先介紹一下字節(jié)數(shù)據(jù)的兩種排序方式,大端和小端。大端數(shù)據(jù)指的是將高位的數(shù)據(jù)存在低位的地址中,例如將0x01234567存入一個(gè)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,即逆序存入寄存器中,這種方式就稱之為大端序。小端序即反之,高位的數(shù)據(jù)存入高地址,低位的數(shù)據(jù)放入低地址。

在這基礎(chǔ)上我們?cè)賮碇vVarint編碼的原理,Varint編碼使用的就是大端序。Varint編碼將有無效數(shù)據(jù)去除,然后將效數(shù)據(jù)分成若干個(gè)組,每個(gè)組為8位,即一個(gè)字節(jié),除去最后一個(gè)字節(jié)外,其余有效組最高位均為1,最后一個(gè)字節(jié)最高位為0。有效組最高位為1即代表這個(gè)字節(jié)后面還有有效數(shù)據(jù)組,當(dāng)有效數(shù)據(jù)組最高位為0時(shí)則代表當(dāng)前有效組為最后一個(gè)有效字節(jié),除去最高位,其余位均為有效數(shù)據(jù)。

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

(1)首先從最后一個(gè)字節(jié)開始進(jìn)行編碼,最后一個(gè)字節(jié)為00110011,按照編碼規(guī)則我們?nèi)『笃呶?,即截?110011,因?yàn)楹竺孢€有數(shù)據(jù),則最高位取1,然后與截取的有效數(shù)據(jù)組合在一起組成第一個(gè)有效數(shù)據(jù)組10110011,然后放在整個(gè)數(shù)據(jù)的最高位。

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

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

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

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

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

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

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

3

架構(gòu)設(shè)計(jì)

設(shè)計(jì)架構(gòu)如下圖:

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

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

仿真測(cè)試及結(jié)果

仿真測(cè)試代碼如下:

`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

仿真結(jié)果:

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

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

將得到的仿真結(jié)果與上文經(jīng)過Varint編碼壓縮后的結(jié)果對(duì)比可知,仿真結(jié)果正確。

6

總結(jié)

在進(jìn)行原理理解與設(shè)計(jì)實(shí)現(xiàn)的時(shí)候,需要注意,逆序是字節(jié)的逆序,并非每一bit的數(shù)據(jù)都要進(jìn)行逆序,且最高位是補(bǔ)位,代表后面還有無數(shù)據(jù),并非是實(shí)際數(shù)據(jù),在進(jìn)行解碼的時(shí)候要注意去掉每一個(gè)有效數(shù)據(jù)組的最高位,再進(jìn)行拼接,這樣得到的數(shù)據(jù)才是正確的數(shù)據(jù),否則得到的將是錯(cuò)誤數(shù)據(jù)??紤]到FPGA位寬定義的局限性,需要對(duì)每一個(gè)可能性的位寬大小均進(jìn)行定義,并且定義一個(gè)相應(yīng)的脈沖信號(hào),告訴后級(jí)模塊哪一個(gè)數(shù)據(jù)是有效的,這樣設(shè)計(jì)才不會(huì)出錯(cuò),否則輸出的大小與原來輸入的大小相同,也就失去了設(shè)計(jì)的意義。

原文標(biāo)題:壓縮算法 | 基于FPGA的Varint編碼實(shí)現(xiàn)(附代碼)

文章出處:【微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21738

    瀏覽量

    603461
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    942

    瀏覽量

    54836

原文標(biāo)題:壓縮算法 | 基于FPGA的Varint編碼實(shí)現(xiàn)(附代碼)

文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于FPGA實(shí)現(xiàn)圖像直方圖設(shè)計(jì)

    簡單,單采用FPGA實(shí)現(xiàn)直方圖的統(tǒng)計(jì)就稍顯麻煩。若使用Xilinx和Altera的FPGA芯片,可以使用HLS來進(jìn)行圖像的加速處理。但這暫時(shí)不是我的重點(diǎn)。 用C語言實(shí)現(xiàn)直方圖統(tǒng)計(jì):u
    的頭像 發(fā)表于 12-24 10:24 ?103次閱讀
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b>圖像直方圖設(shè)計(jì)

    FPGA驅(qū)動(dòng)AD芯片之實(shí)現(xiàn)與芯片通信

    概述:?利用FPGA實(shí)現(xiàn)AD芯片的時(shí)序,進(jìn)一步實(shí)現(xiàn)與AD芯片數(shù)據(jù)的交互,主要熟悉FPGA對(duì)時(shí)序圖的實(shí)現(xiàn),掌握時(shí)序圖轉(zhuǎn)換Verilog硬件描述
    的頭像 發(fā)表于 12-17 15:27 ?237次閱讀
    <b class='flag-5'>FPGA</b>驅(qū)動(dòng)AD芯片之<b class='flag-5'>實(shí)現(xiàn)</b>與芯片通信

    編碼器邏輯功能解析與實(shí)現(xiàn)

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

    如何在FPGA實(shí)現(xiàn)按鍵消抖

    FPGA(現(xiàn)場可編程門陣列)中實(shí)現(xiàn)按鍵消抖是一個(gè)重要的設(shè)計(jì)環(huán)節(jié),特別是在處理用戶輸入時(shí),由于物理按鍵的機(jī)械特性和電氣特性,按鍵在按下和釋放的瞬間會(huì)產(chǎn)生抖動(dòng)現(xiàn)象,這種抖動(dòng)可能導(dǎo)致系統(tǒng)錯(cuò)誤地識(shí)別為多次
    的頭像 發(fā)表于 08-19 18:15 ?1922次閱讀

    FPGA在視頻編碼方面的應(yīng)用有大佬做過嗎?

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

    分享幾個(gè)用FPGA實(shí)現(xiàn)的小型神經(jīng)網(wǎng)絡(luò)

    今天我們分享幾個(gè)用FPGA實(shí)現(xiàn)的小型神經(jīng)網(wǎng)絡(luò),側(cè)重應(yīng)用。
    的頭像 發(fā)表于 07-24 09:30 ?1199次閱讀
    分享幾個(gè)用<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b>的小型神經(jīng)網(wǎng)絡(luò)

    FPGA實(shí)現(xiàn)SDIO訪問需要注意的問題

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

    珠海鏨芯實(shí)現(xiàn)28納米FPGA流片

    近日,珠海鏨芯半導(dǎo)體有限公司在其官方微博上宣布,已成功實(shí)現(xiàn)28納米流片。此次流片成功的CERES-1 FPGA芯片,不僅對(duì)標(biāo)國際主流28納米FPGA架構(gòu),還實(shí)現(xiàn)了管腳和比特流的完全兼容
    的頭像 發(fā)表于 06-03 11:11 ?813次閱讀

    FPGA實(shí)現(xiàn)什么樣的算法?

    FPGA功能如此強(qiáng)大,請(qǐng)問用FPGA實(shí)現(xiàn)或者比較適合實(shí)現(xiàn)什么樣的算法?
    發(fā)表于 05-26 20:18

    AG32:工業(yè)伺服編碼器應(yīng)用

    ,編碼器又可以分為光電編碼器和磁性編碼器。 傳統(tǒng)編碼器的架構(gòu)設(shè)計(jì)中,很多采用了MCU+CPLD(FPGA)的設(shè)計(jì)方案,CPLD/
    發(fā)表于 05-08 11:16

    基于FPGA的TMDS編碼

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

    FPGA處理編碼信號(hào)進(jìn)行毛刺濾波的方法實(shí)現(xiàn)

    在利用處理編碼信號(hào)時(shí),一般在較為理想的環(huán)境下可以很方便進(jìn)行計(jì)算,判斷等。
    的頭像 發(fā)表于 02-21 14:46 ?1592次閱讀
    <b class='flag-5'>FPGA</b>處理<b class='flag-5'>編碼</b>信號(hào)進(jìn)行毛刺濾波的方法<b class='flag-5'>實(shí)現(xiàn)</b>

    FPGA實(shí)現(xiàn)原理

    FPGA(Field-Programmable Gate Array,現(xiàn)場可編程門陣列)是一種特殊的集成電路,其內(nèi)部結(jié)構(gòu)由大量的可配置邏輯塊和互連線組成。FPGA可以通過編程來實(shí)現(xiàn)各種數(shù)字系統(tǒng)功能
    發(fā)表于 01-26 10:03

    關(guān)于FPGA的開源項(xiàng)目介紹

    Hello,大家好,之前給大家分享了大約一百多個(gè)關(guān)于FPGA的開源項(xiàng)目,涉及PCIe、網(wǎng)絡(luò)、RISC-V、視頻編碼等等,這次給大家?guī)淼氖遣豢菰锏膴蕵讽?xiàng)目,主要偏向老的游戲內(nèi)核使用FPGA進(jìn)行硬解,涉及的內(nèi)核數(shù)不勝數(shù),主要目標(biāo)是
    的頭像 發(fā)表于 01-10 10:54 ?1465次閱讀
    關(guān)于<b class='flag-5'>FPGA</b>的開源項(xiàng)目介紹

    IIC總線的FPGA實(shí)現(xiàn)說明

    DE2_TV中,有關(guān)于寄存器的配置的部分,采用的方法是通過IIC的功能,這里對(duì)IIC總線的FPGA實(shí)現(xiàn)做個(gè)說明。
    的頭像 發(fā)表于 01-05 10:16 ?1068次閱讀
    IIC總線的<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b>說明