2016-07-29 4 views
1

배열/벡터 있고 첫 번째 처리하여 새 배열을 생성 할 싶습니다. 새로운 배열의 모든 i 번째 요소는 첫 번째 요소의 i-1, i 및 i + 1 요소의 합계입니다. 배열을 반복하여 순차적으로 쉽게 처리 할 수 ​​있다는 것을 알고 있습니다. 나는 이것을 일반화하고 이것을 평행 한 연산으로 만드는 어떤 종류의 표현이라도 방황하고 있었다. (수학에서와 같이 : new [i] : = old [i-1] + old [i] + old [i + 1] , 여기서 i∈ (1, n)).vhdl 일반화 된 집합

+0

초기화 된 배열을 반환하는 함수를 작성하십시오. –

+0

당신은 유한 요소 FPGA에서 1000 개 이상의 요소, 그 수 및 요소 크기 색상 구현을 다루려는 의도로 표현한 의견에 맞지 않을 수 있습니다. 너는 얼마나 많은 요소들과 그것들의 크기를 나타내지 않았고 그것은 너의 질문이 불분명하다는 것을 말해 준다. 완전한 매개 변수가없는 이론적 인 질문은 유용한 대답을 얻을 수 없습니다. 기능을 완료하기 위해 몇 가지 클럭에서 더 적은 리소스를 사용할 수있는 시간/복잡성이 상쇄 될 수 있습니다. – user1155120

답변

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; 

을하지만, 어떤 차이가 없을 것와 결과 하드웨어는 동일합니다. 다시, 신디사이저에 대한 차이가 없을 것,

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; 

하지만 :

또한 동일한 기능을 수행하기 위해 생성 문을 사용할 수 있습니다.