verilog基础设计9-小米数字ic笔试题 对8输入进行排序

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输入比较器

  

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值