FPGA排序-冒泡排序介绍

时间:2025-09-17  作者:Diven  阅读:0

排序算法是图像处理中经常使用算法,常见的排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序。
如下图:

FPGA排序-冒泡排序介绍

冒泡排序的排序过程如下:

整个排序的过程就是两两比较,然后做交换。整个过程的时间复杂度n的平方,也就是说需要交换很多次,如果把这么多交换过程都在一个时钟周期内完成的话,组合逻辑会很长,这样直接影响最后的时序。如果每个时钟周期进行一次交换的话,pipeline是会很长的。

那么我们可以通过变通一下,整个排序过程只做比较,而不做交换。每一次比较的结果都记录下来,然后设置一个计分板,通过计分板就可以知道排序的结果了。

首先是比较的过程:判断输入的两个数哪个大,使用1bit变量来记录比较结果。

然后是计分板的生成:

最后是排序结果的输出:

仿真代码如下:

仿真波形:

一共三级流水,占用的资源也不多,可以自己通过reduceBalancedTree来增加更多的流水。

照例提供SpinalHDL的源码,Verilog有需要的私聊:

 

import spinal.core._import spinal.lib._class BubbleSort(DATA_WIDTH: Int, DATA_NUM: Int) extends Component { val io = new Bundle { val dataIn = in Vec(UInt(DATA_WIDTH bits), DATA_NUM) val dataInValid = in Bool() val dataOut = out Vec(Reg(UInt(DATA_WIDTH bits)), DATA_NUM) val dataOutValid = out(Reg(Bool()) init False) } noIoPrefix() val sortV = Vec(Vec(UInt(1 bits), DATA_NUM - 1), DATA_NUM) for (i <- 0 until DATA_NUM) { for (j <- (i + 1) until DATA_NUM) { sort(io.dataIn(i), io.dataIn(j), sortV(i)(j - 1), sortV(j)(i)) } } val scoreBoard = Vec(Reg(UInt(log2Up(DATA_NUM - 1) bits)), DATA_NUM) for (i <- 0 until DATA_NUM) {        scoreBoard(i) := sortV(i).reduceBalancedTree(_ +^ _).resized    }    def sort(data1: UInt, data2: UInt, out1: UInt, out2: UInt): Unit = {        val out = Reg(UInt(1 bits))        when(data1 >= data2) { out := 1 } otherwise { out := 0 } out1 := out out2 := ~out1 } val dataTemp = RegNext(RegNext((io.dataIn))) val dataTempValid = RegNext(RegNext(io.dataInValid, init = False), init = False) for (i <- 0 until DATA_NUM) { io.dataOut(scoreBoard(i)) := dataTemp(i) } io.dataOutValid := dataTempValid}object BubbleSort extends App { SpinalConfig(inlineConditionalExpression = true,anonymSignalPrefix="temp").generateVerilog(new BubbleSort(8, 8))}

 


审核编辑:刘清

猜您喜欢

聚丙烯膜电容,常被人提及。在电子设备中应用。很多人疑惑,这种电容是否属于薄膜电容的呢?本文将对此进行详细探讨。**1. 聚丙烯膜电容的定义**聚丙烯膜电容,使用...
2025-03-27 23:00:35

是的,贴片电阻的规格尺寸和功率有密切关系。尺寸越大的贴片电阻,其功率也越大。这是因为更大的尺寸意味着更大的散热面积,可以承受更大的电流和更高的温度,从而能够承载...
2025-04-14 15:04:03

2025 年伊始,洛微科技(LuminWave)正式宣布获得北京电控光电融合基金战略投资,并完成B1轮融资首关,成为本年度激光雷达行业以及光电融合产业领域的开篇...
2025-01-02 18:06:00

电子元器件中,二极管是非常重要的基础组件。在电路中起着单向导电的作用,应用于整流、信号调制和保护电路等领域。二极管的种类繁多,其中通用二极管和肖特基二极管是两种...
2025-04-08 10:31:06

贴片电容(MLCC)是应用于电子产品中的无极性电容器,其规格尺寸因应用需求而异。常见的贴片电容尺寸有0402、0603、0805、1206等,其中数字代表电容的...
2012-12-14 00:00:00

二极管是电子电路中常见的元件,主要用于整流、限流和保护电路等功能。二极管在使用过程中可能会出现故障,导致电路无法正常工作。了解如何用电阻测量二极管的好坏,可以帮...
2025-04-15 11:00:11

稳压二极管,又称齐纳二极管,是具有稳定电压特性的二极管。通常用于电压稳压和过压保护等电路中。了解如何测量稳压二极管的好坏,对于电子爱好者和工程师而言,非常重要。...
2025-04-06 17:30:35

对元器件的性能和多样性要求也越来越高。禾伸堂(HEC)作为知名的薄膜电阻制造商,高品质的产品和丰富的规格赢得了市场的认可。本文将围绕禾伸堂薄膜电阻的体积规格及其...
2018-06-19 15:21:30


涂层手套是应用于各行各业的防护装备,主要根据涂层材料的不同进行分类。聚氨酯涂层手套优异的耐磨性和灵活性受到欢迎,常用于精细操作和装配工作。丁腈涂层手套则具有良好...
2022-06-03 00:00:00