如何使MyHDL在进程中生成任意宽度的变量?

2024-09-26 22:07:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对列表中的信号求和,当然我使用了variable和for(就像在VHDL中一样):

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

问题是,这将使用整数(在VHDL中)作为sum变量,当sum的宽度超过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

我不知道该怎么处理。我猜它在sum中得到intbv的值是整数,因此是不同的类型。你知道吗

谢谢你的建议


Tags: in列表forlendefrange整数product
1条回答
网友
1楼 · 发布于 2024-09-26 22:07:57

我已经设法做了非常难看的变通办法:

@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对象,会严重影响模拟的性能。你知道吗

相关问题 更多 >

    热门问题