일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 반도체공정교육
- 디지털회로설계
- 베르
- 자습포스팅
- 참고
- 회로개발
- 언리얼엔진4
- 반도체교육
- SoC설계
- 다이오드
- Rectifier
- diode
- 개인스터디
- pn junction
- 베르의게임개발유튜브
- 게임개발
- ASIC설계
- UE4
- 전자회로
- 반도체기초교육
- 자습
- 전자공학
- 반도체물성
- 하이포2기
- SK하이닉스
- 전자공학부
- 물리전자
- 자습목적포스팅
- UnrealEngine4
- 반도체소자교육
- Today
- Total
호경
[개인스터디] Loadable Counter and Test Bench 본문
※시작에 앞서, 해당 내용은 서적 "VHDL과 반도체 회로설계"의 내용을 토대로 작성됐다.
※나는 Verilog HDL 코드로 작성해서 스터디를 진행했다.
1. Loadable Counter
A. Loadable Counter
가장 먼저 하나의 반도체 내부의 회로 구조에 대해서 살펴보면 다음과 같이
1) Controller : CPU, GPU 등
2) Interface : 외부 IO 혹은 외부 통신 제품과의 연결 파트
3) Memory Controller : 내부와 외부의 메모리를 컨트롤 해주는 파트
특히 Memory Controller와 Interface Part에는 Counter 회로가 필수적으로 속한다. Clock이라는 입력이 들어가면서 Time 별로 데이터의 입출력을 담당해야 되기 때문이다. 교본을 참고하였을 때 Counter 회로에 대한 완벽한 이해를 하고 구조를 짤 줄 안다면 반도체 회로 설계의 70% 이상 작업을 마쳤다고 할 수 있다고 언급돼 있다.
이번 포스팅에서 설계해 볼 회로는 Counter 회로 중에서 제일 많이 활용되고 있는 Loadable Counter를 설계해 보고자 한다.
[Loadable Counter 입출력 정의]
입력 신호로는
CLK : 모든 Counter 회로에 들어가는 주파수 신호
RST : CLK가 들어가는 모든 Sequential 회로에 들어가는 초기화 신호
ENB, LOADB : Control 역할을 맡을 신호
D1 : 입력 데이터 신호
출력 신호로는
D0 : 출력 데이터 신호
[동작 스펙]
RST | CLK | ENB | LOADB | D0 |
0 | #40ns CLK | X | X | 초기화 |
1 | 0 | X | 값 유지 | |
1 | 1 | 0 | D1 값 불러오기 | |
1 | 1 | 1 | 카운트 올리기 |
[Verilog HDL 코드]
module Loadable_Counter(CLK, RST, ENB, LOADB, D1, D0);
input CLK, RST, ENB, LOADB;
input[3:0] D1;
output[3:0] D0;
reg[3:0] T_D0;
assign D0 = T_D0;
always@(posedge CLK or negedge RST)
begin
if(!RST)
begin
T_D0 <= 4'b0000;
end
else
begin
if(ENB == 1)
begin
if(LOADB == 1)
begin
T_D0 <= T_D0 + 1;
end
else
begin
T_D0 <= D1;
end
end
end
end
endmodule
[Netlist Viewer]
2. Test Bench
[언어 간의 동작 과정 검증에 대한 호환 및 통일화]
Test Bench는 시뮬레이션을 하기 위한 코드로, 각 종 언어를 통해 회로를 설계했을 때, 검증을 언어 별로 진행하게 되면 굉장히 번거롭기 때문에 이를 통일화 하고 호환할 수 있는 방법으로 테스트 벤치가 생기게 됐다.
내가 작성하는 테스트벤치 코드는 Unit under test인 UUT를 사용하여 진행을 했다.
테스트 벤치는 위 Loadable Counter에 대한 검증 코드로 작성했다.
[Test Bench Verilog HDL 코드]
module tb_Loadable_Counter();
reg CLK, RST, ENB, LOADB;
reg[3:0] D1;
wire[3:0] D0;
Loadable_Counter uut(
.CLK(CLK),
.RST(RST),
.ENB(ENB),
.LOADB(LOADB),
.D1(D1),
.D0(D0));
always#(20)
begin
CLK = ~CLK;
end
initial
begin
RST = 0;
CLK = 0;
ENB = 1;
LOADB = 1;
D1 = 4'b1001;
#40;
RST = 1;
#260;
ENB = 0; //at 300ns
#140;
LOADB = 0; //at 500ns
#200;
ENB = 1; //at 700ns
#200;
LOADB = 1; //at 900ns
#200;
RST = 0; //at 1100ns
D1 = 4'b0011;
#200;
RST = 1; //at 1200ns
end
endmodule
[Simulation 결과]
'디지털회로설계 > SoC,ASIC 설계' 카테고리의 다른 글
[개인스터디] Binary to BCD Code converter (0) | 2023.02.13 |
---|---|
[개인스터디/개인프로젝트] 8-bit 복합 ALU 설계하기 (0) | 2023.01.11 |
[개인스터디] CLA와 16-bit GCLA (0) | 2023.01.05 |
[개인스터디] 4-bit parallel Adder (0) | 2023.01.02 |
[개인스터디] Mux using NAND (0) | 2023.01.02 |