1
我有一個數組/矢量,我想通過處理第一個生成一個新的數組。我需要的一個簡單例子是,新數組中的每個第i個元素都是第一個元素的i-1,i和i + 1元素的總和。 我知道這可以非常容易地通過迭代遍歷數組以順序方式完成。 (如數學:new [i]:= old [i - 1] + old [i] + old [i + 1]),如果有任何形式的分配表達式可以推廣這個並行操作,其中i∈(1,n))。vhdl
我有一個數組/矢量,我想通過處理第一個生成一個新的數組。我需要的一個簡單例子是,新數組中的每個第i個元素都是第一個元素的i-1,i和i + 1元素的總和。 我知道這可以非常容易地通過迭代遍歷數組以順序方式完成。 (如數學:new [i]:= old [i - 1] + old [i] + old [i + 1]),如果有任何形式的分配表達式可以推廣這個並行操作,其中i∈(1,n))。vhdl
由於你的問題是關於並行性的,我假設你對從你的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;
將並行的14個值計算陣列b
在每個時鐘的上升沿。它會根據需要實例化多個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;
但它也就沒有什麼區別和由此產生的硬件將是相同的。
你也可以使用一個生成的語句做同樣的:
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;
但同樣,它將使用於合成沒什麼區別。
編寫一個返回初始化數組的函數。 –
在您表達意圖處理1000個或更多元素的評論中,該數字和元素大小在有限資源FPGA中實現並且可能不適合。你沒有說明有多少元素和它們的大小,並告訴我們你的問題不清楚。沒有完整參數的理論問題很可能無法得到有用的答案。可能存在時間/複雜性的折衷,您可以在某些時鐘週期內使用更少的資源來完成該功能。 – user1155120