• Nenhum resultado encontrado

Sumário. O processador de sinal TMS320C31

N/A
N/A
Protected

Academic year: 2021

Share "Sumário. O processador de sinal TMS320C31"

Copied!
19
0
0

Texto

(1)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 1

Sumário

• O processador de sinal TMS320C31

– descrição geral, arquitectura

– componentes do CPU – sistema de interrupção

– periféricos do C31: porta série, “timers” e DMA – registos do CPU

– organização do espaço de memória – modos de endereçamento da memória

• registo • directo • indirecto • imediato • circular • “bit reversed” – o mecanismo “boot-loader”

• Antevisão do 4º trabalho de laboratório

Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

TMS320C3x

Que representa ?

Uma gama de processadores digitais de sinal (DSPs) de 32 bits (C30, C31 e C32) com diferente complexidade estrutural, que são produzidos pela Texas Instruments e que executam operações aritméticas em vírgula flutuante. Por exemplo, o TMS320C31 (50MHz) -o usado no DSK das aulas de laboratório- é um processador de baixo custo, tem um ciclo de instrução de 40 ns e executa 25 milhões de instruções por segundo (25 MIPS), e até 50 milhões de instruções em vírgula flutuante por segundo (50 MFLOPS).

Por que são interessantes ?

Tratam-se de DSPs de alto desempenho em resultado,

nomeadamente, da grande precisão e gama dinâmica permitidas pela representação em vírgula flutuante, da quantidade de

memória RAM interna ao DSP (2K x 32 bits), do alto grau de paralelismo de instruções e da existência de um controlador de DMA. Podem, por exemplo, implementar operações de

(2)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 3

Diagrama de Blocos do C3x

(

C30, C31, C32)

7 barramentos separados P/D Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

• Constituição (hardware)

– palavras de dados e instrução de 32 bits,

– multiplicador (hardware) de vírgula fixa e flutuante + ALU de 40/32 bits,

– 12 registos de controlo,

– 8 registos de precisão extendida (acumuladores): RØ - R7, – 8 registos auxiliares particularmente dedicados a operações de

endereçamento: ARØ - AR7,

– “cache” de programa de 64 x 32 bits,

– 2 memórias internas “dual-access” de 1K x 32 bit cada, – um canal DMA suportando I/O concorrente,

– dois “timers” de 32 bits,

– dois portos série (só um no C31) suportando transferências de 8/16/24/32 bits,

– espaço de endereçamento externo de 24 bits, – duas “flags” externas de uso geral,

(3)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 5

• Características (software)

– instruções de dois e três operandos,

– capacidade de repetir blocos de instruções (“block repeat”),

– instruções entrelaçadas (“interlocked”) para multiprocessamento, – “boot loader” flexível para carregamento automático de código.

• Vocação

A versatilidade e vocação dos processadores TMS320C3x para operarem em tempo-real, tornam-nos indicados para inúmeras aplicações que incluem:

– convolução (filtragem digital) e correlação,

– transformada rápida de Fourier (e.g. FFT e análise espectral), – filtragem adaptativa (e.g. cancelamento de eco),

– geração de sinais (e.g. síntese de música) – reconhecimento/codificação/síntese de fala – espalhamento espectral – próteses auditivas. Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

Arquitectura do TMS320C31

Von Neuman ? Harvard C31: internamente é Harvard e para o exterior é Von Neuman, i.e. possui arquitectura Harvard modificada !

(4)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 7

Unidade de Processamento Central (CPU)

• multiplicador de hardware

– operandos inteiros de 24 bits → resultados em 32 bits

– operandos de vírgula flutuante (32 bits) → resultados em 40 bits – paraleliza com operação de ALU num único ciclo de instrução

• unidade aritmética e lógica (ALU)

– permite efectuar deslocamentos de bits (à direita e à esquerda) – permite conversão de formatos: inteiro ↔ vírgula flutuante

• unidades aritméticas auxiliares (ARAUØ e ARAU1)

– permitem geração de dois endereços num único ciclo e podem operar em paralelo com o multiplicador e a ALU

– suportam modos de endereçamento circular e “bit-reversed”, e ainda endereçamento com desvio explícito ou definido pelo conteúdo dos registos de índice (IRØ e IR1)

Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

Interrupções no C31

Quantas são ?

