2016-06-07 45 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對象,這需要時間。 –

相關問題