首页 > 技术 > 内容

FPGA排序-冒泡排序介绍

时间:2025-12-07  作者:Diven  阅读:0

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

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

整个排序的过程就是两两比较,然后做交换。整个过程的时间复杂度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))}

 


审核编辑:刘清

猜您喜欢


新品发布致力于提供高品质芯片的国内优秀模拟及数模混合芯片设计商上海类比半导体技术有限公司(下称“类比半导体”或“类比”)宣布推出小尺寸、低功耗、高性能、零漂移...
2023-08-25 11:35:00
电子元器件中,二极管是重要的半导体器件,应用于整流、开关、信号调节等多个领域。而VF(正向电压降)是二极管的重要参数,直接影响其性能和应用。本文将对VF参数进行...
2025-04-05 04:31:08
梅花扳手是常见的手动工具,应用于机械维修和日常生活中。主要参数包括尺寸、材质、开口角度和驱动方式等。梅花扳手的尺寸通常以毫米(mm)为单位,常见的有8mm、10...
2017-07-03 00:00:00
汽车保险丝作为保护汽车电路安全的重要元件,其质量和性能直接影响车辆的行驶安全。永册作为汽车保险丝领域的知名品牌,旗下有多个不同的保险丝品牌和系列。那么,永册汽车...
2024-01-23 01:23:30
贴片电阻,这种小小的电子元件,在电路板上随处可见。看起来都差不多,但颜色却各不相同。这些颜色可不是为了好看,而是代表着电阻值的大小。 对于初学者来说,解读这些颜...
2024-11-29 10:25:55
贴片电阻上的121并不是直接代表电阻值的大小,而是一种编码方式。代表的是120欧姆的阻值。这种编码方式通常用于三位数的贴片电阻。前两位数字代表有效数字,第三位数...
2024-11-29 10:26:37
保险丝作为重要的保护元件,起着防止电路过载和短路的关键作用。驭舵保险丝系列因其高品质和可靠性,受到市场青睐。那么,驭舵保险丝系列都涵盖了哪些品牌?本文将从多个角...
2022-08-27 16:50:30
容量瓶是常用于化学实验中的玻璃器具,其规格尺寸通常有多种选择,以满足不同实验需求。常见的容量瓶规格包括50毫升、100毫升、250毫升、500毫升和1000毫升...
2012-03-11 00:00:00
光敏电阻(Photoresistor),又称为光电导体,是依赖于光照强度变化而改变电阻值的元件。应用于各种光感应设备中,如自动灯光控制、光线检测器和摄影设备等。...
2025-04-17 22:01:13
作为全球极具规模及影响力的光电产业综合性展会——第24届中国国际光电博览会(以下简称:光博会)将于2023年9月6日-8日在深圳国际会展中心(宝安新馆)隆重举行...
2023-09-01 10:39:00