一种混合排序——双调排序+双插入排序——来自2024-TCAS-I

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文算是排序器系列的第二篇,刚好碰到一篇有意思的论文,电路领域顶刊TCAS-I上一个排序器,实现的方案是一种混合排序,也就是将双调排序的双调阶段结果用于双插入,由于双调的结果是得到两个单调增/减的序列,因此再进一步用到插入排序上会简单很多,因为2个序列的单调性都已知,且最大和最小值可以同时插入。

不过我理论分析过,发现这种混合模式的排序方案并不见得比双调排序快,理论上这样的混合排序在序列长度较短时速度快,但是这种混合排序毕竟并行度是2,当规模进一步扩大时,混合排序的速度远远追不上纯的双调排序。(个人觉得还是中看不中用,不过既然写完了,那还是得在论文里面好好发挥一下价值)

本篇工作只打算实现混合排序,使用了9个状态的状态机,给出代码和波形,别的不给了。


一、图解混合排序

上图中A和B序列都是经过双调排序的双调阶段得到的2个单调序列。作者的思路就是考虑同时将A序列中的最大和最小值插入到B序列中,之后在A序列的剩余元素中挑出最大值和最小值接着插入到B序列中,直到A序列剩余元素个数为0。

二、混合排序

1. top.v

混合排序模块的代码如下:

