Verilog (Counter, Blocking/Non-Blocking)

Park SeungChan·2024년 5월 12일
0

Verilog

목록 보기
3/8

Counter

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회로가 된다.

Blocking/Non-Blocking

Verilog에서 구문을 기술할 때 Blocking과 Non-Blocking 두가지 방식이 있다.

Blocking
"=" 를 사용하며 C언어와 같이 순차적으로 실행되는 특징을 가지고 있다.

Non-Blocking
"<=" 를 사용하며 모든 항목이 동시에 실행되는 특징을 가지고 있다.

Blocking은 조합회로에서 Non-Blocking은 순차회로에서 사용된다.

profile
RTL Circuit Design & Verification

0개의 댓글

관련 채용 정보