열거 형을 사용할 수 있습니다. 가장 좋은 방법은 정수 대신 열거 형에 의해 인덱싱 된 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_slv
및 to_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의 포트는 필요 없다.)
이제 디자인은 버스 구조 변경으로부터 보호된다. 주소 너비를 변경하거나 인터럽트 신호를 추가하면 레코드 선언과 실제 사용자 만 변경됩니다. 계층 구조 전체에 새로운 신호를 추가 할 필요가 없습니다 ...
첫 번째 제안은 어떻게 생겼을까요? 또한 cntrl_signals는 엔티티 포트 선언에 있고 외부에서 볼 수 있기 때문에 std_logic_vector 여야합니다. – c0m4
+1 :'std_logic_vector (그리고 일반적으로 VHDL의 유형 시스템)를 상상력을 사용하면 VHDL을 뒤로 잡고 있습니다 ... ' –
와우, 좋은 정보! 고맙습니다! – c0m4