衡阳派盒市场营销有限公司

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

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

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

在FPGA上實(shí)現(xiàn)一個(gè)模塊,求32個(gè)輸入中的最大值和次大值

ZYNQ ? 來(lái)源:ZYNQ ? 2023-03-31 11:18 ? 次閱讀

	

0. 題目

FPGA上實(shí)現(xiàn)一個(gè)模塊,求32個(gè)輸入中的最大值和次大值,32個(gè)輸入由一個(gè)時(shí)鐘周期給出。(題目來(lái)自論壇,面試題,如果覺得不合適請(qǐng)留言刪除)

從我個(gè)人的觀點(diǎn)來(lái)看,這是一道很好的面試題目:

  • 其一是這大概是某些機(jī)器學(xué)習(xí)算法實(shí)現(xiàn)過(guò)程中遇到的問(wèn)題的簡(jiǎn)化,是很有意義的一道題目;

  • 其二是這道題目不僅要求FPGA代碼能力,還有很多可以在算法上優(yōu)化的可能;

當(dāng)然,輸入的位寬可能會(huì)影響最終的解題思路和最終的實(shí)現(xiàn)可能性。但位寬在一定范圍內(nèi),譬如8或者32,解題的方案應(yīng)該都是一致的,只是會(huì)影響最終的頻率。后文針對(duì)這一題目做具體分析。(題目沒(méi)有說(shuō)明重復(fù)元素如何處理,這里認(rèn)為最大值和次大值可以是一樣的,即計(jì)算重復(fù)元素)

1. 解法

從算法本身來(lái)看,找最大值和次大值的過(guò)程很簡(jiǎn)單;通過(guò)兩次遍歷:第一次求最大值,第二次求次大值; 算法復(fù)雜度是O(2n)。FPGA顯然不可能在一個(gè)周期內(nèi)完成如此復(fù)雜的操作,一般需要流水設(shè)計(jì)。這一方法下,整個(gè)結(jié)構(gòu)是這樣的

  1. 通過(guò)比較,求最大值,通過(guò)流水線實(shí)現(xiàn)兩兩之間的比較,32-16-8-4-2-1通過(guò)5個(gè)clk的延遲可以求得最大值;

  2. 由于需要求取次大值,因此需要確定最大值的位置,在求最大值的過(guò)程中需要維持最大值的坐標(biāo);

  3. 最大值坐標(biāo)處取值清零(置為最小)

  4. 通過(guò)流水線實(shí)現(xiàn)兩兩之間的比較,32-16-8-4-2-1,再經(jīng)過(guò)5個(gè)clk的延遲可以求得次大值;

這種解法有若干個(gè)缺點(diǎn),包括:延遲求最大值和次大值分別需要5clk延時(shí),總延遲會(huì)超過(guò)10個(gè)cycles;資源占用較高,維持最大值坐標(biāo)和清零操作耗費(fèi)了較多資源,同時(shí)為了計(jì)算次大值,需要將輸入寄存若干個(gè)周期,寄存器消耗較多。

另一個(gè)種思路考慮同時(shí)求最大值和次大值,由于這一邏輯較為復(fù)雜,可以將其流水化,如下圖。(以8輸入為例,32輸入需要增加兩級(jí))

74842442-cf69-11ed-bfe3-dac502259ad0.png

其中sort模塊完成對(duì)4輸入進(jìn)行排序,得到最大值和次大值輸出的功能。4個(gè)數(shù)的排序較為復(fù)雜,這一過(guò)程大概需要2-3個(gè)cycles完成。對(duì)于32輸入而言,輸入數(shù)據(jù)經(jīng)過(guò)32-16-8-4-2輸出得到結(jié)果,延遲大概也有10個(gè)周期。

2. 分治

如果需要在FPGA上實(shí)現(xiàn)一個(gè)特定的算法,那么去找一個(gè)合適的方法去實(shí)現(xiàn)就好了;但如果是要實(shí)現(xiàn)一個(gè)特定的功能,那么需要找一個(gè)優(yōu)秀的且適合FPGA實(shí)現(xiàn)的方法

