디지털시스템설계 실습 결과보고서학번이름1. 실험 제목FPGA 7-segments 구동 Design2. 실험목표FPGA 7-segments 구동 Design- 7-Segment LED Display 이해- 4-Digit의 7-Segment LED Display의 Rotate 동작의 이해- Up Coming Display(0~9999) 설계3. 실험 내용1) 7-Segments 구동 Design위 왼쪽 사진은 7-Segments로, a, b, c, d, e, f, g를 조합하여 0에서 9까지를 나타낼 수 있다. 또한 오른쪽 사진의 표는 7-Segments의 진리표로 a~g 중 입력 데이터가 1인 부분에 불이 들어와 표시하게 된다. 소수를 나타내기 위해서, 숫자의 오른쪽 아래에 소수점이 붙는 경우가 있는데, 이때 사진의 DP 부분이 소수점이다.(1) Top 모듈top 모듈의 코드이다. clock_12MHz와 RESET을 입력(인풋) 데이터로 설정하고, FND_COM은 0부터 3까지의 벡터를 갖는 4비트, FND_DATA는 0부터 7까지의 벡터를 갖는 8비트 출력(아웃풋) 데이터로 선언한다. 그리고 전선으로 연결된 내부 신호를 clock_24MHz, PLL_locked로 선언하는 Port를 설정한다.PLL 모듈을 사용하여 12MHz clock을 24MHz로 변경하는 코드이다.7-Segment 구현 모듈을 불러오는 코드이다. 이 코드로 7-Segment를 제어한다.2) FND decorder source모듈의 이름을 bin2seg로 설정하고, bin_data를 4비트 2진수인 입력(인풋) 데이터로 선언, seg_data를 8비트 출력(아웃풋) 데이터로 선언한다.입력된 데이터를 7-Segment에 맞게 10진수로 변환하는 코드이다.(3) 7-Segment 제어 모듈Segment 제어 모듈에서 Port 설정하는 코드이다. 입력(인풋) 데이터를 CLK과 RESET으로 설정하였고, 4비트 2진수 FND_COM과 8비트 2진수 FND_DATA를 출력(아웃풋) 데이터로 선언하였다. 그 외의 내부 신호는 ent_time0, cnt64k, cnt4, regseg0 ~ regseg3, seg0 ~ seg3으로 선언하였다.1초를 생성하는 코드이다. RESET이나 CLK이 상승할 때, 이 always문이 실행하게 된다. 만약 RESET이 1이라면, cnt_time0는 22비트 2진수 0으로 초기화되고, 0이라면, 또 다른 if ~ else문이 실행하게 된다. 만약 cnt_time0이 32비트 2진수 23999999보다 작다면, 현재 cnt_time0값에 22비트 2진수 1을 더하고, 그렇지 않다면 cnt_time0는 22비트 2진수 0으로 초기화한다. 이 때, cnt_time0은 24MHz 클럭을 이용한 1초 카운트이며, count하는 시간 간격이다.7-Segment의 시간 간격을 나타내는 코드이다. 그림 21과 마찬가지로 RESET과 CLK이 상승하면, always 문이 실행된다. RESET이 1이면, cnt64k값이 16비트 2진수인 0으로 초기화된다. 만약 RESET이 0이라면, 또 다른 if ~ else문이 실행된다. 만약 cnt64k가 16비트 2진수인 hffff보다 작다면, cnt64k에는 현재 값에 16비트 2진수인 1을 더한 값을 저장한다. cnt64k가 16비트 2진수 hffff보다 크거나 같다면, cnt64k에는 16비트 2진수인 0이 저장된다. 이 때, cnt64k는 64kHz 클럭을 이용한 자리 시간 간격이다.자리를 선택하는 코드이다. 그림 24도 그림 22, 23와 같이 RESET이나 CLK이 상승할 때 always문을 실행한다. RESET이 1이면, cnt4값에 2비트 2진수인 0으로 초기화된다.만약 RESET이 0이라면, 또 다른 if ~ else문이 실행된다. 만약 cnt64k가 16비트 2진수인 hffff와 같다면, 또 다른 if ~ else문이 실행된다. cnt4가 2비트 2진수 11보다 작다면, cnt4에는 현재 값에 2비트 2진수인 01을 더한 값을 저장한다. cnt4가 2비트 2진수 11보다 작거나 같다면, cnt4에는 2비트 2진수인 00이 저장된다. 이 때, cnt4는 7-Segment 자리를 선택한다.1초마다 segment 값을 변화시키는 코드이다. regseg 0 ~ regseg 3에는 4개의 segment에 가각 입력되는 값을 초기화 한다. 그리고 각 segment는 0 ~ 9의 값을 출력할 수 있으며, 0000 ~ 9999 출력을 반복한다.출력할 segment를 선택하는 코드이다. cnt4의 값이 바뀔 때마다 always문이 실행된다. cnt4가 2비트 2진수 00일 때, FND_COM에는 4진수 2비트 1000이 저장된다. cnt4가 2비트 2진수 01일 때, FND_COM에는 4진수 2비트 0100이 저장된다. cnt4가 2비트 2진수 10일 때, FND_COM에는 4진수 2비트 0010이 저장된다.10진수를 segment 값으로 변환해주는 코드이다. 맨 첫 줄은, 가장 왼쪽의 7-Segment에 숫자를 출력하는 코드이고, 그 다음 줄은, 두 번째 7-Segment에, 그 다음 줄은, 세 번째 7-Segment에, 마지막 줄은 맨 오른쪽 7-Segment에 숫자를 출력하는 코드이다.segment를 출력하는 코드이다. FND_COM, seg0 ~ seg3 중 하나의 값이 변하면 always문을 실행하게 되는데, 이 때 FND_COM은 cnt4의 값에 의해 해당하는 segment를 선택한다.FND_COM의 값이 4비트 이진수 1000일 때, FND_DATA에 seg0값을 저장하여 가장 왼쪽에 있는 숫자를 출력한다. 이 때 FND_DATA는 선택된 segment에 표시될 숫자를 정의한다. FND_COM의 값이 4비트 이진수 0100일 때는, FND_DATA에 seg1값을 저장하여 두 번째에 있는 숫자를 출력하고, FND_COM의 값이 4비트 이진수 0010일 때는, FND_DATA에 seg2값을 저장하여 세 번째에 있는 숫자를 출력하고, FND_COM이 1000, 0100, 0010도 아닐 때에는 FND_DATA에 seg3값을 저장하여 맨 오른쪽에 있는 숫자를 출력한다.