1、给定8各并行输入,对并行输入的8个数据,进行排序,要求在单周期内完成。
题目给定了一个2输入的比较器,要求基于此二输入的比较器进行设计,此二输入比较器是以函数封装的,要求以最少的二输入比较器进行设计
function [DW*2-1:0] max_2;
input [DW-1:0] a;
input [DW-1:0] b;
begin
max_2 = (a>=b)? ({b[DW-1:0],a[DW-1:0]}):({a[DW-1:0],b[DW-1:0]});
end
endfunction
2、考试的时候没有时间思考了,考后复盘一下
其实整体思路就是对,输入的8各数据,进行分组
- 前四个为一组:in_0,in_1,in_2,in_3
利用二输入比较器,构建一个四输入比较器,对这组数据进行排序,将这四个数据的大小顺序排出来,这里描述为 A<B<C<D
- 后四个为一组:in_4,in_5,in_6,in_7
同理, E<F<G<H
- 得到这样的顺序后,再根据
D和H的大小,得出最大的,
A和E的大小,得到最小的
我画了个图:虚线框代表一个四输入比较器
3、代码设计
代码这里与图略有区别,后面的4个变量我直接用了个四输入比较器
module sort #(parameter DW =8)(
input wire [DW-1:0] in_0,
input wire [DW-1:0] in_1,
input wire [DW-1:0] in_2,
input wire [DW-1:0] in_3,
input wire [DW-1:0] in_4,
input wire [DW-1:0] in_5,
input wire [DW-1:0] in_6,
input wire [DW-1:0] in_7,
output reg [DW-1:0] out_0,
output reg [DW-1:0] out_1,
output reg [DW-1:0] out_2,
output reg [DW-1:0] out_3,
output reg [DW-1:0] out_4,
output reg [DW-1:0] out_5,
output reg [DW-1:0] out_6,
output reg [DW-1:0] out_7
);
reg [DW*2-1:0] out_temp0,out_temp1,out_temp2,out_temp3,
out_temp4,out_temp5,out_temp6,out_temp7,out_temp8;
reg [DW*4-1:0] compare4_in1,compare4_in2;
reg [DW*4-1:0] out_comp4;
always @(*) begin
compare4_in1 = max_4_in(in_0,in_1,in_2,in_3);
compare4_in2 = max_4_in(in_4,in_5,in_6,in_7);
end
//得出最小值和最大值
always @(*) begin
out_temp3 = max_2(compare4_in1[DW-1:0],compare4_in2[DW-1:0]);//最大值
out_temp2 = max_2(compare4_in1[DW*4-1:DW*3],compare4_in2[DW*4-1:DW*3]);//最小值
out_7 = out_temp3[DW-1:0];
out_0 = out_temp2[DW*2-1:DW];
end
//得到次小值和次大值
always @(*) begin
//1-5号比大小
out_temp0 = max_2(compare4_in1[DW*3-1:DW*2],compare4_in2[DW*3-1:DW*2]);//次小值
//2-6号比大小
out_temp1 = max_2(compare4_in1[DW*2-1:DW],compare4_in2[DW*2-1:DW]);//次大值
//找到2-6最大的,与3-7之间较小的相比,找到次大值
out_temp4 = max_2(out_temp1[DW-1:0],out_temp3[DW*2-1:DW]);
//找到1-5最小的,与0-4之间较大的比较,找到次小值
out_temp5 = max_2(out_temp0[DW*2-1:DW],out_temp2[DW-1:0]);
//次大值
out_6 = out_temp4[DW-1:0];
//次小值
out_1 = out_temp5[DW*2-1:DW];
end
/*
//--||||--//c-out_temp0[DW-1:0] D-out_temp1[DW*2-1:DW] G- out_temp4[DW*2-1:DW] A-out_temp5[DW-1:0];
always @(*) begin
out_temp6 = max_2(out_temp0[DW-1:0],out_temp4[DW*2-1:DW]);
out_temp7 = max_2(out_temp5[DW-1:0],out_temp1[DW*2-1:DW]);
out_temp8 = max_2(out_temp6[DW-1:0],out_temp7[DW*2-1:DW]);
out_2 = out_temp6[DW*2-1:DW];
out_3 = out_temp8[DW*2-1:DW];
out_4 = out_temp8[DW-1:0];
out_5 = out_temp7[DW-1:0];
end
*/
//接入四输入
//out_temp0[DW-1:0] out_temp1[DW*2-1:DW] out_temp4[DW*2-1:DW] out_temp5[DW-1:0];
always @(*) begin
out_comp4 = max_4_in(out_temp0[DW-1:0],out_temp1[DW*2-1:DW],out_temp4[DW*2-1:DW],out_temp5[DW-1:0]);
out_2 = out_comp4[DW*4-1:DW*3];
out_3 = out_comp4[DW*3-1:DW*2];
out_4 = out_comp4[DW*2-1:DW];
out_5 = out_comp4[DW-1:0];
end
//构造4输入比较器
function [DW*4-1:0] max_4_in;
input [DW-1:0] a;
input [DW-1:0] b;
input [DW-1:0] c;
input [DW-1:0] d;
reg [DW*2-1:0] temp1,temp2,temp3,temp4,temp5;
begin
temp1 = max_2(a,b);
temp2 = max_2(c,d);
temp3 = max_2(temp1[DW-1:0],temp2[DW-1:0]);
temp4 = max_2(temp1[DW*2-1:DW],temp2[DW*2-1:DW]);
temp5 = max_2(temp3[DW*2-1:DW],temp4[DW-1:0]);
max_4_in ={temp4[DW*2-1:DW],temp5[DW*2-1:0],temp3[DW-1:0]};
end
endfunction
//2输入比较器
function [DW*2-1:0] max_2;
input [DW-1:0] a;
input [DW-1:0] b;
begin
max_2 = (a>=b)? ({b[DW-1:0],a[DW-1:0]}):({a[DW-1:0],b[DW-1:0]});
end
endfunction
endmodule
4、tb文件
`timescale 1ns/1ps
module tb_sort;
parameter WDITH = 8;
reg [WDITH -1 :0 ] in_0;
reg [WDITH -1 :0 ] in_1;
reg [WDITH -1 :0 ] in_2;
reg [WDITH -1 :0 ] in_3;
reg [WDITH -1 :0 ] in_4;
reg [WDITH -1 :0 ] in_5;
reg [WDITH -1 :0 ] in_6;
reg [WDITH -1 :0 ] in_7;
wire[WDITH -1 :0 ] out_0;
wire[WDITH -1 :0 ] out_1;
wire[WDITH -1 :0 ] out_2;
wire[WDITH -1 :0 ] out_3;
wire[WDITH -1 :0 ] out_4;
wire[WDITH -1 :0 ] out_5;
wire[WDITH -1 :0 ] out_6;
wire[WDITH -1 :0 ] out_7;
integer i;
initial begin
in_0 = 0;
in_1 = 0;
in_2 = 0;
in_3 = 0;
in_4 = 0;
in_5 = 0;
in_6 = 0;
in_7 = 0;
for(i =0;i<20;i=i+1)begin
#20;
data_gen();
end
end
task data_gen();
begin
in_0 = {$random}%256;
in_1 = {$random}%256;
in_0 = {$random}%256;
in_1 = {$random}%256;
in_2 = {$random}%256;
in_3 = {$random}%256;
in_4 = {$random}%256;
in_5 = {$random}%256;
in_6 = {$random}%256;
in_7 = {$random}%256;
end
endtask
sort #(.DW(8)) sort_inst(
.in_0(in_0),
.in_1(in_1),
.in_2(in_2),
.in_3(in_3),
.in_4(in_4),
.in_5(in_5),
.in_6(in_6),
.in_7(in_7),
.out_0(out_0),
.out_1(out_1),
.out_2(out_2),
.out_3(out_3),
.out_4(out_4),
.out_5(out_5),
.out_6(out_6),
.out_7(out_7)
);
endmodule
5、modelism 结果分析
可以看出,这个8输入比较器,功能基本正确,只是我这里一共用了21个2输入比较器