2016-08-09 2 views
0

이 오류는 VHDL 2008을 지원하지 않는 GHDL의 결과라고 생각합니다. ff0 D에 벡터 din의 값이 할당되면 오류 27/28이 발생합니다 . 포트 맵에서 벡터를 인덱싱하는 적절한 방법은 무엇입니까?실제는 포트 맵에서 정적 이름 인덱싱 벡터 여야합니다

오류를 우회하려고 count_temp를 만들었지 만 도움이되지 않았기 때문에 추가 변수가 필요하지 않았습니다. 감사.

library ieee; 
    use ieee.std_logic_1164.all; 
    use ieee.numeric_std.all; 

entity conv_encoder is 
    generic (d_width : positive := 16); 
    port (
     clk : in std_logic; 
     din : in std_logic_vector(d_width-1 downto 0); 
     ff_set : in std_logic; 
     count : in std_logic_vector(5 downto 0); 
     dout : out std_logic_vector(d_width*2-1 downto 0)); 
end conv_encoder; 

architecture behavioral of conv_encoder is 
    component d_ff is 
    port (clk, ff_set, D : in std_logic; 
      Q : out std_logic); 
    end component; 
    signal a, b  : std_logic; 
    signal count_temp : integer range 0 to d_width; 
    begin 
    count_temp <= to_integer(unsigned(count)); 
    ff0 : d_ff 
     port map (clk => clk, 
       ff_set => ff_set, 
       D  => din(count_temp), 
       -- D  => din(to_integer(unsigned(count))), 
       Q  => a); 
    ff1 : d_ff 
     port map (clk => clk, 
       ff_set => ff_set, 
       D  => a, 
       Q  => b); 
    -- conv encoder is r=1/2 A=111 B=101 
    process (clk, ff_set) 
    begin 
    if (ff_set = '0') then 
     if (rising_edge(clk)) then 
     dout(count_temp*2) <= din(count_temp) xor a xor b; 
     dout(count_temp*2+1) <= din(count_temp) xor b; 
     end if; 
    end if; 
    end process; 
end behavioral; 

오류 :

ghdl -a conv_encoder.vhd 
conv_encoder.vhd:28:30: actual must be a static name 
ghdl: compilation error 
+0

'ghdl -a --std = 08 myfile.vhd' (그리고 정교화에 동일한 플래그를 제공). 현재 ghdl 릴리즈 (0.33 on)는 VHDL-2008의 상당수 (전부는 아님)를 지원합니다. 그러나 제프가 지적한대로 그것은 당신의 문제가 아닙니다. –

+0

IEEE Std 1076-2008 6.5.5.3 para 6 * 블록의 공식 포트에 대한 주어진 연관 요소의 실제 부분이 관성 예약어 관행에 이어 표현식이거나 전역 적으로 정적이 아닌 표현식이면 주어진 연관 요소는 블록을 즉시 둘러싸는 선언적 영역에서 암시 적으로 선언 된 익명 신호와 포트의 연관과 같습니다. 신호는 공식 포트와 동일한 하위 유형을 가지며 anonymous <= E ... * ghdl은 (아직) 이것을 지원하지 않습니다. – user1155120

+0

ghdl-updates [RoadMap2008] (https://sourceforge.net/p/ghdl-updates/wiki/RoadMap2008/) VHDL 2008의 새로운 기능, 6. 선언, port 절의 익명 신호. (그리고 이것은 \ [완료]로 표시되지 않습니다). – user1155120

답변

1

이 GHDL에서 VHD2008 지원 문제가되지 않습니다. 이 문제를 해결하기위한 두 가지 시도는 개념 상으로는 간단하지만 오류가 나타내는 것처럼 정적이 아닌 다른 것에 포트를 연결할 수는 없습니다. 이것이 일반적인 영어로 의미하는 바는 포트를 조합 논리와 연결할 수 없다는 것입니다. 심지어 D => not din(0)도 허용되지 않습니다.

여기서 내가하는 것은 멀티플렉서를 포함하는 것입니다.

signal selected_din : std_logic; 

...

selected_din <= din(count_temp); 

당신은 다음 D => selected_din,으로 라인을 D => din(count_temp),을 대체 할 것이다 : 이것은 간단 할 수 있습니다.


당신은 대안 mux 함수를 작성할 수 있고, 당신의 라인은 D => mux(din, count_temp),과 같을 것이다. 이 함수는 count_temp 값을 기준으로 din에 하나의 요소를 반환합니다.

@ user1155120의 주석에 따르면이 'function'메소드는 작성 당시 GHDL 컴파일러에서 지원하지 않습니다.

+0

설명해 주셔서 감사합니다. – gutelfuldead

+0

@minersrevolt 문제가 없습니다. 대답으로 문제가 해결되면 답안의 왼쪽에있는 '틱 (tick)'을 클릭하여 올바른 것으로 표시합니다. –

+0

@ user1155120 공식이 제약되지 않은 또는 부분적으로 제한된 복합 유형 인 경우이 시나리오에 적용되는 이유는? 공식이 단순히 'std_logic'인이 시나리오에는 적용되지 않는 것 같습니다. 내 대답을 편집하여 'function'메소드가 실제로 GHDL에서 작동하지 않는다고 말하면 좋을까요? –

관련 문제