Implementace algoritmu do FPGA

Vypracoval Petr Sedlář

 

Obsah:

 

Implementovaný algoritmus je popsán funkcí b.c viz. níže:

/************************** b.c ************************/
/* funkce k optimalizaci */

/* short int obs[13];
short int s[13];
short int r[13]; */

int b( short int *obs, short int *s, short int *r, ){
int sum = 0; /* soucet */
int c; /* index */
int d;
for(c=0;c<13;c++){
d = obs[ c ] - s[ c ];
d = (d * r[ c ]) >> 10;
sum += (d * d) >> 11;
}
return sum;
}

/*******************************************************/

Tento algoritmus je součástí rozpoznávání řeči. Přestože je do hardwaru implementována pouze tato část celého programu dojde ke značné úspoře času CPU. Je to dáno tím, že právě tento dílčí výpočet je časově nejnáročnější.
zpět na začátek..


Popis navrženého obvodu:

Vstupní signály: clock, rst_n, data_req, obs[15:0], s[15:0], r[15:0]

clock
Hodinový signál, který je distribuován do všech sekvenčních obvodů na čipu.

rst_n
Signál reset je aktivní v nule a slouží k uvedení vnitřní logiky do počátečního stavu.

data_req
Data_req je externí signál, který potvrzuje, že vstupní data (obs, s, r) jsou správná a mohou být načtena do FPGA.

obs[15:0], s[15:0], r[15:0]
Vstupní hodnoty typu signed.

Výstupní signály: data_ack, sum[15:0], en_out, wrong_sum

data_ack
Tento signál (pokud je v logické 1) potvrzuje externímu zařízení (nejspíše CPU), že vstupní data byly úspěšně zapsána do interních registrů.

sum[15:0]
Výstupní hodnota vnitřní aritmetiky. Potvrzení správnosti obsahu tohoto registru je pomocí signálu en_out. Typu unsigned.

en_out
Signál en_out potvrzuje, že obsah registru sum[15:0] obsahuje výslednout hodnotu jednoho výpočetního cyklu. Externí zařízení reaguje na tento signál, který je aktivní v logické 0, přečtením portu sum[15:0].

wrong_sum
Signál je aktivní v logické 1. Wrong_sum je generován obvodem, pokud je signál rst_n aktivován a čítač obvodu má jinou hodnotu než 13. Tento signál hlídá, jestli byl vnitřní cykl (viz. funkce b.c) vykonán 13 krát, jak je požadováno. Předpokládá se při tom, že rst_n je při správné činnosti aktivován, kromě začátku běhu programu, vždy poté, co byla vypočtena správná výstupní hodnota (sum) a přečtena externím zařízením.

Vnitřní architektura designu

Návrh se skládá z jednotlivých modulů, které provádějí dílčí úkoly jako je sčítání, odčítání, násobení a čítání. Tyto moduly jsou propojeny navzájem a spolu s ostatní logikou (řídící logika, vstupní a výstupní registry) v "horním" modulu top_b. Popis jednotlivých modulů je uveden níže:

subtracter1

Provádí odčítání dvou 16 bitových registrů. Výstupem je absolutní hodnota rozdílu vstupů.

multiplier1 a multiplier2

Obě tyto násobičky počítají s unsigned aritmetikou, všechna vstupní data jsou kladná.

adder1

Výstupem sčítačky je součet vstupních hodnot, pokud je aktivní signál add_en. Pokud není tento enable aktivní, je výstupem předešlá výstupní hodnota. Signál add_en je generován obvodem 2 hodinové cykly poté, co jsou přečtena nová data na vstupu do obvodu.

counter_b

Podobně jako adder1, čítá tento čítač pouze pokud je aktivní signál add_en.

zpět na začátek..


Přehled výsledků implementace do FPGA (Spartan2)

