91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

電子工程師 ? 來(lái)源:FPGA技術(shù)江湖 ? 作者:FPGA技術(shù)江湖 ? 2021-04-02 16:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

1

概念

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

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

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

2

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

下面我們就來(lái)介紹一下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,即逆序存入寄存器中,這種方式就稱(chēng)之為大端序。小端序即反之,高位的數(shù)據(jù)存入高地址,低位的數(shù)據(jù)放入低地址。

在這基礎(chǔ)上我們?cè)賮?lái)講Varint編碼的原理,Varint編碼使用的就是大端序。Varint編碼將有無(wú)效數(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è)例子來(lái)更加詳細(xì)的說(shuō)明這個(gè)原理。 仍然以64位數(shù)據(jù)為例,如00000000_00000000_00010001_11011001_00110011_10101001_11001100_00110011。編碼步驟如下:

(1)首先從最后一個(gè)字節(jié)開(kāi)始進(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ǔ)資源。解碼只要將上述過(guò)程逆序進(jìn)行即可,這里就不過(guò)多贅述。熟悉完了Varint編碼的原理,下面我們就可以開(kāi)始進(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)過(guò)Varint編碼壓縮后的結(jié)果對(duì)比可知,仿真結(jié)果正確。

6

總結(jié)

在進(jìn)行原理理解與設(shè)計(jì)實(shí)現(xiàn)的時(shí)候,需要注意,逆序是字節(jié)的逆序,并非每一bit的數(shù)據(jù)都要進(jìn)行逆序,且最高位是補(bǔ)位,代表后面還有無(wú)數(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ò),否則輸出的大小與原來(lái)輸入的大小相同,也就失去了設(shè)計(jì)的意義。

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

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

