在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3954|回复: 13

[求助] 21个input,如何判断其中是否有相等的呢

[复制链接]
发表于 2021-9-7 10:11:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
21个8bit输入数据,如何判断其中是否有相等的,如果相等需要剔除掉,只留下不相等的。有没有什么高效一点的算法推荐的?
Verilog中直接用两两比较的方式,差不多需要比较21*20/2=210次,耗费的资源较多,效率貌似也不太高
发表于 2021-9-7 10:38:00 | 显示全部楼层
当作一个21个地址的ram数据,数据两两按位异或,异或结果为1的话两个地址的数据都选通,异或结果为0的话屏蔽掉地址大(or 小)的
发表于 2021-9-7 14:03:03 | 显示全部楼层
两个ram,第一个ramA 256x1,第二个ramB 32x8
21个8bit数据作为ramA的地址:ramA初始化后,256个地址的数据全为0,先用8bit数据读取ram中值,
---->如果ramA中读取的值为0,则将1作为数据写入该8bit数据对应地址中,同时将该8bit数据作为ramB的数据写入ramB中(ramB的地址从零开始),ramB地址加1;
---->如果ramA中读取的值为1,说明该数据出现过,且存在于ramB中,则ramB的地址不变化

如此进行21个数据检测,完成以后,ramB的最后写入地址就是不重复数据个数,ramB中的数据就是不重复数据值。

这么做就是浪费ram资源了。
不知道这么个算法对不对,权做参考
发表于 2021-9-7 22:30:19 | 显示全部楼层
本帖最后由 innovation 于 2021-9-8 13:25 编辑


smarthb 发表于 2021-9-7 14:03
两个ram,第一个ramA 256x1,第二个ramB 32x8
21个8bit数据作为ramA的地址:ramA初始化后,256个地址的数据 ...


这个思路很有意思,谢谢提供这个思路。楼主的需求中有一个需要考量的地方,到底是重复的数据全部丢掉?还是保留一个丢掉多余的?如果是保留一个,丢掉多余的,就像朋友说的这样干。
如果是数据重复,则重复数据都丢掉,那么
可能第一个大步骤应该是对21个数依次寻址ramA, 并判断ramA中的值是否等于2,不等于则将ramA中的值+1,等于2则保持ramA中的值不变,那么,ramA应该修改为256x2的结构;
第二步,当21个数比较完成后,再从地址0x00开始,依次读取ramA的内容,如果读取到的值等于1(如果等于0,表示本地址对应的8bits数未出现过,等于2表示本地址对应的8bits数至少出现过两次),则将此时ramA的地址写入ramB,然后ramB地址+1,然后读取ramA的下一个地址的值。。。。。

另:如果是采用xilinx的FPGA来完成这个设计,那么,资源消耗不在ramA、ramB上面,这两个ram基于它的LUT设计Distributed RAM,ramA 256x2的话估计应该是16个lut吧,ramB 32x8的话应该是8个LUT,反倒是可能ramA的地址是8bits,需要从21个输入中选择,这里需要设计8个32:1的mux,这里的资源消耗不小,具体还是的设计并优化后才准确。

总之,我觉得朋友这个思路很有启发性,谢谢。

发表于 2021-9-8 10:40:08 | 显示全部楼层


innovation 发表于 2021-9-7 22:30
这个思路很有意思,谢谢提供这个思路。楼主的需求中有一个需要考量的地方,到底是重复的数据全部丢掉?还 ...


确实啊,lz的需求得明确。
 楼主| 发表于 2021-9-9 16:22:34 | 显示全部楼层


innovation 发表于 2021-9-7 22:30
这个思路很有意思,谢谢提供这个思路。楼主的需求中有一个需要考量的地方,到底是重复的数据全部丢掉?还 ...


蛮有意思的想法,有点cache中的valid位的味道。需求方面确实描述清楚,相同的是采取全部丢弃的策略。
不过速度可能有点跟不上,因为RAM至少要带来一拍的延时,使用register搭建RAM也是一样
 楼主| 发表于 2021-9-9 16:25:35 | 显示全部楼层


smarthb 发表于 2021-9-7 14:03
两个ram,第一个ramA 256x1,第二个ramB 32x8
21个8bit数据作为ramA的地址:ramA初始化后,256个地址的数据 ...


蛮有意思的想法,感谢
 楼主| 发表于 2021-9-9 16:26:52 | 显示全部楼层


zzj0329 发表于 2021-9-7 10:38
当作一个21个地址的ram数据,数据两两按位异或,异或结果为1的话两个地址的数据都选通,异或结果为0的话屏 ...


你说的这个,实质上就是两两比较,当然你写A==B,可能综合器也会给你替换成异或逻辑,然后和0比较
发表于 2021-9-9 16:49:10 | 显示全部楼层
本帖最后由 innovation 于 2021-9-9 18:31 编辑


mysoul 发表于 2021-9-9 16:22
蛮有意思的想法,有点cache中的valid位的味道。需求方面确实描述清楚,相同的是采取全部丢弃的策略。
不 ...


嗯,相同的数都丢弃。
而且,不能有流水线延迟。那么,组合逻辑的门延迟+布线延迟的要求?
那么,你是基于FPGA的设计(如果是FPGA,xilinx? or altera?)?还是基于ASIC的设计?


还有一个问题?楼主的所谓丢弃,该怎么理解,输出0算不算丢弃?应该不算吧?这个需求,输入端口的定义为21个8-bits的总线型数据,输出端口呢?也是21个8-bits的总线型数据?需要丢弃的呢,输出0,应该不行,输出高阻?那更是和基于的设计平台强相关了。
楼主能否明确输出端口的定义和丢弃的准确的逻辑定义呢?


难道输出是21个1-bit的数据有效标志,然后由后端调用本IP的电路再根据此处生成的数据有效标志来决定如何使用原来输入的21个8-bits数据?
 楼主| 发表于 2021-9-9 20:49:41 | 显示全部楼层


innovation 发表于 2021-9-9 16:49
嗯,相同的数都丢弃。
而且,不能有流水线延迟。那么,组合逻辑的门延迟+布线延迟的要求?
那么,你是基于 ...


你猜的真准,其实就是生成标志信号,后级根据标志信号来决定是否处理,所以相同的input,把它对应的标志信号置为0就好了
至于说延时,其实就是不希望有流水线,那么久希望这个处理的过程中1拍完成。
用组合逻辑实现,就得看timing过不过得了。这里我比较倾向用并行逻辑,虽然面积大一点,但是速度足够。流水线的话,代价太大,需要对很多状态进行打拍,耗费的资源远远大于此处的面积
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 21:47 , Processed in 0.027005 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表