国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于verilog的四級流水線實現(xiàn)并行fft16(可計算小數(shù)和負數(shù))

這篇具有很好參考價值的文章主要介紹了基于verilog的四級流水線實現(xiàn)并行fft16(可計算小數(shù)和負數(shù))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

夯實基礎--FFT算法

定點運算--verilog實現(xiàn)小數(shù)運算

Verilog代碼實現(xiàn)

?FFT系數(shù) W 的準備

?輸入數(shù)值的初始化

蝶形運算端點處的值

仿真結(jié)果展示

總結(jié)



夯實基礎--FFT算法

? ? ? ?FFT是DFT的一種快速算法而不是一種新的變換,他可以在數(shù)量級的意義上提高運算速度。它主要有兩種實現(xiàn)方法:一種是按時間抽?。―IT),另一種是按頻域抽取(DIF)。為了方便起見,我們選用基于時間抽取的FFT的算法。

? ? ? ? 算法原理:先設序列x(n)的點數(shù)為N = 2^L(L為正整數(shù)

將N=2^L的偶數(shù)序列x(n)按n的奇偶將序列分成兩組,對兩組新的序列。在對N點的序列進行DFT運算的時候按奇偶將序列分開,我們便可根據(jù)系數(shù)W的可約性得到前N/2的DFT的點的值,根據(jù)W的周期性有可以得到后面N/2點的DFT的值。詳細請參考數(shù)字信號處理,在此就不過多的解釋。我們以16點FFT為例,在此粘貼處他的蝶形圖

按時間抽取的16點fft,算法,dsp開發(fā),fpga開發(fā)? ? ? ?

?

?還有一點,F(xiàn)FT的運算為輸入倒位序,輸出自然順序或者是輸入自然順序,輸出倒位序。這里我們采取輸入倒位序,輸出自然順序

(倒位序:將n的值轉(zhuǎn)換成二進制,倒過來重新排序所組成的值)

定點運算--verilog實現(xiàn)小數(shù)運算

? ? ? ? 定點運算,顧名思義,我們在運算的過程中需要確定小數(shù)點的位置,讓小數(shù)點的位置保持不變

? ? ? ? 實現(xiàn)原理:對于一個數(shù),我們可以把他分成三個部分:符號位,整數(shù)部分和小數(shù)部分。

? ?????????若 x 表示一個實際的浮點數(shù),q表示他的Qn 型的定點小數(shù)(一個整數(shù))。n表示小數(shù)點固定的位置

???????? ? 則 q = x * 2^n ,x = q / 2^n?

? ? ? ? ?舉例: 計算 2.1 * 2.2? ?(此處我們選擇Q12定點小數(shù))

? ? ? ? ? ? ? ? 2.1 *? 2^12 = 8601.6 = 8602

? ? ? ? ? ? ? ? 2.2 * 2^12 = 9011.2? = 9011

? ? ? ? ? ? ? ? (8602*9011)/2^12 = 18923 (除以12的原因:兩數(shù)相乘使得小數(shù)點后有24位,所以我們需要除以2^12,固定小數(shù)點)

? ? ? ? ? ? ? ? 最終結(jié)果 = 18923/ 2^12? = 4.619873 而2.1*2.2 = 4.62??

? ? ? ? ? ? ? ? 我們可以知道結(jié)果相差不大,故我們可以用這種方法實現(xiàn)小數(shù)運算

注:當我們用verilog實現(xiàn)的時候我們需要注意格式,在進行負數(shù)運算的時候我們是以二進制補碼的形式儲存的,而? 數(shù)值大小的運算我們用原碼進行運算,在計算過程中注意符號

Verilog代碼實現(xiàn)

? ? ? ? 根據(jù)上面的fft16的蝶形圖,我們可以選擇使用四級流水線進行實現(xiàn)

? ? ? ? FFT系數(shù) W 的準備

? ? ? ? ? ? ? ? ? W的值的運算我們可以用過matlab運算得到,此處我直接把需要用到的W的值給出? W(下標,上標)

? ? ? ? ? ? ? ? W(4,1)=W(8,2)=W(16,4)=-j ;W(8,1)=W(16,2)=0.7071-0.7071j??

? ? ? ? ? ? ? ? W(8,3)=W(16,6)=-0.7071-0.7071j? ; W(16,3)=0.3827-0.9239;W(16,5)=-0.3827-0.9239 ;

? ? ? ? ? ? ? ? W(16,7)=-0.9239-0.3827 ; W(16,1)=0.9239-0.3827

? ? ? ? ? ? ? ? 我們可以看出主要小數(shù)就是0.9239? ;0.3837 ; 0.7071這三個數(shù),此處我們采取Q12的定點方法進行verilog定義

wire    [WIDTH-1:0]     coe_dly1_p ;
wire    [WIDTH-1:0]     coe_dly1_n ;
wire    [WIDTH-1:0]     coe_dly2_p ;
wire    [WIDTH-1:0]     coe_dly2_n ;
wire    [WIDTH-1:0]     coe_dly3_p ;
wire    [WIDTH-1:0]     coe_dly3_n ;

//0.7071
assign  coe_dly1_p  = 2896;
assign  coe_dly1_n  = 2896 ;
//0.3827
assign  coe_dly2_p  = 1568;
assign  coe_dly2_n  = 1568 ;
//0.9239
assign  coe_dly3_p  = 3874;
assign  coe_dly3_n  = 3874 ; 

此處后綴 _p 和 _n 來區(qū)別正負,我們需要用原碼來進行運算,所以不可以直接給符號(否則以補碼形式儲存得到錯誤的結(jié)果)

?輸入數(shù)值的初始化

? ? ? ? 由于我們選定的是Q12定點運算,故我們需要對輸入的數(shù)據(jù)進行擴大,方便后續(xù)的運算(再次提醒:數(shù)據(jù)的操作用原碼?。。?/p>

????????

assign fft0_re_inst=(fft0_re[WIDTH-1]==1'b1)?({1'b1,~((~fft0_re[WIDTH-2:0]+1'b1)<<12)+1'b1}):({1'b0,fft0_re[WIDTH-2:0]<<12});
assign fft0_im_inst=(fft0_im[WIDTH-1]==1'b1)?({1'b1,~((~fft0_im[WIDTH-2:0]+1'b1)<<12)+1'b1}):({1'b0,fft0_im[WIDTH-2:0]<<12});
assign fft1_re_inst=(fft0_re[WIDTH-1]==1'b1)?({1'b1,~((~fft1_re[WIDTH-2:0]+1'b1)<<12)+1'b1}):({1'b0,fft1_re[WIDTH-2:0]<<12});
assign fft1_im_inst=(fft0_im[WIDTH-1]==1'b1)?({1'b1,~((~fft1_im[WIDTH-2:0]+1'b1)<<12)+1'b1}):({1'b0,fft1_im[WIDTH-2:0]<<12});  
assign fft2_re_inst=(fft0_re[WIDTH-1]==1'b1)?({1'b1,~((~fft2_re[WIDTH-2:0]+1'b1)<<12)+1'b1}):({1'b0,fft2_re[WIDTH-2:0]<<12});
assign fft2_im_inst=(fft0_im[WIDTH-1]==1'b1)?({1'b1,~((~fft2_im[WIDTH-2:0]+1'b1)<<12)+1'b1}):({1'b0,fft2_im[WIDTH-2:0]<<12});
assign fft3_re_inst=(fft0_re[WIDTH-1]==1'b1)?({1'b1,~((~fft3_re[WIDTH-2:0]+1'b1)<<12)+1'b1}):({1'b0,fft3_re[WIDTH-2:0]<<12});

蝶形運算端點處的值

? ? ? ? 為了緩解運算的復雜度,避免時序的問題,通過打拍的方式將每個端點需要進行處理的值在打拍過程中實現(xiàn),這樣就緩解了組合電路的壓力。第一級和第二級端點處的處理比較簡單,在這里不做過多的解釋,我們重點講解下第三級和第四級的端點處的處理

我們先用相關的原碼計算得到結(jié)果值(主要是兩數(shù)相乘,注意小數(shù)點的處理),然后根據(jù)‘同號得正,異號得負’的原理來處理得到最終的結(jié)果(因為我們是以補碼形式儲存的),在這里粘貼部分代碼供參考:

????????

//得到原碼
assign fft5_re_dly2_temp = (fft5_re_dly2[WIDTH-1]==1'b1)?(~fft5_re_dly2+1'b1):fft5_re_dly2;
assign fft5_im_dly2_temp = (fft5_im_dly2[WIDTH-1]==1'b1)?(~fft5_im_dly2+1'b1):fft5_im_dly2; 
assign fft7_re_dly2_temp = (fft7_re_dly2[WIDTH-1]==1'b1)?(~fft7_re_dly2+1'b1):fft7_re_dly2;
assign fft7_im_dly2_temp = (fft7_im_dly2[WIDTH-1]==1'b1)?(~fft7_im_dly2+1'b1):fft7_im_dly2;

//得到端點處的相關系數(shù)的原碼的值
always@(posedge sys_clk or negedge sys_rst_n)
    begin
        if(~sys_rst_n)
            begin
                 fft5_fft1_re_dly1  <=0;
                 fft5_fft1_re_dly2  <=0;
                fft5_fft1_im_dly1  <=0;
                fft5_fft1_im_dly2  <=0;
                fft3_fft7_re_dly1  <=0;
                fft3_fft7_re_dly2  <=0;
                fft3_fft7_im_dly1  <=0;
                fft3_fft7_im_dly2  <=0;   
            end
        else
            begin
                fft5_fft1_re_dly1  <=(fft5_re_dly2_temp*coe_dly1_p )>>12;
                 fft5_fft1_re_dly2  <=(fft5_im_dly2_temp*coe_dly1_n )>>12;
                fft5_fft1_im_dly1  <=(fft5_re_dly2_temp*coe_dly1_n )>>12;
                fft5_fft1_im_dly2  <=(fft5_im_dly2_temp*coe_dly1_p )>>12;
                fft3_fft7_re_dly1  <=(fft7_re_dly2_temp*coe_dly1_n )>>12;
                fft3_fft7_re_dly2  <=(fft7_im_dly2_temp*coe_dly1_n )>>12;
                fft3_fft7_im_dly1  <=(fft7_im_dly2_temp*coe_dly1_n )>>12;
                fft3_fft7_im_dly2  <=(fft7_re_dly2_temp*coe_dly1_n )>>12;   
            end
            end
    end

//轉(zhuǎn)換成補碼形式儲存下來并進行后續(xù)的運算
//最高位為1表示負數(shù)
assign   fft5_fft1_re_dly1_wn   = (fft5_re_dly2_dly[WIDTH-1]==1'b1)?(~fft5_fft1_re_dly1+1'b1):fft5_fft1_re_dly1;
assign   fft5_fft1_re_dly2_wn   = (fft5_im_dly2_dly[WIDTH-1]==1'b1)?fft5_fft1_re_dly2:(~fft5_fft1_re_dly2+1'b1);
assign   fft5_fft1_im_dly1_wn   = (fft5_re_dly2_dly[WIDTH-1]==1'b0)?(~fft5_fft1_re_dly1+1'b1):fft5_fft1_re_dly1;
assign   fft5_fft1_im_dly2_wn   = (fft5_im_dly2_dly[WIDTH-1]==1'b0)?fft5_fft1_re_dly2:(~fft5_fft1_re_dly2+1'b1);

assign   fft3_fft7_re_dly1_wn   = (fft7_re_dly2_dly[WIDTH-1]==1'b1)?fft3_fft7_re_dly1:(~fft3_fft7_re_dly1+1'b1);
assign   fft3_fft7_re_dly2_wn   = (fft7_im_dly2_dly[WIDTH-1]==1'b1)?fft3_fft7_re_dly2:(~fft3_fft7_re_dly2+1'b1);
assign   fft3_fft7_im_dly1_wn   = (fft7_im_dly2_dly[WIDTH-1]==1'b1)?fft3_fft7_im_dly1:(~fft3_fft7_im_dly1+1'b1);
assign   fft3_fft7_im_dly2_wn   = (fft7_re_dly2_dly[WIDTH-1]==1'b1)?fft3_fft7_im_dly2:(~fft3_fft7_im_dly2+1'b1);

第三級和第四級處理方法類似,理解了一個另一個也很容易理解

仿真結(jié)果展示

? ? ? ? tb代碼

????????

initial
    begin
        clk   =  1'b0 ;
        rst   =  1'b0 ;
        #20
        rst   =  1'b1 ;
    end

always #10 clk = ~clk  ;

fft16 
#(
    .WIDTH ('d32)
)
fft16_inst
(
    .sys_clk(clk),
    .sys_rst_n(rst),

    .fft0_re('d1),
    .fft1_re('d2),
    .fft2_re('d2),
    .fft3_re('d1),
    .fft4_re('d2),
    .fft5_re('d1),
    .fft6_re('d1),
    .fft7_re('d2),
    .fft8_re('d2),
    .fft9_re('d1),
    .fft10_re('d1),
    .fft11_re('d2),
    .fft12_re('d1),
    .fft13_re('d1),
    .fft14_re('d1),
    .fft15_re('d2),


    .fft0_im('d0),
    .fft1_im('d0),
    .fft2_im('d0),
    .fft3_im('d0),
    .fft4_im('d0),
    .fft5_im('d0),
    .fft6_im('d0),
    .fft7_im('d0),
    .fft8_im('d0),
    .fft9_im('d0),
    .fft10_im('d0),
    .fft11_im('d0),
    .fft12_im('d0),
    .fft13_im('d0),
    .fft14_im('d0),
    .fft15_im('d0),

    //output
    .fft0_re_out(fft0_re_out),
    .fft1_re_out(fft1_re_out),
    .fft2_re_out(fft2_re_out),
    .fft3_re_out(fft3_re_out),
    .fft4_re_out(fft4_re_out),
    .fft5_re_out(fft5_re_out),
    .fft6_re_out(fft6_re_out),
    .fft7_re_out(fft7_re_out),
    .fft8_re_out(fft8_re_out),
    .fft9_re_out(fft9_re_out),
    .fft10_re_out(fft10_re_out),
    .fft11_re_out(fft11_re_out),
    .fft12_re_out(fft12_re_out),
    .fft13_re_out(fft13_re_out),
    .fft14_re_out(fft14_re_out),
    .fft15_re_out(fft15_re_out),
    
    .fft0_im_out(fft0_im_out),
    .fft1_im_out(fft1_im_out),
    .fft2_im_out(fft2_im_out),
    .fft3_im_out(fft3_im_out),
    .fft4_im_out(fft4_im_out),
    .fft5_im_out(fft5_im_out),
    .fft6_im_out(fft6_im_out),
    .fft7_im_out(fft7_im_out),
    .fft8_im_out(fft8_im_out),
    .fft9_im_out(fft9_im_out),
    .fft10_im_out(fft10_im_out),
    .fft11_im_out(fft11_im_out),
    .fft12_im_out(fft12_im_out),
    .fft13_im_out(fft13_im_out),
    .fft14_im_out(fft14_im_out),
    .fft15_im_out(fft15_im_out)
);

? ? ? ? 結(jié)果這里通過我手算的結(jié)果和仿真的結(jié)果進行比較驗算

????????按時間抽取的16點fft,算法,dsp開發(fā),fpga開發(fā)

按時間抽取的16點fft,算法,dsp開發(fā),fpga開發(fā)?

?按時間抽取的16點fft,算法,dsp開發(fā),fpga開發(fā)

?

(?由于個人原因我只算了前8個點的值,不過由于前8個點和后8個點的只有+ 和 - 的區(qū)別,所用的數(shù)值的一樣的,所以前8個對了,后面的也就沒什么問題。)

通過比較,我們可以發(fā)現(xiàn)他們的誤差還是比較小的,這是由于modelsim仿真的時候他遇到小數(shù)采取的方式不是四舍五入,而是直接舍掉。

還有最重要的一點:現(xiàn)在仿真得到的結(jié)果不是最終的值,他存儲的結(jié)果是Q12型小數(shù)補碼的形式,如果要得到最終的結(jié)果,我們需要手動對結(jié)果進行處理。切記?。?!

總結(jié)

? ? ? ? 本人第一次寫csdn,其中如果有寫的不正確或者不恰當?shù)牡胤竭€請多多批評指正,在下不勝感激。文章來源地址http://www.zghlxwxcb.cn/news/detail-744365.html

到了這里,關于基于verilog的四級流水線實現(xiàn)并行fft16(可計算小數(shù)和負數(shù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • verilog實例-流水線(Pipeline)

    verilog實例-流水線(Pipeline)

    所謂流水線設計實際上是把規(guī)模較大、層次較多的組合邏輯電路分為幾個級,在每一級插入寄存器組并暫存中間數(shù)據(jù)。 K級的流水線就是從組合邏輯的輸入到輸出恰好有K個寄存器組(分為K 級,每一級都有一個寄存器組),上一級的輸出是下一級的輸入而又無反饋的電路。 流

    2024年02月02日
    瀏覽(22)
  • Verilog流水線設計——Pipeline

    Verilog流水線設計——Pipeline

    在工程師實際開發(fā)過程中,可能會經(jīng)常遇到這樣的需求:數(shù)據(jù)從數(shù)據(jù)源端不斷地持續(xù)輸入FPGA,F(xiàn)PGA需要對數(shù)據(jù)進行處理,最后將處理好的數(shù)據(jù)輸出至客戶端。 在數(shù)據(jù)處理過程中,可能需要一系列的處理步驟。比如常規(guī)的信號進行處理步驟有(這里的處理步驟只是舉個例子):

    2024年02月08日
    瀏覽(19)
  • 【【verilog典型電路設計之流水線結(jié)構(gòu)】】

    【【verilog典型電路設計之流水線結(jié)構(gòu)】】

    下圖是一個4位的乘法器結(jié)構(gòu),用verilog HDL 設計一個兩級流水線加法器樹4位乘法器 對于流水線結(jié)構(gòu) 其實需要做的是在每級之間增加一個暫存的數(shù)據(jù)用來存儲 我們得到的東西 我們一般來說會通過在每一級之間插入D觸發(fā)器來保證數(shù)據(jù)的聯(lián)通 通過在第一級和第二級,第二級和第

    2024年02月12日
    瀏覽(26)
  • FPGA中的流水線設計(含Verilog范例)

    FPGA中的流水線設計(含Verilog范例)

    在高速通信系統(tǒng)設計中,如何提高系統(tǒng)的工作速度至關重要,通常使用的方法有兩種: 1. 并行方式設計:可減少模塊間的延時; 2. 流水線設計:流水線設計如同生產(chǎn)線一樣,將整個執(zhí)行過程分解為若干個工作段,從流水線的起點連續(xù)輸入,各操作段以重疊方式執(zhí)行。使得運

    2023年04月21日
    瀏覽(22)
  • 流水線乘法器的原理及verilog代碼

    流水線乘法器的原理及verilog代碼

    二進制數(shù)乘法的顯著特點就是可以將乘法轉(zhuǎn)換為移位,乘2就是左移一位,乘2^n就是左移n位。而一個二進制數(shù)又可以看成是由若干個2的i次方的和。 設被乘數(shù)和乘數(shù)分別為M、N,且都是32位的二進制數(shù),乘積結(jié)果為64位 的向量CO則 。 所以乘法可以由移位電路和加法器完成。計算

    2024年02月10日
    瀏覽(24)
  • 南京觀海微電子----Verilog流水線設計——Pipeline

    南京觀海微電子----Verilog流水線設計——Pipeline

    1.? 前言 在工程師實際開發(fā)過程中,可能會經(jīng)常遇到這樣的需求:數(shù)據(jù)從數(shù)據(jù)源端不斷地持續(xù)輸入FPGA,F(xiàn)PGA需要對數(shù)據(jù)進行處理,最后將處理好的數(shù)據(jù)輸出至客戶端。 在數(shù)據(jù)處理過程中,可能需要一系列的處理步驟。比如常規(guī)的信號進行處理步驟有(這里的處理步驟只是舉個

    2024年01月19日
    瀏覽(22)
  • jenkins流水線實現(xiàn)xjar加固

    jenkins流水線實現(xiàn)xjar加固

    xjar的定義 功能特性 xjar使用 修改項目中的pom.xml,一般都是開發(fā)改 jenkins流水線配置 查看jenkins工作目錄 遠端服務器配置–?需要授權的服務器 獲取授權服務器信息 執(zhí)行腳本 腳本內(nèi)容, 1.判斷鏡像是否存在 2.把xjar.go解壓,需要有go環(huán)境 3.制作鏡像,然后把鏡像制作成tar包

    2024年02月07日
    瀏覽(26)
  • CI-持續(xù)集成 — 軟件工業(yè)“流水線”技術實現(xiàn)

    CI-持續(xù)集成 — 軟件工業(yè)“流水線”技術實現(xiàn)

    持續(xù)集成(Continuous Integration)是一種軟件開發(fā)實踐。在本系列文章的前一章節(jié)已經(jīng)對其背景及理論體系進行了介紹。本小節(jié)則承接前面提出的理論構(gòu)想進行具體的技術實現(xiàn)。 《Google軟件測試之道》: \\\"每天,Google都要測試和發(fā)布數(shù)百萬個源文件,億萬行代碼。數(shù)以億計的構(gòu)建

    2024年02月12日
    瀏覽(41)
  • 基于英特爾? Gaudi? 2 AI 加速器的文本生成流水線

    隨著生成式人工智能 (Generative AI,GenAI) 革命的全面推進,使用 Llama 2 等開源 transformer 模型生成文本已成為新風尚。人工智能愛好者及開發(fā)人員正在尋求利用此類模型的生成能力來賦能不同的場景及應用。本文展示了如何基于 Optimum Habana 以及我們實現(xiàn)的流水線類輕松使用 Ll

    2024年03月14日
    瀏覽(19)
  • 1.6流水線:流水線、流水線周期、流水線執(zhí)行時間、流水線吞吐率、流水線加速比

    1.6流水線:流水線、流水線周期、流水線執(zhí)行時間、流水線吞吐率、流水線加速比

    相關參數(shù)計算:流水線執(zhí)行時間計算、流水線吞吐率、流水線加速比等。 流水線是指在程序執(zhí)行時多條指令重疊進行操作的一種準并行處理實現(xiàn)技術。各種部件同時處理是針對不同指令而言的,它們可同時為多條指令的不同部分進行工作,以提高各部件的利用率和指令的平均

    2024年02月09日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包