国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

基本數學運算在FPGA中的實現算法仿真分析

電子設計 ? 來源:博客園 ? 作者:沒落騎士 ? 2020-12-25 14:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:沒落騎士

一、前言

FPGA以擅長高速并行數據處理而聞名,從有線/無線通信到圖像處理中各種DSP算法,再到現今火爆的AI應用,都離不開卷積、濾波、變換等基本的數學運算。但由于FPGA的硬件結構和開發特性使得其對很多算法不友好,之前本人零散地總結和轉載了些基本的數學運算在FPGA中的實現方式,今天做一個系統的總結歸納。

二、FPGA中的加減乘除

1.硬件資源

Xilinx 7系列的FPGA中有DSP Slice ,叫做“DSP48E1”這一專用硬件資源,這是一個功能強大的計算單元,單就用于基本運算的部分有加減單元和乘法器。詳見參考文獻1.

o4YBAF9uH6KAcCDkAAB5s7i_M8w954.png

因此可以直接用HDL語言中的加、減、乘符號實現變量與常量間運算操作以及變量與變量間操作。而四則運算中的除法沒有基本的邏輯計算單元可以對應,因此計算除法需要調用除法器IP核。

2.確認數據的表示范圍

有符號數:(補碼)-2^(N-1) ~ 2^(N-1)-1 如N = 8,則表示范圍是:-128 ~ 127.

無符號數:0~2^N-1 如N = 8,則表示范圍是:0~255.

定點數:2Q13 范圍是:-4~4-2^(-13) 精度是:2^(-13)

3.結果有效位寬

首先討論結果位寬問題。在FPGA中往往采用定點運算替代浮點運算來降低硬件資源占用率和計算延遲,其中的精髓就是精度與資源的權衡。若按照保留計算結果的全部精度,N bit數與Mbit數相加結果需要N+1bit(N>M)。N bit數與M bit數相乘之積需要N+M bit。而減法可以轉化為加法,除法則轉換為乘法和加減法的組合。如果操作數是定點小數,則在滿足以上準則的前提下,A與B相加(A小數點位數>B小數點位數),結果小數點位數與A相同;A與B相乘(小數點位數分別為p和q),結果小數點位數是p+q。

4.定點運算步驟

然而(話鋒一轉),在大多數場合下,不需要以上這么多位來保留計算結果,因為我們在進行數學運算時,已經知道輸入數據的大致范圍,一個數除以1000和除以1結果數據所需最小位寬能一樣么?加減運算的操作步驟是先對齊小數點位數,后加減。而乘法是先計算后取小數點。這實際上與十進制運算一致,我們看看具體的計算步驟:

整數之間加減以及乘法的統一步驟:預估結果位寬N --> 按照結果位寬擴展操作數符號位以防止溢出 --> 運算取低N位。

定點小數加減運算步驟:預估結果位寬N --> 得到結果小數點后位數 --> 對齊操作數整數位和小數位,確定擴展位寬M(M≥N) --> 加減運算取低M位。

定點小數乘法運算步驟:預估結果位寬N --> 得到結果小數點后位數 --> 擴展操作數位寬 --> 相乘取低N位

5. 變量與常量運算化簡

以上討論的均是兩變量之間的運算規則,當然結果位寬及格式準則是適用的。變量與常量的運算的優勢在于,可以將乘除法轉換成加減以及移位運算實現,從而降低計算復雜度和延遲。當常數項C為2的整數次冪(C = 2^p),則乘C等于變量左移p位,除以C等于變量右移p位。幾個在書中看到的幾個簡單示例:A*16 = A >1A除以3 = A*(0.25+0.0625+0.0156) = A>>2+A>>4+A>>6A除以5 = A*(0.125+0.0625+0.0156) = A>>3 + A>>4 + A>>6.其中乘法完全等價對應的移位相加操作,而除法的移位代替會損失精度。

三、如何計算特殊函數

FPGA內部的DSP Slice可以直接進行最基本的加法和乘法運算,但是對于其他比如對數、指數、三角函數、開根號等特殊函數就無能為力了。這時需要借助算法對這些特殊函數進行變換和簡化。FPGA實現復雜函數的常用手段一個是級數展開,再一個就是CORDIC算法。關于CORDIC的理論知識和具體內容詳見參考文獻2,這里主要闡述CORDIC的IP核調用以及應用示例。CORDIC算法就是通過一定的手段,將很多復雜的特殊函數變為相加移位運算,這一點對于硬件芯片實現來說非常友好。CORDIC分為旋轉模式和矢量模式,配合圓周坐標、線性坐標和雙曲線坐標會有六種組合,具體見下表:

o4YBAF9uH6eAYHStAAUPTubgJdM481.png

從表中發現,基本的乘除法、三角函數、反三角函數、雙曲函數、反雙曲函數、開根號都能夠直接求得,那其他函數怎么辦?

o4YBAF9uH6uAdk1gAAKsIU8Rl24196.png

