목차
1. 테스트 벤치 및 기본 지식
0) 테스트 벤치
1) 클럭 생성
2) DUT
3) 리셋
4) D flip flop
5) Combinational logic
6) Sequnetial logic
2. 수 표현 및 카운터, 파이프라인
1) Overflow
2) Signed / Unsigned
3) Counter
4) Pipline
3. FSM, 메모리 종류, Bram
1) FSM
2) Memory
3) Bram
1. 테스트 벤치 및 기본 지식
0) 테스트 벤치
모든 회로는 특정 목적을 위해 만들어지고 해당 목적을 정해진 시간 내에 오류 없이 달성하는 것이 완성하는 것이다.
이를 검증하기 위해서는 특정 목적을 달성하는 결과를 내는 비교군이 있으면 좋다.
일종의 모델을 만든다고 부른다.
1) 클럭 생성
클럭은 디지털 회로의 기초
간단하게 말해서 시간을 잘게 쪼개서 작업을 나눈다.
각각의 출력에서 클럭에 따라 데이터가 나온다.
연산의 기반이 되는 기준이기에, 클럭이 줄어들어도 똑같은 결과를 내면 같은 시간에 더 많은 결과를 내놓는다.
성능이 올라가는 오버클럭인 것이다.
여기서는 레이턴시와 스루풋이란 개념이 나온다.
-레이턴시
입력 넣었을 때 출력까지 나오는데 걸리는 시간/ 사이클이다.
간단하게 말해서 몇 클럭 안에 연산이 끝나는지 확인하는 것이다.
만약 한 클럭 안에 연산 결과가 안 나오면 다음 클럭에 결과가 나온다.
-스루풋
출력이 나오는 간격이라고 보면 된다.
연산이 빨리 끝나면 매 사이클마다 출력이 나오고
연산이 늦게 끝나면 다음클럭에 나오니 스루풋이 절반이 된다.
2) DUT
테스트 벤치를 돌려서 기능을 검증하는 유닛이다.
design under test이다.
3) 리셋
중요하다. 이 신호가 없으면 초기 값 설정이 안되기에,
신호 반전이나, 비트를 더하는 등의 연산을 하면 초기값을 몰라서
정상 작동을 안한다.
싱크 리셋과 어싱크 리셋이 있는데,
싱크는 클럭 신호에 맞춰서, 어싱크는 클럭 상관 없이작동한다.
주로 어싱크 리셋은 active low 리셋이 많다고 한다.
따라서 negedge로 설정하면 클럭과 상관없이 작동한다고 한다.
클럭과 관련 없으므로 외부 입력으로 볼 수 있고,
싱크 리셋은 클럭에 맞춰서 동작하므로 주로 회로 내부에서 리셋을 한다고 한다.
잘은 모르지만, 재시작 같은 느낌인가보다.
4) D flip flop
이것을 활용해서 데이터를 저장한다고 한다.
다만 종류가 다양한데 공통적인 특징은 클럭이 있을 때만 출력이 바뀐다.
그리고 출력을 계속 유지한다.
Delay flip flop이라고 한다. 결국 한 클럭동안 데이터를 저장한다.
5) Combinational logic
이전 상태와 상관 없이 현재 입력만 가지고 결과를 출력하는 회로라고 한다.
개인적으로는 그냥 입력에 따라 클럭 상관 없이 즉시 바뀌는 회로로 이해하고 있다.
이전 입력을 기억할 필요가 없는 논리 게이트 등의 회로를 의미한다.
6) Sequnetial logic
이전 상태와 현재 입력을 둘 다 고려해서 결과를 출력하는 회로라고 한다.
개인적으로는 클럭을 이용하는 F/F을 사용해서 이전 결과 값을 기억하는 회로로 이해하고 있다.
어떻게 연산하든 결과적으로 출력이 별도로 저장되는 회로로 이해한다.
2. 수 표현 및 카운터, 파이프라인
1) Overflow
숫자 자릿수 표현 범위를 넘어가서 가장 낮은 값으로 돌아가는 상태를 말한다.
예를 들면 십진법을 한자리로 표현하면 0~9까지 표현한다. 10이 되는 순간 2자리가 되기에 10진법이라 부른다.
여기서 1의 자리만 남기면 다시 0이 된다. 이걸 말한다.
이는 시스템의 한계로 완전히 막지 않고 잘 이용할 수도 있지만, 충분히 고려해야 된다.
2) Signed / Unsigned
수 표현 체계이다. +, - 의 부호 유무를 말한다.
Signed는 부호가 있어서 음수부터 양수를 표현하고
Unsigned는 부호가 없어서 0부터 양수를 표현한다.
당연히 비트 제한이 있어서 unsigned의 크기의 절반만큼 음수를 표현해서 최대 표현 양수가 절반이 된다.
2의 보수는 이진법에서 음수를 표현하는 방법이다.
간단하게 말해서 compliment 인데 합치면 2가 되는 숫자이다.
이게 이진법 설명이라 애매한다.
이진법으로 2는 2'b10이다. 즉 자릿수가 2자리가 된다.
그런데 자릿수가 늘어나지만 우리는 한자리만 본다. 따라서 2와 상관 없는 0이 되는 숫자를 찾게 된다.
예를 들어서 10의 이진법 1010의 2의 보수를 계산하면
일단 반전 시켜서 0101만들고
1을 더한다. 그려면 0110이 된다.
이를 원본인1010과 더하면
1010
0110
1의 자리 0 + 0 => 0
2의 자리 1 + 1 => 10 => 0
4의 자리 0 + 1 + (1) => 10 =>0
8의 자리 1 + 0 + (1) => 10 =>0
이 된다. 결과적으로 (1)0000 16이 나온다. 하지만 이는 컴퓨터에서는 0이다.
자릿수 제한으로 최상위 캐리가 사라지기 때문이다.
결과적으로 덧셈으로 2의 보수를 더하면 뺄셈이 된다.
여기서 사칙연산이 가능한데,
덧셈은 당연히 되고
뺄셈은 2의 보수를 쓰면 덧셈으로 처리한다.
곱셈과 나눗셈은 지원하지만 회로가 복잡하다고 한다.
그나마 곱셈은 정수의 경우 2진법으로 표현하면 a * ( 1010101) 이런 식으로 표현되어서
각 자릿수별로 나누면 2의 배수의 곱의 합으로 표현되어서 그나마 낫다고 하고
나눗셈은 너무 복잡해서 가능하면 안쓴다고 한다.
3) Counter
가장 기본적인 카운터이다.
여기서는 기본 설계를 배운다.
설계의 기본 요건으로는
목적을 결정하고
입력과 출력을 결정하고
동작 조건을 설정하는 과정이 우선시 되어야 된다.
베릴로그로 설계하는 것은
어디까지나 이런 내용이 결정된 것을 옮기는 것이다.
4) Pipline
이건 다들 그냥 파이프라인이라 부르는데
아무리 봐도 분업이다. 완벽한 설명은 아니지만 분업으로 설명하겠다.
분업으로 음식점 운영에 대입해서 보자.
간단하게 주문 접수, 조리, 서빙 3단계로 구성된다고 보자.
혼자서 주문 접수하고 조리 하고 서빙 하면 3사이클에 한번 고객에세 음식을 내놓는다.
여기서 3명이 각각 나눠서 해도 여전히 3사이클이다.
하지만, 이는 주문 접수하고 나면 조리 되기 전까지는 주문 접수와 서빙 담당이 놀아서 그렇다.
경제적 관념이 있는 사장이라면 어떻게 하겠는가
다른 주문을 받아서 조리에 넘기고, 기존에 나온 음식을 서빙하라고 할 것이다.
그러려면 주문과 조리 사이에 주문 리스트를 순서대로 기록하는 공간이 필요하고
조리와 서빙 사이에 음식을 보관하는 공간이 필요할 것이다.
즉 버퍼같은 것이 필요한 것이다.
따라서 이런 버퍼를 준비하면
주문 접수는 언제라도 주문을 접수하고
조리는 들어온 주문을 조리해서 언제라도 서빙 대기 공간에 둘 것이고
서빙은 대기 공간에 있는 음식을 언제나 고객에게 전달할 것이다.
그러면 주문 접수, 조리, 서빙 까지 3사이클이 필요한 것은 맞다.
하지만, 입력이 연속으로 들어가기에, 모든 행동이 한 사이클 내에 끝나면
매 사이클마다 음식을 서빙할 수 있는 것이다.
가게의 회전율이 올라가고 스루풋이 늘어난 것이다.
이를 회로로 보자
아까 레이턴시와 스루풋 이야기를 했다.
레이턴시는 인풋에서 아웃풋이 나오는 시간 간격과
스루풋은 출력이 나오고 다음 출력이 나오는 시간 간격을 의미한다.
다만 연산이 많아지만 한 클럭 사이클 안에 처리를 못하면
레이턴시가 2사이클이 되고
스루풋은 1/2가 된다.
이때 해당 작업을 중간에 나누면 두 작업 모두 한 클럭 사이클 내에 처리한다.
그러면 레이턴시가 2 사이클인 것과 스루풋이 2사이클인 것은 똑같다.
이는 2번 작업이 끝나기 전에는 1번 작업에 입력을 받아들여 출력을 못하기 때문이다.
다만 여기서 이 작업 중간에 여러 작업을 중간 저장할 수 있다면
1번 작업은 2번이 끝나길 기다리지 않고 계속 작업한다.
그러면 결과적으로 레이턴시는 2 사이클이지만,
결과물은 매 사이클마다 내놓을 수 있다.
결론은 노는 사람이 없게 중간 중간 충분한 작업 결과를 쌓아 둘 수 있는 공간을 마련해서
노는 사람 없게 만드는 것이 분업이자 파이프라인이다.
3. FSM, 메모리 종류, Bram
1) FSM
유한 상태 기계로 그냥 일정 루틴으로 뺑뺑 돌면서 동작하는 구조를 말한다.
ATM생각해보자 ATM이 고장나서 나에게 돈을 주면 좋겠지만,
그럴 일은 없다. 왜냐하면 미리 모든 상태를 정의해두고 딱 그 상태만 왔다갔다 하기 때문이다.
종류로는 무어와 밀리가 있다.
밀리는 입력에 따라 출력이 영향이 있고 무어는 영향이 없는 것이다.
상태나 다른 것이 아닌 출력만 고려한다.
크게 신경쓰지는 않는다.
2) Memory
F/F(register)
SRAM
DRAM
설명했다.
결론은 register는 8개의 nand와 2개의 not게이트로 이뤄져서 약 36개의 트랜지스터로 이뤄지고
SRAM은 6개의 트랜지스터
DRAM은 1Cell 당 1개의 트랜지스터이다.
따라서 트랜지스터 개수는 면적이라
순서대로 면적이 작다.
하지만 register는 high low로 바로 입력이 가능하고
SRAM은 전용 인터페이스
DRAM도 전용 인터페이스 + 외부에서 접근으로
입출력 속도가 느리다고 한다.
Random Access Speed
register, Sram은 괜찮으나, dram은 느리다.
register는 원하는 대로 크기 조절이 되나
sram도 원하는 대로 크기 조절 가능
dram은 한번에 읽는 데이터 크기 조절 불가
3) Bram
Xilinx FPGA에서 Sram 대신에 Bram사용함
Block Ram임
한번에 전송할 데이터를 Data Width로 설정하나
크기 제한이 있어서 depth(메모리 주소 범위)는
자동으로 결정됨
데이터 크기는 Width * Depth로 결정됨
포트는
clk : clock
rst : reset
addr : address
din : data in
dout : data output
ena : use / not use (clock cut)
wen : write / read 1/0
등이 있다.
결국 clk, rst는 기본이고
ena를 high로 두어야 동작한다.
addr 에 주소 넣고
data in에 데이터 입력하고
wea에 원하는 데이터 주소를 1로 하면 들어가고
0으로 두면 읽는다.
이렇게 베릴로그 기본 내용정리
문법은 없다.