Upload
dinhhuong
View
298
Download
14
Embed Size (px)
Citation preview
VHDL 을 이용한 8-bit Microprocessor 설계
한국외국어대학교전자공학과
CAD / VLSI LAB.
2
Microprocessor 설계 (1) Computer Systems Layer Model 표Software Applications
Operating System
Instruction Set Architecture Interface BetweenSoftware & Hardware
Organizaton High Level DesignCache Size, Data Path Width
Microarchitecture ALU Structure, Bus ProtocolDetailed Structural Design
ComputerArchitecture
Hardware
Implementation Logic,Circuit Design and Layout
3
Microprocessor 설계 (2)
기본적인 출발은 명령어구조 (Instruction Set Architecture) 이다 .– 이 명령어 구조는 software 와 hardware 의 중간
매개체 역할을 한다 . 설계과정
– 명령어 구조를 기반으로 계층적인 설계를 통해 Top-down 방식으로 이루어진다 .
– 설계 방식에 따라 내부 버스의 구조 , ALU 의 구조 , Cache 구조 등을 설계 해야 한다 .
4
8-bit Microprocessor 의 설계
8-bit Simple Instruction Set Computer (8-bit SISC)– 8-bit wide instructions and data– Single register - Accumulator only– Only 8 instructions– Fixed-length, single format instructions– 5-bit addressable memory space– Direct addressing mode only
5
Instruction Format
Instruction Set Architecture(8bit)
Register
7 5 4 0
OP - code Address
Accumulato r
7 0
6
Instruction SetInstruction OPCode Operation
Halt 000 Program flow stops
Skip-if-Zero 001 Next instruction bypassed if Acc=0
Add 010 Acc <- Acc + M[Address]
And 011 Acc <- Acc AND M[Address]
Xor 100 Acc <- Acc XOR M[Address]
Load 101 Acc <- M[Address]
Store 110 M[Address] <- Acc
Jump 111 PC <- Address
7
Pin Timing(1)
여기서의 MEM_CLK 는 메모리가 있을 때를 가정하고 생각한다 .
CLK and MEM_CLK are in the opposite phase. All internal registers in the CPU are rising-edge-triggered. Memory address and enables are sampled on the rising
edge of MEM_CLK. On memory read, valid memory data is driven when
MEM_CLK is high. On memory write, memory data is sampled on the rising
edge of MEM_CLK.
8
Pin Timing(2)
C LK
M E M _C LK
M E M _ADDR
R E AD
WR ITE
M E M _DATA
RADDR WADDR
RDATA WDATAHiZ
9
Instruction Types and Execution Steps(1)
각 명령어는 1 Cycle 에 수행되는 것이 아니라 , 3 ~ 4 번의 clock cycle 을 통해 수행된다 .
각 단계별 수행 내용은 다음 장의 표와 같다 . 각 단계별로 수행되는 내용을 바탕으로
Microprocessor 의 Data Path 및 제어부를 설계하여야 한다 .
10
Instruction Types and Execution Steps(2)
Instruction Types Execution StepsArithmetic/LogicInstructions(Add, And, Xor)
Inst.Fetch
Inst.Deocde
Mem.Read
Exec.Write
Memory Instructions(Load)
Inst.Fetch
Inst.Deocde
Mem.Read
Write
Memory Instructions(store)
Inst.Fetch
Inst.Deocde
Mem.Write
Branch Instructions(Jump, Skip-if-zero)
Inst.Fetch
Inst.Deocde
PCUpdate
System Instructions(Halt)
Inst.Fetch
Inst.Deocde
PCStall
11
SISC 형태의 구현 (1) 먼저 top level 의 schematic 을 아래와 같이
보였다 .S ISC
M E M _ADDR(4: 0)RE ADWRITE
M E M _DATA_IN (7:0)RE SE T
C LK
C LOC KG E N
M E M _C LK
S IS C _M EM ORYM E M _ADDR(4: 0)RE ADWRITE
M E M _DATA_IN(7: 0)
C LK
RE SE T
M E M _ADDR(4: 0)RE ADWRITE
M EM _DATA_IN(7: 0)RE SE TC LK
M E M _DATA_OU T(7:0) M EM _DATA_OUT(7:0)M EM _DATA_OUT(7: 0)
12
SISC 형태의 구현 (2) 각 단자 (pin) 의 이름 및 신호의 명칭은 아래와
같다 . SISC CLK External CPU Clock input RESET External Reset input WRITE Memory Write Enable output READ Memory Read Enable output MEM_ADDR[4:0] Memory Address output MEM_DATA_IN[7:0]Memory Read Data input MEM_DATA_IN[7:0]Memory Write Dataoutput
13
SISC 형태의 구현 (3)
MEMORY READ Memory Write Enable inp
ut WRITE Memory Read Enable inp
ut MEM_ADDR[4:0] Memory Address inp
ut MEM_DATA_IN[7:0]Memory Read Data output MEM_DATA_out[7:0]Memory Write Data inp
ut
14
SISCprocessor 의 미세 구조
C ONTRO L
P C _LO G IC
AD DR_M U X
F LAGAC C
ALU
S TATE
IRM DRIR_B UF
A(7: 0) B (7: 0)
B U F _BU S _IN(7: 0)
B U F _IN (7: 0)
RW
B U F _O U T(7: 0)
IR_IN (7: 0)
LDC LK
IR_O U T(7: 0)
F LAG _IN (7: 0)
LD
C LK F LAG _O U T
AC C _IN(7: 0)
LD
RE S E TC LK
AC C _O U T(7: 0)
ALU _O U T(7: 0)
O P (2: 0) ZE ROO P (2: 0)
P S TATE (1: 0)N S TATE (1: 0)
LD_M D RLD_AC C
DO U T_E NLD _IRLD _P C
IN C
RDWRS E L
P C _IN (4: 0)
LD_P C
IN C _P C
RE S E TC LK
A(4: 0)B (4: 0)
M U X_O U T(4: 0)
P C _O U T(4: 0)
M DR _IN (7: 0)
LD
C LK
M DR _O U T(7: 0)
S TATE _O U T(1: 0)
S TATE _IN(1: 0)
RE S E TC LK
S E L
RE AD
WRITE
M U X_O U T(4: 0)
RE S E TC LK
(7: 5)
(4: 0)
M E M _D ATA_IN(7: 0)
M E M _DATA_O U T(7: 0)
B U F _B U S _O U T(7: 0)
15
명령어 Timing(1) Store Instruction Timing
C LK
R E ADD
WRITE
LD_IR
LD_AC C
LD_P C
DO U T_E N
LD_M DR
P S TATE
NS TATE
00 01 10
01 10 00
IF ID M E M
16
명령어 Timing(2) Add, And, Xor, Load Instructions Timing
C LK
RE ADD
WRITE
LD_IR
S E L
INC
LD_AC C
LD_P C
DO U T_E N
LD_M DR
P S TATE
NS TATE
00 01 10
01 10 00
IF ID M E M
11
11
ALU
17
명령어 Timing(3) Jump Instruction Timing
C LK
R E ADD
WRITE
LD_IR
S E L
INC
LD_AC C
LD_P C
DO U T_E N
LD_M DR
P S TATE
NS TATE
00 01 10
01 10 00
IF ID M E M
18
명령어 Timing(4) Skip-If-Zero Instruction Timing
C LK
R E ADD
WR ITE
LD_IR
S E L
INC
LD_AC C
LD_P C
DO U T_E N
LD_M DR
P S TATE
NS TATE
00 01 10
01 10 00
IF ID M E M
11
11
ALU
When zero is set
When zero is reset
19
명령어 Timing(5) Halt Instruction Timing
C LK
R E ADD
WR ITE
LD_IR
S E L
IN C
LD_AC C
LD_P C
DO U T_E N
LD_M DR
P S TATE
NS TATE
00 01 10
01 10 00
IF ID M E M
20
Microprocessor 검증 (1)
설계 내용을 VHDL 로 기술하고 메모리 부분에는 Fibonacci 수열 계산 프로그램을 넣고 , 시뮬레이션을 수행하여 결과를 얻을 수 있다 .
주의 : 이 프로젝트에서는 메모리 대신 , 직접 입력으로 값을 주었다 .
21
Microprocessor 검증 (2)
00000 10111111 start: Load Xn00001 01011110 Add Xn-100010 11011010 Store tmp00011 10111111 Load Xn00100 11011110 Store Xn-100101 10111010 Load tmp00110 11011111 Store Xn00111 10111101 Load n01000 01011011 Add one01001 11011101 Store n01010 10011100 Xor Last_n01011 00100000 Skip-if-zero01100 11100000 Jump start01101 00000000 Halt
11010 dddddddd tmp: X11011 00000001 one: 111100 00001010 Last_n: 1011101 00000000 n: 011110 00000001 Xn-1: 111111 00000001 Xn: 1
•앞에서 언급한 Fibonacci 수열 계산 프로그램은 다음과 같다 .
Fibonacci Series Computation : Xn <- Xn-1 + Xn-2, X0=1, X1=1
22
SISC 의 VHDL 로의 구현 (1) 앞의 미세구조에서 표현한 schematic 을
여러 block 으로 나누어 설계 크게 10 개의 block 으로 나누어 생각 메모리는 설계를 하지 않음 . 대신
메모리에 해당하는 파형을 simulation 을 할 때 직접 넣어 준다 .
실제 사용되는 핀은 다음과 같이 7 개이다 .– CLK, RESET, READ, WRITE, MEM_ADDR,
MEM_DATA_IN, MEM_DATA_OUT
23
SISC 의 VHDL 로의 구현 (2) MDR(Memory Data Register) block
– 기능• 데이터 메모리를 일시적으로 기억
– 특징• IR 레지스터와 같이 데이터를 기억• 파일과 entity 이름은 REG
– 동작• LD = ‘1’ 인 경우에 동작• Clock = ‘1’ 이고 rising edge(clock event 가 발
생 ) 일때 REG_IN 에 입력된 값을 REG_OUT 으로 보냄
24
– VHDL 표현library IEEE;
use IEEE.std_logic_1164.all;
entity REG is
port(CLK: in std_logic;
LD: in std_logic;
REG_IN: in std_logic_vector(7 downto 0);
REG_OUT: out std_logic_vector(7 downto 0));
end REG;
architecture RTL of REG is
begin
process(CLK)
begin
if CLK = '1' and CLK'event then
if LD = '1' then
REG_OUT <= REG_IN;
end if;
end if;
end process;
end RTL;
25
– 출력 파형
26
SISC 의 VHDL 로의 구현 (3)
IR(Instruction Register) block– 기능
• 메모리에서 읽은 명령어를 기억
– 특징• MDR 레지스터와 같은 역할• 파일과 entity 이름은 REG 이다 .
– VHDL 표현과 출력 파형• MDR 레지스터와 같다 .
27
SISC 의 VHDL 로의 구현 (4) ALU(Arithmetic Logic Unit) block
– 기능• 5 가지의 연산 (ADD, AND, XOR, Load, Store)• 입 . 출력 변수
OPCODE : Instruction 입력 (3-bit)OP1, OP2 : 연산하고자 하는 데이터 ( 각 8-bit)ALU_OUT : 연산 후 출력되는 결과 (8-bit)
– 특징• OPCODE 에 따라 연산 수행• Array 연산을 하기 위해
use IEEE.std_logic_unsigned.all; 구문을 사용한다 .
28
– VHDL 표현library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity ALU is
port(OPCODE: in std_logic_vector(2 downto 0);
OP1, OP2: in std_logic_vector(7 downto 0);
ALU_OUT: out std_logic_vector(7 downto 0));
end ALU;
architecture RTL of ALU is
begin
…… 과 제 (1) ……end RTL;
29
– 출력 파형
30
SISC 의 VHDL 로의 구현 (5) FLAG block
– 기능• ALU 연산의 결과 (Accumulator 에 저장되는 값 )
이 ‘ 0’ 인가의 여부를 조사하여 ‘ 0’ 이면 ‘ 1’ 을 , 그렇지 않으면 ‘ 0’ 을 출력한다 .
• 결과가 ‘ 1’ 이면 PC( 명령어 주소 ) 를 ‘ 1’ 증가시키고 , ‘0’ 이면 그대로 둔다 .
– 동작• CLK = ‘1’ 이고 rising edge 일 때 ALU 의 결과가
‘ 0’ 이면 SET(1) 값을 출력한다 .
31
– VHDL 표현entity FLAG is
port(CLK: in std_logic;
LD: in std_logic;
FLAG_IN: in std_logic_vector(7 downto 0);
FLAG_OUT: out std_logic);
end FLAG;
architecture RTL of FLAG is
begin
process(CLK)
variable TEMP: std_logic;
begin
TEMP := '0';
if CLK = '1' and CLK'event then
if LD = '1' and FLAG_IN = "00000000" then
TEMP := '1';
end if;
end if;
FLAG_OUT <= TEMP;
end process;
end RTL;
32
– 출력 파형
33
SISC 의 VHDL 로의 구현 (6) ACC(Accumulator) block
– 기능• ALU 연산의 결과를 잠시 저장하는 역할• Data 폭이 8-bit 인 레지스터• 입 . 출력 변수
CLK : RESET : ‘1’ 이면 Accumulator 값을 ‘ 0’ 으로 초기화LD : ‘1’ 이면 값 저장가능ACC_IN : 입력되는 ALU 의 출력 (8-bit)ACC_OUT : Accumulator 의 출력 (8-bit)
– 동작• Rising edge 에서 동작
34
– VHDL 표현library IEEE;
use IEEE.std_logic_1164.all;
entity ACC is
port(CLK, RESET: in std_logic;
LD: in std_logic;
ACC_IN: in std_logic_vector(7 downto 0);
ACC_OUT: out std_logic_vector(7 downto 0));
end ACC;
architecture RTL of ACC is
begin
…… 과 제 (2) ……end RTL;
35
– 출력 파형
36
SISC 의 VHDL 로의 구현 (7)
IR_BUF block– 기능
• Instruction 이나 데이터가 메모리에서 읽혀 잠시 저장되거나 , 계산된 데이터가 메모리에 저장되기 전에 결과를 잠시 저장하는 부분이다 .
– 동작• RW 값에 따라 메모리에 값을 읽거나 저장
RW = ‘1’ ALU 에서 계산된 값을 메모리에 write 함RW = ‘0’ 데이터나 Instruction 들을 메모리에서 읽어 옴
37
– VHDL 표현entity IR_BUF is
port(RW: in std_logic;
BUF_IN: in std_logic_vector(7 downto 0);
BUF_OUT: out std_logic_vector(7 downto 0);
BUF_BUS_IN: in std_logic_vector(7 downto 0);
BUF_BUS_OUT: out std_logic_vector(7 downto 0));
end IR_BUF;
architecture RTL of IR_BUF is
begin
process(RW, BUF_IN, BUF_BUS_IN)
begin
if RW = '1' then
BUF_BUS_OUT <= BUF_IN;
elsif RW = '0' then
BUF_OUT <= BUF_BUS_IN;
else
BUF_OUT <= "00000000";
end if;
end process;
end RTL;
38
– 출력 파형
39
SISC 의 VHDL 로의 구현 (8)
PC_LOGIC block– 기능
• PC(Program Counter) 를 1 씩 증가 시켜 다음으로 수행될 주소를 지정하거나 , 새로운 주소를 갖게 한다 .
– 동작• INC_PC = ‘1’ 이고 LD_PC = ‘1’ 이면 PC_IN 을
‘ 1’ 증가시켜 출력
40
– VHDL 표현architecture RTL of PC_LOGIC is
begin
process(CLK, RESET)
variable LAST_PC: std_logic_vector(4 downto 0) := "00000";
begin
if RESET = '1' then
LAST_PC := "00000";
elsif CLK = '1' and CLK'event then
if INC_PC = '1' and LD_PC = '0' then
LAST_PC := LAST_PC + 1;
elsif INC_PC = '0' and LD_PC = '1' then
LAST_PC := PC_IN;
end if;
end if;
PC_OUT <= LAST_PC;
end process;
end RTL;
41
– 출력 파형
42
SISC 의 VHDL 로의 구현 (9) ADDR_MUX block
– 기능 (1)• 프로그램 메모리의 주소 나타냄• 입 . 출력 변수
A : PC_LOGIC block 으로부터 오는 data (5-bit)B : IR block 에서 오는 data (5-bit)SEL : ‘1’ 이면 A 선택 , ‘0’ 이면 B 선택MUX_OUT : 선택된 값 출력 (5-bit)
• 두 개의 입력 중 SISC 가 수행하고자 하는 연산에 맞는 값을 출력
43
– 기능 (2)• 예 ) Instruction 을 수행하고자 할 때 , IR
레지스터에서 오는 값을 출력하고 , 메모리를 가리켜 데이터를 읽거나 쓰고자 하면 PC_LOGIC 으로부터 오는 값을 출력
• Data 폭이 5bit 짜리인 Multiplexer 사용
44
– VHDL 표현library IEEE;
use IEEE.std_logic_1164.all;
entity ADDR_MUX is
port(A, B: in std_logic_vector(4 downto 0);
SEL: in std_logic;
MUX_OUT: out std_logic_vector(4 downto 0));
end ADDR_MUX;
architecture RTL of ADDR_MUX is
begin
…… 과 제 (3) ……end RTL;
45
– 출력 파형
46
SISC 의 VHDL 로의 구현 (10)
STATE block– 기능
• 하나의 Instruction 은 보통 3-4 개의 Cycle 로 동작
• 이 블록은 현재의 상태를 나타냄
– 특징• RESET = ‘1’ 이면 , 다시 Instruction Cycle 이
처음부터 시작
47
– VHDL 표현
architecture RTL of STATE is
begin
process(CLK, RESET)
begin
if RESET = '1' then
STATE_OUT <= "00";
elsif CLK = '1' and CLK'event then
STATE_OUT <= STATE_IN;
end if;
end process;
end RTL;
48
– 출력 파형
49
SISC 의 VHDL 로의 구현 (11)
CONTROL block– 기능
• 3-bit Op-code 의 명령어와 4 단계로 구분되는 Instruction Cycle 에 따라 , 마이크로 프로세서의 각 데이터 연산 블록에 대한 여러 가지 제어 신호를 내보내는 역할을 한다 .
• 제어 신호는 Multiplexer 에 대한 선택 신호나 메모리를 읽고 쓰는 신호 , 레지스터의 Enable신호이다 .
• 각 단계에서의 동작은 앞 내용 참조
50
– VHDL 표현entity CONTROL is
port(OP: in std_logic_vector(2 downto 0);
ZERO: in std_logic;
PSTATE: in std_logic_vector(1 downto 0);
… 생략 …
SEL: out std_logic;
NSTATE: out std_logic_vector(1 downto 0));
end CONTROL;
architecture CONTROL_A of CONTROL is
begin
process(PSTATE, OP)
begin
case PSTATE is
when FETCH => -- Fetch
LD_MDR <= '0';
LD_ACC <= '0';
… 생략 …
WR <= '0';
… 이하 생략 …
51
– 출력 파형
52
SISC 의 VHDL 로의 구현 (10)
UP(Microprocessor) block– 기능
• 여러 개의 Entity 로 나타낸 각 기능 블럭들을 하나의 Microprocessor 로 동작을 하도록 묶어 준다 .
– 특징• 여기서 작성한 마이크로 프로세서에서는 메모리에
관한 부분이 없다 . 따라서 메모리에서 값이 읽혀지고 쓰여지는 부분은 모두 Altera MaxPlus II의 Wavefrom Editor 에서 직접 값을 입력을 해 주어야 한다 .
53
– 동작• 각 block 들을 마이크로 프로세서를 구성하는 co
mponent 들로 생각하여 각 component 들을 연결시켜 주어야 한다 .
– 주의 사항• 값을 입력할 때는 MEM_ADDR 의 출력 결과를
살펴보고 거기에 맞는 값을 입력해야 한다 .• 출력되는 값이나 주소는 MEM_DATA_IN 에서
알 수 있고 , 입력되는 값은 MEM_DATA_OUT에서 알 수 있다 .
54
– VHDL 표현entity UP is
port(RESET, CLK: in std_logic;
MEM_ADDR: out std_logic_vector(4 downto 0);
… 생략 …
MEM_DATA_OUT: out std_logic_vector(7 downto 0));
end UP;
architecture UP_A of UP is
signal OPCODE_DATA: std_logic_vector(7 downto 0);
signal OP1_DATA: std_logic_vector(7 downto 0);
… 생략 …
signal DOUT_EN: std_logic;
signal PC_OUT: std_logic_vector(4 downto 0);
signal SEL: std_logic;
begin
component ALU
port(OPCODE: in std_logic_vector(2 downto 0);
OP1, OP2: in std_logic_vector(7 downto 0);
ALU_OUT: out std_logic_vector(7 downto 0));
end component;
… 이하 생략 …
55
– 출력파형 (1)
56
– 출력파형 (2)
57
– 출력파형 (3)
58
MaxPlus II 사용시 주의 사항 Tool 의 Project 이름과 파일 이름 , entity
이름은 같게 MaxPlus II 사용 순서
– VHDL 로 구현하고자 하는 블록을 기술– Compile( 틀린 문장이 없는지 검사 )– Waveform Editor(input 값을 파형으로 입력 )– Simulator( 결과 )
알아 두어야 할 것– Waveform Editor 대신 Testbench 를 사용하는 것이 일반적– MaxPlus II 는 특정 Device 에 맞는 synthesis 를 하기 때문에
제한적인 구문 사용
59
프로젝트에 관하여 이 프로젝트에서의 과제
– 다음 세 block 을 설계한다 . • ALU, ACC, ADDR_MUX 3 개의 block• 비어 있는 architecture ( 과제 ) 부분만을 채우면 된다 .
과제 제출– 5 월 30 일 ( 토 ) 까지 수행 결과물과 보고서를 담당
조교에게 제출
VHDL 소스는 IDEC 한양 지역센터 Home Page 에 있으니 , Download 받으시기 바랍니다 .– URL|| http://idec.hanyang.ac.kr/
과제를 수행하는 도중 의문이나 문의할 사항– E-mail: [email protected]
» ( 한국외대 전자공학과 CAD/VLSI LAB. 이선영 )