• Nenhum resultado encontrado

4.3 Sistema de controlo para parque de estacionamento

4.3.1 Controlo Central

As funções básicas do sistema de controlo central são:

ˆ Recepção da informação sobre os lugares vazios no parque de estacionamento;

ˆ Implementação de um buer de prioridades de instruções para carros;

ˆ Envio das instruções para os carros;

ˆ Implementação de algoritmos para abrir e fechar as portas de entrada e saída do parque de estacionamento;

O buer de prioridade utilizado aqui (descrito anteriormente), recebe à entrada infor- mação sobre os lugares vazios sequencialmente e fornece na saída o lugar com maior prioridade que se encontra naquele momento vazio, ordenando assim a sequência da saídas sempre que recebe uma nova entrada, colocando-a na sua posição respectiva de prioridade.



Buffer de Prioridade

Lugares vazios sequencialmente Lugar com maior prioridade

Figura 4.16: Funcionamento básico do buer de prioridade.

No caso especíco deste sistema, quanto maior for o número do lugar de estaciona- mento menor será a sua prioridade.

Convém salientar aqui, que este buer de prioridade implementado apresenta mais complexidade e funcionalidade que este sistema requer, pois para este problema em que o número de lugares de um dado parque de estacionamento é conhecido, existem soluções mais simples como já foi referido anteriormente. Deste modo, este tipo de buer apesar de uma maior complexidade pode ser a solução para um maior número de sistemas. Uma aplicação possível é assim o sistema de controlo de um parque de estacionamento que permite também testar o correcto funcionamento deste buer de prioridade de uma forma visual e interactiva.

No caso do parque de estacionamento as entradas e saídas do buer de prioridade da gura 4.8 vão ter as seguintes funções:

ˆ start: Esta entrada controla o inicio do funcionamento do buer, neste caso está sempre a `1';

ˆ stop: Esta entrada permite parar o funcionamento do buer, neste caso está sempre a `0';

ˆ input: Esta é a entrada principal do buer, neste caso serão colocados aqui os números dos lugares de estacionamento que cam vazios para serem adicionados ao buer.