O C31 suporta quatro interrupções externas INTØ - INT3,

algumas interrupções internas (geradas pelo controlador de DMA, pelos “timers” e pelo porto série) e uma interrupção externa não mascarável: RESET. Estas várias possibilidades podem ser usadas para interromper a actividade do DMA ou do CPU. O atendimento a uma interrupção por parte do CPU é sinalizado através da activação do pino externo IACK.

E o atendimento às interrupções ?

Caso esteja autorizada, quando é declarado um pedido de

interrupção, o processador procura o endereço que aponta para código de atendimento à interrupção em causa. A tabela seguinte lista os vectores de interrupção (apontadores para as rotinas de atendimento de cada interrupção) quando o C31 está configurado no modo “Microcomputer/Boot-Loader” (o modo configurado no DSK).

(5)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 9 em cada um destes endereços

deve haver uma instrução do tipo “branch” para o endereço da respectiva rotina de atendimento.

• Tabela dos Vectores de Interrupção do C31

ERRO ! R-buffer cheio ! Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

• Prioridade das interrupções

– na eventualidade de dois pedidos de interrupção ocorrem simultaneamente, o CPU considera prioridade no atendimento de acordo com a tabela seguinte:

→ maior prioridade !

(6)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 11

• bits de controlo na interrupção do CPU

Há três registos no CPU que controlam a operação de interrupção: – registo ST e, em particular, o seu bit GIE (global interrupt enable)

que permite (GIE=1) ou inibe (GIE=0) atendimento aos pedidos de interrupção mascaráveis,

– registo IE (interrupt enable) que permite ou inibe, de forma selectiva, as interrupções originadas pelo CPU, DMA externo, porta série e “timers”,

– registo IF (interrupt flag) que contém os bits que assinalam (i.e. ficam activos perante) os pedidos de interrupção. Estes bits podem ser explicitamente activados ou desactivados por software:

e.g.

AND @mask, IF ; activa/desactiva pedidos

Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

Periféricos do C31

Um porto série, dois “timers” e um coprocessador de

DMA, todos controlados por registos mapeados na

memória e barramentos (dados/endereços) dedicados

(7)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 13

– TIMERS: são módulos baseados em contadores de 32 bits com dois modos de sinalização e possibilidade de serem activados com relógio interno ou externo. Cada “timer” contém um pino dedicado (TCLKØ, TCLK1)

para ligação com o exterior.

– PORTO SÉRIE: é um módulo de comunicação bidireccional de dados com o exterior, configurável para comunicação em 8, 16, 24 ou 32 bits. É

controlado por registos mapeados na memória e pode ser accionado por relógio interno ou externo. Possui “timers” próprios.

– ACESSO DIRECTO À MEMÓRIA (DMA): o controlador de DMA permite ler ou escrever em qualquer posição do mapa de memória do C31, sem interferir com a operação de CPU, por via da existência de barramentos de dados e endereços próprios, assim como de geradores de endereços, registos de endereço origem e endereço destino e contador de

transferência, próprios. Em caso de competição entre o CPU e o DMA, o primeiro tem prioridade.

Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

Registos do CPU

Há no total 28 registos mais o registo Program Counter (PC)

RØ - R7

Acumuladores de precisão alargada (40 bits), quando usados com inteiros, só os 32 LSBs é que são efectivamente modificados,

ARØ - AR7

Registos auxiliares (32 bits) usados para gerar endereços de 24 bits, como contadores de iteração, etc. Podem ser acedidos pelo CPU e modificados pelas ARAUS,

DP (apontador de página)

Dos seus 32 bits, os 8 LSBs são usados para o modo de

endereçamento directo como apontador de página. Estes bits são carregados através da instrução LDP. As páginas têm uma

(8)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 15

IRØ, IR1 (registos de índice)

Guardam os valores usados pela ARAU para compôr um endereço indexado.

BK (registo de tamanho de bloco)

Guarda o tamanho do bloco de dados usado pela ARAU no endereçamento circular.

SP (apontador da “stack” do sistema)

Guarda endereço do topo da stack do sistema. Aponta para o último elemento guardado na stack. É utilizado quando ocorrem interrupções, “traps”, “calls” e “returns”, ou as instruções PUSH e POP. Um PUSH origina pré-incremento de SP enquanto que um POP origina um pós-decremento de SP.

