SystemVerilog 기반 논리 회로 설계(강의용) - 2장 SystemVerilog101

6921 단어 HDLSystemVerilog

제2장 SystemVerilog101


이 장에서는 SystemVerilog의 구문에서 본 강의 회로 설계에 필요한 최소한의 기본 부분에 대해 설명합니다.

module 및 assign


모듈은 SystemVerilog에서 회로를 단위로 기술합니다.
모듈의 설명은 보존어 모듈과endmodule에 의해 포위됩니다.
<목록 2.1 단순io 모듈>
module simple_io(         // (1) モジュール名: simple_io
  // ポートリスト
  input   logic [7:0] a,  // (2) 8-bit logic 型の入力信号
  output  logic [7:0] y   // (3) 8-bit logic 型の出力信号
);

  // 回路記述
  assign y = a;           // (4)

endmodule
간단한 회로 모듈 설명은 목록 2.1에 나와 있습니다.
그림2.1과 같은 회로를 구성한다.

<그림 2.1 단순>IO 모듈로 구성된 회로 >
먼저 모듈 이름과 포트 목록을 기술합니다.
예약어 모듈 다음에 모듈 이름을 지정하고 회로 모듈의 입력과 출력 신호를 발표하는 포트 목록은 다음과 같다.
목록 2.1에서 모듈 이름으로 하는 단순는 io(목록의 (1)입니다.
포트 목록에는 8-bit logic형 입력 a와 8-bit logic형 출력 b(목록 중(2)(3)가 표시됩니다.
또한logic형의 신호는 논리 0, 1, 고저항 상태z와 부정값 x 네 개의 값을 얻을 수 있다.
8bit의 신호 a의 여러분은 a[7], a[6]...a[0]처럼 기술할 수 있다.y에 대해서도 마찬가지다.
또한 예를 들어 a[7], a[6], a[5], a[4]를 모아서 a[7:4]처럼 기술할 수 있다.
목록 2.1의 (4) 부분에서 회로 내부의 구조를 기술했다.
여기에서 assign 문장에 따라 왼쪽 (출력) 신호 y에 오른쪽 (입력) 신호 a를 분배합니다.
그러니까 이 단순함io 모듈은 8bit의 입력 a를 출력 y로 직접 출력하는 회로입니다.
또한 8-bit 신호 y와 a를 사용하여 8위 신호의 분배를 총괄하였으나 다음과 같이 여러분에게 분배를 기술할 수 있습니다.
<목록 2.2 비트당 할당>
  // リスト2.1 (4)は下記のように書いてもよい
  assign y[7] = a[7];
  assign y[6] = a[6];
  assign y[5] = a[5];
  assign y[4] = a[4];
  assign y[3] = a[3];
  assign y[2] = a[2];
  assign y[1] = a[1];
  assign y[0] = a[0];

비트 논리 연산


<목록 2.3 logicgates 모듈 >
module logic_gates(
  input  logic [1:0] a,
  input  logic [1:0] b,
  output logic [1:0] y1,
  output logic [1:0] y2,
  output logic [1:0] y3,
  output logic [1:0] y4,
  output logic [1:0] y5
);

  assign y1 = a & b;      // (1) bitwise AND
  assign y2 = a | b;      // bitwise OR
  assign y3 = a ^ b;      // bitwise XOR
  assign y4 = ~a;         // bitwise NOT
  assign y5 = ~(a & b);   // bitwise NAND

endmodule
목록 2.3에서 각종 비트 논리 연산으로 구성된 회로 모듈 logic이(가) 표시됩니다.
이 모듈은 두 개의 2-bit 신호 a, b를 입력 신호로 하고 5개의 2-bit 신호 y1, y2, y3, y4, y5를 출력 신호로 한다.
y1, y2, y3은 각각 a와 b 각 비트 AND,OR,XOR의 데이터를 출력한다.
y4 출력 a의 모든 NOT, y5 출력 a와 b의 모든 낸드.
목록 2.3의 (1) 부분도 다음과 같은 비트에 따라 분배할 수 있다.
<목록 2.4비트 할당>
  // リスト2.3の(1)は下記のように書いてもよい
  assign y1[1] = a[1] & b[1];
  assign y1[0] = a[0] & b[0];

연습하다


목록 2.3 로직실습 보드 DE0-CV에 gates 모듈을 설치하여 동작을 확인합니다.(Top-Level Enity를 logic gates로 사용)
logic_gates 모듈의 입출력 신호는 표 2.1과 같이 DE0-CV에 할당된 입출력 장치입니다.
<표 2.1 logicgates 모듈의 입력과 출력을 장치에 할당 >
신호 이름
장치 지정
입출력
a[1:0]
SW3-SW2
input
b[1:0]
SW1-SW0
input
y1[1:0]
LEDR9-LEDR8
output
y2[1:0]
LEDR7-LEDR6
output
y3[1:0]
LEDR5-LEDR4
output
y4[1:0]
LEDR3-LEDR2
output
y5[1:0]
LEDR1-LEDR0
output

상수


상수 소양은 목록 2.5와 같이 비트 너비와 기수(2진수, 8진수, 10진수, 16진수)를 지정하여 기술한다.
상수를 사용할 때는 비트 너비를 원칙적으로 지정합니다.
밑줄()긴 숫자를 쉽게 볼 수 있도록 무시되기 때문에 적당히 삽입하십시오.
<리스트 2.5 상수 소양>
  // 3-bit 幅の定数 5(10進) の表示方法
  3'b101        // 3-bit 2進数表示
  3'o5          // 3-bit 8進数表示
  3'd5          // 3-bit 10進数表示
  3'h5          // 3-bit 16進数表示

  // 8-bit 幅の定数 172(10進) の表示方法
  8'b1010_1100; // 2進数表示
  8'o254        // 8進数表示
  8'd172        // 10進数表示
  8'hAC         // 16進数表示
목록 2.6에 상수를 이용한 회로 모듈을 표시합니다.
<목록 2.6maskC3 모듈>
module mask_C3 (
  input  logic [7:0] a,
  output logic [7:0] y
);
  assign y = a & 8'b1100_0011;
  // assign y = a & 8'hC3 と書いても同じ
endmodule

연습하다


목록 2.6 mask실습 보드 DE0-CV에 C3 모듈을 설치하고 동작을 확인합니다.
mask_C3 모듈의 입출력 신호는 표 2.2와 같이 DE0-CV에 할당된 입출력 장치입니다.
<표 2.2 maskC3 모듈의 입출력을 장치에 할당>
신호 이름
장치 지정
입출력
a[7:0]
SW7-SW0
input
y[7:0]
LEDR7-LEDR0
output

3항 연산(오류 63:)


목록 2.7의 mux 모듈은 그림2.2와 같은 복용기를 제공한다.
<목록 2.7mux 모듈>
module mux(
  input   logic       sel,
  input   logic [3:0] d0,
  input   logic [3:0] d1,
  output  logic [3:0] y
);

  assign y = (sel == 1'd1) ? d1 : d0; // (1)
endmodule

<그림2.2mux에서 제시한 복용기>
mux4 모듈은 1-bit 신호sel이 1일 때 y에 d1을 출력하고 그렇지 않으면 y에 d0을 출력합니다.
목록에서 (1) 세 가지 연산을 사용합니다.?를 참고하십시오.
조건 섹션에서는 동일 비교(==, 유사성 33==) 또는 크기 비교(<=>=)를 사용할 수 있습니다.
조건이 성립되었을 때 되돌아오는 값: 왼쪽 (와: 중간에 끼인 부분), 조건이 성립되지 않았을 때 되돌아오는 값은: 오른쪽에 적혀 있습니다.

연습하다


실습 보드 DE0-CV에 목록 2.7의 mux 모듈을 설치하여 동작을 확인합니다.
mux 모듈의 입출력 신호는 표 2.3과 같이 DE0-CV에 할당된 입출력 장치입니다.
<표 2.3 mux 모듈의 입력 및 출력 장치 할당>
신호 이름
장치 지정
입출력
sel
SW9
input
d1[3:0]
SW7-SW4
input
d0[3:0]
SW3-SW0
input
y[3:0]
LEDR3-LEDR0
output

비트 연결


목록 2.8에는 비트 연결을 사용하는 회로 모듈이 표시됩니다.
<목록 2.8 bitmix 모듈>
module bitmix(
  input   logic [3:0] a,
  input   logic [3:0] b,
  output  logic [7:0] y
);

  assign y = {a[1:0], b, a[3:2]}; // (1)

endmodule
신호를 {}로 묶으면 목록의 오른쪽과 같은 여러 신호의 비트 연결을 할 수 있습니다.
아래 목록 2.9에 적힌 것과 같은 기능입니다.
<리스트 2.9비트 할당>
  // リスト2.8 (1)は下記のように書いてもよい
  assign y[7] = a[1];
  assign y[6] = a[0];
  assign y[5] = b[3];
  assign y[4] = b[2];
  assign y[3] = b[1];
  assign y[2] = b[0];
  assign y[1] = a[3];
  assign y[0] = a[2];

연습하다


실습판 DE0-CV에 목록 2.8의bitmix 모듈을 설치하고 동작을 확인합니다.
bitmix 모듈의 입력 출력 신호는 표 2.3과 같이 DE0-CV의 입력 출력 장치에 분배됩니다.
<표 2.3 bitmix 모듈에서 입출력 장치에 할당>
신호 이름
장치 지정
입출력
a[3:0]
SW7-SW4
input
b[3:0]
SW3-SW0
input
y[7:0]
LEDR7-LEDR0
output

산술 연산(가산)


<목록 2.10 adder 모듈(4비트 가법기)>
module adder(
  input   logic [3:0] a,
  input   logic [3:0] b,
  output  logic [3:0] sum,
  output  logic       carry
);

  assign {carry, sum} = a + b; // (1)

endmodule
목록 2.10의adder 모듈은 4-bit의 신호 a와 b를 더해서 4-bit의sum에 출력하고 1-bit의carry에 출력합니다.
목록의 (1)와 같이 + 연산자를 사용하여 덧셈을 쓸 수 있습니다.마찬가지로 뺄셈은 - 연산자로 설명할 수 있다.

연습하다


목록 2.10의 adder 모듈을 실습 보드 DE0-CV에 설치하여 동작을 확인합니다.
adder 모듈의 입력 출력 신호는 표 2.4와 같이 DE0-CV의 입력 출력 장치에 분배됩니다.
<표 2.4adder 모듈에서 입력 출력 장치에 할당>
신호 이름
장치 지정
입출력
a[3:0]
SW7-SW4
input
b[3:0]
SW3-SW0
input
carry
LEDR9
output
sum[3:0]
LEDR3-LEDR0
output

always


레지스터 등 순서 회로, 인코더, 디코더 등 복잡한 조합 회로는always문(always ff문,always comb문 등)을 사용하여 설계할 수 있다.
always 문장을 사용하는 회로 설계에 관해서는 3장과 4장에서 설명한다.

좋은 웹페이지 즐겨찾기