2016-06-07 50 views
0

我想这样做的,我有一个列表,当然我用的变量和信号的总和(我会在VHDL):如何让MyHDL生成具有任意宽度的变量?

@always_comb 
    def sum(): 
     sum = 0 
     for i in range(len(summands)): 
      sum = sum + summands[i] 
     product.next = sum 

的问题是,这将使用整数( VHDL)用于sum变量,当sum的宽度将超过32bits时,这没有多大用处。

于是,我就做这样的事情:

@always_comb 
    def sum(): 
     sum = intbv(0, min=vmin, max=vmax) 
     for i in range(len(summands)): 
      sum = sum + summands[i] 
     product.next = sum 

我得到以下错误(转换期间):

Type mismatch with earlier assignment: sum 

,我不知道如何解决。我想它得到的整数intbv的值,因此是不同的类型。

感谢您的任何建议

回答

0

我已成功地使很丑陋的解决方法:

@always_comb 
def sum(): 
    sum = intbv(0, min=vmin, max=vmax) 
    for i in range(len(summands)): 
     sum = intbv(sum + summands[i], min=vmin, max=vmax) 
    product.next = sum 

通过这种方式,将产生正确的VHDL:

IIR_SOS_INST_0_PRODUCTS_1_SUM: process (sos_inst_0_products_1_summands) is 
    variable sum: signed(44 downto 0); 
begin 
    sum := to_signed(0, 45); 
    for i in 0 to 21-1 loop 
     sum := to_signed((sum + sos_inst_0_products_1_summands(i)), 45); 
    end loop; 
    sos_inst_0_b1p <= sum; 
end process IIR_SOS_INST_0_PRODUCTS_1_SUM; 

但模拟的性能在每次分配总和时创建一个新的intbv对象都会受到很大的影响。

+0

我不认为它是_that_难看......无论如何,现在是什么类型的sos_inst_0_products_1_summands'?还是整数? – damage

+0

嗨,这将最终被签名。丑陋是在模拟期间,它正在创建总是新的intbv对象,这需要时间。 –

相关问题