FPGA排序-冒泡排序介绍

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

 


审核编辑:刘清

猜您喜欢

现代工业和制造业中,配件的选择对产品的质量和性能非常重要。今天,我们将重点介绍特定规格的配件——“Accessories_58.4X8.9MM_SM”。这款配件...
2025-04-24 10:01:13

现代科技迅速发展的背景下,各类配件的作用愈发显著。尤其是“Accessories_10.55X4.7MM_TM”,作为一种特定尺寸的配件,广泛应用于多个行业。本...
2025-03-04 09:47:24

PTC热敏电阻作为重要的温度保护元件,应用于家电、汽车、通信等领域。四川永星作为国内知名的电子元器件制造商,其生产的PTC热敏电阻因优良的性能和稳定的质量,深受...
2012-07-07 03:09:30

现代电子设备中,插件电阻作为一种重要的被动元件,应用于电路设计中。不仅能够调节电流和电压,还在电路中起到限流、分压、保护等多重作用。为了确保电阻的正常工作,了解...
2025-03-18 09:00:34

电子产品日益追求轻薄化的今天,每一个元器件的重量都很重要。贴片电容和贴片电阻作为电路中很重要的组成部分,其轻量化设计也越来越受到重视。相比于传统的插件式元件,贴...
2024-11-29 10:25:57

铆螺母枪是应用于金属加工和维修行业的工具,其规格尺寸直接影响到工作效率和使用效果。铆螺母枪的规格主要包括枪头直径、枪身长度和适配的铆螺母尺寸。常见的铆螺母枪枪头...
2009-05-09 00:00:00

指示灯作为重要的视觉信号工具,应用于多个领域。在交通管理中,红绿灯指示车辆和行人的通行状态,确保道路安全。在家电产品中,指示灯用于显示设备的工作状态,如开关、待...
2010-08-10 00:00:00

硅电容式压力传感器是现代技术重要组成部分。在工业、医疗等领域应用。本文将对此传感器进行详细介绍。定义硅电容式压力传感器是利用硅材料制作的传感器。通过测量压力造成...
2025-04-13 01:31:41


NTC热敏电阻延长线是应用于温度测量和控制领域的电子元件。NTC代表负温度系数(Negative Temperature Coefficient),意味着其电阻...
2025-04-15 04:01:10