微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 10个19位数据比较,找出最大值,怎么做比较好?

10个19位数据比较,找出最大值,怎么做比较好?

时间:10-02 整理:3721RD 点击:
需要在一个时钟周期内(125MHz)完成,我想进行并行比较,没找到例子,自己写了一个,思路就是1和2比,较大的一个和3比,再得到一个和4比,依次类推。时序仿真结果不太稳定,最大值的位置应该在0-9内,但是结果经常出现10-15,不知道错在哪儿。另外有没有更好的办法能推荐一下,谢谢。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity max19_10_comb is
port(
clock:in std_logic;
data0,data1,data2,data3,data4,data5,data6,data7:in std_logic_vector(18 downto 0);
data8,data9:in std_logic_vector(18 downto 0);
result_valueut std_logic_vector(18 downto 0);
result_indexut std_logic_vector(3 downto 0)
);
end max19_10_comb;
architecture beha of max19_10_comb is
signal index0:std_logic_vector(3 downto 0):="0000";
signal index1:std_logic_vector(3 downto 0):="0001";
signal index2:std_logic_vector(3 downto 0):="0010";
signal index3:std_logic_vector(3 downto 0):="0011";
signal index4:std_logic_vector(3 downto 0):="0100";
signal index5:std_logic_vector(3 downto 0):="0101";
signal index6:std_logic_vector(3 downto 0):="0110";
signal index7:std_logic_vector(3 downto 0):="0111";
signal index8:std_logic_vector(3 downto 0):="1000";
signal index9:std_logic_vector(3 downto 0):="1001";
signal result01,result02,result03,result04,result05,result06,result07:std_logic_vector(18 downto 0);
signal result08,result09:std_logic_vector(18 downto 0);
signal index01,index02,index03,index04,index05,index06,index07:std_logic_vector(3 downto 0);
signal index08,index09:std_logic_vector(3 downto 0);
begin
process(data0,data1,data2,data3,data4,data5,data6,data7,data8,data9,result01,result02,result03,result04,result05,result06,result07,result08,result09,index01,index02,index03,index04,index05,index06,index07,index08,index09)
begin
if data0 > data1 then
result01 <= data0;
index01 <= index0;
else
result01 <= data1;
index01 <= index1;
end if;

if result01 > data2 then
result02 <= result01;
index02 <= index01;
else
result02 <= data2;
index02 <= index2;
end if;

if result02 > data3 then
result03 <= result02;
index03 <= index02;
else
result03 <= data3;
index03 <= index3;
end if;

if result03 > data4 then
result04 <= result03;
index04 <= index03;
else
result04 <= data4;
index04 <= index4;
end if;

if result04 > data5 then
result05 <= result04;
index05 <= index04;
else
result05 <= data5;
index05 <= index5;
end if;

if result05 > data6 then
result06 <= result05;
index06 <= index05;
else
result06 <= data6;
index06 <= index6;
end if;

if result06 > data7 then
result07 <= result06;
index07 <= index06;
else
result07 <= data7;
index07 <= index7;
end if;

if result07 > data8 then
result08 <= result07;
index08 <= index07;
else
result08 <= data8;
index08 <= index8;
end if;

if result08 > data9 then
result09 <= result08;
index09 <= index08;
else
result09 <= data9;
index09 <= index9;
end if;
end process;

process(clock)
begin
if clock'EVENT and clock = '1' then
result_value <= result09;
result_index <= index09;
end if;
end process;
end beha;

一个时钟周期内要做这么多事情,完的成不哦?

我觉得可以做个流水线来比较好一点

确实在一个周期中没法做

学习学习
!~!

采用并行流水线结构吧,思路就是1和2比,3和4比,5和6比。
较大的再依次比较

可以并行起来, 以空间换时间。

降低频率如果结果稳定,更说明需要改进比较算法。

我觉得从MSB开始比较,若MSB全为“0”都保持不变;存在MSB中为“1”,对应值保持不变,其它MSB为“0”的就整个值屏蔽为全“0”;然后再按上述机制比较剩下的位。
不知可行不?

支持,从MSB比较出发,同时每个bit比较可以并行进行。

谢谢关注,我最后实现的时候用的并行比较+流水线结构,效果还不错。不过像ddxx说的那种方法肯定效果会更好一些。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top