5. KOMBINÁCIÓS HÁLÓZATOK LEÍRÁSÁNAK SZABÁLYAI
1
Kombinációs hálózatok leírását végezhetjük mind adatfolyam-, mind viselkedési szinten. Az adatfolyam szintű leírásokhoz az assign kulcsszót használjuk, a viselkedési szintű leírásokhoz viszont az always kulcsszót. Az assign szerkezet általában szemléletesebb és tömörebb, ezért használata javasolt. Másrészt, mivel egyes nyelvi elemek (pl. if…else, case) csak always blokkon belül használhatók, gyakran a viselkedési szintű leírás mellett döntünk. 2
5.1. KOMBINÁCIÓS HÁLÓZATOK ADATFOLYAM SZINTŰ LEÍRÁSA A Verilog nyelv húsznál is több aritmetikai/logikai műveletet ismer (lásd az alábbi táblázatban). Ezek alkalmazásával az MSI eszközök szintjének megfelelő funkcionális egységeket lehet definiálni, majd szintetizálni. Ilyen egységek az összeadók, szorzók, aritmetikai komparátorok 3
A Verilog aritmetikai logikai műveletei
4
Az assign-nal történő leírása alapján a logikai kapcsolás szintézisét végző szoftver (szintézer) rendszerint kombinációs hálózatot alakít. Kivételnek számítanak bizonyos latch leírások (7.1). Egy nyolcbites összeadót leírhatunk a következőképp (az összeadó két bemeneti adat hordozóját már deklaráltnak tekintjük): wire [7:0] sum; assign sum = op_0 + op_1; 5
ARITMETIKAI MŰVELETEK A Verilog hat aritmetikai műveletet ismer: összeadás (+), kivonás (-), szorzás (*), osztás (/), modulo osztás (%) és hatványozás (**). Az összeadáshoz és a kivonáshoz a szintézer az FPGA logikai blokkjaiban kialakítja az összeadó vagy a kivonó áramkört. A szorzás bonyolult hardvert kíván, erre célszerű az FPGA-ban kialakított hardveres szorzókat alkalmazni. A szintézer automatikusan alkalmazza a meglevő szorzókat. 6
Az osztást és a hatványozást általában nem ismerik a szintézerek, így szintézisre szánt nyelvi konstrukciókban nem használhatók (szimulációkban igen). Ha ténylegesen ezekre a műveletekre van szükségünk, azokat le kell bontanunk egyszerűbb műveletekre. Az osztás többszöri kivonás és eltolás segítségével végezhető el, míg a hatványozás ismételt szorzásokkal helyettesíthető. 7
ELTOLÁSI MŰVELETEK Négy eltolási műveletet ismer a Verilog: logikai jobbra és balra tolás (>>, <<), valamint az aritmetikai jobbra és balra tolás (>>>, <<<). A logikai eltolásnál a kiüresedő helyekre nullák töltődnek be. Az aritmetikai balra tolásnál a legnagyobb helyi értékű bit (MSB) kerül a megüresedő helyekre, jobbra tolásnál pedig nullák íródnak a megüresedő nagyobb helyi értékű bitekre, ezzel támogatva a kettes komplemens formában tárolt számokkal végzett műveleteket. 8
VISZONYÍTÓ MŰVELETEK Négy viszonyító műveletet ismer a Verilog: kisebb (<), nagyobb (>), kisebb vagy egyenlő (<=), nagyobb vagy egyenlő (>=). Ezek a műveletek két számértéket hasonlítanak össze és létrehozzák az egybites eredményt. Az egyenlőségi műveletek a következők: egyenlő (==), nem egyenlő (!=), case egyenlő (===), case nem egyenlő (!==). A case típusú műveletek nem szintetizálhatók. A többi művelet szintetizálható megfelelő digitális komparátorokkal. 9
BITENKÉNTI MŰVELETEK Négy bitenkénti alapműveletet ismer a Verilog: ÉS (&), VAGY (|), KIZÁRÓ VAGY (^), NEM (~). A ~^ vagy a ^~ jelkombinációval írható le az ötödik, a KIZÁRÓ NEM VAGY művelet. A NEM művelet egy vektorra vonatkozik, a többinek két vektor jellegű operandusa van és azonos hosszúságú vektor az eredmény.
10
A művelet a bemeneti adathordozók megfelelő bitjei között (ill. megfelelő bitjein) végződnek el, az eredmény a kimeneti adathordozó megfelelő bitjébe kerül. Például, ha a, b és c négybites adathordozók, az assign c = a | b leírás egyenértékű a következő leírással:
11
assign c[3] = a[3] | b[3]; assign c[2] = a[2] | b[2]; assign c[1] = a[1] | b[1]; assign c[0] = a[0] | b[0]; A szintézer az operandusok hosszával megegyező számú logikai kapu alkalmazásával oldja meg a bitenkénti műveletek implementációját.
12
REDUKÁLÓ MŰVELETEK A &, | és ^ műveleti jelek vonatkozhatnak egy adathordozóra is. A kijelölt műveletet itt az adathordozó egyes bitjeire kell alkalmazni. Például, az alábbi leírás: assign y = |a; egyenértékű a következő leírással: assign y = a[3] |a[2]|a[1] |a[0]. A redukáló művelet több bemenetű logikai kapuval oldható meg. 13
LOGIKAI MŰVELETEK A logikai műveleteknél az egyes bemeneti adathordozókat logikai értékeknek tekintjük, függetlenül attól, hogy egy bitről vagy több bitről van-e szó. A logikai érték nulla, ha minden bit nulla vagy egyes, ha legalább egy bit nullától különböző. Három logikai művelet van definiálva a Verilogban: logikai ÉS (&&), logikai VAGY (||) és logikai NEM (!). A szintézerek támogatják ezeket a műveleteket. 14
ÖSSZEKAPCSOLÁSI ÉS A TÖBBSZÖRÖZÉSI MŰVELETEK Az összekapcsolási művelettel vektor típusú adathordozók részeiből vagy rövid vektorokból állítunk össze egy hosszabb vektort. Ez a művelet nem kíván semmilyen logikai hálózatot, csak megfelelő vezetékezésre van szükség a bemeneti és a kimeneti adathordozók egyes bitjei között. A szintézerek támogatják ezeket a műveleteket. 15
Néhány alap-alkalmazást látunk a következő modul részletben:
16
FELTÉTELES MŰVELET Az adatfolyam szintű leírásokban csak ez a művelet kínál választási lehetőséget: az előírt jelfeldolgozást feltételhez tudjuk kötni. A szintézerek az ilyen leírásokból multiplexereket vagy háromállapotú illesztőket szintetizálnak. A szintaxis a következő: [adathordozó neve] = [logikai kifejezés] ? [igaz értékre végzett művelet] : [hamis értékre végzett művelet] 17
Az alábbi kifejezést szintetizálva olyan kapcsolást kapunk, amely két bemeneti számérték közül a nagyobbikat továbbítja a kimenetre: assign max =(a>b) ? a : b;
18
PÉLDA AZ ADATFOLYAM SZINTŰ LEÍRÁSRA A berendezések FPGA alapú tervezésénél is gyakran hagyományos kombinációs funkcionális blokkokban gondolkodunk. A funkcionális egységek különböző műveletek alkalmazásával írhatók le. A továbbiakban erre látható egy példa. A 8/3-as kódoló adatfolyam szintű leírása lehet a következő: 19
Természetesen ez a leírás téves kódot ad, ha egyszerre egynél több bemenet aktív, ahogyan a közönséges kódolónál jellemző. 20
5.2. KOMBINÁCIÓS HÁLÓZATOK VISELKEDÉSI SZINTŰ LEÍRÁSA Az always eljárás akkor vezet kombinációs hálózat szintéziséhez, ha az érzékenységi listában szerepel az eljárás minden bemeneti adathordozója. Ez azt jelenti, hogy bármilyen bemeneti változás történik, mindig újra ki kell értékelni a kimeneteket, ami tulajdonképpen kombinációs logikának felel meg. Ezzel ellentétben, a szinkron sorrendi hálózatok csak az órajel változásakor reagálnak. 21
Az érzékenységi listában tételesen felsorolhatjuk az egyes bemeneti adathordozókat, mint például az alábbi esetben: reg [7:0] sum; always @ (op_0, op_1) sum <= op_0 + op_1; Fontos megjegyezni, hogy, tekintettel az always eljárásra, a hozzárendelés bal oldalán szereplő adathordozót regiszter típusúra kell deklarálni, de a szintézer belátja, hogy nincs szükség regiszterre. 22