FPGA排序-冒泡排序介绍

时间:2025-06-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))}

 


审核编辑:刘清

猜您喜欢

连接器附件在现代电子设备中是不可少的配件。主要用于提高连接器的性能和稳定性,确保数据传输的准确性和安全性。通过使用这些附件,可以有效防止信号干扰和电磁干扰,提升...
2024-01-20 00:00:00



液晶显示器(LCD)作为现代生活中重要的一部分,其清晰明亮的显示效果离不开背光灯管的支持。而背光灯管电压,则是决定其亮度和色彩表现的关键因素。简单来说,背光灯管...
2024-04-24 00:00:00

电子元器件的焊接过程中,贴片电阻作为常见的被动元件,其焊接质量直接影响到电路的稳定性和可靠性。许多工程师在焊接时,会考虑不同的焊接角度,其中45度夹角是否会加速...
2025-03-18 03:31:06

在当今电子产品日益复杂的时代,专业电源管理集成电路(PMIC)作为核心组件,是非常重要的配件。PMIC的主要功能是优化电源的使用效率,确保设备在不同工作状态下的...
2008-06-11 00:00:00

电阻器是电子电路中重要的基本元件,主要用于限制电流、分压以及提供负载等功能。根据不同的材料、结构和工作原理,电阻器可以分为多种类型。本文将深入探讨不同类型的电阻...
2025-03-17 17:30:34

0603贴片电阻是电子电路中常用的基础元件,其封装尺寸为0.06英寸0.03英寸(即1.6mm0.8mm)。本阻值表提供0603封装贴片电阻的完整阻值范围,方便...
2024-11-26 11:29:08

白板清洁液是专门用于清洁白板表面的产品,能够有效去除标记笔留下的痕迹,保持白板的清晰度和光滑度。市面上的白板清洁液规格多样,常见的包装尺寸有250ml、500m...
2024-12-31 00:00:00

开关二极管电路在现代电子技术中是非常重要的配件,应用于各种电子设备和电路中。主要功能是控制电流的通断,确保电路的正常运行。本文将对开关二极管电路进行详细介绍,探...
2025-04-10 05:30:03