提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文算是排序器系列的第二篇,刚好碰到一篇有意思的论文,电路领域顶刊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不易,多多惠存!