module sort_bitonic_insertion #(parameter BITWIDTH = 8, parameter ELEMENTS = 32)(
    input clk,
    input rst_n,
    input [ELEMENTS*BITWIDTH-1:0] data_in,
    output reg [ELEMENTS*BITWIDTH-1:0] data_out
);

    reg [7:0] array[0:31];
    reg [2:0] i;

    // used for bi-insertion
    reg [4:0] imax, imin; // 等待插入的序列,其中imax、imin分别代表待插入序列的max和min编号
    reg [5:0] jmax, jmin; // 固定住的序列

    reg [5:0] jmaxL, jminL;

    reg [7:0] insert_array[0:47]; // 中间16个放j序列
    reg [7:0] pending_array[0:15];

    localparam IDLE     = 4'b0000, // 0
              STAGEA    = 4'b0001, // 1
              STAGEB    = 4'b0010, // 2
              STAGEC    = 4'b0011, // 3
              STAGED    = 4'b0100, // 4
              PREPARE   = 4'b0101,  // 该状态用于将bitonic好的j序列放到insert_array中,同时初始化imax imin jmax jmin max/minfinish
              BREAK     = 4'b0110, // 6
              SORT      = 4'b0111, // 7
              DONE      = 4'b1111; // 8

    reg [3:0] state_c;
    reg [3:0] state_n;

    genvar p;
    generate
        for (p=0; p<32; p=p+1) begin: ASSIGN_FOR_DATA_OUT_EFFECTIVE
            always @(posedge clk) begin
                data_out[p*8 +: 8] <= insert_array[p+8];  // 最后有效数据区间落在8-39
            end
        end
    endgenerate
    
    // State Transfer - First
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            state_c <= IDLE;
        end
        else begin
            state_c <= state_n;
        end
    end

    // State Transfer - Second
    always @(*) begin
        case (state_c)
            IDLE: begin
                state_n = STAGEA;
            end
            STAGEA: begin
                if (i == 0) state_n = state_c;
                else state_n = STAGEB;
            end
            STAGEB: begin
                if (i == 0 || i == 1) state_n = state_c;
                else state_n = STAGEC;
            end
            STAGEC: begin
                if (i == 0 || i == 1 || i ==2) state_n = state_c;
                else state_n = STAGED;
            end
            STAGED: begin
                if (i == 0 || i == 1 || i ==2 || i ==3) state_n = state_c;
                else state_n = PREPARE;
            end
            PREPARE: begin
                state_n = BREAK;
            end
            BREAK: begin
                if (imin - imax == 1) state_n = DONE;
                else state_n = SORT;
            end
            SORT: begin
                if (insert_array[jmax] < pending_array[imax] && insert_array[jmin] >= pending_array[imin]) state_n = BREAK;
                else state_n = state_c;
            end
            default: state_n = DONE;
        endcase
    end

    // State Transfer - Third
    // 1 - The change of i
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) i <= 0;
        else begin
            if (state_c == IDLE) i <= 0;
            else if (state_c == STAGEA) begin
                if (i == 0) i <= i + 1;
                else i <= 0;
            end
            else if (state_c == STAGEB) begin
                if (i == 0 || i == 1) i <= i + 1;
                else i <= 0;
            end
            else if (state_c == STAGEC) begin
                if (i == 0 || i == 1 || i ==2) i <= i + 1;
                else i <= 0;
            end
            else if (state_c == STAGED) begin
                if (i == 0 || i == 1 || i == 2 || i ==3) i <= i + 1;
                else i <= 0;
            end
            else i <= i;
        end
    end

    // 2.1 - The change of imax, imin
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            imax <= 0;
            imin <= 0;
        end
        else begin
            if (state_c == PREPARE) begin
                imax <= 31;  // 对应到pending_array中的索引 pending_array长度16
                imin <= 16;  // 对应到pending_array中的索引
            end
            else if (state_c == BREAK) begin
                if (imin - imax == 1) begin // next state is DONE
                    imax <= 0;
                    imin <= 0;
                end
                else begin // next state is SORT
                    imax <= imax + 1; // 首次时,31+1 = 0
                    imin <= imin - 1;
                end
            end
            else if (state_c == SORT) begin
                imax <= imax;
                imin <= imin;
            end
            else if (state_c == DONE) begin
                imax <= 0;
                imin <= 0;
            end
            else begin
                imax <= imax;
                imin <= imin;
            end
        end
    end

    // 2.2 - The change of jmax, jmin
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) jmax <= 0;
        else begin
            if (state_c == BREAK) jmax <= jmaxL;
            else if (state_c == SORT) begin
                if (insert_array[jmax] >= pending_array[imax]) jmax <= jmax - 1;
                else jmax <= jmax;
            end
            else jmax <= jmax;
        end
    end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) jmin <= 0;
        else begin
            if (state_c == BREAK) jmin <= jminL;
            else if (state_c == SORT) begin
                if (insert_array[jmin] < pending_array[imin]) jmin <= jmin + 1;
                else jmin <= jmin;
            end
            else jmin <= jmin;
        end
    end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) jmaxL <= 31;
        else begin
            if (state_c == BREAK) jmaxL <= jmaxL + 1;
            else if (state_c == DONE) jmaxL <= 0;
            else jmaxL <= jmaxL;
        end
    end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) jminL <= 16;
        else begin
            if (state_c == BREAK) jminL <= jminL - 1;
            else if (state_c == DONE) jminL <= 0;
            else jminL <= jminL;
        end
    end

    // 3 - The change of array
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            array[0] <= 0;
            array[1] <= 0;
            array[2] <= 0;
            array[3] <= 0;
            array[4] <= 0;
            array[5] <= 0;
            array[6] <= 0;
            array[7] <= 0;
            array[8] <= 0;
            array[9] <= 0;
            array[10] <= 0;
            array[11] <= 0;
            array[12] <= 0;
            array[13] <= 0;
            array[14] <= 0;
            array[15] <= 0;
            array[16] <= 0;
            array[17] <= 0;
            array[18] <= 0;
            array[19] <= 0;
            array[20] <= 0;
            array[21] <= 0;
            array[22] <= 0;
            array[23] <= 0;
            array[24] <= 0;
            array[25] <= 0;
            array[26] <= 0;
            array[27] <= 0;
            array[28] <= 0;
            array[29] <= 0;
            array[30] <= 0;
            array[31] <= 0;         
        end
        else begin
        if (state_c == IDLE) begin
            array[0] <= data_in[0*8 +: 8];
            array[1] <= data_in[1*8 +: 8];
            array[2] <= data_in[2*8 +: 8];
            array[3] <= data_in[3*8 +: 8];
            array[4] <= data_in[4*8 +: 8];
            array[5] <= data_in[5*8 +: 8];
            array[6] <= data_in[6*8 +: 8];
            array[7] <= data_in[7*8 +: 8];
            array[8] <= data_in[8*8 +: 8];
            array[9] <= data_in[9*8 +: 8];
            array[10] <= data_in[10*8 +: 8];
            array[11] <= data_in[11*8 +: 8];
            array[12] <= data_in[12*8 +: 8];
            array[13] <= data_in[13*8 +: 8];
            array[14] <= data_in[14*8 +: 8];
            array[15] <= data_in[15*8 +: 8];
            array[16] <= data_in[16*8 +: 8];
            array[17] <= data_in[17*8 +: 8];
            array[18] <= data_in[18*8 +: 8];
            array[19] <= data_in[19*8 +: 8];
            array[20] <= data_in[20*8 +: 8];
            array[21] <= data_in[21*8 +: 8];
            array[22] <= data_in[22*8 +: 8];
            array[23] <= data_in[23*8 +: 8];
            array[24] <= data_in[24*8 +: 8];
            array[25] <= data_in[25*8 +: 8];
            array[26] <= data_in[26*8 +: 8];
            array[27] <= data_in[27*8 +: 8];
            array[28] <= data_in[28*8 +: 8];
            array[29] <= data_in[29*8 +: 8];
            array[30] <= data_in[30*8 +: 8];
            array[31] <= data_in[31*8 +: 8];            
        end
        else if (state_c == STAGEA && i == 0) begin
            if (array[0] > array[1]) begin array[0] <= array[1]; array[1] <= array[0]; end
            else begin array[0] <= array[0]; array[1] <= array[1]; end
            if (array[2] < array[3]) begin array[2] <= array[3]; array[3] <= array[2]; end
            else begin array[2] <= array[2]; array[3] <= array[3]; end
            if (array[4] > array[5]) begin array[4] <= array[5]; array[5] <= array[4]; end
            else begin array[4] <= array[4]; array[5] <= array[5]; end
            if (array[6] < array[7]) begin array[6] <= array[7]; array[7] <= array[6]; end
            else begin array[6] <= array[6]; array[7] <= array[7]; end
            if (array[8] > array[9]) begin array[8] <= array[9]; array[9] <= array[8]; end
            else begin array[8] <= array[8]; array[9] <= array[9]; end
            if (array[10] < array[11]) begin array[10] <= array[11]; array[11] <= array[10]; end
            else begin array[10] <= array[10]; array[11] <= array[11]; end
            if (array[12] > array[13]) begin array[12] <= array[13]; array[13] <= array[12]; end
            else begin array[12] <= array[12]; array[13] <= array[13]; end
            if (array[14] < array[15]) begin array[14] <= array[15]; array[15] <= array[14]; end
            else begin array[14] <= array[14]; array[15] <= array[15]; end
            if (array[16] > array[17]) begin array[16] <= array[17]; array[17] <= array[16]; end
            else begin array[16] <= array[16]; array[17] <= array[17]; end
            if (array[18] < array[19]) begin array[18] <= array[19]; array[19] <= array[18]; end
            else begin array[18] <= array[18]; array[19] <= array[19]; end
            if (array[20] > array[21]) begin array[20] <= array[21]; array[21] <= array[20]; end
            else begin array[20] <= array[20]; array[21] <= array[21]; end
            if (array[22] < array[23]) begin array[22] <= array[23]; array[23] <= array[22]; end
            else begin array[22] <= array[22]; array[23] <= array[23]; end
            if (array[24] > array[25]) begin array[24] <= array[25]; array[25] <= array[24]; end
            else begin array[24] <= array[24]; array[25] <= array[25]; end
            if (array[26] < array[27]) begin array[26] <= array[27]; array[27] <= array[26]; end
            else begin array[26] <= array[26]; array[27] <= array[27]; end
            if (array[28] > array[29]) begin array[28] <= array[29]; array[29] <= array[28]; end
            else begin array[28] <= array[28]; array[29] <= array[29]; end
            if (array[30] < array[31]) begin array[30] <= array[31]; array[31] <= array[30]; end
            else begin array[30] <= array[30]; array[31] <= array[31]; end           
        end
        else if (state_c == STAGEB && i == 0) begin
            if (array[0] > array[2]) begin array[0] <= array[2]; array[2] <= array[0]; end
            else begin array[0] <= array[0]; array[2] <= array[2]; end
            if (array[1] > array[3]) begin array[1] <= array[3]; array[3] <= array[1]; end
            else begin array[1] <= array[1]; array[3] <= array[3]; end
            if (array[4] < array[6]) begin array[4] <= array[6]; array[6] <= array[4]; end
            else begin array[4] <= array[4]; array[6] <= array[6]; end
            if (array[5] < array[7]) begin array[5] <= array[7]; array[7] <= array[5]; end
            else begin array[5] <= array[5]; array[7] <= array[7]; end
            
            if (array[8] > array[10]) begin array[8] <= array[10]; array[10] <= array[8]; end
            else begin array[8] <= array[8]; array[10] <= array[10]; end
            if (array[9] > array[11]) begin array[9] <= array[11]; array[11] <= array[9]; end
            else begin array[9] <= array[9]; array[11] <= array[11]; end
            if (array[12] < array[14]) begin array[12] <= array[14]; array[14] <= array[12]; end
            else begin array[12] <= array[12]; array[14] <= array[14]; end
            if (array[13] < array[15]) begin array[13] <= array[15]; array[15] <= array[13]; end
            else begin array[13] <= array[13]; array[15] <= array[15]; end
            
            if (array[16] > array[18]) begin array[16] <= array[18]; array[18] <= array[16]; end
            else begin array[16] <= array[16]; array[18] <= array[18]; end
            if (array[17] > array[19]) begin array[17] <= array[19]; array[19] <= array[17]; end
            else begin array[17] <= array[17]; array[19] <= array[19]; end
            if (array[20] < array[22]) begin array[20] <= array[22]; array[22] <= array[20]; end
            else begin array[20] <= array[20]; array[22] <= array[22]; end
            if (array[21] < array[23]) begin array[21] <= array[23]; array[23] <= array[21]; end
            else begin array[21] <= array[21]; array[23] <= array[23]; end
            
            if (array[24] > array[26]) begin array[24] <= array[26]; array[26] <= array[24]; end
            else begin array[24] <= array[24]; array[26] <= array[26]; end
            if (array[25] > array[27]) begin array[25] <= array[27]; array[27] <= array[25]; end
            else begin array[25] <= array[25]; array[27] <= array[27]; end
            if (array[28] < array[30]) begin array[28] <= array[30]; array[30] <= array[28]; end
            else begin array[28] <= array[28]; array[30] <= array[30]; end
            if (array[29] < array[31]) begin array[29] <= array[31]; array[31] <= array[29]; end
            else begin array[29] <= array[29]; array[31] <= array[31]; end
        end
        else if (state_c == STAGEB && i == 1) begin
            if (array[0] > array[1]) begin array[0] <= array[1]; array[1] <= array[0]; end
            else begin array[0] <= array[0]; array[1] <= array[1]; end
            if (array[2] > array[3]) begin array[2] <= array[3]; array[3] <= array[2]; end
            else begin array[2] <= array[2]; array[3] <= array[3]; end
            if (array[4] < array[5]) begin array[4] <= array[5]; array[5] <= array[4]; end
            else begin array[4] <= array[4]; array[5] <= array[5]; end
            if (array[6] < array[7]) begin array[6] <= array[7]; array[7] <= array[6]; end
            else begin array[6] <= array[6]; array[7] <= array[7]; end
            
            if (array[8] > array[9]) begin array[8] <= array[9]; array[9] <= array[8]; end
            else begin array[8] <= array[8]; array[9] <= array[9]; end
            if (array[10] > array[11]) begin array[10] <= array[11]; array[11] <= array[10]; end
            else begin array[10] <= array[10]; array[11] <= array[11]; end
            if (array[12] < array[13]) begin array[12] <= array[13]; array[13] <= array[12]; end
            else begin array[12] <= array[12]; array[13] <= array[13]; end
            if (array[14] < array[15]) begin array[14] <= array[15]; array[15] <= array[14]; end
            else begin array[14] <= array[14]; array[15] <= array[15]; end
            
            if (array[16] > array[17]) begin array[16] <= array[17]; array[17] <= array[16]; end
            else begin array[16] <= array[16]; array[17] <= array[17]; end
            if (array[18] > array[19]) begin array[18] <= array[19]; array[19] <= array[18]; end
            else begin array[18] <= array[18]; array[19] <= array[19]; end
            if (array[20] < array[21]) begin array[20] <= array[21]; array[21] <= array[20]; end
            else begin array[20] <= array[20]; array[21] <= array[21]; end
            if (array[22] < array[23]) begin array[22] <= array[23]; array[23] <= array[22]; end
            else begin array[22] <= array[22]; array[23] <= array[23]; end
            
            if (array[24] > array[25]) begin array[24] <= array[25]; array[25] <= array[24]; end
            else begin array[24] <= array[24]; array[25] <= array[25]; end
            if (array[26] > array[27]) begin array[26] <= array[27]; array[27] <= array[26]; end
            else begin array[26] <= array[26]; array[27] <= array[27]; end
            if (array[28] < array[29]) begin array[28] <= array[29]; array[29] <= array[28]; end
            else begin array[28] <= array[28]; array[29] <= array[29]; end
            if (array[30] < array[31]) begin array[30] <= array[31]; array[31] <= array[30]; end
            else begin array[30] <= array[30]; array[31] <= array[31]; end
        end
        else if (state_c == STAGEC && i == 0) begin
            if (array[0] > array[4]) begin array[0] <= array[4]; array[4] <= array[0]; end
            else begin array[0] <= array[0]; array[4] <= array[4]; end
            if (array[1] > array[5]) begin array[1] <= array[5]; array[5] <= array[1]; end
            else begin array[1] <= array[1]; array[5] <= array[5]; end
            if (array[2] > array[6]) begin array[2] <= array[6]; array[6] <= array[2]; end
            else begin array[2] <= array[2]; array[6] <= array[6]; end
            if (array[3] > array[7]) begin array[3] <= array[7]; array[7] <= array[3]; end
            else begin array[3] <= array[3]; array[7] <= array[7]; end
            if (array[8] < array[12]) begin array[8] <= array[12]; array[12] <= array[8]; end
            else begin array[8] <= array[8]; array[12] <= array[12]; end
            if (array[9] < array[13]) begin array[9] <= array[13]; array[13] <= array[9]; end
            else begin array[9] <= array[9]; array[13] <= array[13]; end
            if (array[10] < array[14]) begin array[10] <= array[14]; array[14] <= array[10]; end
            else begin array[10] <= array[10]; array[14] <= array[14]; end
            if (array[11] < array[15]) begin array[11] <= array[15]; array[15] <= array[11]; end
            else begin array[11] <= array[11]; array[15] <= array[15]; end
            if (array[16] > array[20]) begin array[16] <= array[20]; array[20] <= array[16]; end
            else begin array[16] <= array[16]; array[20] <= array[20]; end
            if (array[17] > array[21]) begin array[17] <= array[21]; array[21] <= array[17]; end
            else begin array[17] <= array[17]; array[21] <= array[21]; end
            if (array[18] > array[22]) begin array[18] <= array[22]; array[22] <= array[18]; end
            else begin array[18] <= array[18]; array[22] <= array[22]; end
            if (array[19] > array[23]) begin array[19] <= array[23]; array[23] <= array[19]; end
            else begin array[19] <= array[19]; array[23] <= array[23]; end
            if (array[24] < array[28]) begin array[24] <= array[28]; array[28] <= array[24]; end
            else begin array[24] <= array[24]; array[28] <= array[28]; end
            if (array[25] < array[29]) begin array[25] <= array[29]; array[29] <= array[25]; end
            else begin array[25] <= array[25]; array[29] <= array[29]; end
            if (array[26] < array[30]) begin array[26] <= array[30]; array[30] <= array[26]; end
            else begin array[26] <= array[26]; array[30] <= array[30]; end
            if (array[27] < array[31]) begin array[27] <= array[31]; array[31] <= array[27]; end
            else begin array[27] <= array[27]; array[31] <= array[31]; end            
        end
        else if (state_c == STAGEC && i == 1) begin
            if (array[0] > array[2]) begin array[0] <= array[2]; array[2] <= array[0]; end
            else begin array[0] <= array[0]; array[2] <= array[2]; end
            if (array[1] > array[3]) begin array[1] <= array[3]; array[3] <= array[1]; end
            else begin array[1] <= array[1]; array[3] <= array[3]; end
            if (array[4] > array[6]) begin array[4] <= array[6]; array[6] <= array[4]; end
            else begin array[4] <= array[4]; array[6] <= array[6]; end
            if (array[5] > array[7]) begin array[5] <= array[7]; array[7] <= array[5]; end
            else begin array[5] <= array[5]; array[7] <= array[7]; end
            if (array[8] < array[10]) begin array[8] <= array[10]; array[10] <= array[8]; end
            else begin array[8] <= array[8]; array[10] <= array[10]; end
            if (array[9] < array[11]) begin array[9] <= array[11]; array[11] <= array[9]; end
            else begin array[9] <= array[9]; array[11] <= array[11]; end
            if (array[12] < array[14]) begin array[12] <= array[14]; array[14] <= array[12]; end
            else begin array[12] <= array[12]; array[14] <= array[14]; end
            if (array[13] < array[15]) begin array[13] <= array[15]; array[15] <= array[13]; end
            else begin array[13] <= array[13]; array[15] <= array[15]; end 
            if (array[16] > array[18]) begin array[16] <= array[18]; array[18] <= array[16]; end
            else begin array[16] <= array[16]; array[18] <= array[18]; end
            if (array[17] > array[19]) begin array[17] <= array[19]; array[19] <= array[17]; end
            else begin array[17] <= array[17]; array[19] <= array[19]; end
            if (array[20] > array[22]) begin array[20] <= array[22]; array[22] <= array[20]; end
            else begin array[20] <= array[20]; array[22] <= array[22]; end
            if (array[21] > array[23]) begin array[21] <= array[23]; array[23] <= array[21]; end
            else begin array[21] <= array[21]; array[23] <= array[23]; end
            if (array[24] < array[26]) begin array[24] <= array[26]; array[26] <= array[24]; end
            else begin array[24] <= array[24]; array[26] <= array[26]; end
            if (array[25] < array[27]) begin array[25] <= array[27]; array[27] <= array[25]; end
            else begin array[25] <= array[25]; array[27] <= array[27]; end
            if (array[28] < array[30]) begin array[28] <= array[30]; array[30] <= array[28]; end
            else begin array[28] <= array[28]; array[30] <= array[30]; end
            if (array[29] < array[31]) begin array[29] <= array[31]; array[31] <= array[29]; end
            else begin array[29] <= array[29]; array[31] <= array[31]; end           
        end
        else if (state_c == STAGEC && i == 2) begin
            if (array[0] > array[1]) begin array[0] <= array[1]; array[1] <= array[0]; end
            else begin array[0] <= array[0]; array[1] <= array[1]; end
            if (array[2] > array[3]) begin array[2] <= array[3]; array[3] <= array[2]; end
            else begin array[2] <= array[2]; array[3] <= array[3]; end
            if (array[4] > array[5]) begin array[4] <= array[5]; array[5] <= array[4]; end
            else begin array[4] <= array[4]; array[5] <= array[5]; end
            if (array[6] > array[7]) begin array[6] <= array[7]; array[7] <= array[6]; end
            else begin array[6] <= array[6]; array[7] <= array[7]; end
            if (array[8] < array[9]) begin array[8] <= array[9]; array[9] <= array[8]; end
            else begin array[8] <= array[8]; array[9] <= array[9]; end
            if (array[10] < array[11]) begin array[10] <= array[11]; array[11] <= array[10]; end
            else begin array[10] <= array[10]; array[11] <= array[11]; end
            if (array[12] < array[13]) begin array[12] <= array[13]; array[13] <= array[12]; end
            else begin array[12] <= array[12]; array[13] <= array[13]; end
            if (array[14] < array[15]) begin array[14] <= array[15]; array[15] <= array[14]; end
            else begin array[14] <= array[14]; array[15] <= array[15]; end 
            if (array[16] > array[17]) begin array[16] <= array[17]; array[17] <= array[16]; end
            else begin array[16] <= array[16]; array[17] <= array[17]; end
            if (array[18] > array[19]) begin array[18] <= array[19]; array[19] <= array[18]; end
            else begin array[18] <= array[18]; array[19] <= array[19]; end
            if (array[20] > array[21]) begin array[20] <= array[21]; array[21] <= array[20]; end
            else begin array[20] <= array[20]; array[21] <= array[21]; end
            if (array[22] > array[23]) begin array[22] <= array[23]; array[23] <= array[22]; end
            else begin array[22] <= array[22]; array[23] <= array[23]; end
            if (array[24] < array[25]) begin array[24] <= array[25]; array[25] <= array[24]; end
            else begin array[24] <= array[24]; array[25] <= array[25]; end
            if (array[26] < array[27]) begin array[26] <= array[27]; array[27] <= array[26]; end
            else begin array[26] <= array[26]; array[27] <= array[27]; end
            if (array[28] < array[29]) begin array[28] <= array[29]; array[29] <= array[28]; end
            else begin array[28] <= array[28]; array[29] <= array[29]; end
            if (array[30] < array[31]) begin array[30] <= array[31]; array[31] <= array[30]; end
            else begin array[30] <= array[30]; array[31] <= array[31]; end           
        end
        else if (state_c == STAGED && i == 0) begin
            if (array[0] > array[8]) begin array[0] <= array[8]; array[8] <= array[0]; end
            else begin array[0] <= array[0]; array[8] <= array[8]; end
            if (array[1] > array[9]) begin array[1] <= array[9]; array[9] <= array[1]; end
            else begin array[1] <= array[1]; array[9] <= array[9]; end
            if (array[2] > array[10]) begin array[2] <= array[10]; array[10] <= array[2]; end
            else begin array[2] <= array[2]; array[10] <= array[10]; end
            if (array[3] > array[11]) begin array[3] <= array[11]; array[11] <= array[3]; end
            else begin array[3] <= array[3]; array[11] <= array[11]; end
            if (array[4] > array[12]) begin array[4] <= array[12]; array[12] <= array[4]; end
            else begin array[4] <= array[4]; array[12] <= array[12]; end
            if (array[5] > array[13]) begin array[5] <= array[13]; array[13] <= array[5]; end
            else begin array[5] <= array[5]; array[13] <= array[13]; end
            if (array[6] > array[14]) begin array[6] <= array[14]; array[14] <= array[6]; end
            else begin array[6] <= array[6]; array[14] <= array[14]; end
            if (array[7] > array[15]) begin array[7] <= array[15]; array[15] <= array[7]; end
            else begin array[7] <= array[7]; array[15] <= array[15]; end 
            if (array[16] < array[24]) begin array[16] <= array[24]; array[24] <= array[16]; end
            else begin array[16] <= array[16]; array[24] <= array[24]; end
            if (array[17] < array[25]) begin array[17] <= array[25]; array[25] <= array[17]; end
            else begin array[17] <= array[17]; array[25] <= array[25]; end
            if (array[18] < array[26]) begin array[18] <= array[26]; array[26] <= array[18]; end
            else begin array[18] <= array[18]; array[26] <= array[26]; end
            if (array[19] < array[27]) begin array[19] <= array[27]; array[27] <= array[19]; end
            else begin array[19] <= array[19]; array[27] <= array[27]; end
            if (array[20] < array[28]) begin array[20] <= array[28]; array[28] <= array[20]; end
            else begin array[20] <= array[20]; array[28] <= array[28]; end
            if (array[21] < array[29]) begin array[21] <= array[29]; array[29] <= array[21]; end
            else begin array[21] <= array[21]; array[29] <= array[29]; end
            if (array[22] < array[30]) begin array[22] <= array[30]; array[30] <= array[22]; end
            else begin array[22] <= array[22]; array[30] <= array[30]; end
            if (array[23] < array[31]) begin array[23] <= array[31]; array[31] <= array[23]; end
            else begin array[23] <= array[23]; array[31] <= array[31]; end
        end
        else if (state_c == STAGED && i == 1) begin
            if (array[0] > array[4]) begin array[0] <= array[4]; array[4] <= array[0]; end
            else begin array[0] <= array[0]; array[4] <= array[4]; end
            if (array[1] > array[5]) begin array[1] <= array[5]; array[5] <= array[1]; end
            else begin array[1] <= array[1]; array[5] <= array[5]; end
            if (array[2] > array[6]) begin array[2] <= array[6]; array[6] <= array[2]; end
            else begin array[2] <= array[2]; array[6] <= array[6]; end
            if (array[3] > array[7]) begin array[3] <= array[7]; array[7] <= array[3]; end
            else begin array[3] <= array[3]; array[7] <= array[7]; end
            if (array[8] > array[12]) begin array[8] <= array[12]; array[12] <= array[8]; end
            else begin array[8] <= array[8]; array[12] <= array[12]; end
            if (array[9] > array[13]) begin array[9] <= array[13]; array[13] <= array[9]; end
            else begin array[9] <= array[9]; array[13] <= array[13]; end
            if (array[10] > array[14]) begin array[10] <= array[14]; array[14] <= array[10]; end
            else begin array[10] <= array[10]; array[14] <= array[14]; end
            if (array[11] > array[15]) begin array[11] <= array[15]; array[15] <= array[11]; end
            else begin array[11] <= array[11]; array[15] <= array[15]; end
            if (array[16] < array[20]) begin array[16] <= array[20]; array[20] <= array[16]; end
            else begin array[16] <= array[16]; array[20] <= array[20]; end
            if (array[17] < array[21]) begin array[17] <= array[21]; array[21] <= array[17]; end
            else begin array[17] <= array[17]; array[21] <= array[21]; end
            if (array[18] < array[22]) begin array[18] <= array[22]; array[22] <= array[18]; end
            else begin array[18] <= array[18]; array[22] <= array[22]; end
            if (array[19] < array[23]) begin array[19] <= array[23]; array[23] <= array[19]; end
            else begin array[19] <= array[19]; array[23] <= array[23]; end
            if (array[24] < array[28]) begin array[24] <= array[28]; array[28] <= array[24]; end
            else begin array[24] <= array[24]; array[28] <= array[28]; end
            if (array[25] < array[29]) begin array[25] <= array[29]; array[29] <= array[25]; end
            else begin array[25] <= array[25]; array[29] <= array[29]; end
            if (array[26] < array[30]) begin array[26] <= array[30]; array[30] <= array[26]; end
            else begin array[26] <= array[26]; array[30] <= array[30]; end
            if (array[27] < array[31]) begin array[27] <= array[31]; array[31] <= array[27]; end
            else begin array[27] <= array[27]; array[31] <= array[31]; end
        end
        else if (state_c == STAGED && i == 2) begin
            if (array[0] > array[2]) begin array[0] <= array[2]; array[2] <= array[0]; end
            else begin array[0] <= array[0]; array[2] <= array[2]; end
            if (array[1] > array[3]) begin array[1] <= array[3]; array[3] <= array[1]; end
            else begin array[1] <= array[1]; array[3] <= array[3]; end
            if (array[4] > array[6]) begin array[4] <= array[6]; array[6] <= array[4]; end
            else begin array[4] <= array[4]; array[6] <= array[6]; end
            if (array[5] > array[7]) begin array[5] <= array[7]; array[7] <= array[5]; end
            else begin array[5] <= array[5]; array[7] <= array[7]; end
            if (array[8] > array[10]) begin array[8] <= array[10]; array[10] <= array[8]; end
            else begin array[8] <= array[8]; array[10] <= array[10]; end
            if (array[9] > array[11]) begin array[9] <= array[11]; array[11] <= array[9]; end
            else begin array[9] <= array[9]; array[11] <= array[11]; end
            if (array[12] > array[14]) begin array[12] <= array[14]; array[14] <= array[12]; end
            else begin array[12] <= array[12]; array[14] <= array[14]; end
            if (array[13] > array[15]) begin array[13] <= array[15]; array[15] <= array[13]; end
            else begin array[13] <= array[13]; array[15] <= array[15]; end
            if (array[16] < array[18]) begin array[16] <= array[18]; array[18] <= array[16]; end
            else begin array[16] <= array[16]; array[18] <= array[18]; end
            if (array[17] < array[19]) begin array[17] <= array[19]; array[19] <= array[17]; end
            else begin array[17] <= array[17]; array[19] <= array[19]; end
            if (array[20] < array[22]) begin array[20] <= array[22]; array[22] <= array[20]; end
            else begin array[20] <= array[20]; array[22] <= array[22]; end
            if (array[21] < array[23]) begin array[21] <= array[23]; array[23] <= array[21]; end
            else begin array[21] <= array[21]; array[23] <= array[23]; end
            if (array[24] < array[26]) begin array[24] <= array[26]; array[26] <= array[24]; end
            else begin array[24] <= array[24]; array[26] <= array[26]; end
            if (array[25] < array[27]) begin array[25] <= array[27]; array[27] <= array[25]; end
            else begin array[25] <= array[25]; array[27] <= array[27]; end
            if (array[28] < array[30]) begin array[28] <= array[30]; array[30] <= array[28]; end
            else begin array[28] <= array[28]; array[30] <= array[30]; end
            if (array[29] < array[31]) begin array[29] <= array[31]; array[31] <= array[29]; end
            else begin array[29] <= array[29]; array[31] <= array[31]; end
        end
        else if (state_c == STAGED && i == 3) begin
            if (array[0] > array[1]) begin array[0] <= array[1]; array[1] <= array[0]; end
            else begin array[0] <= array[0]; array[1] <= array[1]; end
            if (array[2] > array[3]) begin array[2] <= array[3]; array[3] <= array[2]; end
            else begin array[2] <= array[2]; array[3] <= array[3]; end
            if (array[4] > array[5]) begin array[4] <= array[5]; array[5] <= array[4]; end
            else begin array[4] <= array[4]; array[5] <= array[5]; end
            if (array[6] > array[7]) begin array[6] <= array[7]; array[7] <= array[6]; end
            else begin array[6] <= array[6]; array[7] <= array[7]; end
            if (array[8] > array[9]) begin array[8] <= array[9]; array[9] <= array[8]; end
            else begin array[8] <= array[8]; array[9] <= array[9]; end
            if (array[10] > array[11]) begin array[10] <= array[11]; array[11] <= array[10]; end
            else begin array[10] <= array[10]; array[11] <= array[11]; end
            if (array[12] > array[13]) begin array[12] <= array[13]; array[13] <= array[12]; end
            else begin array[12] <= array[12]; array[13] <= array[13]; end
            if (array[14] > array[15]) begin array[14] <= array[15]; array[15] <= array[14]; end
            else begin array[14] <= array[14]; array[15] <= array[15]; end
            if (array[16] < array[17]) begin array[16] <= array[17]; array[17] <= array[16]; end
            else begin array[16] <= array[16]; array[17] <= array[17]; end
            if (array[18] < array[19]) begin array[18] <= array[19]; array[19] <= array[18]; end
            else begin array[18] <= array[18]; array[19] <= array[19]; end
            if (array[20] < array[21]) begin array[20] <= array[21]; array[21] <= array[20]; end
            else begin array[20] <= array[20]; array[21] <= array[21]; end
            if (array[22] < array[23]) begin array[22] <= array[23]; array[23] <= array[22]; end
            else begin array[22] <= array[22]; array[23] <= array[23]; end
            if (array[24] < array[25]) begin array[24] <= array[25]; array[25] <= array[24]; end
            else begin array[24] <= array[24]; array[25] <= array[25]; end
            if (array[26] < array[27]) begin array[26] <= array[27]; array[27] <= array[26]; end
            else begin array[26] <= array[26]; array[27] <= array[27]; end
            if (array[28] < array[29]) begin array[28] <= array[29]; array[29] <= array[28]; end
            else begin array[28] <= array[28]; array[29] <= array[29]; end
            if (array[30] < array[31]) begin array[30] <= array[31]; array[31] <= array[30]; end
            else begin array[30] <= array[30]; array[31] <= array[31]; end
        end
        else begin
            array[0] <= array[0];
            array[1] <= array[1];
            array[2] <= array[2];
            array[3] <= array[3];
            array[4] <= array[4];
            array[5] <= array[5];
            array[6] <= array[6];
            array[7] <= array[7];
            array[8] <= array[8];
            array[9] <= array[9];
            array[10] <= array[10];
            array[11] <= array[11];
            array[12] <= array[12];
            array[13] <= array[13];
            array[14] <= array[14];
            array[15] <= array[15];
            array[16] <= array[16];
            array[17] <= array[17];
            array[18] <= array[18];
            array[19] <= array[19];
            array[20] <= array[20];
            array[21] <= array[21];
            array[22] <= array[22];
            array[23] <= array[23];
            array[24] <= array[24];
            array[25] <= array[25];
            array[26] <= array[26];
            array[27] <= array[27];
            array[28] <= array[28];
            array[29] <= array[29];
            array[30] <= array[30];
            array[31] <= array[31];
        end
    end
    end

    // 4 - The change of insert_array
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            insert_array[0] <= 0;
            insert_array[1] <= 0;
            insert_array[2] <= 0;
            insert_array[3] <= 0;
            insert_array[4] <= 0;
            insert_array[5] <= 0;
            insert_array[6] <= 0;
            insert_array[7] <= 0;
            insert_array[8] <= 0;
            insert_array[9] <= 0;
            insert_array[10] <= 0;
            insert_array[11] <= 0;
            insert_array[12] <= 0;
            insert_array[13] <= 0;
            insert_array[14] <= 0;
            insert_array[15] <= 0;
            insert_array[16] <= 0;
            insert_array[17] <= 0;
            insert_array[18] <= 0;
            insert_array[19] <= 0;
            insert_array[20] <= 0;
            insert_array[21] <= 0;
            insert_array[22] <= 0;
            insert_array[23] <= 0;
            insert_array[24] <= 0;
            insert_array[25] <= 0;
            insert_array[26] <= 0;
            insert_array[27] <= 0;
            insert_array[28] <= 0;
            insert_array[29] <= 0;
            insert_array[30] <= 0;
            insert_array[31] <= 0;
            insert_array[32] <= 0;
            insert_array[33] <= 0;
            insert_array[34] <= 0;
            insert_array[35] <= 0;
            insert_array[36] <= 0;
            insert_array[37] <= 0;
            insert_array[38] <= 0;
            insert_array[39] <= 0;
            insert_array[40] <= 0;
            insert_array[41] <= 0;
            insert_array[42] <= 0;
            insert_array[43] <= 0;
            insert_array[44] <= 0;
            insert_array[45] <= 0;
            insert_array[46] <= 0;
            insert_array[47] <= 0;
        end
        else begin
            if (state_c == PREPARE) begin
                insert_array[0]  <= insert_array[0];
                insert_array[1]  <= insert_array[1];
                insert_array[2]  <= insert_array[2];
                insert_array[3]  <= insert_array[3];
                insert_array[4]  <= insert_array[4];
                insert_array[5]  <= insert_array[5];
                insert_array[6]  <= insert_array[6];
                insert_array[7]  <= insert_array[7];
                insert_array[8]  <= insert_array[8];
                insert_array[9]  <= insert_array[9];
                insert_array[10] <= insert_array[10];
                insert_array[11] <= insert_array[11];
                insert_array[12] <= insert_array[12];
                insert_array[13] <= insert_array[13];
                insert_array[14] <= insert_array[14];
                insert_array[15] <= insert_array[15];
                insert_array[16] <= array[0];   // min
                insert_array[17] <= array[1];
                insert_array[18] <= array[2];
                insert_array[19] <= array[3];
                insert_array[20] <= array[4];
                insert_array[21] <= array[5];
                insert_array[22] <= array[6];
                insert_array[23] <= array[7];
                insert_array[24] <= array[8];
                insert_array[25] <= array[9];
                insert_array[26] <= array[10];
                insert_array[27] <= array[11];
                insert_array[28] <= array[12];
                insert_array[29] <= array[13];
                insert_array[30] <= array[14];
                insert_array[31] <= array[15];   // max
                insert_array[32] <= insert_array[32];
                insert_array[33] <= insert_array[33];
                insert_array[34] <= insert_array[34];
                insert_array[35] <= insert_array[35];
                insert_array[36] <= insert_array[36];
                insert_array[37] <= insert_array[37];
                insert_array[38] <= insert_array[38];
                insert_array[39] <= insert_array[39];
                insert_array[40] <= insert_array[40];
                insert_array[41] <= insert_array[41];
                insert_array[42] <= insert_array[42];
                insert_array[43] <= insert_array[43];
                insert_array[44] <= insert_array[44];
                insert_array[45] <= insert_array[45];
                insert_array[46] <= insert_array[46];
                insert_array[47] <= insert_array[47];
            end
            else if (state_c == BREAK) begin
                insert_array[0] <= insert_array[0];
                insert_array[1] <= insert_array[1];
                insert_array[2] <= insert_array[2];
                insert_array[3] <= insert_array[3];
                insert_array[4] <= insert_array[4];
                insert_array[5] <= insert_array[5];
                insert_array[6] <= insert_array[6];
                insert_array[7] <= insert_array[7];
                insert_array[8] <= insert_array[8];
                insert_array[9] <= insert_array[9];
                insert_array[10] <= insert_array[10];
                insert_array[11] <= insert_array[11];
                insert_array[12] <= insert_array[12];
                insert_array[13] <= insert_array[13];
                insert_array[14] <= insert_array[14];
                insert_array[15] <= insert_array[15];
                insert_array[16] <= insert_array[16];
                insert_array[17] <= insert_array[17];
                insert_array[18] <= insert_array[18];
                insert_array[19] <= insert_array[19];
                insert_array[20] <= insert_array[20];
                insert_array[21] <= insert_array[21];
                insert_array[22] <= insert_array[22];
                insert_array[23] <= insert_array[23];
                insert_array[24] <= insert_array[24];
                insert_array[25] <= insert_array[25];
                insert_array[26] <= insert_array[26];
                insert_array[27] <= insert_array[27];
                insert_array[28] <= insert_array[28];
                insert_array[29] <= insert_array[29];
                insert_array[30] <= insert_array[30];
                insert_array[31] <= insert_array[31];
                insert_array[32] <= insert_array[32];
                insert_array[33] <= insert_array[33];
                insert_array[34] <= insert_array[34];
                insert_array[35] <= insert_array[35];
                insert_array[36] <= insert_array[36];
                insert_array[37] <= insert_array[37];
                insert_array[38] <= insert_array[38];
                insert_array[39] <= insert_array[39];
                insert_array[40] <= insert_array[40];
                insert_array[41] <= insert_array[41];
                insert_array[42] <= insert_array[42];
                insert_array[43] <= insert_array[43];
                insert_array[44] <= insert_array[44];
                insert_array[45] <= insert_array[45];
                insert_array[46] <= insert_array[46];
                insert_array[47] <= insert_array[47];
            end
            else if (state_c == SORT) begin
                if (insert_array[jmax] >= pending_array[imax]) begin : COMPARE_OF_MAX_Condition_1
                    insert_array[jmax + 1] <= insert_array[jmax]; // 新插入max小于固定max
                    insert_array[jmax]     <= pending_array[imax];
                end
                else if (insert_array[jmax] < pending_array[imax]) begin: COMPARE_OF_MAX_Condition_2
                    insert_array[jmax + 1] <= pending_array[imax]; // 新插入max大于固定max
                    insert_array[jmax]     <= insert_array[jmax];
                end

                if (insert_array[jmin] >= pending_array[imin]) begin: COMPARE_OF_MIN_Condtion_1
                    insert_array[jmin - 1] <= pending_array[imin]; // 新插入min小于固定min
                    insert_array[jmin]     <= insert_array[jmin];
                end
                else if (insert_array[jmin] <  pending_array[imin]) begin: COMPARE_OF_MIN_Condition_2
                    insert_array[jmin - 1] <= insert_array[jmin];  // 新插入min大于固定min
                    insert_array[jmin]     <= pending_array[imin];
                end
            end
        end
    end
    
    // 6 - The change of pending_array
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            pending_array[0] <= 0;
            pending_array[0] <= 0;
            pending_array[1] <= 0;
            pending_array[2] <= 0;
            pending_array[3] <= 0;
            pending_array[4] <= 0;
            pending_array[5] <= 0;
            pending_array[6] <= 0;
            pending_array[7] <= 0;
            pending_array[8] <= 0;
            pending_array[9] <= 0;
            pending_array[10] <= 0;
            pending_array[11] <= 0;
            pending_array[12] <= 0;
            pending_array[13] <= 0;
            pending_array[14] <= 0;
            pending_array[15] <= 0;
        end
        else begin
            if (state_c == PREPARE) begin
                pending_array[0] <= array[16]; // max
                pending_array[1] <= array[17];
                pending_array[2] <= array[18];
                pending_array[3] <= array[19];
                pending_array[4] <= array[20];
                pending_array[5] <= array[21];
                pending_array[6] <= array[22];
                pending_array[7] <= array[23];
                pending_array[8] <= array[24];
                pending_array[9] <= array[25];
                pending_array[10] <= array[26];
                pending_array[11] <= array[27];
                pending_array[12] <= array[28];
                pending_array[13] <= array[29];
                pending_array[14] <= array[30];
                pending_array[15] <= array[31]; // min
            end
            else begin
                pending_array[0] <= pending_array[0];
                pending_array[1] <= pending_array[1];
                pending_array[2] <= pending_array[2];
                pending_array[3] <= pending_array[3];
                pending_array[4] <= pending_array[4];
                pending_array[5] <= pending_array[5];
                pending_array[6] <= pending_array[6];
                pending_array[7] <= pending_array[7];
                pending_array[8] <= pending_array[8];
                pending_array[9] <= pending_array[9];
                pending_array[10] <= pending_array[10];
                pending_array[11] <= pending_array[11];
                pending_array[12] <= pending_array[12];
                pending_array[13] <= pending_array[13];
                pending_array[14] <= pending_array[14];
                pending_array[15] <= pending_array[15];
            end 
        end
    end


