2014-12-18 3 views
0

특정 엔티티의 출력은 벡터의 모든 위치와 모든 입력에 따라 다릅니다. 이것을 구현하는 가장 쉬운 방법은 for-loop의 for-loop 인 것 같습니다. 그러나 대한 루프 두 번째 실패 13.0sp1의 Quartus II는 :For-loop for for 루프 VHDL

VHDL syntax error at mcve.vhd(24) near text "IN"; expecting "(", or "'", or "." 

나는 구문을 엉망 수도 있지만, 나는 확실히 VHDL 루프에서 반복 할 수 있어요.

for 루프에서 for 루프의 올바른 구현은 무엇입니까? 여기 내가 지금까지 얻은 것이 있습니다.

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.NUMERIC_STD.ALL; 

TYPE ANAT_SLV16 IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR(15 DOWNTO 0); 

ENTITY mcve IS 
    GENERIC(
     PORTS : POSITIVE := 256; 
     HPORTS : POSITIVE := 128 
    ); 
PORT(
    X : IN ANAT_SLV16(PORTS - 1 DOWNTO 0); 
    Y : OUT ANAT_SLV16(HPORTS - 1 DOWNTO 0); 
    ); 
END mcve; 

ARCHITECTURE loops OF mcve IS 
    SIGNAL to_Y : ANAT_SLV16(HPORTS - 1 DOWNTO 0) := (others -> '0'); 
BEGIN 

    gen : FOR i IN 0 TO HPORTS - 1 GENERATE 
     FOR j IN 0 TO PORTS - 1 GENERATE -- error near text "IN"; expecting "(", or "'", or "." 
      to_Y((i)) <= to_Y((i)) + X(j); 
     END GENERATE; 
    END GENERATE; 

    Y <= to_Y; 

END loops; 
+2

두 번째 루프에 레이블을 지정하지 마십시오. – grorel

+0

유형 선언은 use 절에서 볼 수있는 패키지에 있어야합니다. 'y' 포트 선언 말미에 port 절에 세미콜론이 추가로 있습니다. '->'는'=>'이어야하고 기본 표현식은''(다른 => ('= 0'))'-'to_y'는 std_logic_vector의 배열입니다. 범위의 경계를 모두 같은 기본 유형으로 지정하려면 해당 제네릭이 '자연스러운'이어야합니다 (오른쪽 경계 0). numeric_std 패키지의''+ ''연산자를 사용하려면 피연산자를 unsigned로 변환해야합니다. 결과는 std_logic_vector입니다. 그런 다음 MVCe는 완전하고 검증 가능하며 Brian의 레이블로 고칠 수 있습니다. – user1155120

+0

나는 성급한 MCVE를 만들고 간과 된 실수를 저질렀다. 그러나이 문제는 분명히 드러납니다. 전 패키지에 동의합니다, 원본은 그런 식으로 만들어졌습니다. 그러나 나는 MCVE가 더 콤팩트하게 만들어 져야하고 그것들과 같은 구조를 가지지 않아야한다고 생각한다. – Mast

답변

3

이들은 FOR 루프가 아닙니다. 그것들은 FOR..GENERATE 명령문이며 각각 고유 한 레이블이 필요합니다.

gen : FOR i IN 0 TO HPORTS - 1 GENERATE 
    gen2: FOR j IN 0 TO PORTS - 1 GENERATE 
     to_Y((i)) <= to_Y((i)) + X(j); 
    END GENERATE; 
END GENERATE; 

이렇게하면 생성되는 하드웨어의 크기가 좋기를 바랍니다.

+0

와우, 어리석은 실수 였어. 그리고 최종 코드는 수천 개의 LE를 사용합니다. 프로토 타입을 제작하는 중이므로 다음 사람은 최적화에 대해 걱정해야합니다. – Mast

+1

이것은 구문 오류를 수정하지만 디자인은 여전히 ​​작동하지 않습니다. 'to_Y ((i)) <= to_Y ((i)) + X (j);는 클럭 된 프로세스 안에 있지 않기 때문에 combinatorial 루프를 생성 할 것이다. 만약 당신이 clocked 프로세스 내부에서 for 루프로 전환한다면,'to_Y (i) <= to_Y (i) + X (PORTS-1);의 마지막 할당 만이 유효하므로 내부 루프는 아무것도하지 않을 것이다. 각 'i'는 to_Y가 신호이기 때문입니다. 이것은 초보자에게 변수 사용을 제안하는 드문 경우 중 하나입니다. – QuantumRipple

+0

또한, "수천 개의 LE"는 약 2 배의 과소 평가입니다. 명백하게 의도 된 기능과 디폴트'PORTS'와'HPORTS' 값으로 구현된다면 약 250k LUT6을 소비하는 약 16k 3 진 16 비트 덧셈기 (이중 덧셈기보다 최신 LUT6에서 더 효율적입니다)가있을 것입니다. 250k + LUT가있는 가장 작은 7 시리즈 FPGA는 7k410t입니다.이 간단한 로직을위한 절대적으로 거대한 FPGA입니다. 시뮬레이션에서 개념 증명을하려한다면 괜찮습니다.하지만 실제 프로토 타입을 수행하려면 ** 최적화를 먼저 수행해야합니다. – QuantumRipple