14. 하드웨어 기술 언어와 Verilog HDL(Hardware Description Language: HDL)
하드웨어 기술 언어란 전자 회로를 정밀하게 기술하는 데 사용하는 컴퓨터 언어이다. 이는 회로를 설계하는 다른 방법인 Schematic Capture와 차이점이 있는데 아래와 같다.
- Schematic Capture
- 여러 데이터 플로우를 다루는데 유용함
- 회로의 전체적 오버뷰 제공
- 하드웨어와 직접적으로 연관이 있음
- 프로그래밍 능력 필요 없음
- 작은 사진에 많은 정보를 담을 수 있음
- 아날로그/디지털 컴포넌트를 모두 다루기 편함
- 알고리즘엔 좋지 않음
- 데이터페스를 다루는게 불편함
- 유지보수에 인터페이스가 좋지 않음
- 재사용성 낮음
- HDL
- 유연하고 수정하기 좋음
- 알고리즘을 다룰 수 있음
- 데이터페스를 다루는데 좋음
- 전자회로를 다루기 편함 (텍스트 파일을 수정하기만 하면 됨)
- 전체 그림을 보기 어려울 수 있음
- 프로그래밍 능력 필요함
- 하드웨어와 거리가 조금 있음
Verilog HDL
Verilog(베릴로그)는 HDL 언어로, 아래와 같은 특징이 있다.
- C 언어랑 비슷함
- 아래의 추상화레벨을 가짐
- Behavioral Level: 블록도와 입출력 신호 연결도 그래픽, 진리표 등 입력. 한국어로 설계 입력이라 함.
- Register-Transfer Level(RTL): 동작적 표현, 클럭 타이밍, 가산기, 디코더, ALU, 레지스터 등
- Gate Level: 논리, 원시 게이트, 연결도 등
- VHDL에 비해 배우기 쉽고 가벼움
모듈 구조
Velilog 디자인은 여러 상호접속된 모듈로 구성된다. 각 모듈은 여러 게이트와 다른 모듈로 구성된다. 아래는 2to1 mux 모듈을 나타낸 코드이다.
module mux2to1 (out, outbar, a, b, sel); // 모듈의 이름과 모듈이 가진 포트를 선언
// 각 포트가 input인지 output인지를 정의
output out, outbar;
input a, b, sel;
// 모듈의 작동을 정의함. 각 구문은 동시에(parallel) 실행. 순서는 상관 없음
assign out = sel ? a : b;
assign outbar = ~out;
endmodule
Assign
Assign문은 (출력) = (처리)로 구성되는데, 처리의 경우는 진행형continuous으로 evaluate되어 입력에 대해 계속 변화한다.
출력은 스칼라나 넷(net), 벡터 넷 등으로 구성된다.
모든 assign은 평행성을 갖는다.
Verilog의 연산자들
Gate Level
module mux_gate (out, outbar, a, b, sel);
output out, outbar;
input a, b, sel;
wire out1, out2, selbar;
not i1 (selbar, sel);
and a1 (out1, a, sel);
and a2 (out2, b, selbar);
or o1 (out, out1, out2);
not i2 (outbar, out);
endmodule
Verilog에 내장된 게이트를 이용할 수 있다.
(and, nand, or, nor, xor, xnor, not, buf)
각 게이트에는 임의의 갯수의 입력을 넣을 수 있다.
절차형 할당문
always 혹은 initial 키워드를 이용하여 절차형 할당procedural assignment을 할 수 있다. 이를 활용하여 if, for, while, case등 C같은 프로그래밍을 할 수 있다.
module mux_2to1 (out, outbar, a, b, sel);
output out, outbar;
input a, b, sel;
reg out, outbar;
//always 블록은 sensitivity list 안의 값이 바뀌었을 때 한 번만 실행
always @ (a or b or sel)
begin // always 블록 안의 코드는 순서대로 실행됨
if (sel) out = a;
else out = b;
outbar = ~out;
end
endmodule
Register
일반적인 디지털 시스템의 레지스터는 값을 업데이트하기 위해 cloack이 필요하지만, verilog의 reg 키워드는 좀 다르다.
reg 키워드는 값을 저장하는 변수를 선언하기 위해서만 쓰인다.
reg 키워드로 선언된 변수의 값은 시뮬레이션 중 어느 때나 수정될 수 있고, 회로의 net으로 사용될 수 있다.
진행형 할당과 절차형 할당의 공존
always 키워드를 이용한 절차형 할당과 진행형 할당은 한 모듈안에서 공존할 수 있다.
case문 - if-else의 대안
always @ (a or b or sel)
begin
case (sel)
1'b0: out = b;
1'b1: out = a;
endcase
end
case문의 구조는 <size>'<base><number>로 구성되는데, 예를 들어 2'b10은 2bit binary이며, value가 2일 경우이다.
2'b10 | 2bit, binary, v=2 |
'b10 | unsized binary, v=2 |
31 | unsized decimal, v=31 |
8'hAf | 8-bit hex, v=175 |
-16'd47 | 16-bit negative decimal, v=-47 |
버스
Verilog는 여러 비트의 시그널을 처리하기 위한 버스 기능이 강력하다.
중괄호 ({})를 활용하여 신호를 합칠 수 있다.
assign {b[7:0], b[15:8]} = {a[15:8], a[7:0]};
위 코드는 바이트를 swap하는 기능을 한다.
아래와 같은 8비트 2to1 mux를 다음 코드로 나타낼 수 있다.
module mux_2to1 (a, b, out, outbar, sel);
input[7:0] a, b;
input sel;
output[7:0] out, outbar;
reg[7:0] out;
always @ (a or b or sel)
begin
if (sel) out = a;
else out = b;
end
assign outbar = ~out;
endmodule
'학부 수업 > 디지털시스템' 카테고리의 다른 글
16. Verilog HDL의 산술 연산과 Incomplete Specification (0) | 2020.05.23 |
---|---|
15. Verilog HDL을 이용한 7-seg display Decoder 구현 (0) | 2020.05.23 |
13. 멀티플렉서와 디멀티플렉서 (Multiplexer and Demultiplexer) (0) | 2020.05.16 |
12. 인코더 (Encoder) (0) | 2020.05.15 |
11. 디코더 (Decoder) (0) | 2020.05.15 |
댓글
이 글 공유하기
다른 글
-
16. Verilog HDL의 산술 연산과 Incomplete Specification
16. Verilog HDL의 산술 연산과 Incomplete Specification
2020.05.23 -
15. Verilog HDL을 이용한 7-seg display Decoder 구현
15. Verilog HDL을 이용한 7-seg display Decoder 구현
2020.05.23 -
13. 멀티플렉서와 디멀티플렉서 (Multiplexer and Demultiplexer)
13. 멀티플렉서와 디멀티플렉서 (Multiplexer and Demultiplexer)
2020.05.16 -
12. 인코더 (Encoder)
12. 인코더 (Encoder)
2020.05.15