Vhdl 向量的动态量之和

Vhdl 向量的动态量之和,vhdl,Vhdl,我基本上有两个向量(类型:整数、有符号、无符号、标准逻辑向量,对实现来说并不重要) 向量1的静态大小为16(等于1个字)。 向量2的动态大小为X*16(等于X个字) X是动态参数 现在我想有一个构造,根据参数X,我可以求向量2的X个字的和 诸如此类: vector_1 <= for i in 0 to X generate vector_2(X*16+15 downto X*16) + end generate; process (clk

我基本上有两个向量(类型:整数、有符号、无符号、标准逻辑向量,对实现来说并不重要)

向量1的静态大小为16(等于1个字)。 向量2的动态大小为X*16(等于X个字) X是动态参数

现在我想有一个构造,根据参数X,我可以求向量2的X个字的和

诸如此类:

vector_1 <= for i in 0 to X generate
             vector_2(X*16+15 downto X*16) +
            end generate;
process (clk)
    variable sum : signed (vector1'range) := to_signed(0, vector1'length);
begin
    if (rising_edge(clk)) then
        sum := to_signed(0, vector1'length);
        for i in 0 to (data_vector'length - 1) loop
            sum := sum + data_vector(i);
        end loop;
        vector1 <= sum;
    end if;
end process;

vector\u 1对于您的
data\u vector
,我将使用自定义类型,类似于:

type WORD_ARRAY_type is array (integer range <>) of signed (15 downto 0);
signal data_vector : WORD_ARRAY_type (2 downto 0);
vector1 <= data_vector (0) + data_vector (1) + data_vector (2);
type WORD\u ARRAY\u type是有符号(15到0)的数组(整数范围);
信号数据向量:字数组类型(2到0);
这样,您的总和更具可读性,例如:

type WORD_ARRAY_type is array (integer range <>) of signed (15 downto 0);
signal data_vector : WORD_ARRAY_type (2 downto 0);
vector1 <= data_vector (0) + data_vector (1) + data_vector (2);
vector1也解决了这个问题:

process(clk)
    variable TMP : std_logic_vector(accumulated_data'range) := (others => '0');
begin
    if(rising_edge(clk)) then
        for i in 0 to X-1 loop
            TMP := std_logic_vector(  signed(TMP) +
                                      signed(data_vector(i*25+24 downto i*25))
                                   );
        end loop;
        accumulated_data <= TMP;
    end if;
end process;
过程(clk)
变量TMP:std_逻辑_向量(累计_数据'范围):=(其他=>'0');
开始
如果(上升沿(clk)),则
对于0到X-1循环中的i
TMP:=标准逻辑向量(有符号(TMP)+
有符号(数据_向量(i*25+24向下至i*25))
);
端环;

累积的_数据A函数可用于求和,其中X通过简单的长度除法确定:

function vector_sum(vec_2 : std_logic_vector; len_1 : natural) return std_logic_vector is
  variable res : std_logic_vector(len_1 - 1 downto 0) := (others => '0');
begin
  for i in 0 to vec_2'length / len_1 - 1 loop
    res := std_logic_vector(signed(res) + 
                            signed(vec_2((i + 1) * len_1 - 1 + vec_2'right downto 
                                         i * len_1 + vec_2'right)));
  end loop;
  return res;
end function;
然后使用该函数,如下所示:

vector_1 <= vector_sum(vector_2, vector_1'length);

vector_1应该
X
能够在运行时更改吗?您不能有一个可合成的VHDL构造,它的大小在运行时是动态的。不,X在synthesis时是静态的。show large可以
X
be吗?让向量2使用块内存资源是否可行?X,max约为8。blk_mem不是一个选项。我认为您需要用参数(X-1)替换循环中的(vector2'length-1)。我喜欢自定义类型的方法。真是太好了!:)根据您的问题,
vector2'长度
将与
X
相同。如果使用属性,则
X
甚至不必是实体中的泛型。当数据的位宽度发生变化时,自定义类型非常有用。如果我举个例子,vector_2'长度将是X*16,从而导致数据_vector(I)的超出范围错误。我相信一个人可以写(vector2'length/vector1'length)。这是否使我的意思更清楚?您是如何理解我的问题的?我的解决方案假设您使用自定义类型,在这种情况下,
data\u vector
的长度是其中包含的字数(即
X
)aaahh。。好的,我明白了。知道了。vector2和data_vector在这里是相同的。甜心,谢谢你的帮助!就我个人的理解而言,除了任何可重用性好处之外,将本质上相同的代码放入一个函数是否与将其作为“主”rtl的一部分有所不同?该函数不需要任何
WORD\u ARRAY\u type
类型,并且允许并发分配给
vector\u 2
,因此不需要过程。因此,使用带有
std\u logic\u vector
参数的函数是一种更接近问题中的类型和代码示例的解决方案。好的,谢谢。我想知道一个函数是否可以帮助合成工具在JimLewis的commentWorks中第一次做正确的事情,但是在下一个时钟上,TMP将保留它在前一次执行中的值。变量对象的初始化仅在详细说明变量时发生。对于一个进程,这种情况在时间开始时发生一次——在子程序中(参见Morten的解决方案),每次调用函数时都会发生。在您的过程中,您不需要在TMP声明中初始化TMP,而需要在IFRising_edge(Clk)之后使用显式变量赋值进行初始化。