디지털 시스템 실험 (학생용)

작성자 : 전기전자전파 공학부 □□□ 학번 : ○○○○○○○○○○

디지털 시스템 실험 KECE210                                                                        전기전자전파 공학부

실험조 : ○○조                    실험일 : 2014.9.

실험제목

BCD to 7 Segment, 7 Segment를 통한 계산기 설계 및 구현

실험목표

1. BCD 입력을 7-segment로 출력하는 디지털 회로 설계

2. Clock을 이용하여 7-Segment를 순차적으로 표현하는 Controller 구현

3. 가산기와 연결하여 계산결과를 표현하는 7-segment 계산기 구현

실험준비물

Altera Quartus II 13 software, HBE-COMBO II-DLD 보드

배경지식

1. 7-Segment 동작원리

일반적인 방법이라면 7-segment의 출력인 'a','b','c','d','e','f','g','.' 가 각각 나와서 8개의   7-segment를 사용할 경우 64개의 출력이 필요하다. 이럴 경우 너무 많은 출력이 필요하므로, 7-segment의 출력은 공통으로 연결되어 있고 출력할 위치를 제어하는 com8 ~ com1의 값을 제어하여 원하는 숫자나 문자를 표시하는 방법을 사용하게 된다. 예를 들어, 1234를 표시하는 경우 7-segment 데이터 값을 "00000110"로 주어 '1'를 표시하는 값을 주고 com1에 '0'을, 그리고 나머지 com2~4는 '1'의 값을 주면 첫째 7-Segment에 1이 표시된다. 다음으로 데이터에 "01011011"을 주어 '2'의 값을 주고 com2에 '0'과 com1,com3~4에 '1'을 주면 둘째 7-Segment에 2가 표시되고 이런 순서로 4까지의 숫자를 표시하고 다시 처음으로 돌아가 위의 내용을 반복한다. 이를 약 1ms 이상의 주기로 반복하면 잔상효과에 의해 "1234"의 숫자가 표시된다.

기본 7-Segment 블록 다이어그램

(선택사항) 가산기 + 7-Segment 블록 다이어그램

☞ 기본 7-Segment 회로를 구현한다. 4-bit unsigned binary 입력을 받아서 7-segment 두 자리(0~15)로 출력하는 회로이다.

(선택사항) 기본 회로를 구현하고 보드에 업로드 후 동작확인이 끝나면 4bit add/sub의 결과값을 출력하도록 수정해본다.

실험방법

BCD-to-7 segment 구현

BCD코드가 생성이 된 것이 확인 되었다면 이제는 BCD 코드를 7-segment 표시를 위한 디코더를 설계할 차례이다. BCD-to-7segment 모듈은 각 자릿수마다 하나씩 필요하다.

1. BCD-to-7 segment 진리표를 채운다.

2. 라인 디코더를 이용하여 4bit 입력과 7bit 출력 2개를 갖는 디코더를 설계한다.  7bit 출력 한 개는 일의 자리를 표현하고 나머지 7bit 출력은 10의 자리를 표현한다. 이 때 라인 디코더에 출력을 선택하여 논리 Gate를 연결하면 7-segment의 a, b, c, d, e ,f, g에 해당하는 논리식을 얻을 수 있고 그 회로를 디코더 출력 단과 연결하면 7-segment 출력 값을 얻을 수 있다.

3. 이에 해당하는 Verilog를 코딩한다.

4. 컴파일 후, 시뮬레이션을 해본다.

5. 모든 모듈이 완성 되었으므로 풀 컴파일 하여 보드에 올려보고 동작하는지 확인한다.

7 segment Controller 구현 (조교 코드제공, 구현필요X)

다음의 그림과 같이 7 세그먼트 컨트롤러를 구현한다. oS_COM(SEG_COM)은 각 세그먼트 모듈(숫자 하나)을 켜거나 끄고 HBE-COMBO에서는 0일 때 켜진다. oS_ENS(SEG_DATA)는 7 세그먼트의 각 획(숫자를 구성하는 LED)이다. 원래대로라면 각 숫자모듈 하나당 각 획을 표시하기 위해서는 (a~g) 7개와 (.) 1개의 신호가 필요하다. 8자리의 숫자가 있으므로 숫자의 각 획을 표시하려면 8*8=64 개의 신호선이 필요하게 된다. 하지만, 대부분의 모듈은 한 클럭에 한 개의 숫자만 켜지는 동적인 방법을 사용하므로 클럭마다 8개의 신호(a~g)값을 각 자리에 맞는 값으로 바꾸면 8개의 신호만으로도 모든 숫자를 나타낼 수 있다.

========================================================================

7 segment Controller 코드

========================================================================

module SevenSeg_CTRL(

iCLK,

nRST,

iSEG7,

iSEG6,

iSEG5,

iSEG4,

iSEG3,

iSEG2,

iSEG1,

iSEG0,

oS_COM,

oS_ENS

);

// I/O definition------------------------------------------

input iCLK, nRST;

input [6:0] iSEG7, iSEG6, iSEG5, iSEG4,iSEG3, iSEG2, iSEG1, iSEG0;

output [7:0] oS_COM;

output [6:0] oS_ENS; /* a,b,c,d, e,f,g,dp */

reg [7:0] oS_COM;

reg [6:0] oS_ENS;

integer CNT_SCAN;

/*

[a]

[f]   [b]

[g]

[e]   [c]

[d]   [dp]

*/

always @(posedge iCLK)

begin

if (nRST)

begin

oS_COM <= 8'b00000000;

oS_ENS <= 0;

CNT_SCAN = 0;

end

else

begin

if (CNT_SCAN >= 7)

CNT_SCAN = 0;

else

CNT_SCAN = CNT_SCAN + 1;

case (CNT_SCAN)

0 :

begin

oS_COM <= 8'b11111110;

oS_ENS <= iSEG0;

end

1 :

begin

oS_COM <= 8'b11111101;

oS_ENS <= iSEG1;

end

2 :

begin

oS_COM <= 8'b11111011;

oS_ENS <= iSEG2;

end

3 :

begin

oS_COM <= 8'b11110111;

oS_ENS <= iSEG3;

end

4 :

begin

oS_COM <= 8'b11101111;

oS_ENS <= iSEG4;

end

5 :

begin

oS_COM <= 8'b11011111;

oS_ENS <= iSEG5;

end

6 :

begin

oS_COM <= 8'b10111111;

oS_ENS <= iSEG6;

end

7 :

begin

oS_COM <= 8'b01111111;

oS_ENS <= iSEG7;

end

default :

begin

oS_COM <= 8'b11111111;

oS_ENS <= iSEG7;

end

endcase

end

end

endmodule

< SevenSeg_CTRL 사용 예제>

SevenSeg_CTRL u3(CLK, nRST, {A1,B1,C1,D1,E1,F1,G1},{A2,B2,C2,D2,E2,F2,G2},0,0,0,0,0,0, SEG_COM, SEG_DATA);

CLK=클럭(PIN_AB11), nRST=리셋버튼

{A1,B1,C1,D1,E1,F1,G1} = 1의자리 7-segment

{A2,B2,C2,D2,E2,F2,G2}= 10의자리 7-segment

SEG_COM, SEG_DATA = PIN assigment 표 참조

7 세그먼트 컨트롤러 개념도(참고용)

[ Pin Assignment ]

디지털 시스템 설계 및 실험 KEEE209                                                                 전기전자전파 공학부