HDL(hardware description language)
- 회로를 설계하는 하드웨어 기술 언어
- 대표적으로 verilog, VHDL이 존재, verilog는 C와 비슷(IEEE standard 1364)
- 거의 verilog를 사용 - 삼성 lg
Verilog
- 대소문자 구별
- 신호를 정의할 떄 키워드 wire 사용
ex) wire carryIn;
- 숫자표현 : [bit 단위 길이]'[진법][값]
ex) 8'd100(dec) = 8'h64(hex) = 8'b0110_0100(binary)
668 = 10'b10_1001_1100 = 10'h29C
Module
특정 행동을 하기 위한 회로를 모아놓은 단위
- 범위 : module 키워드로 시작하여 endmodule로 끝
module decoder3to8(...);
...
endmodule
- 모듈 내에 다른 모듈 정의 불가능, 호출은 가능
- 모듈 이름 : 알파벳으로 시작하고 숫자 기호 시작은 불가능 (C와 동일)
입출력 신호
- 입력 신호 키워드 : input
- 출력 신호 키워드 : output
모듈 이름 뒤에 이름과 키워드를 나열
module decoder3to8 (input A2, input A1, input A0, output [7:0]D );
////
///
endmodule
또는 이름만 선언 하고 모듈안에 키워드와 이름을 다시 선언
module decoder3to8 (A2, A1, A0, D );
input A2, A1, A0;
ouput [7:0]D;
//
//
endmodule
Vector
- 한개의 변수명으로 여러 bit의 신호를 표현
- 표현식
<type> [<left Index>:<right Index>] <name>
ex) 4b 신호 foo - wire [3:0] foo = (bit);
left 인덱스 = MSB
MSB(Most Significant bit)는 비트 중 가장 큰값으로 가장 왼쪽에
right 인덱스 = LSB
LSB(Least Significant bit)는 비트 중 가장 작은값으로 가장 오른쪽에

초기화

논리 및 비트 연산자

assign 키워드로 신호에 값을 배정할 수 있다
wire a, b, c, d;
assign d = (a && b) || c;
모듈 설계 예제

Half adder 예제

회로 설계도 설계 예제

3항 연산자 구현


제어문
if else문
module mux2to1 (s, d0, d1, z);
input s, d0, d1;
output z;
reg z; // always 문에서 배정되는 겂은 항상 reg type
always @(*) begin // * = 알아서 인풋 설정
if( s == 0 ) begin
z = d0;
end
else begin
z = d1;
end
end
endmodule
case 문
module mux2to1 (s, d0, d1, z);
input [1:0] s;
input d0, d1, d2, d3;
output z;
reg z; // always 문에서 배정되는 겂은 항상 reg type
always @(*) begin // * = 알아서 인풋 설정
case( s )
0 : z = d0;
1 : z = d1;
2 : z = d2;
defalut : z = d3;
endcase
end
endmodule
입력이 많으면 if- else 보다는 case문이 보통 더 효율적으로 합성 됨
제어문을 사용하려면 reg + always으로 인풋 아웃풋을 설정하고 아니면 wire + assign
Test vench
- 설계한 회로(DUT)에 입력 신호를 인가하고 출력 신호가 맞는지 확인함.
- 디지털 회로로 쉽게 구현할 수 없는 다양한 문법 사용 가능