ST (registo de estado)

Guarda informação diversa sobre o estado do CPU (e.g. indica se o resultado da última operação foi zero, negativo, etc. ). O seu conteúdo pode ser guardado e reposto através da stack.

Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

Formato do registo ST, significado e função dos bits relevantes

NOTA: “latched” significa que a flag em causa só pode ser desactivada por RESET ou explicitamente por software. Pergunta 1: “overflow” aplica-se à repreaplica-sentação em vírgula fixa e flutuante ?

Pergunta 2: “underflow” aplica-se à representação em vírgula fixa e flutuante ?

(9)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 17

Formato do registo ST, significado e função dos bits relevantes (cont.)

Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

IE (registo de permissão de interrupção do CPU/DMA)

Assinala a permissão (“1”) ou inibição (“0”) de cada tipo de interrupção.

(10)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 19

Formato do registo IE, significado e função dos bits relevantes (cont.)

NOTA: As flags

associadas ao porto série 1 -não existente no C31-devem ser colocadas a ZERO, e não a UM, situação que pode provocar

resultados imprevisíveis ! Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

IF (registo de “flags” de interrupção do CPU)

Assinala os pedidos de interrupção.

(11)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 21

IOF (registo de “flags” de I/O)

Controla a função e dados dos pinos externos XFØ e XF1, que podem ser configurados como entradas ou saídas.

NOTA: as linhas externas do C31 a que se associam as flags XFØ e XF1, são particularmente adequadas ao multiprocessamento (ver capítulo sobre “interlocked operations” no manual do C3x).

Formato do registo IOF, função e significado dos bits relevantes

Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

RC (registo de controlo de repetição)

Usado para contar as iterações de um ciclo de instruções do tipo “block repeat”. Se o seu conteúdo for N-1, o ciclo de instruções é iterado N vezes. O início deste ciclo é apontado pelo registo “repeat start address register” (RS), e o seu fim é apontado pelo registo “repeat end address register” (RE).

NOTA: Os registos RS e RE não são explicitamente carregados.

Exemplo: início LDI 10, RC

RPTB fim_blc ; itera onze vezes CALL FILTRO

FIX R0, R1 ; resultado da convolucão em R0

fim_blc STI R1, *AR5

PC (registo contador de programa)

Contém endereço da próxima instrução a ser invocada (“fetched”). NOTA: O registo PC não faz parte do CPU.

IR (registo de instrução)

Contém o “opcode” da instrução durante a sua fase de descodificação.

(12)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 23

Sumário dos registos

Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

Organização do espaço de memória no C31

• Espaço total de endereçamento em 24 bits:

224=16 Mwords

• Blocos de memória interna do C31

– Cache de 64 x 32 bits, guarda secções de código que são repetidas frequentemente minimizando deste modo o acesso a memória externa, o que permite armazenar código em memória mais lenta e possibilita a concorrência de outras operações externas como o DMA, etc. A cache pode operar de forma automática, sem intervenção do utilizador (NOTA: a cache não é utilizada quando o programa reside em memória interna).

– Dois blocos de memória RAM de 1 Kwords cada, suportam dois acessos de CPU num único ciclo. No C31 a configuração da RAM é diversa consoante a configuração do DSP:

µprocessador (mais adequado quando o C31 funciona como escravo) ou

µcomputador (mais adequado quando o C31 funciona como mestre).

– Há uma “boot loader” ROM mapeada nos endereços 0h - 0FFFh quando o C31 se encontra configurado no modo µcomputador.

(13)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 25

Mapa de memória do C31

modo

µcomputador

modo

µprocessador o usado no DSK !

A área ROM de

boot-loader residente no C31 permite carregar programas para execução, a partir de três áreas de arranque possíveis (assinaladas por Boot1, Boot2 e Boot3), ou então a partir da porta-série. Após carregamento, a execução inicia-se no primeiro endereço do código copiado. Por precaução, deve-se evitar colocar código nas posições 809800h e 809801h já que são usadas pelo

“boot-loader” para “stack”

(ver código do

“boot-loader” no manual do C3x ou do DSK). Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

Registos de periféricos mapeados

no mapa de memória do C31 Endereços para rotinas de interrupção e “trap”mapeados no mapa de memória do C31

(14)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 27

Modos de endereçamento da memória

