2017-09-13 3 views
1

나는 같은 클럭에서 샘플링 되나 (논리적으로는 병렬 버스가 아닌) 여러 개의 입력을 가지고있다. 코드를 수정해야합니다. 대부분의 의도와 목적, 배열과 벡터가 꽤 많이 처리 할 수 ​​있습니다 들어VHDL : std_logic의 배열을 사용하는 것과 std_logic_vector의 하위를 사용하는 것

subtype my_subtype is std_logic_vector(my_width - 1 downto 0); 
signal my_signal : my_subtype; 

:
이전에, 그들은 지금까지

type my_type is array (my_width - 1 downto 0) of std_logic; 
signal my_signal : my_type; 

으로 정의하고, 이러한 목적을 위해, 나는 항상이 사용 같은, 그래서 내 질문은 :
어떤 일을하는 어떤 방법에 어떤 이점이 있습니까? 선호/표준 방법이 있습니까?

+3

둘 다 작동합니다. 하나는'ieee.std_logic_1164' 패키지의'std_logic_vector'에 대해 선언 된 모든 연산자와 기능에 대한 액세스를 제공합니다. 다른 하나는 직접 작성하고 테스트해야한다는 것입니다. 그것은 생각할 필요가 없습니다. –

+2

신호가 병렬 버스를 나타내지는 않지만 신호는 같은 종류의 컬렉션을 나타 냅니까? 예를 들어, 8 개의 상태 LED가 일관된 '바이트'로 해석되지는 않지만 적어도 모든 상태 LED입니다. 예를 들어 쓰기 가능, 재설정, 시계와 같은 이질적인 종류의 것들에 대해서는 벡터가 아닌 레코드에 넣으 려합니다. –

+0

@scary_jeff 이것들은 상태 LED 예제와 같습니다. 실제로 모든 슬레이브가 동일한 SCK와 CS에 연결되어있는 여러 MISO 라인입니다. (이상한 하드웨어입니다) – DLnd

답변

0

차이점은 strong typing과 관련이 있습니다.

첫 번째 코드에서는 새로운 유형을 만듭니다. 독립적이며 다른 유형과 호환되지 않습니다. 그냥 코드의 다음 조각을 고려

entity e is end entity; 
library ieee; 
architecture a of e is 
    use ieee.std_logic_1164.all; 
    type slv1_t is array (15 downto 0) of std_logic; 
    signal slv1 : slv1_t; 
    type slv2_t is array (7 downto 0) of std_logic; 
    signal slv2 : slv2_t; 
begin 
    slv2 <= slv1(7 downto 0); 
end architecture; 

와 ModelSim에서 컴파일이 코드는 오류를 줄 것이다 : 코드의 두 번째 부분에 대한

Error: C:/HDL/TypeVsSubtype/Type.vhd(10): Cannot resolve slice name as type slv2_t.

를 기본 유형은 여전히 ​​std_logic_vector이다. 따라서 부속 유형은 호환 가능합니다. 다음 코드를 고려하십시오.

entity e is end entity; 
library ieee; 
architecture a of e is 
    use ieee.std_logic_1164.all; 
    subtype slv1_t is std_logic_vector(15 downto 0); 
    signal slv1 : slv1_t; 
    subtype slv2_t is std_logic_vector(7 downto 0); 
    signal slv2 : slv2_t; 
begin 
    slv2 <= slv1(7 downto 0); 
end architecture; 

이것은 컴파일됩니다 (즉, 오류 없음).

관련 문제