FPGA排序-冒泡排序介绍

时间:2025-08-03  作者: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))}

 


审核编辑:刘清

猜您喜欢

贴片电阻上的数字编码代表其阻值,理解这些编码对于正确选择元件很重要。常见的编码方式有三位数和四位数两种。三位数编码:前两位数字表示有效数字,第三位数字表示10的...
2024-11-29 10:25:51

在电子测量领域,阻容感测量是非常重要的一环,而RLC电桥则是实现这一测量的关键工具。RLC电桥的规格尺寸对于其便携性和适用性有着直接影响。标准的RLC电桥尺寸通...
2017-04-25 00:00:00

冷却液管是汽车及其机械设备中不可少的重要组成部分,主要用于输送冷却液,帮助发动机或设备维持适宜的工作温度。其基本功能是将发动机产生的热量带走,防止过热现象的发生...
2010-01-14 00:00:00


贴片电阻上的「010」并不是直接表示电阻值的大小,而是采用了一种数字编码方式。其中「010」代表的是100欧姆。 为了方便理解和计算,我们通常将电阻值用kΩ(千...
2024-11-26 11:29:24

Xilinx 复位准则 :(1)尽量少使用复位,特别是少用全局复位,能不用复位就不用,一定要用复位的使用局部复位;(2)如果必须要复位,在同步和异步复位上,则尽...
2023-06-21 09:59:00



引言在需要硬件实现对数运算的场合,其精度和速度是必须考虑的问题。目前硬件实现对数变换的方法主要有查表法、泰勒公式展开法和线性近似法。查表法所需要的存储单元随着...
2021-02-19 11:19:00

FPGA要取代ASIC了,这是FPGA厂商喊了十多年的口号。可是,FPGA地盘占了不少,ASIC也依旧玩得愉快。这两位仁兄到底有啥不一样呢?一、身份证FPG...
2024-03-19 13:53:00