求最大值和次大值是一個(gè)很不完全的排序,通過(guò)簡(jiǎn)單的查找復(fù)雜度為O(2n),且不利于硬件實(shí)現(xiàn)。對(duì)于排序而言,無(wú)論快速排序或者歸并排序都用了分治的思想,如果我們?cè)噲D用分治的思想來(lái)解決這一問(wèn)題。考慮當(dāng)只有2個(gè)輸入時(shí),通過(guò)一個(gè)比較就可以得到輸出,此時(shí)得到的是一個(gè)長(zhǎng)度為2的有序數(shù)組。如果兩個(gè)有序數(shù)組,那么通過(guò)兩次比較就可以得到最大值和次大值。采用歸并排序的思想,查找最大值和次大值的復(fù)雜度為O(1.5n)(即為n/2+n/2+n/4… ,不知道有沒(méi)有算錯(cuò))。采用歸并排序的思想,從算法時(shí)間復(fù)雜度上看更為高效了。

那么這一方案是否適合FPGA實(shí)現(xiàn)呢,答案是肯定的。分治的局部性適合FPGA的流水實(shí)現(xiàn),框圖如下。(以8輸入為例,32輸入需要增加兩級(jí))

749acc9c-cf69-11ed-bfe3-dac502259ad0.png

其中meg模塊內(nèi)部有兩級(jí)的比較器,一般而言1clk就可以完成,輸入數(shù)據(jù)經(jīng)過(guò)32-32-16-8-4-2得到結(jié)果,延遲為5個(gè)時(shí)鐘周期。實(shí)現(xiàn)代碼如下

74ab1386-cf69-11ed-bfe3-dac502259ad0.jpg74bee64a-cf69-11ed-bfe3-dac502259ad0.jpg


	
module test#(
parameter DW = 8
)
(
input clk,
input [32*DW-1 :0] din,
output [DW-1:0] max1,
output [DW-1:0] max2
);


wire[DW-1:0] d[31:0];
generate
    genvar i;
    for(i=0;i<32;i=i+1)
    begin:loop_assign
        assign d[i] = din[DW*i+DW-1:DW*i];
    end
endgenerate


// stage 1,comp
reg[DW-1:0] s1_max[15:0];
reg[DW-1:0] s1_min[15:0];
generate
    for(i=0;i<16;i=i+1)
    begin:loop_comp
        always@(posedge clk)
            if(d[2*i]>d[2*i+1])begin
                s1_max[i] <= d[2*i];
                s1_min[i] <= d[2*i+1];
            end
            else begin
                s1_max[i] <= d[2*i+1];
                s1_min[i] <= d[2*i];
            end
    end
endgenerate


// stage 2,
wire[DW-1:0] s2_max[7:0];
wire[DW-1:0] s2_min[7:0];
generate
    for(i=0;i<8;i=i+1)
    begin:loop_megs2
        meg u_s2meg(
            .clk(clk),
            .g1_max(s1_max[2*i]),
            .g1_min(s1_min[2*i]),
            .g2_max(s1_max[2*i+1]),
            .g2_min(s1_min[2*i+1]),
            .max1(s2_max[i]),
            .max2(s2_min[i])
        );
    end
endgenerate
// stage 3,
wire[DW-1:0] s3_max[3:0];
wire[DW-1:0] s3_min[3:0];
generate
    for(i=0;i<4;i=i+1)
    begin:loop_megs3
        meg u_s3meg(
            .clk(clk),
            .g1_max(s2_max[2*i]),
            .g1_min(s2_min[2*i]),
            .g2_max(s2_max[2*i+1]),
            .g2_min(s2_min[2*i+1]),
            .max1(s3_max[i]),
            .max2(s3_min[i])
        );
    end
endgenerate


// stage 4,
wire[DW-1:0] s4_max[1:0];
wire[DW-1:0] s4_min[1:0];
generate
    for(i=0;i<2;i=i+1)
    begin:loop_megs4
        meg u_s4meg(
            .clk(clk),
            .g1_max(s3_max[2*i]),
            .g1_min(s3_min[2*i]),
            .g2_max(s3_max[2*i+1]),
            .g2_min(s3_min[2*i+1]),
            .max1(s4_max[i]),
            .max2(s4_min[i])
        );
    end
endgenerate


