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%,是因为处理的数据太多的原因还是算法太过麻烦的缘故呢?有没有更好的解决办法?多谢了!!
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资源很多。
一周热门 更多>