2024.6.18 수업날
오늘은 어제 배웠던 병렬 가산기의 연산 속도가 느린 이유에 대해 알기 위해 캐패시터에 대해 알아보고
n, p형 반도체와 디코더에 대해 알아본다.
그 전에 간략하게 전압과 저항에 대해 알아보자.
전압이란, 전류를 흐르게 하는 능력으로 전위차가 클수록 전압이 크다.
저항이란, 전기의 흐름을 방해하는 부품으로, 직렬연결일때는 값을 더하면 되지만 병렬연결일때는 각가 역수해서 더한 값을 다시 역수로 취하면 된다.
< 캐패시터 >
캐패시터란 전기를 축적하고, 방출할 수 있는 장치이다.
기본적으로 2장의 전극판이 나란히 마주보고 있고, 전극판 사이에는 절연체(전기가 안통하는 무질)가 있다.
전극판의 간격과 면적, 절연체 재질에 따라 축적되는 전하의 크기가 달라지게된다.
전압이 걸리면 각 전극판에 전하가 축적되고, 축적되는 도중에는 전류가 잠깐 동안만 흐른다.
이때 전하는 절연체에 의하여 넘어가지 못하고 두 전극판에 축적된다.
캐패시터에 가한 전압만큼의 전기에너지가 꽉 차게 되면 전류는 더이상 흐르지 않게 된다.
기본적으로 단위는 피코패럿(pF, p = 10^-12)이다.
다시 어제 배웠던 병렬 가산기를 살펴보자
병렬 가산기를 실행하기위해 입력값을 넣어줘도, 캐패시터의 능력에 따라 연산 시간이 오래 걸릴수도 있다.
여기서 PDT(전파지연시간)이 발생하게 된다.
이를 해결하기 위해 고속가산기와 같은 연산 속도가 빠른 가산기를 만드는 것이다.
< n, p형 반도체>
반도체의 종류에 대해 알아보기 전에 도체, 반도체, 부도체의 차이가 무엇인지 알아보자.
도체: 전기가 잘 통하는 물질
반도체: 전기 전도성이 도체와 부도체 중간 정도의 물질
부도체: 전기가 잘 통하지 않는 물질(절연체)
반도체 중에서도 불순물 반도체는 n, p형 반도체로 다시 나뉘는데, 이 차이를 알아본다.
n형 반도체: 자유전자가 사용되는 반도체. 음의 부호를 가지는 자유전자가 이동해서 전류가 생긴다.
p형 반도체: 양공(전자가 몇개 빠져서 생긴 구멍, 양의 전하를 가진 입자로 취급)을 가진다. 양공이 전하 운반자 역할을 하게된다.
이러한 반도체를 접합시켜서 pn 접합 다이오드, npn 트랜지스터를 만들 수 있다.
pn 접합 다이오드는 p, n형 반도체를 접합하여 양 끝에 전극을 붙인 것이다.
p형 반도체에 (+)극을, n형 반도체에 (-)극을 연결하면 순방향 전압이 걸리게 된다.
양공과 전자가 접합면으로 이동하여 결합하고, 공핍층이 얇아지며 전류가 흐르게된다.
여기서 공핍층이란
접합면에 확산 운동에 의해 채워진 양공과 자유전자를 빼앗긴 자리가 생기는 것이다.
반대로 p형 반도체에 (-)극을, n형 반도체에 (+)극을 연결하면 역방향 전압이 걸리게 된다.
양공은 (-)극으로, 전자는(+)극으로 모여 공핍층이 두꺼워지고 전류가 흐르지 않는다.
다음으로 npn 트랜지스터에 대해 알아보자
트랜지스터란 전기 스위치와 전압 증폭 작용을 하는 반도체 소자이다.
베이스 전류에 어떤 값을 주느냐에 따라 양공의 갯수가 달라진다.
이는 단면적에 따라 반비례하는 저항과도 비슷한 성질을 가지고 있다.
< 디코더 >
디코더란 입력값이 따라서 하나의 값으로만 출력되는 것을 의미한다.
1x2 디코더를 예로 들면, 입력값이 0일때는 출력값에 0,1을 출력하고
입력값이 1일때면 출력값에 1,0을 출력하는 것이다.
봉화를 예로 들자면
봉화가 꺼졌을때, 0이 출력되면서 '평화로움'을 출력하고
봉화가 켜졌을때, 1이 출력되면서 '다른 나라의 침입을 받고있다'를 출력하는 것이 되는 것이다.
1x2는 구조가 비교적 간단하여 2x4 디코더를 만들어본다.
이번에도 마찬가지로 2개의 입력값에 따라 출력값은 1개의 경우로만 출력되는 것을 의미한다.
2x4 디코더 만들기(동작적 모델링, 데이터플로우)
////////////////////////////////////////////////////// 2024.6.18
// 2*4 디코더 만들기, 동작적 모델링
module decoderr_2x4_behavioral(
input [1:0] code,
output reg [3:0] signal);
// always @ (code) begin // if 문을 사용했을때의 예시
// if(code == 2'b00) signal = 4'b0001;
// else if(code == 2'b01) signal = 4'b0010;
// else if(code == 2'b10) signal = 4'b0100;
// else if(code == 2'b11) signal = 4'b1000;
// end
always @(code)begin //case를 사용했을때의 예시
case(code)
2'b00 : signal = 4'b0001;
2'b01 : signal = 4'b0010;
2'b10 : signal = 4'b0100;
2'b11 : signal = 4'b1000;
endcase
end
endmodule
////////////////////////////////////////// 2*4 디코더 만들기, 데이터플로우
module decoderr_2x4_dataflow(
input [1:0] code,
output [3:0] signal);
assign signal = (code == 2'b00) ? 4'b0001 : ((code == 2'b01) ? 4'b0010 : ((code == 2'b10) ? 4'b0100 : 4'b1000));
//조건 연산자를 중복으로 사용
endmodule
데이터플로우를 살펴보면
(code == 2'b00) ? 4'b0001 : ((code == 2'b01) ? 4'b0010 : ((code == 2'b10) ? 4'b0100 : 4'b1000)); 이러한 형식이 사용되었다.
이는 중복구문 형식으로 ? 앞의 조건이 참이면 ? 뒤의 참 조건으로 이동하게 되고
? 앞의 조건이 거짓이면 : 뒤의 거짓 조건으로 이동하게 된다.
코드는 () 안에 있는
((code == 2'b10) ? 4'b0100 : 4'b1000)) 를 먼저 실행하게 되며, 여기서도 조건이 맞지 않는다면 이 형식 밖으로 나가서
(code == 2'b01) ? 4'b0010 이 형식에 대해 조건이 참인지 거짓인지를 분별한다.
그래도 거짓이라면 (code == 2'b00) ? 4'b0001 이 형식으로 조건을 분별하게 되는 구조이다.
아래는 decoderr_2x4_behavioral 의 시뮬레이션 결과이다.
입력값인 1, 0에 각각 0,0 / 0,1 / 1,0 / 1,1 를 대입하여 결과값인 signal에서 진리표대로 나오는 것을 확인할 수 있다.
아래는 decoderr_2x4_dataflow 의 시뮬레이션 결과이다.
마찬가지로 입력값인 1, 0에 각각 0,0 / 0,1 / 1,0 / 1,1 를 대입하여 결과값인 signal에서 진리표대로 나오는 것을 확인할 수 있다.
< 7세그먼트 디코더>
7세그먼트 디코더도 마찬가지로 입력값에 이진수 4비트로 출력하고자 하는 입력값을 입력해주면
이를 7세그먼트로 어느부분이 켜지고 어느부분이 꺼지는지를 설정하여 1개의 경우로만 출력되는 것을 의미한다.
이때, basys3 보드에서 7세그먼트는 '0'일때가 불이 들어오는 것을 의미한다.
시간상 코드만 작성해보고 작동해보는 것은 내일 수업시간에 이어서 확인한다.
7세그먼트 디코더
///////////////////////////////////////////////////////// 7세그먼트 디코더
module decoder_7seg(
input [3:0] hex_value, //0~15까지의 16진수 값
output reg [7:0] seg_7);
always @(hex_value)begin
case(hex_value)
//basys3의 fnd는 0일때 켜지는 것으로 간주, '_'는 몇자리인지 구분하려고 씀, 실제로는 값을 읽지 않음
//abcd_efgp
4'b0000: seg_7 = 8'b0000_0011; // 0
4'b0001: seg_7 = 8'b1001_1111; // 1
4'b0010: seg_7 = 8'b0010_0101; // 2
4'b0011: seg_7 = 8'b0000_1101; // 3
4'b0100: seg_7 = 8'b1001_1001; // 4
4'b0101: seg_7 = 8'b0100_1001; // 5
4'b0110: seg_7 = 8'b0100_0001; // 6
4'b0111: seg_7 = 8'b0001_1111; // 7
4'b1000: seg_7 = 8'b0000_0001; // 8
4'b1001: seg_7 = 8'b0001_1001; // 9
4'b1010: seg_7 = 8'b0001_0001; // A(10)
4'b1011: seg_7 = 8'b1100_0001; // b(11)
4'b1100: seg_7 = 8'b0110_0011; // C(12)
4'b1101: seg_7 = 8'b1000_0101; // d(13)
4'b1110: seg_7 = 8'b0110_0001; // E(14)
4'b1111: seg_7 = 8'b0111_0001; // F(15)
endcase
end
endmodule
전압, 저항, 캐패시터, 반도체, 디코더 끝!
'Harman 세미콘 아카데미 > Verilog' 카테고리의 다른 글
2024.6.21 [Verilog]⑥ - 링카운터 활용 + basys3 보드 연결, 레지스터 (0) | 2024.06.21 |
---|---|
2024.6.20 [Verilog]⑤ - 비동기 카운터, 동기카운터, BCD 카운터, 업다운 카운터, 링카운터, 주종형 D플립플롭 (0) | 2024.06.20 |
2024.6.19 [Verilog]④ - 7세그먼트 디코더, 인코더, 멀티플렉서+디멀티플렉서, 플립플롭 (0) | 2024.06.19 |
[Verilog]② - 병렬 가산기, 병렬 가감산기, 비교기 (0) | 2024.06.18 |
[Verilog]① - Vivado 사용법과 논리게이트 구현하기 (0) | 2024.06.18 |