// stage 5,
meg u_s5meg(
    .clk(clk),
    .g1_max(s4_max[0]),
    .g1_min(s4_min[0]),
    .g2_max(s4_max[1]),
    .g2_min(s4_min[1]),
    .max1(max1),
    .max2(max2)
);
endmodule


module meg#(
parameter DW = 8
)
(
input clk,
input [DW-1 :0] g1_max,
input [DW-1 :0] g1_min,
input [DW-1 :0] g2_max,
input [DW-1 :0] g2_min,
output reg [DW-1:0] max1,
output reg [DW-1:0] max2
);
always@(posedge clk)
begin
    if(g1_max>g2_max) begin
        max1 <= g1_max;
        if(g2_max>g1_min)
            max2 <= g2_max;
        else
            max2 <= g1_min;
    end
    else begin
        max1 <= g2_max;
        if(g1_max>g2_min)
            max2 <= g1_max;
        else
            max2 <= g2_min;
    end
end
endmodule

	

3. 其他

簡(jiǎn)單測(cè)試了上面的代碼,在上一代器件上(20nm FPGA),8bit數(shù)據(jù)輸入模塊能綜合到很高的頻率,邏輯級(jí)數(shù)大概是5級(jí)左右,對(duì)于整個(gè)工程而言瓶頸基本不會(huì)出現(xiàn)在這一部分。32bit數(shù)據(jù)輸入由于數(shù)據(jù)位寬太大,頻率不會(huì)太高,但是通過(guò)將meg模塊做一級(jí)流水,也幾乎不會(huì)成為整個(gè)系統(tǒng)的瓶頸。

32bit32輸入情況下,數(shù)據(jù)輸入位寬為1024(不是IO輸入,是內(nèi)部信號(hào))。之前在通信/數(shù)字信號(hào)處理方面可能不會(huì)用到這么大位寬的數(shù)據(jù),但對(duì)于AI領(lǐng)域FPGA的應(yīng)用,數(shù)千比特的輸入應(yīng)該是很平常的,這的確會(huì)影響最終FPGA上實(shí)現(xiàn)的效果。要想讓機(jī)器學(xué)習(xí)算法在FPGA上跑得更好,還需要算法和FPGA共同努力才是。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    1630

    文章

    21797

    瀏覽量

    606016
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2735

    瀏覽量

    47750
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5363

    瀏覽量

    121169
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8438

    瀏覽量

    133087

