0

リストにある信号の合計を計算したいと思います。当然、変数と for を使用しました (VHDL の場合と同様):

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

問題は、合計変数に (VHDL で) 整数が使用されることです。これは、合計の幅が 32 ビットを超える場合にはあまり役に立ちません。

だから私はこのようなことをしようとしました:

    @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 の値を合計して整数として取得するため、型が異なると思います。

提案をありがとう

4

2 に答える 2

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;

ただし、sum への代入ごとに新しい intbv オブジェクトを作成すると、シミュレーションのパフォーマンスが大幅に低下します。

于 2016-06-07T15:39:30.213 に答える