日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內不再提示

基于FPGA的Varint編碼設計原理和實現(xiàn)

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

掃碼添加小助手

加入工程師交流群

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

1

概念

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

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

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

2

設計原理

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

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

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

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

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

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

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

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

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

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

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

3

架構設計

設計架構如下圖:

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

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

仿真測試及結果

仿真測試代碼如下:

`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

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

6

總結

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

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

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

責任編輯:haq

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

    關注

    1664

    文章

    22509

    瀏覽量

    639529
  • 編碼
    +關注

    關注

    6

    文章

    1041

    瀏覽量

    57155

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Altera Agilex FPGA與SoC實現(xiàn)更智能的AI

    在本期專題中,Altera 院士兼首席架構師 Ilya Ganusov 將帶大家深入解析 Altera FPGA 創(chuàng)新的三大核心支柱:性能、AI 加速與安全,同時拆解 Agilex 7 FPGA
    的頭像 發(fā)表于 04-02 14:24 ?464次閱讀

    基于FPGA的磁場定向控制實現(xiàn)方案

    FOC控制算法對傳感器采樣速率和處理器算力提出了一定的要求,使用 FPGA 實現(xiàn)的 FOC 可以獲得更好的實時性,并且更方便進行多路擴展和多路反饋協(xié)同。
    的頭像 發(fā)表于 03-31 15:27 ?270次閱讀
    基于<b class='flag-5'>FPGA</b>的磁場定向控制<b class='flag-5'>實現(xiàn)</b>方案

    高精度磁編碼器芯片設計與實現(xiàn)

    高精度磁編碼器芯片作為智能制造、高端裝備的核心傳感部件,憑借非接觸式檢測、抗惡劣環(huán)境、高動態(tài)響應等優(yōu)勢,已成為伺服電機、工業(yè)機器人、新能源汽車等領域的關鍵器件。其核心目標是實現(xiàn) 18 位以上分辨率
    的頭像 發(fā)表于 03-17 14:58 ?260次閱讀

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

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

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

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

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

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

    舵機伺服編碼

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

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

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

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

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

    FPGA FOC驅動編碼器模塊介紹

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

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

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

    基于FPGA實現(xiàn)FOC算法之PWM模塊設計

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

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

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

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

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

    RTL級機器人電機控制器的FPGA設計

    借助Verilog,在FPGA實現(xiàn)了帶編碼器的兩臺電機的電機控制系統(tǒng)的RTL級設計。
    的頭像 發(fā)表于 07-07 14:01 ?3123次閱讀
    RTL級機器人電機控制器的<b class='flag-5'>FPGA</b>設計
    舞钢市| 南阳市| 咸宁市| 广汉市| 宜兰市| 客服| 东山县| 仲巴县| 河津市| 蓝田县| 民权县| 张北县| 临桂县| 梁山县| 香格里拉县| 公安县| 宝坻区| 耒阳市| 文化| 通州市| 孟连| 鞍山市| 响水县| 上高县| 远安县| 钟祥市| 雷州市| 恩施市| 上栗县| 松滋市| 周口市| 白银市| 卢龙县| 江华| 延川县| 平潭县| 和政县| 通城县| 搜索| 吉首市| 图木舒克市|