FPGA求取极大值

2019-07-15 22:41发布

FPGA求取极大值是要先定义一个二维数组(比如reg [15:0] signal [0:511]),然后将输入的数据存进去再进行处理么?
我的思路是采用状态机,状态1时进行数据的写入,完成状态1后进入状态0进行极大值的求取,逐个将每个值都与左右两边的值进行比较,如果signal[i+1]>signal[i]&&signal[i+1]>signal[i+2]的话就把该值所在地址i+1输出,有没有别的更好的思路什么的?
再就是最后编译得到的结果FPGA占用的资源太大,用的Cyclone IV E total logic elements达到了87%,是因为处理的数据太多的原因还是算法太过麻烦的缘故呢?有没有更好的解决办法?多谢了!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
athu
1楼-- · 2019-07-16 01:12
module detection(clk,data_in,fnum);
input clk;
input [15:0]data_in;
output fnum;
reg [15:0]fnum;
reg [15:0] signal [0:511];
reg [9:0]i;
reg state,next_state=1;               //初始化状态为1,准备往二维数组中写数据
initial
begin
        //$readmemh("memory.txt", signal);
        i<=0;
        fnum<=0;                     
end
always@(posedge clk)          //时钟上升沿i加一
        begin
                if(i!=511)
                        begin
                                i<=i+1;
                        end
                else
                        begin
                                i<=0;
                        end
                state<=next_state;
        end
always@(state,i)                  
        begin
                case(state)
                1'b1:
                        begin
                                if(i==255)
                                        next_state=1'b0;           //状态为1时,当i加到255时下一个状态变为0
                                else
                                        next_state=1'b1;
                        end
                1'b0:
                        begin                            //状态为0时,当i加到255时下一个状态变为1
                                if(i==511)                    
                                        next_state=1'b1;
                                else
                                        next_state=1'b0;
                        end
                endcase        
        end
always@(posedge clk)
        begin
                case(next_state)
                        1'b1:                               //状态为1时,往二维数组里写数据;
                                begin
                                        signal <= data_in;
                                end
                        1'b0:                               //状态为0时,选取数组里极大值所在的地址
                                begin
                                        if(signal[i+1]>signal&&signal[i+1]>signal[i+2])
                                                begin
                                                        fnum<=i+1;
                                                end
                                        else
                                                begin
                                                        fnum<=0;
                                                end        
                                end
                endcase
        end
endmodule
这个是自己写的代码,仿真出来的结果,fnum一直为0,而且耗费的FPGA资源很多。

一周热门 更多>