Velikost návrhu je mírně vetší než 8000 ekvivalentních hradel. Design je tedy možno namapovat do FPGA x2cs30 z rodiny Spartan2. Využití logiky cílového FPGA a výstup z STA(Static Timing Analysis) je uveden níže. Je vidět, že obvod může pracovat na frekvenci 49.544 MHz.

Map report a Post-Place & Route Static Timing report:

Design Information
------------------
Command Line : map -p xc2s30-cs144-6 -cm area -k 4 -c 100 -tx off top_b.ngd
Target Device : x2s30
Target Package : cs144
Target Speed : -6
Mapper Version : spartan2 -- $Revision: 1.58 $
Mapped Date : Fri May 03 16:41:03 2002

Design Summary
--------------
Number of errors: 0
Number of warnings: 1
Number of Slices: 335 out of 432 77%
Number of Slices containing
unrelated logic: 0 out of 335 0%
Number of Slice Flip Flops: 137 out of 864 15%
Total Number 4 input LUTs: 578 out of 864 66%
Number used as LUTs: 560
Number used as a route-thru: 18
Number of bonded IOBs: 69 out of 92 75%
IOB Flip Flops: 3
Number of GCLKs: 1 out of 4 25%
Number of GCLKIOBs: 1 out of 4 25%
Total equivalent gate count for design: 8,115
Additional JTAG gate count for IOBs: 3,360


Timing summary:
---------------

Timing errors: 0 Score: 0

Constraints cover 5524247 paths, 927 nets, and 2123 connections (100.0% coverage)

Design statistics:
Minimum period: 20.184ns (Maximum frequency: 49.544MHz)
Maximum net delay: 3.878ns

Výsledky simulací:

Správnost návrhu byla testována simulátorem (ModelSim). Zde jsou pro porovnání uvedeny výstupy simulcí navrženého verilogovského souboru a modelu post-place & route, který byl vygenerován. Jak je vidět, funkčnost obou je správná.

Zdrojové kódy jsou zde.

Testování navrženého modelu pomocí ModelSim:

Simulace Post-Place & Route modelu:

zpět na začátek..

Popis použitého softwaru:

Byl používán free software od firmy Xilinx. Tento software může být stažen z www.xilinx.com/sxpresso/webpack.htm. Package WebPack obsahuje velké množství softwaru: kompilátory HDL, simulátory, software na STA(static timing analysis), na syntézu a programování FPGAs a CPLDs.

 

WebPack Project Navigator

WebPack Project Navigator, GUI pro WebPack software, umožňuje vytváření a editaci souborů, jejich kompilaci, syntézu gate level modelu a implementaci do zvoleného FPGA nebo CPLD. Project Navigator umožňuje také generaci Post-Translate, Post-Map a Post-Place&Route simulačních modelů, dále umožňuje STA, tvorbu programovacího souboru. Z Project Navigator je možno také spouštět simulátor (ModelSim) a nástroj na programování obvodů (Impact), které je možno spouštět i samostatně. Veškeré aplikace je možno spouštět i z příkazové řádky.

Snapshot z Project Navigator:

 

ModelSim

Simulátor HDL souborů. Je možné listovat strukturou, sledovat průběhy všech signálů v designu, debugovat zdrojový kód,...

Snapshot:

 

Podporované obvody:


WebPACK podporuje implementaci designů pro následující rodiny Xilinx:

  • XC9500 (5V CPLDs)

  • XC9500XL (3.3V CPLDs)

  • XC9500XV (2.5V CPLDs)

  • XCR3000XL (CoolRunner XPLA3 3.3V zero-standby CPLDs)

  • XC2C00 (CoolRunner-II 1.8V zero-standby CPLDs)

  • XC2S00 (Spartan-II FPGAs)

  • XC2S00E (Spartan-IIE FPGAs)

  • XCV00E (Virtex-E FPGAs up to XCV300E)

  • XC2V00 (Virtex-II FPGAs up to XC2V250)

 

zpět na začátek..

Zdrojový kód lze nalézt zde.