빈도가 높은 부품에 대한 HDL 설명 예제 - 카운터

16041 단어 verilogFPGAvhdltech
계수기는 어떤 펄스의 수량, 제조 시기를 세어 볼 수 있으며, 각양각색의 곳에서 사용하는 기본 회로라고 할 수 있다.
사용 방법에 따라 각양각색의 쓰기 방법을 쓸 수 있는데, 아래에 몇 가지 기술 예를 열거한다.

예1


가장 간단한 계수기 설명 예시.시계만 세는 거야.
VHDL
process (RST,CLK) begin
    if (RST = '1')then
        counter <= (others => '0');
    elsif (CLK'event and CLK = '1') then
        counter <= counter + 1;
    end if;
end process;
verilog
always@(posedge RST or posedge CLK) begin
    if (RST == 1'b1) begin
        counter <= 'd0;
    end else begin
        counter <= counter + 1;
    end
end
이 경우 최대치를 세고 0을 되돌려 반복합니다.

예2


예1은 카운트다운의 기술 예다.(8비트의 예)
이 경우 0까지 세면 최대값을 반환하고 작업을 반복합니다.
VHDL
process (RST,CLK) begin
    if (RST = '1')then
        counter <= (others => '1');
    elsif (CLK'event and CLK = '1') then
        counter <= counter - 1;
    end if;
end process;
verilog
always@(posedge RST or posedge CLK) begin
    if (RST == 1'b1) begin
        counter <= 8'hFF;
    end else begin
        counter <= counter - 1;
    end
end
verilog의 경우 모든bit1의 대입은 지정한bit수를 입력하고 최대값을 입력하며 데이터 폭을 매개 변수로 할 때 좀 번거롭습니다.
SystemVerilog의 쓰기 방식은 간단합니다.
SystemVerilog
always@(posedge RST or posedge CLK) begin
    if (RST == 1'b1) begin
        counter <= '1;
    end else begin
        counter <= counter - 1;
    end
end

예3


이번에는 펄스 신호를 세어 최대치 100에 도달한 후 계수를 멈추는 계수기의 예다.
VHDL
process (RST,CLK) begin
    if (RST = '1')then
        counter <= (others => '0');
    elsif (CLK'event and CLK = '1') then
        if (pulse = '1') then
            if (counter < 100) then
                counter <= counter + 1;
            end if;
        end if;
    end if;
end process;
verilog
always@(posedge RST or posedge CLK) begin
    if (RST == 1'b1) begin
        counter <= 'd0;
    end else if (pulse == 1'b1) begin
        if (counter < 100) begin
            counter <= counter + 1;
        end
    end
end

예4


최대치 99부터 펄스 신호의 한쪽 수를 줄이고 0이 되면 최대치를 되돌려주는 계수기의 예.최대치가 99이기 때문에 7비트만 있으면 된다.
VHDL
process (RST,CLK) begin
    if (RST = '1')then
        counter <= "1100011";--99
    elsif (CLK'event and CLK = '1') then
        if (pulse = '1') then
            if (counter = 0) then
	        counter <= "1100011";--99
	    else
                counter <= counter - 1;
            end if;
        end if;
    end if;
end process;
verilog
always@(posedge RST or posedge CLK) begin
    if (RST == 1'b1) begin
        counter <= 7'd99;
    end else if (pulse == 1'b1) begin
        if (counter == 0) begin
	    counter <= 7'd99;
	end else begin
            counter <= counter - 1;
        end
    end
end
최대값이 고정값이면 상수를 설명하고 사용하는 것이 좋습니다.


위의 예에서 비트 너비에 주의하지 않고 잘 쓴 부분이 있다.비트 폭과 최대치 등을 매개 변수화한 카운터를 모듈화해 여기저기 사용하는 경우도 있기 때문에 적절히 조정하는 게 좋다고 본다.

좋은 웹페이지 즐겨찾기