Há no essencial seis modos: registo, directo, indirecto, imediato, circular e “bit reversed”.

• Registo

– O operando encontra-se num registo do CPU. exemplo:

• Directo

– O endereço do operando é formado com base nos 8 LSBs do conteúdo do registo “data page pointer” (DP), com os 16 LSBs do endereço fornecido na instrução e prefixado por @.

e.g. : Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

• Indirecto

– O endereço do operando encontra-se num registo auxiliar (cujo endereço deve ser prefixado por *), o qual pode opcionalmente ser afectado por um desvio (expresso por um inteiro de 8 bits) explícito, como sugerido na Tabela 1, ou indexado (i.e. usando os registo IRØ ou IR1), como sugerido nas Tabelas 2 e 3.

Tabela 1

(15)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 29 Tabela 2

• Indirecto

(continuação)

NOTA: o símbolo % denota endereçamento circular ! Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05 Tabela 3

• Indirecto

(conclusão)

(16)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 31

• Imediato (curto, longo)

– O valor do operando (expresso em 16 ou 24 bits), é explicitamente indicado na instrução.

exemplo:

• Circular

– Muito útil para algoritmos como convolução (filtragem digital) e correlação. A tabela circular corresponde a uma janela

deslizante que abrange os dados mais recentes a serem processados, sendo os dados mais antigos “apagados” pela escrita de novos dados, uma vez que a posição lógica seguinte ao final da tabela é o seu início físico:

Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

– O comprimento da tabela circular deve ser guardado no registo

BK. O início da tabela deve situar-se numa fronteira de

endereços cujos K LSBs devem ser zero, sendo

2K>comprimento da tabela. Isto garante-se através do uso da

directiva .bstart.

NOTA 1: ao ser usado um desvio no deslocamento circular,

ele deverá ser <= ao comprimento da tabela.

NOTA 2: no primeiro acesso à tabela, o uso de um desvio

deverá remeter para um endereço da tabela base.

Algoritmo usado no endereçamento circular (sendo

index=posição actual e step=desvio):

exemplo para uma tabela com BK=6 : o símbolo % denota endereçamento circular !

(17)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 33

– Exemplo de filtragem FIR com endereçamento circular. * inicializações

início LDI @end_H, AR0 ; aponta resposta impulsional

LDI @end_X, AR1 ; aponta “buffer” de dados

LDI N, BK ; comprimento tabela circular * ciclo de nova amostra, convolução, nova saída

rotina LDI IN, R1 ; carrega nova amostra

STI R1, *AR1++% ; alinha nova amostra

LDI 0, R1 ; inicializa acumulador

LDI N-1, RC ; comprimento filtro

* ciclo do filtro digital

RPTB fim_blc ; itera N vezes

MPYI3 *AR0++%, *AR1++%, R0

fim_blc ADDI3 R0, R1, R1 ; resultado em R1

* guarda amostra de saída STI R1, OUT B rotina

end_H

← end_X

h(-k) x(k) amostra mais antiga

amostra mais recente

Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05 X(0) X(1) X(N-3) X(N-2) ARØ ← AR1

– Exemplo de filtragem FIR com endereçamento circular (cont.)

