Вы находитесь на странице: 1из 17

NE8730 SISTEMAS DIGITAIS III

PROJETO 2: Implementao de firmware para processador em FPGA

Turma: Nome: Nmero:

620 THOMS OLIVEIRA HORTA 12210360-9

Descrio do Projeto
Os objetivos
Foi fornecida uma CPU simplificada na forma de projeto do Xilinx ISE que realiza 16 instrues apenas, listadas mais adiante. A partir desse arquivo, deve-se desenvolver um programa (firmware) que ordene, em ordem crescente, 6 nmeros aleatrios que so inseridos pelo usurio e apresente, no final, essa ordem como sada. O projeto ser implementado em uma FPGA e a CPU est especificada em RTL (Register Transfer Level). A CPU fornecida composta de memria de dados, memria de instrues (que armazena as instrues em linguagem de mquina), registradores de dados, IO de entrada e sada de 8 bits cada, uma Unidade Lgica Aritmtica (ALU), uma mquina de estados (que gerencia o sequenciamento das operaes) e o relgio de tempo que sincroniza e gera os ciclos de mquina. O objetivo principal do projeto a familiarizao em implementao RTL e introduo a sistemas digitais programveis (CPU).

Figura 1 Representao RTL simplificada do processador fornecido

As condies
O processador em RTL fornecido executa apenas determinadas instrues e foi necessrio criar um firmware que, utilizando essas instrues, faz o processamento pedido. Para a execuo das instrues, a unidade de controle possui uma mquina de estados (bloco de controle) que controla a unidade operacional, constituda de memria de dados, interface I/O, MUX 4x1, banco de 16 registradores de 8 bits e unidade lgica e aritmtica (ALU).

O projeto
Inicialmente deve ser dado o reset do programa, atravs de um push-button. Neste momento, o programa criado ser carregado para a memria de instrues. Em seguida, deve-se inserir 6 nmeros distintos atravs das oito chaves fornecidas, o que corresponde a 8 bits binrios, sempre ativando o comando run aps cada insero, j que o processador entra na instruo de HALT aps cada entrada. Aps cada insero e ativao de run, o nmero inserido ser exibido nos leds da placa, sendo que, aps a ltima insero, deve-se ativar novamente o comando run para que programa de ordenao dos nmeros seja iniciado. O primeiro nmero da sequncia deve aparecer nos leds e o processador encontra uma instruo de HALT, portanto, para visualizar cada nmero da sequncia, deve-se apertar o comando run. Exemplo: so inseridos os nmeros 120369 => a sada do processador ser 012369.

Tabela 1 Instrues do processador, em Assembly

Realizao do Projeto
A Soluo Utilizada
Para a realizao do projeto foi necessria a criao de uma lgica de funcionamento utilizando as instrues conhecidas pelo processador. Primeiramente foi criado um Fluxograma e, a partir dele, foi criado um algoritmo utilizando uma linguagem conhecida como Assembly que, em seguida, foi convertida para a linguagem de mquina / VHDL. Esta ltima foi implementada no cdigo VHDL da memria de instrues do processador (prom.vhd). Basicamente, o programa de ordenao consiste na realizao de diversas comparaes entre os valores inseridos na ordem, isto , compara a posio1 com as outras, colocando o valor mais baixo para a primeira posio, isto , para a prpria posio1, em seguida comparando a

posio2 com as restantes (posio3, posio4, posio5 e posio6) e coloca o valor mais baixo na posio atual, posio2, e assim por diante; at que todos estejam ordenados em ordem crescente. Foram utilizados endereos da memria para as posies.

Fluxograma

Algoritmo em Assembly
0 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 HALT IN OUT MOV HALT IN OUT MOV HALT IN OUT MOV HALT IN OUT MOV HALT IN OUT MOV HALT IN OUT MOV HALT MOV OUT MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV R0 R0 d1 R0 R0 d2 R0 R0 d3 R0 R0 d4 R0 R0 d5 R0 R0 d6 R15 R15 R1 R2 R0 35 d1 d2 R1 R2 R0 42 d1 d3 R1 R2 R0 49 d1 d4 R1 R2 R0 56 d1 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF d5 R1 R2 R0 62 d1 d6 R1 R2 R0 70 d2 d3 R1 R2 R0 77 d2 d4 R1 R2 R0 84 d2 d5 R1 R2 R0 90 d2 d6 R1 R2 R0 98 d3 d4 R1 R2 R0 105 d3 d5 R1 R2 R0 R1 d1 d6 R2

R0

R1

R0

R2 R1 d2 d3 R2

R1

R0

R0

R2 R1 d2 d4 R2

R1

R0

R0 c255 d1 d2 R2

R2 R1 d2 d5 R2

R1

R1

R2 R1 d2 d6 R2

R1

R2 R1 d1 d3 R2

R1

R2 R1 d3 d4 R2

R1

R2 R1 d1 d4 R2

R1

R2 R1 d3 d5 R2

R1

R2 R1 d1 d5 R2

R1

R2 R1 d3 d6 R2

R1

R2

108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149

GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV SUB JMPF GOTO MOV MOV MOV MOV MOV MOV MOV MOV OUT HALT OUT HALT OUT HALT OUT HALT OUT HALT OUT GOTO

111 d3 d6 R1 R2 R0 119 d4 d5 R1 R2 R0 126 d4 d6 R1 R2 R0 132 d5 d6 R1 R2 R3 R4 R5 R6 R1 R2 R3 R4 R5 R6 0

R2 R1 d4 d5 R2

R1

R2 R1 d4 d6 R2

R1

R2 R1 d5 d6 R2

R1

R2 R1 d1 d2 d3 d4 d5 d6

Registradores R e endereos de memria d: R0 inicialmente utilizado para armazenar o nmero inserido nas chaves temporariamente; utilizado depois para armazenar o resultado das subtraes (registrador utilizado como rascunho) R1 inicialmente utilizado para guardar o valor da posio atual que est sendo comparada com as demais; utilizado depois para armazenar o primeiro valor da sequncia organizada R2 utilizado para guardar o valor da posio que est sendo comparada com a principal; utilizado depois para armazenar o segundo valor da sequncia organizada R3 - utilizado para armazenar o terceiro valor da sequncia organizada R4 - utilizado para armazenar o quarto valor da sequncia organizada R5 - utilizado para armazenar o quinto valor da sequncia organizada R6 - utilizado para armazenar o sexto valor da sequncia organizada dN (N = 1, 2, ...6) inicialmente utilizado para armazenar o valor da N-sima posio inserida; utilizado depois para armazenar o Nsimo valor da sequncia, parcialmente durante o processamento e totalmente ao final do programa Funcionamento bsico: Insero dos nmeros: Ao apertar o boto run o programa coloca o valor inserido nas chaves em um registrador R0 e em seguida move esse valor para uma posio de memria dN onde N a posio que foi inserida, de um a seis, mostrando esse valor nos Leds e, em seguida, retornando ao estado de HALT. Ordenao: Ao inserir o ltimo nmero, deve-se apertar o boto run para iniciar a etapa de ordenao. Nessa etapa, todos os Leds se acendem e as posies so comparadas sequencialmente da seguinte

forma geral: faz-se uma subtrao entre dN e dN+1 e analisa-se o resultado dessa conta. Se dN>dN+1, ento o valor de dN+1 colocado em dN e o valor de dN colocado em dN+1. Se dN<dN+1, os valores permanecem em suas posies. Aps essa comparao, compara-se dN com dN+2 at chegar na comparao de dN com d6. Trmino da ordenao: Quando dN for igual a d6 a sequncia que se encontra nos endereos de memria de d1 a d6 esto ordenados em ordem crescente. Exibio do resultado: Aps a ordenao dos nmeros, o primeiro valor da sequncia aparece nos Leds e o processador entra em estado de HALT, devendo ser pressionado o boto run para exibir o prximo valor da sequncia, e assim sucessivamente. Aps a exibio do ltimo valor o programa reinicializado, voltando primeira instruo de HALT.

O Cdigo VHDL
Cdigo do firmware em prom.vhd:
tmp_rom <= ( 0 => x"F000", 1 => x"2000", 2 => x"3000", 3 => x"1001", 4 => x"F000", 5 => x"2000", 6 => x"3000", 7 => x"1002", 8 => x"F000", 9 => x"2000", 10 => x"3000", 11 => x"1003", 12 => x"F000", 13 => x"2000", 14 => x"3000", 15 => x"1004", 16 => x"F000", 17 => x"2000", 18 => x"3000", 19 => x"1005", 20 => x"F000", 21 => x"2000", 22 => x"3000", 23 => x"1006", 24 => x"F000", 25 => x"4FFF", --acende todos os leds 26 => x"3F00", --acende todos os leds 27 => x"0101", --coloca D1 em R1 28 => x"0202", --inicio comp d1 e d2 29 => x"6021", 30 => x"D000", 31 => x"B023", 32 => x"1201", 33 => x"1102", 34 => x"0101", --fim 35 => x"0203", --inicio comp d1 e d3 36 => x"6021", 37 => x"D000", 38 => x"B02A", 39 => 40 => 41 => 42 => 43 => 44 => 45 => 46 => 47 => 48 => 49 => 50 => 51 => 52 => 53 => 54 => 55 => 56 => 57 => 58 => 59 => 60 => 61 => 62 => 63 => 64 => 65 => 66 => 67 => 68 => 69 => 70 => 71 => 72 => 73 => 74 => 75 => 76 => 77 => 78 => x"1201", x"1103", x"0101", x"0204", x"6021", x"D000", x"B031", x"1201", x"1104", x"0101", x"0205", x"6021", x"D000", x"B038", x"1201", x"1105", x"0101", x"0206", x"6021", x"D000", x"B03E", x"1201", x"1106", x"0102", x"0203", x"6021", x"D000", x"B046", x"1202", x"1103", x"0102", x"0204", x"6021", x"D000", x"B04D", x"1202", x"1104", x"0102", x"0205", x"6021", --fim --inicio comp d1 e d4

--fim --inicio comp d1 e d5

--fim --inicio comp d1 e d6

--fim --coloca D2 em R1 --inicio comp d2 e d3

--fim --inicio comp d2 e d4

--fim --inicio comp d2 e d5

79 => 80 => 81 => 82 => 83 => 84 => 85 => 86 => 87 => 88 => 89 => 90 => 91 => 92 => 93 => 94 => 95 => 96 => 97 => 98 => 99 => 100 => 101 => 102 => 103 => 104 => 105 => 106 => 107 => 108 => 109 => 110 => 111 => 112 => 113 => 114 => 115 => 116 => 117 => 118 => 119 => 120 => 121 => 122 => 123 => 124 => 125 => 126 => 127 => 128 => 129 => 130 => 131 => 132 => 133 => 134 => 135 =>

x"D000", x"B054", x"1202", x"1105", x"0102", x"0206", x"6021", x"D000", x"B05A", x"1202", x"1106", x"0103", x"0204", x"6021", x"D000", x"B062", x"1203", x"1104", x"0103", x"0205", x"6021", x"D000", x"B069", x"1203", x"1105", x"0103", x"0206", x"6021", x"D000", x"B06F", x"1203", x"1106", x"0104", x"0205", x"6021", x"D000", x"B077", x"1204", x"1105", x"0104", x"0206", x"6021", x"D000", x"B07E", x"1204", x"1106", x"0105", x"0206", x"6021", x"D000", x"B084", x"1205", x"1106", x"0101", x"0202", x"0303", x"0404",

--fim --inicio comp d2 e d6

--fim --coloca D3 em R1 --inicio comp d3 e d4

136 => 137 => 138 => 139 => 140 => 141 => 142 => 143 => 144 => 145 => 146 => 147 => 148 => 149 =>

x"0505", x"0606", x"3100", --exibe R1 x"F000", x"3200", --exibe R2 x"F000", x"3300", --exibe R3 x"F000", x"3400", --exibe R4 x"F000", x"3500", --exibe R5 x"F000", x"3600", --exibe R6 x"B000", others => "0000000000000000");