常見的函數計算需求基本都能滿足,雖上述變換式對自變量定義域有限制,但同樣可以分析輸入數據的取值范圍并利用簡單的數學變換得到想要的結果。Xilinx同時提供了浮點IP核以及CORDIC IP核,前者調用簡單但占用資源大,延遲高,因此利用CORDIC算法計算函數是個較好的選擇。

四、CORDIC計算e^x Demo

1. 算法仿真分析

要計算e^x數值需要讓CORDIC工作在雙曲坐標的旋轉模式下,通過e^x = sinhx+coshx關系式間接求得。首先看下sinh和cosh函數的曲線,有個直觀認識。

我們用MATLAB毫不費力地驗證一下公式正確性:

在設計后也同樣要借助MATLAB進行仿真驗證。

2. CORDIC IP核

現在通過查看user guide得知CORDIC IP核的接口及主要特性。

o4YBAF9uH7GAeoe_AAEXmjcb690888.png

接口包括輸入笛卡爾數據輸入通道、相位輸入通道、全局信號以及數據輸出通道。該IP核有兩種結構:串行和并行,可根據數據吞吐量需求選擇,并行結構可以每個時鐘輸出一個計算結果。如果計算sinh和cosh,要向phase通道輸入相位信息,X_OUT是cosh(phase),Y_OUT是sinh(phase).輸入phase必須滿足數據范圍,否則出現不可預計結果。輸出幀結構及數據范圍如下:

pIYBAF9uH7OARASKAACJBvr-Sog572.png

其中輸入數據格式為2QN,輸出則是1QN。由于均是有符號數,也就是輸入整數部分3bit,輸出整數部分2bit。接下來對IP核進行配置,重點是第一頁,此處將其配置為計算sinh和cosh模式,采用并行優化的流水線結構。相位以角度為單位,輸入輸出位寬設置成16bit。

o4YBAF9uH7WAWgPKAAEbXDGFtVk789.png

3.HDL代碼設計及仿真驗證

設計代碼:
`timescale 1ns / 1ps

module cordic_ex#(parameter DIN_W = 16,
DOUT_W = 16)
(
input clk,
input [DIN_W-1:0] din,//2Q13
input din_vld,

output reg [DOUT_W+1-1:0] dout = 0,//2Q14
output reg dout_vld = 0
);

wire [DOUT_W*2-1 : 0] m_axis_dout_tdata;
wire m_axis_dout_tvalid;
wire signed [DOUT_W-1:0] sinh,cosh;

// ex = sinhx + coshx
always @(posedge clk)begin
dout end

assign sinh = m_axis_dout_tdata[DOUT_W*2-1 -:DOUT_W];
assign cosh = m_axis_dout_tdata[DOUT_W-1 -:DOUT_W];

always @(posedge clk)begin
if(m_axis_dout_tvalid)begin
dout_vld end
else
dout_vld end

cordic_0 cordic_cosh_sinh (
.aclk(clk), // input wire aclk
.s_axis_phase_tvalid(din_vld), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(din), // input wire [15 : 0] s_axis_phase_tdata
.m_axis_dout_tvalid(m_axis_dout_tvalid), // output wire m_axis_dout_tvalid
.m_axis_dout_tdata(m_axis_dout_tdata) // output wire [31 : 0] m_axis_dout_tdata
);

endmodule

cordic_ex

用MATLAB產生兩組數據,并將角度值定點化后作為設計模塊數據激勵:

pIYBAF9uH7uAccWfAAX_UP1GgPU919.png

testbench:
`timescale 1ns / 1ps

module cordic_ex_tb();

parameter CYC = 20;

reg clk;
reg [16-1:0] din;
reg din_vld;

wire signed [17-1:0] dout;
wire dout_vld;

cordic_ex#(.DIN_W(16),
.DOUT_W(16))
uut(
.clk (clk) ,
.din (din) ,//2Q13
.din_vld (din_vld) ,
.dout (dout) ,//2Q14
.dout_vld (dout_vld)
);

initial begin
clk = 1;
forever #(CYC/2) clk = ~clk;
end

initial begin
#1;
din = 0;
din_vld = 0;
#(CYC*10);

din_vld = 1;
din = 16'b0001010000011011;//pi * 1/5
#(CYC*1);
din = 16'b1110011011011110;//-pi * 1/4
#5;
$stop;
end

endmodule

cordic_ex_tb

仿真結果:

仿真波形表明,計算結果與MATLAB浮點運算相近,滿足一般計算需求。若想提高精度,可以增加CORDIC輸出數據位寬。

參考文獻:

1 ug479 7 Series DSP48E1 Slice User Guide.

2 Xilinx CORDIC算法(非常經典)_圖文_百度文庫 https://wenku.baidu.com/view/6c623aa8910ef12d2bf9e732.html

