티스토리 뷰

Verilog HDL를 주제로 한 일곱번째 포스팅에서는 Digital_clock에서 am/pm 이 표시되는 12시간체제의 Digital_clock을 설계해 보겠습니다.

 

 

 

먼저 지난 포스팅에서 다룬 내용을 복습해보겠습니다.

sec counter - MOD 60 Counter의 clk으로 1Hz을 취해 60초마다 carry가 발생하는 초 시계

min counter - MOD 60 Counter의 clk으로 sec counter의 carry를 취하여 60초마다 count가 up되는 분 시계

hour counter - MOD 24 Counter의 clk으로 min counter의 carry를 취하여 60분마다 count가 up되는 시 시계

위 세가지 counter를 이용하여 저번 포스팅까지 간단한 Digital_clock을 완성 했었습니다.

 

 

이번 포스팅에서는 Digital_clock의 hour counter에서의 아웃풋값을 조정하여 am/pm이 출력되는

12시간 체제의 Digital_clock을 설계해 보겠습니다.

 

hour counter에서는 mod 24의 count_out값은 1,2,3,4 ... ... 22,23 이런식으로 나올것입니다.

이 아웃풋값으로 am pm을 구분하기 위해 저는 조건문을 하나 생각해보았습니다

만약 count가 12보다 크거나 같다면 pm, 12보다 작다면 am으로 말이죠.

 

Verilog HDL의 문법으로 풀어본다면 아래와 같습니다.

 

if(in_Hour_Binary<12)
   begin
      ampm <= A;
   end
else
   begin
      ampm <= P;
   end

이때의 count 값 또한 변하겠죠 만약 22시라면 pm 10로, 17시 라면 pm 5로 표기되어야 합니다.

이를 표현하기 위해 조건문안에 12보다 크거나 같을땐 count 값에서 -12를 하여 주었습니다.

 

if(in_Hour_Binary<12)
   begin
      ampm <= A;

      out_Hour_Binary <= in_Hour_Binary;
   end
else
   begin
      ampm <= P;

      out_Hour_Binary <= in_Hour_Binary-12;
   end

 

 

최종적으로 토글 스위치를 사용하여 모드를 변경할수 있게 하였습니다. 스위치가 올라간다면

12시간체계를 사용하는 am/pm시계가 되고 스위치가 올라가있지 않을때는 24시간체계를 사용하는

시계가 될수 있도록 말이죠.

 

스위치를 통해 7-segment에 출력되는 값을 선택할수 있게 모듈을 설계하고 기존의 탑모듈에서 불러와

사용하였습니다.

 

 

Verilog HDL code)

 

 

top module

 

module Digital_clock_24 (sw ,RST , CLK_50MHz, Sec_o, Sec_t, Min_o, Min_t,Hour_o, Hour_t,Ampm_o);
    input CLK_50MHz;
    input RST;
    input sw;
    output [6:0] Sec_o, Sec_t;
    output [6:0] Min_o, Min_t;
    output [6:0] Hour_o, Hour_t;
    output [6:0] Ampm_o;

    wire CLK_1Hz;
    wire [5:0]Sec_Binary;
    wire [5:0]Min_Binary;
    wire [5:0]Hour_Binary;
    wire [5:0]Hour_Binary_ap;
    wire Carry_to_min;
    wire Carry_to_hour;

 

    clock_gen U1 (.RST(RST) , .CLK_50MHz(CLK_50MHz) , .CLK_1Hz(CLK_1Hz));
    clock_sec U2 (.RST(RST) , .binary(Sec_Binary), .CLK_1Hz(CLK_1Hz), .carry_to_min(Carry_to_min));
    counter U3 (.clk(Carry_to_min),.rst(RST), .count_out(Min_Binary), .carry_out(Carry_to_hour));
    counter #(24,$clog2(24)) U4 (.clk(Carry_to_hour),.rst(RST), .count_out(Hour_Binary));

    Hour_count (.in_Hour_Binary(Hour_Binary), .sw17(sw),.out_Hour_Binary(Hour_Binary_ap), .ampm(Ampm_o));

 

    Binary_to_SevenSeg BS1(.Binary_in(Sec_Binary), .O(Sec_o), .T(Sec_t));
    Binary_to_SevenSeg BS2(.Binary_in(Min_Binary), .O(Min_o), .T(Min_t));
    Binary_to_SevenSeg(.Binary_in(Hour_Binary_ap), .O(Hour_o), .T(Hour_t));

endmodule

 

 

 

Hour_count

 

module Hour_count (in_Hour_Binary, sw17,out_Hour_Binary, ampm);
    input [6:0] in_Hour_Binary;
    input sw17;

    output reg [6:0] out_Hour_Binary;
    output reg [6:0] ampm;


    parameter A = 7'b0001000;
    parameter P = 7'b0001100;
    parameter BLANK = 7'b1111111;

    always @ (sw17)
      begin
        if(!sw17)
          begin
            out_Hour_Binary <= in_Hour_Binary;
            ampm <= BLANK;
          end
        else
          begin
            if(in_Hour_Binary<12)
              begin
                 out_Hour_Binary <= in_Hour_Binary;
                 ampm <= A;
              end
          else
              begin
                 out_Hour_Binary <= in_Hour_Binary-12;
                 ampm <= P;
              end
         end
     end
endmodule

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
31
글 보관함