2012-12-10 2 views
5

하여 std_logic_vector 나는 이런 std_logic_vector 있습니다.어떻게 인덱스에 열거

constant CLK_SIG:integer := 0; 
constant EN_SIG:integer := 1; 
constant FOO_SIG:integer := 2; 
constant BAR_SIG:integer := 3; 
constant BAZ_SIG:integer := 4; 

아이디어는 벡터를 색인화하는 데 사용하는 것입니다.

cntrl_signals <= (CLK_SIG=>1,EN_SIG=>1,others=>0); 

제 질문은 인덱스를 선언하는 멋진 속기 방법 (예 : C의 열거 형)이 있습니까?

답변

11

열거 형을 사용할 수 있습니다. 가장 좋은 방법은 정수 대신 열거 형에 의해 인덱싱 된 std_logic의 벡터를 선언하는 것입니다. 자세한 내용은

type Control_Signals is record 
    Clk : std_logic, 
    En : std_logic, 
    Foo : std_logic, 
    Bar : std_logic, 
    Baz : std_logic 
end record; 

편집, 주석 다음 :

std_logic_vector (그리고 일반적으로 VHDL의 타입 시스템)의

상상력이 사용 들고 VHDL

그러나 아마 더 나은

대신 벡터의 기록을 것 back ...

최상위 엔티티 인 경우 std_logic_vector 포트를 사용하여 최상위 레벨 테스트 벤치에서 합성 가능 설계를 위해 합성 후 넷리스트를 대체 할 수 있습니다. 또는 std_logic_vector 포트를 고집하는 구식 코딩 스타일 지침을 준수해야 할 수도 있습니다.

그러나 다른 모든 상황에서는 패키지에 레코드를 선언하고 디자인 전체에 걸쳐 패키지를 사용하며 레코드 유형의 포트를 만듭니다. 패키지에는 실제로 std_logic_vectors가 필요할 때 (희귀 할 경우) 적절한 경우에 to_slvto_control_sigs 함수가 포함되어야합니다.

동일 열거으로 적용

type Controls is (Clk, En, Foo, Bar, Baz); 
type Control_Signals is array(Controls) of std_logic; 
My_Bus_Ctrl : Control_Signals := (Clk => '1', En => '1', others => '0'); 
My_External_SLV_Port <= std_logic_vector(My_Bus_Ctrl); 

물론, 열거 좀 더 강력한 C보다이고; 배열 인덱스 유형으로 사용할 때뿐만 아니라 루프를 반복 할 수도 있습니다. 열거 형을 업데이트 할 때마다 루프가 계속 유지됩니다!

열거로 인덱싱 된 레코드 또는 배열 모두 작동합니다. 나는 객체 지향적 인 연습에 맞춰 좀 더 깨끗하고 더 많은 레코드를 선호한다.

엔티티 포트에 사용하는 경우 매우 유용합니다. 단일 포트에서 방향을 혼합 할 수 없기 때문에 발신 버스 신호 (주소 및 데이터 포함) 및 수신 신호에 대해 하나의 레코드 (또는 배열!)를 선언하십시오 ... (요즘 FPGA에는 양방향 신호가 없습니다. 그래서 제 3의 포트는 필요 없다.)

이제 디자인은 버스 구조 변경으로부터 보호된다. 주소 너비를 변경하거나 인터럽트 신호를 추가하면 레코드 선언과 실제 사용자 만 변경됩니다. 계층 구조 전체에 새로운 신호를 추가 할 필요가 없습니다 ...

+0

첫 번째 제안은 어떻게 생겼을까요? 또한 cntrl_signals는 엔티티 포트 선언에 있고 외부에서 볼 수 있기 때문에 std_logic_vector 여야합니다. – c0m4

+3

+1 :'std_logic_vector (그리고 일반적으로 VHDL의 유형 시스템)를 상상력을 사용하면 VHDL을 뒤로 잡고 있습니다 ... ' –

+0

와우, 좋은 정보! 고맙습니다! – c0m4

1

브라이언은 가장 좋은 대답을 가지고 있지만, 정보의 다른 비트 :이 같은 열거 만들 수 있습니다

: 당신이 signal 또는 해당 유형의 variable이있는 경우

type some_type is (clk, en, foo, bar, baz); 

, 당신은을 사용할 수 있습니다 'pos 속성은 숫자로 다시 변환 :

variable v : some_type := foo; 

v'pos는 정수를 반환합니다 2

+2

옳았습니다. 대답은 오래되었습니다! 그러나 'pos와 그 반대로, foo를 반환하는 some_type'val (2)는 매우 유용 할 수 있습니다. –

+0

그것이 하나의 뜨거운 것으로 합성하면 어떻게 될까요, pos는 요소 나 값의 수를 알려줄까요? 즉, 한 번 뜨거워지면 baz가 4 또는 16을 제공합니까? –

+0

'pos는 항상 타입 배열의 위치를 ​​제공합니다 (VHDL-2008의 16.2.2 절). 신디사이저가 그 값을 다른 표현에 매핑하면, 'pos'의 값을 요구할 때 다시 그것을 변환하는 논리를 제공해야합니다. –

관련 문제