ˆ data: Esta entrada ca a `1' quando um novo lugar cou vazio, sinalizando assim o buer para este adicionar o lugar que se encontra na entrada anterior input  á memória.

ˆ request: Entrada que quando activa, ordena o buer a fornecer o lugar com maior prioridade que se encontra naquele momento disponível na memória.

ˆ memory empty: Saída que indica quando a memória está vazia, neste caso indica quando o parque está cheio.

ˆ memory full: Saída que indica quando a memória está cheia, neste caso indica quando o parque está vazio.

ˆ ouput: Saída principal do buer, neste caso será fornecido aqui o número do lugar de estacionamento com maior prioridade sempre que é feito um pedido ao buer. ˆ added: Saída que informa quando um novo valor acabou de ser adicionado ao

buer.

ˆ counter: Saída que informa a quantidade de lugares vazios num determinado momento, através do número de elementos que o buer contém num determinado momento.

ˆ error: Saída que informa se há erro na máquina de estados nitos hierárquica paralela, devido ao tamanho da stack. Neste caso não será usada, uma vez que o tamanho da stack foi dimensionado em função do número de lugares do parque de estacionamento de modo a evitar esta situação.

O controlo central é implementado através de uma máquina de estados nitos (FSM), interagindo assim com praticamente todas as partes do sistema, desde o buer até ao controlo dos carros e das portas, bem como com a interface com que o utilizador controla toda a simulação no monitor VGA.

 para_começar reset = 1 a1 a2 a3 a4 Buffer inicializado Buffer incompleto

Lugar novo vazio adicionado Mand a sair carro do estac ionam ento Carro r ece beu ordem

Espera até o carro receber a ordem

Espera que o buffer adicione o nó respectivo N ov o c arr o n a e ntrad a e p arq ue n ão ch eio

Espera que o buffer forneça o próximo lugar

N ov o lu ga r d isp on ivel

Como se pode vericar na gura 4.17, a máquina de estados nitos começa no estado para_começar, onde inicializa o buer, ou seja, constrói a arvore binária contendo todos os lugares do estacionamento, uma vez que no início o parque está completamente livre. Quando acaba de adicionar todos os lugares do estacionamento e o buer ca cheio a máquina passa para o estado a1, estado no qual a máquina de estados se encontra por defeito, pois se nenhum carro entrar ou sair, a máquina de estados permanecerá neste estado.

Combinational Circuit (CC) Memory (FSM register - Rg) Sout PB Open/ close gates 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 0000000000000000 Modules activation Acknowledgement (module terminate/suspend)

A set of HGSs reset 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000A 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000B C DP states DP operations 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 clock clock

Figura 4.18: Controlo central.

No estado a1 o controlo central está sensível às ordens aleatórias de saída de carros geradas por um bloco externo, bem como às ordens do utilizador através da interface criada para esse efeito. Assim, quando é recebida uma ordem para um carro sair do estacionamento, a máquina passa para o estado a2 e espera nesse estado que o carro receba a ordem de saída. Quando a ordem é recebida pelo carro, este envia um aviso (acknowledge) ao controlo central a informar que recebeu a ordem, passando a máquina de estados para o estado a3 onde é adicionado ao buer um novo nó com o valor de prioridade do respectivo lugar. Assim que este acabe de ser actualizado com o novo lugar vazio a máquina volta para o seu estado por defeito (a1), podendo atender a novos pedidos.

Quando chega um novo carro á porta de entrada, se houver lugares livres disponíveis, ou seja, se o parque não estiver cheio, o controlo central passa directamente do estado a1 para o estado a4, aonde vai esperar que o buer forneça o lugar vazio com maior pri- oridade que existe no momento em que este foi requisitado; caso o parque esteja cheio, espera até um lugar que livre para passar para o estado a4. Quando este fornece o novo lugar, a máquina de estados volta outra vez para o seu estado por defeito (a1) e é enviado para o carro que solicitou o lugar no qual ele deve estacionar.

O estado a2 é utilizado como elemento sincronizador entre o controlo central e o controlo de carros, esperando assim que o carro receba a ordem de saída. Os estados a3 e o a4 funcionam como elementos sincronizadores do buer, evitando assim o acesso

à memória ao mesmo tempo para apagar e remover nós, evitando assim erros que caso contrário podiam originar, como por exemplo carem nós na memória desligados e isolados do resto da árvore binária.

O controlo central através de um módulo disponível em [48], utiliza uma das apli- cações do algoritmo linear feedback shift register (LFSR) [3] como gerador de saídas de carros pseudo-aleatórias, em que a frequência de novas saídas de carros aleatórias pode ser alterada pelo utilizador através da interface criada para esse efeito. A variação desta velocidade de saída e obtida através da variação do clock fornecido ao módulo que gera as saídas pseudo-aleatórias.

Figura 4.19: Gerador de saídas de carros aleatórias.

Para a chegada de um determinado número de carros por minuto, que pode ser alterado pelo utilizador durante a simulação, foi também necessária a implementação de um módulo para fazer a divisão, uma vez que esta não é directamente sintetizável para este caso (em que um dos operandos não é constante); assim é determinado o intervalo de tempo entre cada carro novo. Para esta função também foi necessária a utilização de um divisor de frequência para tornar mais simples a contagem dos segundos de intervalo entre os carros novos.

Figura 4.20: Activação de novos carros.

Controlador das portas

Para o controlo das portas de entrada e de saída considerou-se que não há a necessidade da porta fechar depois de um carro passar quando já tem outro carro pronto para passar

por ela, tornando assim o sistema mais rápido e eciente, evitando assim paragens desnecessárias aos carros. Deste modo, para a sua implementação foi utilizado um simples contador para cada porta, um para a entrada e outro para a saída, em que cada contador controla a sua porta respectiva; Estes contadores são só incrementados quando um carro chega a porta respectiva e decrementados apenas quando um carro passa completamente pela porta respectiva. Assim, se o contador for maior que zero, a porta respectiva é aberta, caso contrário, a porta é fechada.

Figura 4.21: Controlo das portas de entrada e saída.

O controlo da porta de entrada também tem em atenção quando o parque se en- contra cheio, fechando esta porta mesmo que um carro novo chegue, só voltando abrir quando pelo menos um lugar car livre.

Figura 4.22: Interface do controlo central com o sistema.