CHIP KIDD

[FPGA ] Verilog 분,초 시계 만들기 / 동작점 모델링 본문

반도체/FPGA - Verilog

[FPGA ] Verilog 분,초 시계 만들기 / 동작점 모델링

쑨야미 2021. 3. 11. 18:36

지난시간, T flip flop을 이용하여 UP counter를 만들어 보았습니다. 

Up counter를 활용한 BCD up counter를 이용하여 구조적 모델링을 통한 시계를 만들 수 있지만, 

이번 시간에는 동작점 모델링을 이용하여 간단하게 분, 초를 나타내는 시계를 만들어 보겠습니다.  

 

module watch(
    input clk,
    output [6:0] seg_7_sec,
    output [6:0] seg_7_min,
    
    output reg [1:0]cat
    );
    
    reg [26:0] cnt27;  //counter = memory -> register
    reg [3:0] sec_1, sec_10, min_1, min_10;
    reg [16:0] cnt_msec;
    reg [3:0] hex_value_sec;
    reg [3:0] hex_value_min;
    
    //두개의 디코더 7 seg를 사용하기 때문에 
    decoder_7_seg G0 (.hex_value(hex_value_sec), .seg_7(seg_7_sec));  
    decoder_7_seg G1 (.hex_value(hex_value_min), .seg_7(seg_7_min));
    
    always @ (posedge clk) begin   //동작점 모델링 특징
         
         cnt27 = cnt27 + 1;   //1초 125Mhz 27bit = 27'h773593f (hexa)//한문장을 이용하여 간단하게 카운터 구현
         
         if(cnt27 > 27'h773593f) begin     
            cnt27 = 0; //1sec 되면 초기화
            sec_1 = sec_1 + 1;
            if (sec_1 > 9) begin
                sec_1 = 0;
                sec_10 = sec_10 +1;
                if (sec_10 >5) begin
                    sec_10 = 0;
                    min_1 = min_1 +1;
                    if(min_1 > 9) begin
                        min_1 =0;
                        min_10 = min_10+1;
                        if(min_10>5)begin
                            min_10 = 0;
                        end
                    end
                end                                            
            end   
         end    // bcd counter 동작점 모델 
         
         cnt_msec = cnt_msec+1;
         if (cnt_msec > 17'h1E848_) begin 
            cnt_msec = 0;
             if(cat[0]&&cat[1]) begin
                cat[0] = 0;
                cat[1] = 0;
                hex_value_sec = sec_1;
                hex_value_min = min_1;
            end
            else begin
                cat[0] = 1;
                cat[1] = 1;
                hex_value_sec = sec_10;
                hex_value_min = min_10;  
            end
         end
    end
    

동작점 구현을 하기 위해서는 사용하는 FPGA칩이 제공하는 System Clock에 대한 정보를 알고 있어야한다. 

zybo datasheet

 제가 사용하는 Zybo 칩은 125MHz System Clock을 제공한다. 즉 1초에 125,000,000hz 의 clock이 들어오며, 이를 2진수화 하면 27bit(27자리)수가 나온다. 따라서 매 clock 마다 000 0000 0000 0000 0000 0000 0000 비트에 1만큼 증가하는 동작 함수를 만들면 1초에 125MHz가 지나가는 카운터가 생성이된다.  이를통해 각자리수 sec_1, sec_10, min_1, min_10에 대한 Data를 생성한다.

 생성된 데이터를 hex_value 의 변수에 입력하면, 이는 7_seg용 Decoder에 값을 전달하여 led로 출력할 Data를 생성한다. 

7 seg Display module 칩의 Schematic

Display 모듈 부분의 Schmatic을 보면, Cat은 일의자리 10의자리의 위치를 구별해주는걸 볼 수있다. 아래의 버퍼때문에  Cat에 1을 넣어줄때 왼쪽은 0의값이 되고 오른쪽은 버퍼 두개를 거치기 때문에 그대로 High 값이 입력이 된다. 따라서 Cat = 0이 될때 변경되는 부분을 일으자리로 선택하고 Cat =1이 될때 변경되는 부분을 10의자리로 설정하여 자리수를 구별해준다. 마지막으로 hax_value 에 Data를 넣어주어 동작되게 한다.  

 

아래는 분 초를 표시하는 시계 모습.

분,초 동작 구현