endmodule

2. testbench

测试模块的代码如下:

module sort_bitonic_insertion_tb #(parameter BITWIDTH = 8, parameter ELEMENTS = 32)();
    reg clk;
    reg rst_n;
    reg [BITWIDTH*ELEMENTS-1:0] data_in;
    wire [BITWIDTH*ELEMENTS-1:0] data_out;

    sort_bitonic_insertion #(BITWIDTH, ELEMENTS) uut (
        .clk(clk),
        .rst_n(rst_n),
        .data_in(data_in),
        .data_out(data_out)
    );

    // Clock generation
    always #5 clk = ~clk;

    initial begin
        // Initialize inputs
        clk = 0;
        rst_n = 0;

        // Apply reset
        #10;
        rst_n = 1;

        // Load test data
        data_in[BITWIDTH*0 +: BITWIDTH]  = 8'd12;
        data_in[BITWIDTH*1 +: BITWIDTH]  = 8'd3;
        data_in[BITWIDTH*2 +: BITWIDTH]  = 8'd25;
        data_in[BITWIDTH*3 +: BITWIDTH]  = 8'd8;
        data_in[BITWIDTH*4 +: BITWIDTH]  = 8'd15;
        data_in[BITWIDTH*5 +: BITWIDTH]  = 8'd18;
        data_in[BITWIDTH*6 +: BITWIDTH]  = 8'd7;
        data_in[BITWIDTH*7 +: BITWIDTH]  = 8'd1;
        data_in[BITWIDTH*8 +: BITWIDTH]  = 8'd31;
        data_in[BITWIDTH*9 +: BITWIDTH]  = 8'd14;
        data_in[BITWIDTH*10 +: BITWIDTH] = 8'd6;
        data_in[BITWIDTH*11 +: BITWIDTH] = 8'd22;
        data_in[BITWIDTH*12 +: BITWIDTH] = 8'd27;
        data_in[BITWIDTH*13 +: BITWIDTH] = 8'd20;
        data_in[BITWIDTH*14 +: BITWIDTH] = 8'd5;
        data_in[BITWIDTH*15 +: BITWIDTH] = 8'd9;
        data_in[BITWIDTH*16 +: BITWIDTH] = 8'd4;
        data_in[BITWIDTH*17 +: BITWIDTH] = 8'd17;
        data_in[BITWIDTH*18 +: BITWIDTH] = 8'd2;
        data_in[BITWIDTH*19 +: BITWIDTH] = 8'd10;
        data_in[BITWIDTH*20 +: BITWIDTH] = 8'd11;
        data_in[BITWIDTH*21 +: BITWIDTH] = 8'd13;
        data_in[BITWIDTH*22 +: BITWIDTH] = 8'd24;
        data_in[BITWIDTH*23 +: BITWIDTH] = 8'd28;
        data_in[BITWIDTH*24 +: BITWIDTH] = 8'd19;
        data_in[BITWIDTH*25 +: BITWIDTH] = 8'd26;
        data_in[BITWIDTH*26 +: BITWIDTH] = 8'd23;
        data_in[BITWIDTH*27 +: BITWIDTH] = 8'd30;
        data_in[BITWIDTH*28 +: BITWIDTH] = 8'd29;
        data_in[BITWIDTH*29 +: BITWIDTH] = 8'd21;
        data_in[BITWIDTH*30 +: BITWIDTH] = 8'd16;
        data_in[BITWIDTH*31 +: BITWIDTH] = 8'd0;

        // Wait for the sorting to complete
        #3000;

        // Display sorted data
        $display("Sorted data:");
        $display("data_out[0] = %d", data_out[BITWIDTH*0 +: BITWIDTH]);
        $display("data_out[1] = %d", data_out[BITWIDTH*1 +: BITWIDTH]);
        $display("data_out[2] = %d", data_out[BITWIDTH*2 +: BITWIDTH]);
        $display("data_out[3] = %d", data_out[BITWIDTH*3 +: BITWIDTH]);
        $display("data_out[4] = %d", data_out[BITWIDTH*4 +: BITWIDTH]);
        $display("data_out[5] = %d", data_out[BITWIDTH*5 +: BITWIDTH]);
        $display("data_out[6] = %d", data_out[BITWIDTH*6 +: BITWIDTH]);
        $display("data_out[7] = %d", data_out[BITWIDTH*7 +: BITWIDTH]);
        $display("data_out[8] = %d", data_out[BITWIDTH*8 +: BITWIDTH]);
        $display("data_out[9] = %d", data_out[BITWIDTH*9 +: BITWIDTH]);
        $display("data_out[10] = %d", data_out[BITWIDTH*10 +: BITWIDTH]);
        $display("data_out[11] = %d", data_out[BITWIDTH*11 +: BITWIDTH]);
        $display("data_out[12] = %d", data_out[BITWIDTH*12 +: BITWIDTH]);
        $display("data_out[13] = %d", data_out[BITWIDTH*13 +: BITWIDTH]);
        $display("data_out[14] = %d", data_out[BITWIDTH*14 +: BITWIDTH]);
        $display("data_out[15] = %d", data_out[BITWIDTH*15 +: BITWIDTH]);
        $display("data_out[16] = %d", data_out[BITWIDTH*16 +: BITWIDTH]);
        $display("data_out[17] = %d", data_out[BITWIDTH*17 +: BITWIDTH]);
        $display("data_out[18] = %d", data_out[BITWIDTH*18 +: BITWIDTH]);
        $display("data_out[19] = %d", data_out[BITWIDTH*19 +: BITWIDTH]);
        $display("data_out[20] = %d", data_out[BITWIDTH*20 +: BITWIDTH]);
        $display("data_out[21] = %d", data_out[BITWIDTH*21 +: BITWIDTH]);
        $display("data_out[22] = %d", data_out[BITWIDTH*22 +: BITWIDTH]);
        $display("data_out[23] = %d", data_out[BITWIDTH*23 +: BITWIDTH]);
        $display("data_out[24] = %d", data_out[BITWIDTH*24 +: BITWIDTH]);
        $display("data_out[25] = %d", data_out[BITWIDTH*25 +: BITWIDTH]);
        $display("data_out[26] = %d", data_out[BITWIDTH*26 +: BITWIDTH]);
        $display("data_out[27] = %d", data_out[BITWIDTH*27 +: BITWIDTH]);
        $display("data_out[28] = %d", data_out[BITWIDTH*28 +: BITWIDTH]);
        $display("data_out[29] = %d", data_out[BITWIDTH*29 +: BITWIDTH]);
        $display("data_out[30] = %d", data_out[BITWIDTH*30 +: BITWIDTH]);
        $display("data_out[31] = %d", data_out[BITWIDTH*31 +: BITWIDTH]);

        $finish;
    end
endmodule

3. 波形结果

insert_array共48个8bit数据,前8个和后8个填充0,中间32个为排好顺序的数据结果。结果正常,说明代码实现既定功能。


总结

本文主要实现了一种混合排序,可以直接拿来用或者修改。coding不易,多多惠存!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DentionY

谢谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值