1180 IEEE LATIN AMERICA TRANSACTIONS, VOL. 10, NO. 1, JAN. 2012 VHDL Implementation of a Flexible and Synthesizable FFT Processor I. S. Correa, L. C. Freitas, A. Klautau and J. C. W. A. Costa Abstract— This paper presents the current stage of development of a fast Fourier transform (FFT) processor in VHDL. This processor uses fixed-point as numeric representation, taking advantage of the facilities provided by the IEEE fixed point package. Its main advantages is that it is being developed as fully parameterizable processor, in a way that the number of bits, fixed point position and number of points computed in the FFT can be easily changed. It is also able to be used in several applications such as classification algorithms and communications systems. An open source prototype core has been developed and it can perform a complete FFT transform using radix-2 with decimation in time. Results and details of this implementation are presented. Keywords— VHDL language, digital hardware design, FFT. T I. INTRODUÇÃO RANSFORMADA de Fourier é uma operação matemática envolvendo exponenciais complexas que pode representar um sinal através de suas componentes de frequência, permitindo a análise de um sinal do domínio do tempo no domínio da frequência [1]. A transformada de Fourier é base de muitos estudos científicos, como em Física no estudo do movimento de ondas eletromagnéticas, com aplicações em telecomunicações, reconhecimento de voz e outros. Quando a análise de um sinal no domínio da frequência é realizada utilizando um computador, a ferramenta para análise de Fourier mais popular é a chamada Discrete Fourier Transform (DFT) [1], que basicamente corresponde a multiplicar o sinal a ser analisado por uma matriz cujos elementos são números complexos. Devido à complexidade computacional encontrada nessas multiplicações, em [3] foi proposto um algoritmo eficiente para o cálculo da DFT. A partir desse algoritmo, vários outros foram propostos e atualmente eles compõem uma família de algoritmos chamada Fast Fourier Transform (FFT), a qual permite a execução rápida e eficiente da DFT em computador. Para aplicações que usam FFT e requerem resposta em tempo real a melhor alternativa é a implementação de algoritmos de FFT em hardware dedicado (e não em um computador), por exemplo utilizando dispositivos lógicos programáveis e linguagens de descrição de hardware. Esse I. S. Correa, Federal University of Pará (UFPA), Belém, Pará, Brazil, [email protected] L. C. Freitas, Federal University of Pará (UFPA), Belém, Pará, Brazil, [email protected] A. Klautau, Federal University of Pará (UFPA), Belém, Pará, Brazil, [email protected] J. C. W. A. Costa, Federal University of Pará (UFPA), Belém, Pará, Brazil , [email protected] tipo de implementação apresenta menor tempo de execução quando comparado com as implementações utilizando linguagens de programação tradicionais, pois são projetadas focando a execução em hardware dedicado, se beneficiando do potencial de paralelização do projeto de hardware. Dessa forma, este artigo apresenta o projeto de um processador de FFT utilizando a linguagem de descrição de hardware chamada VHSIC Hardware Description Language (VHDL) [4]. Tal linguagem é projetada para tratar nativamente características inerentes dos circuitos lógicos que compõem o hardware. O processador de FFT desenvolvido neste artigo utiliza ponto fixo como representação numérica dos dados, e foi projetado para ser flexível o suficiente para permitir que parâmetros como número de bits e número de pontos da FFT possam ser facilmente alterados, possibilitando que o mesmo processador de FFT possa ser utilizado em uma variedade de aplicações. A FFT é composta por várias operações elementares realizadas com todas as amostras de um sinal. Essa operação é chamada butterfly e é composta por multiplicações e somas. A butterfly normalmente é realizada com 2 ou 4 amostras de um sinal por vez, e são chamadas radix-2 [6] ou radix-4 [7], respectivamente. Nesse artigo foi implementado o algoritmo FFT com radix-2, devido sua simplicidade e seu baixo uso de recursos. Na literatura há muitos artigos descrevendo implementações de FFT como em [2], [6] e [7], porém não é disponibilizado o código fonte dessas implementações. Portanto uma das contribuições deste artigo é disponibilizar uma implementação flexível de FFT, que possa ser usada em grande variedade de aplicações, bem como para fins de ensino. Este artigo está organizado da seguinte forma: a Seção II explica detalhes de como os dados são tratados e seu fluxo dentro do processador de FFT, a organização de seus blocos internos e seus pinos de entrada e saída. A Seção III explica algumas questões de projeto relacionadas ao bloco principal do projeto. A Seção IV mostra alguns resultados obtidos a partir da implementação. A Seção V mostra resultados de desempenho. A Seção VI apresenta algumas conclusões e trabalhos futuros. II. IMPLEMENTAÇÃO DO PROCESSADOR DE FFT O algoritmo usado na implementação em VHDL é o chamado FFT com radix-2 e decimação no tempo [1]. O termo decimação no tempo indica que as amostras são ordenadas antes do cálculo da FFT (ou seja, quando as amostras ainda estão no domínio do tempo). O algoritmo de ordenação, neste SOUSA CORREA et al.: VHDL IMPLEMENTATION OF caso, segue a ordem reversa dos bits da posição de memória das amostras de entrada. Por exemplo, os bits da posição de memória “001”, são invertidos, dessa forma será lida a amostra da posição de memória “100”. Já o termo radix-2 indica que a DFT foi decomposta em duas operações que são realizadas paralelamente, as butterflies da FFT serão realizadas usando duas amostras de cada vez. Decimação no tempo e radix-2 são termos resultantes das manipulações matemáticas que transformam a DFT em FFT, primeiramente proposto em [3]. O processador de FFT utiliza ponto fixo como representação numérica [8]. O número de bits reservado para a parte inteira e para a parte decimal são parâmetros passados antes da compilação. Para usar esse tipo de representação numérica a implementação do processador de FFT usa o pacote VHDL de ponto fixo chamado IEEE fixed point [9], que disponibiliza ferramentas para trabalhar com ponto fixo, bem como operações matemáticas e rotinas de conversão para outras representações numéricas. O número de pontos de FFT que o processador desenvolvido utiliza pode ser especificado antes da compilação. No atual estágio de desenvolvimento desta implementação este número deve ser uma potência de 2 e menor que 512. Essa limitação existe porque é necessário ter previamente armazenado o conjunto de exponenciais complexas no código da FFT. Atualmente estão armazenadas exponenciais complexas para até 512 pontos. Vale destacar que essa limitação pode ser facilmente resolvida, desenvolvendo um programa que automaticamente gere um conjunto de exponenciais para um número maior de pontos. A descrição do processador de FFT em VHDL adotou a organização dos componentes internos, mostrado na Fig. 1. As próximas subseções descrevem as funções de cada um desses componentes. Figura 1. Organização interna do processador de FFT. A. Sinais de entrada e saída x CLK: é o pino de entrada que serve como sincronizador, ou base de tempo para o processador. x RST: é um pino de entrada que reinicia a operação a qualquer momento. Quando este pino está em nível alto (nível lógico 1) os registradores são assumem seus valores iniciais e as máquinas de estados que compõem os componentes vão para seus estados iniciais. x START: é um pino de entrada usado para sinalizar ao 1181 processador quando iniciar sua operação. x RE_DATA e IM_DATA: é um conjunto de pinos de entrada que representam a parte real e imaginária dos dados de entrada. O número de pinos é correspondente ao número de bits dos dados e pode ser alterado antes da compilação. Antes de iniciar a transferência dos dados há um período de inicialização dos componentes internos. Após esse período, uma amostra é lida e armazenada na memória interna do processador a cada ciclo de clock. x RE_OUT e IM_OUT: é um conjunto de pinos de saída por onde a parte real e imaginária dos dados resultantes são transferidos. Os dados da memória interna do processador são transferidos a cada ciclo de clock. B. Blocos internos Esses blocos foram projetados como máquinas de estados, pois essa técnica permite boa previsibilidade das questões encontradas no projeto hardware [10]. x INPUT: é o bloco responsável por armazenar os dados de entrada na memória interna. Ao início da operação o bloco ARBITER sinaliza para esse bloco iniciar sua operação. Ele recebe os dados e gera o endereço correto para armazenar na memória, ou seja, esse bloco realiza a decimação no tempo. Futuramente esse bloco será implementado com um protocolo, para melhorar a portabilidade do projeto. x BUTTERFLY: esse bloco é o núcleo do processador, ele é capaz de fazer transformadas de qualquer tamanho. Mais detalhes sobre este bloco são dados na Seção III. x OUTPUT: após a execução do algoritmo de FFT esse bloco inicia o processo de transferência dos dados resultantes, transferindo um dado por ciclo de clock. x MEMORY: é composto por dois blocos de armazenamento, um para a parte real e outro para a parte imaginária dos dados. Ele foi implementado de forma que a ferramenta de síntese mapeie o código automaticamente para a memória interna do FPGA. Para isso, utilizou-se a ferramenta de síntese chamada Altera Quartus II [11]. x ARBITER: somente um bloco deve estar em operação de cada vez. Dessa forma, esse bloco é responsável por gerenciar os outros blocos com sinais de início, recebendo seus sinais de término e fazendo o interfaceamento com a memória. Por exemplo, quando o pino START está em nível lógico alto o ARBITER sinaliza para o INPUT iniciar sua operação, e o ARBITER espera o fim da operação do INPUT. O mesmo é feito para o bloco BUTTERFLY e OUTPUT. Durante o tempo que o ARBITER está esperando o término da operação de um determinado bloco, somente os sinais de controle daquele bloco serão repassados para a memória, desse modo somente um bloco está em operação e somente ele pode acessar a memória. 1182 IEEE LATIN AMERICA TRANSACTIONS, VOL. 10, NO. 1, JAN. 2012 III. MAIS SOBRE AS OPERAÇÕES INTERNAS NO BLOCO BUTTERFLY A implementação usando FFT com radix-2 e decimação no tempo proposta neste artigo resulta no fluxo de dados mostrado na Fig. 2, na qual é possível observar uma FFT de oito pontos, sendo que as setas indicam somas e os termos ao longo das setas são multiplicações. Wxy são exponenciais complexas na forma e-j2ʌy/x, chamadas de twiddle factor. A decimação no tempo é também mostrada através da realização das operações nos dados de entrada seguindo a ordem reversa dos bits. 256 e 512 pontos, com tamanho de dados de 16 bits, sendo 8 bits para a parte inteira e 8 bits para a parte decimal. Em ambos os casos utilizou-se o conjunto de twiddle factors, específico para 512 pontos. Observou-se que o uso de recursos permanece quase o mesmo para ambos. Isso acontece porque o bloco BUTTERFLY continua o mesmo (executa o mesmo algoritmo), a diferença é que utiliza mais bits para controlar as operações, pois haverá mais estágios e mais iterações na execução. O único bloco que significativamente é alterado é o MEMORY que é dimensionado para armazenar 256 e 512 dados de 16 bits. A Tabela 1 mostra a porcentagem do uso de recursos das versões para 256 e 512 pontos, usando o mesmo conjunto de twiddle factor para ambos. TABELA 1 RESULTADOS DE SÍNTESE USANDO O FPGA CYCLONE II EP2C70F896I8 PARA 256 E 512 PONTOS. V. DESEMPENHO Figura 2. Uma FFT de 8 pontos usando radix-2 e decimação no tempo. O algoritmo foi descrito em VHDL como uma máquina de estados. Dessa forma é possível ter o algoritmo funcional com as particularidades dos projetos de hardware. Por exemplo, ao fim de uma operação o resultado é armazenado em um registrador. Esse resultado estará disponível depois da próxima subida (ou descida) do clock. Esse comportamento pode ser modelado como estados de uma máquina de estados, onde em um estado uma operação é feita e o resultado é preparado para ser armazenado. Na subida do clock o valor é efetivamente armazenado e o estado alterado, então no próximo estado o valor pode ser usado. O algoritmo FFT é composto por vários estágios e em cada um desses estágios as operações de butterflies são realizadas. O número de estágio é o logaritmo base 2 do número de pontos da FFT. O bloco BUTTERFLY é independente dos outros e pode ser adicionado em outro sistema e trabalhar como bloco interno. Por exemplo, em um sistema onde há um elemento que armazena dados na memória, o endereço desses dados é passado para o bloco BUTTERLFY que realiza sua operação e sinaliza ao término de sua operação, assim os dados resultantes ficam disponíveis na memória. IV. RESULTADOS DE SÍNTESE O processador de FFT foi sintetizado para o FPGA Cyclone II EP2C70F896I8, usando o software Altera Quartus II. Nesta Seção os resultados são mostrados para o cálculo de FFT de Através da ferramenta de síntese Altera Quartus II foi possível obter informações para calcular a frequência máxima de clock que o processador de FFT pode operar. A partir da síntese para o FPGA Cyclone II EP2C70F986I8 foi calculada a frequência máxima de operação de 43.072 MHz. A partir dessa máxima frequência de clock, simulações foram realizadas para verificar o tempo necessário para o cálculo de uma FFT. Ao fim da simulação foi obtido o tempo total, para o processador de FFT completo e somente para o bloco BUTTERFLY, que foram de 0.7 ms e 0.6 ms, respectivamente. A Tabela 2 apresenta um resumo dos dados mostrados nesta Seção. TABELA 2 ANÁLISE DE DESEMPENHO VI. CONCLUSÕES Este artigo apresentou a implementação, os resultados de síntese e detalhes a respeito das operações internas de um processador de FFT de propósito geral. Esse processador de FFT foi desenvolvido para compor um algoritmo de classificação. Porém devido a sua vasta SOUSA CORREA et al.: VHDL IMPLEMENTATION OF aplicabilidade, o mesmo foi desenvolvido para ser genérico e altamente parametrizável. Trata-se de um código open source que pode ser utilizado em muitas aplicações além de classificação, por exemplo, o mesmo código tem sido usado, pelos autores, em um protótipo de um modem DSL gigabit. Melhorias nesta implementação já estão sendo realizadas, objetivando diminuir o tempo de execução. Dentre estas, destaca-se o uso de outras arquiteturas de butterfly mais eficientes, como a radix-4. Além disso, o nível de paralelização pode ser aumentado, através do uso de um número maior de butterflies (a atual arquitetura utiliza apenas uma butterfly). Dessa forma, uma futura implementação poderia ter como parâmetro de configuração o nível de paralelização, o que afetaria diretamente o uso de recursos e tempo de cálculo da FFT. AGRADECIMENTOS Este trabalho contou com o apoio financeiro do Conselho Nacional de Desenvolvimento Científico e Tecnológico (CNPq), Brasil. REFERÊNCIAS [1] Alan V. Oppenheim, Ronald W. Schafer and John R. Buck, DiscreteTime Signal Processing, Prentice Hal, second edition, 1999. [2] Mandeep Singh Balwinder Singh Pawan Verma, Harpreet Kaur, “VHDL implementation of FFT/IFFT blocks for OFDM”, International Conference on Advances in Recent Technologies in Communication and Computing, 2009. [3] James W. Cooley and John W. Tukey, “An algorithm for the machine calculation of complex fourier series”, Math Comput., pp. 297 – 301, 1965. [4] Volnei A. Pedroni, Circuit Design with VDHL, MIT Press, ISBN 0262-16224-5, 2004. [5] T. Starr, M. Sorbara, J. M. Cioffi and P. J. Silveramn, DSL Advances, Prentice Hall, 2003. [6] Rd. J.; Ordaz-Moreno A.; Vite-Frias, J. A.; Romero-Troncoso, “VHDL core for 1024-point radix-4 fft computation”, International Conference on Reconfigurable Computing and FPGAs 2005, ReConFig 2005, pp. 4 – 24, 9 2005. [7] A. Álvarez-Marquina E. Martinez de Icaya C. Gonzaléz- Consejero, V. Rodellar and P. Gonzalez-Vilda, “A portable hardware design of a FFT algorithm”, Latin American Applied Research, 2007. [8] Randy Yates, “Fixed-point arithmetic: An introduction”, 2009, http://www.digitalsignallabs.com. [9] David Bishop, “Fixed point package user’s guide”. [10] Frank Vahid, Digital Design with RTL Design, VDHL and Verilog, John Wiley and Sons, second edition, 2011. [11] Altera, “Altera Corporation”, 2011, http://www.altera.com. Ilan Sousa Correa was born in Pará, Brazil, on July 25, 1990. He is a student of Computer Engineering at Federal University of Pará (UFPA). He works at the Laboratory of Applied Electromagnetism (LEA) and Laboratory of Sensors and Embedded Systems (LASSE) since 2009, where he has been developing projects in wireless sensors networks and digital systems design with emphasis on FPGA. Lilian Coelho de Freitas received the BSc degree in Computer Engineering from UFPA (Federal University of Pará) - Brazil in March 2007. She received the MSc. degree in Electrical Engineering from UFPA. Nowadays she is doing a doctorate in UFPA. Since 2003, she has been developing research in the wireless sensor network area for environmental and industrial monitoring application. Her research interests include wireless sensor networks and cognitive radio. 1183 Aldebaro Barreto da Rocha Klautau Júnior received the Ph.D. degree from the University of California, San Diego, in 2003. In 1995, he was a Faculty Member with the Federal University of Santa Catarina, Florianópolis, Brazil. Since 1996, he has been with the Federal University of Pará, Belém, Brazil, where he is affiliated with the Computer Science. He also directs the Signal Processing Laboratory and the Embedded Systems Laboratory. His research interests include machine learning for signal processing, with applications including speech recognition, DSL, power systems and software/cognitive radio, and the algorithm to its implementation on ¿eld-programmable gate array or application-speci¿c integrated circuits. João Crisóstomo Weyl Albuquerque Costa. He received the title Engenheiro Eletricista - Eletrônico, from the Federal University of Pará (UFPA), Brazil, in 1981, the Geophysics Pos Graduated, from the UFPA, Brazil, in 1983, the M. Sc. Degree (with thesis) in Electrical Engineering (telecommunication) in 1989 from PUC-RJ, Brazil, and received the Doctor in Electric Engineering degree in Electric Engineering in 1994, from the State University of Campinas, São Paulo, Brazil. Since 1994 he is with the Federal University of Pará (UFPA), Brazil, Department of Electrical and Computer Engineering. Presently, his research areas are the modeling of devices and systems for optical and mobile communications, including access networks. He is aresearcher of the Brazilian Research Funding Agency (CNPq) since 1994.