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장에서 설명한다.
Reference
이 문제에 관하여(SystemVerilog 기반 논리 회로 설계(강의용) - 2장 SystemVerilog101), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rikitoro@github/items/53bdc8c9263b1b2e2ce4
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 (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];
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の(1)は下記のように書いてもよい
assign y1[1] = a[1] & b[1];
assign y1[0] = a[0] & b[0];
// 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進数表示
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
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
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.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];
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
Reference
이 문제에 관하여(SystemVerilog 기반 논리 회로 설계(강의용) - 2장 SystemVerilog101), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rikitoro@github/items/53bdc8c9263b1b2e2ce4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)