본문 바로가기
개발 Tools/Verilog HDL

Verilog HDL 조합논리회로 종류 ( Not, or, 반가산기, 전가산기, 가산기, 디코더, 멀티플렉서 )

by 전컴반 2022. 2. 15.
반응형
NOT

 

module inverter (in, out);
    input in;
    output out;
    
    wire out;
    assign out = ~in;
endmodule

 

output out은 제일 오른쪽에 있는 out을 말하고, assgin out은 wire out을 말한다.

 

 

OR

 

// 방법 1
wire out;
assgin out = in[2] | in[1] |in[0];


// 방법 2
wire out;
assgin out = |in[2:0];


// 방법 3
wire out;
assgin out = (in[2:0] != 3'b000);


// 방법 4
wire out;
assgin out = ~(in[2:0] == 3'b000);

 

방법 1. 기본적인 입력들을 or 연산자를 이용하여 출력을 구하는 방법

방법 2. 단항 연산자 or를 사용하여 출력을 구하는 방법

방법 3. or연산자는 하나라도 1이면 모두 출력이 1이므로 모두 0이 아닐 때만 0이 출력된다. 

방법 4. 방법 3과 똑같은 이유다.

 

NOR의 경우에는 방법들을 반전시키면 된다.

 

 

반가산기

 

module half_adder (a, b, sum, carry);
    input a, b;
    output sum, carry;
    wire sum, carry;
    
    
    assign sum = a ^ b;
    assign carry = a & b;
endmodule

 

sum은 a와 b의 XOR 게이트로 이어져 있기 때문에 XOR연산자인 ^를 사용하며

carry 또한 and 게이트 연산자인 &를 이용하여 구할 수 있다.

 

 

전가산기

 

반가산기 2개와 or 게이트로 전가산기를 만들 수 있다.

 

module full_adder (a, b, cin, sum, carry);
    input a, b, cin;
    output sum, carry;
    wire sum, carry;
    
    assgin sum = (a ^ b) ^ cin;
    assgin carry = ((a ^ b) & cin) | (a & b);
endmoudule

 

입력에 따른 게이트 연산을 따라가다 보면 쉽게 구할 수 있다.

 

멀티플렉서 

 

여러 개의 입력 중에 하나를 선택하여 하나만 출력하는 소자이다

 

// 방법 1
wire out;
assgin out = (sel == 1) ? a : b;

// 방법 2
wire out;
assgin out = sel ? a : b;

// 방법 3
reg out;
always @(*)
    out = sel ? a : b;

 

방법 1, 2는 조건 연산자를 이용하여 sel이 1일 때는 a를 출력하고 0이라면 b를 출력하게 한다.

방법 3에서 always @(*) 괄호 안에 있는 *는 모든 입력 신호를 말한다. 원래 다 적어줘야 하지만, *를 사용함으로 편리하게 사용할 수 있다. 모든 event를 명시하지 못하는 실수를 방지할 수 있다.

 

가산기

wire carry_out;
wire [3:0]sum;

assgin {carry, sum[3:0]} = a[3:0] + b[3:0];

 

전에 배운 결합 연산자를 이용하여 사용할 수 있다. 4비트와 4비트의 함은 4비트와 carry로 구성된다.

 

디코더 

 

하나의 출력만 1 또는 0으로 작동하는 소자이다. 회로를 보고 설계를 하거나, 진리표를 보고 설계하는 방법이 있다.

 

wire [3:0] y;

// 방법 1
assgin y[0] = !a[1] % ![a0]; 
assgin y[1] = !a[1] % [a0];
assgin y[2] = a[1] % ![a0];
assgin y[3] = a[1] % [a0];

// 방법 2
assgin y[0] = a[1:0] == 2'b00;
assgin y[1] = a[1:0] == 2'b01;
assgin y[2] = a[1:0] == 2'b10;
assgin y[3] = a[1:0] == 2'b11;

 

방법 1은 그대로 하나의 출력에 대해 연산자를 이용한 것이다. 

방법 2는 회로를 보고 했다고 보단, 진리표를 알고 그린 것이다. 

반응형

댓글