ÓÄÊ 681.3 ÁÁÊ 32.973.26-018.2 Ï 54 Ï 54 Ïîëÿêîâ À. Ê. ßçûêè VHDL è VERILOG â ïðîåêòèðîâàíèè öèôðîâîé àïïàðàòóðû. — Ì.: ÑÎËÎÍ-Ïðåññ, 2010. — 320 ñ.: èë. — (Ñåðèÿ «Ñèñòåìû ïðîåêòèðîâàíèÿ»). ISBN 5-98003-016-6 Êíèãà ïîñâÿùåíà ïðîåêòèðîâàíèþ öèôðîâûõ ñèñòåì ñ ïîìîùüþ âûñîêîóðîâíåâûõ ÿçûêîâ îïèñàíèÿ àïïàðàòóðû (Hardware Description Language — HDL) — Verilog è VHDL. Ýòè ÿçûêè ÿâëÿþòñÿ ìåæäóíàðîäíûì ñòàíäàðòîì è èñïîëüçóþòñÿ êàê ñèñòåìàìè àíàëèçà (ìîäåëèðîâàíèå), òàê è ñèñòåìàìè ñèíòåçà öèôðîâîé àïïàðàòóðû. Ñ åäèíûõ ïîçèöèé èçëîæåíû îñíîâíûå êîíöåïöèè ýòèõ ÿçûêîâ. Äàíû ðåêîìåíäàöèè ïî ñòèëþ êîäèðîâàíèÿ, ñèíòåçàáåëüíîñòè è âåðèôèêàöèè HDL-îïèñàíèé ïðîåêòèðóåìûõ ñèñòåì. Ïðèâåäåíû ïðèìåðû ñèíòåçàáåëüíûõ îïèñàíèé óçëîâ è óñòðîéñòâ è îðãàíèçàöèè ôóíêöèîíàëüíûõ òåñòîâ.  ïðèëîæåíèå âûíåñåíû ñïðàâî÷íûå äàííûå ïî ÿçûêàì VHDL è VERILOG. Àâòîð ïðåäïîëàãàåò, ÷òî ÷èòàòåëü çíàêîì ñ îñíîâàìè ïðîãðàììèðîâàíèÿ è îñíîâàìè ïðîåêòèðîâàíèÿ öèôðîâûõ óñòðîéñòâ. ISBN 5-98003-016-6 © Ìàêåò è îáëîæêà «ÑÎËÎÍ-Ïðåññ», 2010 © À. Ê. Ïîëÿêîâ, 2010 Ñîäåðæàíèå Ïðåäèñëîâèå. ßçûêè VHDL è VERILOG . . . . . . . . . . . . . . . . 3 Ââåäåíèå. HDL — èñòîðè÷åñêèé ýêñêóðñ è ïåðñïåêòèâû . . . . . . . . 6 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è âçãëÿä ïðîãðàììèñòà . . . . . 15 1.1. HDL — âçãëÿä ðàçðàáîò÷èêà àïïàðàòóðû . . . . . 1.1.1. Îòîáðàæàåìûå àñïåêòû . . . . . . . . . . 1.1.2. Èíòåðôåéñ îáúåêòà ïðîåêòà . . . . . . . . 1.1.3. Îïèñàíèå ñòðóêòóðû îáúåêòà ïðîåêòà . . . 1.1.4. Ñâÿçü èìåí êîìïîíåíòîâ è îáúåêòà ïðîåêòà . 1.1.5. Ïîâåäåíèå îáúåêòà ïðîåêòà . . . . . . . . 1.1.6. Paçíîîáðàçèå ñòèëåé îïèñàíèé àðõèòåêòóð . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 17 19 20 21 1.2. HDL — âçãëÿä ïðîãðàììèñòà. . . . . 1.2.1. Ëåêñè÷åñêèå ýëåìåíòû HDL . . 1.2.2. Äàííûå (îáúåêòû): òèïû è âèäû 1.2.3. Îïåðàöèè è âûðàæåíèÿ . . . . 1.2.4. Îïåðàòîðû . . . . . . . . . . 1.2.5. Ìåõàíèçì ðàñøèðåíèÿ ÿçûêà . 1.2.6. Îáëàñòü âèäèìîñòè äàííûõ . . 1.2.7. Ìîäóëè è áèáëèîòåêè ïðîåêòà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 25 28 31 34 39 40 42 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ãëàâà 2. Áàçîâûå ïîíÿòèÿ HDL — ïðîöåññû, çàäåðæêè, àëôàâèò . . . 44 2.1. Ïàðàëëåëüíûå ïðîöåññû . . . . . . . . . . . . . . . 2.1.1. Ïàðàëëåëüíûå îïåðàòîðû HDL . . . . . . . . . 2.1.2. Îïåðàòîð ïðîöåññà . . . . . . . . . . . . . . 2.1.3. Êðàòêèå ôîðìû çàïèñè ïðîöåññîâ . . . . . . . 2.1.4. Ïðèñâàèâàíèå ñ äåëüòà-çàäåðæêîé . . . . . . . 2.1.5. Ìåõàíèçì âîñïðîèçâåäåíèÿ ìîäåëüíîãî âðåìåíè Âîïðîñû è óïðàæíåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 44 45 49 50 51 53 2.2. Çàäåðæêè ñèãíàëîâ . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.2.1. Èíåðöèîííàÿ è òðàíñïîðòíàÿ çàäåðæêà . . . . . . . . . . . . . 53 2.2.2. Ðåçåêöèÿ è íåîïðåäåëåííîñòü êîðîòêèõ ñèãíàëîâ . . . . . . . . 56 2.3. Âåêòîðíûå îïåðàöèè è êîìïàêòíîñòü îïèñàíèé ñèñòåì . . . . . . . . . 57 2.3.1. Âåêòîðû . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 2.3.2. Îïåðàòîð ãåíåðàöèè . . . . . . . . . . . . . . . . . . . . . 58 2.4. Àëôàâèò ìîäåëèðîâàíèÿ. . . . . . . 2.4.1. ×åòûðåõçíà÷íûé àëôàâèò . . . 2.4.2. Äåâÿòèçíà÷íûé àëôàâèò VHDL 2.4.3. X-ïåññèìèçì è îïòèìèçì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 60 61 63 308 Ñîäåðæàíèå 2.5. Îïèñàíèå ìîíòàæíûõ È (ÈËÈ) è îáùåé øèíû . . . . . . . . . . . . . 64 2.5.1. Îáùàÿ øèíà . . . . . . . . . . . . . . . . . . . . . . . . . 64 2.5.2. Ìîíòàæíîå È, ÈËÈ . . . . . . . . . . . . . . . . . . . . . 65 2.6. Àòðèáóòû îáúåêòîâ è êîíòðîëü çàïðåùåííûõ ñèòóàöèé . . . . . . . . . 66 2.6.1. Êîíòðîëü çàïðåùåííûõ ñèòóàöèé. . . . . . . . . . . . . . . . 66 2.6.2. Àòðèáóòû VHDL-ñèãíàëîâ . . . . . . . . . . . . . . . . . . . 66 Ãëàâà 3. Ñïîñîáû HDL-îïèñàíèé ïðîñòûõ óçëîâ . . . . . . . . . . . 69 3.1. Êîìáèíàöèîííàÿ ñõåìà F . . . . . . . . . . . . . 3.1.1. Îïèñàíèå èíòåðôåéñà . . . . . . . . . . . . 3.1.2. Ïðîöåññíàÿ ôîðìà îïèñàíèÿ ïîâåäåíèÿ . . . . 3.1.3. Ïîòîêîâîå îïèñàíèå ïîâåäåíèÿ . . . . . . . 3.1.4. Ñòðóêòóðíîå îïèñàíèå . . . . . . . . . . . 3.1.5. Îáúÿâëåíèå êîíôèãóðàöèè . . . . . . . . . 3.1.6. Êîíòðîëü âðåìåííûõ ñîîòíîøåíèé . . . . . . 3.1.7. VERILOG-îïèñàíèå, èñïîëüçóþùåå ïðèìèòèâû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 69 70 71 74 75 76 77 3.2. Ñõåìû ñ ïàìÿòüþ . . . . . . . . . . . . . . . . 3.2.1. D-òðèããåð . . . . . . . . . . . . . . . . 3.2.2. D-òðèããåð ñî ñáðîñîì . . . . . . . . . . . 3.3.3. Ñõåìà D-òðèããåðà íà âåíòèëÿõ ÈÍÅ . . . . 3.2.4. D-òðèããåð êàê ïðèìèòèâ VERILOG . . . . . 3.2.5. Ìîäåëü RS-òðèããåðà-çàùåëêè . . . . . . . 3.2.6. Ìîäåëü Ò-òðèããåðà . . . . . . . . . . . . 3.2.7. VHDL — îïåðàòîð áëîêà â ìîäåëè òðèããåðà òèïà «çàùåëêà» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 78 79 79 80 80 81 . . . . . . . . . . . . . . . . . 84 3.3. Ìîäåëü áëîêà cèíõðîííîé ïàìÿòè . . . . . . . . . . . . . . . . . . 84 3.3.1. VHDL-ìîäåëü. . . . . . . . . . . . . . . . . . . . . . . . . 84 3.3.2. VERILOG-ìîäåëü . . . . . . . . . . . . . . . . . . . . . . . 85 3.3.3. VERILOG — ìîäåëü ïàìÿòè c ó÷åòîì çàäåðæåê è êîíòðîëåì âðåìåíûõ ïàðàìåòðîâ ñèãíàëîâ â áëîêå specify . . . . . . . . . . . . . . . 86 3.3.4. VHDL — ìîäåëü ïàìÿòè ñ îáùèì ðåãèñòðîì âõîäíûõ-âûõîäíûõ äàíûõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Ãëàâà 4. Ôóíêöèîíàëüíàÿ âåðèôèêàöèÿ HDL-îïèñàíèé . . . . . . . . 88 4.1. Ïðèìåð âåðèôèêàöèè îïèñàíèÿ ïðîñòîãî îáúåêòà ïðîåêòà F . . . . . . . 89 4.2. Ñòðàòåãèÿ ôóíêöèîíàëüíîé âåðèôèêàöèè . . . . . . . . . . . . . . . 93 4.2.1. Òèïû òåñòîâ . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.2.2. Ïîëíîòà òåñòà . . . . . . . . . . . . . . . . . . . . . . . . 93 4.3. Îöåíêà ïîëíîòû ôóíêöèîíàëüíûõ òåñòîâ 4.3.1. Ýâðèñòè÷åñêèå ìåòðèêè . . . . . 4.3.2. Ïðîãðàììíûå ìåòðèêè . . . . . 4.3.3. Àâòîìàòíî-ìåòðè÷åñêèé ïîäõîä . 4.3.4. Ìîäåëèðîâàíèå íåèñïðàâíîñòåé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 93 94 95 95 Ñîäåðæàíèå 309 4.3.5. Ìîíèòîðèíã ñîáûòèé è ïðîâåðêà êîíòðîëüíûõ ñîîòíîøåíèé â ìîäåëè . . . . . . . . . . . . . . . . . . . . . . . 96 4.4. Êîìïîíåíòû òåñòèðóþùåé ïðîãðàììû . . . 4.4.1. Òàêòîâûé ãåíåðàòîð . . . . . . . . . 4.4.2. Ãåíåðàòîð ñèãíàëà ñáðîñà . . . . . . 4.4.3. Âõîäíûå âåêòîðû . . . . . . . . . . 4.4.4. Cðàâíåíèå âûõîäîâ ìîäåëè ñ ýòàëîíîì . . . . . . . . . . . . . . . . . . . . . . . . (VERILOG) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 98 98 98 99 4.5. Áûñòðîäåéñòâèå è ðàñõîä ïàìÿòè èíñòðóìåíòàëüíîé ÝÂÌ . . . . . . . 100 4.5.1. Ðàñõîä ïàìÿòè. . . . . . . . . . . . . . . . . . . . . . . . 100 4.5.2. Áûñòðîäåéñòâèå òåñòèðóþùåé ïðîãðàììû . . . . . . . . . . . 100 4.6. Îòëàäêà òåñòèðóþùåé ïðîãðàììû . . . . . . . . . . . . . . . . . . 102 4.6.1. Ïîðÿäîê îòëàäêè . . . . . . . . . . . . . . . . . . . . . . 102 4.6.2. Îáùèå ðåêîìåíäàöèè . . . . . . . . . . . . . . . . . . . . 104 4.7. Àâòîìàòèçàöèÿ ïîñòðîåíèÿ òåñòèðóþùèõ ïðîãðàìì . . . . . . . . . . 104 4.8. Còðóêòóðèðîâàííûé òåñò îáúåêòà ïðîåêòà F . . . . 4.8.1. Ãåíåðàòîð ñèãíàëîâ GEN . . . . . . . . . . 4.8.2. Ðåãèñòðàòîð ñèãíàëîâ WRITER . . . . . . . 4.8.3. Àðõèòåêòóðà òåñòà — ñòðóêòóðíîå îïèñàíèå . 4.9. Ìîäåëüíûé ýêñïåðèìåíò c ñàìîïðîâåðêîé . . 4.9.1. VHDL-âàðèàíò. . . . . . . . . . . . 4.9.2. VERILOG-âàðèàíò . . . . . . . . . . 4.9.3. Ìîäåëüíûé ýêñïåðèìåíò ñî ñðàâíåíèåì äâóõ ìîäåëåé F . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 106 107 108 . . . . . . . . . . . . 110 . . . . . . . . . . . . 110 . . . . . . . . . . . . 111 . . . . . . . . . . . . 112 4.10. VHDL-ìîäåëü è ïðîñòîé òåñò ìèêðîñõåìû ïàìÿòè . . 4.10.1. Ìèêðîñõåìà Ê134ÐÓ6. . . . . . . . . . . . 4.10.2. Îïèñàíèå èíòåðôåéñà ìèêðîñõåìû . . . . . . 4.10.3. Àðõèòåêòóðà îáúåêòà SK134RU6 . . . . . . . 4.10.4. Ìîäåëüíûé ýêñïåðèìåíò ñ ìèêðîñõåìîé ÎÇÓ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 113 114 115 116 Ãëàâà 5. Cèíòåçàáåëüíîñòü HDL-îïèñàíèé . . . . . . . . . . . . . . 119 5.1. Îáùèå ïðèíöèïû ïîñòðîåíèÿ ñèíòåçàáåëüíûõ îïèñàíèé . 5.1.1. Ïîâòîðíîïðèãîäíîñòü ïðîåêòîâ . . . . . . . . . 5.1.2. Òâåðäûå è ìÿãêèå ìàêðîñû . . . . . . . . . . . 5.1.3. ×òî òàêîå «õîðîøèé ïðîåêò ìàêðîñà» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 123 124 124 5.2. Ðåêîìåíäàöèè ïî ñòèëþ êîäèðîâàíèÿ HDL-îïèñàíèé . . . 5.2.1. Ðåêîìåíäàöèè îáùåãî ïëàíà . . . . . . . . . . . 5.2.2. Ðåêîìåíäóåìàÿ ñòðóêòóðà è ïðèìåðû èìåí ñèãíàëîâ 5.2.3. Îðãàíèçàöèÿ áàçû äàííûõ ïðîåêòà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 125 126 127 5.3. ×òî òàêîå «õîðîøèå» ìîäóëè-ìàêðîñû . . . . . . . . . . . . . . . . 128 5.3.1. Oáùèå ðåêîìåíäàöèè . . . . . . . . . . . . . . . . . . . . 128 5.3.2. Äîïîëíèòåëüíûå çàìå÷àíèÿ. . . . . . . . . . . . . . . . . . 130 310 Ñîäåðæàíèå 5.4. RTL-îïèñàíèå . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.5. Ñèíòåçàáåëüíîå ïîäìíîæåñòâî HDL . . . . . . . 5.5.1. Îñíîâíûå ñèíòåçàáåëüíûå êîíñòðóêöèè . . 5.5.2. Ñèíòåçàáåëüíûå áèáëèîòåêè òèïîâûõ óçëîâ 5.5.3. Ñèíòåçàáåëüíûå îáðàçû óçëîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 133 135 136 5.6. Ñèíòåçàáåëüíûå îïèñàíèÿ êîìáèíàöèîííûõ óçëîâ . . . . . 5.6.1. Ìóëüòèïëåêñîðû . . . . . . . . . . . . . . . . . 5.6.2. Äåøèôðàòîðû (äåìóëüòèïëåêñîðû) . . . . . . . . . 5.6.3. Òðèñòàáèëüíûé áóôåð-êëþ÷. . . . . . . . . . . . . 5.6.4. n-ðàçðÿäíûé êîìïàðàòîð . . . . . . . . . . . . . . 5.6.5. Òèïè÷íûå îøèáêè â îïèñàíèè êîìáèíàöèîííûõ óçëîâ 5.6.6. Ðåçóëüòàòû ñèíòåçà îäíîðàçðÿäíîãî ñóììàòîðà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 137 140 142 142 143 146 5.7. Òðèããåðû è ðåãèñòðû . . . . . . . . . . . . . Îáùàÿ ñòðóêòóðà îïèñàíèé . . . . . . . . . 5.7.1. D-òðèããåð-àñèíõðîííûé ñáðîñ-óñòàíîâêà . 5.7.2. Òðèããåð-ñèíõðîííûé ñáðîñ è óñòàíîâêà . 5.7.3. Ðåãèñòðû ñ ðàçðåøàþùèì âõîäîì . . . . 5.7.4. Çàùåëêè . . . . . . . . . . . . . . . 5.7.5. Ñäâèãàòåëè . . . . . . . . . . . . . . 5.7.6. C÷åò÷èêè . . . . . . . . . . . . . . . 5.7.7. Ðåãèñòðîâûå ôàéëû è áëîêè ïàìÿòè . . . 5.7.8. Òèïè÷íûå îøèáêè â îïèñàíèÿõ òðèããåðîâ 5.7.9. Ïðèìåð ñèíòåçà c÷åò÷èêà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 151 153 153 154 155 155 155 156 157 158 5.8. HDL-îïèñàíèÿ àâòîìàòîâ . . . . . . . . . . . . . . . . . . . . . 5.8.1. Àâòîìàòû Ìèëè è Ìóðà . . . . . . . . . . . . . . . . . . 5.8.2. VERILOG — îïèñàíèå è òåñò àâòîìàòà óïðàâëåíèÿ ñâåòîôîðîì 5.8.3. VHDL-îïèñàíèå è òåñò àâòîìàòà óïðàâëåíèÿ ñâåòîôîðîì . . . 5.8.4. Ñèíòåç VERILOG-îïèñàíèÿ àâòîìàòà óïðàâëåíèÿ ñâåòîôîðîì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 162 162 164 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . è ðåãèñòðîâ . . . . . . . 166 Ãëàâà 6. Ðåàëèçàöèÿ øèôðîàëãîðèòìà RC4 íà ÏËÈÑ. . . . . . . . . 174 6.1. Øèôðîàëãîðèòì RC4. . . . . . . . . . . . . . . . . . . . . . . . 174 6.2. HDL-ñïåöèôèêàöèÿ àëãîðèòìà RC4 . . . . . . . . . . . . . . . . . 176 6.2.1. Verilog . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 6.2.2. VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 6.3. ÏËÈÑ ñåìåéñòâà Virtex . . . . . . . . . . . . . . . . . . . . . . 181 6.3.1. Âîçìîæíîñòè . . . . . . . . . . . . . . . . . . . . . . . . 181 6.3.2. Àðõèòåêòóðà ñåìåéñòâà Virtex . . . . . . . . . . . . . . . . 182 6.4. VHDL-âàðèàíò ðåàëèçàöèè àâòîìàòà RC4. . . . . . . . . . . . . . . 186 6.4.1. Áëîê ïàìÿòè . . . . . . . . . . . . . . . . . . . . . . . . 186 6.4.2. Ðàñïðåäåëåíèå ìèêðîîïåðàöèé àëãîðèòìà ïî òàêòàì. . . . . . . . . . . . . . . . . . . . . . . . 187 Ñîäåðæàíèå 6.4.3. 6.4.4. 6.4.5. 6.4.6. 311 VHDL-oïèñàíèå àâòîìàòà RC4 . . . . . . . . . . . VHDL-òåñò àâòîìàòà RC4. . . . . . . . . . . . . . Ðåçóëüòàòû ñèíòåçà c ïàìÿòüþ íà òðèããåðàõ . . . . . Ðåçóëüòàòû ñèíòåçà c èñïîëüçîâàíèåì áëî÷íîé ïàìÿòè 6.5. VERILOG-îïèñàíèå àâòîìàòà RC4 . 6.5.1. Îïèñàíèå àâòîìàòà . . . . 6.5.2. Òåñò . . . . . . . . . . . 6.5.3. Peçóëüòàòû ñèíòåçà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 193 195 198 . . . . . . . . . . . . . . . . . . . . 200 200 203 204 Ãëàâà 7. Ôóíêöèîíàëüíàÿ ìîäåëü ìèêðîñõåìû äâóõïîðòîâîé ñèíõðîííîé ïàìÿòè . . . . . . . . . . . . . . . . . . . . . . . . . 206 7.1. Cîñòîÿíèå âîïðîñà. . . . . . . . . . . . . . . . . . . . . . . . . 206 7.2. Íåêîòîðûå ñâîéñòâà ìîäåëåé RAM . . . . . . . . . . . . . . . . . 208 7.3. Äâóõïîðòîâàÿ ñèíõðîííàÿ ïàìÿòü . . . . . . . . . . . . . . . . . . 211 7.4. VHDL-ìîäåëü áëîêà ïàìÿòè. . . . . . . . . . . . 7.4.1. Èíòåðôåéñ . . . . . . . . . . . . . . . . 7.4.2. Àðõèòåêòóðà . . . . . . . . . . . . . . . 7.4.3. Ïàêåò ñî çíà÷åíèÿìè âðåìåííûõ ïàðàìåòðîâ . 7.4.4. Ìîäóëü êîíòðîëÿ âðåìåííûõ ïàðàìåòðîâ . . 7.4.5. Ïàêåò ôóíêöèé ïðåîáðàçîâàíèÿ òèïîâ äàííûõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 215 216 223 224 228 7.5. VERILOG-ìîäåëü áëîêà ïàìÿòè . . . 7.5.1. Èíòåðôåéñ ìèêðîñõåìû . . . 7.5.2. Òåëî ìîäóëÿ. . . . . . . . . 7.5.3. Çàäàíèå è êîíòðîëü âðåìåííûõ 7.5.4. Ôóíêöèîíàëüíàÿ ÷àñòü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 232 233 234 235 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 239 241 245 251 . . . . . . . . . . . . . . . . . . ïàðàìåòðîâ . . . . . . 7.6. Òåñòèðóþùàÿ ïðîãðàììà . . . . . . . . . 7.6.1. Ïåðåìåííûå è êîíñòàíòû. . . . . . 7.6.2. Ïðîöåäóðû ÇÀÏÈÑÈ-×ÒÅÍÈß . . . 7.6.3. Ïîäà÷à òåñòîâûõ âåêòîðîâ . . . . . 7.6.4. Âðåìåííûå ïàðàìåòðû ñèãíàëîâ òåñòà . . . . . . . . . . . . . . . Ïðèëîæåíèå 1. Êðàòêèé ñïðàâî÷íèê ïî ÿçûêó VHDL . . . . . . . . . 253 1. Îñíîâû VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 2. Îñíîâíûå ðàçëè÷èÿ âåðñèé VHDL-93 è VHDL-87 . . . . . . . . . . . . 264 3. Cèíòåçàáåëüíîå ïîäìíîæåñòâî ÿçûêà VHDL . . . . . . . . . . . . . . 267 4.Ïðåäîïðåäåëåííîå îêðóæåíèå ÿçûêà VHDL. 4.1. Ïàêåò STANDARD . . . . . . . . 4.2. Ïàêåò TEXTIO . . . . . . . . . . 4.3. Ïðåäîïðåäåëåííûå àòðèáóòû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 268 270 271 5. Ìíîãîçíà÷íàÿ ëîãèêà — IEEE ïàêåòû è ôóíêöèè ïðåîáðàçîâàíèÿ òèïîâ. . 272 1. Ïàêåò IEEE STD_LOGIC_1164 . . . . . . . . . . . . . . . . . . 272 312 Ñîäåðæàíèå 2. 3. 4. 5. Ïàêåò Ïàêåò Ïàêåò Ïàêåò IEEE NUMERIC_STD . . . . IEEE NUMERIC_BIT . . . . Synopsys STD_LOGIC_ARITH STD_LOGIC_UNSIGNED . . . . . . . . . . . . . . . . . . . . . . Ïðèëîæåíèå 2. VERILOG — êðàòêèé ñïðàâî÷íèê 1. Ëåêñè÷åñêèå ýëåìåíòû. . . . . . 1.1. Ñèìâîëû . . . . . . . . . 1.2. Êîììåíòàðèè è àòòðèáóòû . 1.3. Ñèìâîëû îïåðàöèé è ñêîáîê 1.4. Èìåíà . . . . . . . . . . 1.5. Ëîãè÷åñêèå çíà÷åíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 274 275 275 . . . . . . . . . . 276 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 276 276 276 277 279 2. Ëèòåðàëû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 2.1. Öåëûå . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 2.2. Âåùåñòâåííûå (ðåàëüíûå — real) ëèòåðàëû . . . . . . . . . . . 280 3. Òèïû è âèäû äàííûõ . . . . . . . . 3.1. Âèä ïåðåìåííàÿ . . . . . . . 3.2. Âèä ñîåäèíåíèå (öåïü, ñâÿçü). 3.3. Äðóãèå âèäû è òèïû äàííûõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 280 281 281 4. Îáúÿâëåíèå äàííûõ è îáëàñòü âèäèìîñòè . . . . . . . . . . . . . . . 282 4.1. Îáüÿâëåíèå äàííûõ . . . . . . . . . . . . . . . . . . . . . . 282 4.2. Îáëàñòü âèäèìîñòè îáüÿâëåíèé äàííûõ . . . . . . . . . . . . . 283 5. Îïåðàöèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 6. Âûðàæåíèÿ . . . . . . . . . . . . . 6.1. Îáû÷íûå âûðàæåíèÿ . . . . . 6.2. Âûðàæåíèÿ ñ ïîëÿìè âåêòîðîâ è 6.3. Çàäåðæàííûå âûðàæåíèÿ . . . 6.4. Óñëîâíûå âûðàæåíèÿ . . . . . 6.5. Âûäåëåíèå ðàçðÿäîâ è ïîëåé . . 6.6. Âûäåëåíèå ýëåìåíòîâ ìàññèâîâ. . . . . . . . . . . ìàññèâîâ . . . . . . . . . . . . . . . . . . . . 7. Ïîñëåäîâàòåëüíûå îïåðàòîðû (ïðîöåäóðíûå). 7.1. Îïåðàòîð îæèäàíèÿ (çàäåðæêè) . . . 7.2. Îïåðàòîð ïðèñâàèâàíèÿ ïåðåìåííîé . 7.3. Óñëîâíûé îïåðàòîð . . . . . . . . . 7.4. Îïåðàòîð âûáîðà . . . . . . . . . . 7.5. Îïåðàòîð öèêëà . . . . . . . . . . . 7.6. Îïåðàòîð âûõîäà èç ãðóïïû . . . . . 7.7. Ïðèìåðû ïîñëåäîâàòåëüíûõ îïåðàòîðîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 286 286 286 286 286 286 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 287 287 287 287 288 288 288 8. Ïðîöåäóðíûå áëîêè . . . . . . . . . . . . . . . . . . . . . . . . . 289 9. Ãðóïïû îïåðàòîðîâ . . . . . . . . . . . . . . . . . . . . . . . . . 290 10. Ïðîöåäóðû è ôóíêöèè . . . . . . . . . . . . . . . . . . . . . . . 290 Ñîäåðæàíèå 313 10.1. Ïðîöåäóðû task . . . . . . . . . . . . . . . . . . . . . . . 290 10.2. Ôóíêöèè function . . . . . . . . . . . . . . . . . . . . . . 291 11. Ïàðàëëåëüíûå îïåðàòîðû è áëîêè . . . . . . . . . . . . . . . . . . 291 12. Ìîäóëü ïðîåêòà . . . . . . . . . . . . . . . . . . . . . . . . . . 292 12.1. Ñòèëü îïèñàíèÿ VERILOG-95 . . . . . . . . . . . . . . . . . 292 12.2. Còèëü VERILOG-2000 (ANSI-C) . . . . . . . . . . . . . . . . 292 13. Êîíêðåòèçàöèÿ — âûçîâ ýêçåìïëÿðîâ ìîäóëåé . . . . . . . . . . . . 293 13.1. VERILOG-95 . . . . . . . . . . . . . . . . . . . . . . . . . 293 13.2. VERILOG-2000 . . . . . . . . . . . . . . . . . . . . . . . . 293 14. Ñèñòåìíûå îïåðàòîðû è ôóíêöèè . . . . . . . . . . . . . . . . . . 294 14.1. Ôîðìàòèðóåìûé ââîä-âûâîä . . . . . . . . . . . . . . . . . . 294 14.2. Ðàáîòà ñ ôàéëàìè . . . . . . . . . . . . . . . . . . . . . . 295 15. Áëîê ñïåöèôèêàöèé âðåìåííûõ ñîîòíîøåíèé-specify (íåñèíòåçàáåëüíàÿ êîíñòðóêöèÿ) . . . . . . . . . . . 15.1. Îáüÿâëåíèå ñïåöïàðàìåòðîâ. . . . . . . . . 15.2. Ñðåäñòâà ïðîâåðêè âðåìåííûõ ñîîòíîøåíèé . 15.3. Çàäåðæêè ïóòåé ðàñïðîñòðàíåíèÿ ñèãíàëîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 296 296 297 16. Ñèíòåçàáåëüíûå êîíñòðóêöèè . . . . . . . . . . . . . . . . . . . . 298 17. Äèðåêòèâû êîìïèëÿöèè (ïåðå÷èñëåíû òîëüêî îñíîâíûå) . . . . . . . . 299 Èñïîëüçóåìûå ñîêðàùåíèÿ . . . . . . . . . . . . . . . . . . . . . 302 Èíòåðíåò-ðåñóðñû . . . . . . . . . . . . . . . . . . . . . . . . . . 304 Ñïèñîê ëèòåðàòóðû . . . . . . . . . . . . . . . . . . . . . . . . . 305 Ãëàâà 1 HDL — âçãëÿä ñõåìîòåõíèêà è âçãëÿä ïðîãðàììèñòà 1.1. HDL — âçãëÿä ðàçðàáîò÷èêà àïïàðàòóðû 1.1.1. Îòîáðàæàåìûå àñïåêòû  HDL-îïèñàíèè, êàê è â ëþáîé ìîäåëè, îòðàæàþòñÿ òîëüêî íåêîòîðûå àñïåêòû (õàðàêòåðèñòèêè) ðåàëüíîé ñèñòåìû. Öèôðîâóþ àïïàðàòóðó õàðàêòåðèçóþò, íàïðèìåð, òàêèå àñïåêòû, êàê ôóíêöèîíàëüíûé (ðåàëèçóåìàÿ ôóíêöèÿ, àëãîðèòì); âðåìåííîé (çàäåðæêè, ïðîèçâîäèòåëüíîñòü, âðåìÿ îòêëèêà); ñòðóêòóðíûé (òèïû è ñâÿçè êîìïîíåíò); ðåñóðñíûé (÷èñëî âåíòèëåé, ïëîùàäü êðèñòàëëà); íàäåæíîñòíûé (âðåìÿ íàðàáîòêè íà îòêàç); êîíñòðóêòèâíûé (âåñ, ãàáàðèòû); ñòîèìîñòíîé è ò. ä. HDL ñîäåðæèò ñðåäñòâà, ïîçâîëÿþùèå îòîáðàçèòü â îñíîâíîì ïåðâûå òðè àñïåêòà: ôóíêöèîíàëüíûé, âðåìåííîé è ñòðóêòóðíûé (ðèñ. 1.1). Êàê óæå îòìå÷àëîñü, ôóíêöèÿ (ïîâåäåíèå) àïïàðàòóðû ìîæåò äåòàëèçèðîâàòüñÿ îò óðîâíÿ ñèñòåìû êîìàíä è àëãîðèòìîâ óñòðîéñòâ äî áóëåâñêèõ ôóíêöèé; ñòðóêòóðà — îò óðîâíÿ óñòðîéñòâ òèïà ïðîöåññîð — ïàìÿòü äî óðîâíÿ âåíòèëåé è ïåðåêëþ÷àþùèõ ýëåìåíòîâ; âðåìÿ — îò çàäåðæåê ôðîíòîâ ñèãíàëîâ (íàíî — ns è ôåìòîñåêóíäû — fs) äî òàêòîâ è çàäåðæåê ýëåêòðîìåõàíè÷åñêèõ óñòðîéñòâ (ñåêóíäû è ÷àñû). Ñòåïåíü äåòàëèçàöèè àñïåêòîâ, îòîáðàæàåìûõ â îïèñàíèÿõ àïïàðàòóðû, îïðåäåëÿåòñÿ êîíêðåòíûìè çàäà÷àìè. Íàïðèìåð, îïèñàíèå íåêîòîðîé ìèêðîïðîöåññîðíîé ñèñòåìû ìîæåò ñòðîèòüñÿ êàê îïèñàíèå ñòðóêòóðû, ñîñòîÿùåé èç ìèêðîñõåì ÁÈÑ è ÑÈÑ, à îïèñàíèå ñàìèõ ìèêðîñõåì ñòðîèòñÿ êàê ïîâåäåí÷åñêîå, åñëè èõ îïèñàíèå íà âåíòèëüíîì óðîâíå ëèáî îòñóòñòâóåò, ëèáî ñëèøêîì ãðîìîçäêî.  HDL âñòðîåí ðÿä ïîíÿòèé, îáû÷íî èñïîëüçóåìûõ ïðîåêòèðîâùèêàìè àïïàðàòóðû. Íèæå ïðè èçëîæåíèè ýòèõ ïîíÿòèé â ñêîáêàõ ïðèâîäÿòñÿ àíãëèéñêèå òåðìèíû, èñïîëüçóåìûå â HDL êàê êëþ÷åâûå, çàðåçåðâèðîâàííûå ñëîâà. Ðèñ. 1.1. Âîçìîæíîñòè HDL â îáëàñòè îòîáðàæåíèÿ îñíîâíûõ õàðàêòåðèñòèê (ñòðóêòóðíûé, âðåìåííîé, ôóíêöèîíàëüíûé àñïåêò) àïïàðàòóðû 16 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 1.1.2. Èíòåðôåéñ îáúåêòà ïðîåêòà Ïîëíîå HDL-îïèñàíèå êàæäîãî îáúåêòà ïðîåêòà (â äàëüíåéøåì äëÿ êðàòêîñòè — îáúåêòà — entity, ìîäóëÿ — module) ñîñòîèò èç äâóõ ÷àñòåé: îïèñàíèÿ èíòåðôåéñà îáúåêòà è îïèñàíèÿ òåëà îáúåêòà (îïèñàíèå àðõèòåêòóðû — architecture â òåðìèíîëîãèè VHDL). Èíòåðôåéñ îáúåêòà ïðîåêòà (module, entity) îïðåäåëÿåò åãî èìÿ, âõîäû-âûõîäû è ïàðàìåòðû. Âõîäû-âûõîäû — ýòî ñîñòàâ ïîðòîâ (port), èõ èìåíà, íàïðàâëåííîñòü (âõîäû — in, input, âûõîäû — out, output, äâóíàïðàâëåííûå — inout), ðàçðÿäíîñòü (îäèí áèò — bit èëè âåêòîð — bit_vector), aëôàâèò êîäèðîâàíèÿ (0, 1 — îäèí èç ñòàíäàðòîâ äëÿ VHDL èëè 0, 1, Z, X — ñòàíäàðò äëÿ VERILOG) ñèãíàëîâ, ñïîñîá ïðåäñòàâëåíèÿ èõ çíà÷åíèé (öåëûé — integer, âåùåñòâåííûé — real) è ò. ä. Íàïðèìåð, ó îáúåêòà ïðîåêòà ïî èìåíè SM (ðèñ. 1.2) òðè âõîäíûõ (input, in) ïîðòà: A, B, C è îäèí âûõîä (output, out): S, íà êîòîðûå ìîãóò ïîñòóïàòü ñèãíàëû, èìåþùèå äâîè÷íûå (bit) çíà÷åíèÿ 0 èëè 1. Ðèñ. 1.2. Èíòåðôåéñ îáúåêòà ïðîåêòà SM Îäíîòèïíûå îáúåêòû ïðîåêòà ìîãóò ðàçëè÷àòüñÿ ïàðàìåòðàìè íàñòðîéêè (generic, parameter), íàðèìåð ðàçðÿäíîñòüþ èëè çàäåðæêîé. TZ — ïàðàìåòð, õàðàêòåðèçóþùèé çàäåðæêó SM. Íèæå ïðèâåäåíû HDL-îïèñàíèÿ èíòåðôåéñà îáúåêòà ïðîåêòà SM. VHDL entity SM is generic(TZ: time:=0 ns); port (A, B, C: in bit; S: out bit); end SM; VERILOG `timescale 1 ns/100 ps module SM (A, B, C, S); parameter TZ=0; input A, B, C; output S; Ïîñëåäíÿÿ âåðñèÿ ÿçûêà VERILOG (VERILOG-2000) ïîçâîëÿåò îïèñûâàòü ïîðòû îáúåêòà ïðîåêòà â ôîðìå, áîëåå áëèçêîé ê ïðèíÿòîé â ÿçûêå VHDL. module SM (input wire A,B,C, output wire S); Ïîðòû îáúåêòà ïðîåêòà, êàê óæå îòìå÷àëîñü, õàðàêòåðèçóþòñÿ íàïðàâëåíèåì ïîòîêà èíôîðìàöèè. Îíè ìîãóò áûòü âõîäíûìè (â VHDL çàðåçåðâèðîâàííîå ñëîâî in, â VERILOG — input), âûõîäíûìè (VHDL — out, VERILOG — output), äâóíàïðàâëåííûìè (inout). Êðîìå òîãî, â VHDL ìîãóò áûòü îäíîíàïðàâëåííûìè áóôåðíûìè (buffer) (ñ ïîðòà òèïà buffer âûõîäíîé ñèãíàë îáúåêòà ìîæíî ñ÷èòûâàòü â òîì æå îáúåêòå, ÷òî íåëüçÿ äåëàòü ñ ïîðòîì òèïà out) è ñâÿçíûìè — linkage. Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 17 Ïîðòû òàêæå èìåþò òèï, õàðàêòåðèçóþùèé òèï çíà÷åíèÿ ïîñòóïàþùèõ íà íèõ ñèãíàëîâ.  VHDL — ýòî, íàïðèìåð, ñòàíäàðòíûé (âñòðîåííûé) òèï bit èëè n-áèòîâûé âåêòîð — bit_vector, — êàæäûé ðàçðÿä êîòîðîãî äâóçíà÷íûé (ïðèíèìàåò çíà÷åíèå 0 èëè 1).  VERILOG — ýòî îáû÷íî îäíîðàçðÿäíûé èëè n-áèòîâûé âåêòîð, ðàçðÿä êîòîðîãî èìååò ÷åòûðåõçíà÷íûé òèï (ïî óìîë÷àíèþ) ñî çíà÷åíèÿìè 0, 1, z — âûñîêèé èìïåäàíñ, x — íåîïðåäåëåííî. Ïîäðîáíåå îá àëôàâèòå ïðåäñòàâëåíèÿ ñèãíàëîâ ñìîòðèòå íèæå è â ãëàâå 2. 1.1.3. Îïèñàíèå ñòðóêòóðû îáúåêòà ïðîåêòà Òåëî îáúåêòà ïðîåêòà ñïåöèôèöèðóåò åãî ñòðóêòóðó è ôóíêöèþ (ïîâåäåíèå, àëãîðèòì). Åãî îïèñàíèå â HDL VERILOG ñëåäóåò çà îïèñàíèåì èíòåðôåéñà ìîäóëÿ, à â ÿçûêå VHDL âûäåëÿåòñÿ â îòäåëüíóþ ÷àñòü è ñîäåðæèòñÿ â îïèñàíèè àðõèòåêòóðû îáúåêòà (architecture) (ðèñ. 1.3). Ðèñ. 1.3. Ïðèìåð ñîîòâåòñòâèÿ ìíîæåñòâà àðõèòåêòóð îäíîìó èíòåðôåéñó â VHDL Åñëè ïðîåêòèðîâùèê ïðåäñòàâèë ôóíêöèþ óñòðîéñòâà êàê ñõåìó (ñòðóêòóðó) èç ýëåìåíòîâ íèçøåãî óðîâíÿ ñëîæíîñòè, òî HDL äëÿ íåãî â ïåðâîì ïðèáëèæåíèè ýòî ôîðìà êîäèðîâàíèÿ ñõåì. Ñðåäñòâà HDL äëÿ îòîáðàæåíèÿ ñòðóêòóð öèôðîâûõ ñèñòåì áàçèðóþòñÿ íà ïðåäñòàâëåíèè î òîì, ÷òî îïèñûâàåìûé îáúåêò ïðîåêòà (entity, module) ïðåäñòàâëÿåò ñîáîé ñòðóêòóðó èç áîëåå ïðîñòûõ îáúåêòîâ-êîìïîíåíòîâ (component), ñîåäèíÿåìûõ äðóã ñ äðóãîì ëèíèÿìè ñâÿçè (ïðîâîäàìè — wire (VERILOG) èëè ñèãíàëàìè — signal (VHDL). Êàæäûé êîìïîíåíò, â ñâîþ î÷åðåäü, ÿâëÿåòñÿ îáúåêòîì è ìîæåò ñîñòîÿòü èç êîìïîíåíò íèçøåãî óðîâíÿ (èåðàðõèÿ îáúåêòîâ). Âçàèìîäåéñòâóþò îáúåêòû ïóòåì ïåðåäà÷è ñèãíàëîâ (signal) ïî ëèíèÿì ñâÿçè. Ëèíèè ñâÿçè (wire — â VERILOG) èëè îòîæäåñòâëÿåìûå ñ íèìè ñèãíàëû (signal — â VHDL) ïîäêëþ÷àþòñÿ ê âõîäíûì (in, input) è âûõîäíûì (out, output) ïîðòàì (port) ñâÿçûâàåìûõ êîìïîíåíòîâ. Íàïðèìåð, êîìïîíåíò Ì2 (ðèñ. 1.4) îáúåêòà SM èìååò äâà âõîäíûõ ïîðòà — Õ1, Õ2 è îäèí âûõîäíîé — Y. Ýêçåìïëÿðû îäíîòèïíûõ êîìïîíåíò, êàê óæå îòìå÷àëîñü, ìîãóò ðàçëè÷àòüñÿ ïàðàìåòðàìè íàñòðîéêè (generic â VHDL, parameter â VERILOG), íàïðèìåð çàäåðæêîé ñèãíàëîâ. Íà ðèñ. 1.4 ïðåäñòàâëåíà ñòðóêòóðà îáúåêòà ïðîåêòà SM, ñîñòîÿùåãî èç äâóõ ýêçåìïëÿðîâ êîìïîíåíòîâ òèïà Ì2, ñ èìåíàìè ýêçåìïëÿðîâ Ê1 è Ê2 è çàäåðæêàìè 15 ns è 10 ns. 18 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà Ðèñ. 1.4. Ñòðóêòóðíûé àñïåêò îáúåêòà ïðîåêòà SM, ñîñòîÿùåãî èç äâóõ ýêçåìïëÿðîâ êîìïîíåíòîâ òèïà Ì2 (ñõåìà îáúåêòà SM)  HDL-îïèñàíèè ñõåìû èìåíà âõîäíûõ ñèãíàëîâ (ïîðòîâ) îáúåêòà ïðîåêòà SM è èìåíà èäóùèõ îò íèõ ëèíèé ñâÿçè ñîâïàäàþò (îíè îòîæäåñòâëÿþòñÿ). Äëÿ âíóòðåííèõ ñèãíàëîâ (ëèíèé ñâÿçè, öåïåé ñîåäèíåíèé), ñâÿçûâàþùèõ êîìïîíåíòû äðóã ñ äðóãîì, íåîáõîäèìî ââîäèòü èíäèâèäóàëüíûå èìåíà. Íàïðèìåð, ëèíèÿ S_TMP (ñèãíàë S_TMP íà ðèñ. 1.4) îáúåäèíÿåò êîìïîíåíòû Ê1 è Ê2. Ñòðóêòóðíîå îïèñàíèå îáúåêòà ïðîåêòà SM ñòðîèòñÿ êàê îïèñàíèå ñâÿçåé ýêçåìïëÿðîâ (êîíêðåòèçàöèé — instance) êîìïîíåíòîâ, êàæäûé èç êîòîðûõ èìååò ïåðñîíàëüíîå èìÿ (èìÿ êîíêðåòèçàöèè), òèï, çíà÷åíèå ïàðàìåòðîâ è ñâÿçè ñ âõîäíûìè è âûõîäíûìè ñèãíàëàìè (ñïèñîê êîíêðåòèçàöèè).  ïðîñòûõ ñëó÷àÿõ èñïîëüçóåòñÿ ïîçèöèîííûé ïðèíöèï ñîïîñòàâëåíèÿ ïîðòîâ êîìïîíåíòîâ ïîñòóïàþùèì íà íèõ ñèãíàëàì (ïîçèöèîííàÿ êàðòà ïîðòîâ — port map). Òî åñòü ïåðâûé ñèãíàë â êàðòå ïîðòîâ (ñïèñêå êîíêðåòèçàöèè) ñîïîñòàâëÿåòñÿ ïåðâîìó ïîðòó êîìïîíåíòà, âòîðîé — âòîðîìó è ò. ï. (ñìîòðè ïðèìåð êîíêðåòèçàöèè Ê1).  ñëîæíûõ ñëó÷àÿõ ïðè áîëüøîì êîëè÷åñòâå ïîðòîâ êîìïîíåíòîâ è ïðîèçâîëüíîì ïîðÿäêå èõ ïåðå÷èñëåíèÿ â êàðòå ïîðòîâ èñïîëüçóåòñÿ êëþ÷åâîé ïðèíöèï (ÿâíûé — explicit): ñïèñîê êîíêðåòèçàöèè îáðàçóþò ïàðû èìÿ ïîðòà êîìïîíåíòà — èìÿ ïîäñîåäèíåííîãî ê íåìó ñèãíàëà (ñìîòðè ïðèìåð êîíêðåòèçàöèè Ê2). Íàïðèìåð, îïèñàíèå ñâÿçåé êîìïîíåíòîâ îáúåêòà ïðîåêòà SM, ïðåäñòàâëåííîãî íà ðèñ. 1.4, âûãëÿäèò ñëåäóþùèì îáðàçîì (ïîñëå ñèìâîëîâ -- â VHDL è // â VERILOG è äî êîíöà ñòðîêè ñëåäóåò êîììåíòàðèé): --VHDL architecture STRUCTURA of SM is signal S_TMP: bit;-- ïðîìåæóòî÷íûé begin -- äëÿ Ê1 ïîçèöèîííîå Ê1: entity M2 generic map (15 ns) port map (A, B, S_TMP); -- äëÿ Ê2 - êëþ÷åâîå -- ñîîòâåòñòâèå K2: entity M2 port map (X1=>S_TMP, Y=> S, X2=> C); end STRUCTURA; VERILOG // îïèñàíèå èíòåðôåéñà SM áûëî // âûøå wire S_TMP;//ïðîìåæóòî÷íûé //äëÿ Ê1 ïîçèöèîííîå ñîîòâåòñòâèå M2 #(15) K1 (A,B,S_TMP); //äëÿ Ê2 - êëþ÷åâîå //ñîîòâåòñòâèå è ïîðÿäîê ïàð //ïîðò-ñèãíàë ïðîèçâîëüíûé M2 K2 (.X1(S_TMP), .Y(S), .X2(C)); endmodule //SM Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 19 Êàê óæå îòìå÷àëîñü, â îïèñàíèè ñâÿçåé êîìïîíåíòîâ îáúåêòà ïðîåêòà SM èñïîëüçîâàíû ñëåäóþùèå îáîçíà÷åíèÿ: — K1, K2 — èìåíà ýêçåìïëÿðîâ êîìïîíåíòà Ì2; — M2 — òèï êîìïîíåíòà; — 15 ns çàäåðæêà äëÿ êîíêðåòèçàöèè Ê1; êîíêðåòèçàöèÿ Ê2 èìååò çàäåðæêó 10 ns ïî óìîë÷àíèþ, VERILOG — îïèñàíèå SM ïðåäïîëàãàåò ìàñøòàá âðåìåíè 1 ns (timescale — ñì. íèæå òàêæå îïèñàíèå îáúåêòà ïðîåêòà Ì2) c òî÷íîñòüþ 100 ps; — A, B, C, S — èìåíà âíåøíèõ ñèãíàëîâ, ñâÿçàííûõ ñ ïîðòàìè; — S_TMP — èìÿ ïðîìåæóòî÷íîãî ñèãíàëà. Åñëè êàêîé-òî ïîðò íå ñîåäèíåí ñ ñèãíàëîì, â VHDL ýòî îáîçíà÷àåòñÿ êëþ÷åâûì ñëîâîì open, â VERILOG — ïðè ïîçèöèîííîì ñïîñîáå ýòî ìåñòî îáîçíà÷àåòñÿ çàïÿòîé. Êëþ÷åâîé ñïîñîá ìîæåò ïðèìåíÿòüñÿ è ïðè óêàçàíèè ôàêòè÷åñêèõ çíà÷åíèé ïàðàìåòðîâ íàñòðîéêè.  íàøåì ñëó÷àå äëÿ êîíêðåòèçàöèè Ê1 ïðè íåçàäåéñòâîâàííîì ïîðòå X2 è êëþ÷åâîì ñïîñîáå óêàçàíèÿ çíà÷åíèÿ ïàðàìåòðà íàñòðîéêè TDEL ìû èìåëè áû: VHDL K1: entity M2 generic map(TDEL=>15 ns); port map (A, open, S_TMP); VERILOG M2 K1 (A, ,S_TMP); defparam K1.TDEL= 15; VERILOG-2000 äîïóñêàåò áîëåå ïîõîæóþ íà VHDL ôîðìó ïåðåäà÷è ïàðàìåòðîâ íàñòðîéêè : Ì2 #(.TDEL(15)) K1(A, ,S_TMP); 1.1.4. Ñâÿçü èìåí êîìïîíåíòîâ è îáúåêòà ïðîåêòà Îñòàåòñÿ âîïðîñ î ñâÿçûâàíèè èìåíè êîìïîíåíòà ñ èìåíåì ñîîòâåòñòâóþùåãî îáúåêòà ïðîåêòà. VERILOG ïðåäïîëàãàåò ïîëíîå ñîîòâåòñòâèå ýòèõ èìåí. VHDL áîëåå ãèáîê, äîïóñêàÿ ðàçëè÷èå èìåíè êîìïîíåíòà è èìåíè ñîîòâåòñòâóþùåãî îáúåêòà ïðîåêòà. Ïðè ñîâïàäåíèè èìåí êîìïîíåíòà è îáúåêòà ïðîåêòà ìîæíî ïðèìåíÿòü ïðÿìîå ñîçäàíèå ýêçåìïëÿðà êîìïîíåíòà, êàê ýòî áûëî ñäåëàíî âûøå. Ìîæíî òàêæå îáúÿâèòü VHDL-êîìïîíåíò è èñïîëüçîâàòü ñâÿçûâàíèå ïî óìîë÷àíèþ, êîãäà ñèñòåìà èùåò â ðàáî÷åé áèáëèîòåêå ïðîåêòà ïîñëåäíåå èç îòêîìïèëèðîâàííûõ îïèñàíèé îáúåêòîâ ñ òàêèì æå èìåíåì. Ñâÿçûâàíèå (êîíôèãóðèðîâàíèå — ñonfiguration) ýòèõ èìåí îñóùåñòâëÿåòñÿ ëèáî òàê íàçûâàåìûì îáúÿâëåíèåì êîíôèãóðàöèè ëèáî ñïåöèôèêàöèåé êîíôèãóðàöèè. B íàøåì VHDL-ïðèìåðå èñïîëüçîâàíèå îïèñàíèÿ êîìïîíåíòà è ñïåöèôèêàöèÿ êîíôèãóðàöèè âûãëÿäåëè áû òàê: architecture STRUCTURA_COMP of SM is signal S_TMP;--ïðîìåæóòî÷íûé component M2 -- êîìïîíåíò M2 -- â VERILOG ðàçäåë îïèñàíèé generic TDEL=10 ns;-- çàäåðæêà -- êîìïîíåíò îòñóòñòâóåò, íî port(X1,X2:in bit; -- âõîäû -- ãäå-òî âîâíå â áèáëèîòåêå -- ïðîåêòà äîëæíî áûòü Y :out bit); -- îïèñàíèå ñîîòâåòñòâóþùèõ end component M2; -- îáúåêòîâ ñ òàêèìè æå èìåíàìè for all:M2 use entity work.M2(BEH); -- ñïåöèôèêàöèÿ êîíôèãóðàöèè begin -- äëÿ íàøåãî VHDL ïðèìåðà èçëèøíÿÿ -- ìîæíî áûëî èñïîëüçîâàòü ñâÿçûâàíèå ïî óìîë÷àíèþ 20 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà Ê1: M2 generic map (15 ns) port map (A, B, S_TMP); K2: M2 port map (S_TMP, C,S); end STRUCTURA_COMP;  âåðñèþ VERILOG-2000 âêëþ÷åí ïîäîáíûé ìåõàíèçì, òàê íàçûâàåìûé áëîê êîíôèãóðàöèè. Èñïîëüçîâàíèå ýòîé êîíñòðóêöèè ïîçâîëÿåò çàôèêñèðîâàòü â êîäå VERILOG-îïèñàíèÿ èìåíà è ðàçìåùåíèå áèáëèîòåê ñ îïèñàíèÿìè îáúåêòîâ ïðîåêòà, ñîïîñòàâëåííûõ êîìïîíåíòàì. VERILOG config CONF_SM //èìÿ êîíôèãóðàöèè äëÿ ïðèìåðà CONF_SM design ADDER_LIB.TOP //Óñòàíàâëèâàåò ïîðÿäîê ïîèñêà îáúåêòîâ ïðîåêòà, //ñîïîñòàâëåííûõ êîìïîíåíòàì - â ïðèìåðå // â âèðòóàëüíîé áèáëèîòåêå ADDER_LIB library ADDER_LIB "./*.v"; //îïðåäåëÿåò ìåñòî âèðòóàëüíîé áèáëèîòåêè // â ïðèìåðå òåêóùàÿ äèðåêòîðèÿ è ôàéëû ñ ðàñøèðåíèåì .v endconfig 1.1.5. Ïîâåäåíèå îáúåêòà ïðîåêòà Èç ïðèâåäåííûõ ïðèìåðîâ âèäíî, ÷òî, íåñìîòðÿ íà ñóùåñòâåííóþ ðàçíèöó â ñèíòàêñèñå ÿçûêîâ, îáùíîñòü ñòðóêòóðíûõ îïèñàíèé ñõåì î÷åâèäíà. Ñòðóêòóðíîå ïðåäñòàâëåíèå îòîáðàæàåò òèïû è ñâÿçè êîìïîíåíòîâ, íî èõ ïîâåäåíèå â ÿâíîì âèäå â íåì íå îïèñûâàåòñÿ, è ÷òî äåëàåò, íàïðèìåð, êîìïîíåíò Ì2 ñ âõîäíûìè ñèãíàëàìè, èç íåãî íå ÿñíî. Êîìïîíåíò ïðåäñòàâëÿåò îáúåêò ïðîåêòà íèçøåãî ðàíãà, ôóíêöèÿ êîòîðîãî ìîæåò áûòü ðàñêðûòà, èëè îí ìîæåò áûòü, â ñâîþ î÷åðåäü, îïèñàí ñòðóêòóðíî. Òàê, îïèñàíèå ôóíêöèè îáúåêòà ïðîåêòà Ì2 â ñëó÷àå, åñëè îí ðåàëèçóåò îïåðàöèþ ñëîæåíèÿ ïî ìîäóëþ 2 (xor — èñêëþ÷àþùåå ÈËÈ), ìîæåò áûòü òàêèì: VHDL entity M2 is generic (TDEL: time:=10 ns); port (X1,X2 : in bit; Y : out bit); end; architecture BEH of M2 is begin Y<= (X1 xor X2) after TDEL; end; VERILOG `timescale 1 ns /100 ps module M2 (X1,X2,Y); parameter TDEL=10; input X1,X2; output Y; // êîíåö èíòåðôåéñà //íèæå òåëî ìîäóëÿ M2 assign #(TDEL) Y= (X1 ^ X2); endmodule Åñëè â òåêñòîâûé ôàéë ñ îïèñàíèåì îáúåêòà ïðîåêòà SM âêëþ÷èòü îïèñàíèå îáúåêòà M2, íàïðèìåð âñòàâèâ åãî â íà÷àëî ôàéëà, òî ìû ïîëó÷èì ïîëíîå îïèñàíèå ïðîåêòà SM, â êîòîðîì ðàñêðûòî ïîâåäåíèå êîìïîíåíòà M2. Êîãäà ôóíêöèÿ îáúåêòà Ì2 ðåàëèçîâàíà â îïåðàöèÿõ êëàññè÷åñêîãî áàçèñà È, ÈËÈ, ÍE è ïîëüçîâàòåëü õî÷åò ýòî îòðàçèòü, òî ôóíêöèÿ Ì2 â ýòèõ êëàññè÷åñêèõ îïåðàöèÿõ ìîãëà áû âûãëÿäåòü òàê: VHDL Y<= ((X1 and not X2) or (not X1 and X2)) after TDEL; VERILOG assign #(TDEL) Y= (X1 & ~X2)| (~X1 & X2); Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 21 ×èòàòåëþ â êà÷åñòâå óïðàæíåíèÿ ïðåäëàãàåòñÿ ñàìîñòîÿòåëüíî ðàçðàáîòàòü ñòðóêòóðíîå îïèñàíèå îáúåêòà ïðîåêòà Ì2, ñîñòîÿùåãî èç êîìïîíåíòîâ AND2, OR2, NOT1 è ñîñòàâèòü îïèñàíèÿ îáúåêòîâ ïðîåêòà AND2, OR2, NOT1. ßçûê VERILOG, â îòëè÷èå îò VHDL, âêëþ÷àåò âñòðîåííûå ïðèìèòèâû n-ðàçðÿäíûõ âåíòèëåé íà ïðîèçâîëüíîå ÷èñëî âõîäîâ: and, or, nand, xor, xnor, îäíîâõîäîâûå ïðèìèòèâû not, buf è äð.  íàøåì ïðîñòåéøåì ñëó÷àå ñòðóêòóðíîå VERILOG-îïèñàíèå îáúåêòà ïðîåêòà SM ìîãëî áû áûòü òàêèì: //VERILOG `timescale 1 ns/100 ps module SM_FROM_PRIMITIVES (A, B, C, S); input A, B, C; output S;wire S_TMP; xor #15 K1 (S_TMP ,A,B); //â ïðèìèòèâå xor //- âûõîä - ïåðâûé â ñïèñêå ïàðàìåòðîâ xor #10 K2 (S, S_TMP,C); endmodule 1.1.6. Paçíîîáðàçèå ñòèëåé îïèñàíèé àðõèòåêòóð HDL äîïóñêàåò áîëüøîå ðàçíîîáðàçèå ñòèëåé îïèñàíèé îáúåêòîâ ïðîåêòà, è, íàïðèìåð, îáúåêò ïðîåêòà SM ìîæåò áûòü ïðåäñòàâëåí ÷èñòî ïîâåäåí÷åñêèì ñïîñîáîì (êàê «÷åðíûé ÿùèê»). VHDL entity SM_BEH is generic (TDEL: time:=25 ns); port (A, B, C: in bit; S: out bit); end SM_BEH ;--êîíåö èíòåðôåéñà arhitecture BEHAVIOUR of SM_BEH is begin S<= (A xor B xor C) after TDEL ; end; VERILOG `timescale 1 ns/100 ps module SM_BEH (A, B, C ,S); input A, B, C; output S; parameter TDEL=25; assign #(TDEL) S= (A ^ B ^ C); endmodule // SM_BEH Îñòàòîê ýòîãî ïàðàãðàôà ñîäåðæèò ïðèìåðû, èëëþñòðèðóþùèå äðóãèå, áîëåå áëèçêèå ê âîçìîæíîñòÿì îáû÷íûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ ñðåäñòâà HDL â ñôåðå îïèñàíèÿ ôóíêöèîíèðîâàíèÿ îáúåêòîâ. Äåòàëüíî ýòè ñðåäñòâà áóäóò ðàññìîòðåíû ïîçæå, è ÷èòàòåëü, ÷óâñòâóþùèé çàòðóäíåíèÿ, ìîæåò áåç óùåðáà ïðîïóñòèòü ýòîò ìàòåðèàë äî íà÷àëà ñëåäóþùåãî ðàçäåëà. Îäíîðàçðÿäíûé ñóììàòîð. Äàäèì ïðèìåð èñïîëüçîâàíèÿ îáúåêòà ïðîåêòà SM-ïîëóñóììàòîðà êàê êîìïîíåíòà îäíîðàçðÿäíîãî ñóììàòîðà adder, êîòîðûé ïîìèìî ñóììû sum ôîðìèðóåò ïåðåíîñ cout. Èëëþñòðèðóåòñÿ ñìåøàííûé ñòðóêòóðíûé — äëÿ ñóììû — sum è ïîòîêîâûé (âõîä ðåãèñòðà, ïðåîáðàçóÿñü, ïðîõîäèò íà åãî âûõîä) äëÿ ïåðåíîñà — cout ñòèëü îïèñàíèÿ îáúåêòà adder. VHDL entity adder is generic(T_SM: time:=25 ns); port (a : in bit; b : in bit; VERILOG `timescale 1ns/10 ps module adder (a,b,cin,sum,cout); input a,b,cin; 22 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà cin : in bit; sum : out bit; cout : out bit); end adder; architecture mix of adder is begin summa: entity SM port map (a,b,cin,sum); cout <= (a and b) or (cin and a) or (cin and b)after T_SM; end; output sum,cout; parameter T_SM= 25; SM summa (a,b,cin,sum); assign #(T_SM)cout = (a & b)| ( cin & a) | (cin & b); endmodule n-ðàçðÿäíûé ñóììàòîð ñ ïîñëåäîâàòåëüíûì ïåðåíîñîì. Ïðèâåäåì ïðèìåð ïîâåäåí÷åñêîãî îïèñàíèÿ n-ðàçðÿäíîãî ñóììàòîðà (adderN) áåç çàäåðæåê (ñóììàòîð ñ ïîñëåäîâàòåëüíûì ïåðåíîñîì). VHDL entity adderN is generic (n:integer:=10); port (a,b: in bit_vector (n downto 1); sin : in bit; sum : out bit_vector(n downto 1); cout :out bit); end; architecture beh of adderN is begin p1: process(a, b, cin) variable vsum : bit_vector(N downto 1); variable carry : bit; begin carry := cin; for i in 1 to n loop vsum(i) := (a(i) xor b(i)) xor carry; carry := (a(i) and b(i)) or (carry and (a(i) or b(i))); end loop; sum <= vsum; cout <= carry; end process p1; end beh; VERILOG module adderN (a,b,cin,sum,cout); parameter n=10; input [n:1]a,b; input cin; output[n:1]sum; output cout; integer i; reg [n :1] vsum; reg carry; always @ (a or b or cin) begin carry = cin; for(i=1;i<=n;i=i+1) begin vsum[i] =(a[i] ^ b[i]) ^ carry; carry = (a[i] & b[i]) | (carry & (a[i] | b[i])); end //for end assign sum = vsum; assign cout = carry; endmodule //adderN n-ðàçðÿäíûé ñóììàòîð. Äàëåå ïðèâåäåí ïðèìåð åùå áîëåå àáñòðàêòíîãî óðîâíÿ îïèñàíèÿ n-ðàçðÿäíîãî ñóììàòîðà adder N_B (íå ÿñíî, êàêîé ïåðåíîñ — ïàðàëëåëüíûé èëè ïîñëåäîâàòåëüíûé). VHDL-ìîäåëü èñïîëüçóåò ïîäêëþ÷åíèå ïàêåòîâ, â êîòîðûõ îïðåäåëåí òèï STD_LOGIC_VECTOR è àðèôìåòè÷åñêèå îïåðàöèè íàä íèì (äëÿ BIT_VECTOR îíè íå îïðåäåëåíû).  îáîèõ îïèñàíèÿõ ïðèìåíåíà îïåðàöèÿ êîíêàòåíàöèè (ñöåïëåíèÿ) — cèìâîë & â VHDL è ñèìâîëû{,} â VERILOG. Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 23  VHDL ñèãíàë vsum èìååò äîïîëíèòåëüíûé ðàçðÿä ñëåâà, ÷òîáû õðàíèòü ïåðåíîñ, êîòîðûé çàòåì ïðèñâàèâàåòñÿ â cout, â VERILOG ýòî äåëàåòñÿ â ñîñòàâå êîíêàòåíàöèè {cout,sum} â ëåâîé ÷àñòè ïðèñâàèâàíèÿ. VHDL LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.std_logic_unsigned.all; entity adderN_B is generic (n:integer:=10); port (a,b: in std_logic_vector (n downto 1); cin : in std_logic; sum : out std_logic_vector(n downto 1); cout :out std_logic); end adderN; architecture beh of adderN_B is begin process variable vsum,a1: std_logic_vector(n+1 downto 1); begin wait on a,b,cin a1:= '0'& a; vsum := a1+b+ cin; sum <=vsum (n downto 1); cout <=vsum(n+1); end process; end beh; VERILOG `timescale 1 ns/100 ps module adderN_B (a,b,cin,sum,cout); parameter n=10; input [n:1]a,b;input cin; output[n:1]sum;; output cout; reg [n :1] sum; reg cout; always @ (a or b or cin) begin {cout,sum}= a+b+cin; end endmodule //adderN_B Òåñòèðóþùàÿ ïðîãðàììà. Çäåñü ïðèâåäåí ïðèìåð ïðîãðàììû, òåñòèðóþùåé îäíîðàçðÿäíûé ñóììàòîð ïóòåì ïîäà÷è äâóõ âõîäíûõ íàáîðîâ: a, b, c = 000,111. VHDL entity adder_tb is end; architecture BEH of adder_tb is component adder port( a, b, cin : in bit; sum : out bit; cout : out bit); end component; -- Stimulus signals signal a : bit; signal b : bit; signal c : bit; -- Observed signals signal sum : bit; signal cout : bit; begin -- íèæå òåñòîâûå âåêòîðû VERILOG `timescale 1 ns/100 ps module adder_tb; reg a; reg b; reg c; wire sum; wire cout; 24 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà process begin a<='0';b<='0';c<='0'; wait for 100 ns; a<='1';b<='1';c<='1'; wait for 100 ns; end process; -- Unit Under Test port map UUT : adder port map ( a => a, b => b, cin => c, sum => sum, cout => cout ); end BEH; initial begin a<=0;b<=0;c<=0; #100; a<=1;b<=1;c<=1; #100; $finish; end //òåñòèðóåòñÿ adder adder UUT ( .a(a), .b(b), .cin(c), .sum(sum), .cout(cout) ); endmodule //adder_tb Èç ïðèâåäåííûõ ïðèìåðîâ âèäíî, ÷òî ïðè îïèñàíèè ïîâåäåíèÿ ñëîæíûõ îáúåêòîâ ïðèõîäèòñÿ èñïîëüçîâàòü ðàçíîîáðàçíûå îáùåàëãîðèòìè÷åñêèå è ñïåöèàëüíûå ñðåäñòâà HDL, ÷àñòè÷íî ðàññìîòðåííûå íèæå. 1.2. HDL — âçãëÿä ïðîãðàììèñòà Åñëè ïîñìîòðåòü íà HDL ãëàçàìè ïðîãðàììèñòà, òî ìîæíî ñêàçàòü, ÷òî îí ñîñòîèò êàê áû èç äâóõ êîìïîíåíòîâ — îáùåàëãîðèòìè÷åñêîãî è ïðîáëåìíî-îðèåíòèðîâàííîãî (ðèñ. 1.5). Ðèñ. 1.5. Äâà êîìïîíåíòà HDL: îáùåàëãîðèòìè÷åñêèé è ïðîáëåìíî-îðèåíòèðîâàííûé Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 25 Îáùåàëãîðèòìè÷åñêèé êîìïîíåíò VHDL — ýòî ÿçûê, áëèçêèé ïî ñèíòàêñèñó è ñåìàíòèêå ê ÿçûêàì ïðîãðàììèðîâàíèÿ òèïà ÏÀÑÊÀËÜ, ÀÄÀ (ñì. ïðèëîæåíèå 1, ãäå ïðèâåäåíî íåïîëíîå êðàòêîå èçëîæåíèå ñèíòàêñèñà è ñåìàíòèêè ÿçûêà VHDL). Îáùåàëãîðèòìè÷åñêèé êîìïîíåíò VERILOG — ýòî ÿçûê, áëèçêèé ïî ñèíòàêñèñó è ñåìàíòèêå ê ÿçûêàì ïðîãðàììèðîâàíèÿ òèïà C, C++ (cì. ïðèëîæåíèå 2). Íèæå ïðèâåäåíû íåêîòîðûå êîíñòðóêöèè, îáùèå äëÿ HDL è ñòàíäàðòíûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ îáùåàëãîðèòìè÷åñêàÿ êîìïîíåíòà HDL.  êà÷åñòâå ïåðâîãî ïðîñòîãî ïðèìåðà ðàññìîòðèì ïðîãðàììó ïå÷àòè ïðèâåòñòâèÿ (íàïðèìåð, Hello, HDL!), îáû÷íî èñïîëüçóåìóþ â ïîñîáèÿõ äëÿ íà÷èíàþùèõ èçó÷àòü ÿçûêè ïðîãðàììèðîâàíèÿ. VHDL VERILOG entity Privet1 is end Privet1; architecture Simple of Privet1 is begin process begin module Privet1 (); always begin $display ("Hello, HDL!"); $finish;//îñòàíîâ end endmodule report "Hello, HDL!"; wait;--îñòàíîâ end prosess; end Simple; 1.2.1. Ëåêñè÷åñêèå ýëåìåíòû HDL Êîììåíòàðèé Êîììåíòàðèé â VHDL — ýòî òåêñò, íà÷èíàþùèéñÿ ñ ñèìâîëîâ «--» è äî êîíöà ñòðîêè, â VERILOG — ýòî òåêñò, íà÷èíàþùèéñÿ ñ ñèìâîëîâ «//» è äî êîíöà ñòðîêè.  VERILOG, êàê è â C++, äîïóñêàåòñÿ ìíîãîñòðî÷íûé êîììåíòàðèé, íà÷èíàþùèéñÿ ñ ñèìâîëîâ «/*» è êîí÷àþùèéñÿ ñèìâîëàìè «*/». Èìåíà Èìåíà (èäåíòèôèêàòîðû) — ýòî ïîñëåäîâàòåëüíîñòü áóêâ è öèôð, íà÷èíàþùàÿñÿ ñ áóêâû.  ÷èñëî ðàçðåøåííûõ âíóòðè èäåíòèôèêàòîðà âêëþ÷åí ñèìâîë «_».  VERILOG â ÷èñëî ðàçðåøåííûõ âêëþ÷åí òàêæå ñèìâîë «$», è èìÿ ìîæåò íà÷èíàòüñÿ ñ ñèìâîëà «_» è çàêàí÷èâàòüñÿ èì.  VHDL, â îòëè÷èå îò VERILOG, ñòðî÷íûå è ïðîïèñíûå áóêâû íå ðàçëè÷àþòñÿ. Ïðèìåðû ïðàâèëüíûõ èìåí: VHDL VERILOG Abba_11 ABBA_11 Abba_11 ABBA_11 — $A Ïðèìå÷àíèÿ  VHDL ïåðâîå è âòîðîå èìÿ — ýòî îäèíàêîâûå èìåíà.  VERILOG — ýòî ðàçíûå èìåíà Òîëüêî â VERILOG â èìåíè äîïóñêàåòñÿ ñèìâîë «$» 26 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà Ïðèìåðû çàïðåùåííûõ èäåíòèôèêàòîðîâ: VHDL VERILOG 2a _å1 Ó2__Ó; Ð_ 2a 73M +ab E2++E4 if if Ïðèìå÷àíèÿ Èìÿ íà÷èíàåòñÿ ñ çàïðåùåííîãî â íà÷àëå ñèìâîëà VHDL — äâà __ ïîäðÿä çàïðåùåíû Èìÿ if çàðåçåðâèðîâàíî (êëþ÷åâîå ñëîâî) Íåêîòîðûå èìåíà çàðåçåðâèðîâàíû — ýòî êëþ÷åâûå ñëîâà ÿçûêà. Ìíîãèå èç íèõ îáùåïðèíÿòû â ÿçûêàõ ïðîãðàììèðîâàíèÿ. Ïðèìåðû: begin, end, if, else, for, while è ò. ï. Ñïèñîê êëþ÷åâûõ ñëîâ VHDL ïðèâåäåí â ïðèëîæåíèè 1, VERILOG — â ïðèëîæåíèè 2. ×àñòî âñòðå÷àþùàÿñÿ îøèáêà â èìåíàõ-ïðè ïîäãîòîâêå òåêñòîâ ïðîãðàìì ïåðåïóòûâàþòñÿ âíåøíå îäèíàêîâûå ñèìâîëû ëàòèíèöû è êèðèëëèöû è áëèçêèå ïî èçîáðàæåíèþ ñèìâîëû áóêâ è öèôð O è 0, l è 1 è ò. ï. Íàïðèìåð èìÿ ÀÑ1, íàáèòîå â ëàòèíñêîì àëôàâèòå, îòëè÷àåòñÿ îò èìåíè ÀÑ1, íàáèòîãî â ðóññêîì. Ðàñøèðåííûå èìåíà Ðàñøèðåííûå èìåíà ìîãóò âêëþ÷àòü ëþáûå ïå÷àòíûå ñèìâîëû êîäà ASCII. Îíè íà÷èíàþòñÿ â VERILOG ñ ñèìâîëà «\» è çàêàí÷èâàþòñÿ ïðîáåëîì.  VHDL oíè îãðàíè÷åíû ñèìâîëîì «\». Ðàñøèðåííûå èìåíà ïîçâîëÿþò óâåëè÷èòü äèàïàçîí äîïóñòèìûõ èìåí. Ïðèìåð: VHDL VERILOG \f+bxo_xo\ \f+bxo_xo Ñîñòàâíûå èìåíà Ñîñòàâíûå èìåíà — ýòî ïîñëåäîâàòåëüíîñòü èìåí, ðàçäåëåííûõ òî÷êàìè (ñ èõ ïîìîùüþ îñóùåñòâëÿåòñÿ äîñòóï ê ýëåìåíòàì ñòðóêòóð è äðóãèì îáúåêòàì — íàïðèìåð, ïàêåòàì VHDL, âíóòðåííèì ïåðåìåííûì êîìïîíåíò (ýêçåìïëÿðà ìîäóëÿ) VERILOG è ò. ï.). Ïðèìåð: VS.DD.E1 Êîíñòàíòíûå çíà÷åíèÿ (ëèòåðàëû) Êîíñòàíòíûå ÷èñëîâûå çíà÷åíèÿ (ëèòåðàëû) ìîãóò áûòü ïðåäñòàâëåíû â äâîè÷íîé, âîñüìåðè÷íîé, äåñÿòè÷íîé ôîðìå. Ñèìâîë «_» âíóòðè êîíñòàíòû ïîâûøàåò íàãëÿäíîñòü çàïèñè çíà÷åíèé. Ïðèìåðû ÷èñåë: VHDL VERILOG 127 127 Ïðèìå÷àíèÿ 16#7F# 7'h7F 2#111_1111# 7'b111_1111 0.5 0.5 Âåùåñòâåííîå ÷èñëî 0.5 — 1'b1 Îäíîðàçðÿäíîå ÷èñëî 1 Öåëîå ÷èñëî 127 â äåñÿòè÷íîé ñèñòåìå ×èñëî 127 â øåñòíàäöàòåðè÷íîé ñèñòåìå ×èñëî 127 â äâîè÷íîé ñèñòåìå Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 27 Ñèìâîëüíûå è ñòðîêîâûå ëèòåðàëû Ïðèìåðû: VHDL VERILOG '0' "0" Ñèìâîë 0 Ïðèìå÷àíèÿ 'A' "A" Ñèìâîë A "10N1" "10N1" ×åòûðåõñèìâîëüíàÿ ñòðîêà Áèòîâî-ñòðîêîâûå ëèòåðàëû Ïðèìåðû: VHDL VERILOG Ïðèìå÷àíèÿ B"1110" 4'b1110 X"E" 4'he Øåñòíàäöàòåðè÷íûé êîä 1110 O"16" 6'o16 Âîñüìåðè÷íûé êîä 001110 Áèòîâàÿ ñòðîêà 1110 Ïîèìåíîâàííûå êîíñòàíòû Îïèñàíèå ïðîåêòà äîëæíî ëåãêî ìîäèôèöèðîâàòüñÿ è âìåñòî êîíñòàíòíûõ çíà÷åíèé â òåêñòå ëó÷øå èñïîëüçîâàòü èõ èìåíà. Ïðèìåðû îáúÿâëåíèé êîíñòàíò (ïåðâûé ïðèìåð äîïóñêàåò èçìåíåíèå çíà÷åíèÿ êîíñòàíòû S1 èç âíåøíåãî ìîäóëÿ, òàê êàê îíà îáúÿâëåíà êàê ïàðàìåòð, âòîðîé ïðèìåð äëÿ êîíñòàíòû ONE — íå äîïóñêàåò): VHDL generic (S1:integer:=20); constant ONE :bit:='1'; VERILOG Ïðèìå÷àíèÿ parameter S1= 20; `define ONE 1'b1; Âåðñèÿ VERILOG-2000 ðàñøèðÿåò âîçìîæíîñòè ÿâíîãî îïèñàíèÿ êîíñòàíò, îáúÿâëÿÿ èõ â áëîêå specify ëîêàëüíûìè ïàðàìåòðàìè, íå èçìåíÿåìûìè èç âíåøíåãî ìîäóëÿ. Ïðèìåð: localparam BB= 33; // VERILOG-2000. Íèæå ïðèâåäåí ïðèìåð ïðîãðàììû ïå÷àòè ïðèâåòñòâèÿ Hello, Vasia ñ èñïîëüçîâàíèåì êîíñòàíò. VHDL entity Privet2 is end Privet2; architecture Simple of Privet2 is constant s1:string :="Hello, Vasia!"; begin process begin report s1; wait; end process; end Simple; VERILOG module Privet2 (); parameter s1= "Hello, Vasia!"; always begin $display ("%s",s1); $finish; end endmodule 28 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 1.2.2. Äàííûå (îáúåêòû): òèïû è âèäû Èìåíà äàííûõ (îáúåêòîâ ïî òåðìèíîëîãèè VHDL), èñïîëüçóåìûõ â ìîäóëå, äîëæíû áûòü îáúÿâëåíû. Ïðè îïèñàíèè óêàçûâàþòñÿ: — òèï îáúåêòà, çàäàþùèé äèàïàçîí âîçìîæíûõ çíà÷åíèé è îïåðàöèé (íàïðèìåð, äàííûå öåëîãî òèïà — integer, âåùåñòâåííîãî — real); — âèä èëè êëàññ îáúåêòà, çàäàþùèé äîïîëíèòåëüíûå ñâîéñòâà, íàïðèìåð ñîñòàâ ïðèìåíèìûõ ê îáúåêòó îïåðàòîðîâ ïðèñâàèâàíèÿ (íàïðèìåð, â VHDL — ýòî âèäû: êîíñòàíòà, ñèãíàë è ïåðåìåííàÿ — constant, signal, variable; â VERILOG — ýòî ïàðàìåòð, ïåðåìåííàÿ è ñîåäèíåíèå — parameter, reg, wire). Çäåñü ïåðå÷èñëåíû òèïû è âèäû îáúåêòîâ (äàííûõ) VHDL è VERILOG. VHDL Òèïû Ñêàëÿðíûå òèïû: ïåðå÷èñëèìûé (enumerated) öåëûé (integer) ôèçè÷åñêèé ïëàâàþùèé (float) ôàéë (file) ññûëî÷íûé (access) Àãðåãàòíûå òèïû: Èíäåêñèðóåìûé (array) ñòðóêòóðíûé (record) VERILOG Âèäû Òèïû Âèäû ïåðåìåííàÿ (variable) ñèãíàëi (signal) êîíñòàíòà (constant) reg ïåðåìåííàÿ nteger time real realtime Ïîäâèäû wire, wand wor, triand trior tri0,tri1 supply0, suppló cîáûòèå (event) integer,real ASCII ñòðîêà reg,time ñîåäèíåíèå (íåò) ñîáûòèå ïàðàìåòð (parameter) Èç âûøåïðèâåäåííîãî ñëåäóåò ÷òî åñëè, íàïðèìåð, â VHDL öåëûå (integer) ìîãóò áûòü êàê ïåðåìåííûìè (variable), òàê è ñèãíàëàìè (signal), òî â VERILOG öåëûìè ìîãóò áûòü òîëüêî ïåðåìåííûå. Çàòî ñîåäèíåíèÿ (öåïè) VERILOG ìîãóò áûòü íåñêîëüêèõ ïîäâèäîâ — îáû÷íûå (wire), ñõåìíîå È (Wand), ñõåìíîå ÈËÈ (Wor) è äð., íî íå ìîãóò áûòü âåùåñòâåííîãî òèïà (real). VHDL èìååò òðè êëàññà òèïîâ äàííûõ: ñêàëÿðíûå òèïû (÷èñëîâûå (öåëûå, ïëàâàþùèå), ôèçè÷åñêèå, ïåðå÷èñëèìûå); ñîñòàâíûå (àãðåãàòíûå) òèïû (èíäåêñèðóåìûå è ñòðóêòóðíûå); ññûëî÷íûå òèïû è ôàéëîâûå òèïû. Ïðèìåðû îáúÿâëåíèé òèïîâ VHDL: TYPE BYTE is range 0 to 255; — öåëûé òèï ñ äèàïàçîíîì çíà÷åíèé îò 0 äî 255 TYPE A is ('0', '1'); -- ïåðå÷èñëèìûé òèï ñî çíà÷åíèÿìè '0' è '1' VHDL âêëþ÷àåò ïðåäîïðåäåëåííûå (îáúÿâëåííûå â ïàêåòå STANDARD (ñì. ïðèëîæåíèå 1), ïîäêëþ÷åííîì ïî óìîë÷àíèþ) ïåðå÷èñëèìûå òèïû: bit, character, boolean, severyty_level, file_open_kind, file_open_status; öåëûé òèï integer, ïëàâàþùèé òèï real è ôèçè÷åñêèé òèï — time, èíäåêñèðóåìûå — string è bit_vector; ïîäòèïû öåëîãî òèïà: positive (>0) è natural (>=0). Ïðè ïîäêëþ÷åíèè ïàêåòà Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 29 STD_LOGIC_1164 ïîëüçîâàòåëþ ñòàíîâÿòñÿ äîñòóïíûìè ìíîãîçíà÷íûå òèïû std_logic è std_logic_vector, ÿâëÿþùèåñÿ ðàñøèðåíèÿìè äâóçíà÷íîãî bit-(«0»,«1») â äåâÿòèçíà÷íûé àëôàâèò, ðàññìàòðèâàåìûé â ñëåäóþùåé ãëàâå. VERILOG äàííûå âèäà ïåðåìåííûå è ñîåäèíåíèÿ, â ÷àñòíîñòè, äîïóñêàþò ñêàëÿðû è âåêòîðû (îäíîìåðíûå ìàññèâû) ìíîãîçíà÷íîãî òèïà (çíà÷åíèÿ ðàçðÿäa 0, 1, x, z). Íàä âèäîì ïåðåìåííûå (òèïû reg, integer è ò. ï.) îïðåäåëåí, â ÷àñòíîñòè, îïåðàòîð ïðîöåäóðíîãî ïðèñâàèâàíèÿ (Procedural Assignment): áëîêèðóþùèé (blocking assignment) èìååò ñèìâîë = è íåáëîêèðóþùèé (Non blocking assignment) ñèìâîë <= . Íàä îáúåêòîì âèäà ñîåäèíåíèå (câÿçü — wire, wor è ò. ä.) îïðåäåëåí îïåðàòîð íåïðåðûâíîãî ïðèñâàèâàíèÿ (Continuous Assignment). Ïîäâèäû ñîåäèíåíèé, êàê óæå îòìå÷àëîñü, ñîîòâåòñòâóþò òèïè÷íûì ñõåìîòåõíè÷åñêèì ýëåìåíòàì: ìîíòàæíîå È (wand), ÈËÈ (wor), èñòî÷íèê ïèòàíèÿ (supply1, supply0) è ò. ä. Êðîìå òîãî, öåïÿì ìîæåò çàäàâàòüñÿ ðàçëè÷íàÿ ñèëà ñèãíàëà (ñì. ïðèëîæåíèå 2). Ïðèìåð wire A,B; assign A=B; Ïðèìåðû îáúÿâëåíèé äàííû: VHDL VERILOG signal E1,E2: bit; variable M2:bit; signal E13,E23:bit_vector(1 to 3); signal AII_2: integer; wire E1,E2; reg M2; reg [1:3 ] E13,E23; integer AII_2; Ïðèìå÷àíèÿ ñèãíàëû E1,E2 ïåðåìåííàÿ M2 òðåõáèòîâûe E13, E23 öåëûé AII_2 Äàííûå (îáúåêòû) âèäà ïåðåìåííàÿ — variable â VHDL àíàëîãè÷íû îáû÷íûì ïåðåìåííûì ÿçûêîâ ïðîãðàììèðîâàíèÿ. Îíè îïèñûâàþòñÿ è ëîêàëèçîâàíû â ïðåäåëàõ îïèñàíèé ïîäïðîãðàìì è áëîêîâ ïðîöåññîâ (ïîíÿòèå, ðàññìàòðèâàåìîå íèæå). Èì ìîæíî ñîïîñòàâèòü äàííûå ñîîòâåòñòâóþùåãî âèäà ÿçûêà VERILOG (äàííûå òèïîâ reg, integer, real, time ìîãóò áûòü â íåì òîëüêî ïåðåìåííûìè). Äàííûå âèäà ñîåäèíåíèå — (VERILOG) è âèäà ñèãíàë — signal (VHDL), êàê óæå îòìå÷àëîñü, ìîæíî ñîïîñòàâèòü ïðîâîäàì-ñèãíàëàì â ìîäåëè. Ìàññèâû äàííûõ: VHDL VERILOG type MA is array (0 to 10) of bit; signal A: MA; type MB is array (1 to 5) of bit_vector (2 to 6); variable B : MB; Ïðèìå÷àíèÿ reg A[0:10]; îäíîðàçðÿäíûé ìàññèâ À (âåêòîð) reg [2:6] B [1:5]; ìàññèâ ïÿòè áèòîâûõ âåêòîðîâ B Verilog-1995 äîïóñêàë òîëüêî îäíîìåðíûå ìàññèâû è òîëüêî äëÿ ïåðåìåííûõ (reg, integer, real, time) è èñêëþ÷àë ïðÿìîå îáðàùåíèå ê ðàçðÿäàì è ïîëÿì îòäåëüíûõ ñëîâ ìàññèâîâ — ïðèõîäèëîñü êîïèðîâàòü âñå ñëîâî ìàññèâà âî âñïîìîãàòåëüíóþ ïåðåìåííóþ, à çàòåì èç íåå èçâëåêàòü íóæíûé áèò èëè ïîëå. Verilog-2000 íå èìååò ýòîãî îãðàíè÷åíèÿ. Ïðèìåð Verilog-2000: reg [31:0] arr2 [0:25][0:15];// îáúÿâëåí äâóìåðíûé ìàññèâ arr2 wire [7:0] out2 = arr2[100][7][31:24]; // èç ìàññèâà arr2 èçâëåêàåòñÿ ïîëå 31:24 VERILOG ïîçâîëÿåò èñïîëüçîâàòü âåêòîðíûå äàííûå ñî çíàêîì, îáúÿâëÿÿ èõ ñ äîïîëíåíèåì signed. Àðèôìåòè÷åñêèå îïåðàöèè ó÷èòûâàþò ýòî. Ïðèìåð Verilog-2000: reg signed [6:0] F1; wire signed [8:7] B2 [0:10]; input signed [1:0] a;function signed [12:0] XX; 30 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà VHDL äîïóñêàåò àðèôìåòè÷åñêèå îïåðàöèè íàä äâîè÷íûìè è áóëåâñêèìè âåêòîðàìè òîëüêî ïðè ïîäêëþ÷åíèè ñïåöèàëüíûõ ïàêåòîâ (ñì. ïðèëîæåíèå 1). Îáúÿâëåíèÿ äàííûõ — îáëàñòü ðàñïîëîæåíèÿ Êàê ïðàâèëî, îáúÿâëåíèÿ äàííûõ äîëæíû ïðåäøåñòâîâàòü èõ èñïîëüçîâàíèþ.  VHDL îáúÿâëåíèÿ ðàñïîëàãàþòñÿ ìåæäó çàãîëîâêîì áëîêà (architecture, process, block, function, procedure, package) è êëþ÷åâûì ñëîâîì begin.  VERILOG ìåñòîïîëîæåíèå îïèñàíèé êîíòðîëèðóåòñÿ íå òàê ñòðîãî, íî îïèñàíèÿ äîëæíû ïðåäøåñòâîâàòü èñïîëüçîâàíèþ äàííûõ. Hà÷àëüíûå çíà÷åíèÿ äàííûõ Ïåðå÷èñëèìûå òèïû äàííûõ VHDL ïî óìîë÷àíèþ ïðèíèìàþò ïåðâîå èç óêàçàííûõ â îïèñàíèè òèïà çíà÷åíèé. VHDL VERILOG boolean- FALSE,bit-'0', std_logic-'U' reg è wire- 1'bx Oäíàêî ìîæíî ÿâíî óêàçàòü íà÷àëüíîå çíà÷åíèå â îïèñàíèè äàííûõ: signal A: bit :='1'; reg A=1'b1;// VERILOG-2000 Ïðåîáðàçîâàíèå òèïîâ äàííûõ  VHDL äëÿ ñòàíäàðòíûõ ÷èñëîâûõ òèïîâ integer, real ýòî äîñòèãàåòñÿ óêàçàíèåì òèïà ïåðåä àðãóìåíòîì â ñêîáêàõ, äëÿ ñòðîêîâîãî òèïà — óêàçàíèåì òèïà è àòðèáóòà «image» èëè «value», ïðè ïîäêëþ÷åíèè ïàêåòîâ — óêàçàíèåì âêëþ÷åííûõ â íèõ ôóíêöèé ïðåîáðàçîâàíèÿ (ñì. ãëàâó 2 è ïðèëîæåíèå 1). Äëÿ îñòàëüíûõ ïðåîáðàçîâàíèé íåîáõîäèìî èñïîëüçîâàòü ñïåöèàëüíûå ôóíêöèè, ñì., íàïðèìåð, îïèñàíèå ïàìÿòè â ãëàâå 3. Ïðèìåð: ïðåîáðàçîâàíèe ñòðîêè â öåëûé — integer'value("314") — äàåò 314; ïðåîáðàçîâàíèe öåëîãî â ñòðîêó — integer'image(314) — äàåò "314"; ïðåîáðàçîâàíèe âåùåñòâåííîãî â öåëîå — integer(3.14) — äàåò 3;  VERILOG ïðåîáðàçîâàíèÿ îñóùåñòâëÿþòñÿ ôóíêöèÿìè §realtobits(x) — âåùåñòâåííîå â âåêòîð è §bitstoreal(x) — íàîáîðîò. Äàííûå, îáúÿâëÿåìûå ïî óìîë÷àíèþ VHDL, êàê ñòðîãî òèïèçèðîâàííûé ÿçûê, ïîäðàçóìåâàåò, ÷òî âñå äàííûå äîëæíû áûòü îáúÿâëåíû. Ëèøü íåîáúÿâëåííûé ïàðàìåòð öèêëà âîñïðèíèìàåòñÿ êàê integer. VERILOG íå ñòîëü ñòðîã. Íàïðèìåð, â VERILOG íåîáúÿâëåííûé èäåíòèôèêàòîð â ëåâîé ÷àñòè îïåðàòîðà íåïðåðûâíîãî ïðèñâàèâàíèÿ â ðÿäå ñëó÷àåâ ïîäðàçóìåâàåòñÿ îáúÿâëåííûì êàê wire ñ äëèíîé, ðàâíîé äëèíå ïðàâîé ÷àñòè. Ýòî ìîæåò ïðèâîäèòü ê íåîæèäàííûì îøèáêàì. Òèïû è ïîäòèïû äàííûõ, îïðåäåëÿåìûõ ïîëüçîâàòåëåì (VHDL) ßçûê VHDL ïîçâîëÿåò ââîäèòü íîâûå òèïû äàííûõ. Ïðèìåð îáúÿâëåíèÿ è èñïîëüçîâàíèÿ íîâîãî òèïà: TYPE mem IS ARRAY (0 TO 1023) OF BIT_VECTOR(31 DOWNTO 0); (ìàññèâ 1024 32-áèòîâûõ âåêòîðîâ) Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 31 Ïðèìåð åãî èñïîëüçîâàíèÿ: variable RAM: mem; Ïðèìåð îáúÿâëåíèÿ òèïà BIT_VECTOR — âåêòîð íåîïðåäåëåííîé äëèíû, âçÿòûé èç ñòàíäàðòíîãî ïàêåòà STANDARD (cì. ïðèëîæåíèå 1). type bit_vector is array(NATURAL range <>) of BIT; -- èíäåêñû îò 0 è âûøå Ïîäòèï (subtype) ïîçâîëÿåò ââîäèòü îáúåêòû, îáëàñòü çíà÷åíèé êîòîðûõ ÿâëÿåòñÿ ïîäìíîæåñòâîì áàçîâîãî òèïà è êîòîðûå ìîãóò èìåòü àññîöèèðîâàííóþ ñ íèìè ðàçðåøàþùóþ ôóíêöèþ (ñì. ãë. 2 è ïðèëîæåíèå 1). Ïðèìåð: subtype byte is bit_vector(7 downto 0);signal A:byte; 1.2.3. Îïåðàöèè è âûðàæåíèÿ 1.2.3.1. Îïåðàöèè Ïîìèìî îáùåïðèíÿòûõ àðèôìåòè÷åñêèõ îïåðàöèé (+, -, *,/) è îïåðàöèé îòíîøåíèÿ, â HDL ââåäåíî áîëüøîå ÷èñëî ëîãè÷åñêèõ îïåðàöèé. Íèæå ïðèâåäåíû ïðèìåðû òîëüêî ðÿäà èç íèõ. Îñîáåííîñòè îïåðàöèé â ìíîãîçíà÷íîì àëôàâèòå ïîÿñíÿþòñÿ â ñëåäóþùåé ãëàâå. Ðåçóëüòàò VERILOG-îïåðàöèé èíîãäà ïðèâîäèòñÿ â òîé æå ñòðîêå òàáëèöû â ñêîáêàõ. Ïðèìåðû: Îïåðàöèÿ Ïðèìåð VHDL VERILOG Ðåçóëüòàò Àðèôìåòè÷åñêèå îïåðàöèè (íàä öåëûìè è âåùåñòâåííûìè — VHDL, âñåìè òèïàìè — VERILOG) Ñëîæåíèå 2+3 2+3 5 Âû÷èòàíèå 2-3 2-3 -1 Óìíîæåíèå 2*3 2*3 6 Äåëåíèå öåë. 2/3 2/3 0 Ìîäóëü 2 mod 3 2%3 2 Îñòàòîê -2 rem 3 — -2 Àáñîëþòíîå abs (-1) Ñòåïåíü (VERILOG-2000) 2 ** 3 1 — 8 Óíàðíûå àðèôìåòè÷åñêèå Ïëþñ +1 +1 1 Ìèíóñ -1 -1 -1 - 4'b1011 4'b0101 Ìèíóñ Ïðè ðàáîòå ñ VERILOG ñëåäóåò îáðàòèòü âíèìàíèå íà ñïîñîá ïðåäñòàâëåíèÿ îòðèöàòåëüíûõ ÷èñåë: èñïîëüçóåòñÿ äîïîëíèòåëüíûé êîä (äîïîëíåíèå äî 2). Íàïðèìåð, â integer i;initial i=-12; çíà÷åíèå -12 ïðåäñòàâëåíî êàê fffffff4 â øåñòíàäöàòåðè÷íîì êîäå (äîïîëíèòåëüíûé êîä), è åñëè ïðèñâîèòü i, íàïðèìåð, â 16-ðàçðÿäíóþ ïåðåìåííóþ reg [15:0] D; D=i; òî â D áóäåò øåñòíàäöàòåðè÷íûé êîä fff4. 32 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà Ïðèìåð Îïåðàöèÿ VHDL VERILOG Ðåçóëüòàò Ëîãè÷åñêèå îïåðàöèè íàä áóëåâñêèìè (Boolean) (VHDL) È ÈËÈ HE ÒRUE AND FALSE — FALSE ÒRUE OR FALSE — TRUE NOT TRUE — FALSE Ïîðàçðÿäíûå ëîãè÷åñêèå îïåðàöèè íàä äâîè÷íûìè (bit) è (bit_vector) âåêòîðàìè VHDL è ðàçëè÷íûìè òèïàìè ïåðåìåííûõ è öåïåé VERILOG Ïîðàçðÿäíîå È Ïîðàçðÿäíîå ÈËÈ Îòðèöàíèå Èñêëþ÷àþùåå ÈËÈ Ïîðàçðÿäíàÿ èíâåðñèÿ B"1011" AND B"0010" 4'b1011 & 4'b0010 B"0010"(4'b0010) B"1011" OR B"0010" 4'b1011 | 4'b0010 B"1011"(4'b1011) not B"1011" ~ 4'b1011 B"0100"(4'b0100) B"1011" XOR B"0010" 4'b1011 ^ 4'b0010 B"1001"(4'b1001) NOT B"0010" ~4b0010 B"1101"(4'b1101) Ëîãè÷åñêèå îïåðàöèè (VERILOG) äàþò 1-áèòîâûé ðåçóëüòàò Ëîãè÷åñêîå È — 4'b1011 && 4'b0010 1'b1 && 1'b0 1'b1 Ëîãè÷åñêîå ÈËÈ — 4'b1011 || 4'b0010 1'b1 || 1'b0 1'b1 Ëîãè÷åñêîå îòðèöàíèå — ! 4'b1011 1'b0 Íåêîòîðûå èç óíàðíûõ îïåðàöèé ðåäóêöèè íàä n-ðàçðÿäíûìè äàííûìè (VERILOG) È âñåõ ðàçðÿäîâ — &4'b1101 1'b0 ÈËÈ âñåõ ðàçðÿäîâ — | 4'b1101 1'b1 Îïåðàöèè îòíîøåíèÿ (íàä ÷èñëàìè è ñòðîêàìè) Ðàâåíñòâî Ðàâåíñòâî ÷èñåë B"1011" = "0010" 4'b1011 == 4'b0010 FALSE (1'b0) 5=6 5 == 6 FALSE Íåðàâåíñòâî B"1011" /= B"0010" 4'b1011 != 4'b0010 TRUE (1'b1) Áîëüøå B"1011" > B"0010" 4'b1011 > 4'b0010 TRUE (1'b1) Ìåíüøå B"1011" < B"0010" 4'b1011 < 4'b0010 FALSE (1'b0) Áîëüøå-ðàâíî B"1011" >= B"0010" 4'b1011 >= 4'b0010 TRUE (1'b1) Ìåíüøå-ðàâíî 5 <= 5 5 <= 5 TRUE (1'b1) Èäåíòè÷íîñòü (VERILOG) Èäåíòè÷íîñòü — 4'b1011 === 4'b0010 1'b0 (FALSE) Íåèäåíòè÷íîñòü — 4'b1011 !== 4'b0010 1'b1 (TRUE) Ðàçëè÷èå VERILOG-îïåðàöèé îòíîøåíèÿ è èäåíòè÷íîñòè çàìåòíî â ìíîãîçíà÷íîì àëôàâèòå. Ïðèìåð: Îïåðàöèÿ 4'd1xx0 != 4'd1011 äàåò ðåçóëüòàò 1'bx, ÷òî, íàïðèìåð, îçíà÷àåò FALSE äëÿ óñëîâèÿ â îïåðàòîðå if, à îïåðàöèÿ 4'd1xx0 !== 4'd1011 äàåò ðåçóëüòàò 1'b1, ò. å. TRUE. Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà Îïåðàöèÿ 33 Ïðèìåð VHDL VERILOG Ðåçóëüòàò Ëîãè÷åñêèå ñäâèãè (â ïðèìåðàõ íà 2) Ñäâèã âëåâî B"1011" SLL 2 4'b1011 << 2 "0010" (4'b1100) Ñäâèã âïðàâî B"1011" SRL 2 4'b1011 >> 2 "0010" (4'b0010) Àðèôìåòè÷åñêèå ñäâèãè (VHDL) Ñäâèã âëåâî B"1011" SLA 2 — "1111" Ñäâèã âïðàâî B"1011" SRA 2 — "1110" Öèêëè÷åñêèå ñäâèãè (VHDL) Ñäâèã âëåâî B"1011" ROL 2 — "1110" Ñäâèã âïðàâî B"1011" ROR 2 — "1110" "100" &"11" {3'b100,2'b11} "10011" (5'b10011) — {2{2'b01}} 6'b010101 Ðàçíûå îïåðàöèè Êîíêàòåíàöèÿ (ñöåïëåíèå) Ðåïëèêà-ïîâòîð Ïðèîðèòåò îïåðàöèé — êàê è â îáû÷íûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ — íàèáîëüøèé ó óíàðíûõ, íî âî èçáåæàíèå îøèáîê ëó÷øå ïîëüçîâàòüñÿ ñêîáêàìè äëÿ óêàçàíèÿ ïîðÿäêà âû÷èñëåíèé. Ïðèìåð: ( ( (à+b)*c )> (m-n)). 1.2.3.2. Âûðàæåíèÿ Îáû÷íûå âûðàæåíèÿ ñòðîÿòñÿ èç êîíñòàíò, èìåí, îïåðàöèé è ñêîáîê. Ïðèìåð: VHDL (F+H)* (C-D) VERILOG (F+H)* (C-D) VHDL ñòðîãî êîíòðîëèðóåò òèïû äàííûõ, îïåðàöèé è äëèíû îïåðàíäîâ (âåêòîðîâ) â âûðàæåíèÿõ, íàïðèìåð çàïðåùåíî ñëîæåíèå 2+'1', åñëè íå ïîäêëþ÷åí ñîîòâåòñòâóþùèé ïàêåò (ñì. ïðèëîæåíèå 1). VERILOG íå ñòîëü ñòðîã, äîïóñêàÿ âûðàæåíèÿ âðîäå 2+1'b1+"A". Âûðàæåíèÿ ñ ïîëÿìè âåêòîðîâ è ìàññèâîâ. VERILOG íå äîïóñêàåò ðàáîòó ñ ïîëÿìè ïåðåìåííîé äëèíû. Îäíàêî åãî âåðñèÿ VERILOG-2000 ïîçâîëÿåò èñïîëüçîâàòü ïåðåìåííûå èíäåêñû ïîëåé ôèêñèðîâàííîé äëèíû. Ïðèìåð: VHDL VERILOG variable A:bit_vector(32 downto 0); reg [32:0] A; variable B,k,nI,j:integer reg [3:0] B; variable C bit_vector(7 downto 0) wire [7:0] C; C<=A((B+1)*8 downto B*8); assign Ñ=A[B*8 +: 8];//VER-2000 Ñ(K downto N)<=A(I downto J); -- ýòî âîçìîæíî â VHDL, à VERILOG ïîäîáíîå ïîëå ïåðåìåííîé äëèíû íå äîïóñêàåò. Ïîìèìî îáû÷íûõ âûðàæåíèé äîïóñêàþòñÿ çàäåðæàííûå. Çàäåðæàííîå âûðàæåíèå èñïîëüçóåòñÿ â îïåðàòîðàõ ïðèñâàèâàíèÿ (â VHDL — ýòî îïåðàòîð íàçíà÷åíèÿ ñèãíàëó, VERILOG — ïðèñâàèâàíèÿ ïåðåìåííîé) è ÿâëÿåòñÿ åãî ÷àñòüþ. Ñíà÷àëà îíî âû÷èñëÿåòñÿ è ÷åðåç âðåìÿ çàäåðæêè ïðèñâàèâàåòñÿ). 34 Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà Ïðèìåð: VHDL VERILOG S<= A+B after TD; S<=#(TD) A+B; Ïîäðîáíåå âîïðîñû çàäåðæåê ðàññìîòðåíû â ãëàâå 2. VHDL ïîçâîëÿåò íàçíà÷àòü âðåìåííûå äèàãðàììû ñèãíàëîâ. Ïðèìåð: S<= 10 after 2 ns, 40 after 10 ns, 2 after 20 ns; VERILOG äîïóñêàåò òàêæå óñëîâíûå âûðàæåíèÿ — èõ çíà÷åíèå îïðåäåëÿåòñÿ óñëîâèåì, íàïðèìåð, âûðàæåíèå (A>B) ? 3'b100:3'b111 äàåò ðåçóëüòàò 3'b100, åñëè A > B èñòèííî, ò. å. ðàâíî 1'b1. Ïðèìåð âëîæåííûõ óñëîâíûõ âûðàæåíèé: x=(a>b)? c: (v && L)?d-1: 0; 1.2.4. Îïåðàòîðû HDL îáåñïå÷èâàåò âîçìîæíîñòü îïèñàíèÿ îáû÷íûõ ïîñëåäîâàòåëüíûõ àëãîðèòìîâ. Ïîñëåäîâàòåëüíî âûïîëíÿåìûå (ïîñëåäîâàòåëüíûå) îïåðàòîðû HDL ìîãóò èñïîëüçîâàòüñÿ â îïèñàíèÿõ ïðîöåññîâ, ïðîöåäóð è ôóíêöèé. Èõ ñîñòàâ âêëþ÷àåò (ñì. ïðèëîæåíèÿ 1, 2) ñëåäóþùèå îïåðàòîðû: Îïåðàòîð Ïðèìåð VHDL Ïðèìåð VERILOG 1. Îæèäàíèÿ óñëîâèÿ çàäåðæêè ñîáûòèÿ wait until À1=Â1; wait for 10 ns; wait on A,B; wait À1==B1; #10; @( A or B); HDL ñîäåðæèò ñðåäñòâà îïèñàíèÿ îæèäàíèÿ ïðîöåññàìè îïðåäåëåííîãî òèïà ñîáûòèé — ôðîíòîâ ñèãíàëîâ: îæèäàíèå ôðîíòà Ñ: îæèäàíèå ñðåçà Ñ: wait until C'event and C='1'; wait until C'event and C='0'; @posedge(Ñ) ; @negedge(C); Èõ èñïîëüçîâàíèå áóäåò ðàññìîòðåíî â äðóãèõ ãëàâàõ. VHDL-îïåðàòîð îæèäàíèÿ ïîçâîëÿåò îáúåäèíÿòü âñå òðè òèïà óñëîâèé. Ïðèìåð: wait on a until d>f for 19 ns;--ïîñëå ñîáûòèÿ â à æäàòü ïîêà ñòàíåò èñòèííî d>f è ïîòîì åùå 19 ns. VERILOG äîïóñêàåò îòñóòñòâèå ñèìâîëà «;» ïîñëå îïåðàòîðà îæèäàíèÿ — òîãäà îí ñòàíîâèòñÿ óñëîâèåì çàïóñêà ñëåäóþùåãî îïåðàòîðà. Ïðèìåð: @(a) wait( d>f); #19;//òàê âûãëÿäèò ïðåäûäóùèé ïðèìåð 2. Îïåðàòîð ïðèñâàèâàíèÿ ïåðåìåííîé (VHDL), ïðîöåäóðíîãî áëîêèðóþùåãî ïðèñâàèâàíèÿ (VERILOG) ïåðåìåííîé 3. Ïîñëåäîâàòåëüíûé îïåðàòîð íàçíà÷åíèÿ ñèãíàëà (VHDL) ïðîöåäóðíîãî íåáëîêèðóþùåãî ïðèñâàèâàíèÿ (VERILOG) ïåðåìåííîé V := V1+V2; --variable V V = V1+V2; // reg V --signal S S1<=S2; //reg S S1<=S2; Ãëàâà 1. HDL — âçãëÿä ñõåìîòåõíèêà è ïðîãðàììèñòà 35 4. Óñëîâíûé îïåðàòîð if A=B then S1<=S2; end if; if (A==B) S1<=S2; 5. Îïåðàòîð âûáîðà case S is when A => B:=Y; when D=>B:=notY; when others=>B:='1'; end case; case (S) A: B=Y; D: B=~Y default:B=1; endcase 6. Îïåðàòîð öèêëà for i in 1 to 4 loop M(i):=0; end loop; while A<B loop A:=A+1; end loop; for (i=1;i<=4;i=i+1) M[i]=0; while A<B A=A+1; 7. Îïåðàòîð âîçâðàòà return F; 8. Îïåðàòîð âûçîâà ïðîöåäóðû //íåò àíàëîãà P(X1,X2); 9. Îïåðàòîð âûõîäà èç öèêëà (VHDL), èç ãðóïïû îïåðàòîðîâ (VERILOG) P(X1,X2); exit; 10. Îïåðàòîð ïåðåõîäà ê ñëåäóþùåé èòåðàöèè â öèêëå disable GG; next; //íåò àíàëîãà 11. Îïåðàòîð âûâîäà report "A=B"; $display ("A=B"); 12. Ïóñòîé îïåðàòîð null; //íåò àíàëîãà 13. Ïîñëåäîâàòåëüíûé îïåðàòîð óòâåðæäåíèÿ assert A=B report "XOXO"; //íåò àíàëîãà Íèæå äåòàëüíåå ðàññìîòðåíû òîëüêî íåêîòîðûå èç íèõ (ïîäðîáíåå ñì. ïðèëîæåíèÿ 1, 2). 1. Îáû÷íîå äëÿ ÿçûêîâ ïðîãðàììèðîâàíèÿ ïðèñâàèâàíèå VHDL VERILOG îïåðàòîð ïðèñâàèâàíèÿ ïåðåìåííîé îïåðàòîð áëîêèðóþùåãî ïðîöåäóðíîãî ïðèñâàèâàíèÿ ïåðåìåííîé = := Ïðèìåðû: VHDL variable X1,X2: bit; X1 := '1'; X2 := X1; VERILOG reg X1,X2; X1 = 1'b1; X2 = X1; Ïðèìå÷àíèÿ X1 ïðèñâàèâàåòñÿ 1 ïîñëå ýòîãî â X2 ïðèñâàèâàåòñÿ 1;