2017-03-07 12 views
1

나는 예컨대, 정의 된 범위의 하위 유형을 만들 수 알고? 기본적으로 ADDRESS 유형의 변수를 만들 때 사용자가 정의 할 '32'값을 그대로 둡니다. 예를 들어파라미터 화 VHDL 하위 유형

F()는 다른 패키지에 미리 정의 된 함수이고, X 어드레스의 인스턴스 생성시에 사용자에 의해 제공된 자연 정수
subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

.

기본적으로 내가 단축 할

...

y : UNSIGNED(f(X) downto 0); 

에 X가 자연

y : ADDRESS(X); 

.

답변

1

음, 그렇습니다. 하지만 쓸 수 없습니다 :

subtype ADDRESS is UNSIGNED range (f(x)) downto 0; 

올바르지 않기 때문에 VHDL. 당신이 작성해야합니다 :

subtype ADDRESS is UNSIGNED (f(x) downto 0); 

x정적해야합니다 경우. 즉 x은 리터럴, 상수 또는 일반이어야합니다.

이 방법으로 함수를 사용하여 상수 및 기타 정적 값의 값을 정의 할 수 있습니다. 그러한 함수에 대한 모든 입력은 정적이어야합니다. 흥미롭게도 이러한 기능은 정교화 과정에서 실행되므로 디버깅하기가 어려울 수 있습니다. 이러한 함수를 디버깅하는 데 문제가있는 경우 일시적으로 함수의 반환 값 대상을 정적이 아닌 무언가 (예 : 변수)로 변경할 수 있습니다. 함수는 시간 0 후에 실행되어 더 쉽게 디버깅 할 수 있습니다. 는 여기에 실제 예제 :

package P is 
    function F(I : integer) return integer; 
end package P; 

package body P is 
    function F(I : integer) return integer is 
    begin 
    if I > 16 then 
     return I - 1; 
    else 
     return (I * 2) - 1; 
    end if; 
    end function F; 

end package body P; 

library IEEE; 
use IEEE.numeric_std.all; 
use work.P.all; 

entity E is 
    constant X : integer := 16; 
end entity E; 

architecture E of E is 
    subtype ADDRESS is UNSIGNED (f(x) downto 0); 
begin 

    process 
    begin 
    report "ADDRESS'left= " & integer'image(ADDRESS'left); 
    wait; 
    end process; 

end architecture E; 

그리고 여기가 EDA Playground에 있습니다.

1

매튜 테일러의 대답은 이미 정확하지만 난 당신이 매크로를 사용하여 C에서 당신의 마지막 질문

y : ADDRESS(X); 

에 댓글을 올리려면 싶지만, VHDL이 불가능합니다. 서브 유형 유형을 리턴하려면 함수 ADDRESS이 필요합니다. IEEE1076-2008 정의

function_specification ::= 
    [ pure | impure ] function designator 
     subprogram_header 
     [ [ parameter ] (formal_parameter_list) ] return type_mark 

:

type_mark ::= 
    type_name 
    | subtype_name 

즉, 반환 유형은 이어야하며으로 이미 정의되어 있어야합니다. 새로운 [sub] 유형 일 수는 없습니다. Matthew가 설명하는 것처럼 하위 유형 정의로 뭔가를 할 수 있습니다.

subtype ADDRESS_X is unsigned(f(X) downto 0); 
signal new_signal : ADDRESS_X;