責(zé)任編輯:haq

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

    關(guān)注

    1660

    文章

    22411

    瀏覽量

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

    關(guān)注

    6

    文章

    1039

    瀏覽量

    56969

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【ALINX 教程】FPGA Multiboot 功能實(shí)現(xiàn)——基于 ALINX Artix US+ AXAU25 開(kāi)發(fā)板

    教程目的 本教程介紹如何在 ?ALINX Artix US+ AXAU25 FPGA ?開(kāi)發(fā)板上,通過(guò)? Multiboot ?實(shí)現(xiàn)多個(gè) bitstream 的存儲(chǔ)與動(dòng)態(tài)切換,并在配置失敗時(shí)自動(dòng)回退
    的頭像 發(fā)表于 01-05 15:41 ?1204次閱讀
    【ALINX 教程】<b class='flag-5'>FPGA</b> Multiboot 功能<b class='flag-5'>實(shí)現(xiàn)</b>——基于 ALINX Artix US+ AXAU25 開(kāi)發(fā)板

    變頻器+異步電機(jī)的組合,外接編碼器如何實(shí)現(xiàn)高精度定位運(yùn)動(dòng)

    在工業(yè)自動(dòng)化領(lǐng)域,變頻器與異步電機(jī)的組合因其經(jīng)濟(jì)性和可靠性被廣泛應(yīng)用,但傳統(tǒng)開(kāi)環(huán)控制難以滿(mǎn)足高精度定位需求。通過(guò)外接編碼實(shí)現(xiàn)閉環(huán)控制,可顯著提升系統(tǒng)定位精度至±0.1mm甚至更高。本文將深入解析該
    的頭像 發(fā)表于 12-04 07:39 ?932次閱讀
    變頻器+異步電機(jī)的組合,外接<b class='flag-5'>編碼</b>器如何<b class='flag-5'>實(shí)現(xiàn)</b>高精度定位運(yùn)動(dòng)

    如何用FPGA控制ADV7513實(shí)現(xiàn)HDMI畫(huà)面顯示和音頻播放

    HDMI接口顯示使用DMT時(shí)序+TMDS編碼來(lái)實(shí)現(xiàn)。當(dāng)用FPGA控制HDMI的數(shù)據(jù)傳輸時(shí),通??梢圆捎眉僐TL實(shí)現(xiàn)TMDS算法或者使用專(zhuān)門(mén)的HDMI芯片(如ADV7513)這兩種方案來(lái)
    的頭像 發(fā)表于 12-02 11:05 ?6794次閱讀
    如何用<b class='flag-5'>FPGA</b>控制ADV7513<b class='flag-5'>實(shí)現(xiàn)</b>HDMI畫(huà)面顯示和音頻播放

    如何使用FPGA實(shí)現(xiàn)SRIO通信協(xié)議

    本例程詳細(xì)介紹了如何在FPGA實(shí)現(xiàn)Serial RapidIO(SRIO)通信協(xié)議,并通過(guò)Verilog語(yǔ)言進(jìn)行編程設(shè)計(jì)。SRIO作為一種高速、低延遲的串行互連技術(shù),在高性能計(jì)算和嵌入式系統(tǒng)中廣
    的頭像 發(fā)表于 11-12 14:38 ?5765次閱讀
    如何使用<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b>SRIO通信協(xié)議

    舵機(jī)伺服編碼

    舵機(jī)伺服編碼器是用于實(shí)時(shí)檢測(cè)舵機(jī)輸出軸位置、速度或角度的核心反饋元件,它能將機(jī)械運(yùn)動(dòng)轉(zhuǎn)化為電信號(hào),讓控制系統(tǒng)實(shí)現(xiàn)對(duì)舵機(jī)的精準(zhǔn)閉環(huán)控制。 這個(gè)問(wèn)題切得很準(zhǔn),它直接指向了舵機(jī) “精準(zhǔn)控制” 的關(guān)鍵所在
    的頭像 發(fā)表于 10-30 10:05 ?316次閱讀

    以太網(wǎng)通訊在FPGA上的實(shí)現(xiàn)

    一、介紹在本項(xiàng)目由于我們需要使用PC實(shí)時(shí)的向FPGA發(fā)送將要識(shí)別的圖片,所以我們最終選擇使用以太網(wǎng)來(lái)從PC向FPGA發(fā)送圖片并暫存在DDR中,下面是對(duì)以太網(wǎng)協(xié)議和硬件實(shí)現(xiàn)的一些介紹。 二、前言
    發(fā)表于 10-30 07:45

    如何利用Verilog HDL在FPGA實(shí)現(xiàn)SRAM的讀寫(xiě)測(cè)試

    本篇將詳細(xì)介紹如何利用Verilog HDL在FPGA實(shí)現(xiàn)SRAM的讀寫(xiě)測(cè)試。SRAM是一種非易失性存儲(chǔ)器,具有高速讀取和寫(xiě)入的特點(diǎn)。在FPGA實(shí)現(xiàn)SRAM讀寫(xiě)測(cè)試,包括設(shè)計(jì)SRA
    的頭像 發(fā)表于 10-22 17:21 ?4345次閱讀
    如何利用Verilog HDL在<b class='flag-5'>FPGA</b>上<b class='flag-5'>實(shí)現(xiàn)</b>SRAM的讀寫(xiě)測(cè)試

    FPGA FOC驅(qū)動(dòng)編碼器模塊介紹

    在多路FOC驅(qū)動(dòng)板上,一共是支持了兩種編碼器和兩種角度獲取方式,分別是AS5047P和MT6835,SPI和ABZ。AS5047P的精度是14bit,MT6835的精度是21bit,它們的價(jià)格差不多
    的頭像 發(fā)表于 09-06 09:50 ?5650次閱讀
    <b class='flag-5'>FPGA</b> FOC驅(qū)動(dòng)<b class='flag-5'>編碼</b>器模塊介紹

    集成MT6816磁性角度編碼實(shí)現(xiàn)伺服電機(jī)緊湊型非接觸位置傳感

    逐步成為高精度位置檢測(cè)的新選擇。本文將深入探討如何基于MT6816IC磁性角度編碼實(shí)現(xiàn)伺服電機(jī)的緊湊型非接觸位置傳感方案,從技術(shù)原理到工程實(shí)現(xiàn)進(jìn)行全面解析。
    的頭像 發(fā)表于 08-16 14:15 ?1386次閱讀

    FPGA利用DMA IP核實(shí)現(xiàn)ADC數(shù)據(jù)采集

    本文介紹如何利用FPGA和DMA技術(shù)處理來(lái)自AD9280和AD9708 ADC的數(shù)據(jù)。首先,探討了這兩種ADC的特點(diǎn)及其與FPGA的接口兼容性。接著,詳細(xì)說(shuō)明了使用Xilinx VIVADO環(huán)境下
    的頭像 發(fā)表于 07-29 14:12 ?5099次閱讀

    基于FPGA實(shí)現(xiàn)FOC算法之PWM模塊設(shè)計(jì)

    哈嘍,大家好,從今天開(kāi)始正式帶領(lǐng)大家從零到一,在FPGA平臺(tái)上實(shí)現(xiàn)FOC算法,整個(gè)算法的框架如下圖所示,如果大家對(duì)算法的原理不是特別清楚的話,可以先去百度上學(xué)習(xí)一下,本教程著重介紹實(shí)現(xiàn)過(guò)程,弱化原理的介紹。那么本文將從PWM模塊
    的頭像 發(fā)表于 07-17 15:21 ?3491次閱讀
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b>FOC算法之PWM模塊設(shè)計(jì)

    基于Matlab與FPGA的雙邊濾波算法實(shí)現(xiàn)

    前面發(fā)過(guò)中值、均值、高斯濾波的文章,這些只考慮了位置,并沒(méi)有考慮相似度。那么雙邊濾波來(lái)了,既考慮了位置,有考慮了相似度,對(duì)邊緣的保持比前幾個(gè)好很多,當(dāng)然實(shí)現(xiàn)上也是復(fù)雜很多。本文將從原理入手,采用Matlab與FPGA設(shè)計(jì)實(shí)現(xiàn)雙邊
    的頭像 發(fā)表于 07-10 11:28 ?4559次閱讀
    基于Matlab與<b class='flag-5'>FPGA</b>的雙邊濾波算法<b class='flag-5'>實(shí)現(xiàn)</b>

    基于FPGA的壓縮算法加速實(shí)現(xiàn)

    本設(shè)計(jì)中,計(jì)劃實(shí)現(xiàn)對(duì)文件的壓縮及解壓,同時(shí)優(yōu)化壓縮中所涉及的信號(hào)處理和計(jì)算密集型功能,實(shí)現(xiàn)對(duì)其的加速處理。本設(shè)計(jì)的最終目標(biāo)是證明在充分并行化的硬件體系結(jié)構(gòu) FPGA實(shí)現(xiàn)該算法時(shí),可
    的頭像 發(fā)表于 07-10 11:09 ?2389次閱讀
    基于<b class='flag-5'>FPGA</b>的壓縮算法加速<b class='flag-5'>實(shí)現(xiàn)</b>

    RTL級(jí)機(jī)器人電機(jī)控制器的FPGA設(shè)計(jì)

    借助Verilog,在FPGA實(shí)現(xiàn)了帶編碼器的兩臺(tái)電機(jī)的電機(jī)控制系統(tǒng)的RTL級(jí)設(shè)計(jì)。
    的頭像 發(fā)表于 07-07 14:01 ?2903次閱讀
    RTL級(jí)機(jī)器人電機(jī)控制器的<b class='flag-5'>FPGA</b>設(shè)計(jì)

    瑞蘇盈科FPGA CoaXPress解決方案,重構(gòu)地面遠(yuǎn)程視頻編碼器性能邊界

    引言在數(shù)字化轉(zhuǎn)型浪潮的推動(dòng)下,地面遠(yuǎn)程視頻監(jiān)控已成為城市安防、工業(yè)生產(chǎn)、交通管理等領(lǐng)域的關(guān)鍵支撐。隨著超高清視頻、實(shí)時(shí)分析等需求的不斷攀升,傳統(tǒng)視頻編碼方案在性能與可靠性上的不足日益凸顯。而FPGA
    的頭像 發(fā)表于 04-24 14:53 ?869次閱讀
    瑞蘇盈科<b class='flag-5'>FPGA</b> CoaXPress解決方案,重構(gòu)地面遠(yuǎn)程視頻<b class='flag-5'>編碼</b>器性能邊界