티스토리 뷰
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
'Language > Verilog HDL' 카테고리의 다른 글
Verilog HDL - Digital Calendar_제안(Day calc module) (0) | 2021.02.06 |
---|---|
Verilog HDL - Digital Calendar_제안 (Year Mon Day module) (0) | 2021.02.03 |
Verilog HDL - Digital_clock(basic) (0) | 2021.02.01 |
Verilog HDL - Sec counter (1) | 2021.01.29 |
Verilog HDL - Clock Generator (1) | 2021.01.29 |