Board logo

标题: 改造不定次数循环 [打印本页]

作者: graduate    时间: 2007-10-13 23:13     标题: 改造不定次数循环

i = 0;
  while ((sum_mag[wm-1-i]==sum_mag[wm-2-i])&& (max_exp>0))
  begin
   sum_mag[wm-1 : 0] = {sum_mag[wm-2 : 0],0}; // signed shift
   max_exp = max_exp-1;
   i = i+1;
  end

比如上面的代码,由于循环次数不确定,不能通过编译

一般是通过设置一个循环上限,用if判断执行的办法转换,可是为了使代码正确,往往把上限社的比较大

这样在无须执行的时候也要处理这多次循环,所以希望大家一起探讨如何优化这个代码?


作者: caopengly    时间: 2007-10-15 10:50

“这样在无须执行的时候也要处理这多次循环,所以希望大家一起探讨如何优化这个代码?”

这个是hdl不是c或其他上位机语言,一旦综合完成,生成固定的硬件电路后就不会因为你是几重循环来变化了。

使用while循环不是说在这里循环,而主要是简化书写便于理解。

你加if来判断也可以,你可以在是否加运行循环加条件。

[此贴子已经被作者于2007-10-15 11:29:27编辑过]


作者: graduate    时间: 2007-10-16 01:23     标题: 回复:(caopengly)“这样在无须执行的时候也要处理这...

那LS觉得硬件循环次数该怎么确定,如果是一个变量?
作者: caopengly    时间: 2007-10-16 22:16

对于一个要使用类似与c语言的循环功能的数字电路时,你可以使用状态机啊!使用状态间循环的思路,然后再判断跳出。

使用的for循环只是一个表达,表达和实现是不同的,所以综合不了。


作者: graduate    时间: 2007-10-30 02:10

-- File        : p2r_CordicPipe.vhd
function Delta(Arg : signed; Cnt : natural) return signed is
        variable tmp : signed(Arg'range);
        constant lo : integer := Arg'high -cnt +1;
    begin
        for n in Arg'high downto lo loop
            tmp(n) := Arg(Arg'high);
        end loop;
        for n in Arg'high -cnt downto 0 loop
            tmp(n) := Arg(n +cnt);
        end loop;
        return tmp;
    end function Delta;
如上使用function很不错

作者: caopengly    时间: 2007-10-30 11:48

呵呵,当你调用Delta时,自然可以编译了,关键是看能不能写出肯定的表达式,综合器才能认识得到。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0