implementation of audio decoder muhammad amirul bin mohamad
Transcription
implementation of audio decoder muhammad amirul bin mohamad
IMPLEMENTATION OF AUDIO DECODER MUHAMMAD AMIRUL BIN MOHAMAD KHALID UNIVERSITI TEKNOLOGI MALAYSIA PSZ 19:16 (Pind. 1/07) UNIVERSITI TEKNOLOGI MALAYSIA DECLARATION OF THESIS / UNDERGRADUATE PROJECT REPORT AND COPYRIGHT Author’s full name : MUHAMMAD AMIRUL BIN MOHAMAD KHALID Date of Birth : 10 OCTOBER 1990 Title : IMPLEMENTATION OF AUDIO DECODER Academic Session : 2013/2014 I declare that this thesis is classified as: CONFIDENTIAL (Contains confidential information under the Official Secret Act 1972)* RESTRICTED (Contains restricted information as specified by the organization where research was done)* OPEN ACCESS I agree that my thesis to be published as online open access (full text) I acknowledged that Universiti Teknologi Malaysia reserves the right as follows: 1. The thesis is the property of Universiti Teknologi Malaysia 2. The Library of Universiti Teknologi Malaysia has the right to make copies for the purpose of research only. 3. The Library has the right to make copies of the thesis for academic exchange. Certified by: SIGNATURE 901010-06-5659 (NEW IC NO/PASSPORT) Date: NOTES: * JUNE 2014 SIGNATURE OF SUPERVISOR ASSC. PROF. MUHAMMAD MUN’IM BIN AHMAD ZABIDI NAME OF SUPERVISOR Date: JUNE 2014 If the thesis is CONFIDENTAL or RESTRICTED, please attach with the letter from the organization with period and reasons for confidentiality or restriction. “I hereby declare that I have read this thesis and in my opinion this thesis is sufficient in terms of scope and quality for the purpose of awarding a Bachelor’s degree in Engineering (Electrical - Electronics).” Signature : ............................................... Name of Supervisor : ASSC. PROF. MUHAMMAD MUN’IM BIN AHMAD ZABIDI Date : ............................................... IMPLEMENTATION OF AUDIO DECODER MUHAMMAD AMIRUL BIN MOHAMAD KHALID A report submitted in partial fulfillment of the requirements for the award of the degree of Bachelor of Engineering (Electrical – Electronics) Faculty of Electrical Engineering Universiti Teknologi Malaysia JUNE 2014 ii I declare that this thesis entitled “Implementation of Audio Decoder” is the result of my own research except as cited in the references. The thesis has not been accepted for any degree and is not concurrently submitted in candidature of any other degree. Signature : ………………………… Name : MUHAMMAD AMIRUL BIN MOHAMAD KHALID Date : ………………………… iii To my supervisor, lecturers, technicians and staff, And also fellow friends that steered with me through ups and downs, Also my parents that I looked to when it’s rough, May all of you live in peace and sound. iv ACKNOWLEDGEMENT In the name of Allah, The Most Gracious and The Most Merciful whom with His willing, allows me to complete this thesis. In preparing this report,I was lucky to be given opportunity to explore various things that could not learn in lecture halls or classes. I would like to express my appreciation to my supervisor, Associate Professor Muhammad Mun’im bin Ahmad Zabidi for giving me the guidance, critics, support and encouragement during working on this project. I would like to give my sincere thanks to all lecturers, technicians and staffs for all wonderful experiences and cooperation for my project, especially Dr Musa bin Mohd Mokji, and Mr. Izam bin Kamisian. Finally, with memorable, to my fellow friends Muhammad Shaufil Adha bin Shawkany Hazim, Mohd Hakim bin Jamdun Akirah, Ahmad Talib bin Ab Rahman, Saiful Lizan bin Abidin, Tan Wei Choon, Pang Chun Chet, and others who were together with me through difficulties, as well as those who contribute directly or indirectly in preparing and finishing this report, your kindness means a lot to me. Thank you. Muhammad Amirul Mohamad Khalid, June 2014 v ABSTRACT The purpose of this study is to implement the audio decoding design in hardware inside a field programmable gate array (FPGA) tools. Today, the audio format MP3 file is the most popular standard for audio compression, used in playback device such as audio players and mobile phones. While MP3 decoding is one of the essential parts in multimedia system, most of the decoding designs are software-based, particularly because of the design of the system, which is easier compared to the hardware part. However, the software decodersrequire higher clock speeds, hence higher power consumption. There are projects that combine both hardware and software approaches for MP3 decoding, but the standalone hardware intellectual property (IP) core is still not well explored. This paper will introduce a brief overview on the fundamentals of the project, as well as the required details needed in working on the project. The target of this project is to build the hardware environment of the project, implementing the audio decoding layer process and run the combination hardware and software needed together to run the project. vi ABSTRAK Tujuan projek ini dilaksanakan ialah untuk mereka bentuk dan membina penyahkod bunyi (audio decoder) menggunakan field programmable gate array (FPGA). Pada masa kini, fail audio berformat MP3 adalah fail audio yang paling popular dalm sistem pemain audio serta pemampatan audio (audio compression), yang digunakan dalam peranti seperti pemain audio dan telefon bimbit. Walaupun MP3 penyahkodan adalah salah satu bahagian yang penting dalam sistem multimedia, kebanyakan reka bentuk penyahkodan adalah dalam bentuk perisian (software), terutamanya kerana reka bentuk sistem yang lebih mudah diprogramkan berbanding dalam bentuk perkakasan (hardware). Walau bagaimanapun, reka bentuk perisian mempunyai kitaran jam yang lebih tinggi, oleh itu penggunaan kuasa dalam perisian juga tinggi. Terdapat projek-projek yang menggabungkan kedua-dua perkakasan dan perisian reka bentuk dalam mereka cipta penyahkodan audio, tetapi perkakasan yang menggunakan sepenuhnya perkakasan belum dapat diterokai sebaiknya. Tesis ini akan memperkenalkan serba sedikit maklumat ringkas mengenai asas penyahkodan audio, dan juga butiran yang diperlukan dalam melaksanakan projek ini. Sasaran projek ini adalah untuk membina satu alat penyahkod audio yang menggabungkan kedua-dua perkakasan danperisian yang diperlukan untuk menjayakan projek ini. vii TABLE OF CONTENTS CHAPTER 1.0 TITLE PAGE DECLARATION ii DEDICATION iii ACKNOWLEDGEMENTS iv ABSTRACT v ABSTRAK vi TABLE OF CONTENTS vii LIST OF FIGURES x LIST OF TABLES xii LIST OF APPENDICES xiii LIST OF ABBREVIATIONS xiv Introduction 1.1 Project Background 1 1.2 Problem Statement 2 1.3 Objective 2 viii 2.0 1.4 Scope of the Project 2 1.5 Outline of the Thesis 3 Literature Review 2.1 Related Studies and Previous Work 4 2.2 Introduction to the MP3 Decoding Core 6 2.2.1 Synchroniser 7 2.2.2 Huffman Decoding 8 2.2.3 Requantiser 9 2.2.4 Reordering 10 2.2.5 Antialiasing 11 2.2.6 Inverse Modified Discrete Cosine 12 Transform (IMDCT) 2.2.7 2.3 3.0 Synthesis PolyphaseFilterbank Psychoacoustics Theory 13 14 Research Methodology 3.1 Introduction 16 3.2 Visual Representation of Research Methodology 16 3.3 Tools Used for Project 17 3.3.1 Altera DE2 Board 18 3.3.2 Altera Quartus II 19 ix 4.0 5.0 3.3.3 NIOS II 19 3.3.4 Peripheral Devices 20 3.4 Getting the SOPC Running 21 3.5 Downloading the Decoder into DE2 26 Results and Discussion 4.1 Introduction 31 4.2 Observation and Analysis 31 4.3 Discussion 33 Conclusion& Recommendation 5.1 Chapter Overview 35 5.2 Recommendation 35 5.3 Conclusion 36 REFERENCE 38 APPENDIX A 41-62 x LIST OF FIGURES FIGURE NO. TITLE PAGE 2.1 The MP3 bitstream format 7 2.2 The three parts of frequency line 8 2.3 The reordering process (the darker colour represents 11 higher frequencies) 2.4 The antialias butterfly 11 2.5 Types of window sequences in a subband 12 2.6 The IMDCT operation flow 13 2.7 The hearing range for human and several animals 15 3.1 The project workflow 17 3.2 The Altera DE2 board 18 (source:http://www.terasic.com.tw/) 3.3 The Quartus II workbench environment 19 3.4 The NIOS II workbench environment 20 3.5 The Video Graphic Accelerator (VGA) monitor 20 3.6 Speaker used in the project 21 3.7 The New Project Wizard window 22 3.8 Adding CPU in the system 23 xi 3.9 Complete Nios II system 23 3.10 The pin assignment window 24 3.11 The compilation report 25 3.12 The programmer window 25 3.13 The hardware architecture 26 3.14 New C/C++ application project window 27 3.15 The system library properties window 28 3.16 The NIOS II IDE workspace window 29 3.17 The setup of the decoding project 29 4.1 The represented decoded data in “equalizer mode” 32 4.2 The flow summary of Quartus II compilation 33 xii LIST OF TABLES TABLE NO. TITLE PAGE 3.1 The header files created for software decoding process 30 4.1 The analysed time for decoding process 32 xiii LIST OF APPENDICES APPENDIX. TITLE PAGE A Source code for the hardware part top level design “DE2_SD_Card_Audio.v” 41 B Source code for the software part C code for file “hello_world.c” 56 xiv LIST OF ABBREVIATIONS ASIC Application-Specific Integrated Circuit CD Compact Disc CISC Complex Instruction Set Computing CPU Central Processing Unit CRC Cyclic Redundancy Check DE2 Development and Education 2 DSP Digital Signal Processing FP Floating Point FPGA Field Programmable Gate Array FPS Frames Per Second FYP Final Year Project HDL Hardware Description Language IMDCT Inverse Modified Discrete Cosine Transform ISO International Organisation for Standardisation MDCT Modified Discrete Cosine Transform MP3 MPEG-1/2 audio layer-3 MPEG Moving Pictures Experts Group PCM Pulse Code Modulation RISC Reduced Instruction Set Computing xv RTL Register Transfer Level SD Secure Digital SoC System on Chip SOPC System on Programmable Chip VGA Video Graphic Accelerator VHDL VHSIC Hardware Descriptive Language VLSI Very Large Scale Integration CHAPTER 1 INTRODUCTION 1.1 Project Background The MPEG-1/2 audio layer-3, properly known as MP3format is a very popular format for compressing high quality audio.In recent years the application of the MP3 audio codec has exploded. Typically MP3 files are played back using software (CPU or DSP), but recent trends have witnessed the emergence of portable devices, such as mobile phones andMP3 players.While DSP architecture is the most flexible for running MP3 player, the challenges of the more power efficient FPGA implementation of MP3 decoding are less understood. Field Programmable Gate Array (FPGA), is one type of integrated circuit that is programmable outside the factory, thus it is called “field programmable”. This integrated circuit uses hardware description language (HDL) to configure. Nowadays, the FPGA has been applied to solve many problems in embedded systems. It can be employed as standalone System on Chip (SoC) or as powerful accelerators in multi-chip systems. 2 The target of the project is to implement the MP3 decoding core by utilizing the FPGA properties. First, the software decoder is implemented on the softcore CPU on the FPGA. Then another decoder is implemented in hardware. The different decoders are then compared in terms of minimum clock speed and resource requirements. 1.2 Problem Statement Most of the MP3 decoders are implemented in software. However, hardware decoders offer much power consumption which will be beneficial in embedded systems. This paper will assess the implementation of audio decoder using FPGA board, as well asanalysing the time requirement to decode the files. 1.3 Objective The objectives of this project are: i. To implement an audio decoder on an FPGA board, along with its peripherals needed to run the process ii. To analyse the time requirement of the audio decoding process needed to produce the output iii. To test and assess the effectiveness of both software decoder and hardware decoder design 3 1.4 Scope of the Project The scope of the project includes combination of several elements such as hardware, software and electronic parts. Below are the scopes for the project. i. Uses Verilog HDL language as its main basis for programming ii. Explore the application of Verilog using Altera DE2 Board iii. Include software programming such as C and C++ iv. Implement the application (partial) using downloaded software for software implementation (Quartus II 9.1, Nios II 9.1) 1.5 Outline of the Thesis This thesis consists of five chapters where in the first chapter, discusses the problem statement, objectives and the scope of this project. Chapter 2 explains more on the literature reviews based on the related studies and previous work of other researcher. This chapter also includes any references that are relevant to the project, whether they involve audio decoding, or FPGA-related projects. Chapter 3 describes the methodology of hardware and software implementation on this project. The result and the discussion about this project is explained in detail in chapter 4. The final chapter illustrates the conclusion of this project,as well as the recommendation and further work that can be done. CHAPTER 2 LITERATURE REVIEW In 1988, Hiroshi Yasuda (Nippon Telegraph and Telephone) and Leonardo Chiariglione had initiated the working group Moving Pictures Experts Group (MPEG) to set the standards for audio and video compression and transmission. The group, formed by International Organisation for Standardisation (ISO) and International Electrotechnical Commission (IEC), has since developed into an organization joined by members from various industries, universities and research institutions. One of the standards that have created is the MPEG-1 Layer 3, or better known as MP3. MP3 is the standard format used for digital audio compression, in which the design have 12:1 compression ratio, from 1.4Mbps 128kbps bitrate for compact disc (CD) music. 2.1 Related Studies and Previous Work It is known that MP3 decoding process is a difficult process, but several researchers have attempted to design the decoder for this specific format. For instance, Faltman et al. (2003) have stated that incorporating of MP3 decoders in portable and stand-alone players have gained in popularity. In the report, Faltman also stated the importance in the performance of these hardware MP3 decoding based on the clock 5 cycles and power usage. It also includes an attempt to to create an MP3 decoder in hardware, by using Xilinx FPGA board. Thuong et al. (2005) have proposed the architecture of the MP3 decoding core, in which the subcores of the architecture can be individually designed, coded and tested easily. The design of the core is coded using VHDL. Ko and Nicolici (2007) have tested the implementation of the core using Altera DE2 board and Xilinx multimedia board. It also has results including the number of logic elements, flip-flops, memories and multipliers involved. Bhargav and Yang (2008) have introduced the usage of Linux-run interface on the decoding core. Their research has also opened the possibilities of recreating the popular piece of consumer technology using existing hardware available in the lab. The design utilizes both hardware and software component in their design architecture. It has few general slowdowns due to system clock and debugging process. Singh et al.(2008) have proposed that the demand of handheld players and multimedia in mobile phone have raised a need for a dedicated hardware to decode the file formats with low power consumption and faster acceleration. Papakonstantinou et al. (2008) have researched case study on the implementation of floating point math in decoder implementation to achieve real time and faster decoding process. In the case study, the authors introduce floating-point (FP) unit in their architecture to assess the operation speed; thus calling it the FP implementation of MP3 decoding. Moslehpour et al.(2013), the project uses the Nios II softcore processor to read files and produces output from the decoding process. By using secure digital (SD) card as input devices, the system uses Altera DE2 board and plays back different file format: wave files, or .wav extension files. The report have shown that running the decoder in software is possible, particularly because of software features use Altera SOPC builder 6 in Altera Quartus 9.1 environment, which is the platform widely used in tertiary education. Tsai et al. (2004) have proposed a specific architectural structure of MP3 decoder in very large scale integration (VLSI) approach. It achieves a high throughput with a reduced memory requirement and hardware complexity. Meanwhile, Kalpana et al.(2012) have tried to implement the algorithm on the 32-bit reduced instruction set computing (RISC) ARM processor, which uses more hardware than necessary. All of the previous work mentioned haveproposed new approaches in building the MP3 decoding core, either in hardware or software. However, the hardware implementation of MP3 decoding IP core in Verilog HDL is not well understood. Therefore, the focus is the report is to tackle the design of MP3 decoding core, on the surface at least. 2.2 Introduction to the MP3 Decoding Core According to Kalpana et al.(2012), all MP3 files are divided into fragments called frames. Each frames stores 1152 samples, lasting for 26ms, which the frame rate is approximately 38 frames per second (fps). The first step to decode MP3 file format is by finding the start of the frame, which is called synchronization process, or else called initial reading. 7 2.2.1 Synchroniser Before decoding, the start of the frame must be found. If the frame is interrupted, we cannot find the exact position of the next frame (Thuong et al., 2007). The structure of the frame consists of 5 parts; header, cyclic redundancy check (CRC), side information, main data and ancillary data. Header CRC 32-bit 16-bit Side Information Figure 2.1 Main data Ancillary Data The MP3 bitstream format The details about the frame header is as follows: i. Frame Header It is a 32-bit long and has description of the frame, together with the synchronisation word to distinguish the beginning part of the bitstream. ii. CRC Use to check if there is any transmission error for the most sensitive data. The CRC will only exists when the protection bit in the header is set. iii. Side Information Includes the important information needed to decode the main data. This depends on the channel mode. For single channel, 136 bits are allocated, while for dual 8 channel, 256 bit allocated (this is equivalent to 17 bytes in single channel, 32 bytes in dual-channel) iv. Main Data The main data part consists of the frames that includes scalefactors, Huffman coded bits and ancillary data v. Ancillary Data This data can hold user-defined information. This frame area can hold optional data such as song name or song information. 2.2.2 Huffman Decoding This section contains one of the most important task in MP3 decoding. The task of Huffman decoding is to transform and mapping the data into scalefactors and symbols representing the 576 original frequency lines for each granule. These frequency line is divided into three partition; Big-values, Count1 and Rzero. 576 scaled frequency lines Big-values Count1 Rzero 2*Big-values 2*Big-values + 4*Count1 Figure 2.2 The MP3 bitstream format 9 Details on the Huffman code partition are as follows: i. Big-values Represents the lowest frequency lines and are coded with the highest precision, scaled from values between -15 to 15. When the decoder finds the value 15, it assumes that the higher precision is needed. This can be done by using the value 15 as an escape code, then reads additional bits from the imput stream. The numbers specified in the Huffman table are called linbits. ii. Count1 Represent the higher frequency lines; not need the higher precision scaled value. Ranging from -1 to 1. iii. Rzero Represent the highest frequency lines, and not part of the bitstream. It contains the the frequency lines that are removed by the encoder. These values are filled with zeros by the decoder. 2.2.3 Requantiser The symbols generated from Huffman decoding is then reconstructed into the original frequency line by using the scalefactors provided in the side information of the frame. The low frequency scalefactor band contains less values than the high frequency. 10 The descaling equation for both short blocks and long blocks are defined as Short blocks: ( ) | [ ( | [ [ ][ ] ][ ) ][ ][ ] ] Long blocks: ( ) | | [ ( [ [ ] [ ] ][ ) ][ ] ] The denoted scalefactorsscalefactor_s and scalefactor_l used by requantiser are provided by Huffman decoder. Parameters global_gain, subblock_gain and preflag can be found in the frames, provided by the Synchroniser block. The notation output from the Requantiser block, while 2.2.4 defines is the Huffman decoded value at index i. Reordering This block only has one task: it reorders the frequency lines within a granule. When the short block is decoded, a short window will be used. The output is then sorted into subbands, then on frequencies and at last by windows to increase the efficiency of Huffman coding. 11 Figure 2.3 2.2.5 The reordering process (the darker colour represents higher frequencies) Antialiasing Antialiasing is the process where its function is to reduce the inevitable alias effects because of the usage of non-ideal bandpass filtering. The alias reconstruction is based on the butterfly calculation, consisting of eight butterfly calculation for each subband. Figure 2.4 The antialias butterfly 12 2.2.6 Inverse Modified Discrete Cosine Transform Inverse Modified Discrete Cosine Transform, known as IMDCT, reproduce time samples from the frequency lines, together with synthesis polyphase filterbank. The time samples can be obtained from the frequency lines by using the following equation. ∑ * ( )( )+ The IMDCT operation flow begins by taking 18 input frequency lines and generates 36 polyphase filter subband samples. The samples then multiplied with with a 36-point window before passed into next decoding process. Windowing is the process of multiplying and overlapping addition operation of IMDCT’s output with the sine window coefficient. Based on the length of each window, four types of block is used; they are start, stop, short and long. The decision of block type is based on the analysis of the psychoacoustic model. Figure 2.5 Types of window sequences in a subband However, producing 36 samples from 18 input means that there are only 18 samples are unique, thus the IMDCT method uses a 50% overlap. In this case, the 36 output samples is then divided into 2 groups, low group and high group, which has 18 samples each. The overlapping process is then carried out by adding values from the higher group, previous frame with the lower group, corresponding frame. Then, the 13 frequency inversion is then taken place to achieve correct phase difference. This was done by multiplying every odd subband with (-1). Figure 2.6 2.2.7 The IMDCT operation flow Synthesis PolyphaseFilterbank This block is the last step in decoding process. It converts all 32 subbands to produce 32 Pulse Code Modulation (PCM) samples at a time The filterbank exploits aliasing and windowing to move the subbands back into their frequency domain. This block is divided into two parts; Modified Discrete Cosine Transform (MDCT) and windowing. i. Modified Discrete Cosine Transform Each time frame of the subband samples are ordered so that the first 32 values are the first sub-sample from each subband, and so forth. The MDCT processes 32 values at a time by using the equation: 14 ∑ where * ( The resultant output values, ii. )( )+ is then stored in the barrel shifter. Windowing The windowing process runs by multiplying the values from the barrel shifter with the window function. This window function is specified in the ISO standard. The PCM generated are then computed for each iteration. The MDCT and windowing together run 18 times for each granule, producing 576 PCM samples (27ms at 44.1kHz). 2.3 Psychoacoustic Theory The basic component of audio compression is removing redundant information exists in the audio signal. A normal human being can hear frequencies of between 20 Hz and 20kHz. Audio coding aims to discard signal components that are inaudible to the human listener. 15 Figure 2.7 The hearing range for human and several animals A very important property of psychoacoustics and human hearing is that the loud signal will shadow the less loud signal sufficiently close in frequency domain or time domain, modifying the threshold of hearing. This process is called masking. This property is important and can be utilize in optimum way in compressing audio signal. The masking technique can subsequently reduce the audio signal transmitted by removing the masked data shadowed by the loud signal, hence the files can be compressed further. Using the properties of the human auditory system, lossy codecs remove inaudible signals to reduce the information content, thus compressing the signal. The MP3 standard does not dictate how an encoder should be, and codec developers have plenty of freedom to remove content they deemed unusable. One encoder may decide a particular frequency is inaudible and should be removed, while another encoder keeps the same signal. Different encoders use different psychoacoustic models, models describing how humans listen to sound, hence what information may be removed. CHAPTER 3 RESEARCH METHODOLOGY 3.1 Introduction This chapter discusses the approach taken during the project’s timeline to ensure that the project is well organized and run efficiently. The methodology is represented into a flow chart for ease of understanding. 3.2 Visual Representation of Research Methodology The workflow for the project is shown, in Figure 3.1. 17 Figure 3.1 The project workflow The project begins by researching any previous works related to the MP3 decoding and FPGA-based architecture implementation. Besides that, several resources on hardware description language and software programming tutorial have also looked at. The process involved in building the core is studied and briefly elaborated to give extra knowledge in order to fulfill the research. The importance and purpose of the project is also discussed in the first stage. 3.3 Tools Used for Project This section will explain the tools and software supports used in the project. 18 3.3.1 Altera DE2 Board The hardware used for testing and implementing the project is Altera DE2 Educational Development Board. Figure 3.2 The Altera DE2 board (source: http://www.terasic.com.tw/) The Altera DE2 board provides everything needed to develop many advanced digitaldesigns using Altera Cyclone II device, with using application software Altera Quartus II. This development board is the first step to introduce and learn basic FPGA devices easily, since it is accessible in the lab.It is suitable for a wide range of exercises in courses on digital logic and computer organization, from simple tasks that illustrate fundamental concepts to advanced designs. 19 3.3.2 Altera Quartus II Figure 3.3 The Quartus II workbench environment Altera Quartus II is a software tool produced by Altera for analysis and synthesis of HDL designs, which enables the user to compile their designs, perform timing analysis, examine RTL diagrams, simulate a design's reaction and configure the target device with the programmer. 3.3.3 Nios II Nios II is a soft processorincorporates many enhancements over the original predecessor. Nios II processor comprises family of 3 configurable 32-bit Harvard architecture cores; fast, economy and standard version. Nios II is the most widely used soft processor and the most flexible for application processing needs 20 Figure 3.4 3.3.4 The Nios II workbench environment Peripheral Devices Other than Altera DE2 Board and software involved, there are several device use inside the projects, among them are speakers and the VGA monitor. Figure 3.5 The Video Graphic Accelerator (VGA) monitor 21 Figure 3.6 3.4 Speaker used in the project Getting the SOPC Running After the tools used for project is assembled, the project is planned, utilizing both devices and software prepared. First, the hardware language part of the project is created. Using the template released by Terasic Technologies Inc., the code is then modified and implemented inside Quartus II version 9.1. Before then, to understand the mechanism of SOPC building project, a lab module is used to test the development of the Nios II-based embedded system. This lab module is design as a student pack, includes step-by-step tutorial and guidelines on using Quartus II, Nios II and SOPC Builder software. This tutorial is divided into three 22 sections: Quartus II software hardware design, creating the top module files, and opening Nios II for software development. Based on the tutorial, the system is then designed and generated. In the first section, the development of hardware design is started by creating the new project inside Quartus II, using New Project Wizard. Figure 3.7 The New Project Wizard window Then, after creating the new project, the next step is to create the simple Nios II system by using SOPC Builder, then adding CPU and peripheral into the system. 23 Figure 3.8 Figure 3.9 Adding CPU in the system Complete Nios II system 24 For the second section, the top-level file is created, by writing the code in Verilog language. Most of the audio decoding programs on the net utilise the core program developed by Altera Corporation as their basis in varieties of decoding projects, named DE2_SD_Card_Audio. The code is provided in the Appendix A of this thesis. From the codes provided, several modifications have been done in order to create a decoder based on specific characteristics, most notably in MP3 format. Next, after the code is created, pins are assigned to the DE2 board by using pin assignment menu. Figure 3.10 The pin assignment window Then, the module created is then compiled before the successfully compiled code is then downloaded into Altera DE2 board using Programmer menu. The compilation result of the code and the programmer window to download the design is shown as follows. 25 Figure 3.11 Figure 3.12 The compilation report The programmer window 26 The simplified designated hardware configuration for this project is illustrated in the figure below. Figure 3.13 3.5 The hardware architecture Downloading the Decoder into DE2 The third part of the section is software development. This section includes writing the C/C++ embedded system application and run on the system software. This section will be conducted by implementing Nios II IDE system-on-programmable chip (SOPC) environment created previously and download the design on the DE2 board. 27 Firstly, the new C/C++ application project is created in Nios II IDE software using the new project menu. Most of the workspace project utilizes the template project available in the mentioned software, specifically the “Hello World” project. Figure 3.14 New C/C++ application project window After the new project is created, the system library properties of the respected project are configured. 28 Figure 3.15 The system library properties window From the codes provided, several modifications have been done in order to create a decoder, including a number of headers included in the main program name hello_world.c, compiled together in the Appendix B of this thesis. Then, the written code is run in the Nios II IDE workspace window. The code is then compiled and then built. This is shown in the Nios II workspace window. 29 Figure 3.16 The NIOS II IDE workspace window The setup of the project is shown below. This setup includes every tool used in the project. Figure 3.17 The setup of the decoding project 30 After the main program main program name hello_world.cis created, the header files are created. There are several headers need to be created to run the software development of the project. The list of the header files created is shown in the table below. Table 3.1 The header files created for software decoding process File name antialias.h basics.h Description The antialiasing part of the decoder Contains the definition of the MP3 file format used for decoding process dataheader.h Contains the MP3 bitstreamdata table dewindowarray.h Includes subband synthesis table float.h Used for floating point operation get_scalefactor.h Used for scalefactor analysis header_reader.h Include codes for analyzing the header of the data huffarray.h huffman_decode.h hybrid.h For Huffman decoding Creating functions to perform Huffman decoding Performing IMDCT operation joint_stereo.h For stereo processing reorder.h For reordering process requantize.h For requantising section subbandsynthesis.h Used for performing subband synthesis process syn_costable.h Used for shifting and reducing the PCM sample CHAPTER 4 RESULTS AND DISCUSSION 4.1 Introduction This chapter discusses the result and experiment tested, experimented and conducted to produce the results obtained and as targeted in the previous chapter. This chapter also explains hindrances and predicament encounter throughout the entire project process. 4.2 Observation and Analysis When first implemented the MP3 decoding process on the DE2 board, the decoding process is very slow. The analysis of the data is shown below. 32 Table 4.1 The analysed time for decoding process Activity Quartus II hardware compilation Programmer Time Time Taken 4 minutes 29 seconds 30 seconds Nios II software running 14 minutes 49 seconds TOTAL TIME 19 minutes 48 seconds The output of the decoding is the series of data that represented in visual effects, which looks like an equalizer in the music player. Figure 4.1 The represented decoded data in “equalizer mode” 33 From the Quartus II full compilation report, the flow summary of the hardware design is shown in the figure below. Figure 4.2 4.3 The flow summary of Quartus II compilation Discussion It is clear that the most integral part in implementing the decoder is the software part. This involves using Nios II software for compiling and running the decoder project. There are many projects associated with audio decoding available in store, but the implementation of the project is mostly restricted and prone to software version used. Another problem faced during completion of the project is the FPGA board version used. Most of the projects utilize Altera DE2 board, the most common board that used in Altera University Program. However, due to the limited memory spaces, the release of newer version and enhanced properties, there is consideration to use the new board available, the Altera DE2-115. It is certain that the device is more advanced than the previous predecessor, but the pin configuration, the board properties and the 34 processor performance are different. In addition, none of the completed projects have been implemented in the new board. However, after several revisions, it is decided that this project will stick to the original plan; using the DE2 board, with several modification on the software coding. It is also decided that the program will also stick to the original coding, with several modification on the software setting. Thanks to the classic mode setting available in the latest model, the problem faced in the initial segment of the project can be solved. CHAPTER 5 CONCLUSIONS AND RECOMMENDATIONS 5.1 Chapter Overview This chapter will elaborate the conclusion of this project and the recommendation that can be implemented in the future to make the project better. 5.2 Recommendation Several modifications have been made by finding the software compatible to the program code modified specifically for the project. The test proved successful, but several major modifications need to be implemented. It is discovered that the new FPGA, the DE2-115 board is better in terms of hardware specifications compared to the older version, DE2. For example, DE2-115 board is using the Altera Cyclone® IV 4CE115 FPGA, the newer version compared to DE2 that useAltera Cyclone® II 2C35 FPGA. The DE2-115 also has bigger memory 36 space compare to the DE2 board. Therefore, a more advanced decoder design can be implemented. Next, it is recommended to alter the code to take advantage on the latest FPGA features. This is due to the fact that newer version of the FPGA board have much powerful performance. Furthermore, with the adaptation of new platform the system builder will cause the new code to be incompatible with the old board. From the system with the .ptf file generated, to the .sopc format file and now with the .qsys file extension, there is an essential need to edit the code so it is compatible to the latest version of the software. However, backward compatibility is not necessary to when upgrading to a new board. Upgrading the system to the FPGA with better processor is another recommendation to improve performance of the project. For example, processor such as ARM has several features not available in Nios such as the ability to run more operating system. The bus architecture of the processor also plays an important role in increasing the performance of the processor. For instance, the ARM bus architecture, called AMBA can be design hierarchically, pipelined and multiplexed, while Altera bus architecture, called Avalon, only available in multiplexed and pipelined architectures. 5.3 Conclusion The objective of implementing the audio decoder on an FPGA board, along with the peripheral needed is successful. By using the combination of hardware and software co-design, the project achieves the first objective. From the successful design, the time requirement of audio decoding process needed to produce the output can be assessed. By using observation and time-clocking method, the analysis of the time consumption is achieved. However, implementing the hardware decoder as a standalone intellectual 37 property (IP) core did not achieve its objective stated. To achieve the required objective stated, the project experienced difficulties in converting the software code into hardware description language (HDL), as well as lack of sources related to hardware audio decoding. This project is a highly difficult and challenging, yet there are many area of knowledge discovered during the process of completing it. Aside from learning how to implement SoC in FPGA, studying about the properties of audio decoding process, particularly the MP3 file format, as well as the psychoacoustic theory of human hearing really brought the new dimension in my studies. Since this project focuses on the reallife application to the consumer, the challenge of designing devices that is user-friendly is another aspect of lesson learned throughout completing the project. The idea of turning a proposed design to a prototype useful to the customer is now a trend in the university final year projects, instead of focusing on the pure research project, in which few of the general public generally understand and appreciate its application used in daily life. REFERENCES Altera.(2013). DE2-115 User Manual. Terasic DE2-115 User Manual, www.terasic.com. Altera.(2013). Nios II Performance Bookmarks. Data Sheet, Altera Corporation. Altera.(2007). DE2 Development and Education Board User Manual.Version 1.4.1 Altera Corporation. Bakhteri R. (2013). ECAD Problem Based Lab Student Pack – Altera DE2 Tutorial. Fakulti Kejuruteraan Elektrik, Universiti Teknologi Malaysia, Kampus Skudai, Johor. Bhargav S., Yang B. (2008).MP3 decoding of an FPGA. CSEE 6847 Distributed Embedded System. Columbia University. Cai S., Xiao X., Zhang J. (2005). Embedded Network MP3 Playing System. Nios II Embedded Processor Design Contest – Outstanding Designs 2005, Southern Taiwan University of Technology. Edstrom B. (2008). Let’s build an MP3-decoder! http://blog.bjrn.se/2008/10/lets-buildmp3-decoder.html Faltman I., et. al (2003). A hardware implementation of an MP3 decoder. Digital ICProject, LTH, Sweden. 39 Hau Y, Hani M. (2012). SoC based Design: Avalon Bus Interface to User-Designed Logic. veCAD Technical Report, Faculty of Electrical Engineering, Universiti Teknologi Malaysia. Hedberg H., Lenart T., Svensson H. (2005). A Complete MP3 Decoder on a Chip.Proceeding of the 2005 IEEE International Conference on Microelectronic System Education (MSE ’05). Kalpana E., Sridhar V., Rajendra M. (2012).“MPEG-1/2 audio layer-3(MP3) on theRISC based ARM Processor (ARM92SAM9263)”. International Journal of Computer Science Engineering (IJSCE). Ko H, Nicolici N. (2007).MAC_MP3: A Low Energy Implementation of an Audio Decoder. McMaster University, Ontario. Luka L. (2010). FPGA-based MP3 Player Project Report. Mansour M. F. (2007). “Efficient Huffman Decoding with Table Lookup”. International Conference of Acoustics, Speech and Signal Processing 2007 (ICASSP ’07), IEEE. Moslehpour S., Jenab K., Siliveri E. H. (2013). Design and Implementation of NIOS II System for Audio Application. IACSIT International Journal of Engineering and Technology, Vol. 5, No. 5. Papakonstantinou A., et. al (2008). MP3 decoding on FPGA: a case study for floating point acceleration.ECE Department, University of Illinois. Raissi R. (2002). The Theory Behind MP3. www.mp3-tech.org. Sharma M., Kumar D. (2012). “Wishbone Bus Architecture – A Survey and Comparison”.International Journal of VLSI design and Communication System (VLSICS),Vol 3, No. 2. Shlien S. (1994). Guide to MPEG-1 Audio Standard. IEEE Transaction on Broadcasting, Vol. 40, No. 4, December 1994. 40 Singh M,Shah N. R., Shankar R. (2008).player-I – An internet based muzik player. CSEE W4840 Design, Columbia University. Sripada P. (2006). MP3 DECODER in Theory and Practice. Master Thesis Report, Blekinge Tekniska Högskola. Thuong L, Vu C, Chien H (2005).FPGA Based Architecture of MP3 Decoding Core for Multimedia Systems. Hochiminh City University of Technology. Tsai T, Yang Y, Lui C (2005). A Hardware/Software Co-Design of MP3 Audio Decoder. Journal of VLSI Signal Processing 41, 111-127. Wong R, Santhanagopalan V (2010). Music Player.ECE 5760 - Final Project. Cornell University Zheng L, et. al (2010). MP3 Player. CSEE 4840 Spring 2010 Project Design, Columbia University. APPENDIX A Source code for the hardware part top level design // -------------------------------------------------------------------// Copyright (c) 2005 by Terasic Technologies Inc. // -------------------------------------------------------------------// // Permission: // // Terasic grants permission to use and modify this code for use // in synthesis for all Terasic Development Boards and Altera Development // Kits made by Terasic. // ,duplication, or modification of any portion is strictly prohibited. Other use of this code, including the selling // // Disclaimer: // // This VHDL/Verilog or C/C++ source code is intended as a design reference // which illustrates how these types of functions can be implemented. // It is the user's responsibility to verify their design for // consistency and functionality through the use of formal // verification methods. // or functionality of this code. Terasic provides no warranty regarding the use // // -------------------------------------------------------------------// // Terasic Technologies Inc // 356 Fu-Shin E. Rd Sec. 1. JhuBei City, // HsinChu County, Taiwan // 302 // // web: http://www.terasic.com/ // email: support@terasic.com // // -------------------------------------------------------------------- 42 // // Major Functions: DE2 NIOS Reference Design // // -------------------------------------------------------------------// // Revision History : // -------------------------------------------------------------------// Ver :| Author // V2.0 :| Johnny Chen :| Mod.Date :| Changes Made: :| 06/07/19 :| Initial Revision // -------------------------------------------------------------------- module DE2_SD_Card_Audio ( //////////////////// Clock Input //////////////////// CLOCK_27, // On Board 27 CLOCK_50, // On Board 50 EXT_CLOCK, // External Clock MHz MHz //////////////////// Push Button KEY, //////////////////// //////////////////// // DPDT Switch Pushbutton[3:0] //////////////////// SW, // Toggle Switch[17:0] //////////////////// 7-SEG Dispaly //////////////////// HEX0, // Seven Segment HEX1, // Seven Segment HEX2, // Seven Segment HEX3, // Seven Segment HEX4, // Seven Segment HEX5, // Seven Segment HEX6, // Seven Segment HEX7, // Seven Segment Digit 0 Digit 1 Digit 2 Digit 3 Digit 4 Digit 5 Digit 6 Digit 7 //////////////////////// LED //////////////////////// 43 LEDG, // LED Green[8:0] LEDR, // LED Red[17:0] //////////////////////// UART //////////////////////// UART_TXD, // UART UART_RXD, // UART Receiver Transmitter //////////////////////// IRDA //////////////////////// IRDA_TXD, // IRDA IRDA_RXD, // IRDA Receiver ///////////////////// SDRAM Interface //////////////// DRAM_DQ, // SDRAM Data bus DRAM_ADDR, // SDRAM Address DRAM_LDQM, // SDRAM Low-byte DRAM_UDQM, // SDRAM High- DRAM_WE_N, // SDRAM Write DRAM_CAS_N, // SDRAM Column DRAM_RAS_N, // SDRAM Row DRAM_CS_N, // SDRAM Chip DRAM_BA_0, // SDRAM Bank DRAM_BA_1, // SDRAM Bank DRAM_CLK, // SDRAM Clock DRAM_CKE, // SDRAM Clock Transmitter 16 Bits bus 12 Bits Data Mask byte Data Mask Enable Address Strobe Address Strobe Select Address 0 Address 1 Enable //////////////////// Flash Interface //////////////// FL_DQ, // FLASH Data bus FL_ADDR, // FLASH Address FL_WE_N, // FLASH Write FL_RST_N, // FLASH Reset FL_OE_N, // FLASH Output 8 Bits bus 20 Bits Enable Enable 44 FL_CE_N, // FLASH Chip Enable //////////////////// SRAM Interface //////////////// SRAM_DQ, // SRAM Data bus SRAM_ADDR, // SRAM Address SRAM_UB_N, // SRAM High-byte SRAM_LB_N, // SRAM Low-byte SRAM_WE_N, // SRAM Write SRAM_CE_N, // SRAM Chip SRAM_OE_N, // SRAM Output 16 Bits bus 18 Bits Data Mask Data Mask Enable Enable Enable //////////////////// ISP1362 Interface //////////////// OTG_DATA, // ISP1362 Data OTG_ADDR, // ISP1362 OTG_CS_N, // ISP1362 Chip OTG_RD_N, // ISP1362 Write OTG_WR_N, // ISP1362 Read OTG_RST_N, // ISP1362 Reset OTG_FSPEED, 0 = Enable, Z = Disable // USB Full Speed, OTG_LSPEED, 0 = Enable, Z = Disable // USB Low Speed, OTG_INT0, // ISP1362 OTG_INT1, // ISP1362 OTG_DREQ0, // ISP1362 DMA OTG_DREQ1, // ISP1362 DMA bus 16 Bits Address 2 Bits Select Interrupt 0 Interrupt 1 Request 0 Request 1 OTG_DACK0_N, // ISP1362 DMA OTG_DACK1_N, // ISP1362 DMA Acknowledge 0 Acknowledge 1 //////////////////// LCD_ON, ON/OFF LCD Module 16X2 //////////////// // LCD Power 45 LCD_BLON, // LCD Back Light // LCD Read/Write // LCD Enable // LCD // LCD Data bus 8 ON/OFF LCD_RW, Select, 0 = Write, 1 = Read LCD_EN, LCD_RS, Command/Data Select, 0 = Command, 1 = Data LCD_DATA, bits //////////////////// SD_Card Interface //////////////// SD_DAT, // SD Card Data SD_DAT3, // SD Card Data 3 SD_CMD, // SD Card SD_CLK, // SD Card Clock Command Signal //////////////////// USB JTAG link //////////////////// TDI, // CPLD -> FPGA TCK, // CPLD -> FPGA TCS, // CPLD -> FPGA // FPGA -> CPLD (Data in) (Clock) (CS) TDO, (Data out) //////////////////// I2C //////////////////////////// I2C_SDAT, // I2C Data I2C_SCLK, // I2C Clock //////////////////// PS2 //////////////////////////// PS2_DAT, // PS2 Data PS2_CLK, // PS2 Clock //////////////////// VGA //////////////////////////// VGA_CLK, // VGA Clock VGA_HS, // VGA H_SYNC VGA_VS, // VGA V_SYNC VGA_BLANK, // VGA BLANK VGA_SYNC, // VGA SYNC VGA_R, // VGA Red[9:0] VGA_G, // VGA Green[9:0] VGA_B, // VGA Blue[9:0] //////////// Ethernet Interface //////////////////////// 46 ENET_DATA, // DM9000A DATA // DM9000A ENET_CS_N, // DM9000A Chip ENET_WR_N, // DM9000A Write ENET_RD_N, // DM9000A Read ENET_RST_N, // DM9000A Reset ENET_INT, // DM9000A ENET_CLK, // DM9000A Clock bus 16Bits ENET_CMD, Command/Data Select, 0 = Command, 1 = Data Select Interrupt 25 MHz //////////////// Audio CODEC AUD_ADCLRCK, //////////////////////// // Audio CODEC ADC LR Clock AUD_ADCDAT, // Audio CODEC ADC Data AUD_DACLRCK, // Audio CODEC DAC LR Clock AUD_DACDAT, // Audio CODEC // Audio CODEC // Audio CODEC DAC Data AUD_BCLK, Bit-Stream Clock AUD_XCK, Chip Clock //////////////// TV Decoder TD_DATA, //////////////////////// // TV Decoder Data bus 8 bits TD_HS, // TV Decoder TD_VS, // TV Decoder TD_RESET, // TV Decoder H_SYNC V_SYNC Reset //////////////////// GPIO //////////////////////////// GPIO_0, // GPIO GPIO_1 // GPIO Connection 0 Connection 1 ); //////////////////////// input Clock Input CLOCK_27; //////////////////////// // On Board 27 MHz 47 input CLOCK_50; // On Board 50 MHz input EXT_CLOCK; // External Clock //////////////////////// input [3:0] //////////////////////// KEY; // //////////////////////// input Push Button DPDT Switch Pushbutton[3:0] //////////////////////// [17:0] SW; // //////////////////////// 7-SEG Display Toggle Switch[17:0] //////////////////////// output [6:0] HEX0; // Seven Segment Digit 0 output [6:0] HEX1; // Seven Segment Digit 1 output [6:0] HEX2; // Seven Segment Digit 2 output [6:0] HEX3; // Seven Segment Digit 3 output [6:0] HEX4; // Seven Segment Digit 4 output [6:0] HEX5; // Seven Segment Digit 5 output [6:0] HEX6; // Seven Segment Digit 6 output [6:0] HEX7; // Seven Segment Digit 7 //////////////////////////// output [8:0] LED //////////////////////////// LEDG; // LED Green[8:0] output [17:0] LEDR; // LED Red[17:0] //////////////////////////// UART //////////////////////////// output UART_TXD; // UART Transmitter input UART_RXD; // UART Receiver //////////////////////////// IRDA //////////////////////////// output IRDA_TXD; // IRDA Transmitter input IRDA_RXD; // IRDA Receiver /////////////////////// inout [15:0] DRAM_DQ; output [11:0] DRAM_ADDR; SDRAM Interface //////////////////////// // SDRAM Data bus 16 Bits // SDRAM Address bus 12 Bits output Mask DRAM_LDQM; // SDRAM Low-byte Data output Mask DRAM_UDQM; // SDRAM High-byte Data output DRAM_WE_N; // SDRAM Write Enable output Strobe DRAM_CAS_N; // SDRAM Column Address output Strobe DRAM_RAS_N; // SDRAM Row Address output DRAM_CS_N; // SDRAM Chip Select output DRAM_BA_0; // SDRAM Bank Address 0 48 output DRAM_BA_1; // SDRAM Bank Address 0 output DRAM_CLK; // SDRAM Clock output DRAM_CKE; // SDRAM Clock Enable //////////////////////// inout [7:0] Flash Interface FL_DQ; output [21:0] FL_ADDR; //////////////////////// // FLASH Data bus 8 Bits // FLASH Address bus 22 Bits output FL_WE_N; // FLASH Write Enable output FL_RST_N; // FLASH Reset output FL_OE_N; // FLASH Output Enable output FL_CE_N; // FLASH Chip Enable //////////////////////// inout SRAM Interface //////////////////////// [15:0] SRAM_DQ; output [17:0] SRAM_ADDR; // SRAM Data bus 16 Bits // SRAM Address bus 18 Bits output Mask SRAM_UB_N; // SRAM Low-byte Data output Mask SRAM_LB_N; // SRAM High-byte Data output SRAM_WE_N; // SRAM Write Enable output SRAM_CE_N; // SRAM Chip Enable output SRAM_OE_N; // SRAM Output Enable //////////////////// ISP1362 Interface inout [15:0] OTG_DATA; output [1:0] OTG_ADDR; //////////////////////// // ISP1362 Data bus 16 Bits // ISP1362 Address 2 Bits output OTG_CS_N; // ISP1362 Chip Select output OTG_RD_N; // ISP1362 Write output OTG_WR_N; // ISP1362 Read output OTG_RST_N; // ISP1362 Reset output OTG_FSPEED; 0 = Enable, Z = Disable // USB Full Speed, output OTG_LSPEED; 0 = Enable, Z = Disable // USB Low Speed, input OTG_INT0; // ISP1362 Interrupt 0 input OTG_INT1; // ISP1362 Interrupt 1 input OTG_DREQ0; // ISP1362 DMA Request 0 input OTG_DREQ1; // ISP1362 DMA Request 1 output OTG_DACK0_N; // ISP1362 DMA Acknowledge 0 output OTG_DACK1_N; // ISP1362 DMA Acknowledge 1 //////////////////// LCD Module 16X2 //////////////////////////// 49 inout [7:0] LCD_DATA; // LCD Data bus 8 bits output LCD_ON; // LCD Power ON/OFF output LCD_BLON; // LCD Back Light ON/OFF output 0 = Write, 1 = Read LCD_RW; // LCD Read/Write Select, output LCD_EN; // LCD Enable output LCD_RS; Select, 0 = Command, 1 = Data // LCD Command/Data //////////////////// SD Card Interface inout SD_DAT; // SD Card Data inout SD_DAT3; // SD Card Data 3 inout Signal SD_CMD; // SD Card Command output SD_CLK; // SD Card Clock //////////////////////// I2C //////////////////////// //////////////////////////////// inout I2C_SDAT; // I2C Data output I2C_SCLK; // I2C Clock //////////////////////// PS2 //////////////////////////////// input PS2_DAT; // PS2 Data input PS2_CLK; // PS2 Clock //////////////////// USB JTAG link input TDI; // CPLD -> FPGA (data in) input TCK; // CPLD -> FPGA (clk) input TCS; // CPLD -> FPGA (CS) output TDO; // FPGA -> CPLD (data out) //////////////////////// //////////////////////////// VGA //////////////////////////// output VGA_CLK; // VGA Clock output VGA_HS; // VGA H_SYNC output VGA_VS; // VGA V_SYNC output VGA_BLANK; // VGA BLANK output VGA_SYNC; // VGA SYNC output [9:0] VGA_R; // VGA Red[9:0] output [9:0] VGA_G; // VGA Green[9:0] output [9:0] VGA_B; // VGA Blue[9:0] //////////////// inout Ethernet Interface [15:0] ENET_DATA; output ENET_CMD; Select, 0 = Command, 1 = Data //////////////////////////// // DM9000A DATA bus 16Bits // DM9000A Command/Data 50 output ENET_CS_N; // DM9000A Chip Select output ENET_WR_N; // DM9000A Write output ENET_RD_N; // DM9000A Read output ENET_RST_N; // DM9000A Reset input ENET_INT; // DM9000A Interrupt output ENET_CLK; // DM9000A Clock 25 MHz //////////////////// Audio CODEC inout AUD_ADCLRCK; input AUD_ADCDAT; inout AUD_DACLRCK; output AUD_DACDAT; // Audio CODEC DAC Data inout Stream Clock AUD_BCLK; // Audio CODEC Bit- output Clock AUD_XCK; // Audio CODEC Chip //////////////////// TV Devoder input [7:0] //////////////////////////// // Audio CODEC ADC LR Clock // // Audio CODEC ADC Data Audio CODEC DAC LR Clock //////////////////////////// TD_DATA; // TV Decoder Data bus 8 bits input TD_HS; // TV Decoder H_SYNC input TD_VS; // TV Decoder V_SYNC output TD_RESET; // TV Decoder Reset //////////////////////// GPIO //////////////////////////////// inout [35:0] GPIO_0; // GPIO Connection 0 inout [35:0] GPIO_1; // GPIO Connection 1 wire CPU_CLK; wire CPU_RESET; wire CLK_18_4; wire CLK_25; //wire vga_clk; // Flash assign FL_RST_N = 1'b1; assign LCD_ON = 1'b1; // LCD ON assign LCD_BLON = 1'b1; // LCD Back Light // // 16*2 LCD Module All inout port turn to tri-state 51 assign SD_DAT = 1'bz; assign AUD_ADCLRCK = AUD_DACLRCK; assign GPIO_0 = 36'hzzzzzzzzz; assign GPIO_1 = 36'hzzzzzzzzz; // Disable USB speed select assign OTG_FSPEED = 1'bz; assign OTG_LSPEED = 1'bz; // Turn On TV Decoder assign TD_RESET // = 1'b1; Set SD Card to SD Mode assign SD_DAT3 Reset_Delay = 1'b1; delay1 (.iRST(KEY[0]),.iCLK(CLOCK_50),.oRESET(CPU_RESET)); Pll_ALL PLL1 (.areset(!CPU_RESET),.inclk0(CLOCK_50),.c0(DRAM_CLK),.c1(CPU_CLK),.c2(CLK_18_4)); //actuall output a 11.2896Mhz //vgapll system_0 PLL2 u0 (.inclk0(CLOCK_27),.c0(vga_clk)); ( // 1) global signals: .clk(CPU_CLK), .clk_50(CLOCK_50), .reset_n(CPU_RESET), // the_Audio_0 .iCLK_18_4_to_the_Audio_0(CLK_18_4), .oAUD_BCK_from_the_Audio_0(AUD_BCLK), .oAUD_DATA_from_the_Audio_0(AUD_DACDAT), .oAUD_LRCK_from_the_Audio_0(AUD_DACLRCK), .oAUD_XCK_from_the_Audio_0(AUD_XCK), .VGA_BLANK_from_the_de2_vga_raster_inst(VGA_BLANK), .VGA_B_from_the_de2_vga_raster_inst(VGA_B), .VGA_CLK_from_the_de2_vga_raster_inst(VGA_CLK), 52 .VGA_G_from_the_de2_vga_raster_inst(VGA_G), .VGA_HS_from_the_de2_vga_raster_inst(VGA_HS), .VGA_R_from_the_de2_vga_raster_inst(VGA_R), .VGA_SYNC_from_the_de2_vga_raster_inst(VGA_SYNC), .VGA_VS_from_the_de2_vga_raster_inst(VGA_VS), // the_VGA_0 // -- .VGA_BLANK_from_the_VGA_0(VGA_BLANK), // -- .VGA_B_from_the_VGA_0(VGA_B), // -- .VGA_CLK_from_the_VGA_0(VGA_CLK), // -- .VGA_G_from_the_VGA_0(VGA_G), // -- .VGA_HS_from_the_VGA_0(VGA_HS), // -- .VGA_R_from_the_VGA_0(VGA_R), // -- .VGA_SYNC_from_the_VGA_0(VGA_SYNC), // -- .VGA_VS_from_the_VGA_0(VGA_VS), // -- .iCLK_25_to_the_VGA_0(CLK_25), // // // the_SD_CLK // -- .out_port_from_the_SD_CLK(SD_CLK), // // // the_SD_CMD // -- .bidir_port_to_and_from_the_SD_CMD(SD_CMD), // // // // the_SD_DAT // .bidir_port_to_and_from_0the_SD_DAT(SD_DAT), // the_SEG7_Display .oSEG0_from_the_SEG7_Display(HEX0), .oSEG1_from_the_SEG7_Display(HEX1), .oSEG2_from_the_SEG7_Display(HEX2), .oSEG3_from_the_SEG7_Display(HEX3), .oSEG4_from_the_SEG7_Display(HEX4), .oSEG5_from_the_SEG7_Display(HEX5), .oSEG6_from_the_SEG7_Display(HEX6), .oSEG7_from_the_SEG7_Display(HEX7), // the_DM9000A 53 .ENET_CLK_from_the_DM9000A(ENET_CLK), .ENET_CMD_from_the_DM9000A(ENET_CMD), .ENET_CS_N_from_the_DM9000A(ENET_CS_N), .ENET_DATA_to_and_from_the_DM9000A(ENET_DATA), .ENET_INT_to_the_DM9000A(ENET_INT), .ENET_RD_N_from_the_DM9000A(ENET_RD_N), .ENET_RST_N_from_the_DM9000A(ENET_RST_N), .ENET_WR_N_from_the_DM9000A(ENET_WR_N), .iOSC_50_to_the_DM9000A(CLOCK_50), // the_ISP1362 .OTG_ADDR_from_the_ISP1362(OTG_ADDR), .OTG_CS_N_from_the_ISP1362(OTG_CS_N), .OTG_DATA_to_and_from_the_ISP1362(OTG_DATA), .OTG_INT0_to_the_ISP1362(OTG_INT0), .OTG_INT1_to_the_ISP1362(OTG_INT1), .OTG_RD_N_from_the_ISP1362(OTG_RD_N), .OTG_RST_N_from_the_ISP1362(OTG_RST_N), .OTG_WR_N_from_the_ISP1362(OTG_WR_N), // the_button_pio .in_port_to_the_button_pio(KEY), // the_lcd_16207_0 .LCD_E_from_the_lcd_16207_0(LCD_EN), .LCD_RS_from_the_lcd_16207_0(LCD_RS), .LCD_RW_from_the_lcd_16207_0(LCD_RW), .LCD_data_to_and_from_the_lcd_16207_0(LCD_DATA), // the_led_green .out_port_from_the_led_green(LEDG), // the_led_red .out_port_from_the_led_red(LEDR), // the_sdram_0 .zs_addr_from_the_sdram_0(DRAM_ADDR), 54 .zs_ba_from_the_sdram_0({DRAM_BA_1,DRAM_BA_0}), .zs_cas_n_from_the_sdram_0(DRAM_CAS_N), .zs_cke_from_the_sdram_0(DRAM_CKE), .zs_cs_n_from_the_sdram_0(DRAM_CS_N), .zs_dq_to_and_from_the_sdram_0(DRAM_DQ), .zs_dqm_from_the_sdram_0({DRAM_UDQM,DRAM_LDQM}), .zs_ras_n_from_the_sdram_0(DRAM_RAS_N), .zs_we_n_from_the_sdram_0(DRAM_WE_N), // the_sram_0 .SRAM_ADDR_from_the_sram_0(SRAM_ADDR), .SRAM_CE_N_from_the_sram_0(SRAM_CE_N), .SRAM_DQ_to_and_from_the_sram_0(SRAM_DQ), .SRAM_LB_N_from_the_sram_0(SRAM_LB_N), .SRAM_OE_N_from_the_sram_0(SRAM_OE_N), .SRAM_UB_N_from_the_sram_0(SRAM_UB_N), .SRAM_WE_N_from_the_sram_0(SRAM_WE_N), // the_switch_pio .in_port_to_the_switch_pio(SW), // the_tri_state_bridge_0_avalon_slave .select_n_to_the_cfi_flash_0(FL_CE_N), .tri_state_bridge_0_address(FL_ADDR), .tri_state_bridge_0_data(FL_DQ), .tri_state_bridge_0_readn(FL_OE_N), .write_n_to_the_cfi_flash_0(FL_WE_N), // the_uart_0 .rxd_to_the_uart_0(UART_RXD), .txd_from_the_uart_0(UART_TXD) ); I2C_AV_Config u1 ( // Host Side .iCLK(CLOCK_50), .iRST_N(KEY[0]), // I2C Side 55 .I2C_SCLK(I2C_SCLK), .I2C_SDAT(I2C_SDAT) Endmodule ); 56 APPENDIX B Source code for the software part C code for file “hello_world.c” #define TESTFRAME 800 #include "basic_io.h" #include "basic.h" #include "header_reader.h" #include "get_scalefactor.h" #include "requantize.h" #include "huffman_decode.h" #include "reorder.h" #include "joint_stereo.h" #include "antialias.h" #include "hybrid.h" #include "subbandsynthesis.h" #include "math.h" #include "alt_types.h" #include "io.h" #include "system.h" #include "stdio.h" #define IOWR_LED_DATA(base, offset, data) \ IOWR_16DIRECT(base, (offset) * 2, data) #define IORD_LED_DATA(base, offset) \ IORD_16DIRECT(base, (offset) * 2) #define IOWR_LED_SPEED(base, data) \ IOWR_16DIRECT(base + 32, 0, data) unsigned long F32ToHex(float valueF) { 57 unsigned long* valueL = (unsigned long *) &valueF; return *valueL; } inlineint gen_wave32 (float flt) { unsigned long hex=0; unsignedintexp,outcome; unsigned long fraction; unsigned char sign_whole; unsigned char sign_exp; unsigned long result; unsigned long result2; hex=F32ToHex(flt); fraction=hex&0x007FFFFF; exp=127-((hex&0x7F800000)>>23); //sign_exp=((exp&0x800)>>11); //exp=exp&0x7FF; sign_whole=(hex&0x80000000)>>31; fraction=fraction|0x00800000; result=(fraction<<7)>>(exp-1); result&=0x00FF0000; result>>=16; // outcome=result; return result; } void main() { unsigned char *address_of_first_frame; unsigned char *index; unsigned char valid[2]={1,1}; 58 unsigned long intsycnword_count=0; unsigned char ii=0; //This variable is used to denote the number of frame that are being analyzed. int clip=0; intvga,vga_temp; printf("OK start.\n");//test; find_the_first_frame(&address_of_first_frame,&sycnword_count); frame_stat=0;//test; sycnword_count=sycnword_count-2; block_type_0_count=0;//test; //printf("address_of_first_frame is %d\n",address_of_first_frame data_header);//test; index=address_of_first_frame; si[0].main_data_end=0;si[1].main_data_end=0; initialize_huffman(); for(frameNum=1;frameNum<TESTFRAME+1;frameNum++) { ii++; if(ii>1) ii=0; header_reader(&index,&sycnword_count,&header_info[ii],&si[ii],&si[bit_add(ii)],&main_data _beg_bs[ii],&valid[ii]); /*if((valid[1]==1)&&(valid[0]==1)) { //printf("I have found the %dst frame starting at this address:%d\n",frameNum,index-header_info[ii].frame_length-data_header); } else { //printf("bad frame detected.I quit.\n");exit(0); }*/ 59 intch,gr; for(gr=0;gr<grNum;gr++) {gr_global=gr; for(ch=0;ch<stereo;ch++) { get_scale_factors(&si[ii],&scalefac,gr,ch,main_data_beg_bs[ii]); //printf("start of huffman\n"); huffman_decode(is, &si[ii], ch, gr,&header_info[ii],&main_data_beg_bs[ii]); main_data_beg_bs[ii].byte_idx_ptr+=(si[ii].ch[ch].gr[gr].part2_3_length/8); if(main_data_beg_bs[ii].bit_idx>=(si[ii].ch[ch].gr[gr].part2_3_length%8)) { main_data_beg_bs[ii].bit_idx-=(si[ii].ch[ch].gr[gr].part2_3_length%8); } else { main_data_beg_bs[ii].byte_idx_ptr++; main_data_beg_bs[ii].bit_idx=main_data_beg_bs[ii].bit_idx+8si[ii].ch[ch].gr[gr].part2_3_length%8; } //printf("start of requantize\n"); requantize(&header_info[ii],&scalefac,&si[ii],is,ro[ch],gr,ch); //printf("end of requantize\n"); //print_scalefac(frameNum, gr, ch, si[ii]);//test; //print_requantize(frameNum,gr,ch,ro[ch]);//test; } //printf("start of stereo\n"); join_stereo(ro,lr,&scalefac,&(si[ii].ch[ch].gr[gr]),&header_info[ii]); for(ch=0;ch<stereo;ch++) { ch_global=ch; reorder (lr[ch],re,&(si[ii].ch[ch].gr[gr]),&header_info[ii]); antialias(re, hybridIn, &(si[ii].ch[ch].gr[gr]), &header_info[ii]); 60 for(vga=0;vga<7;vga++){ vga_temp=(vga<<3)+vga; IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp,350gen_wave32(hybridIn[vga][1])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+1,350gen_wave32(hybridIn[vga][3])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+2,350gen_wave32(hybridIn[vga][5])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+3,350gen_wave32(hybridIn[vga][7])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+4,350gen_wave32(hybridIn[vga][9])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+5,350gen_wave32(hybridIn[vga][11])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+6,350gen_wave32(hybridIn[vga][13])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+7,350gen_wave32(hybridIn[vga][15])); IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, vga_temp+8,350gen_wave32(hybridIn[vga][17])); } IOWR_LED_DATA(DE2_VGA_RASTER_INST_BASE, 63,350-gen_wave32(hybridIn[7][7])); unsigned char sb=0; unsigned char ss=0; for (sb=0; sb<SBLIMIT; sb++) { hybrid(hybridIn[sb], hybridOut[sb], sb, ch, &(si[ii].ch[ch].gr[gr]),&header_info[ii]); } //printf("done.\n"); for (ss=0;ss<18;ss++) for (sb=0; sb<SBLIMIT; sb++) if ((ss%2) && (sb%2)) hybridOut[sb][ss] = -hybridOut[sb][ss]; //print_hybrid_output(frameNum,gr,ch,hybridOut);//test; //printf("synthesis start\n"); for (ss=0;ss<18;ss++) { ss_global=ss; 61 for (sb=0; sb<SBLIMIT; sb++) polyPhaseIn[sb] = hybridOut[sb][ss]; SubBandSynthesis (polyPhaseIn, ch,&(pcm_output[frameNum1][gr_global][ch_global][ss_global][0])); } //printf("synthesis done\n"); } //print_pcm_sample(frameNum,gr,pcm_sample);//test; //file_output(pcm_sample,fp,&sample_frames); } printf("%d ",frameNum); } printf("done\n"); while(1) { for(frameNum=0;frameNum<TESTFRAME;frameNum++) {//printf("\nframe%d\n",frameNum); for(gr_global=0;gr_global<2;gr_global++) {//printf("\ngr%d\n",gr_global); for(ch_global=0;ch_global<stereo;ch_global++) {//printf("\nchannel%d\n",ch_global); for (ss_global=0;ss_global<18;ss_global++) {//printf("\nss%d\n",ss_global); for(pcm_cnt_global=0;pcm_cnt_global<SBLIMIT;) { if(!IORD_16DIRECT(0x00681104,0)) { usleep(13); // short monitor; // monitor=pcm_output[frameNum][gr_global][ch_global][ss_global][pcm_cnt_global]; // printf(" %d ",pcm_output[frameNum][gr_global][ch_global][ss_global][pcm_cnt_global]); IOWR_16DIRECT(0x00681104,0,(unsigned short)pcm_output[frameNum][gr_global][ch_global][ss_global][pcm_cnt_global]); pcm_cnt_global+=2; 62 } } } } } } } //----------------------test information print out---------------------------; /* printf("Frame_stat is %d\n",frame_stat);printf("bad_block_count is %d\n",bad_block_count); printf("big_value_0_count is %d\n",big_value_0_count); printf("big_value_1_count is %d\n",big_value_1_count); printf("block_type_0_count is %d\n",block_type_0_count);*/ //printf("index taken by next circulation is %d\n",index); //printf("ptr in main_data_bs structure, bit_idx is %d, byte_idx(offset) is %d.\n", main_data_bs.bit_idx, (unsigned long int)(main_data_bs.byte_idx_ptrdata_header));printf("\n");} //byte_idx tells you the location of maindata in forms of point of data_header offset from the starting /*printf("ht[33] info :---------------\n"); { printf("table name is %s" ,ht[33].tablename); printf("xlen is:%d ",ht[33].xlen); printf("ylen is:%d ",ht[33].ylen); printf("lintbis is:%d ",ht[33].linbits); printf("treelen is:%d ",ht[33].treelen); printf("the first 2 values are:0x%x 0x%x ",ht[33].val[0][0],ht[33].val[0][1]); printf("the second 2 values are:0x%x 0x%x ",ht[33].val[1][0],ht[33].val[1][1]); printf("the third \n",ht[33].val[2][0],ht[33].val[2][1]); }*/ } 2 values are:0x%x 0x%x