=− − = 1 0 ) ( ) ( ) ( N k k n x k h n y

= + + + − − = − = 0 1 ) ( ) 0 ( ) 1 ( ) 1 ( ) ( ) ( ) ( N k n x h N n x N h k n x k h n y 

= − + + − + − = − − = 0 1 ) 1 ( ) 0 ( ) 1 ( ) 2 ( ) 0 ( ) 1 ( ) 1 ( ) ( N k N x h x N h x N h k N x k h y  definição da convolução convolução com varrimento inverso saída no instante actual, e.g. n=N-1

(18)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 35

– Exemplo de filtragem FIR com endereçamento circular (cont.)

h(k) k 0 1 2 k x(k) 0 1 2 x(-k) k 0 -1 -2 caso ilustrativo (N=3): n=0 h(2) h(1) h(0) ARØ → 0 0 x(0) AR1 → y(0)=h(0)x(0) x(1-k) k 0 -1 1 n=1 h(2) h(1) h(0) ARØ → x(1) 0 x(0) AR1 → y(1)=h(1)x(0)+h(0)x(1) x(2-k) k 0 1 2 n=2 h(2) h(1) h(0) ARØ → x(1) x(2) x(0) AR1 → y(2)=h(2)x(0)+h(1)x(1)+h(0)x(2) Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05

• Bit Reversed

– Muito útil para endereçar a memória com correção automática de endereços em bit reversed que decorrem da implementação da FFT, presumindo-se que o seu comprimento é uma potência de dois. O endereço base da tabela a endereçar deverá situar-se numa fronteira em que os K bits LSBs são zero. Sendo N=2K

(K<16), o comprimento da FFT, isto garante-se através da conhecida directiva .bstart do assemblador.

– É necessário carregar um registo de índice, e.g. IRØ com N/2=2K-1, de modo a poder invocar o endereçamento em bit

reversed, como se ilustra no exemplo ilustrado no slide seguinte.

(19)

© AJF/FJR Processamento Digital de Sinal em Tempo Real, 4ª a u la te ór ic a FE U P , 18 de Março de 20 05 37

• Bit Reversed (

cont

.)

• EXEMPLO: N=16=24, IRØ=23=8=1000b. Se o endereço base for

AR2=96=01100000b, ter-se-á no endereçamento em bit reversed:

• NOTA1: Quando os dados são complexos e as componentes real e imaginária encontram-se em posições consecutivas (Real0, Imag0, Real1, Imag1, … ) então IRØ deverá conter N=2K e o endereço

base deverá ter os (K+1) bits LSBs iguais a zero.

• NOTA2: Fisicamente, o incremento em bit-reversed é conseguido através da propagação em sentido contrário ao usual do bit de “carry” (ver manual do C3x).

Sinal em Tempo Real, 4ª a u la te ór ic a U P , 18 de Março de 20 05

O Mecanismo de “Boot-Loader”

– O “boot-loader” consiste em código (consultável no anexo B do manual do C3x) existente a partir da posição 0x45 da ROM interna do C31 e que lhe permite carregar programas a partir de memória ou via porta série; este código é invocado no arranque do C31 (após um RESET) através da configuração apropriada do pino MCBL/PP do C31

– o mecanismo “boot-loader” corresponde a um modo de funcionamento do C31 (como µcomputador) que permite, no seu arranque, a cópia para memória interna de código executável fornecido do exterior a partir de outro processador, ou a partir de memória lenta (e.g. EPROM) ‘mapeada’ numa de três regiões possíveis do mapa de memória do C31 (‘slide’ 25), ou via porta série, assim como a sua execução a partir de um endereço especificado

– o mecanismo “boot-loader” suporta a cópia de código a partir de memória com 8, 16, ou 32 bits (via porta série a transferência de código faz-se só em 32 bits), o que é detectado após a leitura do primeiro byte de código copiado

– seguidamente ao primeiro byte, segue-se informação sobre o tipo de memória que armazena o código (indica por exemplo se requer “wait states” no seu acesso), sobre o endereço para onde será copiado o código e a extensão deste, – após a cópia do primeiro bloco de código, poderá haver lugar à cópia de mais

Referências

Documentos relacionados

No âmbito desta unidade curricular irão ser abordados os seguintes temas: 1. Fatores determinantes das escolhas

Nosso ponto de partida metodológico é observar e descrever a interação do individuo desde sua infância mais imatura com seu contexto social, cultural, econômico, político com

Triagem da infecção pelo HCV por meio de testes rápidos em indivíduos maiores de 18 meses.. Fonte: Manual Técnico para o Diagnóstico das

De maneira geral, o apoio, a valorização e os investimentos são os fatores que mais contribuem para o crescimento e desenvolvimento do paradesporto nacional,

Capitalismo Sindical” e consiste basicamente em dizer que processos políticos podem ter o seu princípio alterado em detrimento de uma outra classe social. No caso das Primaveras

Tabela 3 - Duração do ciclo após a germinação, produtividade, eficiência no uso da água em cenários climáticos futuros RCP4.5 para o milho semeado em 10 de outubro.. Já para

Segundo Brown (2004), apoiado principalmente no trabalho de Warren e Nisbet (1999), é possível conceber que os indivíduos, quer sejam professores ou estudantes, geralmente

Como prenuncia o próprio título do texto, O pensamento cria, embora fique evidente que aí se trata da relação entre música e artes visuais, não deixamos de notar que o foco