分享一个fpga的选取中值的算法,在排序中选取中值,算法参考的下面这篇文章,本人的设计流程如下所示:
发送:这个没啥好说的,就是个仿真。发送1~256个数,每发送一个数都发送一个有效位
接收流程图如下所示:
排序:参考的这篇文章《基于FPGA的并行全比较排序算法》,所以就不罗嗦了。
整体思想就是先把数都存到一个大数组中,分别比较每个数与其他数据的大小,当总数已知时,有总数一半个小于这个数的,就说明这个数为中值。本人的仿真,1~256,共256个数,中值记为129(有128个比它小的数)。程序留了一个排序标志位(sort_start),开始排序后置1,在数组内所有数寻遍历后标志位才清零。
直接上代码吧,xilinx公司的芯片,编译环境ISE
发送数据模块
module data_tx(
input clk,
input rst,
output [8:0] dout,
output Done
);
reg [8:0]data = 9'd0;
integer i = 0;
reg [1:0]state = 2'd1;
reg Done = 1'b0;
always @ (posedge clk or negedge rst)
if (!rst)
begin
data <= 9'd0;
i <= 0;
end
else
case (state)
2'd0: //无意义,从state = 1开始
begin
state <= state + 1'b1;
end
2'd1: //发送数值
begin
state <= state + 1'b1;
data <= (data + 1)