Always 블록
Coddy Verilog 여정의 기초 섹션에 포함된 레슨. 90개 중 46번째.
절차적 블록은 C나 Python 같은 소프트웨어 프로그래밍 언어에서처럼 문이 순서대로 하나씩 차례로 실행되는 코드 블록입니다. Verilog에는 두 가지 절차적 블록이 있습니다. initial(한 번 실행됨)과 always(계속 실행됨)입니다. 먼저 always 블록부터 살펴보겠습니다.
always 블록은 지속적으로 실행됩니다. 시뮬레이션이 시작되면 계속 반복됩니다. 플립플롭, 카운터, 조합 논리처럼 계속 동작해야 하는 하드웨어를 설명하는 데 사용됩니다.
기본 구문:
always @(sensitivity_list) begin
// 반복해서 실행되는 코드
end@(sensitivity_list)는 블록이 언제 실행될지를 알려 줍니다. 이것이 없고 내부에 #5와 같은 지연도 없으면, 블록은 무한 루프를 돌며 시뮬레이션을 멈추게 됩니다.
항상 블록 예제: 카운터
always 블록을 사용해 카운터를 만드는 방법의 예시입니다.
module counter (
input clk,
output reg [3:0] count
);
always @(posedge clk) count <= count + 1;
endmodule이 코드의 작동 방식
| 부분 | 의미 |
|---|---|
always | 이 코드를 영원히 반복해서 실행합니다 |
@(posedge clk) | 클록이 0에서 1로 바뀔 때(상승 에지)까지 기다립니다 |
count <= count + 1 | count의 현재 값을 가져와 1을 더한 다음 다시 저장합니다 |
이 블록은 클록의 상승 에지마다 실행됩니다. 매번 count가 1씩 증가합니다.
감도 목록 @(posedge clk)은 연속적으로 실행되는 것이 아니라 클록 에지에서만 실행되도록 합니다. 이 목록이 없으면 루프는 지연 없이 영원히 실행됩니다.
여러 신호가 있는 always 블록
특정 신호를 나열할 수 있습니다.
always @(a or b) begin
out = a & b;
enda 또는 b가 바뀌면 실행됩니다.
챌린지
이 모듈이 작동하도록 누락된 always 블록을 추가하세요.
작동 방식:
- 클록의 각 상승 에지에서
out1이 0에서 1로 또는 1에서 0으로 토글됩니다(반전됩니다). out2는out1을 따릅니다(out1과 같은 값을 가집니다).
해야 할 일:
always @(posedge clk)블록을 추가하세요.- 블록 안에서
out1을 토글하세요(out1 = ~out1사용). out2가out1과 같도록 하세요.
직접 해보기
module toggler (
input clk,
output reg out1,
output reg out2
);
initial begin
out1 = 0;
out2 = 0;
end
// TODO: posedge clk을 사용하는 always 블록 추가
// out1은 매 클록마다 토글됩니다
// out2는 out1을 따라갑니다
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: 온라인 Verilog 컴파일러