4digit FND를 이용해 0부터 9999까지 Count하는 Counter를 설계할것이다.
0.1초 간격 Count
초기화 버튼
module counter #(
parameter MAX_COUNT = 4
) (
input clk,
input reset,
output [$clog2(MAX_COUNT)-1:0] count
);
reg [$clog2(MAX_COUNT)-1:0] counter = 0;
assign count = counter;
always @(posedge clk, posedge reset) begin // 비동기 reset
if (reset == 1'b1) begin
counter <= 0;
end else begin
if (counter == MAX_COUNT - 1) begin
counter <= 0;
end else begin
counter <= counter + 1;
end
end
end
endmodule
always문으로 reset의 rising edge를 감시하면서 rising edge가 감지되면 count를 초기화한다.
clk divider와 fndController에서도 counter모듈과 똑같이 reset을 적용한다.
module UpCounter_10k (
input clk,
input reset,
output [3:0] fndCom,
output [7:0] fndFont
);
wire w_clk_10hz;
wire [13:0] w_count_10k;
clkDiv #(
.MAX_COUNT(10_000_000) // 0.1초
) U_ClkDiv ( // parameter에 매개변수와 같이 값 입력
.clk (clk),
.reset(reset),
.o_clk(w_clk_10hz)
);
counter #(
.MAX_COUNT(10000) // 10000 count
) U_Counter_2bit (
.clk (w_clk_10hz),
.reset(reset),
.count(w_count_10k)
);
fndController U_FndController (
.clk(clk),
.reset(reset),
.digit(w_count_10k),
.fndFont(fndFont),
.fndCom(fndCom)
);
endmodule
100MHz를 10M로 dividing하면 10Hz 즉 0.1sec의 주기가 발생한다.
divider를 통해 나온 clk을 10000번 count하면 Counter회로가 된다.
Verilog에서 구문을 기술할 때 Blocking과 Non-Blocking 두가지 방식이 있다.
Blocking
"=" 를 사용하며 C언어와 같이 순차적으로 실행되는 특징을 가지고 있다.
Non-Blocking
"<=" 를 사용하며 모든 항목이 동시에 실행되는 특징을 가지고 있다.
Blocking은 조합회로에서 Non-Blocking은 순차회로에서 사용된다.