Você está na página 1de 20

UNIVERSIDADE FEDERAL DE SO PAULO

Instituto de Cincia e Tecnologia


Campus So Jos dos Campos

Relatrio: Apresentao da Controladora

Pedro Henrique de Oliveira Lopes Costa RA 86923


Professor Dr. Tiago de Oliveira Disciplina: Laboratrio de Arquitetura e
Organizao de Computadores

22 de junho de 2015
So Jos dos Campos SP

RESUMO
O projeto em si consiste na elaborao de um processador, passando pela
definio de quais instrues ele deve ser capaz de processar, at o
processamento efetivo de tais. Em um primeiro momento restringimo-nos a
definir as instrues e fazer um esquemtico de como seria a parte funcional do
processador. Seguindo, apresentamos a descrio em Verilog da memria
principal, memria de instrues, PC, ULA e banco de registradores. Agora
ento, apresentamos a descrio dos mdulos chamados de controladora e de
processamento. Sendo assim, vale ressaltar que a ideia do projeto do aluno a
construo de um processador o qual pretende realizar operaes bsicas e
operaes um pouco mais elaboradas, sendo que em um futuro prximo,
deveremos rodar um sistema operacional e criar um compilador para funcionar
neste processador.

SUMRIO
1.
2.
3.
4.
5.
6.

Introduo..........................................................................Pgina 4
Objetivos............................................................................Pgina 5
Fundamentao Terica....................................................Pgina 6
Desenvolvimento do Trabalho...........................................Pgina 8
Discusses.........................................................................Pgina 19
Referncias Bibliogrficas..................................................Pgina 20

Listas de Figuras e Tabelas:


Fig 1. Esquemtico de funcionamento e caminhos do processador. Pgina 6
Fig 2. Diagrama de ondas para controladora.................................. Pgina 15
Tab 1: Formato da instruo............................................................. Pgina 8

1. INTRODUO
As unidades de controle dos processadores tem por funes, trs
operaes bsicas: buscar, decodificar e executar. Sendo assim, os
processadores funcionam de maneira cclica, sempre passando por essas trs
operaes. Existem muitos modelos de processadores nos mercados, sendo
que eles possuem dois tipos de unidades de controle: fixa ou programvel. Os
programveis possuem a opo de terem as instrues escritas pelos
programador, enquanto as unidades de controle fixas possuem as instrues j
programadas. Exemplos de processadores de controladoras fixas so os
8080/8085.
No caso do projeto em questo, estamos construindo um processador
com conjunto fixo de instrues, ou seja, nossa controladora j ter as instrues
pr-gravadas nela, cabendo ela apenas interpretar as instrues de entrada.
Visto isso, percebemos que a elaborao de um processador baseada
em etapas, onde em uma primeira etapa, devemos definir a finalidade a qual o
nosso processador deseja atender, seguido das definies de quais instrues
que ele deve executar e como executar, para ento comearmos a parte prtica,
fazendo cada mdulo que ir compor partes do processador. Neste relatrio
iremos descrever o processo de construo para a controladora e para o
processamento.

2. OBJETIVOS
Os objetivos gerais do projeto so descrever em Verilog um processador
capaz de realizar operaes aritmticas e lgicas bsicas, compreendendo
instrues e realizando-as. No entanto, os objetivos especficos dessa etapa so
a apresentao dos cdigos em Verilog e os diagramas de onda dos mdulos
controladora e processamento, demonstrando assim o andamento do projeto.
Esta a ltima etapa antes da execuo das descries no FPGA.

3. FUNDAMENTAO TERICA
Na hora de descrever um processador em Verilog, precisamos saber
como as coisas acontecem na execuo desse tipo de linguagem e ainda como
um processador deve funcionar e ser dividido.
Como dito em [1] e [2], em uma unidade de controle temos o
entendimento do opcode de uma instruo, enviando sinais para cada um dos
mdulos, dizendo para cada um se ele deve ou no executar algo e como
executar. No caso do projeto em questo, a controladora far ainda mais coisas
como ser visto mais frente, visto que ela, ao interpretar o opcode, divide o
cdigo de instruo em partes, onde cada parte um endereo ou um valor.
Outro ponto importante dito em [3] o que precisamos para montar um
processador, ou seja, os mdulos necessrios para o bom funcionamento de um
processador. Neste assunto, temos que precisaremos de um esquema com ULA,
PC, memria ram, memria de instrues, banco de registradores, uma
controladora e um mdulo que rena o funcionamento de todos eles.
Colocado estes pontos, vamos apresentar novamente nosso esquemtico
(j apresentado no primeiro e segundo relatrios), com os ajustes finais feitos. A
Figura 1 representa esse esquemtico.

