VHDL에 관한 질문입니다..
글쓴이: leecc / 작성시간: 수, 2011/10/12 - 11:26오후
library ieee;use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity bcd_adder is
port(bcd, x : in std_logic_vector(7 downto 0);
bcd_out: out std_logic_vector(7 downto 0));
end bcd_adder;
architecture struct of bcd_adder is
begin
process( bcd )
begin
if (bcd + x) >9 then
bcd_out <= (bcd + x) + "0110";
else
bcd_out <= (bcd + x);
end if;
end process;
end struct;
이 소스가 bcd 4비트에서 어떤 x의 값을 넣어서 더하는 것입니다. 보시다시피 그런데 이걸 bcd 8비트 로 바꾸고 어떠한 x값을 넣고 더하는 것을 해야하는데 어떻게 해야할지 잘 모르겠어요.. ㅠ 도움 요청합니다.ㅠ
Forums:
숙제와 리포트는 스스로
숙제와 리포트는 스스로
------------------------------
How many legs does a dog have?
아하핫... ^^;;;
저도 예전에는 '숙제는 집에서 하세요.' 라고 생각했는데,
거꾸로 '복학생'이나, 나이 들어 공부하시는 만학도의 입장이 되어보니
'아, 스스로 공부하기 어렵겠구나.' 하는 생각이 듭니다.
분명 숙제와 리포트는 스스로 해야 하겠지만,
자신이 무엇을 모르고, 무엇을 공부해야 하는지조차 몰라서,
처음부터 '이건 어떻게 해야 하나요?' 라는 질문을 하는 경우가
있을 수 있다고 생각합니다.
답을 알려줄 수는 없겠지요.
그런만큼, 이런 내용의 글에는 심혈을 기울여서
무엇을 공부해야 할지 가르쳐줘야 한다고 생각합니다. :)
BCD 가산기를 구현하는 것이로군요?
BCD(Binary Converted Decimal) 가산기는 10진 계산을 하기 위해서,
각 자릿수마다 4bit 출력을 해야 하지요. 즉, 4bit 신호가 한 자리가 되는 것입니다.
글에 써주신 소스코드는 처음엔 4bit BCD 가산기였지요?
Entity 부분의 Port Signal 범위를 8 bit 으로 맞추어 놓으셨으리라 생각합니다.
왜 그렇게 생각했냐면, Architecture 부분의 process 안에서는 9보다 클 경우를 조건으로 가지고 있기 때문입니다.
자, 질문 내용에서 말씀하신 8 bit BCD 가산기는 10진수로 10의 자리와 1의 자리를 표현하는 가산기를 의미하는 것입니다.
그렇다면 먼저 '수체계'부터 확인해보시는 것이 좋습니다.
BCD 표현 => 10진수
0000 0000 => 0 0
0000 0001 => 0 1
0000 0010 => 0 2
0000 0011 => 0 3
...
0000 1001 => 0 9
0001 0000 => 1 0
0001 0001 => 1 1
0001 0010 => 1 2
0001 0011 => 1 3
...
0001 1001 => 1 9
0010 0000 => 2 0
...
1001 1001 => 9 9
자, 위의 수 변환 체계에서 십의 자리가 한자리 올라갈 때에 BCD 코드는 1001(9)에서 0000(0)으로 바뀌며 상위 자릿수가 바뀌는 것입니다.
본래 4bit BCD Adder를 '전가산기'(올림수를 출력하고, 아랫자리에서의 올림수를 더할 수 있도록 만든 가산기) 형태로 만든다면, 2개를 붙여서 BCD 8 bit Adder 를 만들 수 있는 것입니다.
만약, 그렇게 만들기가 어렵다면, (package 문을 쓸 줄 몰라서, 혹은 Port Mapping을 할 줄 몰라서 Entity를 불러올 줄 모른다면,)
process 구문 다음에 variable 변수 bcd_carry를 4 bit로 지정한 후,
bcd의 하위 4bit 와 x의 하위 4bit를 더해서
i) 9보다 클 경우, bcd_carry에 0001 을 입력하게 하고, bcd 하위 4 bit 와 x 하위 4 bit 의 더한 값에서 1100 을 빼고, 그 나머지 값을 bcd_out의 하위 4bit에 저장합니다.
ii) 9보다 크지 않을 경우, bcd 하위 4bit와 x 하위 4 bit 를 더한 겂을 bcd_out의 하위 4bit에 바로 저장합니다.
그리고 bcd_carry와, bcd 의 상위 4 bit, x 의 상위 4 bit 를 더해서 bcd_out의 상위 4bit에 저장하면 됩니다. 물론, 이 값도 범위값인 1001을 넘어갈 수 있으니, 일의 자리처럼 1001을 넘어가면 1100을 빼도록 하셔도 좋습니다. (이게 100점짜리겠죠?)
이론을 이해한다면, 직접 구현하는 것은 어렵지 않다고 생각합니다. 불안하시면 다시 수정하셔서 올려주시면, 잘못된 부분을 고쳐드리겠습니다. :)
댓글 달기