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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 13841|回复: 36

[求助] HELP!求最大最小值

[复制链接]
发表于 2011-1-18 15:08:55 | 显示全部楼层 |阅读模式

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

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

x
各位:

      正在整合系统,有个IP缺一个叫做DW_minmax.v的文件,然后老板说,你自己写一个吧,结果发现比较困难。寻求各位的帮助。接口如下:
module DW_minmax(
    a,
    tc,
    min_max,
    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  [WIDTH*NUM_INPUTS-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;   //min or max value found
    output [INDEX_WIDTH-1:0]      index;   //index to value found
大概是:输入一个32位的数,实际上它是8个4位的数组成的。找出这8个数中的最大/最小值,并且给出相应的index值。而且,这八个数还有可能是有符号的。

我做起来有以下几个困难之处,不知道该怎么办:1.没有时钟,我的想法是需要寄存器保存一下中间值;2.待比较的数目不定,要是确定的,比较好一次性把数全分开。
发表于 2011-1-18 15:21:55 | 显示全部楼层
大概可能不行吧,需要确定功能。
 楼主| 发表于 2011-1-18 16:07:51 | 显示全部楼层
发表于 2011-1-18 16:57:13 | 显示全部楼层
用三层共七个比较器选出最大/最小的值
新建 Microsoft Visio 绘图.jpg
具体又分成两种情况:无符号数比较和有符号数比较
这两种情况比较器的设计稍微有些不同

乱写的,不知道对不对。。
发表于 2011-1-19 16:28:22 | 显示全部楼层
a0和a1比较,大值记为max1,然后和a2比,大值记为max2,然后和a3比,.......一直循环;
a0和a1比较,大值记为min1,然后和a2比,大值记为min2,然后和a3比,.......一直循环;
 楼主| 发表于 2011-1-21 10:12:01 | 显示全部楼层
各位:
      比较的基本思想我知道,问题是多少个数要比较不知道,数的位宽不知道,是否有符号位不知道,得适用各种情况。
      还好姐姐我自己搞定了。
发表于 2011-1-21 16:25:13 | 显示全部楼层


各位:
      比较的基本思想我知道,问题是多少个数要比较不知道,数的位宽不知道,是否有符号位不知道, ...
oscillator_cn1 发表于 2011-1-21 10:12




    搞定了应该把自己的方法给出来大家好一起交流交流啊
 楼主| 发表于 2011-1-22 11:22:34 | 显示全部楼层
那好吧。我贴上代码:
` timescale   1ns/1ns
// define WIDTH        4
// define NUM_INPUTS   8
// define INDEX_WIDTH  3
module DW_minmax(
    a,
    tc,
    min_max,
    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  [ WIDTH* NUM_INPUTS-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;   //min or max value found
    output [ INDEX_WIDTH-1:0]       index;   //index to value found
   
    reg [ WIDTH-1:0]b[ NUM_INPUTS-1:0];
   
    reg [ WIDTH* NUM_INPUTS-1:0] a_tmp;
    reg [ INDEX_WIDTH-1:0]       pi;
    reg [ WIDTH-1:0]             max_tmp;
    reg [ WIDTH-1:0]             min_tmp;
    reg [ INDEX_WIDTH-1:0]       max_index;
    reg [ INDEX_WIDTH-1:0]       min_index;
   
    wire [ WIDTH-1:0]            value;
    wire [ INDEX_WIDTH-1:0]      index;

    always @(a)
    begin: takeout
        a_tmp=a;
        for (pi=0;pi< NUM_INPUTS-1;pi=pi+1)
        begin
            b[pi] = a_tmp[ WIDTH-1:0];
            a_tmp = a_tmp>> WIDTH;
        end
        b[pi] = a_tmp[ WIDTH-1:0];
        a_tmp = a_tmp>> WIDTH;
    end
  
    always @(a)
    begin: max_min
        max_tmp=b[0];
        min_tmp=b[0];
        max_index=0;
        min_index=0;
        for(pi=1;pi< NUM_INPUTS-1;pi=pi+1)
        begin
            if(tc==1'b0)
            begin
                if(max_tmp<b[pi])
                begin
                    max_tmp=b[pi];
                    max_index=pi;
                end
                if(min_tmp>b[pi])
                begin
                    min_tmp=b[pi];
                    min_index=pi;
                end
            end
            else if(tc==1'b1)
            begin
                //find max
                if(max_tmp[ WIDTH-1] > b[pi][ WIDTH-1])//when highest bit =1,the number is less then the number of highest bit=0
                      begin                                  //change
                          max_tmp=b[pi];
                    max_index=pi;
                end
                else if(max_tmp[ WIDTH-1] < b[pi][ WIDTH-1])//when highest bit =0,the number is greater then the number of highest bit=1
                begin                                       //dont change (latch)
                    max_tmp=max_tmp;
                    max_index=max_index;
                end
                else if(max_tmp[ WIDTH-1] == b[pi][ WIDTH-1])//when highest bit equal, normal compare
                begin                                          
                    if(max_tmp<b[pi])
                    begin
                        max_tmp=b[pi];
                        max_index=pi;
                    end
                end
                //find min
                if(min_tmp[ WIDTH-1] < b[pi][ WIDTH-1])
                begin
                    min_tmp=b[pi];
                    min_index=pi;
                end
                else if(min_tmp[ WIDTH-1] > b[pi][ WIDTH-1])
                begin
                    min_tmp=min_tmp;
                    min_index=min_index;
                end
                else if(min_tmp[ WIDTH-1] == b[pi][ WIDTH-1])
                begin
                    if(min_tmp>b[pi])
                    begin
                        min_tmp=b[pi];
                        min_index=pi;
                    end
                end
            end
              end
        if(tc==1'b0)
            begin
                if(max_tmp<b[pi])
                begin
                    max_tmp=b[pi];
                    max_index=pi;
                end
                if(min_tmp>b[pi])
                begin
                    min_tmp=b[pi];
                    min_index=pi;
                end
            end
            else if(tc==1'b1)
            begin
                //find max
                if(max_tmp[ WIDTH-1] > b[pi][ WIDTH-1])//when highest bit =1,the number is less then the number of highest bit=0
                      begin                                  //change
                          max_tmp=b[pi];
                    max_index=pi;
                       end
                else if(max_tmp[ WIDTH-1] < b[pi][ WIDTH-1])//when highest bit =0,the number is greater then the number of highest bit=1
                begin                                       //dont change (latch)
                    max_tmp=max_tmp;
                    max_index=max_index;
                end
                else if(max_tmp[ WIDTH-1] == b[pi][ WIDTH-1])//when highest bit equal, normal compare
                begin                                          
                    if(max_tmp<b[pi])
                    begin
                        max_tmp=b[pi];
                        max_index=pi;
                    end
                end
                //find min
                if(min_tmp[ WIDTH-1] < b[pi][ WIDTH-1])
                begin
                    min_tmp=b[pi];
                    min_index=pi;
                end
                else if(min_tmp[ WIDTH-1] > b[pi][ WIDTH-1])
                begin
                    min_tmp=min_tmp;
                    min_index=min_index;
                end
                else if(min_tmp[ WIDTH-1] == b[pi][ WIDTH-1])
                begin
                    if(min_tmp>b[pi])
                    begin
                        min_tmp=b[pi];
                        min_index=pi;
                    end
                end
            end
    end
   
   assign value=min_max?max_tmp:min_tmp;
   assign index=min_max?max_index:min_index;
endmodule
 楼主| 发表于 2011-1-22 11:24:04 | 显示全部楼层
感觉求最大最小的那个for循环那还是太多行了,写的时候好几次begin和end没对上。有谁能精简一下?
发表于 2011-1-22 14:48:59 | 显示全部楼层
3个问题:
1:比较器没必要逐位比较。建议做个标准比较器模块:位宽参数化;一个符号控制信号;输出2bits结果信号,表示大,小,或相等。
2:如果不要求可综合,那此条不算问题。你的代码出来的一定是锁存器。
3:如果不要求可综合,那此条不算问题。循环次数必须是常数,每次的循环结果必须有专门的名称定义。
最后说下,除非你是大妈级人物,否则不自称姐姐。你不知道看你贴和回你贴的人的年龄。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-23 02:14 , Processed in 0.038059 second(s), 9 queries , Gzip On, Redis On.

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