Figura 1. Esquemtico de funcionamento e caminhos do processador.

Na Figura 1, vemos que do relatrio 1 e do 2 para esse tivemos a


colocao e o endereamento de cada canal de ligao para os mdulos, onde
cada linha representa um sinal que transmitido entre os mdulos.

4. DESENVOLVIMENTO DO TRABALHO
Depois de construdas a memria principal, a memria de instrues, o
banco de registradores, a ULA e o contador de programa, nos atentamos agora
para as unidade chamadas de controladora e de processamento.
Como j tnhamos definido, a escolha do tamanho da instruo feita foi de
32 bits, divididos conforme a Tabela 1.
Tabela 1: Formato da instruo
Op code
(5 bits)

Onde gravar
(5 bits)

Onde ler
(5 bits)

Onde ler ou
valor inteiro
(5 bits ou 0
bits)

Valor inteiro ou endereo de


memria
(12 bits ou 17 bits 16 bits
usuais)

Sendo assim, teramos 32 registradores disponveis (25) e um Op code


capaz de entender 32 instrues diferentes para serem executadas. Em Onde
gravar e Onde ler temos os registradores que devem servir de destino e de
origem para os dados. J em Valor inteiro e Endereo de memria temos um
valor para operaes imediatas ou um endereo de memria que ser usado em
operaes do tipo load e store.
Feitas as devidas colocaes, seguimos com o cdigo do mdulo
controladora, seguido do seu diagrama de ondas, representado na Figura 2.
1

module controladora(

input [31:0]instrucao_saida,

output reg [4:0]controle_ula,

output reg [15:0]valor,

output reg [15:0]endereco_branch,

output reg [1:0]controle_registradores,

output reg [4:0]endereco_registrador3,

output reg [4:0]endereco_registrador2,

output reg [4:0]endereco_registrador1,

10

output reg [1:0]controle_memoria,

11

output reg [15:0]endereco_memoria,

12

output reg [15:0]registrador_memoria,

13

output reg [15:0]jump,

14

output reg [1:0]controle_pc,

15

output reg [1:0]controle_moduloio


8

16

);

17
18

always@(instrucao_saida)

19

begin

20

