我有一个数组/向量,我想通过处理第一个来生成一个新数组。我需要的一个简单例子是新数组中的每个第i个元素都是第一个元素的i-1,i和i + 1元素的总和。 我知道通过迭代数组可以很容易地以顺序方式完成。如果有任何类型的赋值表达式可以推广并使其成为并行操作,我就会徘徊。(比如数学:new [i]:= old [i - 1] + old [i] + old [i + 1] ,其中i∈(1,n))。
答案 0 :(得分:0)
由于您的问题是关于并行性,我假设您对将从您的VHDL描述合成的硬件感兴趣,而不是通过模拟。
当所有这些添加发生时,并行性是的问题?如果你的设计是同步的 - 让我们说一下名为clk
的时钟的上升沿 - 那么:
subtype word: unsigned(7 downto 0);
type word_array is array(natural range <>) of word;
signal a: word_array(0 to 15);
signal b: word_array(1 to 14);
...
process(clk)
begin
if rising_edge(clk) then
for i in 1 to 14 loop
b(i) <= a(i - 1) + a(i) + a(i + 1);
end loop;
end if;
end process;
将在时钟的每个上升沿并行计算数组b
中的14个值。并且它将根据需要实例化尽可能多的8位加法器。问题不在于你是使用for
循环还是其他东西,这些操作何时发生??答案在描述中:在同一时钟周期内。
您可以重载"+"
运算符以处理向量:
function "+"(a, b: word_array) return word_array is
constant n: positive := a'length;
variable va: word_array(0 to n - 1) := a;
variable vb: word_array(0 to n - 1) := b;
variable sum: word_array(0 to n - 1);
begin
if n = 1 then
sum(0) := va(0) + vb(0);
else
sum := (va(0 to n / 2 - 1) + vb(0 to n / 2 - 1)) &
(va(n / 2 to n - 1) + vb(n / 2 to n - 1));
end if;
return sum;
end function "+";
并使用它显然写一个更平行的描述:
process(clk)
begin
if rising_edge(clk) then
b <= a(0 to 13) + a(1 to 14) + a(2 to 15);
end if;
end process;
但它没有任何区别,因此产生的硬件也是一样的。
你也可以使用generate语句来做同样的事情:
g: for i in 1 to 14 generate
process(clk)
begin
if rising_edge(clk) then
b(i) <= a(i - 1) + a(i) + a(i + 1);
end if;
end process;
end generate g;
但是,再次,它对合成器没有任何影响。