일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Multiple transaction
- stepmotor
- SoC
- Interoperability
- ABMA
- APB3
- 카운터
- 펌웨어
- Low-power Interface
- FPGA
- AXI4
- T flip flop
- AXI3
- ordering model
- 구조적모델링
- FGPA #반도체설계 #verilog #시프트레지스터 #uart
- STM32
- 레지스터슬라이스
- Multiple outstanding
- 스텝모터
- ERROR RESPONSE
- atomic access
- Verilog
- cacheable
- AMBA
- QoS
- out-of-order
- single copy atomic size
- 임베디드시스템
- tff
- Today
- Total
CHIP KIDD
[FPGA ] Verilog 분,초 시계 만들기 / 동작점 모델링 본문
지난시간, 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 칩은 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를 생성한다.
Display 모듈 부분의 Schmatic을 보면, Cat은 일의자리 10의자리의 위치를 구별해주는걸 볼 수있다. 아래의 버퍼때문에 Cat에 1을 넣어줄때 왼쪽은 0의값이 되고 오른쪽은 버퍼 두개를 거치기 때문에 그대로 High 값이 입력이 된다. 따라서 Cat = 0이 될때 변경되는 부분을 일으자리로 선택하고 Cat =1이 될때 변경되는 부분을 10의자리로 설정하여 자리수를 구별해준다. 마지막으로 hax_value 에 Data를 넣어주어 동작되게 한다.
아래는 분 초를 표시하는 시계 모습.
'반도체 > FPGA - Verilog' 카테고리의 다른 글
[FPGA] - Stop Watch 구현하기 (Verilog C) (1) | 2021.03.31 |
---|---|
[FPGA] Manual (0) | 2021.03.12 |
[FPGA] T Flip Flop 을 이용한 up/down Counter 모듈 설계 (0) | 2021.03.12 |
FPGA/ ASIC/ SoC 구분 (0) | 2021.03.11 |
[FPGA] 시프트 레지스터 Shift Register - SIPO/PISO (0) | 2021.03.11 |