티스토리 뷰

Verilog HDL를 주제로 한 여덟번째 포스팅부터는 제품을 하나 설계해 보겠습니다.

 

 

 

 

설계의 과정은 설계제안, 설계보완, 최종데모 순으로 포스팅을 진행할것이며 회로도와 변수명, 모듈의 동작원리등이

여러방면으로 수정되고 보완될수 있습니다. 특히 프로젝트 제안에 대한 포스팅의경우 방향성을 제시한것이기때문에

수정될 부분이 많음으로 참고정도만 부탁드립니다!

 

제가 주제로 정한 디바이스는 바로 달력입니다.

 

 

대학교 2학년 시절 디지털시스템설계 과목을 수강하며 한학기 동안 설계한 디바이스 이며

총 세번의 포스팅을 통하여 설계과정을 리뷰할계획입니다.

 

제가 팀장으로 총 3명의 팀 구성원들과 함께 3개월의 기간동안 팀 프로젝트를 진행하였고

설계 프로젝트의 이름은 "알테라사의 싸이클론2 DE2보드를 이용한 디지털 달력 설계"였습니다.

 

저희 팀은 실생활에서 판매되고 있는 달력을 모델로 하여 실제와 똑같이 만드는것에 중점을 두었습니다.

크게 총 3가지의 기능 구현을 목표로 설계를 시작하였습니다.

 

 

스위치를 통하여 모드를 변경할수 있고 모드1에서는 7-segment를 통한 날짜의 표시와 LED를 통한 요일의

표시를 다루었습니다.

모드2 에서는 D-day를 지정하여 현제 set된 날짜로 부터 지정한 D-day까지의 차일을 계산하여 7-segment를 통해

출력될수 있도록 설계하였습니다.

 

 

 

첫번째로 탑모듈의 인터페이스와 모듈의 회로도를 살펴보겠습니다.

 

<Interface>

 

탑모듈의 인터페이스 입니다. 각 모드의 아웃풋은 DE2보드 내에 붉은색 네모영역으로 표시된 7-segment와 

7개의 LED가 있습니다.

인풋은 4개의 push 버튼과 2개의 toggle 버튼을 통하여 신호를 입력 받을수 있도록 하였습니다.

 

 

<Top module>

 

제안 발표때의 탑모듈 회로도는 위의 자료와 같았습니다. 프로젝트를 진행하며 수정된 부분도 많았지만

대략적으로 회로도의 흐름과 각모듈에 대하여 설명드리겠습니다.

 

 

 

첫번째로 Topmodule 회로도의 중상단에 위치한 Year_Month_Day 모듈의 내부 회로도를 통해 리뷰 하겠습니다. 

 

 

<Year_Month_Day Module>

 

회로도의 좌상단에 위치한 모듈은 Digital_Clock입니다. 저번 포스팅까지 다루었던 Digital_clock를 그대로 사용하였고

hour counter의 carry를 clk으로 취하여 day를 count up 할수 있도록 하였습니다.

 

날짜의 셋팅은 회로도 좌하단에 위치한 Demux를 통해 입력신호를 분배하여 set신호가 up되었을때

Day_counter, Month_counter, Year_counter 각 모듈의 countup값을 push버튼을 통해 설정할수 있도록 설계하였습니다.

 

또 날짜 계산 모듈에서 가장 중요하게 여긴 부분은 각월마다 다른 말일 값을 가지고 있기 때문에 month값이 up될때

그때의 status에 알맞은 말일 즉 MOD값을 계산하는 것 이었습니다. 이때 회로의 구조중 Feedback을 이용하였습니다.

Month counter모듈의 count out값을 Feedback하여 Day counter모듈의 month case 인풋 신호로 사용하는 것입니다.

 

만약 month case인풋신호가 11이라면 파라미터 값으로 지정해둔 11월에 해당하는 MOD값인 31로 지정하여 카운터를 돌리는 것입니다.. 이를  Verilog HDL로 코딩하면 아래와 같습니다.

 

parameter jan = 32;
parameter feb = 29;
parameter feb_y = 30;
parameter mar = 32;
parameter apr = 31;
parameter may = 32;
parameter jun = 31;
parameter jul = 32;
parameter aug = 32;
parameter sep = 31;
parameter oct = 32;
parameter nov = 31;
parameter dec = 32;

always @(month_case)
    begin
      case(month_case)
        1 : MOD = jan;
        2 : MOD = feb;
        3 : MOD = mar;
        4 : MOD = apr;
        5 : MOD = may;
        6 : MOD = jun;
        7 : MOD = jul;
        8 : MOD = aug;
        9 : MOD = sep;
       10: MOD = oct;
       11: MOD = nov;
       12: MOD = dec;
       default : MOD = 0;
     endcase

   end

 

 

 

아래의 데모 영상은 month가 5월일 경우 말일인 31일까지 count 되는것을

클럭을 빠르게 돌려 확인해본 결과입니다.

 

 

 

나중 포스팅에서 윤년에 따른 2월의 말일계산 또한 다루어 보겠습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함