在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4205|回复: 5

[转贴] DW_minmax的实现

[复制链接]
发表于 2020-4-19 20:45:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
module DW_minmax (
    // Inputs
    a,
    tc,
    min_max,
    // Outputs
    value,
    index
);
parameter WIDTH =                 4;        // element WIDTH
parameter NUM_INPUTS =                 8;        // number of elements in input array
parameter INDEX_WIDTH =         3;        // size of index pointer = ceil(log2(NUM_INPUTS))
input  [NUM_INPUTS*WIDTH-1 : 0]                a;        // Concatenated input vector
input                                        tc;        // 0 = unsigned, 1 = signed
input                                        min_max;// 0 = find min, 1 = find max
output [WIDTH-1:0]                        value;        // mon or max value found
output [INDEX_WIDTH-1:0]                index;        // index to value found
wire   [NUM_INPUTS*WIDTH-1 : 0]                a_uns, a_trans;
reg    [WIDTH-1:0]                        val_int;
wire   [WIDTH-1:0]                        val_trans;
reg    [INDEX_WIDTH-1:0]                indx_int;
wire [INDEX_WIDTH:0] num_inputs_log2;
assign num_inputs_log2 = 1 << INDEX_WIDTH;
assign a_uns = (WIDTH == 1) ? a ^ {NUM_INPUTS{tc}}: a ^ { NUM_INPUTS { tc, { WIDTH-1 {1'b0}}}};
assign a_trans = a_uns;
always @ (a_trans or min_max) begin : PROC_find_minmax
    reg    [WIDTH-1:0]        val_1, val_2;
    reg    [INDEX_WIDTH-1 : 0]        indx_1, indx_2;
    reg    [( (2 << INDEX_WIDTH)-1)*WIDTH-1 : 0]         val_array;
    reg    [( (2 << INDEX_WIDTH)-1)*INDEX_WIDTH-1:0] indx_array;
    reg    [31 : 0]                i, j, k, l, m, n;
    i = 0;
    j = 0;
    val_array = {WIDTH << (INDEX_WIDTH+1){1'b0}};
    indx_array = {INDEX_WIDTH << (INDEX_WIDTH+1){1'b0}};
    for (n=0 ; n<NUM_INPUTS ; n=n+1) begin
        for (m=0 ; m<WIDTH ; m=m+1)
        val_array[i+m] = a_trans[i+m];
        for (m=0 ; m < INDEX_WIDTH ; m=m+1)
        indx_array[j+m] = n[m];
        i = i + WIDTH;
        j = j + INDEX_WIDTH;
    end
    for (n=NUM_INPUTS ; n<(1 << INDEX_WIDTH) ; n=n+1) begin
        for (m=0 ; m<WIDTH ; m=m+1)
        val_array[i+m] = val_array[(NUM_INPUTS-1)*WIDTH+m];
        for (m=0 ; m < INDEX_WIDTH ; m=m+1)
        indx_array[j+m] = indx_array[(NUM_INPUTS-1)*INDEX_WIDTH+m];
        i = i + WIDTH;
        j = j + INDEX_WIDTH;
    end
    k = 0;
    l = 0;
    for (n=0 ; n < (1 << (INDEX_WIDTH-1))*2-1 ; n=n+1) begin

        for (m=0 ; m<WIDTH ; m=m+1) begin
            val_1[m] = val_array[k+m];
        end

        for (m=0 ; m<INDEX_WIDTH ; m=m+1) begin
            indx_1[m] = indx_array[l+m];
        end
        k = k + WIDTH;
        l = l + INDEX_WIDTH;

        for (m=0 ; m<WIDTH ; m=m+1) begin
            val_2[m] = val_array[k+m];
        end
        for (m=0 ; m<INDEX_WIDTH ; m=m+1) begin
            indx_2[m] = indx_array[l+m];
        end
        k = k + WIDTH;
        l = l + INDEX_WIDTH;
        if (((min_max==1'b1) && (val_1 > val_2)) || ((min_max==1'b0) && (val_1 <= val_2))) begin
            for (m=0 ; m<WIDTH ; m=m+1)
            val_array[i+m] = val_1[m];

            for (m=0 ; m<INDEX_WIDTH ; m=m+1)
            indx_array[j+m] = indx_1[m];
        end else begin
            for (m=0 ; m<WIDTH ; m=m+1)
            val_array[i+m] = val_2[m];

            for (m=0 ; m<INDEX_WIDTH ; m=m+1)
            indx_array[j+m] = indx_2[m];
        end
        i = i + WIDTH;
        j = j + INDEX_WIDTH;
    end
    for (m=0 ; m < WIDTH ; m=m+1)
    val_int[m] = val_array[k+m];

    for (m=0 ; m < INDEX_WIDTH ; m=m+1)
    indx_int[m] = indx_array[l+m];

end
assign val_trans = val_int;
assign value = (WIDTH == 1) ? val_trans ^ tc: val_trans ^ { tc, { WIDTH-1 {1'b0}}};
assign index = indx_int;
endmodule


发表于 2021-7-14 09:18:25 | 显示全部楼层
how to get this??
发表于 2022-1-11 14:02:31 | 显示全部楼层
how to get this??
发表于 2022-2-12 21:32:09 | 显示全部楼层
What about other DW stuff like fp_add fp_sub fp_div etc...
发表于 2022-6-24 15:53:11 | 显示全部楼层
这个可以综合吗?有用过的吗?
发表于 3 天前 | 显示全部楼层
这种东西在FPGA上会存在时序问题,上次查得我要死要活的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-21 21:21 , Processed in 0.019528 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表