연속 할당
Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 37번째.
하드웨어에서 연결(connection)은 회로의 두 지점을 잇는 물리적인 전선입니다. 전선이 연결되면, 그 연결은 영구적이며 항상 활성화된 상태입니다. 한쪽 끝이 변하면, 다른 쪽 끝도 즉시 변합니다.
Verilog에서 이러한 동작을 모델링할 방법이 필요합니다. 값을 와이어(wire)에 전달하고 계속 연결된 상태로 유지하고자 합니다. 이러한 과정을 연속 할당(continuous assignment)이라고 합니다.
연속 할당(Continuous assignment)은 assign 키워드를 사용하여 와이어와 표현식 사이에 영구적인 연결을 생성합니다. 와이어는 실제 물리적인 와이어처럼 표현식의 값을 지속적으로 가집니다.
값을 한 번 쓰는 것이 아니라 전선을 납땜하는 것이라고 생각하면 됩니다.
구문
assign wire_name = expression;| 부분 | 의미 |
|---|---|
assign | 연속 할당(continuous assignment)을 시작하는 키워드 |
wire_name | 구동되는 와이어 (reg 타입일 수 없음) |
expression | 와이어를 구동하는 값 |
간단한 예제
wire out;
assign out = a & b;이것은 out이 항상 a AND b와 같음을 의미합니다. a 또는 b가 변경될 때마다 out은 즉시 변경됩니다.
작동 원리
값을 저장하는 reg와 달리, 연속 할당(continuous assignment)을 사용하는 wire는 지속적으로 업데이트됩니다:
module continuous_demo;
reg a, b;
wire c;
assign c = a & b; // c는 항상 a AND b를 따릅니다.
initial begin
a = 0; b = 0;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0
a = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=0 (1&0=0)
b = 1;
#10 $display("a=%d, b=%d, c=%d", a, b, c); // c=1 (1&1=1)
$finish;
end
endmodule출력:
a=0, b=0, c=0
a=1, b=0, c=0
a=1, b=1, c=1a 또는 b가 변경될 때마다 c가 자동으로 업데이트됩니다.
다중 할당
모듈 내에서 여러 개의 연속 할당(continuous assignments)을 사용할 수 있습니다:
module multiple_assign (
input a, b, c,
output x, y
);
assign x = a & b;
assign y = x | c; // y는 x에 의존합니다
endmodule모든 할당은 지속적으로 병렬로 실행됩니다.
일반적인 용도
연속 할당(Continuous assignments)은 다음과 같은 용도로 사용됩니다:
- 단순 조합 논리 (AND, OR, XOR)
- 와이어(wire)들을 서로 연결
- 트라이스테이트 버퍼(tri-state buffers) 생성
- 조합 식(combinational expressions)으로부터 출력 구동
챌린지
수행할 작업:
z가x AND y와 같아지도록 누락된 연속 할당(continuous assignment)을 추가하세요.
치트 시트
연속 할당(Continuous assignment)은 assign 키워드를 사용하여 와이어(wire)와 표현식 사이에 영구적인 연결을 생성합니다:
assign wire_name = expression;와이어는 표현식의 값을 지속적으로 반영합니다. 입력이 변경될 때마다 출력이 즉시 업데이트됩니다:
wire out;
assign out = a & b; // out은 항상 a AND b와 같습니다여러 할당문은 병렬로 실행됩니다:
assign x = a & b;
assign y = x | c; // y는 x에 의존하며, 모두 지속적으로 업데이트됩니다주요 규칙: assign은 wire(reg가 아님)만 구동할 수 있습니다.
직접 해보기
module continuous_challenge (
input x,
input y,
output z
);
// TODO: z를 x AND y로 만드는 누락된 연속 할당문을 추가하세요.
endmodule이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.