Tor Mikkel Wara
Besvart 27. juni 2018 av forsknings- og høyere utdanningsminister Iselin Nybø
A plataforma do desenvolvimento, utilizada neste projeto e apresentada no Capí- tulo 3, definiu o ambiente do desenvolvimento e as ferramentas disponíveis para a conceção do projeto. A plataforma de desenvolvimento é denominada XUPV2, é dotada com o dispositivo FPGA de alto desempenho XC2VP30 da família Virtex- II Pro do produtor Xilinx e é integrada nas ferramentas do desenvolvimento EDK 10.1. Para o dispositivo em causa, as ferramentas do desenvolvimento possibili- tam a construção de um SoC baseado num dos dois núcleos PPC405 embutidos no dispositivo ou no soft processador MicroBlaze desenvolvido pelo Xilinx.
O projeto implementado no âmbito desta dissertação se baseia no microprocessador PPC405. O hardware microkernel é implementado na forma de um conjunto de periféricos que possuem interface slave PLB (Processor Local Bus). Desta forma, os registos físicos ou virtuais destes periféricos são acedidos a partir do processador através das instruções de leitura ou escrita das respetivas posições da memória. A Figura 5.1 apresenta o diagrama de blocos que mostra a organização do hardware
microkernel.
O hardware microkernel é composto por três componentes: escalonador (Schedu-
ler ), controlador das interrupções que em conjunto com o escalonador proporci-
ona a unificação do espaço de prioridades das tarefas e interrupções (SIC) e o componente que contêm temporizadores dedicados para cada uma das tarefas do
ISOCM Controller SCHEDULER SPLB PPC405 MPLB INTERRUPT CONTROLLER MFSL SFSL t_enable_bit t_valid_bit TASK_N TASK_N preemption INPUTIRQ SPLB irq_arrayIRQ_N TIMERS Timer_is_setTASK_N SPLB ISOCM DSOCM BRAM block 128KB
PORTA PORTA ISOCM
DSOCM Controller BRAM block
64KB
PORTA PORTA DSOCM
Figura 5.1: Arquitetura do hardware microkernel implementado
escalonador (Timers).
Como já foi referido, os requisitos estipulados endereçam a estratégia de escalona- mento fixed-priority preemptive.
Os periféricos são criados com recurso ao wizard CIP e os respetivos procedimentos e particularidades serão apresentados nas secções posteriores. O wizard possibilita configurar IPIF que irá atuar sobre o barramento PLB (normalmente no papel do slave) e selecionar os sinais do IPIC pretendidos (interface visível do lado da lógica customizavel do utilizador). Os três componentes do hardware microkernel apresentam interface slave, acoplado ao barramento PLB, no qual o processador PPC405 atua como master. Cada um dos componentes tem o seu próprio intervalo dos endereços. O processador comunica com os componentes através das instruções de escrita e leitura das respetivas posições da memória.
Existe também um meio de interrupção do processador quando o hardware micro-
kernel requerer. A saída preemption do componente escalonador é ligada direta-
mente ao pino da interrupção externa do processador.
É utilizada a linguagem de descrição do hardware VHDL na definição da lógica cus- tomizada dos periféricos. Foi tirado o proveito das funcionalidades da modelação de alto nível, existentes nessa linguagem, para poder implementar os periféricos de forma genérica e parametrizável. Foram utilizados statements generate para replicação das estruturas e statements generics para caracterização individual da largura em bits de certos sinais, bem como do número de certas estruturas durante
a sua replicação. Os generics foram propagados ao longo da hierarquia das entida- des do projeto estrutural, sendo presentes também nas entidades do topo. Desta forma, e com o uso correto da funcionalidade de importação da ferramenta CIP, ditos parâmetros tornam-se visíveis e configuráveis a partir da interface do XPS durante a construção do SoC.
A Tabela 5.1 enumera os parâmetros visíveis a partir do XPS e que devem ser definidos pelo utilizador aquando integração do hardware microkernel num SoC.
Tabela 5.1: Parâmetros da configuração do hardware microkernel
Generic Scheduler SIC Timers Exemplo
TASK_NUMBER X X X 16
TIMERS_WIDTH X 32
EXT_INT_NUMBER X 4
EXT_INT_CONFIG X 3344
O parâmetro TASK_NUMBER é presente nos todos componentes e configura o número de tarefas que o microkernel irá suportar. Desta forma, no escalonador, este parâmetro define o numero de posições da estrutura que manuseia a informa- ção das tarefas necessária para o escalonamento e indexada pelo identificador da tarefa, o que, por sua vez, define o número de níveis da árvore binária utilizada para extração da tarefa mais prioritária. No componente timers, este parâmetro define o número de temporizadores dedicados, indexados mais uma vez pelo iden- tificador da tarefa. Já no caso do controlador das interrupções, este parâmetro não altera significativamente a estrutura interna deste, resumindo-se a definição da lar- gura dos vetores das entradas t_enable_bit e t_valid_bit utilizados para feedback do escalonador para controlador. Este parâmetro deve ser sempre definido com o valor igual à potencia de dois e os exemplos são: 8, 16, 32 (tarefas). Obviamente que o valor definido deve ser o mesmo para todos os componentes, resultando num erro do XPS no caso contrário.
O parâmetro TIMERS_WIDTH define a largura em bits dos temporizadores de- dicados. Sendo o valor por defeito igual ao 32.
O parâmetro EXT_INT_NUMBER define o número de entradas do controlador das interrupções, isto é, o número de possíveis fontes de interrupção que podem ser ligados ao controlador das interrupções. Este parâmetro não tem restrição na sua definição, sendo a única limitação a área da FPGA, que não será o problema para um número comum de interrupções externos nos sistemas embebidos.
O parâmetro EXT_INT_CONFIG configura o modo da interrupção das respeti- vas entradas. Este parâmetro é compreendido num número inteiro, em que cada digito corresponde ao modo da interrupção de uma entrada (o número dos dígi- tos deve corresponder ao número das entradas). O digito mais a esquerda (mais significativo) corresponde ao fonte da interrupção com índice 0, o próximo digito - fonte com índice 1, e por aí em diante. O controlador das interrupções imple- menta quatro modos da interrupção: “1” - nível alto, “2” - nível baixo, “3” - flanco ascendente, “4” - flanco descendente. Assim sendo, para o caso exemplificado na tabela, o controlador das interrupções irá ter quatro fontes de interrupção (en- tradas), entre quais: irq_array(0) e irq_array(1) seráo configurados com o modo flanco ascendente, enquanto irq_array(2) e irq_array(3) - flanco descendente.