2017-12-05 18 views
0

generate 내부의 정수에서 binary std_logic_vector를 가져 오려고합니다. 예를 들어VHDL : 생성 블록의 반복자를 std_logic_vector로 변환하는 방법은 무엇입니까?

,

0 -> 0000

1 -> 0010

...

15 - -> 1,111

> 0001

2 각 정수에 대해 16 개의 if-else 문을 쓸 수는 있지만이 아이디어는 마음에 들지 않습니다. 나는 두 가지 방법을 사용하려고했습니다

(? 나는 많은 16 개 이상의 정수 번호를 어떻게해야합니다 경우),하지만 그들 중 어느 것도 작동합니다 주소와 히트

G_1 : for i in 0 to 15 generate 
    address <= conv_std_logic_vector(i, 4) when hit(i) = '1'; 
end generate G_1; 

G_2 : for i in 0 to 15 generate 
    address <= std_logic_vector(to_unsigned(i, 4)) when hit(i) = '1'; 
end generate G_2; 

또한 내가 눈치 모두 std_logic_vector 있습니다 내가 번호 대신 번호를 사용하면 작동한다는 것입니다. (예 : conv_std_logic_vector (5, 4)를 사용할 때 "0101"이됩니다.)

내가 뭘 잘못하고 있니? vhdl을 사용하여 가능한 모든 방법이 있습니까?

답변

2

처음에는 use ieee.std_logic_arith.all을 사용하지 마십시오. 대신, use ieee.numeric_std.all, 그리고 어떤 더러운 conv_integer 기능을 제거하십시오; 선호하는 스타일은 unsigned과 같은 형식을 사용하고 두 번째 코드 예제에서와 같이 변환하거나 캐스팅하는 것입니다. 이 양식의 16 개 라인을 생성합니다

G_1 : for i in 0 to 15 generate 
    address <= conv_std_logic_vector(i, 4) when hit(i) = '1'; 
end generate G_1; 

:

루프로 이동, 당신은 generate 루프를 사용하는

address <= conv_std_logic_vector(0, 4) when hit(0) = '1'; 
address <= conv_std_logic_vector(1, 4) when hit(1) = '1'; 
address <= conv_std_logic_vector(2, 4) when hit(2) = '1'; 

등 각 동시 할당이 자신의 과정을 유추하기 때문에, 당신의 디자인은 address 시그널에 다수의 드라이버를 갖게 될 것인데, 이는 종합 적합 디자인에서는 허용되지 않습니다.

hit 벡터의 가장 낮은 세트 ('1') 비트에 따라 address을 설정하는 것이 목표 인 것처럼 보입니다. 이를 우선 순위 인코더라고합니다. 이 신호 유형 unsigned을 사용하고, 유형 캐스트를 절약 할 수, address 이후

process (hit) 
begin 
    for i in 0 to 15 loop 
    address <= (others => '0'); -- Default assignment, any later assignment takes priority 
    if (hit(i) = '1') then 
     address <= std_logic_vector(to_unsigned(i, address`length)); 
     exit; 
    end if; 
    end loop; 
end process; 

는 부호없는 수를 나타내는 것 같다 이런 식으로 뭔가가 더 좋을 것이다.

+0

대단히 감사합니다. 잘 작동합니다.) –

+0

VHDL 2008 이상을 사용하고 있다면 'unsigned'(해결됨) 대신에'u_unsigned' (unresolved)를 사용할 수도 있습니다. 이렇게하면 여러 드라이브 상황에서 오류가 발생합니다. –