原文標(biāo)題:3. 其他

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    DAQmx最大值最小的設(shè)定

    如何將與最大值和最小相連的輸入控件控制旋鈕的最大最小,即DAQmx中最大最小
    發(fā)表于 08-08 10:45

    怎么設(shè)置波形體表的兩個(gè)Y軸的最大值

    對(duì)波形圖表設(shè)置了兩個(gè)Y軸,個(gè)左邊,個(gè)右邊,想
    發(fā)表于 09-29 13:09

    labview怎么判斷十個(gè)數(shù)值最大值和最小

    1.采集10個(gè)數(shù)據(jù) 怎么速度的判斷出其中的 最大值和最小? 2.采集十個(gè)數(shù)據(jù),怎么速度求出其中最大值和最小
    發(fā)表于 04-23 10:40

    怎么查找個(gè)數(shù)組里面與最大值最近的極大啊?

    本帖最后由 唐少華 于 2017-2-20 11:32 編輯 labview怎么查找個(gè)數(shù)組里面與最大值靠得最近的極大啊?次大
    發(fā)表于 02-20 10:54

    請(qǐng)問(wèn)C6713找最大值次大的可行方法?

    我目前要用C6713處理上萬(wàn)個(gè)數(shù)據(jù),其中有步是要找出這些數(shù)據(jù)最大值次大
    發(fā)表于 07-25 06:08

    AD9235的使用穩(wěn)定性未作出找到最大值的操作

    向各位大師請(qǐng)教幾個(gè)問(wèn)題,我使用ad9235與fpga電路進(jìn)行個(gè)簡(jiǎn)單的最大值判斷電路。個(gè)類似正
    發(fā)表于 10-09 17:43

    交流電的最大值與有效

    交流電的最大值與有效    我們知道,交流信號(hào)是時(shí)間的函數(shù),它的幅度是隨時(shí)間
    發(fā)表于 04-16 23:35 ?1.8w次閱讀
    交流電的<b class='flag-5'>最大值</b>與有效<b class='flag-5'>值</b>

    輸入最小 最大值選擇電路

    輸入最小 最大值選擇電路
    發(fā)表于 09-25 10:37 ?2779次閱讀
    四<b class='flag-5'>輸入</b>最小 <b class='flag-5'>最大值</b>選擇電路

    FPGA如何32個(gè)輸入最大值次大:分治

    FPGA實(shí)現(xiàn)個(gè)模塊
    的頭像 發(fā)表于 06-28 09:18 ?8531次閱讀

    交流電的有效最大值和平均值

    瞬時(shí)值的絕對(duì),用I m 、U m 、E m 分別表示電流、電壓和電動(dòng)勢(shì)的最大值。 3、交流電的有效 1)交流電的瞬時(shí)值是個(gè)隨時(shí)間變化的
    的頭像 發(fā)表于 10-30 09:11 ?1.1w次閱讀

    pythoninput怎么輸入3個(gè)

    Python ,可以使用 input() 函數(shù)來(lái)獲取用戶的輸入。如果你想要輸入多個(gè),可以根據(jù)具體的需求使用以下方法。 方法
    的頭像 發(fā)表于 11-23 15:31 ?1w次閱讀

    jvm配置metaspace最大值的參數(shù)

    JVM(Java虛擬機(jī))是Java程序的運(yùn)行環(huán)境,而Metaspace是Java 8及其更高版本引入的種新的內(nèi)存區(qū)域,用于存儲(chǔ)類的元數(shù)據(jù)。Metaspace的最大值可以通過(guò)JVM
    的頭像 發(fā)表于 12-05 14:21 ?2279次閱讀

    BUCK電路占空比最小最大值的限制因素分別是什么?

    BUCK電路占空比最小最大值的限制因素? BUCK電路是種常用于降壓調(diào)節(jié)的電力轉(zhuǎn)換器,廣泛應(yīng)用于電源管理、馬達(dá)控制和電動(dòng)車輛等領(lǐng)域。設(shè)計(jì)和實(shí)施BUCK電路時(shí),占空比是
    的頭像 發(fā)表于 01-31 18:14 ?4197次閱讀

    二極管擊穿電壓是最大值還是有效

    二極管擊穿電壓是指二極管反向偏置下,電流突然增大,導(dǎo)致二極管損壞的電壓最大值(Peak Value):最大值是指在
    的頭像 發(fā)表于 08-08 10:05 ?1162次閱讀

    三相電流有效最大值關(guān)系

    為: 有效 = 最大值 / √2 這個(gè)關(guān)系是基于正弦波交流電的特性得出的。正弦波交流電,電流(或電壓)隨時(shí)間變化,其波形呈現(xiàn)為正弦曲線。有效
    的頭像 發(fā)表于 08-08 10:11 ?4083次閱讀
    百家乐赚钱项目| 百家乐有无规律可循| 百家乐官网看炉子的方法| 大发888亚洲游戏平台| 24山认龙立向| 澳门百家乐官网赢钱| 威尼斯人娱乐诚| 缅甸百家乐网站是多少| 鑫鼎百家乐官网的玩法技巧和规则| 治多县| 真人游戏角色| 澳门百家乐技术| 风水24龙| 澳门百家乐官网走势图| 百家乐官网软件代打| 皇冠网网址| 棋牌网站| 百家乐家乐娱乐城| 百家乐博彩通网| 罗盘24山度数| 回力百家乐官网的玩法技巧和规则| 百家乐官网娱乐网站| 黔南| 足球投注技巧| 大连娱网棋牌官网| 利博百家乐破解| 线上百家乐攻略| 百家乐21点| 百家乐庄和闲的赌法| 利记百家乐现金网| 风水做生意房漏水| 百家乐官网计划软件| 百家乐官网桌定制| 百家乐官网六合彩| 百家乐官网筹码币方形| 百家乐官网打法内容介绍| 百家乐官网哪条路好| 南汇区| 万豪国际娱乐城| KK娱乐| 永利网上娱乐|