Stop_watch_ctl_sig_gen
// Digilent Cora-Z7 Board
//-- xc7z007sclg400-1
module stop_watch_ctl_sig_gen
(
input rst , // USER_DIO1 <L19>
input clk , // 125MHz
//
output reg pls_1mhz , // 1MHz Pulse Output
output reg pls_1khz , // 1KHz Pulse Output
output reg pls_100hz // 100Hz Pulse Output
);
reg [6:0] hcnt;
reg [15:0] kcnt;
reg pl0,pl1;
reg [3:0] plcnt;
// 1MHz Pulse Generation
always@(negedge rst, posedge clk)
begin
if (rst == 0)
begin
hcnt <= 0; pls_1mhz <= 0;
end
else if (pl1 & ~pl0)
begin
if (hcnt < 24)
hcnt <= hcnt + 1;
else
hcnt <= 0;
if (hcnt < 12) pls_1mhz <= 0;
else pls_1mhz <= 1;
end
end
// Ouput Signal Generation
always@(negedge rst, posedge clk)
begin
if (rst == 0)
begin
pls_100hz <= 0; pls_1khz <= 0;
end
else
begin
pls_1khz <= pl1;
if (plcnt < 5) pls_100hz <= 0;
else pls_100hz <= 1;
end
end
// 100Hz Pulse Generation
always@(negedge rst, posedge clk)
begin
if (rst == 0)
plcnt <= 0;
else if (pl1 & ~pl0)
if (plcnt < 9)
plcnt <= plcnt + 1;
else
plcnt <= 0;
end
// 1KHz Pulse Generation
always@(negedge rst, posedge clk)
begin
if (rst == 0)
begin
kcnt <= 0; pl0 <= 0; pl1 <= 0;
end
else
begin
pl1 <= pl0;
if (kcnt < 62499)
kcnt <= kcnt + 1;
else
begin
kcnt <= 0;
pl0 <= ~pl0;
end
end
end
endmodule
여러 클럭을 순차적으로 생성하고, 각각의 클럭이 다른 클럭의 생성에 영향을 미치는 방식인 클럭 디바이더 또는 분주기라고 불리는 방식으로 만듭니다. 하나의 높은 주파수 클럭을 기반으로 하여 여러 하위 주파수 클럭을 파생시키는데 이는 주로 디지털 회로에서 클럭 신호의 주파수를 낮추기 위해 사용합니다.
- 먼저 시스템클록이 125MHz (125,000,000) 이기 때문에 62500 카운터를 기점으로 반전되는 변수를 하나 생성합니다62500을 기점으로 값이 토글이 되어 해당 변수는 하나의 거대한 클록이 됩니다. pl0는 62,500을 기점으로 반전되기 때문에 시스템 클록이 125MHz (즉 1초) 에서 1kHz의 주파수 파형을 만들어낼 수 있습니다
- pl1이 1, pl0가 0인 기점으로 plcnt를 하나씩 증가시킵니다. 그러면 총 카운터로는 1,250,000번이 되었을 때 plcnt가 총 10번 증가하게 되고 plcnt가 5를 기점으로 토글하게 되면 100Hz가 생성됩니다. (초당 100번)
'하만 세미콘 아카데미 > Verilog HDL' 카테고리의 다른 글
직무종합 - 원격제어 스톱워치 이론 Part2 (0) | 2024.08.31 |
---|---|
[직무종합 프로젝트] 원격제어 스톱워치 이론 (0) | 2024.08.30 |
AXI4 - Lite (실습) (0) | 2024.06.26 |
SPI 통신 이론 & 실습 (0) | 2024.06.25 |
AXI 수업내용 정리 및 실습 (0) | 2024.06.14 |