手撕代码:“排序、比较”专题1
本人正在数字IC求职,公众号如下,欢迎大家关注!公众号将会定期推送自己求职过程中实战积累的知识点和题目!
注:以下题目均为各大公司面试真题,要求为用verilog语言实现。
1、 给出4个数据,从中选择出最小的数据,同时将该最小数据的地址输出。
- 思路:分组两两比较,得到的结果再次两两比较,直到比出最终的最小值和地址,推荐的写法是写编写两两比较得出较小数数据和地址的task或function,然后编写组合逻辑调用或者用于DFF触发器D端输入。
2、对输入的16个数据进行排序,找出最大值和次大值(很经典的题目,同理在8个、16个、32个数中找最大、次大值)。
- 思路:这里都认为16个数一次性全部输入,如果是按照clk一次进一个,可以进来一个数比较一次。
1)最直接的算法就是遍历,将这16个数存入数组,采用循环语句,将当前最大值、次大值和新数据对比,从而更新最大值、次大值,16个周期之后就可以得到结果。这种方法一方面需要的时钟周期多,另一方面对硬件电路不友好。
2)从硬件电路的角度出发,这其实是一个16个数据比大小的电路,那么很容易想到比较器,最基本的比较器是2to1比较器。