首页 > 技术 > 内容

FPGA排序-冒泡排序介绍

时间:2026-01-17  作者: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))}

 


审核编辑:刘清

猜您喜欢


充气磊是应用于户外活动和运动场所的健身器材,其规格尺寸是用户选择时的重要参考。充气磊的直径通常在60厘米到90厘米之间,适合不同年龄段和体重的使用者。其高度一般...
2010-03-09 00:00:00
可调电容是电子设备中重要的元件。的主要功能是调节电容值。应用于各种电路中,尤其是无线电和音频设备。下面我们来看看可调电容的具体作用。调谐功能可调电容用于调谐电路...
2025-03-23 07:00:02
在选择潜水泵时,规格尺寸是一个非常重要的考虑因素。潜水泵的规格通常包括泵的流量、扬程、功率和口径等。流量是指泵在单位时间内可以输送的水量,常用单位为立方米每小时...
2025-06-25 00:00:00
贴片电阻上的512并非指电阻大小为512欧姆,而是一种编码方式,代表着电阻的阻值。 512是三位数字编码,前两位51代表有效数字,最后一位2代表10的n次方(n...
2024-11-29 10:26:10
共模滤波器是有效的电磁干扰抑制装置,其主要优势体现在以下几个方面。能够有效抑制共模噪声,减少对信号的干扰,从而提升系统的信号质量和稳定性。共模滤波器具有的适用性...
2015-06-18 00:00:00
学习至简设计法,学会模块设计和模块划分技巧。模块划分,顾名思义是指模块的划分。但是,明德扬至简设计法提出的模块划分,是广义的“模块划分”。后续所提及的“模块划分...
2018-04-20 02:44:00
现代社会,安防监控系统已经成为保障家庭和企业安全的重要手段。而监控摄像头的稳定运行离不开可靠的电力供应,这就需要用到监控电源线。那么,监控电源线究竟是什么线呢?...
2023-12-30 00:00:00
贴片电阻上的「681」代表其阻值为680欧姆。贴片电阻的阻值通常用三位数字表示,前两位数字是有效数字,第三位数字表示10的n次方,其中n为第三位数字的值。因此,...
2024-11-26 11:30:08
电子设备中,电容器是一个重要的元件。薄膜电容和电解电容是两种常见类型。在用途上有很大不同。本文将探讨这两种电容的用途和区别。基本概念薄膜电容是用塑料薄膜制作的。...
2025-03-23 12:30:34