Counter 설계

설계 요구사항

- CLK의 상승 Edge마다 up_down 신호가 High면 내부 32bit Counter가 증가, Low면 감소

- 상위 3bit를 LED를 활용하여 출력 동작 확인

`timescale 1ns / 1ps

module my_count(
    input RST,
    input CLK,
    input DIR,
    output [2:0] LED
    );
 
 reg [31:0] cnt;            //32bit register로 cnt 값 저장
 
 assign LED = cnt[31:29];   // cnt의 상위 3 bit LED 출력으로 할당
 
 
always @(posedge CLK)       // CLK 의 신호 상승 Edge가 감지될 때마다.
begin
    if(RST == 1'b1)         // Reset 신호가 1일 경우,
        cnt <= 32'd0;       // cnt를 0으로 초기화
    else begin
        if(DIR == 1'b1)     // DIR 신호가 1일 경우,
            cnt <= cnt + 1; // cnt를 1 증가
        else                // DIR 신호가 0이면,
            cnt <= cnt - 1; // cnt 1 감소
     end
end //always

endmodule

위 코드는 counter 작성 Design source 코드 입니다. 우선 위와 같이 코드를 작성 후,

Schematic을 확인 한 후에

I/O 설정 까지 마무리 하고 정상 작동되는지 확인합니다.

처음 Testbench를 하는 것이기 때문에 H/W에서 정상작동 되는 것을 우선 확인 한 후에 Testbench 코드를 추가하여 작성할 것입니다.


Testbench

`timescale 1ns / 1ps

module my_cnttb();
parameter clk_period = 10;

reg RST, CLK, DIR;      // Register 선언 : Testbench에서는 입력신호를 모방하기 위해서 Register를 사용함.
wire [2:0] LED;         //    wire 선언 : 출력 신호를 관찰하기 위해 wire 변수 사용. 
                        // Unit Under Test의 약자로 테스트 대상 단위를 의미함.
my_count uut (          // 모듈 인스턴스화 : 모듈을 인스턴스화 하고 Testbench의 신호를 모듈의 포트에 연결합니다.
    .RST    (RST),
    .CLK    (CLK),
    .DIR    (DIR),
    .LED    (LED)
    );


initial begin           // 초기화 Block : 시뮬레이션의 초기 조건 설정
    RST = 1'b1;         // 1 sig = Reset sig 활성화
    #(clk_period * 20); // 200 대기
    RST = 1'b0;         // 0 sig = Reset sig 비활성화
end // initial rst

initial CLK = 1'b0;     // CLK 초기값 0으로 설정

always #clk_period CLK = ~CLK; // 10ns 마다 CLK 신호를 반전시킨다.

initial begin       
    DIR = 1'b0;         // DIR 초기값 0. 시작방향 설정
    wait (RST == 1'b0); // RST가 0이 될떄 까지 기다린다.(RST 신호 비활성화를 기다린다.)
    #(clk_period * 30); // 300 시간 단위만큼 대기. 시뮬레이션에서의 지연.
    DIR = 1'b1;         // DIR을 1로 변경(방향 반대로 전환)
    #(clk_period * 30); // 300 시간 단위만큼 대기. 변경된 방향의 지속시간.
    DIR = 1'b0;         // DIR을 0으로 변경(원래 방향으로 복귀)
end

endmodule​

Test값이 H/W에 적용된 값과 일치하는 지 확인합니다.