編輯:hfy


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

    關注

    561

    文章

    8244

    瀏覽量

    366680
  • FPGA
    +關注

    關注

    1660

    文章

    22412

    瀏覽量

    636397
  • Xilinx
    +關注

    關注

    73

    文章

    2200

    瀏覽量

    131152
  • 無線通信
    +關注

    關注

    58

    文章

    4987

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【乾芯QXS320F開發板試用】乾芯QXS320F開發板IQMath數學庫功能試用報告

    ) :大量的Park/Clarke變換、PID調節器運算。 數字電源 :環路補償器計算。 信號處理 :濾波器實現、頻譜分析等。 任何需要頻繁、快速執行復雜數學運算的嵌入式實時系統 。
    發表于 01-08 09:02

    SM4算法實現分享(一)算法原理

    SM4分組加密算法采用的是非線性迭代結構,以字為單位進行加密、解密運算,每次迭代稱為一輪變換,每輪變換包括S盒變換、非線性變換、線性變換、合成變換。加解密算法與密鑰擴展都是采用32輪非線性迭代結構
    發表于 10-30 08:10

    Camellia算法實現(基于開源蜂鳥E203協處理器)

    項目構想 我們一開始就選擇信息安全作為芯來杯比賽方向,并以Camellia算法作為算法原型。借助蜂鳥E203的協處理,能加速Camellia算法運算,并通過比較軟件
    發表于 10-30 07:04

    復雜的軟件算法硬件IP核的實現

    Compiler)將算法編譯轉化為可綜合的 Verilog 文本,進而通過 FPGA 在硬件上實現算法。 1.C to Hardware 技術簡介 AltiumDesign
    發表于 10-30 07:02

    AES加解密算法邏輯實現及其在蜂鳥E203SoC上的應用介紹

    算法唯一的非線性模塊,通常有兩種實現方式:查找表法和復合域降階法。查找表法的實現較為簡單,由于S盒的實質是一一映射,在verilog中直接使用case語句即可;而復合域降階法需要根據
    發表于 10-29 07:29

    卷積運算分析

    的數據,故設計了ConvUnit模塊實現單個感受域規模的卷積運算. 卷積運算:不同于數學當中提及到的卷積概念,CNN神經網絡的卷積嚴格意義
    發表于 10-28 07:31

    如何使用恢復算法實現開平方運算

    本文主要描述如何使用恢復算法實現開平方運算。 簡介 開平方的恢復算法其實與除法的恢復算法十分相似。首先我們假設X為輸入的操作數(它應該為
    發表于 10-24 13:33

    e203乘法運算結構及算法原理

    乘法運算。 考慮到E203的定位以及性能、功耗與芯片面積的平衡,E203采用了一些恰到好處的資源復用設計。 首先,乘法器每周器的加法操作是通過復用ALU的加法器實現的。由于乘法器本
    發表于 10-22 06:43

    25年11月上海FPGA算法實現與應用技術高級研修分享

    設計仿真能力。   深入學習數據流,不僅是算法FPGA&DSP設計者的需求,對于從事接口設計工作、軟件配置工作、系統測試工作,項目管理工作的同事,也同樣有非常重要的意義。在實際工作
    發表于 10-11 11:55

    基于FPGA實現FOC算法之PWM模塊設計

    哈嘍,大家好,從今天開始正式帶領大家從零到一,在FPGA平臺上實現FOC算法,整個算法的框架如下圖所示,如果大家對算法的原理不是特別清楚的話
    的頭像 發表于 07-17 15:21 ?3500次閱讀
    基于<b class='flag-5'>FPGA</b><b class='flag-5'>實現</b>FOC<b class='flag-5'>算法</b>之PWM模塊設計

    基于Matlab與FPGA的雙邊濾波算法實現

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

    基于FPGA的壓縮算法加速實現

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

    FPGA定點和浮點數學運算實例對比

    在創建 RTL 示例時,經常使用 VHDL 2008 附帶的 VHDL 包。它提供了出色的功能,可以高效地處理定點數,當然,它們也是可綜合的。該包的一些優點包括:
    的頭像 發表于 06-23 09:53 ?1030次閱讀
    <b class='flag-5'>FPGA</b>定點和浮點<b class='flag-5'>數學運算</b>實例對比

    進群免費領FPGA學習資料!數字信號處理、傅里葉變換與FPGA開發等

    ~ 01、數字信號處理的FPGA實現 旨在講解前端數字信號處理算法的高效實現。首先概述了當前的FPGA技術、器件以及用于設計最先進DSP系
    發表于 04-07 16:41

    從零開始學運算放大器筆記一 | 認識運算放大器

    )是一種模擬電路模塊,它采用差分電壓輸入,產生單端電壓輸出。它可以對輸入信號進行放大以及加、減、乘、除、微分、積分等數學運算,現多應用于信號放大功能。一個運算放大器至
    的頭像 發表于 03-24 19:32 ?4563次閱讀
    從零開始<b class='flag-5'>學運算</b>放大器筆記一 | 認識<b class='flag-5'>運算</b>放大器