if(instrucao_saida[31:27]==5'b00000) //add

21

begin

22

controle_ula=5'b00000;

23

controle_registradores=2'b01;

24

controle_pc=2'b00;

25

endereco_registrador1=instrucao_saida[26:22];

26

endereco_registrador2=instrucao_saida[21:17];

27

endereco_registrador3=instrucao_saida[16:12];

28

end

29

if(instrucao_saida[31:27]==5'b00001) //addi

30

begin

31

controle_ula=5'b00001;

32

controle_pc=2'b00;

33

endereco_registrador1=instrucao_saida[26:22];

34

endereco_registrador2=instrucao_saida[21:17];

35

valor=instrucao_saida[15:0];

36

end

37

if(instrucao_saida[31:27]==5'b00010) //sub

38

begin

39

controle_ula=5'b00010;

40

controle_registradores=2'b01;

41

controle_pc=2'b00;

42

endereco_registrador1=instrucao_saida[26:22];

43

endereco_registrador2=instrucao_saida[21:17];

44

endereco_registrador3=instrucao_saida[16:12];

45

end

46

if(instrucao_saida[31:27]==5'b00011) //subi

47

begin

48

controle_ula=5'b01101;

49

controle_pc=2'b00;

50

endereco_registrador1=instrucao_saida[26:22];

51

endereco_registrador2=instrucao_saida[21:17];

52

valor=instrucao_saida[15:0];

53

end

54

if(instrucao_saida[31:27]==5'b00100) //and

55

begin

56

controle_ula=5'b00011;

57

controle_registradores=2'b01;

58

controle_pc=2'b00;

59

endereco_registrador1=instrucao_saida[26:22];

60

endereco_registrador2=instrucao_saida[21:17];

61

endereco_registrador3=instrucao_saida[16:12];

62

end

63

if(instrucao_saida[31:27]==5'b00101) //andi

64

begin

65

controle_ula=5'b01010;

66

controle_pc=2'b00;

67

endereco_registrador1=instrucao_saida[26:22];

68

endereco_registrador2=instrucao_saida[21:17];

69

valor=instrucao_saida[15:0];

70

end

71

if(instrucao_saida[31:27]==5'b00110) //or

72

begin

73

controle_ula=5'b00100;

74

controle_registradores=2'b01;

75

controle_pc=2'b00;

10

76

endereco_registrador1=instrucao_saida[26:22];

77

endereco_registrador2=instrucao_saida[21:17];

78

endereco_registrador3=instrucao_saida[16:12];

79

end

80

if(instrucao_saida[31:27]==5'b00111) //ori

81

begin

82

controle_ula=5'b01011;

83

controle_pc=2'b00;

84

endereco_registrador1=instrucao_saida[26:22];

85

endereco_registrador2=instrucao_saida[21:17];

86

valor=instrucao_saida[15:0];

87

end

88

if(instrucao_saida[31:27]==5'b01000) //jump

89

begin

90

controle_pc=2'b01;

91

jump=instrucao_saida[15:0];

92

end

93

if(instrucao_saida[31:27]==5'b01001) //branch

94

begin

95

controle_ula=5'b00111;

96

controle_registradores=2'b01;

97

controle_pc=2'b10;

98

endereco_branch=instrucao_saida[15:0];

99

endereco_registrador2=instrucao_saida[26:22];

100

endereco_registrador3=instrucao_saida[27:17];

101

end

102

if(instrucao_saida[31:27]==5'b01010) //branch not equal

103

begin

104

controle_ula=5'b01000;

105

controle_registradores=2'b01;

11

106

controle_pc=2'b10;

107

endereco_branch=instrucao_saida[15:0];

108

endereco_registrador2=instrucao_saida[26:22];

109

endereco_registrador3=instrucao_saida[27:17];

110

end

111

if(instrucao_saida[31:27]==5'b01011) //slt

112

begin

113

controle_ula=5'b00101;

114

controle_registradores=2'b01;

115

controle_pc=2'b00;

116

endereco_registrador1=instrucao_saida[26:22];

117

endereco_registrador2=instrucao_saida[21:17];

118

endereco_registrador3=instrucao_saida[16:12];

119

end

120

if(instrucao_saida[31:27]==5'b01100) //slti

121

begin

122

controle_ula=5'b00110;

123

controle_pc=2'b00;

124

endereco_registrador1=instrucao_saida[26:22];

125

endereco_registrador2=instrucao_saida[21:17];

126

endereco_registrador3=instrucao_saida[16:12];

127

end

128

if(instrucao_saida[31:27]==5'b01101) //load

129

begin

130

controle_memoria[1:0]=2'b00;

131

controle_registradores=2'b10;

132

controle_pc=2'b00;

133

endereco_registrador1=instrucao_saida[26:22];

134

endereco_memoria=instrucao_saida[15:0];

135

end

12

136

if(instrucao_saida[31:27]==5'b01110) //store

137

begin

138

controle_memoria[1:0]=2'b01;

139

controle_pc=2'b00;

140

endereco_registrador1=instrucao_saida[26:22];

141

endereco_memoria=instrucao_saida[15:0];

142

end

143

if(instrucao_saida[31:27]==5'b01111) //not

144

begin

145

controle_ula=5'b01001;

146

controle_registradores=2'b01;

147

controle_pc=2'b00;

148

endereco_registrador1=instrucao_saida[26:22];

149

endereco_registrador2=instrucao_saida[21:17];

150

endereco_registrador3=instrucao_saida[16:12];

151

end

152

if(instrucao_saida[31:27]==5'b10000) //noti

153

begin

154

controle_ula=5'b01100;

155

controle_pc=2'b00;

156

endereco_registrador1=instrucao_saida[26:22];

157

endereco_registrador2=instrucao_saida[21:17];

158

valor=instrucao_saida[15:0];

159

end

160

if(instrucao_saida[31:27]==5'b10001) //input

161

begin

162

controle_moduloio=2'b00;

163

controle_pc=2'b00;

164

end

165

if(instrucao_saida[31:27]==5'b10010) //output

13

begin

166
167

controle_moduloio=2'b01;

168

controle_pc=2'b00;

169

end

170

if(instrucao_saida[31:27]==5'b10011) //>=

171

begin

172

controle_ula=5'b01110;

173

controle_registradores=2'b01;

174

controle_pc=2'b00;

175

endereco_registrador1=instrucao_saida[26:22];

176

endereco_registrador2=instrucao_saida[21:17];

177

endereco_registrador3=instrucao_saida[16:12];

178

end

179

if(instrucao_saida[31:27]==5'b10100) //>=i

180

begin

181

controle_ula=5'b01111;

182

controle_pc=2'b00;

183

endereco_registrador1=instrucao_saida[26:22];

184

endereco_registrador2=instrucao_saida[21:17];

185

valor=instrucao_saida[15:0];

186

end

187

if(instrucao_saida[31:27]==5'b10101) //loadi

188

begin

189

controle_pc=2'b00;

190

controle_registradores=2'b10;

191

endereco_registrador1=instrucao_saida[26:22];

192

registrador_memoria=instrucao_saida[15:0];
end

193
194

end

195

endmodule

14

Na Figura 2 vemos que controladora est executando corretamente a leitura das


instrues que entram e separando cada bit dela de acordo com a instruo,
enviando os sinais de controles para os mdulos e tambm os endereos de
escrita e, ou, leitura.

Figura 2. Diagrama de ondas para controladora.

Nas prximas linhas veremos ento a descrio para o processamento, o


qual no iremos expor o diagrama de ondas, por ainda no termos carregado a
memria de instrues com instrues, mas os testes apontam o bom
funcionamento de todos os mdulos, estando preparados para ser executado no
FPGA.
196

module processamento(

197

input clk,

198

output [31:0]testeinstrucao,

199

output [4:0]testereg1,

200

output [4:0]testereg2,

201

output [4:0]testereg3,

202

output [15:0]testula,

203

output [15:0]testememprincipal

204

);

205
206

wire [15:0]pc;

207

wire [31:0]instrucao_saida;

208

wire [1:0]controle_registradores;

209

wire [4:0]endereco_registrador1;
15

210

wire [4:0]endereco_registrador2;

211

wire [4:0]endereco_registrador3;

212

wire [15:0]ula;

213

wire [15:0]registrador_memoria;

214

wire [1:0]controle_memoria;

215

wire [15:0]endereco_memoria;

216

wire [15:0]store;

217

wire [3:0]controle_ula;

218

wire [15:0]valor;

219

wire [15:0]valor1;

220

wire [15:0]valor2;

221

wire [15:0]endereco_branch;

222

wire [1:0]controle_pc;

223

wire [15:0]branch;

224

wire [15:0]jump;

225

wire [1:0]controle_moduloio;

226
227

memoriainstrucao(.pc(pc),

228

.clk(clk),

229

.instrucao_saida(instrucao_saida));

230

controladora(.instrucao_saida(instrucao_saida),

231

.controle_ula(controle_ula),

232

.valor(valor),

233

.endereco_branch(endereco_branch),

234

.controle_registradores(controle_registradores),

235

.endereco_registrador3(endereco_registrador3),

236

.endereco_registrador2(endereco_registrador2),

237

.endereco_registrador1(endereco_registrador1),

238

.controle_memoria(controle_memoria),

239

.endereco_memoria(endereco_memoria),

16

240

.jump(jump),

241

.controle_pc(controle_pc),

242

.controle_moduloio(controle_moduloio));

243

bancoderegistradores(.controle_registradores(controle_registradores),

244

.endereco_registrador1(endereco_registrador1),

245

.endereco_registrador2(endereco_registrador2),

246

.endereco_registrador3(endereco_registrador3),

247

.ula(ula),

248

.registrador_memoria(registrador_memoria),

249

.clk(clk),

250

.valor1(valor1),

251

.valor2(valor2),

252

.store(store));

253

memoriaprincipal(.controle_memoria(controle_memoria),

254

.endereco_memoria(endereco_memoria),

255

.store(store),

256

.clk(clk),

257

.registrador_memoria(registrador_memoria));

258

unidadelogicaearitmetica(.controle_ula(controle_ula),

259

.valor1(valor1),

260

.valor2(valor2),

261

.valor(valor),

262

.endereco_branch(endereco_branch),

263

.ula(ula),

264

.branch(branch));

265

contadordeprograma(.controle_pc(controle_pc),

266

.jump(jump),

267

.branch(branch),

268

.clk(clk),

269

.pc(pc));

17

270

assign testeinstrucao=instrucao_saida;

271

assign testereg1=endereco_registrador1;

272

assign testereg2=endereco_registrador2;

273

assign testereg3=endereco_registrador3;

274

assign testememprincipal=endereco_memoria;

275

assign testula=ula;

276

endmodule

18

5. DISCUSSES
Depois do que foi apresentado, percebemos que at ento nenhuma parte
apresentou erro de execuo, os erros podero surgir na fase que segue, ou
seja na fase de execuo das descries no FPGA. Podemos dizer tambm, que
no h atraso no cronograma esperado para o projeto, sendo que os testes para
execuo no FPGA j comearam a serem feitos.

19

6. REFERNCIAS BIBLIOGRFICAS
1 DIAS, MORGADO: Sistemas Digitais Princpios e Prtica, 3
edio.
2 HARRIS, DAVID MONEY: Digital Design and Computer Architecture;
3 STALLINGS, WILLIAM: Arquitetura e Organizao de
Computadores, 8 edio;

20