--fim --inicio comp d3 e d5

--fim --inicio comp d3 e d6

Observaes: O cdigo representa apenas a parte do arquivo prom fornecido que foi modificada para que objetivo do projeto fosse cumprido, isto , representa apenas o firmware propriamente dito, correspondente ao algoritmo apresentado anteriormente na linguagem Assembly.

--fim --coloca D4 em R1 --inicio comp d4 e d5

--fim --inicio comp d4 e d6

--fim --coloca D5 em R1 --inicio comp d5 e d6

--fim

Simulaes Funcionais:

Figura A Insero de um nmero (primeiro nmero)

Figura B Insero de todos os nmeros: 1, 2, 0, 3, 6 e 9

Figura C Comparao entre duas posies em que dN<dN+1 (no caso, d1<d2)

Figura D Comparao entre duas posies em que dN>dN+2 (no caso, d1>d3) e inverso de ordem

Figura E Ordenao de todos os nmeros

Figura F Exibio de uma posio do resultado (no caso, primeira posio = 0)

Figura G Exibio do resultado, nmeros ordenados em ordem crescente

Figura H Exibio da simulao inteira

Concluso
O projeto teve como objetivo a criao e implementao em placa de testes de um firmware utilizado para ordenar uma quantidade definida de nmeros distintos em ordem crescente, atravs de um processador programvel em RTL fornecido. Foi possvel verificar e entender o funcionamento detalhado do processador programvel feito em VHDL, mesmo sendo necessrio apenas alterar apenas um de seus componentes, a memria de instrues. Durante a criao do algoritmo foi verificado que existiam, pelo menos, duas maneiras distintas de realizar a tarefa requisitada. Abaixo est uma breve explicao sobre cada uma dessas maneiras.

Comparao entre um valor e TODOS os demais, linearmente: por esse mtodo, que foi utilizado neste projeto, pegamos uma posio da sequncia e a comparamos com as demais posies, colocando o nmero mais baixo dentre os comparados na posio escolhida. Desse modo, a sequncia final obtida na ordem. O cdigo de comparao no pode ser reutilizado por outra posio, portanto, o cdigo fica grande e estritamente seqencial, isto , no possui loops.

Comparao entre dois valores consecutivos, com loop: por esse mtodo, so comparadas duas posies consecutivas e, em caso de a posio dN ser maior que a dN+1 feita uma inverso e o cdigo retorna para a primeira comparao, isto , entre a primeira posio e a segunda. O cdigo de comparao feito entre duas posies consecutivas sempre d1 e d2, d2 e d3, etc. e em caso de inverso o cdigo reinicia as comparaes, portanto, o cdigo fica menor e com loops. Foi escolhido o primeiro mtodo porque, mesmo sendo maior, acredita-se que, por fazer cada comparao apenas UMA vez, ele seja mais rpido em relao ao segundo, que mesmo que as primeiras posies j estejam ordenadas, compara TODOS os pares de posies sempre que h inverso entre dois nmeros da sequncia.

Вам также может понравиться