Interface FIFO
Nas condic¸˜oes iniciais do projecto o sistema constru´ıdo deveria ser capaz de comunicar com m´odulo escravo que fossem acrescentados posteriormente. Esses m´odulos podiam ter frequˆencias de rel´ogio totalmente distintas das do SoC, e seriam simples, n˜ao possuindo um processador. Precisariam de escrever para o SoC sempre que tivessem dados este lhos pedisse, e de ler do SoC sempre que este tivesse dados para eles.
Assim, optou-se por utilizar um sistema de comunicac¸˜ao simples e que trabalhe de forma ass´ıncrona.
A comunidade OpenRISC ainda n˜ao tinha dispon´ıvel qualquer n´ucleo deste tipo. Por ser uma comunicac¸˜ao simples, ass´ıncrona, e onde era importante uma elevada de taxa de transferˆencia de dados, ponderou-se a utilizac¸˜ao de duas mem´orias do tipo FIFO, uma para cada ponderou-sentido. Como ponderou-se pretendia uma comunicac¸˜ao r´apida, os dados s˜ao enviados em paralelo, permitindo assim uma grande reduc¸˜ao do tempo de transmiss˜ao.
Como se pode ver na figura 5.1, o n´ucleo de FIFO desenvolvido tem dispon´ıvel uma interface Wish-bone para comunicac¸˜ao com o processador do SoC e outra interface que utiliza 8 sinais, sendo que os 4 sinais com prefixo M2S permitem escrever no n´ucleo escravo e os outros 4 sinais com prefixo S2M permitem ler do escravo. Em cada grupo os sinais de dados s˜ao identificados com o sufixo dat, havendo ainda sinais que habilitam a leitura (sufixo re) e a escrita (sufixo we), bem como sinais que informam o escravo do estado da FIFO: vazio (sufixo empty) ou cheia (sufixo full).
Figura 5.1:Esquem´atico do sistema de comunicac¸˜ao FIFO.
Como j´a foi dito anteriormente, o n´ucleo de FIFOs utiliza duas mem´orias FIFO para a transmiss˜ao de dados em cada sentido, como se pode ver na figura 5.2. Os dados que s˜ao enviados pelo Wishbone s˜ao guardados na FIFO at´e que o m´odulo escravo pec¸a para os ler (M2S FIFO). Quando o escravo pretende enviar dados para o sistema, envia-os para a mem´oria FIFO, representada na figura com o nome de S2M FIFO, sendo estes dados guardados na mem´oria at´e que o processador os pec¸a `a interface FIFO. O processador, antes de enviar ou ler dados da interface, dever´a ter em atenc¸˜ao os estados da FIFO correspondente. No caso de querer enviar dados tem de verificar se a mem´oria M2S FIFO n˜ao se encontra cheia, de modo a n˜ao escrever sobre dados v´alidos e importantes. No caso de pretender ler dever´a verificar se a mem´oria S2M FIFO n˜ao est´a vazia, de modo a n˜ao ler dados errados. Este procedimento tamb´em dever´a ser efectuado pelo m´odulo escravo que utilize a interface, para n˜ao ocorrerem problemas de incoerˆencia.
Figura 5.2:Fluxo de dados do m´odulo Interface FIFO
A interface FIFO tem dois grandes grupos de sinais de comunicac¸˜ao como se pode ver na tabela 5.1:
um barramento Wishbone e uma interface dispon´ıvel para o escravo. O n´ucleo disponibiliza em ambas as interfaces o acesso a informac¸˜oes importantes sobre o seu estado, relacionadas com o estado das duas mem´orias FIFO, como foi referido, permitindo assim saber quando se pode ler ou escrever sem perder dados.
Como se pode ver na tabela, os quatro primeiros sinais do grupo Escravo s˜ao utilizados para a recepc¸˜ao e gest˜ao dos dados do escravo que ser˜ao enviados para o sistema. Os outros quatro sinais s˜ao utilizados para o sentido oposto, ou seja para a comunicac¸˜ao e gest˜ao dos dados enviados do sistema para para o escravo. Os sinais identificados pelo sufixo dat i e dat o destinam-se `a troca de dados, um para recepc¸˜ao e o outro para o envio, respectivamente. Como esta interface ´e paralela estes dois sinais ter˜ao a largura das palavras de dados do SoC, ou seja, de 32 bits.
A interface FIFO necessita de ter dois enderec¸os do lado da interface Wishbone, como se descreve na tabela 5.2.
Ambas as interfaces dever˜ao sempre efectuar uma verificac¸˜ao do estado das FIFOs, para n˜ao se perderem quaisquer dados. Dever´a verificar-se que, no caso da leitura a mem´oria n˜ao est´a vazia, de forma que n˜ao sejam lidos dados errados, e no caso da escrita, que a mem´oria n˜ao est´a cheia para
Interface Nome direcc¸˜ao Descric¸˜ao
Wishbone
clk i input Rel´ogio recebido pelo Wishbone.
rst i input Reset: reinicia o n´ucleo quando se encontra no estado l´ogico ”1”.
cyc i input Validac¸˜ao da informac¸˜ao no barramento stb i input Validac¸˜ao dos dados transmitidos
adr i input Enderec¸o do registo onde se pretende ler ou escrever no n´ucleo.
we i input Bit de selecc¸˜ao de escrita.
dat i input Recepc¸˜ao de dados por parte do processador.
dat o output Envio de dados para o processador.
ack o output Bit que informa o processador da recepc¸˜ao do comando pelo n´ucleo.
Escravo
fifo s2m dat i input Sinal de entrada de dados do escravo para o mestre.
fifo s2m we input Sinal de selecc¸˜ao de escrita do escravo.
fifo s2m empty output Sinal que informa que a FIFO que envia os dados do escravo para o mestre se encontra vazia.
fifo s2m full output Sinal que informa que a FIFO que envia os dados do escravo para o mestre se encontra cheia.
fifo m2s dat o output Sinal de sa´ıda de dados do mestre para o escravo.
fifo m2s re input Sinal de selecc¸˜ao de leitura do escravo.
fifo m2s empty output Sinal que informa que a FIFO que envia os dados do mestre para escravo se encontra vazia.
fifo m2s full output Sinal que informa que a FIFO que envia os dados do mestre para escravo se encontra cheia.
Tabela 5.1:Tabela de sinais da interface FIFO
Nome Leitura/Escrita Descric¸˜ao Offset.
Leitura e escrita de dados Escrita e Leitura Envio ou recepc¸˜ao dos dados 0X00 Estado das FIFOs Leitura leitura dos estados das FIFOSs 0X02
Tabela 5.2: Tabela de registos do m´odulo interface FIFO
que n˜ao se escreva sobre dados importante e estes sejam perdidos. Para essa analise ´e necess´ario interpretar a palavra que ´e recebida quando ´e feita uma leitura no enderec¸o deoffset0X02. O estado das duas FIFO est˜ao dispon´ıveis nos quatro bits menos significativos, em que a FIFO de leitura utiliza os dois menos significativos desses quatro e a FIFO de escrita utilizar os outros dois bits, os mais significativos. Nos dois conjuntos de bits anteriores o mais significativo indica se a FIFO est´a cheia, o mesmo significativo indica se a FIFO est´a vazia.