2009-10-20 7 views
4

나는VHDL std_logic 신호와 함께 std_logic_vector를 함께 추가하는 방법은 무엇입니까?

douta : in std_logic_vector (3 downto 0); 
doutb : in std_logic_vector (3 downto 0); 
c0 : in std_logic; 
f1 : in std_logic; 
f0 : in std_logic; 
res : out std_logic_vector (3 downto 0); 

나는 간단한 ALU를 구축하기 위해 노력하고있어있어, 및

f1 and f0 both = 1 
res = douta plus b plus c0 

그래서 난

f1 = '1' and f0 = '1' then res <= douta + doutb + c0; 
을 쓸 때이 ALU가 제공하는 기능 중 하나는 입니다

하지만 doutadoutb의 데이터 유형이 std_logic_vector 인 경우 분명히 작동하지 않습니다. costd_logic

내가이 오류를 받았을 때 컴파일

' Error 603 line 34 : Incompatible types for arithmetic operator: LHS=std_logic_vector!18, RHS=std_logic 

나는이 문제를 해결할 수있는 방법을 어떤 생각?

편집 : 또한

f1 = '1' and f0 = '1' then res <= douta + doutb + ("000" & c0); 

하지만 여전히 행운을 시도, 이번에는 컴파일러

LHS=std_logic_vector!7, RHS=array_1_of_std_logic_3_d_0 

답변

0

아 내가 수정을 찾은 것 같아

use ieee.std_logic_arith.all; 

은 우리가

+4

사용하지 마십시오 std_logic_vector 당신이 만약 당신의 아이디어를 줄 것이다 생각 ! 내 대답을 참조하십시오. –

1

당신은 std_logic_vector에 C0 변환 할 수 말한다.

if f1 = '1' and f0 = '1' then 
if c0 = '1' then 
    res <= douta + doutb + "0001"; 
else 
    res <= douta + doutb; 
end if; 
end if; 

이 아마 어쩌면 규소 컴파일러는 좋은 그래서 뭔가, 그 C0이 수정되도록 어쩌면 그것을 쓸 수있는 더 나은 아이디어가의 IT를 합성하므로 성능이 좋은하지 않습니다 ... 나는 VHDL을 만든 이후 오랜 시간이되었습니다 벡터에 넣은 다음 3 개의 douta, doutb 및 변환기 c0을 모두 추가하십시오. 또 다른 옵션은 비트 계산을 수행하는 것이지만 컴파일러를 사용하려면 무엇을해야합니까?

그것은 말도 안되는 소리 수 있지만 당신이이 같은 몇 가지 힌트를 줄 (단지 그것을 밖으로 시도와 같은 작은 예를하지 큰 거래에 의해 출력을 확인) 경우 때로는 컴파일러는 더 나은 결과를 생성 :

if f1 = '1' and f0 = '1' then 
if c0 = '1' then 
    res <= douta + doutb + "0001"; 
else 
    res <= douta + doutb + "0000"; 
end if; 
end if; 

또 다른 조언은, 만약에 결과가 다소 이상하다고 생각하면, 결정되지 않은 상태를 고치기 위해 다른 것을 소개하십시오 (너무 많은 자유가 있다면 일부 컴파일러는 잘못 행동합니다!). 하지만 그건 2004 년으로 돌아가는 나의 경험에서 나온 것입니다 !!!

+0

덕분에, 그래 나는 노력이 의 F1 = '1'과 F0의 = '1'다음 고해상도 <= douta + doutb + ("000"& c0); 그러나 다시 난 그냥 누락 된 비트를 만들 생각했다 모두 1 만 컴파일러를 작동하지 않습니다 말한다 산술 연산자 호환되지 않는 유형! LHS = std_logic_vector (7), 우 = array_1_of_std_logic_3_d_0 나는이 시도 – Jonathan

0

을 @jdehaan 할 :) 감사를 작동하려고 무엇을 당신은 STD_LOGIC을 변환 할 필요가 없습니다 다음 라이브러리를 추가해야 std_logic_vector에 추가합니다. 그냥 그대로 추가 작업을하고, "res"가 최대 응답을 유지할 수있는 충분한 비트를 가지는지 확인하십시오. 이 경우, 이제 res는 5 비트 폭이되어야 오버 플로우가 발생합니다.

작풍으로, 당신의 입력 항구를 "dout"지명하지 말라. 그것은 나쁜 형태입니다. 그것이 그들이 무엇인지 여기에서 그들에게 전화하십시오. 그리고 아키텍처에서 이것을 인스턴스화하는 것보다 "dout"이라는 다른 구성 요소의 출력 포트를이 구성 요소의 "din"에 연결합니다.

8

산술 연산을 수행하려면 std_logic_vector을 사용하지 마십시오. ieee.numeric_std을 사용하고 signed 또는 unsigned 유형을 사용하십시오. 그런 다음 '0'또는 '1'을 추가 할 수 있습니다.

std_logic_arith.all을 사용하는 해결 방법은 표준이 아닌 라이브러리를 사용하는 퍼지 (fudge)로, 툴체인을 변경할 때 이식성 문제를 일으킬 수 있습니다.

나는이에 대한 더 자세한 페이지를 썼다 :

http://parallelpoints.com/node/3 여기 comp.lang.vhdl에 이에 대한 논의가 발생했습니다 : http://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/549e1bbffd35914d/83cc0f19350fc392?hl=en&q=group:comp.lang.vhdl+numeric_std#83cc0f19350fc392 또한 comp.lang.vhdl 자주 묻는 질문에. 제안에 대한

+0

귀하의 평행 점 게시물에 대한 링크가 +1입니다. 가르치고 있었다면, 모든 학생에게 필수 읽기로 만들 것입니다. – rick

+0

@rick에게 감사합니다! 나는 FPGA로 시작한 일부 학부 전자 공학자들에게 강의를 들었고, 잠시 동안 그걸 두드렸다. :) –

관련 문제