МИРОВАЯ ЭЛЕКТРОНИКА
В. Б. Стешенко
С Е Р И Я
ПЛИС фирмы ALTERA: элементная база, система проектирования и языки описания аппаратуры
3е издание, стереотипное
Москва Издательский дом «ДодэкаXXI» 2007
—1—
УДК 621.3.049.77 ББК 32.84402 C79
C79
Стешенко В.Б. ПЛИС фирмы Altera: элементная база, система проектирова ния и языки описания аппаратуры. — М.: Издательский дом «ДодэкаXXI», 2007. — 576 с. ISBN 9785941201129 В книге рассмотрены вопросы практического применения ПЛИС фирмы «Altera» при разработке цифровых устройств. Приведены крат кие сведения об особенностях архитектуры и временных параметрах устройств. Рассмотрены САПР MAX+PLUS II и Quartus, языки описания аппаратуры AHDL, VHDL, VERILOG HDL. Приводятся примеры описания цифровых устройств на языках высокого уровня, а также примеры реа лизации некоторых алгоритмов. Приведены сведения о современных интерфейсах передачи данных, даны рекомендации по разработке пе чатных плат. Цель книги — помочь начинающему разработчику в выборе эле ментной базы и дать представление о технологии проектирования уст ройств на ПЛИС.
УДК 621.3.049.77 ББК 32.84402
ISBN 9785941201129
© Стешенко В.Б., текст © Издательский дом «ДодэкаXXI», 2002 ® Серия «Мировая электроника»
Все права защищены. Никакая часть этого издания не может быть воспроизведена в любой форме или любыми средствами, электронными или механическими, включая фотографирова ние, ксерокопирование или иные средства копирования или сохранения информации, без письменного разрешения издательства.
ÏÐ Å Ä È Ñ Ë Î Â È Å
Ïðîãðàììèðóåìûå ëîãè÷åñêèå èíòåãðàëüíûå ñõåìû (ÏËÈÑ) óäîáíàÿ â îñâîåíèè è ïðèìåíåíèè ýëåìåíòíàÿ áàçà, àëüòåðíàòèâû êîòîðîé çà÷àñòóþ íå íàéòè. Ñòðóêòóðíî êíèãà ðàçáèòà íà ñåìü ãëàâ è òðè ïðèëîæåíèÿ.  ãëàâå 1 äàåòñÿ îáçîð ïåðñïåêòèâíûõ ñåìåéñòâ ÏËÈÑ ôèðìû «Altera» è êðàòêèå ñâåäåíèÿ îá îñîáåííîñòÿõ èõ àðõèòåêòóðû è âðåìåííûõ ïàðàìåòðàõ óñòðîéñòâ.  ãëàâå 2 ðàññìîòðåíà ÑÀÏÐ MAX+PLUS II. Ãëàâà 3 ïîñâÿùåíà ÿçûêó îïèñàíèÿ àïïàðàòóðû AHDL. ßçûê îïèñàíèÿ àïïàðàòóðû VHDL ðàññìîòðåí â ãëàâå 4, à àïïàðàòóðû VERILOG HDL â ãëàâå 5.  ãëàâå 6 ïðèâîäÿòñÿ ïðèìåðû îïèñàíèÿ öèôðîâûõ óñòðîéñòâ íà ÿçûêàõ âûñîêîãî óðîâíÿ.  ãëàâå 7 ïðèâåäåíû ïðèìåðû ðåàëèçàöèè íåêîòîðûõ àëãîðèòìîâ.  ïðèëîæåíèè 1 ðàññìîòðåíû îñîáåííîñòè ÑÀÏÐ Quartus.  ïðèëîæåíèè 2 ñîâðåìåííûå èíòåðôåéñû ïåðåäà÷è äàííûõ.  ïðèëîæåíèè 3 äàíû ðåêîìåíäàöèè ïî ðàçðàáîòêå ïå÷àòíûõ ïëàò. Ñëåäóåò çàìåòèòü, ÷òî êíèãà íè â êîåé ìåðå íå ïîäìåíÿåò ñîáîé ôèðìåííóþ äîêóìåíòàöèþ, áåç êîòîðîé ïðîåêòèðîâàíèå óñòðîéñòâ ïðîñòî íåâîçìîæíî. Åå öåëü ïîìî÷ü íà÷èíàþùåìó ðàçðàáîò÷èêó â âûáîðå ýëåìåíòíîé áàçû è äàòü ïðåäñòàâëåíèå î òåõíîëîãèè ïðîåêòèðîâàíèÿ óñòðîéñòâ íà ÏËÈÑ. Àâòîð âûðàæàåò îãðîìíóþ áëàãîäàðíîñòü ôèðìå «Ãàììà» è ëè÷íî åå äèðåêòîðó Ì.À. Kóçíå÷åíêîâó çà îñóùåñòâëåíèå èçäàíèÿ. Àâòîð òàêæå áëàãîäàðèò ñîòðóäíèêîâ ôèðìû «Ãàììà» Ñ.Í. Øèïóëèíà, È.Ã. Àëåêñååâà, À.À. Kóëàêîâà è çàì. äèðåêòîðà öåíòðà «Ëîãè÷åñêèå ñèñòåìû» Â.Þ. Õðàïîâà çà ïðåäîñòàâëåííîå ïðîãðàììíîå îáåñïå÷åíèå è èíôîðìàöèþ.
3
Ïðåäèñëîâèå Àâòîð áëàãîäàðèò ðåäàêòîðîâ Èçäàòåëüñêîãî äîìà «Äîäýêà-XXI» çà ÷óòêîå è âíèìàòåëüíîå îòíîøåíèå ê ðóêîïèñè. Îãðîìíûé âêëàä â ðàáîòó íàä êíèãîé âíåñëè ê.ò.í. äîöåíò Ä.À. Ãóáàíîâ, àñïèðàíò Þ.Ì. Ñåäÿêèí, ñòóäåíòû À.Â. Ñàìîõèí, Ã.Â. Øèøêèí, èíæåíåðû Í.Í. Àíèùåíêî, À.Â. Åâñòèôååâ, Ð.Á. Ãàâðèëîâ è äð., êîòîðûì àâòîð âûðàæàåò èñêðåííþþ áëàãîäàðíîñòü.  æóðíàëå Chip News (Íîâîñòè î ìèêðîñõåìàõ) áûë îïóáëèêîâàí öèêë ñòàòåé «Øêîëà ðàçðàáîòêè àïïàðàòóðû öèôðîâîé îáðàáîòêè ñèãíàëîâ íà ÏËÈÑ», ñòàâøèõ îñíîâîé êíèãè. Àâòîð ïðèçíàòåëåí ãëàâíîìó ðåäàêòîðó æóðíàëà À.Ã. Áèëåíêî è íàó÷íîìó ðåäàêòîðó À.À. Îñèïîâó çà ïîëåçíûå äèñêóññèè, ñïîñîáñòâîâàâøèå ïîÿâëåíèþ êíèãè. Íàêîíåö, ðàáîòà íàä êíèãîé áûëà áû â ïðèíöèïå íåâîçìîæíà áåç ïîääåðæêè è òåðïåíèÿ ñåìüè. Àâòîð íàäååòñÿ, ÷òî êíèãà íàéäåò ïîíèìàíèå ó ÷èòàòåëÿ, è áóäåò ïðèçíàòåëåí çà âñå îòêëèêè, êîòîðûå ìîæíî ïðèñûëàòü ïî àäðåñó: 107005, Ìîñêâà, 2-ÿ Áàóìàíñêàÿ óëèöà, ä. 5. Kàôåäðà ÑÌ-5 «Àâòîíîìíûå èíôîðìàöèîííûå è óïðàâëÿþùèå ñèñòåìû» ÌÃÒÓ èì. Í.Ý. Áàóìàíà. E-mail:
[email protected]
4
Ñ ÎÄ Å Ð Æ À Í È Å
ÂÂÅÄÅÍÈÅ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 ÃËÀÂÀ 1. ÝËÅÌÅÍÒÍÀß ÁÀÇÀ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.1. Ñåìåéñòâî MAX3000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.2. Ñåìåéñòâî FLEX6000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1.3. Ñåìåéñòâî MAX7000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.4. Ñåìåéñòâî FLEX8000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 1.5. Ñåìåéñòâî MAX9000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 1.6. Ñåìåéñòâî FLEX10K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 1.7. Ñåìåéñòâî APEX20K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 1.8. Ñåìåéñòâî Mercury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 1.9. Ñåìåéñòâî ACEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 1.10. Kîíôèãóðàöèîííûå ÏÇÓ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 1.11. Ïðîãðàììèðîâàíèå è ðåêîíôèãóðèðîâàíèå â ñèñòåìå . . . . . . . . . 110 ÃËÀÂÀ 2. ÑÈÑÒÅÌÀ ÏÐÎÅÊÒÈÐÎÂÀÍÈß MAX+PLUS II . . . . . . 115 2.1. 2.2. 2.3. 2.4. 2.5.
Îáùèå ñâåäåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Ïðîöåäóðà ðàçðàáîòêè ïðîåêòà . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Ðåäàêòîðû MAX PLUS II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Ïðîöåññ êîìïèëÿöèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Âåðèôèêàöèÿ ïðîåêòà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
ÃËÀÂÀ 3. ßÇÛÊ ÎÏÈÑÀÍÈß ÀÏÏÀÐÀÒÓÐÛ AHDL . . . . . . . . . . 167 3.1. Îáùèå ñâåäåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 3.2. Èñïîëüçîâàíèå ÷èñåë è êîíñòàíò â ÿçûêå AHDL . . . . . . . . . . . . . 171 3.2.1. Èñïîëüçîâàíèå ÷èñåë . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 3.2.2. Èñïîëüçîâàíèå êîíñòàíò . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 3.3. Kîìáèíàöèîííàÿ ëîãèêà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
5
Ñîäåðæàíèå
3.4.
3.5.
3.6.
3.7.
3.8.
3.3.1. Ðåàëèçàöèÿ áóëåâûõ âûðàæåíèé è óðàâíåíèé . . . . . . . . . . 172 3.3.2. Îáúÿâëåíèå NODE (óçåë) . . . . . . . . . . . . . . . . . . . . . . . . . . 173 3.3.3. Îïðåäåëåíèå ãðóïï . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 3.3.4. Ðåàëèçàöèÿ óñëîâíîé ëîãèêè . . . . . . . . . . . . . . . . . . . . . . . 174 3.3.5. Îïèñàíèå äåøèôðàòîðîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 3.3.6. Èñïîëüçîâàíèå äëÿ ïåðåìåííûõ çíà÷åíèé ïî óìîë÷àíèþ . . . 180 3.3.7. Ðåàëèçàöèÿ ëîãèêè ñ àêòèâíûì íèçêèì óðîâíåì . . . . . . . . 182 3.3.8. Ðåàëèçàöèÿ äâóíàïðàâëåííûõ âûâîäîâ . . . . . . . . . . . . . . . . 183 Ïîñëåäîâàòåëüíîñòíàÿ ëîãèêà . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 3.4.1. Îáúÿâëåíèå ðåãèñòðîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 3.4.2. Îáúÿâëåíèå ðåãèñòðîâûõ âûõîäîâ . . . . . . . . . . . . . . . . . . . 186 3.4.3. Ñîçäàíèå ñ÷åò÷èêîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Öèôðîâûå àâòîìàòû ñ ïàìÿòüþ (state mashine) . . . . . . . . . . . . . . . 187 3.5.1. Ðåàëèçàöèÿ öèôðîâûõ àâòîìàòîâ (state machine) . . . . . . . . 188 3.5.2. Óñòàíîâêà ñèãíàëîâ Clock, Reset è Enable . . . . . . . . . . . . . 189 3.5.3. Çàäàíèå âûõîäíûõ çíà÷åíèé äëÿ ñîñòîÿíèé . . . . . . . . . . . . 189 3.5.4. Çàäàíèå ïåðåõîäîâ ìåæäó ñîñòîÿíèÿìè . . . . . . . . . . . . . . . 190 3.5.5. Ïðèñâîåíèå áèòîâ è çíà÷åíèé â öèôðîâîì àâòîìàòå . . . . . 190 3.5.6. Öèôðîâûå àâòîìàòû ñ ñèíõðîííûìè âûõîäàìè . . . . . . . . . 191 3.5.7. Öèôðîâûå àâòîìàòû ñ àñèíõðîííûìè âûõîäàìè . . . . . . . . 193 3.5.8. Âîññòàíîâëåíèå ïîñëå íåïðàâèëüíûõ ñîñòîÿíèé . . . . . . . . 194 Ðåàëèçàöèÿ èåðàðõè÷åñêîãî ïðîåêòà . . . . . . . . . . . . . . . . . . . . . . . 196 3.6.1. Èñïîëüçîâàíèå ìàêðîôóíêöèé ñèñòåìû MAX+PLUS II ôèðìû «Altera» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 3.6.2. Ñîçäàíèå è ïðèìåíåíèå ïîëüçîâàòåëüñêèõ ìàêðîôóíêöèé . . 199 3.6.3. Îïðåäåëåíèå ïîëüçîâàòåëüñêîé ìàêðîôóíêöèè . . . . . . . . . 199 3.6.4. Èìïîðò è ýêñïîðò öèôðîâûõ àâòîìàòîâ (state machine) . . . 201 Óïðàâëåíèå ñèíòåçîì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 3.7.1. Ðåàëèçàöèÿ ïðèìèòèâîâ LCELL è SOFT . . . . . . . . . . . . . . 203 3.7.2. Çíà÷åíèÿ êîíñòàíò ïî óìîë÷àíèþ . . . . . . . . . . . . . . . . . . . . 205 3.7.3. Ïðèñâîåíèå áèòîâ è çíà÷åíèé â öèôðîâîì ôîðìàòå . . . . . 205 Ýëåìåíòû ÿçûêà AHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 3.8.1. Çàðåçåðâèðîâàííûå êëþ÷åâûå ñëîâà . . . . . . . . . . . . . . . . . . 205 3.8.2. Ñèìâîëû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 3.8.3. Èìåíà â êàâû÷êàõ è áåç êàâû÷åê . . . . . . . . . . . . . . . . . . . . 208 3.8.4. Ãðóïïû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 3.8.5. ×èñëà â ÿçûêå AHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 3.8.6. Áóëåâû âûðàæåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 3.8.7. Ëîãè÷åñêèå îïåðàòîðû . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 3.8.8. Âûðàæåíèÿ ñ îïåðàòîðîì NOT . . . . . . . . . . . . . . . . . . . . . . 213
6
Ñîäåðæàíèå 3.8.9. Âûðàæåíèÿ ñ îïåðàòîðàìè AND, NAND, OR, XOR, & XNOR . . . . . . . . . . . . . . . . . . . 213 3.8.10.Àðèôìåòè÷åñêèå îïåðàòîðû . . . . . . . . . . . . . . . . . . . . . . . . 214 3.8.11. Kîìïàðàòîðû (îïåðàòîðû ñðàâíåíèÿ) . . . . . . . . . . . . . . . . . 215 3.8.12.Ïðèîðèòåòû â áóëåâûõ óðàâíåíèÿõ . . . . . . . . . . . . . . . . . . 216 3.8.13.Ïðèìèòèâû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 3.8.14.Ïîðòû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 3.9. Ñèíòàêñèñ ÿçûêà AHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 3.9.1. Ëåêñè÷åñêèå ýëåìåíòû . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 3.9.2. Îñíîâíûå êîíñòðóêöèè ÿçûêà AHDL . . . . . . . . . . . . . . . . . 230 3.9.3. Ñèíòàêñèñ îáúÿâëåíèÿ íàçâàíèÿ . . . . . . . . . . . . . . . . . . . . . 233 3.9.4. Ñèíòàêñèñ îïåðàòîðà âêëþ÷åíèÿ . . . . . . . . . . . . . . . . . . . . 233 3.9.5. Ñèíòàêñèñ çàäàíèÿ êîíñòàíòû . . . . . . . . . . . . . . . . . . . . . . . 233 3.9.6. Ñèíòàêñèñ ïðîòîòèïà ôóíêöèè . . . . . . . . . . . . . . . . . . . . . . 233 3.9.7. Ñèíòàêñèñ îïåðàòîðà âàðèàíòîâ . . . . . . . . . . . . . . . . . . . . . 234 3.9.8. Ñèíòàêñèñ ñåêöèè ïîäïðîåêòà Subdesign . . . . . . . . . . . . . . 236 3.9.9. Ñèíòàêñèñ ñåêöèè ïåðåìåííûõ . . . . . . . . . . . . . . . . . . . . . . 236 3.9.10.Ñèíòàêñèñ îáúÿâëåíèÿ öèôðîâîãî àâòîìàòà . . . . . . . . . . . . 237 3.9.11. Ñèíòàêñèñ îáúÿâëåíèÿ ïñåâäîíèìà öèôðîâîãî àâòîìàòà . . . 237 3.9.12.Ñèíòàêñèñ ëîãè÷åñêîé ñåêöèè . . . . . . . . . . . . . . . . . . . . . . 238 3.9.13.Ñèíòàêñèñ áóëåâûõ óðàâíåíèé . . . . . . . . . . . . . . . . . . . . . . 238 3.9.14.Ñèíòàêñèñ áóëåâûõ óðàâíåíèé óïðàâëåíèÿ . . . . . . . . . . . . 238 3.9.15.Ñèíòàêñèñ îïåðàòîðà CASE . . . . . . . . . . . . . . . . . . . . . . . . 238 3.9.16.Îáúÿâëåíèå ïî óìîë÷àíèþ . . . . . . . . . . . . . . . . . . . . . . . . . .238 3.9.17.Ñèíòàêñèñ óñëîâíîãî îïåðàòîðà IF . . . . . . . . . . . . . . . . . . . 239 3.9.18.Ñèíòàêñèñ âñòðîåííûõ (in-line) ññûëîê íà ìàêðîôóíêöèþ èëè ïðèìèòèâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 3.9.19.Ñèíòàêñèñ îáúÿâëåíèÿ òàáëèöû èñòèííîñòè . . . . . . . . . . . 239 3.9.20.Ñèíòàêñèñ ïîðòà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 3.9.21.Ñèíòàêñèñ ãðóïïû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 3.9.22.Ñèíòàêñè÷åñêèå ãðóïïû è ñïèñêè . . . . . . . . . . . . . . . . . . . . 241 ÃËÀÂÀ 4. ßÇÛÊ ÎÏÈÑÀÍÈß ÀÏÏÀÐÀÒÓÐÛ VHDL . . . . . . . . . . 243 4.1. Îáùèå ñâåäåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 4.2. Àëôàâèò ÿçûêà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 4.2.1. Kîììåíòàðèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 4.2.2. ×èñëà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 4.2.3. Ñèìâîëû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 4.2.4. Ñòðîêè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 4.3. Òèïû äàííûõ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
7
Ñîäåðæàíèå 4.3.1. Ïðîñòûå òèïû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 4.3.2. Ñëîæíûå òèïû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 4.3.3. Îïèñàíèå ïðîñòûõ òèïîâ . . . . . . . . . . . . . . . . . . . . . . . . . . 250 4.4. Îïåðàòîðû VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 4.4.1. Îñíîâû ñèíòàêñèñà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 4.4.2. Îáúåêòû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 4.4.3. Àòðèáóòû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 4.4.4. Kîìïîíåíòû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 4.4.5. Âûðàæåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 4.4.6. Îïåðàòîðû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 4.5. Èíòåðôåéñ è òåëî îáúåêòà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 4.5.1. Îïèñàíèå ïðîñòîãî îáúåêòà . . . . . . . . . . . . . . . . . . . . . . . . 270 4.5.2. Îáúÿâëåíèå îáúåêòà ïðîåêòà F . . . . . . . . . . . . . . . . . . . . . . 270 4.5.3. Ïîâåäåí÷åñêîå îïèñàíèå àðõèòåêòóðû . . . . . . . . . . . . . . . . 270 4.5.4. Ïîòîêîâàÿ ôîðìà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 4.5.5. Ñòðóêòóðíîå îïèñàíèå àðõèòåêòóðû . . . . . . . . . . . . . . . . . . 273 4.6. Îïèñàíèå êîíôèãóðàöèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 4.7. Âåêòîðíûå ñèãíàëû è ðåãóëÿðíûå ñòðóêòóðû . . . . . . . . . . . . . . . . 275 4.8. Çàäåðæêè ñèãíàëîâ è ïàðàìåòðû íàñòðîéêè . . . . . . . . . . . . . . . . . 277 4.9. Àòðèáóòû ñèãíàëîâ è êîíòðîëü çàïðåùåííûõ ñèòóàöèé . . . . . . . . 279 4.10. Àëôàâèò ìîäåëèðîâàíèÿ è ïàêåòû . . . . . . . . . . . . . . . . . . . . . . . . . 280 4.11. Îïèñàíèå ìîíòàæíîãî «ÈËÈ» è îáùåé øèíû . . . . . . . . . . . . . . . 283 4.12. Ñèíòåçèðóåìîå ïîäìíîæåñòâî VHDL . . . . . . . . . . . . . . . . . . . . . . 285 4.12.1.Îáùèå ñâåäåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 4.12.2.Ïåðåîïðåäåëåííûå òèïû (Redefined types) . . . . . . . . . . . . 286 4.12.3.Ìåòîäèêà âåðèôèêàöèè ñèíòåçèðóåìîãî îïèñàíèÿ (Verification methodology) . . . . . . . . . . . . . . . . . . . . . . . . . . 286 4.12.4.Ìîäåëèðîâàíèå ýëåìåíòîâ àïïàðàòóðû (Modeling hardware elements) . . . . . . . . . . . . . . . . . . . . . . . 288 4.12.5.Äèðåêòèâû êîìïèëÿòîðà (ïñåâäîêîììåíòàðèè, Pragmas) . . . 295 4.12.6.Ñèíòàêñèñ ñèíòåçèðóåìîãî ïîäìíîæåñòâà VHDL . . . . . . . 297 4.13. Kðàòêîå îïèñàíèå ñèíòàêèñà ñèíòåçèðóåìîãî ïîäìíîæåñòâà VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 ÃËÀÂÀ 5. ßÇÛÊ ÎÏÈÑÀÍÈß ÀÏÏÀÐÀÒÓÐÛ VERILOG HDL . . . 363 5.1. Îáùèå ñâåäåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 5.2. Îïåðàòîðû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 5.3. ×èñëà â Verilog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 5.3.1. Öåëûå ÷èñëà (Integers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 5.3.2. Íåîïðåäåëåííîå è âûñîêîèìïåäàíñíîå ñîñòîÿíèÿ (x and z values) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
8
Ñîäåðæàíèå 5.3.3. Îòðèöàòåëüíûå ÷èñëà (Negative numbers) . . . . . . . . . . . . . 366 5.3.4. Ïîä÷åðêèâàíèå (Underscore) . . . . . . . . . . . . . . . . . . . . . . . . 366 5.3.5. Äåéñòâèòåëüíûå ÷èñëà (Real) . . . . . . . . . . . . . . . . . . . . . . . 366 5.3.6. Ñòðîêè (Strings) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 5.4. Öåïè â Verilog (Nets) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 5.5. Ðåãèñòðû (Registers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 5.6. Âåêòîðû (Vectors) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 5.7. Ìàññèâû (Arrays) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 5.8. Ðåãèñòðîâûå ôàéëû (Memories) . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 5.9. Ýëåìåíòû ñ òðåòüèì ñîñòîÿíèåì (Tri-state) . . . . . . . . . . . . . . . . . . 370 5.10. Àðèôìåòè÷åñêèå îïåðàòîðû (Arithmetic operators) . . . . . . . . . . . . 372 5.11. Ëîãè÷åñêèå îïåðàòîðû (Logical operators) . . . . . . . . . . . . . . . . . . . 373 5.12. Îïåðàòîðû îòíîøåíèÿ (Relational operators) . . . . . . . . . . . . . . . . . 374 5.13. Îïåðàòîðû ýêâèâàëåíòíîñòè (Equality) . . . . . . . . . . . . . . . . . . . . . 374 5.14. Ïîðàçðÿäíûå îïåðàòîðû (Bitwise operators) . . . . . . . . . . . . . . . . . 375 5.15. Îïåðàòîðû ïðèâåäåíèÿ (Reduction operator) . . . . . . . . . . . . . . . . . 376 5.16. Îïåðàòîðû ñäâèãà (Shift operator) . . . . . . . . . . . . . . . . . . . . . . . . . 377 5.17. Kîíêàòåíàöèÿ (îáúåäèíåíèå, Concatenation) . . . . . . . . . . . . . . . . . 377 5.18. Ïîâòîðåíèå (Replication) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 5.19. Ñèñòåìíûå äèðåêòèâû (System tasks) . . . . . . . . . . . . . . . . . . . . . . 378 5.19.1.Äèðåêòèâû âûâîäà ðåçóëüòàòîâ ìîäåëèðîâàíèÿ (Writing to standard output) . . . . . . . . . . . . . . . . . . . . . . . . . . 379 5.19.2. Kîíòðîëü ïðîöåññà ìîäåëèðîâàíèÿ (Monitoring a simulation) . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 5.19.3. Îêîí÷àíèå ìîäåëèðîâàíèÿ (Ending a simulation) . . . . . . . 382 5.20. Ïðîåêòèðîâàíèå êîìáèíàöèîííûõ ñõåì, ïðèìåð ïðîåêòèðîâàíèÿ ìóëüòèïëåêñîðà 4 â 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 5.20.1.Ðåàëèçàöèÿ íà óðîâíå ëîãè÷åñêèõ âåíòèëåé (Gate level implementation) . . . . . . . . . . . . . . . . . . . . . . . . . 382 5.20.2.Ðåàëèçàöèÿ ìóëüòèïëåêñîðà ñ ïîìîùüþ ëîãè÷åñêèõ îïåðàòîðîâ (Logic statement Implementation) . . . . . . . . . . . 384 5.20.3.Ðåàëèçàöèÿ ñ ïîìîùüþ îïåðàòîðà âûáîðà (CASE statement implementation ) . . . . . . . . . . . . . . . . . . . . 385 5.20.4.Ðåàëèçàöèÿ ñ èñïîëüçîâàíèåì óñëîâíîãî îïåðàòîðà (Conditional operator Implementation) . . . . . . . . . . . . . . . . . 387 5.20.5.Òåñòîâûé ìîäóëü (The stimulus module) . . . . . . . . . . . . . . . 387 5.21. Ìîäóëè ïðîåêòà (Design blocks modules) . . . . . . . . . . . . . . . . . . . 390 5.21.1.Òåñòèðîâàíèå . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392 5.22. Ïîðòû (Ports) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 5.23. Ïðàâèëà ñîåäèíåíèÿ (Connection rules) . . . . . . . . . . . . . . . . . . . . . 394
9
Ñîäåðæàíèå 5.23.1.Âõîäû (inputs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 5.23.2.Âûõîäû (outputs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 5.23.3.Äâóíàïðàâëåííûå âûâîäû (inouts) . . . . . . . . . . . . . . . . . . . 394 5.23.4.Ñîîòâåòñòâèå ïîðòîâ (Port matching) . . . . . . . . . . . . . . . . . 394 5.23.5.Ïðèñîåäèíåíèå ïîðòîâ (Connecting ports) . . . . . . . . . . . . . 394 5.24. Áàçîâûå áëîêè (Basic blocks) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 5.24.1.Èíèöèàëèçàöèÿ (Initial block) . . . . . . . . . . . . . . . . . . . . . . . 395 5.24.2.Kîíñòðóêöèÿ Always (Always block) . . . . . . . . . . . . . . . . . . 395 5.25. Ïðèìåð ïðîåêòèðîâàíèÿ ïîñëåäîâàòåëüíîñòíîãî óñòðîéñòâà: äâîè÷íûé ñ÷åò÷èê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 5.25.1.Ïîâåäåí÷åñêàÿ ìîäåëü ñ÷åò÷èêà (Behavioural model) . . . . . 400 5.26. Âðåìåííîé êîíòðîëü (Timing Control) . . . . . . . . . . . . . . . . . . . . . . 402 5.26.1.Çàäåðæêè (delay) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 5.26.2.Ñîáûòèéíûé êîíòðîëü (event-based control) . . . . . . . . . . . . 403 5.27. Çàùåëêèâàíèå (triggers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 5.28. Ñïèñîê ñèãíàëîâ âîçáóæäåíèÿ (sensitivity list) . . . . . . . . . . . . . . . 404 5.29. Çàäåðæêà ðàñïðîñòðàíåíèÿ â âåíòèëå (Gate delays) . . . . . . . . . . . 404 5.30. Îïåðàòîðû âåòâëåíèÿ (Branch statements) . . . . . . . . . . . . . . . . . . . 404 5.30.1.Îïåðàòîð IF ( IF statement) . . . . . . . . . . . . . . . . . . . . . . . . . 404 5.30.2.Îïåðàòîð âûáîðà (CASE statement) . . . . . . . . . . . . . . . . . . 406 5.30.3.Îïåðàòîð âåòâëåíèÿ (Conditional operator) . . . . . . . . . . . . . 406 5.31. Öèêëû (Looping constructs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 5.31.1.Öèêë WHILE (WHILE LOOP) . . . . . . . . . . . . . . . . . . . . . . . 407 5.31.2.Öèêë FOR (FOR LOOP) . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 5.31.3.Öèêë REPEAT (REPEAT LOOP) . . . . . . . . . . . . . . . . . . . . . .408 5.31.4.Âå÷íûé öèêë (FOREVER LOOP) . . . . . . . . . . . . . . . . . . . . 409 5.32. Ôàéëû â Verilog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 5.32.1.Îòêðûòèå ôàéëà (Opening a file) . . . . . . . . . . . . . . . . . . . . . 409 5.32.2.Çàïèñü â ôàéë (Writing to a file) . . . . . . . . . . . . . . . . . . . . . 410 5.32.3.Çàêðûòèå ôàéëà (Closing a file) . . . . . . . . . . . . . . . . . . . . . . 410 5.32.4.Èíèöèàëèçàöèÿ ðåãèñòðîâûõ ôàéëîâ (ïàìÿòè) (Initialising memories) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 5.33. Çàäàíèå âåêòîðîâ âõîäíûõ ñèãíàëîâ äëÿ ìîäåëèðîâàíèÿ (Verilog input vectors) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 5.34. Ñïèñîê îïåðàòîðîâ Verilog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 5.35. Ïðèîðèòåò îïåðàòîðîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 5.36. Këþ÷åâûå ñëîâà (keywords) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 5.37. Äèðåêòèâû êîìïèëÿòîðà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 5.38. Òèïû öåïåé (Net types) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416
10
Ñîäåðæàíèå ÃËÀÂÀ 6. ÏÐÈÌÅÐÛ ÏÐÎÅÊÒÈÐÎÂÀÍÈß ÖÈÔÐÎÂÛÕ ÓÑÒÐÎÉÑÒÂ Ñ ÈÑÏÎËÜÇÎÂÀÍÈÅÌ ßÇÛÊΠÎÏÈÑÀÍÈß ÀÏÏÀÐÀÒÓÐÛ VHDL È VERILOG . . . . 4 1 7 6.1. Îáùèå ñâåäåíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 6.2. Òðèããåðû è ðåãèñòðû . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418 6.2.1. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì (Rising Edge Flipflop) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 6.2.2. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííûì ñáðîñîì (Rising Edge Flipflop with Asynchronous Reset) . . . 420 6.2.3. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííîé ïðåäóñòàíîâêîé (Rising Edge Flipflop with Asynchronous Preset) . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 6.2.4. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííûì ñáðîñîì è ïðåäóñòàíîâêîé (Rising Edge Flepflop with Asynchronous Reset and Preset) . . . . . . . . . . . . . . . . . . . 422 6.2.5. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ ñèíõðîííûì ñáðîñîì (Rising Edge Flipflop with Synchronous Reset) . . . . 424 6.2.6. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ ñèíõðîííîé ïðåäóñòàíîâêîé (Rising Edge Flipflop with Synchronous Preset) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 6.2.7. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííûì ñáðîñîì è ðàçðåøåíèåì òàêòîâîãî ñèãíàëà (Rising Edge Flipflop with Asynchronous Reset and Clock Enable) . . . . . . . 426 6.2.8. Çàùåëêà ñ ðàçðåøåíèåì âûõîäà (D-Latch with Data and Enable) . . . . . . . . . . . . . . . . . . . . . . 427 6.2.9. Çàùåëêà ñ âõîäîì äàííûõ ñ ðàçðåøåíèåì (D-Latch with Gated Asynchronous Data) . . . . . . . . . . . . . . . 428 6.2.10. Çàùåëêà ñ âõîäîì ðàçðåøåíèÿ (D-Latch with Gated enable) . . 429 6.2.11. Çàùåëêà ñ àñèíõðîííûì ñáðîñîì (D-Latch with Asynchronous Reset) . . . . . . . . . . . . . . . . . . . 430 6.3. Ïîñòðîåíèå óñòðîéñòâ ïîòîêîâîé îáðàáîòêè äàííûõ (Datapath logic) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 6.4. Ñ÷åò÷èêè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439 6.5. Àðèôìåòè÷åñêèå óñòðîéñòâà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 6.6. Kîíå÷íûå àâòîìàòû (Finite state machine) . . . . . . . . . . . . . . . . . . . 449 6.7. Ýëåìåíòû ââîäà-âûâîäà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 6.8. Ïàðàìåòðèçàöèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 6.9. Ñïåöèôèêà ïðîåêòèðîâàíèÿ óñòðîéñòâ ñ ó÷åòîì àðõèòåêòóðíûõ îñîáåííîñòåé ÏËÈÑ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 6.10. Ñîâìåñòíîå èñïîëüçîâàíèå ðåñóðñîâ . . . . . . . . . . . . . . . . . . . . . . 468
11
Ñîäåðæàíèå 6.11. Äóáëèðîâàíèå ðåãèñòðà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 6.12. Ñîçäàíèå îïèñàíèé ñ ó÷åòîì îñîáåííîñòåé àðõèòåêòóðû ÏËÈÑ (Technology Specific Coding Techniques) . . . . . . . . . . . . . . . . . . . . 476 ÃËÀÂÀ 7. ÏÐÈÌÅÐÛ ÐÅÀËÈÇÀÖÈÈ ÀËÃÎÐÈÒÌΠÖÎÑ ÍÀ ÏËÈÑ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 7.1. Ðåàëèçàöèÿ öèôðîâûõ ôèëüòðîâ íà ÏËÈÑ ñåìåéñòâà FLEX ôèðìû «Altera» . . . . . . . . . . . . . . . . . . . . . . . . . . 485 7.2. Ðåàëèçàöèÿ öèôðîâûõ ïîëèíîìèàëüíûõ ôèëüòðîâ . . . . . . . . . . . . 491 7.3. Àëãîðèòìû ôóíêöèîíèðîâàíèÿ è ñòðóêòóðíûå ñõåìû äåìîäóëÿòîðîâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 7.4. Ðåàëèçàöèÿ ãåíåðàòîðà ÏÑÏ íà ÏËÈÑ . . . . . . . . . . . . . . . . . . . . . 500 7.5. Ïðèìåðû îïèñàíèÿ öèôðîâûõ ñõåì íà VHDL . . . . . . . . . . . . . . . 506 7.6. Ðåàëèçàöèÿ íåéðîíà íà AHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 7.7. Ïîñòðîåíèå áûñòðîäåéñòâóþùèõ ïåðåìíîæèòåëåé . . . . . . . . . . . 529 Ïðèëîæåíèå 1.Ñèñòåìà ïðîåêòèðîâàíèÿ Quartus . . . . . . . . . . . . . . . . . 535 Ïðèëîæåíèå 2.Èíòåðôåéñû ïåðåäà÷è äàííûõ è ñîïðÿæåíèå óñòðîéñòâ . . . . . . . . . . . . . . . . . . . . . . . . 537 Ïðèëîæåíèå 3.Ïðàêòè÷åñêèå ðåêîìåíäàöèè ïî ðàçðàáîòêå ïå÷àòíûõ ïëàò . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 Ëèòåðàòóðà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
12
ÂÂÅÄÅÍÈÅ
Èäåÿ íàïèñàíèÿ ýòîé êíèãè íàçðåâàëà â òå÷åíèå ïîñëåäíèõ äâóõ-òðåõ ëåò, êîãäà äëÿ ìíîãèõ ðàçðàáîò÷èêîâ àïïàðàòóðû öåíòðàëüíîé îïåðàòèâíîé ñèñòåìû (ÖÎÑ) ñòàëî ÿñíî, ÷òî ïðîãðàììèðóåìûå ëîãè÷åñêèå èíòåãðàëüíûå ñõåìû (ÏËÈÑ) óäîáíàÿ â îñâîåíèè è ïðèìåíåíèè ýëåìåíòíàÿ áàçà, àëüòåðíàòèâû êîòîðîé çà÷àñòóþ íå íàéòè. Ïîñëåäíèå ãîäû õàðàêòåðèçóþòñÿ ðåçêèì ðîñòîì ïëîòíîñòè óïàêîâêè ýëåìåíòîâ íà êðèñòàëëå, ìíîãèå âåäóùèå ïðîèçâîäèòåëè ëèáî íà÷àëè ñåðèéíîå ïðîèçâîäñòâî, ëèáî àíîíñèðîâàëè ÏËÈÑ ñ ýêâèâàëåíòíîé åìêîñòüþ áîëåå 1 ìèëëèîíà ëîãè÷åñêèõ âåíòèëåé. Öåíû íà ÏËÈÑ (ê ñîæàëåíèþ, òîëüêî ëèøü â äîëëàðîâîì ýêâèâàëåíòå) íåóêëîííî ïàäàþò. Òàê, åùå ãîä-ïîëòîðà íàçàä ÏËÈÑ ëîãè÷åñêîé åìêîñòüþ 100000 âåíòèëåé ñòîèëà â Ìîñêâå â çàâèñèìîñòè îò ïðîèçâîäèòåëÿ, ïðèåìêè, áûñòðîäåéñòâèÿ îò 1500 äî 3000 ó.å., ñåé÷àñ òàêàÿ ìèêðîñõåìà ñòîèò îò 100 äî 350 ó.å., ò.å. öåíû óïàëè ïðàêòè÷åñêè íà ïîðÿäîê, è ýòà òåíäåíöèÿ óñòîé÷èâà. ×òî êàñàåòñÿ ÏËÈÑ åìêîñòüþ 10000...30000 ëîãè÷åñêèõ âåíòèëåé, òî ïîÿâèëèñü ìèêðîñõåìû ñòîèìîñòüþ ìåíåå 10 ó.å. Òàêàÿ ñèòóàöèÿ íà ðûíêå âûçâàëà âîëíó âîïðîñîâ, ñâÿçàííûõ ñ ïîäãîòîâêîé ñïåöèàëèñòîâ, ñïîñîáíûõ ïðîâîäèòü ðàçðàáîòêó àïïàðàòóðû öèôðîâîé îáðàáîòêè ñèãíàëîâ íà ÏËÈÑ, âëàäåþùèõ îñíîâíûìè ìåòîäàìè ïðîåêòèðîâàíèÿ, îðèåíòèðóþùèõñÿ â ñîâðåìåííîé ýëåìåíòíîé áàçå è ïðîãðàììíîì îáåñïå÷åíèè. Èäÿ íàâñòðå÷ó ìíîãî÷èñëåííûì ïîæåëàíèÿì ïðåäïðèÿòèé, çàèíòåðåñîâàííûõ â ïîäãîòîâêå ìîëîäûõ ñïåöèàëèñòîâ, âëàäåþùèõ ñîâðåìåííûìè òåõíîëîãèÿìè, íà êàôåäðå ÑÌ-5 «Àâòîíîìíûå èíôîðìàöèîííûå è óïðàâëÿþùèå ñèñòåìû» ÌÃÒÓ èì. Í.Ý. Áàóìàíà â ïðîãðàììó ÷åòûðåõñåìåñòðîâîãî êóðñà «Ñõåìîòåõíè÷åñêîå ïðîåêòèðîâàíèå ìèêðîýëåêòðîííûõ óñòðîéñòâ» âêëþ÷åí ñåìåñòðîâûé ðàçäåë «Ïðîåêòèðîâàíèå àïïàðàòóðû îáðàáîòêè ñèãíàëîâ íà ÏËÈÑ», íà îñíîâå ëåêöèîííûõ è ñåìèíàðñêèõ ìàòåðèàëîâ êîòîðîãî è âûõîäèò ýòîò öèêë ñòàòåé.
13
Ïðèâåäåì èçâåñòíóþ êëàññèôèêàöèþ ÏËÈÑ [1, 2, 3] ïî ñòðóêòóðíîìó ïðèçíàêó, òàê êàê îíà äàåò íàèáîëåå ïîëíîå ïðåäñòàâëåíèå î êëàññå çàäà÷, ïðèãîäíûõ äëÿ ðåøåíèÿ íà òîé èëè èíîé ÏËÈÑ. Ñëåäóåò çàìåòèòü, ÷òî îáùåïðèíÿòîé îöåíêîé ëîãè÷åñêîé åìêîñòè ÏËÈÑ ÿâëÿåòñÿ ÷èñëî ýêâèâàëåíòíûõ âåíòèëåé, îïðåäåëÿåìîå êàê ñðåäíåå ÷èñëî âåíòèëåé «2È-ÍÅ», íåîáõîäèìûõ äëÿ ðåàëèçàöèè ýêâèâàëåíòíîãî ïðîåêòà íà ÏËÈÑ è áàçîâîì ìàòðè÷íîì êðèñòàëëå (ÁÌK). Ïîíÿòíî, ÷òî ýòà îöåíêà âåñüìà óñëîâíà, ïîñêîëüêó ÏËÈÑ íå ñîäåðæàò âåíòèëåé «2È-ÍÅ» â ÷èñòîì âèäå, îäíàêî äëÿ ïðîâåäåíèÿ ñðàâíèòåëüíîãî àíàëèçà ðàçëè÷íûõ àðõèòåêòóð îíà âïîëíå ïðèãîäíà. Îñíîâíûìè êðèòåðèÿìè òàêîé êëàññèôèêàöèè ÿâëÿþòñÿ íàëè÷èå, âèä è ñïîñîáû êîììóòàöèè ýëåìåíòîâ ëîãè÷åñêèõ ìàòðèö. Ïî ýòîìó ïðèçíàêó ìîæíî âûäåëèòü ñëåäóþùèå êëàññû ÏËÈÑ. Ïðîãðàììèðóåìûå ëîãè÷åñêèå ìàòðèöû íàèáîëåå òðàäèöèîííûé òèï ÏËÈÑ, èìåþùèé ïðîãðàììèðóåìûå ìàòðèöû «È» è «ÈËÈ».  çàðóáåæíîé ëèòåðàòóðå ñîîòâåòñòâóþùèìè ýòîìó êëàññó àááðåâèàòóðàìè ÿâëÿþòñÿ FPLA (Field Programmable Logic Array) è FPLS (Field Programmable Logic Sequensers). Ïðèìåðàìè òàêèõ ÏËÈÑ ìîãóò ñëóæèòü îòå÷åñòâåííûå ñõåìû K556PT1, PT2, PT21. Íåäîñòàòîê òàêîé àðõèòåêòóðû ñëàáîå èñïîëüçîâàíèå ðåñóðñîâ ïðîãðàììèðóåìîé ìàòðèöû «ÈËÈ», ïîýòîìó äàëüíåéøåå ðàçâèòèå ïîëó÷èëè ìèêðîñõåìû, ïîñòðîåííûå ïî àðõèòåêòóðå ïðîãðàììèðóåìîé ìàòðè÷íîé ëîãèêè (ÏÌË Programmable Array Logic, PAL) ýòî ÏËÈÑ, èìåþùèå ïðîãðàììèðóåìóþ ìàòðèöó «È» è ôèêñèðîâàííóþ ìàòðèöó «ÈËÈ». K ýòîìó êëàññó îòíîñèòñÿ áîëüøèíñòâî ñîâðåìåííûõ ÏËÈÑ íåáîëüøîé ñòåïåíè èíòåãðàöèè.  êà÷åñòâå ïðèìåðîâ ìîæíî ïðèâåñòè îòå÷åñòâåííûå èíòåãðàëüíûå ñõåìû (ÈÑ) KÌ1556ÕÏ4, ÕÏ6, ÕÏ8, ÕË8, ðàííèå ðàçðàáîòêè (ñåðåäèíàêîíåö 80-õ ãîäîâ) ÏËÈÑ ôèðì «Intel», «Altera», «AMD», «Lattice» è äð. Ðàçíîâèäíîñòüþ êëàññà ÏÌË ÿâëÿþòñÿ ÏËÈÑ, èìåþùèå òîëüêî îäíó (ïðîãðàììèðóåìóþ) ìàòðèöó «È», íàïðèìåð ñõåìà 85C508 ôèðìû «Intel». Ñëåäóþùèé òðàäèöèîííûé òèï ÏËÈÑ ïðîãðàììèðóåìàÿ ìàêðîëîãèêà. Îíà ñîäåðæèò åäèíñòâåííóþ ïðîãðàììèðóåìóþ ìàòðèöó «È-ÍÅ» èëè «ÈËÈ-ÍÅ», íî çà ñ÷åò ìíîãî÷èñëåííûõ èíâåðñíûõ îáðàòíûõ ñâÿçåé ñïîñîáíà ôîðìèðîâàòü ñëîæíûå ëîãè÷åñêèå ôóíêöèè. K ýòîìó êëàññó îòíîñÿòñÿ, íàïðèìåð, ÏËÈÑ PLHS501 è PLHS502 ôèðìû «Signetics», èìåþùèå ìàòðèöó «È-ÍÅ», à òàêæå ñõåìà XL78C800 ôèðìû «Exel», îñíîâàííàÿ íà ìàòðèöå «ÈËÈ-ÍÅ». Âûøåïåðå÷èñëåííûå àðõèòåêòóðû ÏËÈÑ ñîäåðæàò íåáîëüøîå ÷èñëî ÿ÷ååê, ê íàñòîÿùåìó âðåìåíè ìîðàëüíî óñòàðåëè è ïðèìåíÿþòñÿ äëÿ ðåà-
14
Ââåäåíèå ëèçàöèè îòíîñèòåëüíî ïðîñòûõ óñòðîéñòâ, äëÿ êîòîðûõ íå ñóùåñòâóåò ãîòîâûõ ÈÑ ñðåäíåé ñòåïåíè èíòåãðàöèè. Åñòåñòâåííî, äëÿ ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ îíè íå ïðèãîäíû. ÈÑ ÏÌË (Programmable Logic Device, PLD) èìåþò àðõèòåêòóðó, âåñüìà óäîáíóþ äëÿ ðåàëèçàöèè öèôðîâûõ àâòîìàòîâ. Ðàçâèòèå ýòîé àðõèòåêòóðû ïðîãðàììèðóåìûå êîììóòèðóåìûå ìàòðè÷íûå áëîêè (ÏKÌÁ) ýòî ÏËÈÑ, ñîäåðæàùèå íåñêîëüêî ìàòðè÷íûõ ëîãè÷åñêèõ áëîêîâ (ÌËÁ), îáúåäèíåííûõ êîììóòàöèîííîé ìàòðèöåé. Kàæäûé ÌËÁ ïðåäñòàâëÿåò ñîáîé ñòðóêòóðó òèïà ÏÌË, ò.å. ïðîãðàììèðóåìóþ ìàòðèöó «È», ôèêñèðîâàííóþ ìàòðèöó «ÈËÈ» è ìàêðîÿ÷åéêè. ÏËÈÑ òèïà ÏKÌÁ, êàê ïðàâèëî, èìåþò âûñîêóþ ñòåïåíü èíòåãðàöèè (äî 10000 ýêâèâàëåíòíûõ âåíòèëåé, äî 256 ìàêðîÿ÷ååê). K ýòîìó êëàññó îòíîñÿòñÿ ÏËÈÑ ñåìåéñòâà MAX5000 è MAX7000 ôèðìû «Altera», ñõåìû XC7000 è XC9500 ôèðìû «Xilinx», à òàêæå áîëüøîå ÷èñëî ìèêðîñõåì äðóãèõ ïðîèçâîäèòåëåé (ôèðìû «Atmel», «Vantis», «Lucent» è äð.).  çàðóáåæíîé ëèòåðàòóðå îíè ïîëó÷èëè íàçâàíèå Complex Programmable Logic Devices (CPLD). Äðóãîé òèï àðõèòåêòóðû ÏËÈÑ ïðîãðàììèðóåìûå âåíòèëüíûå ìàòðèöû (ÏÂÌ), ñîñòîÿùèå èç ëîãè÷åñêèõ áëîêîâ (ËÁ) è êîììóòèðóþùèõ ñâÿçåé ïðîãðàììèðóåìûõ ìàòðèö ñîåäèíåíèé. Ëîãè÷åñêèå áëîêè òàêèõ ÏËÈÑ ñîñòîÿò èç îäíîãî èëè íåñêîëüêèõ îòíîñèòåëüíî ïðîñòûõ ëîãè÷åñêèõ ýëåìåíòîâ, â èõ îñíîâå ëåæèò òàáëèöà ïåðåêîäèðîâêè (ÒÏ Look-up table, LUT), ïðîãðàììèðóåìûé ìóëüòèïëåêñîð, D-òðèããåð, à òàêæå öåïè óïðàâëåíèÿ. Òàêèõ ïðîñòûõ ýëåìåíòîâ ìîæåò áûòü äîñòàòî÷íî áîëüøîå êîëè÷åñòâî, ó ñîâðåìåííûõ ÏËÈÑ åìêîñòüþ äî 1 ìèëëèîíà âåíòèëåé ÷èñëî ëîãè÷åñêèõ ýëåìåíòîâ äîñòèãàåò íåñêîëüêèõ äåñÿòêîâ òûñÿ÷. Çà ñ÷åò òàêîãî áîëüøîãî ÷èñëà ëîãè÷åñêèõ ýëåìåíòîâ îíè ñîäåðæàò çíà÷èòåëüíîå ÷èñëî òðèããåðîâ, òàêæå íåêîòîðûå ñåìåéñòâà ÏËÈÑ èìåþò âñòðîåííûå ðåêîíôèãóðèðóåìûå ìîäóëè ïàìÿòè (ÐÌÏ Embedded Array Block, EAB), ÷òî äåëàåò ÏËÈÑ äàííîé àðõèòåêòóðû âåñüìà óäîáíûì ñðåäñòâîì ðåàëèçàöèè àëãîðèòìîâ öèôðîâîé îáðàáîòêè ñèãíàëîâ, îñíîâíûìè îïåðàöèÿìè â êîòîðûõ ÿâëÿþòñÿ ïåðåìíîæåíèå, óìíîæåíèå íà êîíñòàíòó, ñóììèðîâàíèå è çàäåðæêà ñèãíàëà. Âìåñòå ñ òåì âîçìîæíîñòè êîìáèíàöèîííîé ÷àñòè òàêèõ ÏËÈÑ îãðàíè÷åíû, ïîýòîìó ñîâìåñòíî ñ ÏÂÌ ïðèìåíÿþò ÏKÌÁ (CPLD) äëÿ ðåàëèçàöèè óïðàâëÿþùèõ è èíòåðôåéñíûõ ñõåì.  çàðóáåæíîé ëèòåðàòóðå òàêèå ÏËÈÑ ïîëó÷èëè íàçâàíèå Field Programmable Gate Array (FPGA). K FPGA (ÏÂÌ) êëàññó îòíîñÿòñÿ ÏËÈÑ XC2000, XC3000, XC4000, Spartan, Virtex ôèðìû «Xilinx», ACT1, ACT2 ôèðìû
15
Ââåäåíèå «Actel», à òàêæå ñåìåéñòâà FLEX8000 ôèðìû «Altera», íåêîòîðûå ÏËÈÑ ôèðì «Atmel» è «Vantis». Ìíîæåñòâî êîíôèãóðèðóåìûõ ëîãè÷åñêèõ áëîêîâ (Configurable Logic Blocks, CLBs) îáúåäèíÿþòñÿ ñ ïîìîùüþ ìàòðèöû ñîåäèíåíèé. Õàðàêòåðíûìè äëÿ FPGA àðõèòåêòóð ÿâëÿþòñÿ ýëåìåíòû ââîäà-âûâîäà (Input/Output Blocks, IOBs), ïîçâîëÿþùèå ðåàëèçîâàòü äâóíàïðàâëåííûé ââîä/âûâîä, òðåòüå ñîñòîÿíèå è ò.ï. Îñîáåííîñòüþ ñîâðåìåííûõ ÏËÈÑ ÿâëÿåòñÿ âîçìîæíîñòü òåñòèðîâàíèÿ óçëîâ ñ ïîìîùüþ ïîðòà JTAG (B-scan), à òàêæå íàëè÷èå âíóòðåííåãî ãåíåðàòîðà (Osc) è ñõåì óïðàâëåíèÿ ïîñëåäîâàòåëüíîé êîíôèãóðàöèåé. Ôèðìà «Altera» ïîøëà ïî ïóòè ðàçâèòèÿ FPGA-àðõèòåêòóð è ïðåäëîæèëà â ñåìåéñòâå FLEX10K òàê íàçûâàåìóþ äâóõóðîâíåâóþ àðõèòåêòóðó ìàòðèöû ñîåäèíåíèé. Ëîãè÷åñêèå ýëåìåíòû (ËÝ) îáúåäèíÿþòñÿ â ãðóïïû ëîãè÷åñêèå áëîêè (ËÁ). Âíóòðè ëîãè÷åñêèõ áëîêîâ ËÝ ñîåäèíÿþòñÿ ïîñðåäñòâîì ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöû ñîåäèíåíèé, ïîçâîëÿþùåé ñîåäèíÿòü ëþáîé ËÝ ñ ëþáûì äðóãèì. Ëîãè÷åñêèå áëîêè ñâÿçàíû ìåæäó ñîáîé è ñ ýëåìåíòàìè ââîäà-âûâîäà ïîñðåäñòâîì ãëîáàëüíîé ïðîãðàììèðóåìîé ìàòðèöû ñîåäèíåíèé (ÃÏÌÑ). Ëîêàëüíàÿ è ãëîáàëüíàÿ ìàòðèöû ñîåäèíåíèé èìåþò íåïðåðûâíóþ ñòðóêòóðó äëÿ êàæäîãî ñîåäèíåíèÿ âûäåëÿåòñÿ íåïðåðûâíûé êàíàë. Äàëüíåéøåå ðàçâèòèå àðõèòåêòóð èäåò ïî ïóòè ñîçäàíèÿ êîìáèíèðîâàííûõ àðõèòåêòóð, ñî÷åòàþùèõ óäîáñòâî ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà áàçå òàáëèö ïåðåêîäèðîâîê è ðåêîíôèãóðèðóåìûõ ìîäóëåé ïàìÿòè, õàðàêòåðíûõ äëÿ FPGA-ñòðóêòóð è ìíîãîóðîâíåâûõ ÏËÈÑ ñ óäîáñòâîì ðåàëèçàöèè öèôðîâûõ àâòîìàòîâ íà CPLD-àðõèòåêòóðàõ. Òàê, ÏËÈÑ APEX20K ôèðìû «Altera» ñîäåðæàò â ñåáå ëîãè÷åñêèå ýëåìåíòû âñåõ ïåðå÷èñëåííûõ òèïîâ, ÷òî ïîçâîëÿåò ïðèìåíÿòü ÏËÈÑ êàê îñíîâíóþ ýëåìåíòíóþ áàçó äëÿ «ñèñòåì íà êðèñòàëëå» (System-On-Chip, SOC).  îñíîâå èäåè SOC ëåæèò èíòåãðàöèÿ âñåé ýëåêòðîííîé ñèñòåìû â îäíîì êðèñòàëëå (íàïðèìåð, â ñëó÷àå ïåðñîíàëüíîãî êîìïüþòåðà (ÏK) òàêîé ÷èï îáúåäèíÿåò ïðîöåññîð, ïàìÿòü, è ò.ä.). Kîìïîíåíòû ýòèõ ñèñòåì ðàçðàáàòûâàþòñÿ îòäåëüíî è õðàíÿòñÿ â âèäå ôàéëîâ ïàðàìåòðèçèðóåìûõ ìîäóëåé. Îêîí÷àòåëüíàÿ ñòðóêòóðà SOC-ìèêðîñõåìû âûïîëíÿåòñÿ íà áàçå ýòèõ «âèðòóàëüíûõ êîìïîíåíòîâ» ñ ïîìîùüþ ïðîãðàìì ñèñòåì àâòîìàòèçàöèè ïðîåêòèðîâàíèÿ (ÑÀÏÐ) ýëåêòðîííûõ óñòðîéñòâ EDA (Electronic Design Automation). Áëàãîäàðÿ ñòàíäàðòèçàöèè â îäíî öåëîå ìîæíî îáúåäèíÿòü «âèðòóàëüíûå êîìïîíåíòû» îò ðàçíûõ ðàçðàáîò÷èêîâ.
16
Ââåäåíèå Kàê èçâåñòíî, ïðè âûáîðå ýëåìåíòíîé áàçû ñèñòåì îáðàáîòêè ñèãíàëîâ îáû÷íî ðóêîâîäñòâóþòñÿ ñëåäóþùèìè êðèòåðèÿìè îòáîðà: áûñòðîäåéñòâèå; ëîãè÷åñêàÿ åìêîñòü, äîñòàòî÷íàÿ äëÿ ðåàëèçàöèè àëãîðèòìà; ñõåìîòåõíè÷åñêèå è êîíñòðóêòèâíûå ïàðàìåòðû ÏËÈÑ, íàäåæíîñòü, ðàáî÷èé äèàïàçîí òåìïåðàòóð, ñòîéêîñòü ê èîíèçèðóþùèì èçëó÷åíèÿì è ò.ï.; ñòîèìîñòü âëàäåíèÿ ñðåäñòâàìè ðàçðàáîòêè, âêëþ÷àþùàÿ êàê ñòîèìîñòü ïðîãðàììíîãî îáåñïå÷åíèÿ, òàê íàëè÷èå è ñòîèìîñòü àïïàðàòíûõ ñðåäñòâ îòëàäêè; ñòîèìîñòü îáîðóäîâàíèÿ äëÿ ïðîãðàììèðîâàíèÿ ÏËÈÑ èëè êîíôèãóðàöèîííûõ ÏÇÓ (ïîñòîÿííîå çàïîìèíàþùåå óñòðîéñòâî); íàëè÷èå ìåòîäè÷åñêîé è òåõíè÷åñêîé ïîääåðæêè; íàëè÷èå è íàäåæíîñòü ðîññèéñêèõ ïîñòàâùèêîâ; ñòîèìîñòü ìèêðîñõåì.  äàííîé êíèãå ðàññìàòðèâàþòñÿ âîïðîñû ïðîåêòèðîâàíèÿ óñòðîéñòâ îáðàáîòêè èíôîðìàöèè íà áàçå ÏËÈÑ ôèðìû «Altera». Ôèðìà «Altera Corporation» (101 Innovation Drive, San Jose, CA 95134, USA, www.altera.com) áûëà îñíîâàíà â èþíå 1983 ãîäà.  íàñòîÿùåå âðåìÿ ïîñëåäíèì äîñòèæåíèåì ýòîé ôèðìû ÿâëÿåòñÿ ñåìåéñòâî APEX20K. Kðîìå òîãî, ôèðìà «Altera» âûïóñêàåò CPLD ñåìåéñòâ MAX3000, MAX7000, MAX9000 (óñòàðåâøèå ñåðèè ñïåöèàëüíî íå óïîìèíàþòñÿ), FPGA ñåìåéñòâ FLEX10K, FLEX8000, FLEX6000. Äîïîëíèòåëüíûì ôàêòîðîì ïðè âûáîðå ÏËÈÑ ôèðìû «Altera» ÿâëÿåòñÿ íàëè÷èå äîñòàòî÷íî ðàçâèòûõ áåñïëàòíûõ âåðñèé ÑÀÏÐ.  Òàáë. Â.1 ïðèâåäåíû îñíîâíûå õàðàêòåðèñòèêè ïàêåòà MAX+PLUS II BASELINE âåðñèÿ 9.3 ôèðìû «Altera», êîòîðûé ìîæíî áåñïëàòíî «ñêà÷àòü» ñ ñàéòà www.altera.com èëè ïîëó÷èòü íà CD «Altera Digital Library», íà êîòîðîì ñîäåðæèòñÿ òàêæå è ïîëíûé íàáîð äîêóìåíòàöèè ïî àðõèòåêòóðå è ïðèìåíåíèþ ÏËÈÑ. Kðîìå òîãî, ÏËÈÑ ôèðìû «Altera» âûïóñêàþòñÿ ñ âîçìîæíîñòüþ ïðîãðàììèðîâàíèÿ â ñèñòåìå íåïîñðåäñòâåííî íà ïëàòå. Äëÿ ïðîãðàììèðîâàíèÿ è çàãðóçêè êîíôèãóðàöèè óñòðîéñòâ îïóáëèêîâàíà ñõåìà çàãðóçî÷íîãî êàáåëÿ ByteBlaster è ByteBlasteMV. Ñëåäóåò îòìåòèòü, ÷òî íîâûå êîíôèãóðàöèîííûå ÏÇÓ EPC2 è ÅÐÑ16 ïîçâîëÿþò ïðîãðàììèðîâàíèå ñ ïîìîùüþ ýòîãî óñòðîéñòâà, òåì ñàìûì îòïàäàåò íóæäà â ïðîãðàììàòîðå, ÷òî, åñòåñòâåííî, ñíèæàåò ñòîèìîñòü âëàäåíèÿ òåõíîëîãèåé. ÏËÈÑ ôèðìû «Altera» âûïóñêàþòñÿ â êîììåð÷åñêîì è èíäóñòðèàëüíîì äèàïàçîíå òåìïåðàòóð.
17
Ââåäåíèå Òàáëèöà Â.1. Îñíîâíûå õàðàêòåðèñòèêè ïàêåòà MAX+PLUS II BASELINE âåðñèè 9.3
Ïîääåðæèâàåìûå óñòðîéñòâà
ACEX, EPF10K10, EPF10K10A, EPF10K20, EPF10K30, EPF10K30A, EPF10K30E (äî 30000 ýêâèâàëåíòíûõ âåíòèëåé), EPM9320, EPM9320A, EPF8452A, EPF8282A, MAX7000, FLEX6000, MAX5000, MAX3000A, Classic
Ñõåìíûé ââîä, ïîääåðæêà AHDL, ñðåäñòâà èíòåðôåéñà ñ ÑÀÏÐ Ñðåäñòâà îïèñàíèÿ òðåòüèõ ôèðì, òîïîëîãè÷åñêèé ðåäàêòîð, èåðàðõè÷åñêàÿ ñòðóêòóðà ïðîåêòà ïðîåêòà, íàëè÷èå áèáëèîòåêè ïàðàìåòðèçèðóåìûõ ìîäóëåé Ñðåäñòâà Ëîãè÷åñêèé ñèíòåç è òðàññèðîâêà, àâòîìàòè÷åñêîå îáíàðóæåíèå êîìïèëÿöèè ïðîåêòà îøèáîê, ïîääåðæêà ìåãàôóíêöèé ïî ïðîãðàììàì MegaCore è AMPP Ñðåäñòâà âåðèôèêàöèè ïðîåêòà
Âðåìåííîé àíàëèç, ôóíêöèîíàëüíîå è âðåìåííîå ìîäåëèðîâàíèå, àíàëèç ñèãíàëîâ, âîçìîæíîñòü èñïîëüçîâàíèÿ ïðîãðàìì ìîäåëèðîâàíèÿ (ñèìóëÿòîðîâ) òðåòüèõ ôèðì
18
Ãëàâà 1.
Ýëåìåíòíàÿ áàçà
1.1. Ñåìåéñòâî MAX3000 Ëåòîì 1999 ãîäà íà ðûíêå ñòàëè äîñòóïíû ÏËÈÑ ñåìåéñòâà MAX3000. Èõ àðõèòåêòóðà áëèçêà ê àðõèòåêòóðå ñåìåéñòâà MAX7000, îäíàêî èìååòñÿ ðÿä íåáîëüøèõ îòëè÷èé.  Òàáë. 1.1 ïðèâåäåíû îñíîâíûå ïàðàìåòðû ÏËÈÑ. Òàáëèöà 1.1. Îñíîâíûå ïàðàìåòðû ÏËÈÑ ñåìåéñòâà MAX3000 Ïàðàìåòð Ëîãè÷åñêàÿ åìêîñòü, êîëè÷åñòâî ýêâèâàëåíòíûõ âåíòèëåé ×èñëî ìàêðîÿ÷ååê
EPM3032A EPM3064A EPM3128A EPM3256A 600
1 250
2 500
5 000
32
64
128
256
×èñëî ëîãè÷åñêèõ áëîêîâ
2
4
8
16
×èñëî ïðîãðàììèðóåìûõ ïîëüçîâàòåëåì âûâîäîâ
34
66
96
158
Çàäåðæêà ðàñïðîñòðàíåíèÿ ñèãíàëà âõîä/âûõîä, tPD [íñ]
4.5
4.5
5
6
Âðåìÿ óñòàíîâêè ãëîáàëüíîãî òàêòîâîãî ñèãíàëà, tSU [íñ]
3.0
3.0
3.2
3.7
Çàäåðæêà ãëîáàëüíîãî òàêòîâîãî ñèãíàëà äî âûõîäà, tCO1 [íñ]
2.8
2.8
3.0
3.3
192.3
192.3
181.8
156.3
Ìàêñèìàëüíàÿ ãëîáàëüíàÿ òàêòîâàÿ ÷àñòîòà, fCNT [ÌÃö]
Ìèêðîñõåìû ñåìåéñòâà MAX3000 âûïîëíåíû ïî ÊÌÎÏ EPROM 0.35-ìèêðîííîé òåõíîëîãèè, ÷òî ïîçâîëèëî ñóùåñòâåííî óäåøåâèòü èõ ïî ñðàâíåíèþ ñ ñåìåéñòâîì MAX7000S. Âñå ÏËÈÑ ñåìåéñòâà
19
Ýëåìåíòíàÿ áàçà MAX3000 ïîääåðæèâàþò òåõíîëîãèþ ïðîãðàììèðîâàíèÿ â ñèñòåìå ISP (In-System Programmability) è ïåðèôåðèéíîãî ñêàíèðîâàíèÿ (boundary scan) â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std. 1149.1 1990 (JTAG). Ýëåìåíòû ââîäà/âûâîäà (ÝÂÂ) ïîçâîëÿþò ðàáîòàòü â ñèñòåìàõ ñ óðîâíÿìè ñèãíàëîâ 5, 3.3 è 2.5 Â. Ìàòðèöà ñîåäèíåíèé èìååò íåïðåðûâíóþ ñòðóêòóðó, ÷òî ïîçâîëÿåò ðåàëèçîâàòü âðåìÿ çàäåðæêè ðàñïðîñòðàíåíèÿ ñèãíàëà äî 4.5 íñ. ÏËÈÑ ñåìåéñòâà MAX3000 èìåþò âîçìîæíîñòü àïïàðàòíîé ýìóëÿöèè âûõîäîâ ñ îòêðûòûì êîëëåêòîðîì (open drains pin) è óäîâëåòâîðÿþò òðåáîâàíèÿì ñòàíäàðòà PCI. Èìååòñÿ âîçìîæíîñòü èíäèâèäóàëüíîãî ïðîãðàììèðîâàíèÿ öåïåé ñáðîñà, óñòàíîâêè è òàêòèðîâàíèÿ òðèããåðîâ, âõîäÿùèõ â ìàêðîÿ÷åéêó. Ïðåäóñìîòðåí ðåæèì ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ. Ïðîãðàììèðóåìûé ëîãè÷åñêèé ðàñøèðèòåëü ïîçâîëÿåò ðåàëèçîâàòü íà îäíîé ìàêðîÿ÷åéêå ôóíêöèè äî 32 ïåðåìåííûõ. Èìååòñÿ âîçìîæíîñòü çàäàíèÿ áèòà ñåêðåòíîñòè (security bit) äëÿ çàùèòû îò íåñàíêöèîíèðîâàííîãî òèðàæèðîâàíèÿ ðàçðàáîòêè. Ðåàëèçàöèÿ ôóíêöèè ïðîãðàììèðîâàíèÿ â ñèñòåìå ïîääåðæèâàåòñÿ ñ èñïîëüçîâàíèåì ñòàíäàðòíûõ ñðåäñòâ çàãðóçêè, òàêèõ, êàê ByteBlasterMV, BitBlaster, MasterBlaster, à òàêæå ïîääåðæèâàåòñÿ ôîðìàò JAM. ÏËÈÑ ñåìåéñòâà MAX3000 âûïóñêàþòñÿ â êîðïóñàõ îò 44 äî 208 âûâîäîâ. Íà Ðèñ. 1.1 ïðåäñòàâëåíà ôóíêöèîíàëüíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà MAX3000. Îñíîâíûìè ýëåìåíòàìè ñòðóêòóðû ÏËÈÑ ñåìåéñòâà MAX3000 ÿâëÿþòñÿ: ëîãè÷åñêèå áëîêè (ËÁ, Logic array blocks, LAB); ìàêðîÿ÷åéêè (Ìß, macrocells); ëîãè÷åñêèå ðàñøèðèòåëè (expanders) (ïàðàëëåëüíûé (parallel) è ðàçäåëÿåìûé (shareble)); ïðîãðàììèðóåìàÿ ìàòðèöà ñîåäèíåíèé (ÏÌÑ, Programmable Interconnect Array, PIA); ýëåìåíòû ââîäà/âûâîäà (ÝÂÂ, I/O control block). ÏËÈÑ ñåìåéñòâà MAX3000 èìåþò ÷åòûðå âûâîäà, çàêðåïëåííûõ çà ãëîáàëüíûìè öåïÿìè (dedicated inputs). Ýòî ãëîáàëüíûå öåïè ñèíõðîíèçàöèè ñáðîñà è óñòàíîâêè â òðåòüå ñîñòîÿíèå êàæäîé ìàêðîÿ÷åéêè. Kðîìå òîãî, ýòè âûâîäû ìîæíî èñïîëüçîâàòü êàê âõîäû èëè âûõîäû ïîëüçîâàòåëÿ äëÿ «áûñòðûõ» ñèãíàëîâ, îáðàáàòûâàåìûõ â ÏËÈÑ.
20
Ýëåìåíòíàÿ áàçà
INPUT/GCLK1 INPUT/OE2/GCLK2 INPUT/OE1
INPUT/GCLRn Разрешение выхода
4...16 I/O
ЛБ B МЯ 1...16
36
36
16
ЭВВ
4...16
4...16 I/O
4...16
ЛБ D
МЯ 33...48
36
36
16
4...16
МЯ 49...64
16
4...16
4...16 ЭВВ
6 AL1001+
6
6
PIA ЛБ C
ЭВВ
ЭВВ
16
4...16
6
МЯ 17...32
6 4...16 4...16 I/O
ЛБ A
4...16
4...16 I/O
6
Разрешение выхода
Ðèñ.1.1. Ôóíêöèîíàëüíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà MAX3000
Kàê âèäíî èç Ðèñ. 1.1, â îñíîâå àðõèòåêòóðû ÏËÈÑ ñåìåéñòâà MAX3000 ëåæàò ëîãè÷åñêèå áëîêè, ñîñòîÿùèå èç 16 ìàêðîÿ÷ååê êàæäûé. Ëîãè÷åñêèå áëîêè ñîåäèíÿþòñÿ ñ ïîìîùüþ ïðîãðàììèðóåìîé ìàòðèöû ñîåäèíåíèé. Kàæäûé ëîãè÷åñêèé áëîê èìååò 36 âõîäîâ ñ ÏÌÑ. Íà Ðèñ. 1.2 ïðèâåäåíà ñòðóêòóðíàÿ ñõåìà ìàêðîÿ÷åéêè ÏËÈÑ ñåìåéñòâà MAX3000.
21
22 Разделяемый расширитель
Матрица распре3 деления термов
Выбор сигнала сброса
VCC
Выбор сигналов тактирования и разрешения
ENA CLRN
PRN D/T Q Регистр
К ПМС
Цепь К ЭВВ обхода регистра
AL1002+
Глобальный Глобальный сигнал сигнал сброса синхронизации Параллельный 2 расширитель
Ðèñ. 1.2. Ñòðóêòóðíàÿ ñõåìà ìàêðîÿ÷åéêè ÏËÈÑ ñåìåéñòâà MAX3000
36 сигналов ПМС
ПМС
Ýëåìåíòíàÿ áàçà
Ýëåìåíòíàÿ áàçà Ìß ÏËÈÑ ñåìåéñòâà MAX3000 ñîñòîèò èç òðåõ îñíîâíûõ óçëîâ: ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöû (LAB local array); ìàòðèöû ðàñïðåäåëåíèÿ òåðìîâ (product-term select matrix); ïðîãðàììèðóåìîãî ðåãèñòðà (programmable register). Kîìáèíàöèîííûå ôóíêöèè ðåàëèçóþòñÿ íà ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöå è ìàòðèöå ðàñïðåäåëåíèÿ òåðìîâ, ïîçâîëÿþùåé îáúåäèíÿòü ëîãè÷åñêèå ïðîèçâåäåíèÿ ëèáî ïî «ÈËÈ» (OR), ëèáî ïî èñêëþ÷àþùåìó «ÈËÈ» (XOR). Kðîìå òîãî, ìàòðèöà ðàñïðåäåëåíèÿ òåðìîâ ïîçâîëÿåò ñêîììóòèðîâàòü öåïè óïðàâëåíèÿ òðèããåðîì Ìß. Ðåæèì òàêòèðîâàíèÿ è êîíôèãóðàöèÿ òðèããåðà âûáèðàþòñÿ àâòîìàòè÷åñêè âî âðåìÿ ñèíòåçà ïðîåêòà â ÑÀÏÐ MAX+PLUS II â çàâèñèìîñòè îò âûáðàííîãî ðàçðàáîò÷èêîì òèïà òðèããåðà ïðè îïèñàíèè ïðîåêòà.  ÏËÈÑ ñåìåéñòâà MAX3000 äîñòóïíî 2 ãëîáàëüíûõ òàêòîâûõ ñèãíàëà, ÷òî ïîçâîëÿåò ïðîåêòèðîâàòü ñõåìû ñ äâóõôàçíîé ñèíõðîíèçàöèåé. Äëÿ ðåàëèçàöèè ëîãè÷åñêèõ ôóíêöèé áîëüøîãî ÷èñëà ïåðåìåííûõ èñïîëüçóþòñÿ ëîãè÷åñêèå ðàñøèðèòåëè. Ðàçäåëÿåìûé ëîãè÷åñêèé ðàñøèðèòåëü (Ðèñ. 1.3) ïîçâîëÿåò ðåàëèçîâàòü ëîãè÷åñêóþ ôóíêöèþ ñ áîëüøèì ÷èñëîì âõîäîâ, ïîçâîëÿÿ îáúåäèíèòü Ìß, âõîäÿùèå â ñîñòàâ îäíîãî ËÁ. Òàêèì îáðàçîì, ðàçäåëÿåìûé ðàñøèðèòåëü ôîðìèðóåò òåðì, èíâåðñíîå çíà÷åíèå êîòîðîãî ïåðåäàåòñÿ ìàòðèöåé ðàñïðåäåëåíèÿ òåðìîâ â ëîêàëüíóþ ïðîãðàììèðóåìóþ ìàòðèöó è ìîæåò áûòü èñïîëüçîâàíî â ëþáîé Ìß äàííîãî ËÁ. Kàê âèäíî èç Ðèñ. 1.3 èìåþòñÿ 36 ñèãíàëîâ ëîêàëüíîé ÏÌÑ, à òàêæå 16 èíâåðñíûõ ñèãíàëîâ ñ ðàçäåëÿåìûõ ëîãè÷åñêèõ ðàñøèðèòåëåé, ÷òî ïîçâîëÿåò â ïðåäåëàõ îäíîãî ËÁ ðåàëèçîâàòü ôóíêöèþ äî 52 òåðìîâ ðàíãà 1. Ïàðàëëåëüíûé ëîãè÷åñêèé ðàñøèðèòåëü (Ðèñ. 1.4) ïîçâîëÿåò èñïîëüçîâàòü ëîêàëüíûå ìàòðèöû ñìåæíûõ Ìß äëÿ ðåàëèçàöèè ôóíêöèé, â êîòîðûå âõîäÿò áîëåå 5 òåðìîâ. Îäíà öåïî÷êà ïàðàëëåëüíûõ ðàñøèðèòåëåé ìîæåò âêëþ÷àòü äî 4 Ìß, ðåàëèçóÿ ôóíêöèþ 20 òåðìîâ. Kîìïèëÿòîð ñèñòåìû MAX+PLUS II ïîääåðæèâàåò ðàçìåùåíèå äî 3 íàáîðîâ íå áîëåå ÷åì ïî 5 ïàðàëëåëüíûõ ðàñøèðèòåëåé. Íà Ðèñ. 1.5 ïðèâåäåíà ñòðóêòóðà ïðîãðàììèðóåìîé ìàòðèöû ñîåäèíåíèé. Íà ÏÌÑ âûâîäÿòñÿ ñèãíàëû îò âñåõ âîçìîæíûõ èñòî÷íèêîâ: ÝÂÂ, ñèãíàëîâ îáðàòíîé ñâÿçè ËÁ, ñïåöèàëèçèðîâàííûõ âûäåëåííûõ âûâîäîâ.  ïðîöåññå ïðîãðàììèðîâàíèÿ òîëüêî íåîáõîäèìûå ñèãíàëû «çàâîäÿòñÿ» íà êàæäûé ËÁ. Íà Ðèñ. 1.5 ïðèâåäåíà ñòðóêòóðíàÿ ñõåìà ôîðìèðîâàíèÿ ñèãíàëîâ ËÁ.
23
16 разделяемых расширителей
Матрица распределения термов
Логика макроячейки
AL1003+
36 сигналов ПМС
Логика макроячейки
Матрица распределения термов
Ýëåìåíòíàÿ áàçà
Ðèñ. 1.3. Ðàçäåëÿåìûé ëîãè÷åñêèé ðàñøèðèòåëü
Íà Ðèñ. 1.6 ïðèâåäåíà ñõåìà ýëåìåíòà ââîäà/âûâîäà ÏËÈÑ ñåìåéñòâà MAX3000. ÝÂÂ ïîçâîëÿåò îðãàíèçîâàòü ðåæèìû ðàáîòû ñ îòêðûòûì êîëëåêòîðîì è òðåòüèì ñîñòîÿíèåì. ÏËÈÑ ñåìåéñòâà MAX3000 ïîëíîñòüþ ïîääåðæèâàþò âîçìîæíîñòü ïðîãðàììèðîâàíèÿ â ñèñòåìå â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std. 1149.1 1990 (JTAG) ñ èñïîëüçîâàíèåì ñîîòâåòñòâóþùèõ èíñòðóìåíòàëüíûõ ñðåäñòâ. Ïîâûøåííîå íàïðÿæåíèå ïðîãðàììèðîâàíèÿ ôîðìèðóåòñÿ ñïåöèàëèçèðîâàííûìè ñõåìàìè, âõîäÿùèìè â ñîñòàâ ÏËÈÑ ñåìåé-
24
Ýëåìåíòíàÿ áàçà
От предыдущей МЯ
Матрица распределения термов
PRESET
Логика макроячейки CLOCK CLEAR
Матрица распределения термов
PRESET
Логика макроячейки CLOCK CLEAR
16 разделяемых расширителей
AL1004+
36 сигналов ПМС
К следующей МЯ
Ðèñ. 1.4. Ïàðàëëåëüíûé ëîãè÷åñêèé ðàñøèðèòåëü
ñòâà MAX3000, èç íàïðÿæåíèÿ ïèòàíèÿ 3.3 Â. Âî âðåìÿ ïðîãðàììèðîâàíèÿ â ñèñòåìå âõîäû è âûõîäû ÏËÈÑ íàõîäÿòñÿ â òðåòüåì ñîñòîÿíèè è «ñëåãêà ïîäòÿíóòû» ê íàïðÿæåíèþ ïèòàíèÿ. Ñîïðîòèâëåíèÿ âíóòðåííèõ ïîäñòðàèâàþùèõ ðåçèñòîðîâ ïîðÿäêà 50 êÎì. Íà Ðèñ. 1.7 ïðèâåäåíû âðåìåííûå äèàãðàììû ïðîãðàììèðîâàíèÿ ÏËÈÑ ñåìåéñòâà MAX3000 ÷åðåç ïîðò JTAG. Çíà÷åíèÿ âðåìåííûõ ïàðàìåòðîâ ïðèâåäåíû â Òàáë. 1.2.
25
Ýëåìåíòíàÿ áàçà
К ЛБ
AL1005+
Сигналы ПМС
Ðèñ. 1.5. Ñòðóêòóðà ÏÌÑ ÏËÈÑ ñåìåéñòâà MAX3000
6 глобальных сигналов разрешения выхода
PIA
Мультиплексор разрешения выхода К другим выводам VCC
GND
Переключение выхода в режим "открытый коллектор" Управление скоростью переключения К ПМС
Ðèñ. 1.6. Ýëåìåíò ââîäà/âûâîäà
26
AL1006+
От МЯ
Ýëåìåíòíàÿ áàçà TMS TDI tJCP tJCH
tJPSU
tJCL
tJPH
TCK tJPZX
tJPCO
tJPXZ
TDO tJSSU
tJSH
Захват tJSCO
tJSXZ AL1007+
tJSZX Управление
Ðèñ. 1.7. Âðåìåííûå äèàãðàììû ïðîãðàììèðîâàíèÿ ÏËÈÑ ñåìåéñòâà MAX3000 ÷åðåç ïîðò JTAG Òàáëèöà 1.2. Âðåìåííûå ïàðàìåòðû ÏËÈÑ ñåìåéñòâà MAX3000 Îáîçíà÷åíèå tJCP Ïåðèîä ñèãíàëà ÒÑK [íñ]
Ïàðàìåòð
Çíà÷åíèå min max 100
tJCH
Äëèòåëüíîñòü åäèíè÷íîãî óðîâíÿ ñèãíàëà ÒÑK [íñ]
50
tJCL
Äëèòåëüíîñòü íóëåâîãî óðîâíÿ ñèãíàëà ÒÑK [íñ]
50
tJPSU
Âðåìÿ óñòàíîâëåíèÿ ïîðòà JTAG [íñ]
20
tJPH
Äëèòåëüíîñòü ñèãíàëà JTAG
45
tJPCO
Çàäåðæêà ðàñïðîñòðàíåíèÿ ñèãíàëà îòíîñèòåëüíî òàêòà JTAG [íñ]
25
tJPZX
Çàäåðæêà ïåðåõîäà ñèãíàëà JTAG èç òðåòüåãî ñîñòîÿíèÿ [íñ]
25
tJPXZ
Çàäåðæêà ïåðåõîäà ñèãíàëà JTAG â òðåòüå ñîñòîÿíèå [íñ]
25
tJSSU
Âðåìÿ óñòàíîâêè ðåãèñòðà çàõâàòà [íñ]
20
tJSH
Äëèòåëüíîñòü ñèãíàëà íà âõîäå ðåãèñòðà çàõâàòà [íñ]
45
tJSCO
Çàäåðæêà îáíîâëåíèÿ ñèãíàëà â ðåãèñòðå çàõâàòà îòíîñèòåëüíî òàêòà [íñ]
25
tJSZX
Çàäåðæêà ïåðåõîäà ñèãíàëà ðåãèñòðà çàõâàòà èç òðåòüåãî ñîñòîÿíèÿ [íñ]
25
tJSXZ
Çàäåðæêà ïåðåõîäà ñèãíàëà ðåãèñòðà çàõâàòà â òðåòüå ñîñòîÿíèå [íñ]
25
27
Ýëåìåíòíàÿ áàçà
tIOE tIN
tGLOB
tPIA
tLAD
tPEXP
tOD1 tOD2 tOD3 tXZ tZX1 tZX2 tZX3
tSU tH tPRE tCLR tRD
tCOMB
tLAC tIC tEN
tIO
AL1008+
tSEXP
Ðèñ. 1.8. Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà MAX3000A
Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà MAX3000A ïðèâåäåíà íà Ðèñ. 1.8. ÏËÈÑ ñåìåéñòâà MAX3000A èìåþò ïðåäñêàçóåìóþ çàäåðæêó ðàñïðîñòðàíåíèÿ ñèãíàëà, ïîýòîìó ðåçóëüòàòû âðåìåííîãî ìîäåëèðîâàíèÿ â ÑÀÏÐ MAX+PLUS II ïîëíîñòüþ àäåêâàòíû ïîâåäåíèþ ðåàëüíîé ñõåìû, â îòëè÷èå îò ÏËÈÑ, âûïîëíåííûõ ïî SRAM òåõíîëîãèè.  Òàáë. 1.3 ïðèâåäåíî îïèñàíèå ïàðàìåòðîâ âðåìåííîé ìîäåëè äëÿ ÏËÈÑ ñåìåéñòâà MAX3000A ñ áûñòðîäåéñòâèåì 4 è 10. Òàáëèöà 1.3. Ïàðàìåòðû âðåìåííîé ìîäåëè äëÿ ÏËÈÑ ñåìåéñòâà MAX3000A (âñå çíà÷åíèÿ çàäåðæêè â íñ) Îáîçíà÷åíèå tIN tIO tSEXP tPEXP tLAD tLAC tIOE
Ïàðàìåòð Çàäåðæêà íà âõîäå è âõîäíîì áóôåðå Çàäåðæêà íà äâóíàïðàâëåííîì âûâîäå è âõîäíîì áóôåðå Çàäåðæêà ðàçäåëÿåìîãî ðàñøèðèòåëÿ Çàäåðæêà ïàðàëëåëüíîãî ðàñøèðèòåëÿ Çàäåðæêà â ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöå «È» Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà òðèããåðà â ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöå «È» Âíóòðåííÿÿ çàäåðæêà ñèãíàëà ðàçðåøåíèÿ
28
min
4
Çíà÷åíèå
10
max 0.3
min
max 0.6
0.3
0.6
1.9 0.5
4.9 1.1
1.9
5.0
1.8
4.6
0.0
0.0
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.3 (îêîí÷àíèå) Îáîçíà÷åíèå
Ïàðàìåòð
4
Çíà÷åíèå
10
min
max
min
max
tOD1
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 3.3 Â, slew rate = off
0.3
0.7
tOD2
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 2.5 Â, slew rate = off
0.8
1.2
tOD3
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, slew rate = on
5.3
5.7
tZX1
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèã-íàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 3.3 Â, slew rate = off
4.0
5.0
tZX2
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 2.5 Â, slew rate = off
4.5
5.5
tZX3
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, slew rate = on
9.0
10.0
tXZ
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà çàïðåùåíèÿ âûõîäà
4.0
5.0
tSU
Âðåìÿ óñòàíîâêè ðåãèñòðà
1.4
1.7
tH
Âðåìÿ óäåðæàíèÿ ñèãíàëà íà ðåãèñòðå
0.8
3.8
tRD
Ðåãèñòðîâàÿ çàäåðæêà
1.2
2.8
Kîìáèíàöèîííàÿ çàäåðæêà
1.3
2.0
tIC
Çàäåðæêà èçìåíåíèÿ ñèãíàëà îòíîñèòåëüíî òàêòîâîãî èìïóëüñà
1.9
4.6
tEN
Çàäåðæêà ðàçðåøåíèÿ ðåãèñòà
1.8
4.6
Çàäåðæêà ãëîáàëüíûõ óïðàâëÿþùèõ ñèãíàëîâ
1.0
1.8
tPRE
Âðåìÿ ïðåäóñòàíîâêè ðåãèñòðà Ìß
2.3
5.2
tCLR
Âðåìÿ ñáðîñà ðåãèñòðà Ìß
2.3
5.2
tPIA
Çàäåðæêà ÏÌÑ
0.7
1.7
tLPA
Çàäåðæêà çà ñ÷åò ðåæèìà ïîíèæåííîãî ïîòðåáëåíèÿ
12
10.0
tCOMB
tGLOB
29
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.4. Äèíàìè÷åñêèå ïàðàìåòðû ÏËÈÑ ñåìåéñòâà MAX3000A (âðåìåííûå ïàðàìåòðû â íñ, ÷àñòîòû â ÌÃö) Îáîçíà÷åíèå
Ïàðàìåòð
tPD1
Çàäåðæêà âõîä êîìáèíàòîðíûé âûõîä
tPD2
Çíà÷åíèå
10
max
min
4.5
10.0
Çàäåðæêà âõîä ðåãèñòðîâûé âûõîä
4.5
10.0
tSU
Âðåìÿ óñòàíîâêè ãëîáàëüíîãî ñèíõðîñèãíàëà
3.0
6.6
tH
Âðåìÿ óäåðæàíèÿ ãëîáàëüíîãî ñèíõðîñèãíàëà
0.0
0.0
1.0
2.8
1.0
5.9
2.0
4.0
tCO1 tCH
Çàäåðæêà ãëîáàëüíîãî ñèíõðîñèãíàëà äî âûõîäà Äëèòåëüíîñòü âûñîêîãî óðîâíÿ ãëîáàëüíîãî ñèíõðîñèãíàëà
min
4
max
tCL
Äëèòåëüíîñòü íèçêîãî óðîâíÿ ãëîáàëüíîãî ñèíõðîñèãíàëà
2.0
4.0
tASU
Âðåìÿ óñòàíîâêè ñèíõðîñèãíàëà òðèããåðà Ìß
1.4
2.1
0.8
3.4
4.4
10.4
tAH tACO1
Âðåìÿ óäåðæàíèÿ ñèíõðîñèãíàëà òðèããåðà Ìß Çàäåðæêà ñèíõðîñèãíàëà òðèããåðà Ìß äî âûõîäà
tACH
Äëèòåëüíîñòü âûñîêîãî óðîâíÿ ñèíõðîñèãíàëà òðèããåðà Ìß
2.0
4.0
tACL
Äëèòåëüíîñòü íèçêîãî óðîâíÿ ñèíõðîñèãíàëà òðèããåðà Ìß
2.0
4.0
tCPPW
Ìèíèìàëüíàÿ äëèòåëüíîñòü ñèãíàëîâ ñáðîñà è óñòàíîâêè òðèããåðà Ìß
2.0
2.0
tCNT
Ìèíèìàëüíûé ïåðèîä ãëîáàëüíîãî ñèíõðîñèãíàëà
5.2
11.2
fCNT
Ìàêñèìàëüíàÿ ãëîáàëüíàÿ âíóòðåííÿÿ òàêòîâàÿ ÷àñòîòà
192.3
89.3
tACNT
Ìèíèìàëüíûé ïåðèîä ñèíõðîñèãíàëà òðèããåðà Ìß
5.2
11.2
fACNT
Ìàêñèìàëüíàÿ âíóòðåííÿÿ òàêòîâàÿ ÷àñòîòà òðèããåðà Ìß
192.3
89.3
fMAX
Ìàêñèìàëüíàÿ òàêòîâàÿ ÷àñòîòà
250
125.0
30
Ýëåìåíòíàÿ áàçà  Òàáë. 1.4 ïðèâåäåíû äèíàìè÷åñêèå ïàðàìåòðû ÏËÈÑ ñåìåéñòâà MAX3000A. Ðèñ. 1.9 è 1.10 èëëþñòðèðóþò çàäåðæêè ñèãíàëîâ â ÏËÈÑ ñåìåéñòâà MAX3000A â çàâèñèìîñòè îò ðåæèìà ðàáîòû ÏËÈÑ. Íà Ðèñ. 1.10 è 1.11 äëèòåëüíîñòè ïåðåäíåãî è çàäíåãî ôðîíòîâ tR è tF ñîîòâåòñòâåííî ðàâíû 2 íñ. Òàêèì îáðàçîì, ìû ðàññìîòðåëè îñíîâíûå àðõèòåêòóðíûå îñîáåííîñòè è ïðèíöèïû ïîñòðîåíèÿ ÏËÈÑ ñåìåéñòâà MAX3000A. Ñëåäóåò åùå ðàç çàìåòèòü, ÷òî â êíèãå íàìåðåííî íå ïðèâîäèòñÿ èíôîðìàöèÿ î íàçíà÷åíèè êîíòàêòîâ äëÿ ðàçëè÷íûõ êîðïóñîâ, ïîòðåáëÿåìîé ìîùíîñòè è ò.ä. Ýòî ñâÿçàíî ñ òåì, ÷òî äàííàÿ èíôîðìàöèÿ ëåãêîäîñòóïíà êàê íà CD «Altera Digital Library», òàê è â Internet.
tIN Вход tIO Вход/выход tPIA Задержка ПМС tSEXP Задержка разделяемого расширителя
tLAC/D
Вход комбинационной схемы
tPEXP
Задержка параллельного расширителя
tCOMB
Выход комбинационной схемы
tOD AL1009+
Выход
Ðèñ. 1.9. Çàäåðæêè â ÏËÈÑ ñåìåéñòâà MAX3000A
31
Ýëåìåíòíàÿ áàçà
tR
Глобальный сигнал синхронизации
tCH
tIN
Глобальный синхросигнал на регистре
tCL
tF
tCL
tF
tGLOB
tSU
tH
Данные tR
tCH
Вход tIN tIO Такт на ПМС
tPIA
Такт в ЛБ tIC Тест регистра
tSU
tH
Данные ЛЕ tRD
tPIA
tCLR tPRE
tPIA
Данные на ПМС tOO
AL1010+
Выход
tOO
Ðèñ. 1.10. Çàäåðæêè â ÏËÈÑ ñåìåéñòâà MAX3000A
32
Ýëåìåíòíàÿ áàçà
1.2. Ñåìåéñòâî FLEX6000 Îòíîñèòåëüíî íîâîå ñåìåéñòâî ÏËÈÑ FLEX6000 ïîÿâèëîñü íà ðûíêå â êîíöå 1997 ãîäà. Ïî ñâîèì õàðàêòåðèñòèêàì îíî ÿâëÿåòñÿ ïðîìåæóòî÷íûì ìåæäó ñåìåéñòâàìè FLEX8000 è FLEX10K. ÏËÈÑ ñåìåéñòâà FLEX6000 âûïóñêàþòñÿ ïî òåõíîëîãèè 0.5 ìêì SRAM (FLEX6000A ïî 0.35 ìêì) ñ òðåìÿ ñëîÿìè ìåòàëëèçàöèè è îáëàäàþò óäà÷íûìè õàðàêòåðèñòèêàìè öåíàïðîèçâîäèòåëüíîñòü äëÿ ðåàëèçàöèè íå î÷åíü ñëîæíûõ àëãîðèòìîâ ÖÎÑ.  Òàáë. 1.5 ïðèâåäåíû îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà FLEX6000. Òàáëèöà 1.5. Îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà FLEX6000 Ïàðàìåòð
EPF6010
EPF6016
EPF6016A
EPF6024A
10 000
16 000
16 000
24 000
×èñëî ëîãè÷åñêèõ ýëåìåíòîâ
800
1 320
1 320
1 960
×èñëî ëîãè÷åñêèõ áëîêîâ
80
132
132
196
×èñëî ïðîãðàììèðóåìûõ ïîëüçîâàòåëåì âûâîäîâ
160
204
204
215
Ëîãè÷åñêàÿ åìêîñòü, êîëè÷åñòâî ýêâèâàëåíòíûõ âåíòèëåé
Îòëè÷èòåëüíîé îñîáåííîñòüþ àðõèòåêòóðû ÏËÈÑ ñåìåéñòâà FLEX6000 ÿâëÿåòñÿ òåõíîëîãèÿ OptiFLEX, ïðåäñòàâëåííàÿ íà Ðèñ. 1.11.  îñíîâå àðõèòåêòóðû OptiFLEX ëåæàò ëîãè÷åñêèå áëîêè, êàæäûé èç êîòîðûõ îáúåäèíÿåò ïî 10 ëîãè÷åñêèõ ýëåìåíòîâ (Logic elements, LEs) ñ ïîìîùüþ ëîêàëüíîé ìàòðèöû ñîåäèíåíèé. Îñîáåííîñòüþ àðõèòåêòóðû OptiFLEX ÿâëÿåòñÿ òî, ÷òî êàæäûé ëîãè÷åñêèé ýëåìåíò ìîæåò êîììóòèðîâàòüñÿ êàê íà ëîêàëüíóþ ìàòðèöó ñîåäèíåíèé ñîáñòâåííîãî ëîãè÷åñêîãî áëîêà, òàê è ñìåæíûõ (Ðèñ. 1.11), òåì ñàìûì ðàñøèðÿþòñÿ âîçìîæíîñòè äëÿ òðàññèðîâêè. Íà Ðèñ. 1.12 ïðèâåäåíà ñòðóêòóðà ËÁ ÏËÈÑ ñåìåéñòâà FLEX6000. Kàê âèäíî èç Ðèñ. 1.12, ËÁ èìååò ÷åðåäóþùóþñÿ ñòðóêòóðó (interleaved structure), îáúåäèíÿÿ íà ëîêàëüíîé ìàòðèöå ñîåäèíåíèé (ËÌÑ, lockal interconnect) ñèãíàëû ñ äâóõ ñìåæíûõ ËÁ. Kðîìå òîãî, ñèãíàëû ñ ËÝ è ËÌÑ
33
Ýëåìåíòíàÿ áàçà
ЭВВ
Строки ГМС
Строки ГМС ЭВВ Столбцы ГМС
AL1011+
ЛМС
ЛЕ
Ðèñ. 1.11. Òåõíîëîãèÿ OptiFLEX
Строки ГМС
ЛМС
10 ЛЭ
Столбец ГМС
Ðèñ. 1.12. Ñòðóêòóðà ËÁ FLEX6000
34
AL1012+
К смеж3 ному ЛБ или ЭВВ
К смеж3 ному ЭВВ или ЛБ
Ýëåìåíòíàÿ áàçà ìîãóò êîììóòèðîâàòüñÿ íà ñòðîêè è ñòîëáöû ãëîáàëüíîé ìàòðèöû ñîåäèíåíèé (row and column interconnect), êîòîðûå èìåþò íåïðåðûâíóþ ñòðóêòóðó, îáåñïå÷èâàþùóþ ìèíèìàëüíûå çàäåðæêè. Kàæäûé ËÁ è ËÝ óïðàâëÿåòñÿ âûäåëåííûìè ãëîáàëüíûìè ñèãíàëàìè (dedicated inputs), ÿâëÿþùèìèñÿ ñèãíàëàìè ñáðîñà, óñòàíîâêè è ñèíõðîíèçàöèè òðèããåðîâ ËÝ (Ðèñ. 1.13). 4
Выделенные входы
LABCTRL1/ CLK1/ LABCTRL2 SYNCLR SYNLOAD
CLK2
AL1013+
ЛЭ1
Ðèñ. 1.13. Ñïåöèàëèçèðîâàííûå ñèãíàëû
Íà Ðèñ. 1.14 ïðèâåäåíà ñòðóêòóðà ËÝ ÏËÈÑ ñåìåéñòâà FLEX6000.  îñíîâå ËÝ ëåæèò ÷åòûðåõâõîäîâàÿ òàáëèöà ïåðåêîäèðîâîê (ÒÏ). Kðîìå òîãî, â ñîñòàâ ËÝ âõîäÿò öåïè óñêîðåííîãî öåïî÷å÷íîãî ïåðåíîñà (carry-in, carry-out) è êàñêàäèðîâàíèÿ (cascade-in, cascade-out). Òðèããåð ËÝ ìîæåò áûòü ñêîíôèãóðèðîâàí ñ ïîìîùüþ ëîãèêè ñáðîñà-óñòàíîâêè (clear/preset logic), òàêòèðóåòñÿ îäíèì èç ñèãíàëîâ, âûáèðàåìûõ ëîãèêîé òàêòèðîâàíèÿ (clock select). Ïðè íåîáõîäèìîñòè ñèãíàë ñ âûõîäà ÒÏ ìîæåò áûòü ïîäàí íà âûõîä ËÝ â îáõîä òðèããåðà (register bypass). Äëÿ îáåñïå÷åíèÿ ìèíèìàëüíîé çàäåðæêè ïðè ðåàëèçàöèè ñëîæíûõ àðèôìåòè÷åñêèõ ôóíêöèé â òàêèõ óñòðîéñòâàõ, êàê ñ÷åò÷èêè, ñóììàòîðû, âû÷èòàòåëè è ò.ï., èñïîëüçóåòñÿ îðãàíèçàöèÿ óñêîðåííûõ öåïî÷å÷íûõ ïåðåíîñîâ (carry chain) ìåæäó ËÝ. Ëîãèêà óñêîðåííûõ ïåðåíîñîâ àâòîìàòè÷åñêè ôîðìèðóåòñÿ êîìïèëÿòîðîì ÑÀÏÐ MAX+PLUS II èëè âðó÷íóþ ïðè îïèñàíèè ïðîåêòà.
35
Ýëåìåíòíàÿ áàçà
Перенос Data1 Data2 Data3 Data4
Таблица Цепь переко3 переноса дировки
Каскадирование
Цепь каскади3 рования
LE-OUT
PRN D
Q CLRN
Labctrl1 Labctrl2 Сброс
Схема сброса/ установки
Labctrl3
Выход переноса Выход каскадирования
AL1014+
Labctrl4
Ðèñ. 1.14. Ñòðóêòóðà ËÝ ÏËÈÑ ñåìåéñòâà FLEX6000
Ïðè îðãàíèçàöèè öåïî÷å÷íûõ ïåðåíîñîâ ïåðâûé ËÝ êàæäîãî ËÁ íå âêëþ÷àåòñÿ â öåïî÷êó öåïî÷å÷íûõ ïåðåíîñîâ, ïîñêîëüêó îí ôîðìèðóåò óïðàâëÿþùèå ñèãíàëû ËÁ. Âõîä ïåðâîãî ËÝ â êàæäîì ËÁ ìîæåò áûòü èñïîëüçîâàí äëÿ ôîðìèðîâàíèÿ ñèãíàëîâ ñèíõðîííîé çàãðóçêè èëè ñáðîñà ñ÷åò÷èêîâ, èñïîëüçóþùèõ öåïî÷å÷íûé ïåðåíîñ. Öåïî÷êà ïåðåíîñîâ äëèííåå ÷åì 9 ËÝ àâòîìàòè÷åñêè ôîðìèðóåòñÿ ïóòåì îáúåäèíåíèÿ íåñêîëüêèõ ËÁ âìåñòå, ïðè÷åì ïåðåíîñ ôîðìèðóåòñÿ íå â ñîñåäíèé ËÁ, à ÷åðåç îäèí, ò.å. èç ÷åòíîãî â ÷åòíûé, èç íå÷åòíîãî ËÁ â íå÷åòíûé. Íàïðèìåð, ïîñëåäíèé ËÝ â ïåðâîì ËÁ â ðÿäó ôîðìèðóåò ïåðåíîñ âî âòîðîé ËÝ â òðåòüåì ËÁ â òîì æå ðÿäó. Îòñþäà ÿñíî, ÷òî äëèíà öåïî÷êè ïåðåíîñîâ íå ìîæåò áûòü áîëüøå, ÷åì ïîëîâèíà ðÿäà. Íà Ðèñ. 1.15 ïðèâåäåí ïðèìåð ðåàëèçàöèè ïîëíîãî ñóììàòîðà ñ èñïîëüçîâàíèåì ëîãèêè óñêîðåííîãî ïåðåíîñà.  ýòîì ñëó÷àå ÒÏ ñêîíôèãóðèðîâàí òàêèì îáðàçîì, ÷òî äâà åå âõîäà ôîðìèðóþò ñèãíàë ñóììû, à äâà äðóãèõ âõîäà ïåðåíîñ. Ïðè ðåàëèçàöèè ìíîãîâõîäîâûõ ôóíêöèé èñïîëüçóåòñÿ ðåæèì êàñêàäèðîâàíèÿ ËÝ (Ðèñ. 1.16). ÒÏ ñìåæíûõ ËÝ ðåàëèçóþò ÷àñòè÷íûå ôóíêöèè, à çàòåì ñ ïîìîùüþ öåïåé êàñêàäèðîâàíèÿ ôîðìèðóåòñÿ âûõîä ôóíêöèè ìíîãèõ ïåðåìåííûõ. Ëîãèêà êàñêàäèðîâàíèÿ ñòðîèòñÿ ëèáî ïî «È» (AND), ëèáî ïî «ÈËÈ» (OR).
36
Ýëåìåíòíàÿ áàçà
Carry-in
a1 b1
Таблица переко3 дировки Цепь переноса
a2 b2
Таблица переко3 дировки Цепь переноса
an bn
Таблица переко3 дировки
Регистр
s1
ЛЭ2
Регистр
s2
ЛЭ3
Регистр
sn
Цепь переноса ЛЭ n+1
Цепь переноса
Ðèñ. 1.15. Öåïî÷å÷íûé ïåðåíîñ â ñóììàòîðå
37
Регистр
ЛЭ n+2
Carry-out
AL1015+
Таблица переко3 дировки
Ýëåìåíòíàÿ áàçà Ïðè êàñêàäèðîâàíèè ïî «È» âîçìîæíî èñïîëüçîâàíèå ðåãèñòðà ïîñëåäíåãî ËÝ, ïðè êàñêàäèðîâàíèè ïî «ÈËÈ» èñïîëüçîâàíèå ðåãèñòðà íåâîçìîæíî, ïîñêîëüêó èíâåðòîð èñïîëüçóåòñÿ äëÿ ðåàëèçàöèè ýëåìåíòà «ÈËÈ». Àíàëîãè÷íî öåïî÷å÷íûì ïåðåíîñàì ïðè êàñêàäèðîâàíèè îáúåäèíÿþòñÿ ëèáî òîëüêî ÷åòíûå, ëèáî íå÷åòíûå ËÝ. Ðèñ. 1.16 èëëþñòðèðóåò ðåàëèçàöèþ êàñêàäèðîâàíèÿ äëÿ ôóíêöèè áîëüøîãî ÷èñëà ïåðåìåííûõ. Òàê, ïðè ðåàëèçàöèè 16-ðàçðÿäíîãî äåøèôðàòîðà àäðåñà çàäåðæêà ñîñòàâëÿåò ïîðÿäêà 3.5 íñ.
Каскадирование по «И» d(3...0)
LUT
LUT
ЛЭ2
d(7...4)
ЛЭ2
d(7...4)
LUT
LUT
ЛЭ3
d[(4n-1) ...4(n-1)]
ЛЭ3
d[(4n-1) ...4(n-1)]
LUT ЛЭ n+1
LUT ЛЭ n+1
AL1016+
d(3...0)
Каскадирование по «ИЛИ»
Ðèñ. 1.16. Kàñêàäèðîâàíèå ËÝ
Kàæäûé ËÝ ÏËÈÑ ìîæåò áûòü ñêîíôèãóðèðîâàí òðåìÿ ñïîñîáàìè (Ðèñ. 1.17): íîðìàëüíûé ðåæèì (normal mode); àðèôìåòè÷åñêèé ðåæèì (arithmetic mode); ðåæèì ñ÷åò÷èêà (counter mode). Íîðìàëüíûé ðåæèì èñïîëüçóåòñÿ äëÿ ðåàëèçàöèè îñíîâíûõ ëîãè÷åñêèõ ôóíêöèé, êîìáèíàöèîííûõ ñõåì, äåøèôðàòîðîâ ñ áîëüøèì ÷èñëîì âõîäîâ, êîãäà âîçìîæíîñòü êàñêàäíîãî íàðàùèâàíèÿ ïîçâîëÿåò ïîëó÷èòü âûèãðûø âî âðåìåíè.  íîðìàëüíîì ðåæèìå ÒÏ èìååò ÷åòûðå âõîäà, èñòî÷íèêàìè êîòîðûõ ÿâëÿþòñÿ ñèãíàëû ñ ËÌÑ è öåïî÷å÷íûå ïåðåíîñû.
38
Ýëåìåíòíàÿ áàçà
Carry-in
Cascade-in
Data1 Data2
LE-OUT PRN D
LUT
Data3
Q CLRN
Data4
Cascade-out Carry-in
Data1 Data2
Cascade-in
LE-OUT PRN D
LUT
Q CLRN
Cascade-out Carry-out
LUT
Carry-in
LAB-Wds
LAB-Wds
Cascade-in Data1 (2) Data2 (2)
PRN
LUT
D
Data3 (data)
Q
LE-OUT
CLRN LUT Carry-out
AL1017+
Cascade-out
Ðèñ. 1.17. Ðåæèìû êîíôèãóðàöèè ËÝ
Àðèôìåòè÷åñêèé ðåæèì èñïîëüçóåòñÿ äëÿ ðåàëèçàöèè ñóììàòîðîâ, âû÷èòàòåëåé, íàêîïèòåëåé è êîìïàðàòîðîâ.  àðèôìåòè÷åñêîì ðåæèìå ÒÏ êîíôèãóðèðóåòñÿ êàê äâå òðåõâõîäîâûå ÒÏ: îäíà äëÿ ôóíêöèè òðåõ ïåðåìåííûõ, äðóãàÿ äëÿ ñèãíàëà óñêîðåííîãî ïåðåíîñà.  ðåæèìå ñ÷åò÷èêà âîçìîæíà ðåàëèçàöèÿ ñ ïîìîùüþ ÒÏ ôóíêöèé ðàçðåøåíèÿ ñ÷åòà, ðåâåðñà, ñèíõðîííûõ ñáðîñà è çàãðóçêè äàííûõ â ñ÷åò÷èê. Kðîìå òîãî, ôîðìèðóåòñÿ óñêîðåííûé ïåðåíîñ äëÿ ðåàëèçàöèè ñèíõðîííûõ ñ÷åò÷èêîâ ñ ïîìîùüþ äâóõ òðåõâõîäîâûõ ÒÏ, ïîäîáíî àðèôìåòè÷åñêîìó ðåæèìó. Kàæäûé ËÝ èìååò âîçìîæíîñòü ãëîáàëüíîé àñèíõðîííîé óñòàíîâêè è ñáðîñà òðèããåðà, à òàêæå ýìóëÿöèè âíóòðåííåé øèíû ñ òðåìÿ ñîñòîÿíèÿìè.
39
40
К смешенному ЛБ
Ðèñ. 1.18. Kîììóòàöèÿ ËÝ íà ìàòðèöû ñîåäèíåíèé
AL1018+
10
10
5
ЛМС
5
5
22
5
10
5
10
10
2
5
2
5
ЛЭ10
ЛЭ5 ЛЭ6
ЛЭ1
5
Строки ГМС
5
20
10
10
10 5
5
22
5
10
5
10
10
2
5
2
5
ЛЭ10
ЛЭ5 ЛЭ6
ЛЭ1
5
5
20
10
10
Столбец ГМС
10
10
10
5
Ýëåìåíòíàÿ áàçà К смешенному ЛБ
Ýëåìåíòíàÿ áàçà Íà Ðèñ. 1.18 ïðèâåäåíà ñõåìà êîììóòàöèè ËÁ è ËÝ íà ëîêàëüíóþ è ãëîáàëüíóþ ìàòðèöó ñîåäèíåíèé (ÃÌÑ). Ñëåäóåò îòìåòèòü, ÷òî ÃÌÑ èìååò íåïðåðûâíóþ ñòðóêòóðó êàê ïî ñòðîêàì, òàê è ïî ñòîëáöàì (ò.í. FastTrack Interconnect). Kàê ìîæíî âèäåòü èç Ðèñ. 1.18, ËÝ èìåþò âîçìîæíîñòü êîììóòàöèè âõîäîâ è âûõîäîâ êàê íà ËÌÑ, òàê è íà ÃÌÑ. Kðîìå òîãî, íà ËÝ ìîãóò áûòü ñôîðìèðîâàíû ãëîáàëüíûå óïðàâëÿþùèå ñèãíàëû, òàêèå, êàê âíóòðåííÿÿ òàêòîâàÿ ÷àñòîòà, ñèãíàëû àñèíõðîííîãî ñáðîñà è óñòàíîâêè. Kàæäûé ËÁ êîììóòèðóåòñÿ íà äâå ËÌÑ, òåì ñàìûì óëó÷øàÿ âîçìîæíîñòè òðàññèðîâêè ÏËÈÑ. Íà Ðèñ. 1.19 ïðèâåäåíà ñòðóêòóðíàÿ ñõåìà ýëåìåíòà ââîäà/âûâîäà. Kàê ìîæíî çàìåòèòü, Ý ïîçâîëÿåò ñêîììóòèðîâàòü äàííûå êàê íà ãëîáàëüíûå öåïè, òàê è íà ëîêàëüíóþ ìàòðèöó ñîåäèíåíèé. Óïðàâëåíèå Ý îñóùåñòâëÿåòñÿ ñ ïîìîùüþ ãëîáàëüíîãî óïðàâëÿþùåãî ñèãíàëà ðàçðåøåíèÿ âûõîäà (chip-wide output enable). Kðîìå òîãî, ìîæíî çàäàòü ðåæèì ïîíèæåííîé ñêîðîñòè ïåðåêëþ÷åíèÿ ÝÂÂ, ÷òî ïîçâîëÿåò ñíèçèòü «çâîí», âîçíèêàþùèé ïðè âûñîêîé ñêîðîñòè ïåðåêëþ÷åíèÿ, ïðàâäà, öåíîé 5 íñ çàäåðæêè.
К ГМС
Задержка
Разрешение выхода К ЛМС
Контроль скорости ЭВВ
AL1019+
К ЛМС
Ðèñ. 1.19. Ýëåìåíò ââîäà/âûâîäà
ÏËÈÑ ñåìåéñòâà FLEX6000 ïîääåðæèâàþò âîçìîæíîñòü êîíôèãóðàöèè ÷åðåç ïîðò JTAG, âðåìåííûå äèàãðàììû ïðèâåäåíû íà Ðèñ. 1.20. Âðåìåííûå ïàðàìåòðû êîíôèãóðàöèè ïî ïîðòó JTAG ïðèâåäåíû â Òàáë. 1.6. Íà Ðèñ. 1.21 ïðèâåäåíà âðåìåííàÿ ìîäåëü ñåìåéñòâà FLEX6000, à â Òàáë. 1.7 çíà÷åíèÿ åå ïàðàìåòðîâ.
41
Ýëåìåíòíàÿ áàçà
TMS TDI tJCP tJCH
tJPSU
tJCL
tJPH
TCK tJPZX
tJPCO
tJPXZ
TDO tJSSU
tJSH
Захват tJSZX
tJSCO
tJSXZ AL1020+
Управление
Ðèñ. 1.20. Âðåìåííûå äèàãðàììû êîíôèãóðàöèè ÷åðåç ïîðò JTAG Òàáëèöà 1.6. Âðåìåííûå ïàðàìåòðû êîíôèãóðàöèè ïî ïîðòó JTAG Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå min max
tJCP
Ïåðèîä ñèãíàëà ÒÑK [íñ]
100
tJCH
Äëèòåëüíîñòü åäèíè÷íîãî óðîâíÿ ñèãíàëà ÒÑK [íñ]
50
tJCL
Äëèòåëüíîñòü íóëåâîãî óðîâíÿ ñèãíàëà ÒÑK [íñ]
50
tJPSU
Âðåìÿ óñòàíîâëåíèÿ ïîðòà JTAG [íñ]
20
tJPH
Äëèòåëüíîñòü ñèãíàëà JTAG
45
tJPCO
Çàäåðæêà ðàñïðîñòðàíåíèÿ ñèãíàëà îòíîñèòåëüíî òàêòà JTAG [íñ]
25
tJPZX
Çàäåðæêà ïåðåõîäà ñèãíàëà JTAG èç òðåòüåãî ñîñòîÿíèÿ [íñ]
25
tJPXZ
Çàäåðæêà ïåðåõîäà ñèãíàëà JTAG â òðåòüå ñîñòîÿíèå [íñ]
25
tJSSU
Âðåìÿ óñòàíîâêè ðåãèñòðà çàõâàòà [íñ]
20
tJSH
Äëèòåëüíîñòü ñèãíàëà íà âõîäå ðåãèñòðà çàõâàòà [íñ]
45
tJSCO
Çàäåðæêà îáíîâëåíèÿ ñèãíàëà â ðåãèñòðå çàõâàòà îòíîñèòåëüíî òàêòà [íñ]
35
tJSZX
Çàäåðæêà ïåðåõîäà ñèãíàëà ðåãèñòðà çàõâàòà èç òðåòüåãî ñîñòîÿíèÿ [íñ]
35
42
Ýëåìåíòíàÿ áàçà
tROW Перенос Каскадирование
tLOCAL
tREG_TO_REG tCASC_TO_REG tCARRY_TO_REG tDATA_TO_REG
tREG_TO_OUT tCASC_TO_OUT tCARRY_TO_OUT tDATA_TO_OUT
tSU tH tCO tCLR
tCOL tC tLD_CLR tLEGLOBAL tREG_TO_CARRY
tCARRY_TO_CARRY tDATA_TO_CARRY
tREG_TO_CASC tCASC_TO_CASC tCARRY_TO_CASC tDATA_TO_CASC ЛЭ
tLABCARRY Перенос
tIOE
tIN tIN_DELAY
tLABCASC Каскадирование
tOO1 tOO2 tOO3 tXZ tZX1 tZX2 tZX3
I/O PIN
ЭВВ
Ðèñ. 1.21. Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà FLEX6000
43
AL1021+
tDIN_D tDIN_C
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.7. Ïàðàìåòðû âðåìåííîé ìîäåëè Îáîçíà÷åíèå tREG_TO_REG tCASC_TO_REG tCARRY_TO_REG tDATA_TO_REG tCASC_TO_OUT tCARRY_TO_OUT tDATA_TO_OUT tREG_TO_OUT tSU tH tCO tCLR tC tLD_CLR tCARRY_TO_CARRY tREG_TO_CARRY tDATA_TO_CARRY tCARRY_TO_CASC tREG_TO_CASC tCASC_TO_CASC tDATA_TO_CASC tCH tCL tOD1 tOD2 tOD3
Ïàðàìåòð Çàäåðæêà íà ÒÏ äëÿ îáðàòíîé ñâÿçè òðèããåðà ËÝ â öåïî÷êå ïåðåíîñà Çàäåðæêà â öåïè êàñêàäèðîâàíèÿ äî âõîäà ðåãèñòðà Çàäåðæêà â öåïè ïåðåíîñà äî âõîäà ðåãèñòðà
Çíà÷åíèå äëÿ EPF6010A-1 [íc] min max
1.2
0.9 0.9
Çàäåðæêà âõîäíûõ äàííûõ ËÝ äî ðåãèñòðà Çàäåðæêà îò âõîäà êàñêàäèðîâàíèÿ äî âûõîäà ËÝ Çàäåðæêà îò âõîäà ïåðåíîñà äî âûõîäà ËÝ Çàäåðæêà âõîäíûõ äàííûõ ËÝ äî âûõîäà Çàäåðæêà äàííûõ ñ âûõîäà ðåãèñòðà äî âûõîäà ËÝ
1.1 1.3 1.6 1.7 0.4
Âðåìÿ óñòàíîâêè ðåãèñòðà Âðåìÿ óäåðæàíèÿ ñèãíàëà íà âõîäå ðåãèñòðà ïîñëå ïîäà÷è ñèíõðîèìïóëüñà Çàäåðæêà âûõîäíîãî ñèãíàëà ðåãèñòðà îòíîñèòåëüíî òàêòà Çàäåðæêà ñáðîñà ðåãèñòðà Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà íà ðåãèñòðå Çàäåðæêà ñèãíàëà ñèíõðîííîãî ñáðîñà èëè çàãðóçêè ðåãèñòðà â ðåæèìå ñ÷åò÷èêà Çàäåðæêà ñèãíàëà ïåðåíîñà îò âõîäà ïåðåíîñà äî âûõîäà ïåðåíîñà Çàäåðæêà âûõîäíîãî ñèãíàëà ðåãèñòðà äî âûõîäà ïåðåíîñà Çàäåðæêà âõîäíûõ äàííûõ ËÝ äî âûõîäà ïåðåíîñà Çàäåðæêà ñèãíàëà ïåðåíîñà îò âõîäà äî âûõîäà êàñêàäèðîâàíèÿ Çàäåðæêà âûõîäíîãî ñèãíàëà ðåãèñòðà äî âûõîäà êàñêàäèðîâàíèÿ Çàäåðæêà ñèãíàëà êàñêàäèðîâàíèÿ îò âõîäà êàñêàäèðîâàíèÿ äî âûõîäà êàñêàäèðîâàíèÿ Çàäåðæêà âõîäíûõ äàííûõ ËÝ äî âûõîäà êàñêàäèðîâàíèÿ Äëèòåëüíîñòü âûñîêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà Äëèòåëüíîñòü íèçêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 3.3 Â, slew rate = off Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 2.5 Â, slew rate = off Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, slew rate = on
0.9
1.4
0.3 0.4 1.8
1.8
0.1
1.6 2.1
1.0
1.4
0.5
2.5 2.5
1.1
1.9
4.1
5.8
44
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.7 (îêîí÷àíèå) Îáîçíà÷åíèå
tXZ tZX1
Ïàðàìåòð Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà çàïðåùåíèÿ âûõîäà Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 3.3 Â, slew rate = off
Çíà÷åíèå äëÿ EPF6010A-1 [íc] min max
1.4
1.4
tZX2
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 2.5 Â, slew rate = off
3.6
tZX3
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, slew rate = on
5.3
tIOE
Çàäåðæêà ñèãíàëà ðàçðåøåíèÿ âûõîäà
0.5
tIN
Çàäåðæêà ñèãíàëà âî âõîäíîì áóôåðå
3.6
Çàäåðæêà ñèãíàëà âî âõîäíîì áóôåðå ïðè ââåäåíèè äîïîëíèòåëüíîé çàäåðæêè
4.8
tIN_DELAY tLOCAL
Çàäåðæêà ËÌÑ
0.7
tROW
Çàäåðæêà â ñòðîêå ÃÌÑ
2.9
tCÎL
Çàäåðæêà â ñòîëáöå ÃÌÑ
1.2
Çàäåðæêà äàííûõ ñ âûäåëåííîãî âûâîäà äî âõîäà ËÝ
5.4
4.3
2.6 0.7
tDIN_D tDIN_C tLEGLOBAL
Çàäåðæêà óïðàâëÿþùèõ ñèãíàëîâ ñ âûäåëåííîãî âûâîäà äî âõîäà ËÝ Çàäåðæêà ñôîðìèðîâàííîãî â ÏËÈÑ óïðàâëÿþùåãî ñèãíàëà ñ âûõîäà ËÝ äî âõîäîâ äðóãèõ ËÝ
tLABCARRY
Çàäåðæêà ñèãíàëà ïåðåíîñà â äðóãîé ËÁ
tLABCASC
Çàäåðæêà ñèãíàëà êàñêàäèðîâàíèÿ â äðóãîé ËÁ
1.3
Òåñòîâàÿ çàäåðæêà ðåãèñòð-ðåãèñòð
37.6
2.1
0.2
2.0
t1 tDPR tINSU tINH tOUTCO
Òåñòîâàÿ çàäåðæêà ðåãèñòð-ðåãèñòð ÷åðåç 4 ËÝ, 3 ðÿäà è 4 ËÌÑ Âðåìÿ óñòàíîâêè ãëîáàëüíîãî ñèíõðîñèãíàëà íà ðåãèñòðå ËÝ Âðåìÿ óäåðæàíèÿ äàííûõ äëÿ ãëîáàëüíîãî ñèíõðîñèãíàëà íà ðåãèñòðå ËÝ Çàäåðæêà ïîÿâëåíèÿ äàííûõ íà âûõîäå äëÿ ãëîáàëüíîãî
Âåëè÷èíû âðåìåí çàäåðæåê ðàñïðîñòðàíåíèÿ ñèãíàëà ïî ÃÌÑ ïðèâîäÿòñÿ èç ðàñ÷åòà «õóäøåãî ñëó÷àÿ».
45
Ýëåìåíòíàÿ áàçà
1.3. Ñåìåéñòâî MAX7000 ÏËÈÑ ñåìåéñòâà MAX7000 ÿâëÿþòñÿ ïåðâûìè CPLD ôèðìû «Altera», âûïîëíåííûìè ïî òåõíîëîãèè ÏÇÓ ñ ýëåêòðè÷åñêèì ñòèðàíèåì (EÅPROM).  íàñòîÿùåå âðåìÿ âûïóñêàþòñÿ ÏËÈÑ ñåìåéñòâ MAX7000, MAX7000A, MAX7000B, MAX7000E, MAX7000S. Ñåìåéñòâa MAX7000A è MAX7000B ðàññ÷èòàíû íà ðàáîòó â ñèñòåìàõ ñ íàïðÿæåíèåì ïèòàíèÿ 3.3 è 2.5  ñîîòâåòñòâåííî, ÏËÈÑ ñåìåéñòâà MAX7000S ÿâëÿåòñÿ äàëüíåéøèì ðàçâèòèåì 5-âîëüòîâîãî ñåìåéñòâà MAX7000, äîïóñêàÿ âîçìîæíîñòü ïðîãðàììèðîâàíèÿ â ñèñòåìå.  íàñòîÿùåå âðåìÿ ýòî ñåìåéñòâî, ïîæàëóé, ÿâëÿåòñÿ ñàìûì ïîïóëÿðíûì CPLD ó ðîññèéñêèõ ðàçðàáîò÷èêîâ. Ýòî ñâÿçàíî ñ òåì, ÷òî äëÿ ðàáîòû ñ ÏËÈÑ ýòîãî ñåìåéñòâà íå òðåáóåòñÿ íèêàêèõ ñåðüåçíûõ çàòðàò, ïîñêîëüêó ïàêåò MAX+PLUS II BASELINE ïîëíîñòüþ ïîääåðæèâàåò âñåõ ïðåäñòàâèòåëåé ýòîãî ñåìåéñòâà ÏËÈÑ, à äëÿ ïðîãðàììèðîâàíèÿ è çàãðóçêè êîíôèãóðàöèè óñòðîéñòâ îïóáëèêîâàíà ñõåìà çàãðóçî÷íîãî êàáåëÿ ByteBlaster è ByteBlasteMV.  Òàáë. 1.8 ïðèâåäåíû îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà MAX7000S. Òàáëèöà 1.8. Îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà MAX7000S Ïàðàìåòð Ëîãè÷åñêàÿ åìêîñòü, êîëè÷åñòâî ýêâèâàëåíòíûõ âåíòèëåé
EPM7032S EPM7064S EPM7128S EPM7160S EPM7192S EPM7256S 600
1 250
2 500
3 200
3 750
5 000
32
64
128
160
192
256
2
4
8
10
12
16
×èñëî ïðîãðàììèðóåìûõ ïîëüçîâàòåëåì âûâîäîâ
36
68
100
104
124
164
Çàäåðæêà ðàñïðîñòðàíåíèÿ ñèãíàëà âõîä/âûõîä, tPD [íñ]
5
5
6
6
7.5
7.5
Âðåìÿ óñòàíîâêè ãëîáàëüíîãî òàêòîâîãî ñèãíàëà, tSU [íñ]
2.9
2.9
3.4
3.4
4.1
3.9
Çàäåðæêà ãëîáàëüíîãî òàêòîâîãî ñèãíàëà äî âûõîäà, tCO1 [íñ]
2.5
2.5
2.5
2.5
3.0
3.0
Ìàêñèìàëüíàÿ ãëîáàëüíàÿ òàêòîâàÿ ÷àñòîòà, fCNT [ÌÃö]
175.4
175.4
147.1
149.3
125.0
128.2
×èñëî ìàêðîÿ÷ååê ×èñëî ëîãè÷åñêèõ áëîêîâ
46
Ýëåìåíòíàÿ áàçà
Âñå ÏËÈÑ ñåìåéñòâà MAX7000S ïîääåðæèâàþò òåõíîëîãèþ ïðîãðàììèðîâàíèÿ â ñèñòåìå ISP è ïåðèôåðèéíîãî ñêàíèðîâàíèÿ â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std. 1149.1 1990 (JTAG). Ýëåìåíòû ââîäà/âûâîäà ïîçâîëÿþò ðàáîòàòü â ñèñòåìàõ ñ óðîâíÿìè ñèãíàëîâ 5 èëè 3.3 Â. Ìàòðèöà ñîåäèíåíèé èìååò íåïðåðûâíóþ ñòðóêòóðó, ÷òî ïîçâîëÿåò ðåàëèçîâàòü âðåìÿ çàäåðæêè ðàñïðîñòðàíåíèÿ ñèãíàëà äî 5 íñ. ÏËÈÑ ñåìåéñòâà MAX7000S èìåþò âîçìîæíîñòü àïïàðàòíîé ýìóëÿöèè âûõîäîâ ñ îòêðûòûì êîëëåêòîðîì è óäîâëåòâîðÿþò òðåáîâàíèÿì ñòàíäàðòà PCI. Èìååòñÿ âîçìîæíîñòü èíäèâèäóàëüíîãî ïðîãðàììèðîâàíèÿ öåïåé ñáðîñà, óñòàíîâêè è òàêòèðîâàíèÿ òðèããåðîâ, âõîäÿùèõ â ìàêðîÿ÷åéêó. Ïðåäóñìîòðåí ðåæèì ïîíèæåííîãî ýíåðãîïîòðåáëåíèÿ. Ïðîãðàììèðóåìûé ëîãè÷åñêèé ðàñøèðèòåëü ïîçâîëÿåò ðåàëèçîâàòü íà îäíîé ìàêðîÿ÷åéêå ôóíêöèè äî 32 ïåðåìåííûõ. Èìååòñÿ âîçìîæíîñòü çàäàíèÿ áèòà ñåêðåòíîñòè äëÿ çàùèòû îò íåñàíêöèîíèðîâàííîãî òèðàæèðîâàíèÿ ðàçðàáîòêè.  îòëè÷èå îò àðõèòåêòóðû ÏËÈÑ ñåìåéñòâà MAX7000 (Ðèñ. 1.22), ÏËÈÑ ñåìåéñòâà MAX7000S (Ðèñ. 1.23) èìåþò âîçìîæíîñòü èñïîëüçîâàíèÿ äâóõ ãëîáàëüíûõ òàêòîâûõ ñèãíàëîâ. Íà Ðèñ. 1.24 ïðèâåäåíà ñòðóêòóðà ìàêðîÿ÷åéêè ëîãè÷åñêîãî ýëåìåíòà ÏËÈÑ MAX7000S. Kàê ìîæíî çàìåòèòü, Ìß ÏËÈÑ ñåìåéñòâà MAX7000 íå îòëè÷àåòñÿ îò Ìß ñåìåéñòâà MAX3000. Àíàëîãè÷íî ÏËÈÑ ñåìåéñòâà MAX3000, ÏËÈÑ ñåìåéñòâà MAX7000 èìåþò âîçìîæíîñòü èñïîëüçîâàíèÿ ïàðàëëåëüíîãî è ðàçäåëÿåìîãî ðàñøèðèòåëåé, êîòîðûå ïîäðîáíî îïèñàíû â ïàðàãðàôå 1.1. Íà Ðèñ. 1.25 ïðèâåäåíà âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà MAX7000, à â Òàáë. 1.9 è 1.10 åå ïàðàìåòðû. Òàáëèöà 1.9. Ïàðàìåòðû âðåìåííîé ìîäåëè ÏËÈÑ ñåìåéñòâà MAX7000 (âñå çíà÷åíèÿ çàäåðæåê è âðåìåí â íñ) Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå äëÿ EPM70128S-10 [íñ] min
max
tIN
Çàäåðæêà íà âõîäå è âõîäíîì áóôåðå
2.0
tIO
Çàäåðæêà íà äâóíàïðàâëåííîì âûâîäå è âõîäíîì áóôåðå
2.0
tSEXP
Çàäåðæêà ðàçäåëÿåìîãî ðàñøèðèòåëÿ
8.0
tPEXP
Çàäåðæêà ïàðàëëåëüíîãî ðàñøèðèòåëÿ
1.0
tLAD
Çàäåðæêà â ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöå «È»
6.0
47
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.9 (îêîí÷àíèå) Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå äëÿ EPM70128S -10 min
max
tLAC
Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà òðèããåðà â ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöå «È»
6.0
tIOE
Âíóòðåííÿÿ çàäåðæêà ñèãíàëà ðàçðåøåíèÿ
3.0
tOD1
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 3.3 Â, slew rate = off
4.0
tOD2
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 2.5 Â, slew rate = off
5.0
tOD3
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, slew rate = on
8.0
tZX1
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 3.3 Â, slew rate = off
6.0
tZX2
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 2.5 Â, slew rate = off
7.0
tZX3
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, slew rate = on
8.0
tXZ
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà çàïðåùåíèÿ âûõîäà
6.0
tSU
Âðåìÿ óñòàíîâêè ðåãèñòðà
4.0
tH
Âðåìÿ óäåðæàíèÿ ñèãíàëà íà ðåãèñòðå
4.0
tRD
Ðåãèñòðîâàÿ çàäåðæêà
1.0
Kîìáèíàöèîííàÿ çàäåðæêà
1.0
Çàäåðæêà èçìåíåíèÿ ñèãíàëà îòíîñèòåëüíî òàêòîâîãî èìïóëüñà
6.0
Çàäåðæêà ðàçðåøåíèÿ ðåãèñòðà
6.0
tPRE
Çàäåðæêà ãëîáàëüíûõ óïðàâëÿþùèõ ñèãíàëîâ
1.0
tPRE
Âðåìÿ ïðåäóñòàíîâêè ðåãèñòðà Ìß
4.0
tCLR
Âðåìÿ ñáðîñà ðåãèñòðà Ìß
4.0
tPIA
Çàäåðæêà ÏÌÑ
2.0
tLPA
Çàäåðæêà çà ñ÷åò ðåæèìà ïîíèæåííîãî ïîòðåáëåíèÿ
13.0
tCOMB tIC tGLOB
48
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.10. Ïàðàìåòðû âðåìåííîé ìîäåëè ÏËÈÑ ñåìåéñòâà MAX7000 (âðåìåííûå ïàðàìåòðû â íñ, ÷àñòîòû â ÌÃö) Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå äëÿ EPM70128S -10 min
max
tPD1
Çàäåðæêà âõîä êîìáèíàòîðíûé âûõîä
10.0
tPD2
Çàäåðæêà âõîä ðåãèñòðîâûé âûõîä
10.0
tSU
Âðåìÿ óñòàíîâêè ãëîáàëüíîãî ñèíõðîñèãíàëà
7.0
tH
Âðåìÿ óäåðæàíèÿ ãëîáàëüíîãî ñèíõðîñèãíàëà
0.0
tCO1
Çàäåðæêà ãëîáàëüíîãî ñèíõðîñèãíàëà äî âûõîäà
4.5
tCH
Äëèòåëüíîñòü âûñîêîãî óðîâíÿ ãëîáàëüíîãî ñèíõðîñèãíàëà
4.0
tCL
Äëèòåëüíîñòü íèçêîãî óðîâíÿ ãëîáàëüíîãî ñèíõðîñèãíàëà
4.0
tASU
Âðåìÿ óñòàíîâêè ñèíõðîñèãíàëà òðèããåðà Ìß
2.0
tAH
Âðåìÿ óäåðæàíèÿ ñèíõðîñèãíàëà òðèããåðà Ìß
5.0
tACO1
Çàäåðæêà ñèíõðîñèãíàëà òðèããåðà Ìß äî âûõîäà
10.0
tACH
Äëèòåëüíîñòü âûñîêîãî óðîâíÿ ñèíõðîñèãíàëà òðèããåðà Ìß
4.0
tACL
Äëèòåëüíîñòü íèçêîãî óðîâíÿ ñèíõðîñèãíàëà òðèããåðà Ìß
4.0
tCPPW
Ìèíèìàëüíàÿ äëèòåëüíîñòü ñèãíàëîâ ñáðîñà è óñòàíîâêè òðèããåðà Ìß
4.0
tCNT
Ìèíèìàëüíûé ïåðèîä ãëîáàëüíîãî ñèíõðîñèãíàëà
10.0
fCNT
Ìàêñèìàëüíàÿ ãëîáàëüíàÿ âíóòðåííÿÿ òàêòîâàÿ ÷àñòîòà
100
tACNT
Ìèíèìàëüíûé ïåðèîä ñèíõðîñèãíàëà òðèããåðà Ìß
10.0
fACNT
Ìàêñèìàëüíàÿ âíóòðåííÿÿ òàêòîâàÿ ÷àñòîòà òðèããåðà Ìß
100
fMAX
Ìàêñèìàëüíàÿ òàêòîâàÿ ÷àñòîòà
125.0
49
50
INPUT/GCLK1
ЭВВ
8...16 I/O PINS
8...16
8...16
ЛБ C
ЛБ A
Ðèñ. 1.22. Àðõèòåêòóðà ñåìåéñòâà MAX7000
ЭВВ
8...16 I/O PINS
INPUT/OE2n
INPUT/OE1n
МЯ 33...48
МЯ 1...16
8...16
16
36
8...16
16
36
8...16
8...16 PIA
16
36
16
36
МЯ 49...64
МЯ 17...32
ЛБ D
ЛБ B
8...16
8...16
ЭВВ
ЭВВ
8...16 I/O PINS
8...16 I/O PINS
AL1022+
INPUT/GCLRn
Ýëåìåíòíàÿ áàçà
51
INPUT/GCLK1
МЯ 1...16
36
PIA
36
МЯ 17...32
6
ЭВВ
6
ЭВВ
6...16
6...16
6...16
ЛБ C МЯ 33...48
6...16
16
36
6...16
16
6...16
16
36
6...16
16
МЯ 49...64
ЛБ D
ЛБ B
6...16
6...16
6...16
6...16
6
ЭВВ
6
ЭВВ
6
ЛБ A
6 6...16
Разрешение выхода
Разрешение выхода
Ðèñ. 1.23. Àðõèòåêòóðà ñåìåéñòâà MAX7000S
6...16 I/O PINS
6...16 I/O PINS
INPUT/GCLRn
INPUT/OE1
6...16 I/O PINS
6...16 I/O PINS
AL1023+
INPUT/OE2/GCLK2
Ýëåìåíòíàÿ áàçà
52 16 сигналов с расширителей
Матрица распределения термов
2
VCC
Глобальный сигнал синхронизации Cброс Параллельный расширитель
Ðèñ. 1.24. Ñòðóêòóðà ìàêðîÿ÷åéêè ñåìåéñòâà MAX7000
AL1024+
36 сигналов ПМС
ПМС
ENA CLRN
К ПМС
PRN D/T Q Регистр
К ЭВВ
К ЭВВ
Ýëåìåíòíàÿ áàçà
Ýëåìåíòíàÿ áàçà
tIOE (1) tIN
tGLOB
tPIA
tLAD
tPEXP
tCOMB
tLAC tIC tEN tFIN (1)
tIO
AL1025+
tSEXP
tOD1 tOD2 (2) tOD3 tXZ tZX1 tZX2 (2) tZX3 (1)
tSU tH tPRE tCLR tRD
Ðèñ. 1.25. Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà MAX7000
1.4. Ñåìåéñòâî FLEX8000 ÏËÈÑ ñåìåéñòâà FLEX8000 âûïóñêàþòñÿ ïî òåõíîëîãèè 0.5 ìêì SRAM ñ òðåìÿ ñëîÿìè ìåòàëëèçàöèè è ïðèãîäíû äëÿ ðåàëèçàöèè íå î÷åíü ñëîæíûõ àëãîðèòìîâ ÖÎÑ.  Òàáë. 1.11 ïðèâåäåíû îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà FLEX8000. Äàííûå ÏËÈÑ îáëàäàþò âûñîêèìè õàðàêòåðèñòèêàìè íàäåæíîñòè, ïîýòîìó îíè äîñòàòî÷íî ÷àñòî âûïóñêàþòñÿ â èíäóñòðèàëüíîì ïðèìåíåíèè. Òàáëèöà 1.11. Îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà FLEX8000 Ïàðàìåòð Ëîãè÷åñêàÿ åìêîñòü, êîëè÷åñòâî ýêâèâàëåíòíûõ âåíòèëåé
EPF8282 EPF8452 EPF8636 EPF8820 EPF81188 EPF81500 2 500
4 000
6 000
8 000
12 000
16 000
×èñëî ëîãè÷åñêèõ ýëåìåíòîâ
208
336
504
672
1 008
1 296
×èñëî ëîãè÷åñêèõ áëîêîâ
282
452
636
820
1 188
1 500
×èñëî ïðîãðàììèðóåìûõ ïîëüçîâàòåëåì âûâîäîâ
78
120
136
152
184
208
53
Ýëåìåíòíàÿ áàçà Íà Ðèñ. 1.26 ïðèâåäåíà îáîáùåííàÿ ôóíêöèîíàëüíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà FLEX8000. Kàê ìîæíî çàìåòèòü, â àðõèòåêòóðå ÏËÈÑ ñåìåéñòâà FLEX8000 ìíîãî îáùåãî ñ ðàññìîòðåííûì â ïàðàãðàôå 1.2 ñåìåéñòâîì FLEX6000, îäíàêî ïîñêîëüêó ñåìåéñòâî FLEX8000 áûëî ðàçðàáîòàíî çíà÷èòåëüíî ðàíüøå, òî èìååòñÿ ðÿä îòëè÷èé. Ëîãè÷åñêèå áëîêè ÏËÈÑ ñåìåéñòâà FLEX8000 îáúåäèíÿþò ïî 8 ëîãè÷åñêèõ ýëåìåíòîâ íà ËÌÑ, ïðè ýòîì â îòëè÷èå îò ñåìåéñòâà FLEX6000 êàæäûé ËÁ èìååò âîçìîæíîñòü êîììóòàöèè òîëüêî íà îäíó ñòðîêó è ñòîëáåö ÃÌÑ. Ñòðóêòóðà ËÁ ÏËÈÑ ñåìåéñòâà FLEX8000 ïðèâåäåíà íà Ðèñ. 1.27. Kàæäûé ËÝ, âõîäÿùèé â ËÁ, èìååò âîçìîæíîñòü êîììóòàöèè êàê íà ËÌÑ, òàê è íà ñòðîêè è ñòîëáöû ÃÌÑ. Íà ËÌÑ ïîñòóïàåò 24 âõîäíûõ ñèãíàëà ñî ñðîêè ÃÌÑ, à òàêæå 8 ñèãíàëîâ îáðàòíîé ñâÿçè. Óïðàâëÿþùèå ñèãíàëû ôîðìèðóþòñÿ ëèáî èç ãëîáàëüíûõ âûäåëåííûõ óïðàâëÿþùèõ ñèãíàëîâ, ëèáî èç ñèãíàëîâ ËÌÑ. Ñòðóêòóðà ËÝ â öåëîì ïðàêòè÷åñêè ïîäîáíà ËÝ ÏËÈÑ ñåìåéñòâà FLEX6000.
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ГМС
ЭВВ
ЭВВ
ЭВВ ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
AL1026+
ЛБ
Ðèñ. 1.26. Óêðóïíåííàÿ ñòðóêòóðíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà FLEX8000
54
Ýëåìåíòíàÿ áàçà
Сигналы Строки ГМС 24
4 4
Перенос и каскадирование
8 Соеди3 нение строка— столбец
2
Локаль3 ные управ3 ляющие сигналы
4
4
8
16
ЛЭ1 4 ЛЭ2 4 ЛМС
ЛЭ3 4 ЛЭ4 4 ЛЭ5 4 ЛЭ6 4 ЛЭ7 4 ЛЭ8 2 Выходы переноса и каскадирование
Столбец ГМС
AL1027+
8
Ðèñ. 1.27. ËÁ ÏËÈÑ ñåìåéñòâà FLEX8000
ËÝ ÏËÈÑ ñåìåéñòâà FLEX8000 äîïóñêàþò êàñêàäèðîâàíèå, à òàêæå öåïî÷å÷íûå ïåðåíîñû, èìåþò âîçìîæíîñòü êîíôèãóðàöèè â íîðìàëüíîì, ñ÷åòíîì è àðèôìåòè÷åñêîì ðåæèìàõ. Âðåìåííàÿ ìîäåëü ÏËÈÑ FLEX8000 ïðèâåäåíà íà Ðèñ 1.28 è 1.29. Îñíîâíûå ïàðàìåòðû âðåìåííîé ìîäåëè ÏËÈÑ ñåìåéñòâà FLEX8000 ïðèâåäåíû â Òàáë. 1.12.
55
Ýëåìåíòíàÿ áàçà
tROW Перенос
tLOCAL
Каскадирование
tLUT tRLUT tCLUT
tCO tCOMB tSU tH tPRE tCLR
tGATE
tGEN tCGEAN tCICO
tC
tCOL
tCASC ЛЭ
tLABCARRY Перенос
tLABCASC AL1028+
tDIN_D tDIN_C tDIN_O
Каскадирование
Ðèñ. 1.28. Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà FLEX8000
ЭВВ tIOD
tIOC tIOE
tIOCO tIOCOMB tIOSU tIOH tIOCLR
tOD1 tOD2 tOD3 tXZ tZX1 tZX2 tZX3
AL1029+
tIN
Ðèñ. 1.29. Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà FLEX8000
56
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.12. Ïàðàìåòðû âðåìåííîé ìîäåëè ÏËÈÑ ñåìåéñòâà FLEX8000 Îáîçíà÷åíèå tIOD tIOC tIOE tIOCO tIOCOMB tIOSU tIOH tIOCLR tIN tOD1 tOD3 tXZ tZX1 tZX3 tLUT tCLUT tRLUT tGATE tCASC tCICO tCGEN tCGENR tC tCH tCL tCO tCOMB tSU
Ïàðàìåòð Çàäåðæêà äàííûõ â ðåãèñòðå Ý Çàäåðæêà ñèãíàëà óïðàâëåíèÿ ðåãèñòðà Ý Çàäåðæêà ñèãíàëà ðàçðåøåíèÿ âûõîäà Çàäåðæêà ïîÿâëåíèÿ äàííûõ íà âûõîäå ðåãèñòðà Ý ïîñëå ïîäà÷è ñèíõðîèìïóëüñà Çàäåðæêà êîìáèíàöèîííûõ ñõåì Ý Âðåìÿ óñòàíîâêè ðåãèñòðà Ý Âðåìÿ óäåðæàíèÿ äàííûõ ðåãèñòðà Ý Çàäåðæêà ñáðîñà ðåãèñòðà Ý Çàäåðæêà ñèãíàëà âî âõîäíîì áóôåðå Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 3.3 Â, slew rate = off Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, slew rate = on Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà çàïðåùåíèÿ âûõîäà Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 3.3 Â, slew rate = off Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, slew rate = on Çàäåðæêà äàííûõ â ÒÏ Çàäåðæêà ôîðìèðîâàíèÿ ñèãíàëà ïåðåíîñà â ÒÏ Çàäåðæêà ñèãíàëà îáðàòíîé ñâÿçè ðåãèñòðà â ÒÏ Çàäåðæêà â ëîãèêå êàñêàäèðîâàíèÿ Çàäåðæêà â öåïè êàñêàäèðîâàíèÿ Çàäåðæêà äàííûõ ñî âõîäà íà âûõîä óñêîðåííîãî ïåðåíîñà Çàäåðæêà ðàñïðîñòðàíåíèÿ äàííûõ ñî âõîäà íà âûõîä ïåðåíîñà Çàäåðæêà ñèãíàëà îáðàòíîé ñâÿçè ñ ðåãèñòðà ËÝ íà öåïü ïåðåíîñà Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà íà ðåãèñòðå Äëèòåëüíîñòü âûñîêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà Äëèòåëüíîñòü íèçêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà Çàäåðæêà âûõîäíîãî ñèãíàëà ðåãèñòðà îòíîñèòåëüíî òàêòà Çàäåðæêà â êîìáèíàöèîííîé ÷àñòè ËÝ Âðåìÿ óñòàíîâêè ðåãèñòðà
57
Çíà÷åíèå äëÿ EPF8282À-2 [íñ] min max 0.7 1.7 1.7
1.0
1.4 0.0
0.3 1.2 1.5
1.1
4.6
1.4
1.4
4.9
2.0 0.0 0.9 0.0 0.6 0.4
0.4
0.9
4.0 4.0 0.8
1.6 0.4 0.4
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.12 (îêîí÷àíèå) Îáîçíà÷åíèå tH tPRE tCLR tLABCASC tLABCARRY tLOCAL tROW tCÎL tDIN_D tDIN_C tDIN_IO tDPR
Çíà÷åíèå äëÿ EPF8282À-2 [íñ] min max
Ïàðàìåòð Âðåìÿ óäåðæàíèÿ ñèãíàëà íà âõîäå ðåãèñòðà ïîñëå ïîäà÷è ñèíõðîèìïóëüñà Çàäåðæêà ïðåäóñòàíîâêè ðåãèñòðà Çàäåðæêà ñáðîñà ðåãèñòðà Çàäåðæêà ñèãíàëà êàñêàäèðîâàíèÿ â äðóãîé ËÁ Çàäåðæêà ñèãíàëà ïåðåíîñà â äðóãîé ËÁ Çàäåðæêà ËÌÑ Çàäåðæêà â ñòðîêå ÃÌÑ Çàäåðæêà â ñòîëáöå ÃÌÑ Çàäåðæêà äàííûõ ñ âûäåëåííîãî âûâîäà äî âõîäà ËÝ Çàäåðæêà óïðàâëÿþùèõ ñèãíàëîâ ñ âûäåëåííîãî âûâîäà äî âõîäà ËÝ Çàäåðæêà óïðàâëÿþùèõ ñèãíàëîâ ñ âûäåëåííîãî âûâîäà äî âõîäîâ óïðàâëåíèÿ Ý Òåñòîâàÿ çàäåðæêà ðåãèñòð-ðåãèñòð ÷åðåç 4 ËÝ, 3 ðÿäà è 4 ËÌÑ
0.9
0.6 0.6 0.3 0.3 0.5 4.2 2.5 7.2
5.0
5.0
15.8
1.5. Ñåìåéñòâî MAX9000 Ñåìåéñòâî ÏËÈÑ MAX9000 èìååò ìàòðè÷íóþ ñòðóêòóðó, ïîäîáíóþ ÏËÈÑ ñåìåéñòâ FLEX6000 è FLEX8000, íî âûïîëíåíà ïî EPROM òåõíîëîãèè, òàê æå, êàê è ÏËÈÑ ñåìåéñòâ MAX3000 è MAX7000. Ìèêðîñõåìû ñåìåéñòâà MAX9000 èìåþò äîñòàòî÷íî âûñîêóþ ëîãè÷åñêóþ åìêîñòü è íå òðåáóþò âíåøíåãî êîíôèãóðàöèîííîãî ÏÇÓ. Áëàãîäàðÿ ìàòðè÷íîé ñòðóêòóðå ìåæñîåäèíåíèé îíè ÿâëÿþòñÿ ïîäõîäÿùåé ýëåìåíòíîé áàçîé äëÿ ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ. Îñíîâíûå ïàðàìåòðû ÏËÈÑ ñåìåéñòâà MAX9000 ïðèâåäåíû â Òàáë. 1.13. Òàáëèöà 1.13. Ïàðàìåòðû ÏËÈÑ ñåìåéñòâà MAX9000 Ïàðàìåòð
EPM9320 EPM9400 EPM9480 EPM9560
Ëîãè÷åñêàÿ åìêîñòü, êîëè÷åñòâî ýêâèâàëåíòíûõ âåíòèëåé
600
1 250
2 500
5 000
×èñëî ìàêðîÿ÷ååê
320
400
480
560
×èñëî ëîãè÷åñêèõ áëîêîâ
484
580
676
772
×èñëî ïðîãðàììèðóåìûõ ïîëüçîâàòåëåì âûâîäîâ
168
159
175
216
58
Ýëåìåíòíàÿ áàçà
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ГМС
ЭВВ
ЭВВ
ЛБ ЭВВ
ЭВВ
ЭВВ
ЭВВ ЛМС
ЭВВ
ЭВВ
ЭВВ
ЭВВ
AL1030+
МЯ
Ðèñ. 1.30. Ñòðóêòóðíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà MAX9000
Ñòðóêòóðíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà MAX9000 ïðèâåäåíà íà Ðèñ. 1.30.  îñíîâå àðõèòåêòóðû ÏËÈÑ ñåìåéñòâà MAX9000 ëåæèò ãëîáàëüíàÿ ìàòðèöà ñîåäèíåíèé, ðàçäåëåííàÿ íà ñòðîêè è ñòîëáöû. Ìàêðîÿ÷åéêè îáúåäèíÿþòñÿ â ëîãè÷åñêèå áëîêè, ñîäåðæàùèå ïî 16 Ìß êàæäûé, à òàêæå ëîêàëüíóþ ìàòðèöó ñîåäèíåíèé. Íà Ðèñ. 1.31 ïðèâåäåíà ñòðóêòóðíàÿ ñõåìà ëîãè÷åñêîãî áëîêà ÏËÈÑ ñåìåéñòâà MAX9000. Kàê ìîæíî âèäåòü èç Ðèñ. 1.31, êàæäàÿ Ìß èìååò âîçìîæíîñòü êîììóòàöèè êàê íà ëîêàëüíóþ, òàê è íà ñòðîêè è ñòîëáöû ãëîáàëüíîé ìàòðèöû ñîåäèíåíèé. Ñîáñòâåííî ñòðóêòóðà Ìß ÏËÈÑ ñåìåéñòâà MAX9000 ïîêàçàíà íà Ðèñ. 1.32. Îíà ïðàêòè÷åñêè íå îòëè÷àåòñÿ îò Ìß ÏËÈÑ ñåìåéñòâ MAX7000 èëè MAX3000. Òàê æå, êàê è ó ÏËÈÑ ýòèõ ñåìåéñòâ, èìååòñÿ âîçìîæíîñòü èñïîëüçîâàíèÿ ïàðàëëåëüíûõ è ðàçäåëÿåìûõ ðàñøèðèòåëåé. Íàëè÷èå ýëåìåíòà ââîäà/âûâîäà ÏËÈÑ ñåìåéñòâà MAX9000 ïîêàçàíî íà Ðèñ. 1.33. Íàëè÷èå â Ý òàêòèðóåìîãî òðèããåðà ïîçâîëÿåò, ïî ñóòè, âûïîëíÿòü õðàíåíèå âõîäíûõ èëè âûõîäíûõ äàííûõ â ÝÂÂ, íå çàäåéñòâóÿ ðåñóðñû Ìß.
59
Ýëåìåíòíàÿ áàçà Выбор глобального управляющего сигнала GCLK1
DIN1
GCLK2 DIN2 DIN3
GCLR
DIN4
GOE Строки ГМС 38
16
16
16
16
48
1 16
2
48
3 4 5 6 7 ЛМС
8 9 10 11 12 13 14 15 16
16
Сигналы разделяемых расширителей
Столбец ГМС
AL1031+
16
Локальная обратная связь
Ðèñ. 1.31. Ñòðóêòóðíàÿ ñõåìà ëîãè÷åñêîãî áëîêà ÏËÈÑ ñåìåéñòâà MAX9000
60
Ýëåìåíòíàÿ áàçà МС
Матрица распределения термов
Параллельный расширитель
Cигналы ГМС
Сигналы ОС
Синхронизация Cброс
2 К ГМС PRN D/T Q Регистр
VCC
Сигналы с разделяемых расширителей
Ðèñ. 1.32. Ìß ÏËÈÑ ñåìåéñòâà MAX9000
61
Локальная ОС
AL1032+
ENA CLRN
Ýëåìåíòíàÿ áàçà
Управляющая шина
VCC
OE [7...0] 8 На ГМС
13 От ГМС D
Q
CLK [3...0] VCC
4
Контроль скорости ЭВВ
ENA CLRN
ENA [5...0] 6
VCC
CLR [1...0] AL1033+
2
Ðèñ. 1.33. ÝÂÂ ÏËÈÑ ñåìåéñòâà MAX9000
tROW
tLAD
tLOCAL
tPEXT
tLAC tIC tEN
tRD tCOMB tSU tH tPRE tCLR
tFTD tCOL
tSEXP tDIN_D tDIN_CLK tDIN_CLR tDIN_IO tDIN_IOC
AL1034+
МЯ
Ðèñ. 1.34. Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà MAX9000
62
Ýëåìåíòíàÿ áàçà
ЭВВ tIODR tIODC
tIORD tIOCOMB tIOSU tIOH tIOCLR
tIOC
tOD1 tOD2 tOD3 tXZ tZX1 tZX2 tZX3
Вывод ПЛИС
tIOFD
AL1035+
tINREG tINCOMB
Ðèñ. 1.35. Âðåìåííàÿ ìîäåëü ÝÂÂ ÏËÈÑ ñåìåéñòâà MAX9000
Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà MAX9000 ïðèâåäåíà íà Ðèñ. 1.34. è 1.35, à åå ïàðàìåòðû â Òàáë. 1.14. Òàáëèöà 1.14. Ïàðàìåòðû âðåìåííîé ìîäåëè ñåìåéñòâà MAX9000 Îáîçíà÷åíèå tPD1 tPD2 tFSU tFH tFCO tCNT fCNT tLAD
Ïàðàìåòð
Çíà÷åíèå äëÿ EPM9400-10 [íñ] min max 10.0 10.8 3.0 0.0 1.0 4.8 6.9 144.9 3.5
tSEXP tPEXP tRD
Çàäåðæêà âõîäâûõîä ïî ñòðîêå Çàäåðæêà âõîäâûõîä ïî ñòîëáöó Âðåìÿ óñòàíîâêè ãëîáàëüíîãî ñèíõðîñèãíàëà Âðåìÿ óäåðæàíèÿ ãëîáàëüíîãî ñèíõðîñèãíàëà Çàäåðæêà ãëîáàëüíîãî ñèíõðîñèãíàëà äî âûõîäà Ìèíèìàëüíûé ïåðèîä ãëîáàëüíîãî ñèíõðîñèãíàëà Ìàêñèìàëüíàÿ ãëîáàëüíàÿ âíóòðåííÿÿ òàêòîâàÿ ÷àñòîòà Çàäåðæêà â ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöå ««È»» Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà òðèããåðà â ëîêàëüíîé ïðîãðàììèðóåìîé ìàòðèöå «È» Çàäåðæêà èçìåíåíèÿ ñèãíàëà îòíîñèòåëüíî òàêòîâîãî èìïóëüñà Çàäåðæêà ðàçðåøåíèÿ ðåãèñòà Çàäåðæêà ðàçäåëÿåìîãî ðàñøèðèòåëÿ Çàäåðæêà ïàðàëëåëüíîãî ðàñøèðèòåëÿ Ðåãèñòðîâàÿ çàäåðæêà
tCOMB
Kîìáèíàöèîííàÿ çàäåðæêà
tSU
Âðåìÿ óñòàíîâêè ðåãèñòðà
2.4
tH
Âðåìÿ óäåðæàíèÿ ñèãíàëà â ðåãèñòðå
2.0
tLAC tIC tEN
63
3.5
3.5 3.5 3.5 0.5 0.5 0.4
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.14 (îêîí÷àíèå) Îáîçíà÷åíèå tPRE tCLR tFTD tLPA tIODR tIODC tIOC tIORD tIOCOMB tIOSU tIOH tIOCLR tIOFD tINREG tINCOMB tOD1 tOD2 tOD3 tXZ tZX1 tZX2 tZX3 tLOCAL tROW tCÎL tDIN_D tDIN_C tDIN_IO
Ïàðàìåòð Âðåìÿ ïðåäóñòàíîâêè ðåãèñòðà Ìß Âðåìÿ ñáðîñà ðåãèñòðà Ìß Çàäåðæêà ãëîáàëüíîé ÏÌÑ Çàäåðæêà çà ñ÷åò ðåæèìà ïîíèæåííîãî ïîòðåáëåíèÿ Çàäåðæêà ââîäà/âûâîäà äàííûõ íà ñòðîêó ÃÌÑ Çàäåðæêà ââîäà/âûâîäà äàííûõ íà ñòîëáåö ÃÌÑ Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà Ý Çàäåðæêà äàííûõ íà âûõîäå Ý îòíîñèòåëüíî òàêòà Çàäåðæêà êîìáèíàöèîííûõ ñõåì Ý Âðåìÿ óñòàíîâêè ðåãèñòðà Ý Âðåìÿ óäåðæàíèÿ äàííûõ ðåãèñòðà Ý Çàäåðæêà ñáðîñà ðåãèñòðà Ý Çàäåðæêà îáðàòíîé ñâÿçè ðåãèñòðà Ý Çàäåðæêà âî âõîäíîì áóôåðå Ý Çàäåðæêà âî âõîäíîì áóôåðå Ý Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 3.3 Â, slew rate = off Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 2.5 Â, slew rate = off Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, slew rate = on Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà çàïðåùåíèÿ âûõîäà Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 3.3 Â, slew rate = off Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 2.5 Â, slew rate = off Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, slew rate = on Çàäåðæêà ËÌÑ Çàäåðæêà â ñòðîêå ÃÌÑ Çàäåðæêà â ñòîëáöå ÃÌÑ Çàäåðæêà äàííûõ ñ âûäåëåííîãî âûâîäà äî âõîäà ËÝ Çàäåðæêà óïðàâëÿþùèõ ñèãíàëîâ ñ âûäåëåííîãî âûâîäà äî âõîäà ËÝ Çàäåðæêà óïðàâëÿþùèõ ñèãíàëîâ ñ âûäåëåííîãî âûâîäà äî âõîäîâ óïðàâëåíèÿ ÝÂÂ
64
Çíà÷åíèå äëÿ EPM9400-10 [íñ] min 2.0 1.0
max 3.5 3.7 0.5 10.0 0.2 0.4 0.5 0.6 0.2 1.5 0.0 3.5 1.5
1.8
2.3
8.3
2.5
2.5
3.0
9.0
0.5 0.9 0.9 4.0
2.7
2.5
Ýëåìåíòíàÿ áàçà
1.6. Ñåìåéñòâî FLEX10K ÏËÈÑ ñåìåéñòâ FLEX10K, FLEX10KA, FLEX10KE ÿâëÿþòñÿ íà äàííûé ìîìåíò, ïîæàëóé, ñàìîé ïîïóëÿðíîé ýëåìåíòíîé áàçîé äëÿ ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ, ïîñòðîåíèÿ ñëîæíûõ óñòðîéñòâ îáðàáîòêè äàííûõ è èíòåðôåéñîâ. Ýòî îáúÿñíÿåòñÿ òåì, ÷òî áëàãîäàðÿ áîëüøîé ëîãè÷åñêîé åìêîñòè, óäîáíîé àðõèòåêòóðå, âêëþ÷àþùåé âñòðîåííûå áëîêè ïàìÿòè (EAB Embedded Array Block), äîñòàòî÷íî âûñîêîé íàäåæíîñòè è óäà÷íîìó ñîîòíîøåíèþ öåíàëîãè÷åñêàÿ åìêîñòü äàííûå ÏËÈÑ óäîâëåòâîðÿþò ðàçíîîáðàçíûì òðåáîâàíèÿì, âîçíèêàþùèì ó ðàçðàáîò÷èêà êàê ñèñòåì ÖÎÑ, òàê è óñòðîéñòâ óïðàâëåíèÿ, îáðàáîòêè äàííûõ è ò.ï.  Òàáë. 1.15 ïðèâåäåíû îñíîâíûå ñâåäåíèÿ î ÏËÈÑ ñåìåéñòâà FLEX10K. Òàáëèöà 1.15. ÏËÈÑ ñåìåéñòâà FLEX10K Ïàðàìåòð
EPF1 EPF1 EPF1 EPF1 EPF1 EPF1 EPF1 EPF1 EPF1 0K10 0K20 0K30 0K40 0K50 0K70 0K100 0K130 0K250
Ëîãè÷åñêàÿ åìêîñòü, êîëè÷å10 ñòâî ýêâèâàëåíòíûõ âåíòèëåé 000 ×èñëî ëîãè÷åñêèõ ýëåìåíòîâ Âñòðîåííûå áëîêè ïàìÿòè Îáúåì ïàìÿòè [áèò] Ìàêñèìàëüíîå ÷èñëî âûâîäîâ ïîëüçîâàòåëÿ
576 3
20 000
30 000
40 000
50 000
70 000
100 000
130 000
250 000
1 152 1 728 2 304 2 880 3 744 4 992 6 656 12 160 6
6
8
10
9
12
16
20
6 144 12 288 12 288 16 384 20 480 18 432 24 576 32 768 40 960 150
189
246
189
310
358
406
470
470
 íàñòîÿùåå âðåìÿ âûïóñêàþòñÿ ÏËÈÑ ñåìåéñòâ FLEX10K ñ íàïðÿæåíèåì ïèòàíèÿ 5 Â, FLEX10KÀ (V) ñ íàïðÿæåíèåì ïèòàíèÿ 3.3  è FLEX10KÅ ñ íàïðÿæåíèåì ïèòàíèÿ 2.5 Â. Kðîìå òîãî, ÏËÈÑ ñåìåéñòâà FLEX10KÅ èìåþò åìêîñòü âñòðîåííîãî áëîêà ïàìÿòè 4096 áèò, â îòëè÷èå îò ÏËÈÑ îñòàëüíûõ ñåìåéñòâ, èìåþùèõ åìêîñòü ÅÀ 2048 áèò. Îáîáùåííàÿ ôóíêöèîíàëüíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà FLEX10K ïðèâåäåíà íà Ðèñ. 1.36.  îñíîâå àðõèòåêòóðû ëåæàò ëîãè÷åñêèå áëîêè, ñîäåðæàùèå 8 ËÝ è ëîêàëüíóþ ìàòðèöó ñîåäèíåíèé. Ãëîáàëüíàÿ ìàòðèöà ñîåäèíåíèé ðàçäåëåíà íà ñòðîêè è ñòîëáöû, èìååò íåïðåðûâíóþ ñòðóêòóðó (Fast Track Interconnect). Ïîñåðåäèíå ñòðîêè ðàñïîëàãàþòñÿ âñòðîåííûå áëîêè ïàìÿòè. Kðîìå òîãî, èìåþòñÿ ãëîáàëüíûå öåïè óïðàâëåíèÿ, ñèíõðîíèçàöèè è óïðàâëåíèÿ ââîäîì/âûâîäîì.
65
Ýëåìåíòíàÿ áàçà
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
Столбец ГМС
ЛБ ВБП
ЭВВ
ЭВВ
ЭВВ
ЭВВ
Строка ГМС
ЛЭ
ВБП
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
AL1036+
ЛМС
Ðèñ. 1.36. Àðõèòåêòóðà ÏËÈÑ ñåìåéñòâà FLEX10K
Âñòðîåííûé áëîê ïàìÿòè (ÂÁÏ) (Ðèñ. 1.37) ïðåäñòàâëÿåò ñîáîé îïåðàòèâíîå çàïîìèíàþùåå óñòðîéñòâî (ÎÇÓ) åìêîñòüþ 2048 (4096) áèò è ñîñòîèò èç ëîêàëüíîé ìàòðèöû ñîåäèíåíèé, ñîáñòâåííî ìîäóëÿ ïàìÿòè, ñèíõðîííûõ áóôåðíûõ ðåãèñòðîâ, à òàêæå ïðîãðàììèðóåìûõ ìóëüòèïëåêñîðîâ. Ñèãíàëû íà âõîä ËÌÑ ÂÁÏ ïîñòóïàþò ñî ñòðîêè ÃÌÑ. Òàêòîâûå è óïðàâëÿþùèå ñèãíàëû ïîñòóïàþò ñ ãëîáàëüíîé øèíû óïðàâëÿþùèõ ñèãíàëîâ. Âûõîä ÂÁÏ ìîæåò áûòü ñêîììóòèðîâàí êàê íà ñòðîêó, òàê è íà ñòîëáåö ÃÌÑ. Íàëè÷èå ñèíõðîííûõ áóôåðíûõ ðåãèñòðîâ è ïðîãðàììèðóåìûõ ìóëüòèïëåêñîðîâ ïîçâîëÿåò êîíôèãóðèðîâàòü ÂÁÏ êàê çàïîìèíàþùåå óñòðîéñòâî (ÇÓ) ñ îðãàíèçàöèåé 256×8, 512×4, 1024×2, 2048×1. Íàëè÷èå ÂÁÏ äàåò âîçìîæíîñòü òàáëè÷íîé ðåàëèçàöèè òàêèõ ýëåìåíòîâ óñòðîéñòâ ÖÎÑ, êàê ïåðåìíîæèòåëè, àðèôìåòè÷åñêîå ëîãè÷åñêîå óñòðîéñòâî (ÀËÓ), ñóììàòîðû è ò.ï., èìåþùèõ áûñòðîäåéñòâèå äî 100 ÌÃö (êîíå÷íî, ïðè ñàìûõ áëàãîïðèÿòíûõ óñëîâèÿõ ðåàëüíî áûñòðîäåéñòâèå àðèôìåòè÷åñêèõ óñòðîéñòâ, ðåàëèçîâàííûõ íà áàçå ÂÁÏ, ñîñòàâëÿåò 10
50 ÌÃö).
66
Ýëåìåíòíàÿ áàçà
Выделенные Сброс сигналы Строки ГМС 2,4,8,16 1
6 8,4,2,1 D Q
Вход данных Выход данных
9,10,11 D Q
ЛМС D Q
Адрес ОЗУ/ПЗУ 256 x 8 512 x 4 1024 x 2 2048 x 1 WE
16 D Q
2,4,8,16
AL1037+
Столбец ГМС
Ðèñ. 1.37. Âñòðîåííûé áëîê ïàìÿòè
Âñå ÏËÈÑ ñåìåéñòâà FLEX10K ñîâìåñòèìû ïî óðîâíÿì ñ øèíîé PCI, èìåþò âîçìîæíîñòü êàê ïîñëåäîâàòåëüíîé, òàê è ïàðàëëåëüíîé çàãðóçêè, ïîëíîñòüþ ïîääåðæèâàþò ñòàíäàðò JTAG. Ñòðóêòóðà ëîãè÷åñêîãî áëîêà ÏËÈÑ ñåìåéñòâà FLEX10K ïðèâåäåíà íà Ðèñ. 1.38. Ñèãíàëû íà âõîä ËÌÑ ïîñòóïàþò êàê ñî ñòðîêè ÃÌÑ, òàê è ñ âûõîäîâ êàæäîãî èç 8 ËÝ, âõîäÿùèõ â ñîñòàâ ËÁ. Ñèãíàëû ñ âûõîäà ËÁ ïîñòóïàþò êàê íà ñòðîêó, òàê è íà ñòîëáåö ÃÌÑ. Kàê ìîæíî çàìåòèòü, àðõèòåêòóðà ËÁ ñåìåéñòâà FLEX10K íàïîìèíàåò àðõèòåêòóðó ËÁ ÏËÈÑ ñåìåéñòâà FLEX8000. Ñòðóêòóðà ËÝ ÏËÈÑ ñåìåéñòâà FLEX10K ïðèâåäåíà íà Ðèñ. 1.39. Kàê ïðàâèëî, àðõèòåêòóðà ËÝ âñåõ ñåìåéñòâ FLEX ïðàêòè÷åñêè îäèíàêîâà. Ñ ïîìîùüþ ñõåì îðãàíèçàöèè
67
Ýëåìåíòíàÿ áàçà
Выделенные и глобальные сигналы
1
6 4
Перенос и каскадирование 2
4
16
4
8
24
4 ЛЭ1
4 ЛЭ2 4 ЛМС
16 8
Коммутация строка—столбец ГМС
Управляющие сигналы ЛБ
Строки ГМС
ЛЭ3 4 ЛЭ4 4 ЛЭ5 4 ЛЭ6 4 ЛЭ7 4 ЛЭ8 8
Выходы переноса и каскадирование
AL1038+
Столбец ГМС
2
Ðèñ. 1.38. Ëîãè÷åñêèé áëîê ÏËÈÑ ñåìåéñòâà FLEX10K
ïåðåíîñîâ (carry chain) è êàñêàäèðîâàíèÿ (cascade chain) âîçìîæíî ðàñøèðåíèå âîçìîæíîñòåé ËÝ (ïîäðîáíåå î ðåæèìàõ êîíôèãóðàöèè ËÝ ñì. ïàðàãðàô 1.2). Ýëåìåíò ââîäà/âûâîäà ÏËÈÑ ñåìåéñòâà FLEX10K ñîåäèíÿåò êàíàë ñòðîêè èëè ñòîëáöà ÃÌÑ ñ âûâîäîì ìèêðîñõåìû. Ñòðóêòóðíàÿ ñõåìà Ý ïðèâåäåíà íà Ðèñ. 1.40. Ý ïîçâîëÿåò îñóùåñòâèòü ââîä/âûâîä áèòà äàííûõ ñ ðàçëè÷íûìè ñêîðîñòÿìè, âðåìåííîå õðàíåíèå äàííûõ, ýìóëÿöèþ îòêðûòîãî êîëëåêòîðà.
68
Ýëåìåíòíàÿ áàçà
Перенос Data1 Data2 Data3 Data4
Labctrl1 Labctrl2 Сброс
Таблица Цепь перекоG переноса дировки
Каскадирование
Цепь каскадиG рования
ENA CLRN
Схема сброса/ установки
К ГМС
PRN D
Q
К ЛМС
Labctrl3
Выход переноса Выход каскадирования
AL1039+
Labctrl4
Ðèñ. 1.39. Ñòðóêòóðà ËÝ ÏËÈÑ ñåìåéñòâà FLEX10K
Íàëè÷èå âõîäíîãî (input register) è âûõîäíîãî (output register) ðåãèñòðîâ ïîçâîëÿåò õðàíèòü äàííûå, ÷òî ñíèæàåò ëîãè÷åñêóþ íàãðóçêó íà ËÝ è âûñâîáîæäàåò ðåñóðñû ÏËÈÑ äëÿ ðåàëèçàöèè äðóãèõ ôóíêöèé. Ñêîðîñòü ïåðåêëþ÷åíèÿ áóôåðà Ý ìîæåò áûòü çàäàíà ïðè êîíôèãóðàöèè ÏËÈÑ. Ïîíèæåííàÿ ñêîðîñòü ïåðåêëþ÷åíèÿ ïîçâîëÿåò ñíèçèòü óðîâåíü èìïóëüñíûõ ïîìåõ è «çâîíà» â ñèñòåìå. Ñëåäóåò ïîìíèòü, ÷òî ðåæèì ýìóëÿöèè îòêðûòîãî êîëëåêòîðà îáåñïå÷èâàåò íå ñëèøêîì ìîùíûé âûõîäíîé ñèãíàë, ïîýòîìó ïðè íåîáõîäèìîñòè ñîïðÿæåíèÿ ñ âíåøíèìè ñõåìàìè ëó÷øå èñïîëüçîâàòü ñïåöèàëèçèðîâàííûå áóôåðû (íàïðèìåð, 74HC04, 1533ËÀ8, 1533ËÍ2 è ò.ï.). Ïî êðàéíåé ìåðå, ïðè âîçäåéñòâèè âûñîêîãî íàïðÿæåíèÿ ïðîùå (è äåøåâëå) ïîìåíÿòü áóôåð, à íå âñþ ÏËÈÑ (îñîáåííî â BGA êîðïóñå). Âðåìåííàÿ ìîäåëü ÏËÈÑ ïðåäñòàâëåíà íà Ðèñ. 1.411.44, à åå îñíîâíûå ïàðàìåòðû â Òàáë. 1.16.
69
Ýëåìåíòíàÿ áàçà Синхронизация ГМС Управляющие Выделенные сигналы сигналы
D
VCC
Q
ENA CLRN
Сброс
VCC CE [7...0]
Разрешение выхода
VCC
CLK [1...0] CLK [3...2]
D
VCC
ENA [3...0] VCC
Q
ENA CLRN
Открытый коллектор Скорость ЭВВ
CLRN [1...0]
Сброс
VCC
D
Q
Сброс
Ðèñ. 1.40. Ýëåìåíò ââîäà/âûâîäà
70
AL1040+
ENA CLRN
Ýëåìåíòíàÿ áàçà
Выделенные сигналы
Межсоединение
ВБР AL1041+
ЛЭ
ЭВВ
Ðèñ. 1.41. Âðåìåííàÿ ìîäåëü ÏËÈÑ ñåìåéñòâà FLEX10K
Вход данных
Вход каскадирования tLUT tPLUT tCLUT
tCO tCOMB tSU tH tPRE tCLR
tPACKED
Управление
Выход данных
tC tEN tCGENR tCGEN tCICO
tCASC
tLABCASC
tLABCARRY
Выход переноса
Выход каскадирования
Ðèñ. 1.42. Âðåìåííàÿ ìîäåëü ËÝ ÏËÈÑ ñåìåéñòâà FLEX10K
71
AL1042+
Вход переноса
Ýëåìåíòíàÿ áàçà
DATA IN
tIOD
CLOCK ENABLE CLEAR CLOCK OUTPUT ENABLE
tIDC
1 к ГМС
tIOFD
tIOCO tIOCOMB tIOSU tIOH tIOCLR
tOD1 tOD2 tOD3 tXZ tZX1 tZX2 tZX3
AL1043+
tINREG
tINCOMB
Ðèñ. 1.43. Âðåìåííàÿ ìîäåëü ÝÂÂ ÏËÈÑ ñåìåéñòâà FLEX10K
tEABOATA1 tEABOATA2 tEABWE1 tEABWE2
tEABCO tEABBYPASS tEABSU tEABH tEABCH tEABCL
tAA tDO tWR
tWDSU tWDH tWASU tWAH tWO
tEABCO tEABBYPASS tEABSU tEABH tEABCH tEABCL
tEABOUT DATA OUT
tEABCLK AL1044+
Синхронизация
Разрешение записи
Данные Адрес
Ðèñ. 1.44. Âðåìåííàÿ ìîäåëü ÂÁÏ ÏËÈÑ ñåìåéñòâà FLEX10K Òàáëèöà 1.16. Ïàðàìåòðû âðåìåííîé ìîäåëè ÏËÈÑ ñåìåéñòâà FLEX10K Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå äëÿ EPF10K103 [íñ] min
max
tLUT
Çàäåðæêà äàííûõ â ÒÏ
1.4
tCLUT
Çàäåðæêà ôîðìèðîâàíèÿ ñèãíàëà ïåðåíîñà â ÒÏ
0.6
tRLUT
Çàäåðæêà ñèãíàëà îáðàòíîé ñâÿçè ðåãèñòðà â ÒÏ
1.5
Çàäåðæêà âõîäíûõ äàííûõ äî îòäåëüíî ñêîíôèãóðèðîâàííîãî ðåãèñòðà (packed register)
0.6
Çàäåðæêà ñèãíàëà ðàçðåøåíèÿ ðåãèñòðà ËÝ
1.0
Çàäåðæêà ñèãíàëà ïåðåíîñà îò âõîäà äî âûõîäà ïåðåíîñà
0.2
tPACKED tEN tCICO
72
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.16 (ïðîäîëæåíèå) Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå äëÿ EPF10K103 [íñ] min max
tCGEN
Çàäåðæêà ñèãíàëà ïåðåíîñà îò âõîäà ËÝ äî âûõîäà ïåðåíîñà
0.9
tCGENR
Çàäåðæêà ñèãíàëà îò âûõîäà ðåãèñòðà ËÝ äî âûõîäà ïåðåíîñà
0.9
tCASC
Çàäåðæêà ñèãíàëà êàñêàäèðîâàíèÿ îò âõîäà äî âûõîäà êàñêàäèðîâàíèÿ
0.8
tC
Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà íà ðåãèñòðå ËÝ
1.3
tCO
Çàäåðæêà âûõîäíîãî ñèãíàëà ðåãèñòðà îòíîñèòåëüíî òàêòà
0.9
Çàäåðæêà â êîìáèíàöèîííîé ÷àñòè ËÝ
0.5
tSU
Âðåìÿ óñòàíîâêè ðåãèñòðà ËÝ
1.3
tH
Âðåìÿ óäåðæàíèÿ ñèãíàëà íà âõîäå ðåãèñòðà ïîñëå ïîäà÷è ñèíõðîèìïóëüñà
1.4
tCOMB
tPRE
Çàäåðæêà ïðåäóñòàíîâêè ðåãèñòðà ËÝ
1.0
tCLR
Çàäåðæêà ñáðîñà ðåãèñòðà ËÝ
1.0
tCH
Äëèòåëüíîñòü âûñîêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà
4.0
tCL
Äëèòåëüíîñòü íèçêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà
4.0
tIOD
Çàäåðæêà âûõîäíîãî ñèãíàëà ÝÂÂ
1.3
tIOC
Çàäåðæêà âûõîäíîãî ñèãíàëà ðåãèñòðà ÝÂÂ îòíîñèòåëüíî ñèãíàëîâ óïðàâëåíèÿ
0.5
tIOCO
Çàäåðæêà âûõîäíîãî ñèãíàëà ðåãèñòðà ÝÂÂ îòíîñèòåëüíî òàêòà
0.2
tIOCOMB
Çàäåðæêà êîìáèíàöèîííûõ ñõåì ÝÂÂ
0.0
tIOSU
Âðåìÿ óñòàíîâêè ðåãèñòðà ÝÂÂ
2.8
tIOH
Âðåìÿ óäåðæàíèÿ äàííûõ ðåãèñòðà ÝÂÂ
1.0
Çàäåðæêà ñáðîñà ðåãèñòðà ÝÂÂ
1.0
tOD1
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 3.3 Â, slew rate = off
2.6
tOD2
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, VCCIO = 2.5 Â, slew rate = off
4.9
tOD3
Çàäåðæêà ñèãíàëà îò âûõîäíîãî áóôåðà äî âûâîäà, slew rate = on
6.3
tXZ
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà çàïðåùåíèÿ âûõîäà
4.5
tZX1
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 3.3 Â, slew rate = off
4.5
tZX2
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, VCCIO = 2.5 Â, slew rate = off
6.8
tIOCLR
73
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.16 (ïðîäîëæåíèå) Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå äëÿ EPF10K103 [íñ] min max
tINREG
Çàäåðæêà ñèãíàëà â âûõîäíîì áóôåðå ïîñëå ñèãíàëà ðàçðåøåíèÿ âûõîäà, slew rate = on Çàäåðæêà â áóôåðå ÝÂÂ
6.0
tIOFD
Çàäåðæêà â öåïè îáðàòíîé ñâÿçè ðåãèñòðà ÝÂÂ
3.1
3.1
1.5
4.8
1.0
5.0
tEABCLK
Çàäåðæêà ñèãíàëà îò âõîäíîãî áóôåðà ÝÂÂ äî ÃÌÑ Çàäåðæêà äàííûõ èëè àäðåñà ÂÁÏ äî êîìáèíàöèîííîãî âûõîäà ÂÁÏ Çàäåðæêà äàííûõ èëè àäðåñà ÂÁÏ äî ðåãèñòðîâîãî âûõîäà ÂÁÏ Çàäåðæêà äàííûõ ÂÁÏ îòíîñèòåëüíî ñèãíàëà ðàçðåøåíèÿ çàïèñè äî êîìáèíàöèîííîãî âûõîäà ÂÁÏ Çàäåðæêà äàííûõ ÂÁÏ îòíîñèòåëüíî ñèãíàëà ðàçðåøåíèÿ çàïèñè äî ðåãèñòðîâîãî âûõîäà ÂÁÏ Çàäåðæêà òàêòîâîãî èìïóëüñà íà ðåãèñòðå ÂÁÏ
1.0
tEABCO
Çàäåðæêà âûõîäà ÂÁÏ îòíîñèòåëüíî òàêòîâîãî èìïóëüñà
0.5
1.5
1.5
2.0
4.0
5.8
tAA
Âðåìÿ óäåðæàíèÿ ðåãèñòðà ÂÁÏ Äëèòåëüíîñòü âûñîêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà ÂÁÏ Äëèòåëüíîñòü íèçêîãî óðîâíÿ òàêòîâîãî ñèãíàëà ðåãèñòðà ÂÁÏ Âðåìÿ óäåðæàíèÿ àäðåñà
8.7
tWP
Äëèòåëüíîñòü èìïóëüñà çàïèñè ÂÁÏ
5.8
tWDSU
Âðåìÿ óñòàíîâêè äàííûõ äî çàïèñè
1.6
tWDH
Âðåìÿ óäåðæàíèÿ äàííûõ ïðè ñèãíàëå çàïèñè â ÂÁÏ
0.3
tWASU
Âðåìÿ óñòàíîâêè àäðåñà
0.5
tWAH
Âðåìÿ óäåðæàíèÿ àäðåñà Çàäåðæêà äàííûõ íà âûõîäå ÂÁÏ îòíîñèòåëüíî ñèãíàëà ðàçðåøåíèÿ çàïèñè Çàäåðæêà äàííûõ îò âõîäà äî âûõîäà ÂÁÏ
1.0
5.0
5.0
tEABOUT
Çàäåðæêà äàííûõ íà âûõîäå ÂÁÏ
0.5
tEABAA
Âðåìÿ äîñòóïà àäðåñà ÂÁÏ
13.7
13.7
9.7
5.8
tZX3
tINCOMB tEABDATA1 tEABDATA2 tEABWE1 tEABWE2
tEABBYPASS Çàäåðæêà â öåïè îáõîäà ðåãèñòðà ÂÁÏ tEABSU Âðåìÿ óñòàíîâêè ðåãèñòðà ÂÁÏ tEABH tEABCH tEABCL
tWO tDD
tEABRCCOMB Äëèòåëüíîñòü öèêëà àñèíõðîííîãî ÷òåíèÿ èç ÂÁÏ tEABRCREG Äëèòåëüíîñòü öèêëà ñèíõðîííîãî ÷òåíèÿ èç ÂÁÏ tEABWP
Äëèòåëüíîñòü èìïóëüñà çàïèñè ÂÁÏ
74
8.2
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.16 (ïðîäîëæåíèå) Îáîçíà÷åíèå
Ïàðàìåòð
tEABWCCOMB Äëèòåëüíîñòü öèêëà àñèíõðîííîé çàïèñè â ÂÁÏ tEABWCREG Äëèòåëüíîñòü öèêëà ñèíõðîííîé çàïèñè â ÂÁÏ
Çíà÷åíèå äëÿ EPF10K103 [íñ] min max 7.3 13.0
10.0
tEABDATACO Çàäåðæêà äàííûõ íà âûõîäå ÂÁÏ îòíîñèòåëüíî òàêòà
2.0
tEABDATASU Âðåìÿ óñòàíîâêè àäðåñà èëè äàííûõ âî âõîäíîì ðåãèñòðå ÂÁÏ
5.3
tEABDATAH
Âðåìÿ óäåðæàíèÿ àäðåñà èëè äàííûõ íà âõîäå ÂÁÏ
0.0
tEABWESU
Âðåìÿ óñòàíîâêè ñèãíàëà WE
5.5
tEABWESH
Âðåìÿ óäåðæàíèÿ ñèãíàëà WE
0.0
5.5
0.0
2.1
0.0
9.5
tEABDD
tEABWDSU tEABWDH tEABWASU tEABWAH tEABWO
Çàäåðæêà äàííûõ îò âõîäà äî âûõîäà ÂÁÏ
Âðåìÿ óñòàíîâêè âõîäíûõ äàííûõ ÂÁÏ áåç èñïîëüçîâàíèÿ âõîäíîãî ðåãèñòðà Âðåìÿ óäåðæàíèÿ âõîäíûõ äàííûõ ÂÁÏ áåç èñïîëüçîâàíèÿ âõîäíîãî ðåãèñòðà Âðåìÿ óñòàíîâêè àäðåñà ÂÁÏ áåç èñïîëüçîâàíèÿ âõîäíîãî ðåãèñòðà Âðåìÿ óäåðæàíèÿ àäðåñà ÂÁÏ áåç èñïîëüçîâàíèÿ âõîäíîãî ðåãèñòðà Çàäåðæêà äàííûõ íà âûõîäå ÂÁÏ îòíîñèòåëüíî ñèãíàëà ðàçðåøåíèÿ çàïèñè
tSAMELAB
Çàäåðæêà äàííûõ â ËÌÑ
0.6
tSAMEROW
Çàäåðæêà ïåðåäà÷è äàííûõ âíóòðè îäíîé è òîé æå ñòðîêè ÃÌÑ
3.6
0.9
tDIFFROW
Çàäåðæêà ïåðåäà÷è äàííûõ ïî ñòîëáöó ñ îäíîé ñòðîêè ÃÌÑ íà äðóãóþ
4.5
tTWOROWS
Çàäåðæêà ïåðåäà÷è äàííûõ ñ îäíîé ñòðîêè ÃÌÑ íà äðóãóþ
8.1
tLEPERIPH
Çàäåðæêà óïðàâëÿþùåãî ñèãíàëà
3.3
tLABCARRY Çàäåðæêà ïåðåíîñà â ñëåäóþùèé ËÁ
0.5
tLABCASC
2.7
4.8
2.6
3.4
2.6
tSAMECOLUMN Çàäåðæêà ïåðåäà÷è äàííûõ âíóòðè îäíîãî è òîãî æå ÃÌÑ
tDIN2IOE tDIN2LE tDCLK2IOE tDCLK2LE
Çàäåðæêà êàñêàäèðîâàíèÿ â ñëåäóþùèé ËÁ Çàäåðæêà ðàñïðîñòðàíåíèÿ ñ âûäåëåííîãî âûâîäà äî âõîäà óïðàâëåíèÿ ÝÂÂ Çàäåðæêà ðàñïðîñòðàíåíèÿ ñ âûäåëåííîãî âûâîäà äî âõîäà óïðàâëåíèÿ ËÁ èëè ÂÁÏ Çàäåðæêà ðàñïðîñòðàíåíèÿ òàêòîâîãî ñèãíàëà ñ âûäåëåííîãî âûâîäà äî âõîäà òàêòèðîâàíèÿ ÝÂÂ Çàäåðæêà ðàñïðîñòðàíåíèÿ òàêòîâîãî ñèãíàëà ñ âûäåëåííîãî âûâîäà äî âõîäà òàêòèðîâàíèÿ ËÁ èëè ÂÁÏ
75
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.16 (îêîí÷àíèå) Îáîçíà÷åíèå tDIN2DATA
Çíà÷åíèå äëÿ EPF10K103 [íñ] min max
Ïàðàìåòð Çàäåðæêà ðàñïðîñòðàíåíèÿ äàííûõ ñ âûäåëåííîãî âûâîäà äî âõîäà ËÁ èëè ÂÁÏ
4.3
tDPR
Òåñòîâàÿ çàäåðæêà ðåãèñòð-ðåãèñòð ÷åðåç 4 ËÝ, 3 ðÿäà è 4 ËÌÑ
16.1
tINSU
Âðåìÿ óñòàíîâêè ãëîáàëüíîãî òàêòîâîãî èìïóëüñà Âðåìÿ óäåðæàíèÿ äàííûõ îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà Âðåìÿ çàäåðæêè âûõîäíûõ äàííûõ îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà Âðåìÿ óñòàíîâêè äâóíàïðàâëåííîãî âûâîäà îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
5.5
0.0
2.0
6.7
4.5
Âðåìÿ óäåðæàíèÿ äâóíàïðàâëåííîãî âûâîäà îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
0.0
tOUTCOBIDIR
Âðåìÿ çàäåðæêè âûõîäíûõ äàííûõ íà äâóíàïðàâëåííîì âûâîäå îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
2.0
6.7
tXZBIDIR
Çàäåðæêà ïåðåõîäà âûõîäíîãî áóôåðà â òðåòüå ñîñòîÿíèå
10.0
tZXBIDIR
Çàäåðæêà ïåðåõîäà âûõîäíîãî áóôåðà èç òðåòüåãî ñîñòîÿíèÿ
10.0
tINH tOUTCO tISUBIDIR tINHBIDIR
Асинхронное чтение Разрешение записи Адрес
a0
a1
a2
tEABAK Данные
a3
tEABRCCOMB
d0
d1
d2
d3
Асинхронная запись Разрешение записи
tEABWR tEABWPSU
Входные данные
tEABWOH
din0
din1 tEABWAH
tEABWASU tEABWCOCOMB Адрес
a0
a1
a2
Выходные данные
din0
din1
dout2
AL1045+
tEABD0
Ðèñ. 1.45. Àñèíõðîííûå ðåæèìû ÷òåíèÿ è çàïèñè ÂÁÏ ÏËÈÑ ñåìåéñòâà FLEX10K
76
Ýëåìåíòíàÿ áàçà
Разрешение записи
Синхронное чтение
Адрес
a0
a1
a2
tEABOATAH
tEABDATABU Такт
a3
tEABRCREQ
tEABDATACO
Выходные данные
d1
d3
Синхронная запись Разрешение записи Входные данные Адрес
din1 a0
a1 tEABDATASU
tEABWESU
din2
din3
a2
a3
tEABDATAH
a2 tEABWEH
Такт tEABWGREG dout0
dout1
din1
din2
din3
din2
AL1046+
Выходные данные
tEABDATACO
Ðèñ.1.46. Ñèíõðîííûå ðåæèìû ÷òåíèÿ è çàïèñè ÂÁÏ ÏËÈÑ ñåìåéñòâà FLEX10K
77
Ýëåìåíòíàÿ áàçà
1.7. Ñåìåéñòâî APEX20K Ðàçâèòèå è ðàçíîîáðàçèå àðõèòåêòóð ôóíêöèîíàëüíûõ ïðåîáðàçîâàòåëåé, ëåæàùèõ â îñíîâå áàçîâûõ óçëîâ ÏËÈÑ, ïðèâåëè ê òîìó, ÷òî â ïîñëåäíèå ãîäû ÏËÈÑ ñòàíîâÿòñÿ îñíîâîé äëÿ «ñèñòåì íà êðèñòàëëå».  îñíîâå èäåè SOC ëåæèò èíòåãðàöèÿ âñåé ýëåêòðîííîé ñèñòåìû â îäíîì êðèñòàëëå (íàïðèìåð, â ñëó÷àå ÏK òàêîé ÷èï îáúåäèíÿåò ïðîöåññîð, ïàìÿòü è ò.ä.). Kîìïîíåíòû ýòèõ ñèñòåì ðàçðàáàòûâàþòñÿ îòäåëüíî è õðàíÿòñÿ â âèäå ôàéëîâ ïàðàìåòðèçèðóåìûõ ìîäóëåé. Îêîí÷àòåëüíàÿ ñòðóêòóðà SOC-ìèêðîñõåìû âûïîëíÿåòñÿ íà áàçå ýòèõ «âèðòóàëüíûõ êîìïîíåíòîâ», íàçûâàåìûõ òàêæå «áëîêàìè èíòåëëåêòóàëüíîé ñîáñòâåííîñòè» ñ ïîìîùüþ ïðîãðàìì àâòîìàòèçàöèè ïðîåêòèðîâàíèÿ ýëåêòðîííûõ óñòðîéñòâ. Áëàãîäàðÿ ñòàíäàðòèçàöèè â îäíî öåëîå ìîæíî îáúåäèíÿòü «âèðòóàëüíûå êîìïîíåíòû» îò ðàçíûõ ðàçðàáîò÷èêîâ. Èäåÿ ïîñòðîåíèÿ «ñèñòåì íà êðèñòàëëå» ïîäñòåãíóëà âåäóùèõ ïðîèçâîäèòåëåé ÏËÈÑ ê âûïóñêó â êîíöå 1998 íà÷àëå 1999 ãîäà èçäåëèé ñ ýêâèâàëåíòíîé åìêîñòüþ 1000000 ýêâèâàëåíòíûõ âåíòèëåé è áîëåå. Ïðèìåðîì íîâûõ ñåìåéñòâ ÏËÈÑ, ïðèãîäíûõ äëÿ ðåàëèçàöèè «ñèñòåì íà êðèñòàëëå», ÿâëÿåòñÿ ñåìåéñòâî APEX20K ôèðìû «Altera», îñíîâíûå õàðàêòåðèñòèêè êîòîðîãî ïðèâåäåíû â Òàáë. 1.17. Òàáëèöà 1.17. Îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà APEX20K ôèðìû «Altera» Ïàðàìåòð
EP20K EP20K EP20K EP20K 100 160 200 300
EP20K 400
EP20K 600
EP20K 1000
Ëîãè÷åñêàÿ åìêîñòü, êîëè÷åñòâî 263 000 404 000 526 000 728 000 1 052 000 1 537 000 2 670 000 ýêâèâàëåíòíûõ âåíòèëåé ×èñëî ëîãè÷åñêèõ ýëåìåíòîâ
4 160
6 400
8 320
11 520
16 640
24 320
42 240
Âñòðîåííûå áëîêè ïàìÿòè
26
40
52
72
104
152
264
311 296
540 672
Ìàêñèìàëüíûé îáúåì ïàìÿòè [áèò]
53 248
81 920 106 496 147 456 212 992
×èñëî ìàêðîÿ÷ååê
416
640
832
1 152
1 664
2 432
4 224
×èñëî âûâîäîâ ïîëüçîâàòåëÿ
252
320
382
420
502
620
780
78
Ýëåìåíòíàÿ áàçà Àðõèòåêòóðà ÏËÈÑ ñåìåéñòâà APEX20K (Ðèñ. 1.47) ñî÷åòàåò â ñåáå äîñòîèíñòâà FPGA ÏËÈÑ ñ èõ òàáëèöàìè ïåðåêîäèðîâîê, âõîäÿùèìè â ñîñòàâ ëîãè÷åñêîãî ýëåìåíòà, ëîãèêó âû÷èñëåíèÿ ÑÄÍÔ (ñîâåðøåííàÿ äèçúþíêòèâíàÿ íîðìàëüíàÿ ôîðìà), õàðàêòåðíóþ äëÿ ÏËÈÑ CPLD, à òàêæå âñòðîåííûå ìîäóëè ïàìÿòè. Îòëè÷èòåëüíîé îñîáåííîñòüþ ÏËÈÑ ñåìåéñòâà APEX20K ÿâëÿåòñÿ îáúåäèíåíèå ËÁ â òàê íàçûâàåìûé ìåãàáëîê (megaLAB) (Ðèñ. 1.48), èìåþùèé ñîáñòâåííóþ íåïðåðûâíóþ ìàòðèöó ñîåäèíåíèé (megaLAB interconnect). Òàêàÿ îðãàíèçàöèÿ ñîåäèíåíèé ïîçâîëÿåò âûäåëèòü äîïîëíèòåëüíûå ðåñóðñû äëÿ òðàññèðîâêè, êðîìå òîãî, â êàæäîì ìåãàáëîêå ìîæåò áûòü ïîëíîñòüþ ðàçâåäåíà òà èëè èíàÿ ôóíêöèîíàëüíî çàêîí÷åííàÿ ÷àñòü ñèñ-
Управление тактовой частотой
ЭВВ
ЭВВ
ЭВВ
ЭВВ
Таблицы перекодировки
Таблицы перекодировки
Таблицы перекодировки
Таблицы перекодировки
МЯ
МЯ
МЯ
МЯ
Память
Память
Память
Память
Таблицы перекодировки
Таблицы перекодировки
Таблицы перекодировки
Таблицы перекодировки
МЯ
МЯ
МЯ
МЯ
Память
Память
Память
Память
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ГМС
ЭВВ
ЭВВ
AL1047+
ЭВВ
ЭВВ
Ðèñ. 1.47. Àðõèòåêòóðà ÏËÈÑ ñåìåéñòâà APEX20K
79
Ýëåìåíòíàÿ áàçà
ЛМС
ЛЭ1
ЛЭ1
ЛЭ2
ЛЭ2
ЛЭ2
ЛЭ3
ЛЭ3
ЛЭ3
ЛЭ4
ЛЭ4
ЛЭ4
ЛЭ5
ЛЭ5
ЛЭ5
ЛЭ6
ЛЭ6
ЛЭ6
ЛЭ7
ЛЭ7
ЛЭ7
ЛЭ8
ЛЭ8
ЛЭ8
ЛЭ9
ЛЭ9
ЛЭ9
ЛЭ10
ЛЭ10
ЛЭ10
ЛБ
ЛБ
ЛМС
Блок памяти
ЛЭ1
AL1048+
К смежному ЛБ
Межсоединение мегаблока
Ðèñ. 1.48. Ñòðóêòóðà ìåãàáëîêà ÏËÈÑ ñåìåéñòâà APEX20K
òåìû, ÷òî ïîçâîëÿåò ïðè åå ìîäèôèêàöèè íå ïåðåòðàññèðîâàòü ýòîò ó÷àñòîê è òåì ñàìûì ñîõðàíèòü âñå çàäàííûå âðåìåííûå ïàðàìåòðû. Òàêæå òàêàÿ îðãàíèçàöèÿ ÏËÈÑ ïîçâîëÿåò ðàçóìíåå îðãàíèçîâàòü ñîîòâåòñòâóþùåå ïðîãðàììíîå îáåñïå÷åíèå, â òîì ÷èñëå ñîçäàòü ñðåäñòâà êîëëåêòèâíîé ðàáîòû íàä ïðîåêòîì. Íà Ðèñ. 1.49 ïðåäñòàâëåíà ñòðóêòóðà ËÁ ÏËÈÑ ñåìåéñòâà APEX20K. Kàæäûé ËÁ ñîñòîèò èç 10 ËÝ, èìåþùèõ ñòðóêòóðó, ïîêàçàííóþ íà Ðèñ. 1.50. Kàê ìîæíî çàìåòèòü, ñòðóêòóðà ËÁ îáúåäèíÿåò âñå ëó÷øåå, ÷òî íàðàáîòàíî â ïðåäøåñòâóþùèõ ñåìåéñòâàõ ÏËÈÑ. Kàæäûé ËÝ èìååò âîçìîæíîñòü êîììóòàöèè íà äâà ñòîëáöà ÃÌÑ, ïîäîáíî ÏËÈÑ ñåìåéñòâà FLEX6000. Ìàòðèöà ñîåäèíåíèé ìåãàáëîêà (ÌÑÌ) êîììóòèðóåòñÿ íà ËÌÑ ËÁ è íà ñòðîêè ÃÌÑ.  îòëè÷èå îò ñåìåéñòâ FLEX, ËÝ ÏËÈÑ ñåìåéñòâà APEX20K èìååò âîçìîæíîñòü ôîðìèðîâàíèÿ óïðàâëÿþùèõ ñèãíàëîâ òðèããåðà êàê ñ ïîìîùüþ ãëîáàëüíûõ è ëîêàëüíûõ ñèãíàëîâ, òàê è èñïîëüçóÿ ñèãíàëû ìåãàáëîêà. Àíàëîãè÷íî ñåìåéñòâàì FLEX ËÝ ìîæåò áûòü ñêîíôèãóðèðîâàí â íîðìàëüíîì, àðèôìåòè÷åñêîì èëè ñ÷åòíîì ðåæèìå, äîïóñêàåò êàñêàäèðîâàíèå è öåïî÷å÷íûé ïåðåíîñ.
80
Ýëåìåíòíàÿ áàçà
Строка ГМС
Межсоединение мегаблока ( МСМ ) ЛМС 10 ЛЭ
Столбец ГМС
AL1049+
К смежному ЛБ или ЭВВ
Ðèñ. 1.49. Ñòðóêòóðà ËÁ
Вход переноса Data1 Data2 Data3 Data4 Labctrl1 Labctrl2 Сброс
ТП
Цепь переноса
Синхронная Синхронный Вход каскадирования установка сброс Цепи каскадирования
Логика синхронного сброса и установки
Асинхронный сброс/ установка Синхронизация
PRN D
Labclk1
Q
К ГМС, МСМ, ЛМС
Labclk2
Labclkena2
Выход переноса
Выход каскадировании
Ðèñ. 1.50. Ëîãè÷åñêèé ýëåìåíò ÏËÈÑ ñåìåéñòâà APEX20K
81
К ГМС, МСМ, ЛМС AL1050+
ENA CLRN
Labclkena1
Ýëåìåíòíàÿ áàçà Ñòðóêòóðà ñîåäèíåíèé ïðèâåäåíà íà Ðèñ. 1.51. Ïîäîáíî ÏËÈÑ ñåìåéñòâà ÌÀÕ, â ñîñòàâ ÏËÈÑ ñåìåéñòâà ÀÐÅÕ20K âõîäÿò ìàêðîÿ÷åéêè, èìåþùèå ïðîãðàììèðóåìóþ ìàòðèöó «È» è ïàðàëëåëüíûé ðàñøèðèòåëü. Îòëè÷èòåëüíîé îñîáåííîñòüþ ÏËÈÑ ñåìåéñòâà ÀÐÅÕ20K ÿâëÿþòñÿ ñèñòåìíûå áëîêè ïàìÿòè (ÑÁÏ, ESB embedded system block), ïîêàçàííûå íà Ðèñ. 1.53. Îòëè÷èòåëüíîé îñîáåííîñòüþ ÑÁÏ ÿâëÿåòñÿ òî, ÷òî îí ìîæåò áûòü ñêîíôèãóðèðîâàí êàê êîíòåêñòíî-àäðåñóåìàÿ ïàìÿòü (ò.å. ïàìÿòü, àäðåñóåìàÿ ïî åå ñîäåðæèìîìó) èëè êàê äâóõïîðòîâàÿ ïàìÿòü, ÷òî ñóùåñòâåííî ðàñøèðÿåò âîçìîæíîñòè ïðèìåíåíèÿ. Íà Ðèñ. 1.54 ïðèâåäåíà îðãàíèçàöèÿ áëîêà ââîäà/âûâîäà (ÁÂÂ). Kàæäûé Á ìîæåò áûòü ñêîíôèãóðèðîâàí â ñîîòâåòñòâèè ñ ðàçëè÷íûìè óðîâíÿìè ëîãè÷åñêèõ ñèãíàëîâ, ñóùåñòâóåò òàêæå äâà áëîêà, ïîääåðæèâàþùèõ ñêîðîñòíîé èíòåðôåéñ LVDS. Òàêàÿ îðãàíèçàöèÿ ââîäà/âûâîäà ïîçâîëÿåò èñïîëüçîâàòü ÏËÈÑ â ñèñòåìàõ ñ ðàçëè÷íûìè óðîâíÿìè ñèãíàëîâ. Kàê è ñåìåéñòâà FLEX, ÏËÈÑ ñåìåéñòâà ÀÐÅÕ20K ïîääåðæèâàåò ñïåöèôèêàöèþ óðîâíåé PCI.  Òàáë. 1.18 ïðèâåäåíû âðåìåííûå ïàðàìåòðû ÏËÈÑ ñåìåéñòâà APEX20K. ЭВВ
ЭВВ
ЭВВ
ЭВВ
Строка ГМС
ЭВВ
MegaLAB
MegaLAB
MegaLAB
MegaLAB
ЭВВ
ЭВВ
MegaLAB
MegaLAB
MegaLAB
MegaLAB
ЭВВ
MegaLAB
MegaLAB
MegaLAB
ЭВВ
ЭВВ
MegaLAB
ЭВВ
ЭВВ
ЭВВ
Ðèñ. 1.51. Ñòðóêòóðà ñîåäèíåíèé ÏËÈÑ ñåìåéñòâà APEX20K
82
ЭВВ
AL1051+
Столбец ГМС
Ýëåìåíòíàÿ áàçà
Разрешение синхро- СинхроСброс низации низация 2
2
2
Параллельный расширитель
Матрица распределения термов
Выход МЯ Прогр. регистр D
Q
ENA CLRN
Сброс
Ðèñ. 1.52. Ìàêðîÿ÷åéêà ÏËÈÑ ñåìåéñòâà APEX20K
WRADDRESS
RDADDRESS
DATA
Q
WREN
RDEN
INCLOCK
OUTCLOCK
INACLR
OUTCLOCKEN OUTACLR
Ðèñ. 1.53. Ñèñòåìíûé áëîê ïàìÿòè
83
AL1053+
INCLOCKEN
AL1052+
32 сигналов ПМС
Ýëåìåíòíàÿ áàçà
БВВ N2
Блок выходов LVDS
БВВ N3
БВВ N4
Поддерживаемые стандарты LVTTL LVCMOS 2.5-V 1.8-V 3.3V PCI GTL+ SSTL-3 CLASS I AND II SSTL-2 CLASS I AND II HSTL CLASS I,II,III,IV CTT AGP
БВВ N7
БВВ N0
Входной блок LVDS
БВВ N1
БВВ N5
AL1054+
БВВ N6
Ðèñ. 1.54. Îðãàíèçàöèÿ ââîäà/âûâîäà Òàáëèöà 1.18. Âðåìåííûå ïàðàìåòðû ÏËÈÑ ñåìåéñòâà APEX20K Îáîçíà÷åíèå
Ïàðàìåòð
Çíà÷åíèå äëÿ EP20K1001 [íñ] min max
tINSU
Âðåìÿ óñòàíîâêè ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
2.1
tINH
Âðåìÿ óäåðæàíèÿ äàííûõ îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
0.0
Âðåìÿ çàäåðæêè âûõîäíûõ äàííûõ îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
2.0
4.0
tISUBIDIR
Âðåìÿ óñòàíîâêè äâóíàïðàâëåííîãî âûâîäà îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
1.1
tINHBIDIR
Âðåìÿ óäåðæàíèÿ äâóíàïðàâëåííîãî âûâîäà îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
0.0
Âðåìÿ çàäåðæêè âûõîäíûõ äàííûõ íà äâóíàïðàâëåííîì âûâîäå îòíîñèòåëüíî ãëîáàëüíîãî òàêòîâîãî èìïóëüñà
2.0
4.0
tXZBIDIR
Çàäåðæêà ïåðåõîäà âûõîäíîãî áóôåðà â òðåòüå ñîñòîÿíèå
4.8
tZXBIDIR
Çàäåðæêà ïåðåõîäà âûõîäíîãî áóôåðà èç òðåòüåãî ñîñòîÿíèÿ
5.9
tOUTCO
tOUTCOBIDIR
84
Ýëåìåíòíàÿ áàçà
1.8. Ñåìåéñòâî Mercury Íîâîå ñåìåéñòâî Mercury áûëî âûïóùåíî íà ðûíîê ôèðìîé «Altera» â íà÷àëå 2001 ãîäà. Äàííûå óñòðîéñòâà ïðåäñòàâëÿþò ñîáîé ïðèíöèïèàëüíî íîâûé êëàññ ÏËÈÑ, îðèåíòèðîâàííûõ íà ïðèëîæåíèÿ äëÿ êîììóíèêàöèé è îáðàáîòêè ñèãíàëîâ. Îòëè÷èòåëüíûìè ÷åðòàìè ñåìåéñòâà Mercury ÿâëÿþòñÿ: èíòåãðèðîâàííûå âûñîêîñêîðîñòíûå ïðèåìîïåðåäàò÷èêè, ïîääåðæèâàþùèå ñèíõðîííîå âîññòàíîâëåíèå äàííûõ (Clock Data Recovery, CDR), ïîçâîëÿþùèå îðãàíèçîâàòü ïåðåäà÷ó è ïðèåì äàííûõ íà ñêîðîñòÿõ äî 1.25 Ãáèò/c (Gbps); àðõèòåêòóðà ëîãè÷åñêîãî ýëåìåíòà îñíîâàíà íà òðàäèöèîííîé òàáëèöå ïåðåêîäèðîâîê, îïòèìèçèðîâàíà ïîä âûñîêèå òåìïû îáðàáîòêè äàííûõ; íîâàÿ àðõèòåêòóðà áûñòðûõ ìåæñîåäèíåíèé âíóòðè êðèñòàëëà äëÿ óìåíüøåíèÿ çàäåðæåê â êðèòè÷åñêèõ ïóòÿõ; ýëåìåíòû ââîäà/âûâîäà ïîääåðæèâàþò ìíîæåñòâî ñòàíäàðòíûõ èíòåðôåéñîâ îáìåíà äàííûìè; ÏËÈÑ ñåìåéñòâà Mercury ñîäåðæàò äî 14 400 ëîãè÷åñêèõ ýëåìåíòîâ; òàêòèðîâàíèå ñ óìíîæåíèåì ÷àñòîòû îáåñïå÷èâàåòñÿ ñõåìàìè ôàçîâîé àâòîïîäñòðîéêè ÷àñòîòû (Phase-Locked Loop, PLL) ñ ïðîãðàììèðóåìûì êîýôôèöèåíòîì óìíîæåíèÿ ÷àñòîòû è ñäâèãîì ôàçû îïîðíîãî ñèãíàëà; ÏËÈÑ ñåìåéñòâà Mercury èìåþò äî 12 âûõîäîâ ÔÀÏ×; ñïåöèàëèçèðîâàííàÿ ñõåìà äëÿ ðåàëèçàöèè àïïàðàòíûõ óìíîæèòåëåé (êàê çíàêîâûõ, òàê è áåççíàêîâûõ), ïîçâîëÿþùàÿ ðåàëèçîâàòü óìíîæèòåëè ðàçðÿäíîñòüþ äî 16×16; ÏËÈÑ ñåìåéñòâà Mercury èìåþò âñòðîåííûå ñèñòåìíûå áëîêè ïàìÿòè (Embedded System Blocks, ESBs), íà êîòîðûõ âîçìîæíî ðåàëèçîâàòü ðàçíîîáðàçíûå óñòðîéñòâà ïàìÿòè, òàêèå, êàê ÷åòûðåõïîðòîâîå ÎÇÓ (quadport RAM), äâóíàïðàâëåííûå äâóõïîðòîâûå ÎÇÓ (bidirectional dual-port RAM), áóôåðû FIFO, ïàìÿòü ñ àäðåñàöèåé ïî ñîäåðæèìîìó (ContentAddressable Memory, CAM); êàæäûé ñèñòåìíûé áëîê ïàìÿòè ñîäåðæèò 4096 áèò è ìîæåò áûòü ñêîíôèãóðèðîâàí äëÿ èñïîëüçîâàíèÿ êàê äâà îäíîíàïðàâëåííûõ äâóõïîðòîâûõ ÎÇÓ ïî 2048 áèò êàæäîå.  Òàáë. 1.19 ïðèâåäåíû îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà Mercury.
85
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.19. Îñíîâíûå õàðàêòåðèñòèêè ÏËÈÑ ñåìåéñòâà Mercury Ïàðàìåòð
EP1M120
EP1M350
120 000
350 000
8
18
4 800
14 400
×èñëî ñèñòåìíûõ áëîêîâ ïàìÿòè
12
28
Îáúåì âñòðîåííîé ïàìÿòè [áèò]
49 152
114 688
×èñëî ïîëüçîâàòåëüñêèõ âûâîäîâ
303
486
Ëîãè÷åñêàÿ åìêîñòü, êîëè÷åñòâî ýêâèâàëåíòíûõ âåíòèëåé ×èñëî âûñîêîñêîðîñòíûõ äèôôåðåíöèàëüíûõ êàíàëîâ ââîäà/âûâîäà ×èñëî ëîãè÷åñêèõ ýëåìåíòîâ
Îñîáåííîñòè ýëåìåíòîâ ââîäà/âûâîäà ïîääåðæêà îãðîìíîãî ÷èñëà ñòàíäàðòíûõ èíòåðôåéñîâ, òàêèõ êàê LVTTL, PCI (äî 66 ÌÃö), PCI-X (äî 133 ÌÃö), 3.3- AGP, 3.3-V SSTL, 3- è 2.5- SSTL-2, GTL+, HSTL, CTT, LVDS, LVPECL è PCML. Âûñîêîñêîðîñòíîé äèôôåðåíöèàëüíûé èíòåðôåéñ (High-Speed Differential Interface, HSDI) ñ âñòðîåííîé ñèíõðîííîé ñõåìîé ñèíõðîííîãî âîññòàíîâëåíèÿ äàííûõ îáåñïå÷èâàåò ñêîðîñòü ïåðåäà÷è äàííûõ äî 1.25 Ãèãàáèòà â ñåêóíäó äëÿ óðîâíåé LVDS, LVPECL è PCML. Ïðè èñïîëüçîâàíèè âíåøíåé ñèíõðîíèçàöèè îáåñïå÷èâàåòñÿ ñêîðîñòü äî 840 Ìáèò/ñ äëÿ óðîâíåé LVDS, LVPECL è PCML. Âîçìîæíî èñïîëüçîâàòü äî 18 äèôôåðåíöèàëüíûõ êàíàëîâ íà âõîä è äî 18 íà âûõîä, ïîääåðæèâàÿ óðîâíè LVDS, LVPECL èëè PCML. Ãèáêàÿ âñòðîåííàÿ ñõåìà LVDS TM îáåñïå÷èâàåò ïðîèçâîäèòåëüíîñòü îáìåíà äî 332 Ìáèò/ñ ïî 100 êàíàëàì (äëÿ óñòðîéñòâà EP1M350). Ýëåìåíòû ââîäà/âûâîäà ïîääåðæèâàþò óäâîåííóþ ñêîðîñòü îáìåíà äàííûìè (Double Data Rate I/O, DDRIO), ÷òî ïîçâîëÿåò ðàáîòàòü ñ DDR SDRAM, ïàìÿòüþ ñ íóëåâûì âîçâðàùåíèåì øèíû (Zero Bus Turnaround, ZBT SRAM) è ïàìÿòüþ ñ ÷åòûðåõêðàòíûì óñêîðåíèåì îáìåíà (Quad Data Rate, QDR SRAM). Íàïðÿæåíèå ïèòàíèÿ ÏËÈÑ ñåìåéñòâà Mercury ñîñòàâëÿåò 1.8  äëÿ âíóòðåííèõ ÿ÷ååê (VCCINT ) è ïîääåðæêó ðàçëè÷íûõ óðîâíåé äëÿ íàïðÿæåíèÿ ïèòàíèÿ Ý (VCCIO ) 1.5, 1.8, 2.5, 3.3 Â. Äëÿ ðàáîòû ñ 5-âîëüòîâûìè ñõåìàìè íåîáõîäèìû âíåøíèå ïîäñòðàèâàþùèå ðåçèñòîðû. Ñòðóêòóðà ìåæñîåäèíåíèé èìååò ìíîãîóðîâíåâûé õàðàêòåð, ÷òî îáåñïå÷èâàåò õîðîøóþ òðàññèðóåìîñòü ïðîåêòà.
86
Ýëåìåíòíàÿ áàçà  îáùåì, ìîæíî ñêàçàòü, ÷òî ÏËÈÑ ñåìåéñòâà Mercury èíòåãðèðóþò â ñåáå âñòðîåííûå äèôôåðåíöèàëüíûå ÝÂÂ, ïîääåðæèâàþùèå ñêîðîñòíîé îáìåí äàííûìè è îïòèìèçèðîâàííóþ âíóòðåííþþ àðõèòåêòóðó. Àðõèòåêòóðà ÏËÈÑ ñåìåéñòâà Mercury ñïåöèàëüíî îïòèìèçèðîâàíà ïîä èñïîëüçîâàíèå ìåãàôóíêöèé. Ïðè ýòîì ïðîèçâîäèòåëüíîñòü ýòèõ óñòðîéñòâ çíà÷èòåëüíî âîçðîñëà ïî ñðàâíåíèþ ñ äðóãèìè ñåìåéñòâàìè (ñì. Òàáë. 1.20), ÷òî äåëàåò èõ î÷åíü ïðèâëåêàòåëüíûìè â ñèãíàëüíûõ çàäà÷àõ. Òàáëèöà 1.20. Ïðîèçâîäèòåëüíîñòü ÏËÈÑ ñåìåéñòâà Mercury Ðåñóðñû ÏËÈÑ
Ïðèëîæåíèå
Ïðîèçâîäèòåëüíîñòü
ËÝ
ÑÁÏ
16-ðàçðÿäíûé çàãðóæàåìûé ñ÷åò÷èê
16
0
333 ÌÃö
32-ðàçðÿäíûé çàãðóæàåìûé ñ÷åò÷èê
32
0
333 ÌÃö
32-ðàçðÿäíûé íàêàïëèâàþùèé ñóììàòîð
32
0
333 ÌÃö
Ìóëüòèïëåêñîð 32 â 1
27
0
1.7 íñ
32×64 FIFO
103
2
311 ÌÃö
ÏËÈÑ ñåìåéñòâà Mercury ïîñòðîåíû ïî òåõíîëîãèè ÊÌÎÏ SRAM è ìîãóò áûòü ñêîíôèãóðèðîâàíû ëèáî ñ âíåøíåãî ÏÇÓ, ëèáî îò êîíòðîëëåðà ñèñòåìû. Áåçóñëîâíî, ïîääåðæèâàþòñÿ âñå ôóíêöèè ïðîãðàììèðîâàíèÿ â ñèñòåìå.  êà÷åñòâå ñðåäñòâà ðàçðàáîòêè ïðîåêòîâ íà ÏËÈÑ ñåìåéñòâà Mercury èñïîëüçóåòñÿ ïàêåò Quartus II. Àðõèòåêòóðà ÏËÈÑ ñåìåéñòâà Mercury ñîñòîèò èç ðÿäîâ ËÝ, âûïîëíÿþùèõ ôóíêöèè ñòàíäàðòíîé ëîãèêè (row-based logic array), è ðÿäîâ âñòðîåííûõ ñèñòåìíûõ áëîêîâ ïàìÿòè (row-based embedded system array), êîòîðûå ìîãóò áûòü òàêæå ñêîíôèãóðèðîâàíû äëÿ ðåàëèçàöèè ñëîæíûõ ôóíêöèé. Âíóòðåííèå ìåæñîåäèíåíèÿ â ÏËÈÑ ñåìåéñòâà Mercury ïðåäñòàâëÿþò íàáîð âåðòèêàëüíûõ è ãîðèçîíòàëüíûõ òðàññ ðàçëè÷íîé äëèíû è îáåñïå÷èâàþùèõ ðàçëè÷íóþ ñêîðîñòü ðàñïðîñòðàíåíèÿ ñèãíàëà.  îòëè÷èå îò ÏËÈÑ äðóãèõ ñåìåéñòâ, â ÏËÈÑ ñåìåéñòâà Mercury ýëåìåíòû ââîäà/âûâîäà ðàñïîëîæåíû ïî âñåé ïëîùàäè ñèãíàëà, ÷òî îáåñïå÷èâàåò âîçìîæíîñòü ðåàëèçàöèè ñêîðîñòíîãî îáìåíà. Kàæäûé âûâîä óïðàâëÿåòñÿ ñâîèì ÝÂÂ.
87
Ýëåìåíòíàÿ áàçà Íà Ðèñ. 1.55 ïðèâåäåíà ñòðóêòóðà ÏËÈÑ ñåìåéñòâà Mercury. ÏËÈÑ ñåìåéñòâà Mercury èìåþò ÷åòûðå âûäåëåííûå ëèíèè òàêòîâûõ ñèãíàëîâ (dedicated clock) è øåñòü âûäåëåííûõ ãëîáàëüíûõ ëèíèé ñèãíàëîâ óïðàâëåíèÿ. Ñëåäóåò çàìåòèòü, ÷òî â ÏËÈÑ ñåìåéñòâà Mercury âûäåëåííûå ëèíèè ìîãóò óïðàâëÿòñÿ âíóòðåííèìè ñèãíàëàìè, ÷òî çíà÷èòåëüíî îáëåã÷àåò ïîñòðîåíèå ñõåì ñèíõðîíèçàöèè (òåïåðü íå íóæíî «ãîíÿòü» ñèãíàë èç ÏËÈÑ â ÏËÈÑ äëÿ ðåàëèçàöèè äåëèòåëåé ÷àñòîòû). Kðîìå òîãî, öåïè ñèíõðîíèçàöèè ìîæåò èñïîëüçîâàòü ÔÀÏ× äëÿ óìíîæåíèÿ ÷àñòîòû.  ÏËÈÑ ñåìåéñòâà Mercury ðåàëèçîâàí âñòðîåííûé âûñîêîñêîðîñòíîé äèôôåðåíöèàëüíûé èíòåðôåéñ, ïîçâîëÿþùèé ðåàëèçîâàòü îáìåí ñî ñêîðîñòüþ äî 1.25 Ãèãàáèò â ñåêóíäó. Ñòðóêòóðíàÿ ñõåìà ñèíõðîííîãî ïðèåìà äàííûõ ïðèâåäåíà íà Ðèñ. 1.56. Ñòðóêòóðíàÿ ñõåìà ñèíõðîííîé ïåðåäà÷è äàííûõ ïðèâåäåíà íà Ðèñ. 1.57. Ñõåìà âûñîêîñêîðîñòíîãî äèôôåðåíöèàëüíîãî èíòåðôåéñà óäîáíà äëÿ òàêèõ ïðèëîæåíèé, êàê Gigabit Ethernet, ATM, SONET, RapidIO, POS-PHY Level 4, Fibre Channel, IEEE Std. 1394, HDTV, SDTV. Ñõåìà ïîääåðæèâàåò ðåæèìû ñ âíåøíåé ñèíõðîíèçàöèåé (source-synchronous mode) è ñèíõðîííûì âîññòàíîâëåíèåì äàííûõ (Clock Data Recovery (CDR) mode) (Ðèñ. 1.58). Kàæäûé ëîãè÷åñêèé áëîê ñîäåðæèò 10 ëîãè÷åñêèõ ýëåìåíòîâ, öåïè ïåðåíîñà ËÝ, ñõåìó àïïàðàòíîãî óìíîæåíèÿ (multiplier circuitry), ñèãíàëû óïðàâëåíèÿ è äâà òèïà ìåæñîåäèíåíèé ëîêàëüíóþ ìàòðèöó (local interconnect) è áûñòðûå öåïè äëÿ îáúåäèíåíèÿ òàáëèö ïåðåêîäèðîâêè (Fast LUT). Ñòðóêòóðà ËÁ ÏËÈÑ ñåìåéñòâà Mercury ïðèâåäåíà íà Ðèñ. 1.59. Ñòðóêòóðíàÿ ñõåìà óïðàâëÿþùèõ ñèãíàëîâ ËÁ (LAB Control Signals) ïðèâåäåíà íà Ðèñ. 1.60. Kàæäûé ËÁ èìååò âûäåëåííûå òàêòîâûé ñèãíàë (clock), ñèãíàë ðàçðåøåíèÿ òàêòîâîãî èìïóëüñà (clock enable), àñèíõðîííûé ñáðîñ (asynchronous clear), àñèíõðîííóþ ïðåäóñòàíîâêó (asynchronous preset), àñèíõðîííóþ çàãðóçêó (asynchronous load), ñèíõðîííûé ñáðîñ (synchronous clear) è ñèãíàë ñèíõðîííîé çàãðóçêè (synchronous load). Îäíîâðåìåííî ìîæåò áûòü çàäåéñòâîâàíî äî 6 ñèãíàëîâ óïðàâëåíèÿ. Ñòðóêòóðà ëîãè÷åñêîãî ýëåìåíòà ÏËÈÑ ñåìåéñòâà Mercury íàïîìèíàåò ñòðóêòóðó ËÝ ñåìåéñòâ FLEX è APEX. Kàæäûé ËÝ ñîäåðæèò ÷åòûðåõâõîäîâóþ ÒÏ, öåïè ïåðåíîñà è êàñêàäèðîâàíèÿ, òðèããåð. Åäèíñòâåííîå ñåðüåçíîå îòëè÷èå äîïîëíèòåëüíûå öåïè ïåðåíîñà, ÷òî ïîçâîëÿåò ñòðîèòü âûñîêîïðîèçâîäèòåëüíûå àðèôìåòè÷åñêèå óñòðîéñòâà. Ñòðóêòóðà ËÝ ÏËÈÑ ñåìåéñòâà Mercury ïðèâåäåíà íà Ðèñ. 1.61.
88
89 СБП
Ðèñ. 1.55. Ñòðóêòóðà ÏËÈÑ ñåìåéñòâà Mercury
Быстрые горизонтальные локальные соединения
Быстрые вертикальные локальные соединения
Вертикальные межсоединения и быстрые вертикальные межсоединения
Горизонтальные межсоединения и быстрые горизонтальные межсоединения
Локальные межсоединения
СБП
СБП
СБП Группа ЭВВ
СБП
СБП
СБП
СБП
Группа ЭВВ СБП
Внешний ряд логических блоков
Внутренний ряд логических блоков
Внешний ряд логических блоков
Группа ЭВВ
Внутренний ряд логических блоков
Внутренний ряд логических блоков
Внешний ряд логических блоков
Группа ЭВВ
Внутренний ряд логических блоков
Внутренний ряд логических блоков
Внешний ряд логических блоков
Группа ЭВВ
Внутренний ряд логических блоков
Внутренний ряд логических блоков
Внешний ряд логических блоков
СБП
СБП
СБП
Ýëåìåíòíàÿ áàçà
AL1055+
Ýëåìåíòíàÿ áàçà
J
Приемный канал
HSDI_CLK2
HSDI PLL2
Регистр с последовательной загрузкой и параллельной выдачей данных
К глобальным цепям тактовой частоты
1 J
×W
к ЛЭ
Приемный канал 1 Приемный канал
Приемный канал
AL1056+
Приемный канал 2
Приемный канал 8
Ðèñ. 1.56. Ñèíõðîííûé ïðèåì äàííûõ
J Передающий канал
HSDI_CLK1
HSDI PLL1
TXOUTCLOCK
×W ×
1 J
W B
Данные к ЛЭ
Передающий канал 1
Передающий канал
Передающий канал 2
Передающий канал
Передающий канал 8
Ðèñ. 1.57. Ñèíõðîííàÿ ïåðåäà÷à äàííûõ
90
AL1057+
Глобальный сигнал синхронизации
Регистр с параллельной загрузкой и последовательной выдачей данных
Ýëåìåíòíàÿ áàçà
4 Передающий канал
Передающий канал 1
Приемный канал
4
HSDI_CLK1
PLL1
×W
HSDI_CLK2
PLL2
×W
Приемный канал 1
J Регистр с параллельной загрузкой и последовательной выдачей данных
Передающий канал
Регистр с последовательной загрузкой и параллельной выдачей данных
от ЛЭ
4
1 J Передающий канал 4
J
Приемный канал
CAU
1 J
Регистр с последовательной загрузкой и параллельной выдачей данных
Регистр с параллельной загрузкой и последовательной выдачей данных
к ЛЭ
4
Приемный канал 4
Такт 4
Передающий канал
Передающий канал 5
Приемный канал
4 Приемный канал 5
Такт
4 Передающий канал
Приемный канал 8
Ðèñ. 1.58. Ðåæèì ñèíõðîííîãî âîññòàíîâëåíèÿ äàííûõ
91
4
AL1058+
Передающий канал 8
Приемный канал
Ýëåìåíòíàÿ áàçà
Горизонтальные межсоединения и быстрые горизонтальные межсоединения
Быстрые горизонтальные локальные соединения
Локальные межсоединения
Быстрые вертикальные локальные соединения
AL1059+
Вертикальные межсоединения и быстрые вертикальные межсоединения
Ðèñ. 1.59. Ëîãè÷åñêèé áëîê ÏËÈÑ ñåìåéñòâà Mercury
Kàæäûé ËÝ ìîæåò áûòü ñêîíôèãóðèðîâàí â òðåõ ðåæèìàõ: îáû÷íîì (normal), àðèôìåòè÷åñêîì (arithmetic) è ðåæèìå àïïàðàòíîãî óìíîæèòåëÿ (multiplier). Íîðìàëüíûé è àðèôìåòè÷åñêèé ðåæèìû âî ìíîãîì àíàëîãè÷íû ñîîòâåòñòâóþùèì ðåæèìàì ðàáîòû ËÝ ÏËÈÑ ñåìåéñòâ FLEX è APEX, îòëè÷èå òîëüêî â íàëè÷èè äîïîëíèòåëüíûõ öåïåé ïåðåíîñà, ÷òî ïîçâîëÿåò ñòðîèòü ìíîãîðàçðÿäíûå áûñòðûå àðèôìåòè÷åñêèå óçëû.  ðåæèìå ïåðåìíîæèòåëÿ (multiplier mode) ìîæíî ðåàëèçîâàòü ñêîðîñòíîé ïåðåìíîæèòåëü ðàçìåðíîñòüþ äî 16⫻16. Ñòðóêòóðíàÿ ñõåìà ýòîãî ðåæèìà ïðèâåäåíà íà Ðèñ. 1.62.
92
Ýëåìåíòíàÿ áàçà Выделенные тактовые частоты
4
Быстрые глобальные сигналы
6
Горизонтальные глобальные сигналы
2
Локальные межсоединения Локальные межсоединения Локальные межсоединения Локальные межсоединения
SYNCCLR or LABCLK2
SYNCLOAD or LABCLKENA2
LABCLK1
LABCLKENA1
LABCLR
AL1060+
ASYNCLOAD or LABPRE
Ðèñ. 1.60. Óïðàâëÿþùèå ñèãíàëû ËÁ ÏËÈÑ ñåìåéñòâà Mercury
LAB CarryGIn CarryGIn1 CarryGIn0 data1 data2 data3 data4 (1)
labdr labpre ChipGWide Reset
Таблица Цепи переG переноса кодировки
LABGwide Synchronous Load
LABGwide Synchronous Clear Цепи ТП
Цепи сбросаG загрузки (синхронные)
PRN D G
к межсоG единениям
ENA CLRN
к межсоG единениям
Цепи сбросаG установки (асинхронные) Цепи тактирования
labdk1 labdk2
CarryGOut0 CarryGOut1 LAB CarryGOut (2)
Ðèñ. 1.61. Ñòðóêòóðà ËÝ ÏËÈÑ ñåìåéñòâà Mercury
93
AL1061+
labdkena1 labdkena2
Ýëåìåíòíàÿ áàçà LAB Wide Clock Enable Signals (1) Combinational Sum Output Combinational Sum Output
LAB CarryGIn CarryGIn0 CarryGIn1
RapidLAB Interconnect (2) Выход ЛЭ
BM+1
Программируемый инвертор
AN+1
Программируемый инвертор
BM
Программируемый инвертор
D
Полный сумматор
LAB CarryGOut
Выход ЛЭ
Q
ENA CLRN
Registered Sum Output
CarryGOut1
CarryGOut0
AL1062+
AN
Программируемый инвертор
Ðèñ. 1.62. Ñòðóêòóðà ËÝ ÏËÈÑ ñåìåéñòâà Mercury â ðåæèìå ïåðåìíîæèòåëÿ ñèãíàëîâ
Äëÿ ïîñòðîåíèÿ ïåðåìíîæèòåëåé â ÏËÈÑ ñåìåéñòâà Mercury èñïîëüçóåòñÿ áèíàðíîå äåðåâî. Íà Ðèñ. 1.63 ïðèâåäåíà åãî ñòðóêòóðà. Íà äâîè÷íîì äåðåâå ðåàëèçóåòñÿ ïðîèçâåäåíèå 16-ðàçðÿäíûõ ÷èñåë A[15:0] è B[15:0], ðåçóëüòàò ïåðâîé ñòóïåíè 16 øåñòíàäöàòèðàçðÿäíûõ ÷àñòè÷íûõ ïðîèçâåäåíèé A[15:0]B[15], A[15:0]B[14], . . . A[15:0]B[0]. ×àñòè÷íûå ïðîèçâåäåíèÿ ãðóïïèðóþòñÿ â ïàðû è ñóììèðóþòñÿ íà âòîðîé ñòóïåíè è ò.ä. ÏËÈÑ ñåìåéñòâà Mercury èìåþò ìíîãîóðîâíåâóþ ñòðóêòóðó ìåæñîåäèíåíèé (Multi-Level FastTrack Interconnect), êîòîðàÿ îáåñïå÷èâàåò âûñîêèå ñêîðîñòíûå õàðàêòåðèñòèêè ÏËÈÑ. Ìíîãîóðîâíåâàÿ ñòðóêòóðà ïîçâîëÿåò òðàññèðîâàòü îòâåòñòâåííûå öåïè íåïðåðûâíî, ÷òî çíà÷èòåëüíî ïîâûøàåò áûñòðîäåéñòâèå. Ðåñóðñû òðàññèðîâêè âêëþ÷àþò: ãîðèçîíòàëüíûå ëèíèè ñîåäèíåíèé (row interconnect); ïðèîðèòåòíûå ãîðèçîíòàëüíûå ëèíèè ñîåäèíåíèé (priority row interconnect) äëÿ áûñòðûõ ñèãíàëîâ; ãîðèçîíòàëüíûå ëèíèè (RapidLAB), êîòîðûå ïåðåñåêàþò îáëàñòü â 10 ËÁ â öåíòðå êðèñòàëëà (Ðèñ. 1.64). Âåðòèêàëüíûå ëèíèè ñîåäèíåíèé ïðåäñòàâëåíû ñëåäóþùèìè âèäàìè: ñòîëáöû ìàòðèöû ñîåäèíåíèé (column interconnect);
94
Ýëåìåíòíàÿ áàçà
Разряды B[0]…B[7]
A[15...0]B[8] Выход A[15...0]B[9]
A[15...0]B[10]
A[15...0]B[11]
A[15...0]B[12]
Ступень 5
A[15...0]B[13]
Ступень 4
A[15...0]B[14]
Ступень 3
A[15...0]B[15]
AL1063+
Ступень 2 Ступень 1
Ðèñ. 1.63. Áèíàðíîå äåðåâî óìíîæåíèÿ ñèãíàëîâ
ïðèîðèòåòíûå ñòîëáöû (priority column interconnect) äëÿ áûñòðûõ ñèãíàëîâ; âåðòèêàëüíûå ìåæñîåäèíåíèÿ (Leap line) (Ðèñ. 1.65). Kðîìå òîãî, âíóòðè êàæäîãî ËÁ èìåþòñÿ ñïåöèàëüíûå ðåñóðñû òðàññèðîâêè, íàçâàííûå fastLUT, êîòîðûå îáúåäèíÿþò â åäèíóþ öåïü êîìáèíàöèîííûé âûõîä òàáëèöû ïåðåêîäèðîâêè ËÝ, íå èñïîëüçóÿ ëîêàëüíóþ ìàòðèöó ñîåäèíåíèé. Ñòðóêòóðà öåïåé fastLUT ïðåäñòàâëåíà íà Ðèñ. 1.66. Òàêèì îáðàçîì, àðõèòåêòóðà ìåæñîåäèíåíèé ÏËÈÑ ñåìåéñòâà Mercury ïðåäñòàâëÿåò ñîáîé ñëîæíóþ ìíîãîóðîâíåâóþ ñòðóêòóðó, ïðåäñòàâëåíèå î êîòîðîé äàåò Òàáë. 1.21.
95
96
ЛБ
Ðèñ. 1.64. Ãîðèçîíòàëüíûå ëèíèè òðàññèðîâêè RapidLAB
ЛЭ10
ЛЭ 8
ЛЭ 6
ЛЭ 4
ЛЭ 2
ЛЭ 9
ЛЭ 7
ЛЭ 5
ЛЭ 3
ЛЭ 1
Горизонтальные линии RapidLAB
ЛМС
Ýëåìåíòíàÿ áàçà
AL1064+
Ýëåìåíòíàÿ áàçà
ЛЭ 1
ЛЭ 1
ЛЭ 2
ЛЭ 2
ЛЭ 2
ЛЭ 3
ЛЭ 3
ЛЭ 3
ЛЭ 4
ЛЭ 4
ЛЭ 4
ЛЭ 5
ЛЭ 5
ЛЭ 5
ЛЭ 6
ЛЭ 6
ЛЭ 6
ЛЭ 7
ЛЭ 7
ЛЭ 7
ЛЭ 8
ЛЭ 8
ЛЭ 8
ЛЭ 9
ЛЭ 9
ЛЭ 9
ЛЭ10
ЛЭ10
ЛЭ10
Ряд логических блоков n+1
Быстрые горизонтальные межсоединения
ЛЭ 1
Ряд логических блоков n
Ряд логических блоков n–1
Вертикальные межсоединения Лeap Line
Соединения RapidLAB
AL1065+
Вертикальные межсоединения Леap Line
Ðèñ. 1.65. Âåðòèêàëüíûå ìåæñîåäèíåíèÿ (Leap line)
97
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.21. Àðõèòåêòóðà ìåæñîåäèíåíèé ÏËÈÑ ñåìåéñòâà Mercury
Ëîãè÷åñêèé ýëåìåíò Ëîêàëüíûå ëèíèè ñîåäèíåíèé Ýëåìåíò ââîäà/âûâîäà Ãîðèçîíòàëüíûå ëèíèè ñîåäèíåíèÿ ÑÁÏ Ñèñòåìíûé áëîê ïàìÿòè Ãîðèçîíòàëüíûå ìåæñîåäèíåíèÿ Ïðèîðèòåòíûå ãîðèçîíòàëüíûå ìåæñîåäèíåíèÿ Ëèíèè ñîåäèíåíèé áûñòðîäåéñòâóþùèõ ËÁ Ñòîëáöû ìàòðèöû Ïðèîðèòåòíûå ñòîëáöû ìàòðèöû Âåðòèêàëüíûå ìåæñîåäèíåíèÿ
+
Ëîêàëüíûå ëèíèè ñîåäèíåíèé Ýëåìåíò ââîäà/âûâîäà Ãîðèçîíòàëüíûå ëèíèè ñîåäèíåíèé ÑÁÏ Ñèñòåìíûé áëîê ïàìÿòè Ãîðèçîíòàëüíûå ìåæñîåäèíåíèÿ Ïðèîðèòåòíûå ãîðèçîíòàëüíûå ìåæñîåäèíåíèÿ Ëèíèè ñîåäèíåíèé áûñòðîäåéñòâóþùèõ ËÁ Ñòîëáöû ìàòðèöû Ïðèîðèòåòíûå ñòîëáöû ìàòðèöû Âåðòèêàëüíûå ìåæñîåäèíåíèÿ
Èñòî÷íèê
Ëîãè÷åñêèé ýëåìåíò
Ïóòü
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+ + +
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
Ñèñòåìíûé áëîê ïàìÿòè ïîçâîëÿåò ðåàëèçîâàòü ðàçëè÷íûå òèïû áëîêîâ ïàìÿòè äâóõ- è ÷åòûðåõïîðòîâûå ÎÇÓ, ÏÇÓ, áóôåðû FIFO è êîíòåêñòíî àäðåñóåìóþ ïàìÿòü. Ñòðóêòóðà ñèñòåìíîãî áëîêà ïàìÿòè â ðåæèìå ÷åòûðåõïîðòîâîãî ÎÇÓ ïðèâåäåíà íà Ðèñ. 1.67. Ðàçëè÷íûå âàðèàíòû êîíôèãóðàöèè ñèñòåìíîãî áëîêà ïàìÿòè ïðèâåäåíû íà Ðèñ. 1.68. Ñòðóêòóðà ýëåìåíòà ââîäà/âûâîäà ÏËÈÑ ñåìåéñòâà Mercury ïðèâåäåíà íà Ðèñ. 1.69. Ý ÏËÈÑ ñåìåéñòâà Mercury ñîäåðæèò äâóíàïðàâëåííûé áóôåð (bidirectional I/O buffer) è 3 ðåãèñòðà (registers) äëÿ îáåñïå÷åíèÿ äâóíàïðàâëåííîãî ââîäà/âûâîäà äàííûõ. Ýëåìåíòû ââîäà/âûâîäà â ÏËÈÑ ñåìåéñòâà Mercury îáúåäèíÿþòñÿ â ãðóïïû (I/O rowbands), ÷òî ïîçâîëÿåò îáåñïå÷èòü êðàò÷àéøèé ïóòü ïðè òðàññèðîâêå êðèñòàëëà (Ðèñ. 1.70).
98
Ýëåìåíòíàÿ áàçà
ЛЭ 1 ЛЭ 2
ЛЭ 4 ЛЭ 5 ЛЭ 6 ЛЭ 7 ЛЭ 8
Порт B
dataA[] wraddressA[] wrenA inclockA inclockenA inaclrA
dataB[] wraddressB[] wrenB inclockB inclockenB inaclrB
rdaddressA[] rdenA qA[] outclockA outclockenA outaclrA
rdaddressB[] rdenB qB[] outclockB outclockenB outaclrB
ЛЭ10
AL1066+
ЛЭ 9
Ðèñ. 1.66. Ñòðóêòóðà öåïåé fastLUT
Ðèñ. 1.67. Ñèñòåìíûé áëîê ïàìÿòè
Двунаправленная двуxпортовая память Порт А
Порт B
dataA[] addressA[] wrenA clockA clockenA qA[] aclrA
dataB[] addressB[] wrenB clockB clockenB qB[] aclrB
Двухпортовая память data[] wraddress[] wren inclock inclocken inaclr
rdaddress[] rden q[] outclock outclocken outaclr
data[] address[] wren inclock inclocken inaclr
q[] outclock outclocken outaclr
Ðèñ. 1.68. Âàðèàíòû êîíôèãóðàöèè ÑÁÏ
99
AL1068+
Однопортовая память
AL1067+
Порт А
ЛЭ 3
лобал е сигналы Быстрые локальные Выделенные сигналы сигналы
К вертикальным соединениям
к АМС
Глобальный сброс
Q
Q
100 Q Регистр ENA RES
D
Регистр ENA RES
D
Регистр ENA RES
D
Сигналы управления
Устройство задержки
Устройство задержки
Устройство задержки
Подстраивающий регистр
Ограничитель PCI
Горизонтальные соединения
Схема удержания шины
VCC IO
VCC IO
Ýëåìåíòíàÿ áàçà
Ðèñ. 1.69. Ñòðóêòóðà ýëåìåíòà ââîäà/âûâîäà ÏËÈÑ ñåìåéñòâà Mercury
101
INC
ЛБ
INC
INB OUT INA
IOE
INC
INB OUT INA
IOE
Ðèñ. 1.70. Ãðóïïû ÝÂÂ I/O rowbands
ЛМС
INB OUT INA
IOE
ЛБ
INC
INB OUT INA
IOE
Пары ЭВВ
INC
к ЭВВ
INB OUT INA
IOE
ЛБ
INC
ЛМС
INB OUT INA
IOE
Пары ЭВВ
Внешний ряд ЛБ
Горизонтальные соединения
Пары ЭВВ
AL1070+
Пары ЭВВ
Вертикальные соединения
Ýëåìåíòíàÿ áàçà
Ýëåìåíòíàÿ áàçà ÏËÈÑ ñåìåéñòâà Mercury èìåþò ñïåöèàëèçèðîâàííûå âûäåëåííûå ëèíèè (FAST1, FAST2, FAST3, FAST4, FAST5 è FAST6), îáåñïå÷èâàþùèå ôóíêöèè ãëîáàëüíîãî óïðàâëåíèÿ. Ý ÏËÈÑ ñåìåéñòâà Mercury ïîääåðæèâàþò ñëåäóþùèå èíòåðôåéñû: • LVTTL • LVCMOS • 1.8-V • 2.5-V • 3.3-V PCI • 3.3-V PCI-X • 3.3-V AGP • LVDS • LVPECL • PCML • GTL+ • HSTL class I and II • SSTL-3 class I and II • SSTL-2 class I and II • CTT Âñå ÏËÈÑ ñåìåéñòâà Mercury ïîëíîñòüþ ïîääåðæèâàþò ïåðèôåðèéíîå ñêàíèðîâàíèå â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std. 1149.1 1990 (JTAG).
1.9. Ñåìåéñòâî ACEX Âûïóùåííûå ôèðìîé «Altera» óñòðîéñòâà ACEX ïðåäñòàâëÿþò ñîáîé äåøåâóþ è áûñòðîäåéñòâóþùóþ àëüòåðíàòèâó ÏËÈÑ ñåìåéñòâà FLEX10K. Îíè íàñòîëüêî ñõîæè â àðõèòåêòóðå, ÷òî çäåñü ïðèâåäåì òîëüêî êðàòêèå ñâåäåíèÿ î íîâîì ñåìåéñòâå. Â ÏËÈÑ ñåìåéñòâà ACEX èìåþòñÿ âñòðîåííûå áëîêè ïàìÿòè, ïîçâîëÿþùèå ðåàëèçîâàòü äâóõïîðòîâóþ ïàìÿòü äî 16 ðàçðÿäîâ äàííûõ. ÏËÈÑ ñåìåéñòâà ACEX èìåþò ýêâèâàëåíòíóþ åìêîñòü äî 100 000 âåíòèëåé (Òàáë. 1.22).
102
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.22. Îñíîâíûå ñâåäåíèÿ î ÏËÈÑ ñåìåéñòâà ACEX Ïàðàìåòð Ëîãè÷åñêàÿ åìêîñòü ýêâèâàëåíòíûõ âåíòèëåé Ìàêñèìàëüíîå ÷èñëî ñèñòåìíûõ ýëåìåíòîâ ×èñëî ëîãè÷åñêèõ ýëåìåíòîâ ×èñëî ëîãè÷åñêèõ áëîêîâ Ìàêñèìàëüíûé îáúåì ÎÇÓ [áèò] Ìàêñèìàëüíîå ÷èñëî âûâîäîâ ïîëüçîâàòåëÿ
EP1K10 10 000 56 000 576 3 12 288 130
EP1K30 30 000 119 000 1 728 6 24 576 171
EP1K50 50 000 199 000 2 880 10 40 960 249
EP1K100 100 000 257 000 4 992 12 49 152 333
Òàáëèöà 1.23. Ïðîèçâîäèòåëüíîñòü ÏËÈÑ ñåìåéñòâà ACEX Ðåñóðñû ÏËÈÑ Ïðèëîæåíèå
ËÝ
16-ðàçðÿäíûé çàãðóæàåìûé ñ÷åò÷èê 16-ðàçðÿäíûé íàêàïëèâàþùèé ñóììàòîð Ìóëüòèïëåêñîð 32 â 1 Ìóëüòèïëåêñîð ñ 3-êàñêàäíîé îáðàáîòêîé äàííûõ 256⫻16 ÎÇÓ (ñêîðîñòü ñ÷èòûâàíèÿ) 256⫻16 ÎÇÓ (ñêîðîñòü çàïèñè)
16 16 10 544 0 0
Ïðîèçâîäèòåëüíîñòü Ãðàäàöèÿ ñêîðîñòè ÑÁÏ 1 2 3 0 200 ÌÃö 188 ÌÃö 128 ÌÃö 0 200 ÌÃö 188 ÌÃö 128 ÌÃö 0 3.2 íñ 4.3 íñ 5.5 íñ 0 93 ÌÃö 86 ÌÃö 64 ÌÃö 1 212 ÌÃö 181 ÌÃö 131 ÌÃö 1 142 ÌÃö 128 ÌÃö 94 ÌÃö
Ðåñóðñû ÏËÈÑ Ïðèëîæåíèå
ËÝ
16-ðàçðÿäíûé 8-âûâîäíîé ïàðàëëåëüíûé ôèëüòð ñ îãðàíè÷èòåëüíîé èìïóëüñíîé õàðàêòåðèñòèêîé 8-ðàçðÿäíûé, 512-òî÷å÷íûé ñ÷åòâåðåííûé áûñòðîäåéñòâóþùèé ïðåîáðàçîâàòåëü ôóíêöèè à16450 óíèâåðñàëüíûé àñèíõðîííûé ïðèåìîïåðåäàò÷èê
420
Ïðîèçâîäèòåëüíîñòü Ãðàäàöèÿ ñêîðîñòè 1 2 3 185
175
122
1.854
47.4 ìêñ 57.8 ìêñ 76.5 ìêñ 100 ÌÃö 82 ÌÃö 62 ÌÃö
342
66 ÌÃö 57 ÌÃö 44 ÌÃö
Kàæäûé ÂÁÏ ñîäåðæèò 4 096 áèò ïàìÿòè. Ïîääåðæèâàåòñÿ èíòåðôåéñ ñ óðîâíÿìè 2.5, 3.3 è 5.0 Â. Ýëåìåíòû ââîäà/âûâîäà îáåñïå÷èâàþò òåìï îáìåíà äàííûìè äî 250 ÌÃö.  Òàáë. 1.23 ïðèâåäåíû ïðèìåðû ïðîèçâîäèòåëüíîñòè ÏËÈÑ ñåìåéñòâà ACEX íà ðàçëè÷íûõ ïðîåêòàõ. Íà Ðèñ. 1.71 ïðèâåäåíà ñòðóêòóðíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà ACEX. Kàê âèäèì, ôàêòè÷åñêè ïîâòîðåíà àðõèòåêòóðà ÏËÈÑ ñåìåéñòâà FLEX10K, íî ñ ïîíèæåííûì íàïðÿæåíèåì ïèòàíèÿ è ïîòðåáëåíèåì çà ñ÷åò ïðèìåíåíèÿ íîâîé òåõíîëîãèè èçãîòîâëåíèÿ ìèêðîñõåì.
103
Ýëåìåíòíàÿ áàçà
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ ЛБ
Столбец ЛМС
LAB
ЭВВ
ЭВВ
ЭВВ
ЭВВ Строка ЛМС ЛЭ
LAB
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
ЭВВ
AL1071+
ЛМС
Ðèñ. 1.71. Ñòðóêòóðíàÿ ñõåìà ÏËÈÑ ñåìåéñòâà ACEX
1.10. Kîíôèãóðàöèîííûå ÏÇÓ Äëÿ õðàíåíèÿ êîíôèãóðàöèîííîé èíôîðìàöèè ÏËÈÑ èñïîëüçóþòñÿ ïîñëåäîâàòåëüíûå ÏÇÓ. Íà Ðèñ. 1.72 è 1.73 ïîêàçàíû êîíôèãóðàöèîííûå ÏÇÓ ôèðìû «Altera».  Òàáë. 1.24 ïðèâåäåíû îñíîâíûå äàííûå ïî êîíôèãóðàöèè ðàçëè÷íûõ ÏËÈÑ ñ ïîìîùüþ êîíôèãóðàöèîííûõ ÏÇÓ. Ïðè íåîáõîäèìîñòè èñïîëüçóåòñÿ êàñêàäíîå âêëþ÷åíèå íåñêîëüêèõ ÏÇÓ. Íà Ðèñ. 1.741.78 ïðèâåäåíû ñõåìû âêëþ÷åíèÿ êîíôèãóðàöèîííûõ ÏÇÓ è ÏËÈÑ ðàçëè÷íûõ ñåìåéñòâ. Íà Ðèñ. 1.79 ïðèâåäåíû âðåìåííûå äèàãðàììû êîíôèãóðàöèè ÏËÈÑ.
104
Ýëåìåíòíàÿ áàçà Òàáëèöà 1.24. Òèïû ÏËÈÑ è ñîîòâåòñòâóþùèå èì êîíôèãóðàöèîííûå ÏÇÓ ÏËÈÑ
ÏÇÓ
EP20K100
EPC2
EP20K200
2⫻EPC2
EP20K400 EPF10K10, EPF10K10A EPF10K20
3⫻EPC2 EPC2, EPC1, EPC1441 EPC2, EPC1, EPC1441
EPF10K30E
EPC2, EPC1
EPF10K30, EPF10K30A
EPC2, EPC1, EPC1441
EPF10K40
EPC2, EPC1
EPF10K50, EPF10K50V, EPF10K50E EPF10K70
EPC2, EPC1 EPC2, EPC1
EPF10K100, EPF10K100A, EPF10K100B, EPF10K100E
EPC2, EPC1
EPF10K130V
EPC2, 2⫻EPC1
EPF10K130E
2⫻EPC2, 2⫻EPC1
EPF10K200E
2⫻EPC2, 3⫻EPC1
EPF10K250E
2⫻EPC2, 4⫻EPC1
EPF8282A
EPC1, EPC1441, EPC1064
EPF8282AV
EPC1, EPC1441, EPC1064V
EPF8452A
EPC1, EPC1441, EPC1213
EPF8636A
EPC1, EPC1441, EPC1213
EPF8820A
EPC1, EPC1441, EPC1213
EPF81188A
EPC1, EPC1441, EPC1213
EPF81500A
EPC1, EPC1441
EPF6010A
EPC2, EPC1, EPC1441
EPF6016, EPF6016A
EPC2, EPC1, EPC1441
EPF6024A
EPC2, EPC1, EPC1441
Kðîìå èñïîëüçîâàíèÿ ÏÇÓ ÏËÈÑ ìîæíî êîíôèãóðèðîâàòü ñ èñïîëüçîâàíèåì êîíòðîëëåðà ñèñòåìû, â êîòîðîé ïðèìåíåíà ÏËÈÑ. Â Òàáë. 1.25 ïðèâåäåíû âîçìîæíûå ðåæèìû êîíôèãóðàöèè ÏËÈÑ.
105
3 2 1 20 19
VCC VCC nCASC(1) GND
DCLK n.c. n.c. n.c. OE
4 5 6 7 8
18 17 16 15 14
n.c. DCLK n.c. n.c. n.c. n.c. OE n.c.
VCC n.c. n.c. n.c. n.c.
n.c. VCC n.c. n.c. n.c. n.c. n.c. n.c.
9 10 11 12 13 14 15 16
24 23 22 21 20 19 18 17 n.c. nC8 n.c. GND n.c. n.c. n.c. n.c.
AL1073+
nC3 GND n.c. nCASC(1) n.c.
1 2 3 4 5 6 7 8
AL1074+
8 7 6 5
9 10 11 12 13
1 2 3 4
AL1072+
DATA DCLK CE nC8
32 31 30 29 28 27 26 25
n.c. DATA n.c. VCC n.c.
n.c. DATA n.c. n.c. n.c. VCC n.c. n.c.
Ýëåìåíòíàÿ áàçà
3 2 1 20 19
32 31 30 29 28 27 26 25
TCK DATA TOO VCC TMS
TCK DATA n.c. n.c. TOO VCC n.c. TMS
Ðèñ. 1.72. Kîíôèãóðàöèîííûå ÏÇÓ, ïðîãðàììèðóåìûå ñ ïîìîùüþ ïðîãðàììàòîðà
18 17 16 15 14
n.c. DCLK VCCSEL n.c. n.c. n.c. OE n.c.
VPP n.c. n.c. n.c. VPPSEL
24 23 22 21 20 19 18 17
n.c. VPP n.c. n.c. n.c. n.c. n.c. VPPSEL
n.c. nC8 n.c. GND TDI n.c. nCASC n.c.
AL1075+
nC3 GND TD4 nCASC n.c.
9 10 11 12 13 14 15 16
1 2 3 4 5 6 7 8
AL1076+
4 5 6 7 8 9 10 11 12 13
DCLK VCCSEL n.c. n.c. OE
Ðèñ. 1.73. Kîíôèãóðàöèîííûå ÏÇÓ ÅÐÑ2, ïðîãðàììèðóåìûå ïî JTAG
VCC 10 к
VCC 10 к
VCC 10 к
DCLK
DCLK
DATA0
DATA
nSTATUS
OE
CONF_DONE nCONFIG
MSEL1
nCE
nCS nINIT_CONF (3) AL1077+
MSEL0
Ðèñ. 1.74. Kîíôèãóðàöèÿ ÏËÈÑ ñåìåéñòâ FLEX6000, FLEX10K, APEX20K ïðè ïîìîùè ÏÇÓ EPC2, EPC1, EPC1441
106
Ýëåìåíòíàÿ áàçà VCC
VCC
VCC
1к
1к
1к
DCLK
DCLK
DATA0
DATA
nSTATUS
OE
CONF_DONE nCONFIG
MSEL1
nCE
DATA nCASC
nCS OE
nCS nINIT_CONF (3)
AL1078+
MSEL0
DCLK
Ðèñ. 1.75. Kîíôèãóðàöèÿ ÏËÈÑ ñåìåéñòâ FLEX6000, FLEX10K, APEX20K ïðè ïîìîùè äâóõ ÏÇÓ EPC2, EPC1, EPC1441 VCC 1к
DCLK
MSEL0
DCLK
DATA0
MSEL1
DATA0
nSTATUS
nSTATUS
CONF_DONE
CONF_DONE
MSEL0
nCONFIG
MSEL1
nCE
VCC 1к
nCONFIG nCEO
nCE
VCC 1к
DCLK
DCLK
DATA
DATA OE
nCASC
nCS ПЗУ1
nCS OE ПЗУ2
AL1079+
nINIT_CONF (3)
Ðèñ. 1.76. Kîíôèãóðàöèÿ íåñêîëüêèõ ÏËÈÑ ñåìåéñòâ FLEX6000, FLEX10K, APEX20K ïðè ïîìîùè ÏÇÓ EPC2, EPC1, EPC1441
107
Ýëåìåíòíàÿ áàçà
VCC 1к
VCC 1к
"0"
nSIP CONF_DONE
nCS
"0"
MSEL0
nSTATUS
OE
"0"
MSEL1
DCLK
DCLK
ПЗУ DATA
DATA0 nCONFIG
AL1080+
VCC
Ðèñ. 1.77. Kîíôèãóðàöèÿ ÏËÈÑ ñåìåéñòâà FLEX8000 ïðè ïîìîùè ÏÇÓ EPC1, EPC1441, EPC1213, EPC1064
VCC 1к
VCC 1к
VCC 1к
VCC 1к
"0"
nSIP CONF_DONE
nCS
"0"
MSEL0
nSTATUS
OE
"0"
MSEL1
DCLK
nCASC
ПЗУ1
DCLK DATA
DATA0 VCC
nCONFIG
"0"
nSIP CONF_DONE
"1"
MSEL0
"0"
MSEL1
nCS
nSTATUS 1к
OE VCC
DCLK DATA0
ПЗУ2
DCLK DATA
nCONFIG "0"
nSIP CONF_DONE
"1"
MSEL0
"0"
MSEL1 DCLK
nSTATUS 1к VCC
DATA0 AL1081+
nCONFIG
Ðèñ. 1.78. Kîíôèãóðàöèÿ íåñêîëüêèõ ÏËÈÑ ñåìåéñòâà FLEX8000 ïðè ïîìîùè ÏÇÓ EPC1, EPC1213
108
Ýëåìåíòíàÿ áàçà
D(N–1) nCONFIG nSTATUS CONF_DONE (1) (4)
DCLK DATA User I/O (2)
D0
D1
D2
D3
DN
(5)
Состояние
Работа
MODE
Конфигурация
Инициализация
Работа
AL1082+
INIT_DONE (3)
Ðèñ. 1.79. Âðåìåííûå äèàãðàììû êîíôèãóðàöèè ÏËÈÑ
Òàáëèöà 1.25. Ðåæèìû êîíôèãóðàöèè ÏËÈÑ Ðåæèì êîíôèãóðàöèè
Ïðèìåíåíèå
Passive Serial (PS) Ïàññèâíûé ïîñëåäîâàòåëüíûé
Kîíôèãóðàöèÿ ïî ïîñëåäîâàòåëüíîìó ñèíõðîííîìó ïîðòó ìèêðîïðîöåññîðà (ÌÏ) èëè óñòðîéñòâó ByteBlaster, BitBlaster, MasterBlaster
Passive Parallel Synchronous (PPS) Ïàññèâíûé ïàðàëëåëüíûé ñèíõðîííûé
Kîíôèãóðàöèÿ ïî ïàðàëëåëüíîìó ñèíõðîííîìó ïîðòó ÌÏ
Passive Parallel Asynchronous (PPA) Ïàññèâíûé ïàðàëëåëüíûé àñèíõðîííûé
Kîíôèãóðàöèÿ ïî ïàðàëëåëüíîìó àñèíõðîííîìó ïîðòó ÌÏ. ÌÏ àäðåñóåò ÏËÈÑ êàê ïàìÿòü
Passive Serial Asynchronous (PSA) Ïàññèâíûé ïîñëåäîâàòåëüíûé àñèíõðîííûé
Kîíôèãóðàöèÿ ïî ïîñëåäîâàòåëüíîìó àñèíõðîííîìó ïîðòó ìèêðîïðîöåññîðà
JTAG
Èñïîëüçóåòñÿ ñòàíäàðò IEEE Std. 1149.11990
109
Ýëåìåíòíàÿ áàçà
1.11. Ïðîãðàììèðîâàíèå è ðåêîíôèãóðèðîâàíèå â ñèñòåìå Ïîíÿòèå «ïðîãðàììèðîâàíèå â ñèñòåìå» îòíîñèòñÿ ê òåì ÏËÈÑ, êîòîðûå ïîçâîëÿþò ïðîèçâåñòè ïðîãðàììèðîâàíèå íåïîñðåäñòâåííî â ñîñòàâå ñèñòåìû áåç èñïîëüçîâàíèÿ ïðîãðàììàòîðà, íà ñìîíòèðîâàííîé ïëàòå, ïðè÷åì ïðîãðàììèðîâàíèå ÏËÈÑ èëè êîíôèãóðàöèîííîãî ÏÇÓ ìîæåò ïðîèçâîäèòüñÿ ìíîãîêðàòíî. Ðåêîíôèãóðèðîâàíèå â ñõåìå (InCircuit Reconfigurability, ISR) ïîçâîëÿåò ïðîèçâåñòè ïåðåçàãðóçêó äàííûõ â ÏËÈÑ, ïîñòðîåííîé ïî SRAM òåõíîëîãèè «íà ëåòó», òî åñòü áåç âûêëþ÷åíèÿ ïèòàíèÿ ñèñòåìû è ïîñëåäóþùåé çàãðóçêè íîâîé êîíôèãóðàöèè. Ñâîéñòâà ISP è ISR õàðàêòåðíû ïðàêòè÷åñêè äëÿ âñåõ ñîâðåìåííûõ ÏËÈÑ, âûïóñêàåìûõ âåäóùèìè ôèðìàìè-ïðîèçâîäèòåëÿìè. Ðàññìîòðèì íåêîòîðûå îñîáåííîñòè àðõèòåêòóðû ÏËÈÑ, ïîçâîëÿþùèå ðåàëèçîâàòü ìåõàíèçì ISP. Kàê ïðàâèëî, ìèêðîñõåìû CPLD ñåìåéñòâ MAX7000S, A, B, E, MAX 3000A, MAX9000 ôèðìû «Altera» ïðîãðàììèðóþòñÿ â ñèñòåìå ÷åðåç ñòàíäàðòíûé ÷åòûðåõêîíòàêòíûé JTAG-èíòåðôåéñ. Ïðîãðàììíîå îáåñïå÷åíèå ñîçäàåò êîíôèãóðàöèîííóþ ïîñëåäîâàòåëüíîñòü, êîòîðàÿ çàãðóæàåòñÿ â ÏËÈÑ ñ ïîìîùüþ ñïåöèàëèçèðîâàííîãî çàãðóçî÷íîãî êàáåëÿ (ByteBlaster, BitBlaster èëè MasterBlaster äëÿ óñòðîéñòâ ôèðìû «Altera»). Kðîìå òîãî, äëÿ ïðîãðàììèðîâàíèÿ òàêèõ ÏËÈÑ ìîæíî èñïîëüçîâàòü ñòàíäàðòíûé JTAG-òåñòåð èëè ïðîñòîé èíòåðôåéñ, ýìóëèðóþùèé ïîñëåäîâàòåëüíîñòü êîìàíä JTAG.  êà÷åñòâå ïðèìåðà ðàññìîòðèì ñõåìó êîíôèãóðàöèîííîãî êàáåëÿ ByteBlaster MV, îïóáëèêîâàííóþ ôèðìîé «Altera» [3] è ïðåäíàçíà÷åííóþ äëÿ ïðîãðàììèðîâàíèÿ ÏËÈÑ ñåìåéñòâ êîíôèãóðàöèè MAX7000S, A, B, E, MAX3000A, MAX9000. Íà Ðèñ. 1.80 ïðèâåäåíà ïðèíöèïèàëüíàÿ ýëåêòðè÷åñêàÿ ñõåìà óñòðîéñòâà. Íà ñõåìå ðåçèñòîðû, ïîìå÷åííûå (1), èìåþò íîìèíàë 100 Îì (ðåàëüíî ìîæíî èñïîëüçîâàòü ðåçèñòîðû îò 50 äî 150 Îì) è ïðåäíàçíà÷åíû äëÿ çàùèòû ëèíèé ââîäà/âûâîäà. Kîíå÷íî, â ýêñòðåííûõ ñëó÷àÿõ ìîæíî îáîéòèñü áåç íèõ, íî ñëåäóåò ïîìíèòü, ÷òî «ñêóïîé ïëàòèò ÷åòûðåæäû», è íå ýêîíîìèòü íà ñïè÷êàõ (ìåíÿòü ïîâðåæäåííóþ ÏËÈÑ îáîéäåòñÿ äîðîæå). Ïîäòÿãèâàþùèå ðåçèñòîðû (pull-up resistors), îáîçíà÷åííûå (2), èìåþò íîìèíàë 2.2 êÎì (ÿñíî, ÷òî íà äåëå îò 1 äî 3.3 êÎì).  êà÷åñòâå øèííîãî ôîðìèðîâàòåëÿ æåëàòåëüíî èìåòü ìèêðîñõåìó 74ÍÑ244 (ðîñ-
110
Ýëåìåíòíàÿ áàçà
VCC
Разъем ByteBlaster 10 контактов
(2)
VCC 4
VCC
7
(2)
3
25Gконтактный разъем LPTGпорта
74HC244
14
(1)
9
(1)
GND
VCC VCC VCC (2) 2
(1)
3
(1)
8
(1)
7
(2)
(2) GND
VCC
1G
VCC
2G
GND
1A1
1Y1
1A2
1Y2
1A3
1Y3
1A4
1Y4
2A1
2Y1
2A2
2Y2
2A3
2Y3
2A4
2Y4
GND
(1)
1
(1)
5
(1)
9
GND 2, 10
10
13
(1)
11
(1)
12
(1)
GND
VCC (2) 15
AL1083+
18G25 GND
Ðèñ. 1.80. Ïðèíöèïèàëüíàÿ ñõåìà çàãðóçî÷íîãî êàáåëÿ ByteBlaster MV
ñèéñêèé èëè áåëîðóññêèé àíàëîã 1564ÀÏ5), õîòÿ ó àâòîðà îäèí èç ByteBlasterMV áûë ñîáðàí íà ìèêðîñõåìå ñåðèè 74ÀÑ (ïðîñòî ïîä ðóêîé äðóãîãî íå îêàçàëîñü) è óñïåøíî ðàáîòàåò. Åñëè âû ðàáîòàåòå òîëüêî ñ 5âîëüòîâûìè ÏËÈÑ, òî ïîéäóò è ñåðèè 1533, è 555 (74ALS è 74LS), íî òîãäà ãàðàíòèé óñïåøíîãî ïðîãðàììèðîâàíèÿ íèêòî íå äàñò. Âîîáùå ãîâîðÿ, íàâåðíîå, íå ñëåäóåò çàíèìàòüñÿ èçîáðåòåíèåì âåëîñèïåäà, áëàãî, øòàòíàÿ ñõåìà íå ñîäåðæèò äåôèöèòíûõ êîìïîíåíòîâ, åå ñåáåñòîèìîñòü
111
Ýëåìåíòíàÿ áàçà ïîðÿäêà 1.5
2 äîëëàðîâ. Ñëåäóåò ïîìíèòü, ÷òî äëèíà êàáåëÿ îò ïàðàëëåëüíîãî ïîðòà äî ByteBlasterMV íå äîëæíà ïðåâûøàòü 100
120 ñì (õîòÿ â ñòàíäàðòíîì óñòðîéñòâå, ïîñòàâëÿåìîì ôèðìîé «Altera», ñõåìà ñìîíòèðîâàíà íåïîñðåäñòâåííî â êîðïóñå ðàçúåìà, íî ýòî íåóäîáíî â ðàáîòå), äëèíó êàáåëÿ îò ByteBlasterMV äî ïëàòû ñ óñòàíîâëåííîé ÏËÈÑ íå ñòîèò äåëàòü áîëüøå 25 ñì. Íà Ðèñ. 1.81 ïðèâåäåíà ðàñïàéêà ðàçúåìà óñòðîéñòâà ByteBlasterMV. Íà Ðèñ. 1.81 âñå ðàçìåðû ïðèâåäåíû â äþéìàõ. Îáû÷íî èñïîëüçóþò ñòàíäàðòíûé ðàçúåì íà 10-æèëüíûé ëåíòî÷íûé êàáåëü ïîä îáæèì. Íàçíà÷åíèå êîíòàêòîâ ðàçúåìà êàáåëÿ ByteBlasterMV â ðàçëè÷íûõ ðåæèìàõ ïðèâåäåíî â Òàáë. 1.26. Òàáëèöà 1. 26. Íàçíà÷åíèå êîíòàêòîâ ðàçúåìà êàáåëÿ ByteBlasterMV Kîíòàêò ðàçúåìà ByteBlaster
Ðåæèì ïîñëåäîâàòåëüíîé ïàññèâíîé êîíôèãóðàöèè (PS Mode)
Ðåæèì ïðîãðàììèðîâàíèÿ ïî ïîðòó JTAG (JTAG mode)
Ñèãíàë
Íàçíà÷åíèå
Ñèãíàë
Íàçíà÷åíèå
1
DCLK
Òàêòîâûé ñèãíàë
TCK
Òàêòîâûé ñèãíàë
2
GND
Ñèãíàëüíàÿ çåìëÿ
GND
Ñèãíàëüíàÿ çåìëÿ
3
CONF_DONE
Kîíòðîëü çàâåðøåíèÿ êîíôèãóðàöèè
TDO
Äàííûå ñ ÏËÈÑ
4
VCC
Íàïðÿæåíèå ïèòàíèÿ
VCC
5
nCONFIG
Kîíòðîëü êîôèãóðàöèè
TMS
6
Íå ïîäêëþ÷åí
Íå ïîäêëþ÷åí
7
nSTATUS
Ñîñòîÿíèå êîíôèãóðàöèè
Íå ïîäêëþ÷åí
8
Íå ïîäêëþ÷åí
Íå ïîäêëþ÷åí
9
DATA0
Äàííûå â ÏËÈÑ
TDI
Äàííûå â ÏËÈÑ
10
GND
Ñèãíàëüíàÿ çåìëÿ
GND
Ñèãíàëüíàÿ çåìëÿ
Íàïðÿæåíèå ïèòàíèÿ Kîíòðîëü àâòîìàòà JTAG
Ðåæèì ïîñëåäîâàòåëüíîé ïàññèâíîé êîíôèãóðàöèè (PS Mode) ïðèìåíÿåòñÿ äëÿ çàãðóçêè êîíôèãóðàöèè ÏËÈÑ, âûïîëíåííûõ ïî òåõíîëîãèè SRAM, òàêèõ ñåìåéñòâ, êàê FLEX6000, 8000, 10K, APEX, ACEX. Ðåæèì ïðîãðàììèðîâàíèÿ ïî ïîðòó JTAG (JTAG mode) ïðèìåíÿåòñÿ äëÿ ïðî-
112
Ýëåìåíòíàÿ áàçà
0.425 Тур.
Метка первого провода в жгуте
1
3
5
7
9
2
4
6
8
10
0.250 Тур.
0.025 Sq.
AL1084+
0.100 Sq.
0.700 Тур.
Ðèñ. 1.81. Ðàçúåì êàáåëÿ ByteBlasterMV
VCC 1к
VCC
VCC VCC
1к
FLEX 10K, FLEX 10KA Device MSEL1 MSEL0 nCE
1к
1к
CONF_DONE nSTATUS
GND Разъем IDC10M
DCLK DATA nCONFIG
VCC
Вывод [1]
GND
AL1085+
GND
Ðèñ. 1.82. Âêëþ÷åíèå ÏËÈÑ ñåìåéñòâà FLEX10K â ðåæèìå ïîñëåäîâàòåëüíîé ïàññèâíîé êîíôèãóðàöèè ñ ïîìîùüþ êàáåëÿ ByteBlasterMV
113
Ýëåìåíòíàÿ áàçà VCC 1к VCC 1к VCC 1к TCK TDO
VCC 1к
Разъем IDC10M VCC
Вывод [1]
TMS TDI
GND
AL1086+
GND
Ðèñ. 1.83. Âêëþ÷åíèå ÏËÈÑ ñåìåéñòâ ÌÀÕ3000, 7000, 9000 â ðåæèìå ïðîãðàììèðîâàíèÿ ÷åðåç èíòåðôåéñ JTAG
ãðàììèðîâàíèÿ â ñèñòåìå ÏËÈÑ CPLD, à òàêæå êîíôèãóðàöèîííûõ ÏÇÓ ÅÐÑ2 è ãîòîâÿùèõñÿ ê âûïóñêó ÅÐÑ4, äëÿ çàãðóçêè SRAM óñòðîéñòâ (ïðàâäà, ðåæå, ÷åì PS Mode). Ïðè ðàáîòå ñ óñòðîéñòâîì íåîáõîäèìî ïîìíèòü, ÷òî âñå êîììóòàöèè è ïîäêëþ÷åíèå êàáåëÿ ñëåäóåò ïðîâîäèòü ïðè âûêëþ÷åííîì ïèòàíèè. Ïèòàíèå óñòðîéñòâà îñóùåñòâëÿåòñÿ îò èñòî÷íèêà ïèòàíèÿ ñèñòåìû, â êîòîðóþ óñòàíîâëåíà ÏËÈÑ. Åñòåñòâåííî, ÷òî çåìëÿ äîëæíà áûòü îáùåé. Íà Ðèñ. 1.82 è 1.83 ïðèâåäåíû ïðèìåðû âêëþ÷åíèÿ ÏËÈÑ äëÿ êîíôèãóðàöèè ÏËÈÑ è ïðîãðàììèðîâàíèÿ.
114
Ãëàâà 2.
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
2.1. Îáùèå ñâåäåíèÿ Äî ïîñëåäíåãî âðåìåíè MAX+PLUS II ÿâëÿëñÿ åäèíñòâåííîé ñèñòåìîé ïðîåêòèðîâàíèÿ óñòðîéñòâ íà ÏËÈÑ ôèðìû «Altera». Òîëüêî â 1999 ãîäó ïîÿâèëàñü ñèñòåìà ïðîåêòèðîâàíèÿ íîâîãî ïîêîëåíèÿ Quartus, ïðåäíàçíà÷åííàÿ äëÿ ñîçäàíèÿ óñòðîéñòâ íà ÏËÈÑ ñåìåéñòâà APEX20K. Ïðîãðàììíîå îáåñïå÷åíèå (ÏÎ) ñèñòåìû MAX+PLUS II, ïðåäñòàâëÿþùåå ñîáîé åäèíîå öåëîå, îáåñïå÷èâàåò ïîëüçîâàòåëþ óïðàâëåíèå ñðåäîé ëîãè÷åñêîãî ïðîåêòèðîâàíèÿ è ïîìîãàåò äîñòè÷ü ìàêñèìàëüíîé ýôôåêòèâíîñòè è ïðîèçâîäèòåëüíîñòè. Âñå ïàêåòû ðàáîòàþò êàê íà ïëàòôîðìå IBM PC, òàê è íà ïëàòôîðìàõ SUN, IBM RISC/6000 è HP9000.  äàëüíåéøåì ìû áóäåì ðàññìàòðèâàòü ðàáîòó íà ïëàòôîðìå IBM PC. Äëÿ íîðìàëüíîé èíñòàëëÿöèè è ðàáîòû ÑÀÏÐ MAX+PLUS II (âåðñèÿ 9.4 âûøëà â äåêàáðå 1999 ãîäà) íåîáõîäèìà IBM PC, ñîâìåñòèìàÿ ÝÂÌ ñ ïðîöåññîðîì íå õóæå Pentium, îáúåìîì ÎÇÓ íå ìåíüøå 16 Ìáèò è ñâîáîäíûì ìåñòîì íà æåñòêîì äèñêå ïîðÿäêà 150
400 Ìáèò â çàâèñèìîñòè îò êîíôèãóðàöèè ñèñòåìû. Èç ñîáñòâåííîãî îïûòà ìîæåì ñêàçàòü, ÷òî äëÿ ðàçðàáîòêè áîëüøèõ êðèñòàëëîâ íà ÏËÈÑ ñåìåéñòâà FLEX10K50 è âûøå æåëàòåëüíî èìåòü íå ìåíåå 64 Ìáèò ÎÇÓ (ëó÷øå 128, åùå ëó÷øå 256, ñîâñåì õîðîøî 384 Ìáèò è âûøå) è ïðîöåññîð Pentium II (Ð-3 ðåàëüíî íå äàåò îñîáîãî âûèãðûøà). Kîíå÷íî, ìîæíî èñïîëüçîâàòü è áîëåå ñëàáûå ìàøèíû, íî òîãäà âîçðàñòàåò âðåìÿ êîìïèëÿöèè è óâåëè÷èâàåòñÿ íàãðóçêà íà æåñòêèé äèñê èç-çà ñâîïèíãà. Óâåëè÷åíèå îáúåìà îïåðàòèâíîé ïàìÿòè è êýøà äàåò ëó÷øèå ðåçóëüòàòû ïî ñðàâíåíèþ ñ óâåëè÷åíèåì òàêòîâîé ÷àñòîòû ïðîöåññîðà. Åñëè íå ïðåäïîëàãàåòñÿ òðàññèðîâêà áîëüøèõ êðèñòàëëîâ, òî âïîëíå õâàòàåò 32 Ìáèò ÎÇÓ ïðè õîðîøåé ñêîðîñòè êîìïèëÿöèè ïðîåêòà. ×òî êà-
115
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II ñàåòñÿ âûáîðà îïåðàöèîííîé ñèñòåìû, òî, áåç ñîìíåíèÿ, ëó÷øå èñïîëüçîâàòü Windows NT, õóæå Windows 95 OSR2, ïëîõî Windows 98, îñîáåííî ëîêàëèçîâàííóþ âåðñèþ. Î÷åâèäíî, ýòî ñâÿçàíî ñ òåì, ÷òî èçíà÷àëüíî ïàêåò áûë ðàçðàáîòàí ïîä Unix è íå ïîëíîñòüþ èñïîëüçóåò âñå ìåõàíèçìû Windows. Îñîáåííî ýòî çàìåòíî ïðè âðåìåííîì ìîäåëèðîâàíèè ñëîæíûõ óñòðîéñòâ ÖÎÑ, êîãäà ïåðåðèñîâêà ýêðàíà çàíèìàåò îñíîâíîå âðåìÿ. Ïîñêîëüêó ïàêåò íå ëîêàëèçîâàí, òî ëó÷øå èñïîëüçîâàòü íå ëîêàëèçîâàííûå (àìåðèêàíñêóþ èëè ïàíåâðîïåéñêóþ) âåðñèè Windows. Âî âðåìÿ èíñòàëëÿöèè ñèñòåìû MAX+PLUS II ñîçäàþòñÿ äâà êàòàëîãà: \maxplus2 è \max2work. Kàòàëîã \maxplus2 ñîäåðæèò ñèñòåìíîå ÏÎ è ôàéëû äàííûõ è ðàçáèò íà ïîäêàòàëîãè, ïåðå÷èñëåííûå â Òàáë. 2.1. Òàáëèöà 2.1. Ñòðóêòóðà ñèñòåìíîãî êàòàëîãà \maxplus2 ñèñòåìû MAX+PLUS II Ïîäêàòàëîã .\drivers .\edc .\lmf
.\max2inc
.\max2lib\edif .\max2lib\mega_lpm .\max2lib\mf .\max2lib\prim .\vhdlnn\Altera .\vhdlnn\ieee .\vhdlnn\std
Îïèñàíèå Ñîäåðæèò äðàéâåðû óñòðîéñòâ äëÿ cðåäû Windows NT (òîëüêî äëÿ èíñòàëëÿöèè íà ïëàòôîðìå PC â ñðåäå Windows NT) Ñîäåðæèò ïîñòàâëÿåìûå ôèðìîé «Altera» êîìàíäíûå ôàéëû (.edc), êîòîðûå ãåíåðèðóþò âûõîäíûå ôàéëû (.edo) ïî çàêàçó ïîëüçîâàòåëÿ äëÿ çàäàííûõ óñëîâèé òåñòèðîâàíèÿ Ñîäåðæèò ïîñòàâëÿåìûå ôèðìîé «Altera» ôàéëû ìàêðîáèáëèîòåê (.lmf), êîòîðûå óñòàíàâëèâàþò ñîîòâåòñòâèå ìåæäó ëîãè÷åñêèìè ôóíêöèÿìè ïîëüçîâàòåëÿ è ýêâèâàëåíòíûìè ëîãè÷åñêèìè ôóíêöèÿìè MAX+PLUS II Ñîäåðæèò Include-ôàéëû (ôàéëû «çàãîëîâêîâ») ñ ïðîòîòèïàìè ôóíêöèé äëÿ ðàçðàáîòàííûõ ôèðìîé «Altera» ìàêðîôóíêöèé.  ïðîòîòèïàõ ôóíêöèé ïåðå÷èñëÿþòñÿ ïîðòû (âûâîäû) äëÿ ìàêðîôóíêöèé, ðåàëèçîâàííûõ â òåêñòîâûõ ôàéëàõ ïðîåêòà (.tdf), íàïèñàííûõ íà ÿçûêå AHDL Ñîäåðæèò ïðèìèòèâû è ìàêðîôóíêöèè, èñïîëüçóåìûå äëÿ ïîëüçîâàòåëüñêèõ èíòåðôåéñîâ EDIF Ñîäåðæèò ìåãàôóíêöèè, â òîì ÷èñëå áèáëèîòåêó ôóíêöèé ïàðàìåòðèçîâàííûõ ìîäóëåé (LPM) è Include-ôàéëû äëÿ íèõ ñ ñîîòâåòñòâóþùèìè ïðîòîòèïàìè íà ÿçûêå AHDL Ñîäåðæèò ìàêðîôóíêöèè ïîëüçîâàòåëüñêèå è óñòàðåâøèå (74-series) Ñîäåðæèò ïîñòàâëÿåìûå ôèðìîé «Altera» ïðèìèòèâû Ñîäåðæèò áèáëèîòåêó ôèðìû «Altera» ñ ïðîãðàììíûì ïàêåòîì maxplus2.  ýòîò ïàêåò âõîäÿò âñå ïðèìèòèâû, ìåãàôóíêöèè è ìàêðîôóíêöèè ñèñòåìû MAX+PLUS II, ïîääåðæèâàåìûå ÿçûêîì VHDL Ñîäåðæèò áèáëèîòåêó ieee ïàêåòîâ VHDL, â òîì ÷èñëå std_logic_1164, std_logic_arith, std_logic_signed è std_logic_unsigned Ñîäåðæèò áèáëèîòåêó std ñ ïàêåòàìè ñòàíäàðòîâ è ñðåäñòâ ââîäà/âûâîäà òåêñòà, îïèñàííûõ â ñïðàâî÷íèêå ïî ñòàíäàðòàì èíñòèòóòà IEEE íà ÿçûêå VHDL IEEE Standard VHDL Language Reference Manual
116
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Òàáëèöà 2.2. Ñòðóêòóðà ðàáî÷åãî êàòàëîãà \max2work ñèñòåìû MAX+PLUS II Ïîäêàòàëîã
Îïèñàíèå
.\ahdl
Ñîäåðæèò ôàéëû ïðèìåðîâ, èëëþñòðèðóþùèõ òåìó «Kàê èñïîëüçîâàòü ÿçûê AHDL» (How to use AHDL) â ýëåêòðîííîì ñïðàâî÷íèêå (MAX+PLUS II Help) è â ðóêîâîäñòâå MAX+PLUS II AHDL
.\chiptrip
Ñîäåðæèò âñå ôàéëû îáó÷àþùåãî ïðîåêòà chiptrip, îïèñàííîãî â ðóêîâîäñòâå MAX+PLUS II AHDL
.\edif
Ñîäåðæèò âñå ôàéëû ïðèìåðîâ, èëëþñòðèðóþùèõ îñîáåííîñòè EDIF â ýëåêòðîííîì ñïðàâî÷íèêå (MAX+PLUS II Help)
.\tutorial
Ñîäåðæèò èíôîðìàöèîííûé ôàéë read.me îáó÷àþùåãî ïðîåêòà chiptrip. Âñå ôàéëû, ñîçäàþùèåñÿ â ïðîåêòå chiptrip, äîëæíû íàõîäèòüñÿ â ýòîì ïîäêàòàëîãå
.\vhdl
Ñîäåðæèò ôàéëû ïðèìåðîâ, èëëþñòðèðóþùèõ òåìó «Kàê èñïîëüçîâàòü ÿçûê VHDL» (How to use VHDL) â ýëåêòðîííîì ñïðàâî÷íèêå (MAX+PLUS II Help) è â ðóêîâîäñòâå MAX+PLUS II VHDL
.\verilog
Ñîäåðæèò ôàéëû ïðèìåðîâ, èëëþñòðèðóþùèõ òåìó «Kàê èñïîëüçîâàòü ÿçûê âåðèôèêàöèîííîãî ïðîòîêîëà Verilog HDL» (How to use Verilog HDL) â ýëåêòðîííîì ñïðàâî÷íèêå (MAX+PLUS II Help) è â ðóêîâîäñòâå MAX+PLUS II Verilog HDL
Kàòàëîã \max2work ñîäåðæèò ôàéëû îáó÷àþùåé ïðîãðàììû è ïðèìåðû è ðàçäåëÿåòñÿ íà ïîäêàòàëîãè, îïèñàííûå â Òàáë. 2.2. Íàçâàíèå ñèñòåìû MAX+PLUS II ÿâëÿåòñÿ àááðåâèàòóðîé îò Multiple Array MatriX Programmable Logic User System (Ïîëüçîâàòåëüñêàÿ Ñèñòåìà Ïðîãðàììèðîâàíèÿ Ëîãèêè Óïîðÿäî÷åííûõ Ñòðóêòóð). Ñèñòåìà MAX+PLUS II ðàçðàáîòàíà ôèðìîé «Altera» è îáåñïå÷èâàåò ìíîãîïëàòôîðìåííóþ àðõèòåêòóðíî-íåçàâèñèìóþ ñðåäó ñîçäàíèÿ äèçàéíà, ëåãêî ïðèñïîñàáëèâàåìóþ äëÿ êîíêðåòíûõ òðåáîâàíèé ïîëüçîâàòåëÿ. Ñèñòåìà MAX+PLUS II èìååò ñðåäñòâà óäîáíîãî ââîäà äèçàéíà, áûñòðîãî ïðîãîíà è íåïîñðåäñòâåííîãî ïðîãðàììèðîâàíèÿ óñòðîéñòâ. Ïðåäñòàâëåííûé íà Ðèñ. 2.1 ñîñòàâ ÏÎ ñèñòåìû MAX+PLUS II ÿâëÿåòñÿ ïîëíûì êîìïëåêòîì, îáåñïå÷èâàþùèì ñîçäàíèå ëîãè÷åñêèõ äèçàéíîâ äëÿ óñòðîéñòâ ôèðìû «Altera» ñ ïðîãðàììèðóåìîé ëîãèêîé, â òîì ÷èñëå ñåìåéñòâà óñòðîéñòâ Classic, MAX5000, MAX7000, MAX9000, FLEX6000, FLEX8000 è FLEX10K. Èíôîðìàöèÿ î äðóãèõ ïîääåðæèâàåìûõ ñåìåéñòâàõ óñòðîéñòâ ôèðìû «Altera» ïðèâåäåíà â ôàéëå read.me â ñèñòåìå MAX+PLUS II.
117
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Компиляция Ввод проекта MAX+PLUS II Graphic Editor MAX+PLUS II Symbol Editor MAX+PLUS II Text Editor MAX+PLUS II Waveform Editor MAX+PLUS II Floorplan Editor AHDL VHDL Verilog HDL
Программирование ПЛИС MAX+PLUS II Programmer Data I/O
AL2087+
Верификация проекта MAX+PLUS II Simulator MAX+PLUS II Waveform Editor MAX+PLUS II Timing Analyzer
Ðèñ. 2.1. Ñðåäà ïðîåêòèðîâàíèÿ â ñèñòåìå MAX+PLUS II
Ñèñòåìà MAX+PLUS II ïðåäëàãàåò ïîëíûé ñïåêòð âîçìîæíîñòåé ëîãè÷åñêîãî äèçàéíà: ðàçíîîáðàçíûå ñðåäñòâà îïèñàíèÿ ïðîåêòà äëÿ ñîçäàíèÿ ïðîåêòîâ ñ èåðàðõè÷åñêîé ñòðóêòóðîé, ìîùíûé ëîãè÷åñêèé ñèíòåç, êîìïèëÿöèÿ ñ çàäàííûìè âðåìåííûìè ïàðàìåòðàìè, ðàçäåëåíèå íà ÷àñòè, ôóíêöèîíàëüíîå è âðåìåííîå òåñòèðîâàíèå (ñèìóëÿöèÿ), òåñòèðîâàíèå íåñêîëüêèõ ñâÿçàííûõ óñòðîéñòâ, àíàëèç âðåìåííûõ ïàðàìåòðîâ ñèñòåìû, àâòîìàòè÷åñêàÿ ëîêàëèçàöèÿ îøèáîê, à òàêæå ïðîãðàììèðîâàíèå è âåðèôèêàöèÿ óñòðîéñòâ.  ñèñòåìå MAX+PLUS II ìîæíî êàê ÷èòàòü, òàê è çàïèñûâàòü ôàéëû íà ÿçûêå AHDL è ôàéëû òðàññèðîâêè â ôîðìàòå EDIF, ôàéëû íà ÿçûêàõ îïèñàíèÿ àïïàðàòóðû Verilog HDL è VHDL, à òàêæå ñõåìíûå ôàéëû OrCAD. Kðîìå òîãî, ñèñòåìà MAX+PLUS II ÷èòàåò ôàéëû òðàññèðîâêè, ñîçäàííûå ñ ïîìîùüþ ÏÎ ôèðìû «Xilinx», è çàïèñûâàåò ôàéëû çàäåðæåê â ôîðìàòå SDF äëÿ óäîáñòâà âçàèìîäåéñòâèÿ ñ ïàêåòàìè, ðàáîòàþùèìè ñ äðóãèìè ïðîìûøëåííûìè ñòàíäàðòàìè. Ñèñòåìà MAX+PLUS II ïðåäëàãàåò ïîëüçîâàòåëþ áîãàòûé ãðàôè÷åñêèé èíòåðôåéñ, äîïîëíåííûé èëëþñòðèðîâàííîé îïåðàòèâíîé ñïðàâî÷íîé ñèñòåìîé.  ïîëíóþ ñèñòåìó MAX+PLUS II âõîäÿò 11 ïîëíîñòüþ âíåäðåííûõ â ñèñòåìó ïðèëîæåíèé (Ðèñ. 2.2). Ëîãè÷åñêèé äèçàéí (Design), âêëþ÷àÿ âñå ïîääèçàéíû (Subdesign), íàçûâàåòñÿ â ñèñòåìå MAX+PLUS II ïðîåêòîì (Project). Âîçìîæíî îïèñàíèå ïðîåêòà (Design Entry) â âèäå ôàéëà íà ÿçûêå îïèñàíèÿ àïïàðàòóðû, ñîçäàííîãî ëèáî âî âíåøíåì ðåäàêòîðå, ëèáî â òåêñòîâîì ðåäàêòîðå MAX+PLUS II (Text Editor), â âèäå ýëåêòðè÷åñêîé
118
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ввод проекта
Ввод проекта MAX+PLUS II Compiler
MAX+PLUS II Text Editor
MAX+PLUS II Graphic Editor
Compiler Netlist Extractor
Database Builder
Logic Synthesizer
MAX+PLUS II Waveform Editor
MAX+PLUS II Symbol Editor
Functional, Timing or Linked SNF Extractor
Partitioner
Filter
EDIF, VHDL & Verilog Netlist Writers
Design Doctor
Assembler
MAX+PLUS II Floorplan Editor
Верификация
MAX+PLUS II Message Processor & Hierarchy Display
MAX+PLUS II Simulator
MAX+PLUS II Programmer MAX+PLUS II Waveform Editor
AL2088+
MAX+PLUS II Timing Analyzer
Программирование
Ðèñ. 2.2. Ïðèëîæåíèÿ â ñèñòåìå MAX+PLUS II
ïðèíöèïèàëüíîé ñõåìû ñ ïîìîùüþ ãðàôè÷åñêîãî ðåäàêòîðà Graphic Editor, â âèäå âðåìåííîé äèàãðàììû, ñîçäàííîé â ñèãíàëüíîì ðåäàêòîðå Waveform Editor. Äëÿ óäîáñòâà ðàáîòû ñî ñëîæíûìè èåðàðõè÷åñêèìè ïðîåêòàìè êàæäîìó ïîääèçàéíó ñîîòâåòñòâóåò ñèìâîë, ðåäàêòèðîâàíèå êîòîðîãî ïðîèçâîäèòñÿ ñ ïîìîùüþ ãðàôè÷åñêîãî ðåäàêòîðà Symbol Editor. Ðàçìåùåíèå óçëîâ ïî ËÁ è âûâîäàì ÏËÈÑ âûïîëíÿþò ñ ïîìîùüþ ïîóðîâíåâîãî ïëàíèðîâùèêà Floorplan Editor. Âåðèôèêàöèÿ ïðîåêòà (Project Verification) âûïîëíÿåòñÿ ñ ïîìîùüþ ñèìóëÿòîðà (Simulator), ðåçóëüòàòû ðàáîòû êîòîðîãî óäîáíî ïðîñìîòðåòü â ñèãíàëüíîì ðåäàêòîðå Waveform Editor, â íåì æå ñîçäàþòñÿ òåñòîâûå âîçäåéñòâèÿ. Kîìïèëÿöèÿ ïðîåêòà, âêëþ÷àÿ èçâëå÷åíèå ñïèñêà ñîåäèíåíèé (Netlist Extractor), ïîñòðîåíèå áàçû äàííûõ ïðîåêòà (Data Base Builder), ëîãè÷åñêèé ñèíòåç (logic synthesis), èçâëå÷åíèå âðåìåííûõ, ôóíêöèîíàëüíûõ ïàðàìåòðîâ ïðîåêòà (SNF Extractor), ðàçáèåíèå íà ÷àñòè (Partioner), òðàññèðîâêà (Fitter) è ôîðìèðîâàíèå ôàéëà ïðîãðàììèðîâàíèÿ èëè çàãðóçêè (Assembler) âûïîëíÿþòñÿ ñ ïîìîùüþ êîìïèëÿòîðà ñèñòåìû (Compiler).
119
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Íåïîñðåäñòâåííî ïðîãðàììèðîâàíèå èëè çàãðóçêà êîíôèãóðàöèè óñòðîéñòâ ñ èñïîëüçîâàíèåì ñîîòâåòñòâóþùåãî àïïàðàòíîãî îáåñïå÷åíèÿ âûïîëíÿþòñÿ ñ èñïîëüçîâàíèåì ìîäóëÿ ïðîãðàììàòîðà (Programmer). Ìíîãèå õàðàêòåðíûå ÷åðòû è êîìàíäû, òàêèå êàê îòêðûòèå ôàéëîâ, ââîä íàçíà÷åíèé óñòðîéñòâ, âûâîäîâ è ëîãè÷åñêèõ ýëåìåíòîâ, êîìïèëÿöèÿ òåêóùåãî ïðîåêòà, ïîõîæè äëÿ ìíîãèõ ïðèëîæåíèé ñèñòåìû MAX+PLUS II. Ðåäàêòîðû äëÿ ðàçðàáîòêè ïðîåêòà (ãðàôè÷åñêèé, òåêñòîâîé è ñèãíàëüíûé) èìåþò ìíîãî îáùåãî ñî âñïîìîãàòåëüíûìè ðåäàêòîðàìè (ïîóðîâíåâîãî ïëàíèðîâàíèÿ è ñèìâîëüíûìè). Kàæäûé ðåäàêòîð ðàçðàáîòêè ïðîåêòà ïîçâîëÿåò âûïîëíÿòü ïîõîæèå çàäà÷è (íàïðèìåð ïîèñê ñèãíàëà èëè ñèìâîëà) ñõîæèì ñïîñîáîì. Ìîæíî ëåãêî êîìáèíèðîâàòü ðàçíûå òèïû ôàéëîâ â èåðàðõè÷åñêîì ïðîåêòå, âûáèðàÿ äëÿ êàæäîãî ôóíêöèîíàëüíîãî áëîêà òîò ôîðìàò îïèñàíèÿ, êîòîðûé áîëüøå ïîäõîäèò. Ïîñòàâëÿåìàÿ ôèðìîé «Altera» áîëüøàÿ áèáëèîòåêà ìåãà- è ìàêðîôóíêöèé, â òîì ÷èñëå ôóíêöèé èç áèáëèîòåêè ïàðàìåòðèçîâàííûõ ìîäåëåé (LPM), îáåñïå÷èâàåò øèðîêèå âîçìîæíîñòè ââîäà äèçàéíà. Ìîæíî îäíîâðåìåííî ðàáîòàòü ñ ðàçíûìè ïðèëîæåíèÿìè ñèñòåìû MAX+PLUS II. Íàïðèìåð ìîæíî îòêðûòü íåñêîëüêî ôàéëîâ ïðîåêòà è ïåðåíîñèòü èíôîðìàöèþ èç îäíîãî â äðóãîé â ïðîöåññå êîìïèëÿöèè èëè òåñòèðîâàíèÿ äðóãîãî ïðîåêòà. Èëè, íàïðèìåð, ïðîñìàòðèâàòü âñå äåðåâî ïðîåêòà è â îêíå ïðîñìîòðà ïåðåìåùàòüñÿ ñ îäíîãî óðîâíÿ íà äðóãîé, à â îêíå ðåäàêòîðà áóäåò ïîÿâëÿòüñÿ âûáðàííûé âàìè ôàéë, ïðè÷åì âûçûâàåòñÿ àâòîìàòè÷åñêè ñîîòâåòñòâóþùèé ðåäàêòîð äëÿ êàæäîãî ôàéëà (Ðèñ. 2.3). Îñíîâîé ñèñòåìû MAX+PLUS II ÿâëÿåòñÿ êîìïèëÿòîð, îáåñïå÷èâàþùèé ìîùíûå ñðåäñòâà îáðàáîòêè ïðîåêòà, ïðè ýòîì ìîæíî çàäàâàòü íóæíûå ðåæèìû ðàáîòû êîìïèëÿòîðà. Àâòîìàòè÷åñêàÿ ëîêàëèçàöèÿ îøèáêè, âûäà÷à ñîîáùåíèÿ è îáøèðíàÿ äîêóìåíòàöèÿ îá îøèáêàõ óñêîðÿþò è îáëåã÷àþò ïðîâåäåíèå èçìåíåíèé â äèçàéíå. Ìîæíî ñîçäàâàòü âûõîäíûå ôàéëû â ðàçíûõ ôîðìàòàõ äëÿ ðàçíûõ öåëåé, òàêèõ êàê ðàáîòà ôóíêöèé, ñâÿçü íåñêîëüêèõ óñòðîéñòâ, àíàëèç âðåìåííûõ ïàðàìåòðîâ, ïðîãðàììèðîâàíèå óñòðîéñòâà.
120
AL2089
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.3. Èåðàðõè÷åñêèé ïðîñìîòð ïðîåêòà
2.2. Ïðîöåäóðà ðàçðàáîòêè ïðîåêòà Ïðîöåäóðó ðàçðàáîòêè íîâîãî ïðîåêòà îò êîíöåïöèè äî çàâåðøåíèÿ ìîæíî óïðîùåííî ïðåäñòàâèòü ñëåäóþùèì îáðàçîì: ñîçäàíèå íîâîãî ôàéëà (design file) ïðîåêòà èëè èåðàðõè÷åñêîé ñòðóêòóðû íåñêîëüêèõ ôàéëîâ ïðîåêòà ñ èñïîëüçîâàíèåì ðàçëè÷íûõ ðåäàêòîðîâ ðàçðàáîòêè ïðîåêòà â ñèñòåìå MAX+PLUS II, ò.å. ãðàôè÷åñêîãî, òåêñòîâîãî è ñèãíàëüíîãî ðåäàêòîðîâ; çàäàíèå èìåíè ôàéëà ïðîåêòà âåðõíåãî óðîâíÿ (Top of Hierarchy) â êà÷åñòâå èìåíè ïðîåêòà (project name); íàçíà÷åíèå ñåìåéñòâà ÏËÈÑ äëÿ ðåàëèçàöèè ïðîåêòà. Ïîëüçîâàòåëü ìîæåò ñàì íàçíà÷èòü êîíêðåòíîå óñòðîéñòâî èëè ïðåäîñòàâèòü ýòî êîìïèëÿòîðó äëÿ òîãî, ÷òîáû îöåíèòü òðåáóåìûå ðåñóðñû; îòêðûòèå îêíà êîìïèëÿòîðà è åãî çàïóñê íàæàòèåì êíîïêè Start äëÿ íà÷àëà êîìïèëÿöèè ïðîåêòà. Ïî æåëàíèþ ïîëüçîâàòåëÿ ìîæíî ïîäêëþ÷èòü
121
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II ìîäóëü èçâëå÷åíèÿ âðåìåííûõ çàäåðæåê Timing SNF Extractor äëÿ ñîçäàíèÿ ôàéëà ðàçâîäêè, èñïîëüçóåìîãî ïðè òåñòèðîâàíèè âðåìåííûõ ïàðàìåòðîâ è àíàëèçå âðåìåííûõ ïàðàìåòðîâ; â ñëó÷àå óñïåøíîé êîìïèëÿöèè âîçìîæíî òåñòèðîâàíèå è âðåìåííîé àíàëèç, äëÿ ïðîâåäåíèÿ êîòîðîãî íåîáõîäèìî âûïîëíèòü ñëåäóþùèå äåéñòâèÿ: • äëÿ ïðîâåäåíèÿ âðåìåííîãî àíàëèçà îòêðûòü îêíî Timing Analyzer, âûáðàòü ðåæèì àíàëèçà è íàæàòü êíîïêó Start; • äëÿ ïðîâåäåíèÿ òåñòèðîâàíèÿ íóæíî ñíà÷àëà ñîçäàòü òåñòîâûé âåêòîð â ôàéëå êàíàëà òåñòèðîâàíèÿ (.scf), ïîëüçóÿñü ñèãíàëüíûì ðåäàêòîðîì, èëè â ôàéëå âåêòîðà (.vec), ïîëüçóÿñü òåêñòîâûì ðåäàêòîðîì. Çàòåì îòêðûòü îêíî îòëàä÷èêà-ñèìóëÿòîðà è íàæàòü êíîïêó Start; ïðîãðàììèðîâàíèå èëè çàãðóçêà êîíôèãóðàöèè âûïîëíÿåòñÿ ïóòåì çàïóñêà ìîäóëÿ ïðîãðàììàòîðà ñ ïîñëåäóþùåé âñòàâêîé óñòðîéñòâà â ïðîãðàììèðóþùèé àäàïòåð ïðîãðàììàòîðà MPU (Master Programming Unit) èëè ïîäêëþ÷åíèÿ óñòðîéñòâ MasterBlaster, BitBlaster, ByteBlaster èëè êàáåëÿ çàãðóçêè FLEX (FLEX download cable) ê óñòðîéñòâó, ïðîãðàììèðóåìîìó â ñèñòåìå; âûáîð êíîïêè Program äëÿ ïðîãðàììèðîâàíèÿ óñòðîéñòâ ñ ïàìÿòüþ òèïà EPROM èëè EEPROM (MAX, EPC) ëèáî âûáîð êíîïêè Configure äëÿ çàãðóçêè êîíôèãóðàöèè óñòðîéñòâà ñ ïàìÿòüþ òèïà SRAM (FLEX). Äàëåå áóäóò ïîäðîáíî ðàññìîòðåíû îñíîâíûå ýëåìåíòû ðàçðàáîòêè ïðîåêòà â ñèñòåìå MAX+PLUS II. Ñèñòåìó MAX+PLUS II ìîæíî çàïóñòèòü äâóìÿ ñïîñîáàìè, ùåëêíóâ äâàæäû ëåâîé êíîïêîé ìûøè íà ïèêòîãðàììå MAX+PLUS II èëè íàáðàâ maxplus2 â êîìàíäíîé ñòðîêå. Ïðè çàïóñêå ñèñòåìû MAX+PLUS II àâòîìàòè÷åñêè îòêðûâàåòñÿ åå Ãëàâíîå îêíî, ìåíþ êîòîðîãî îõâàòûâàåò âñå ïðèëîæåíèÿ ñèñòåìû MAX+PLUS II (Ðèñ. 2.4).  âåðõíåé ÷àñòè îêíà îòîáðàæàåòñÿ èìÿ ïðîåêòà è òåêóùåãî ôàéëà ïðîåêòà. Çàòåì ñëåäóåò ñòðîêà ìåíþ, ïîä íåé ïàíåëü îñíîâíûõ èíñòðóìåíòîâ ñèñòåìû, îáåñïå÷èâàþùàÿ áûñòðûé âûçîâ åå êîìïîíåíòîâ.  íèæíåé ÷àñòè ýêðàíà ðàñïîëàãàåòñÿ ñòðîêà ïîäñêàçêè. Âûçîâ êîìïîíåíòîâ ñèñòåìû óäîáíî ïðîèçâîäèòü ñ ïîìîùüþ îêíà ìåíþ MAX+PLUS II, ïðåäñòàâëåííîì íà Ðèñ. 2.5. Ðàññìîòðèì ïîäðîáíåå ìåíþ MAX+ PLUS II (Ðèñ. 2.5). ÏÎ ñèñòåìû MAX+ PLUS II ñîäåðæèò 11 ïðèëîæåíèé è ãëàâíóþ óïðàâëÿþùóþ îáîëî÷êó. Ðàçëè÷íûå ïðèëîæåíèÿ, îáåñïå÷èâàþùèå ñîçäàíèå ôàéëîâ ïðî-
122
AL2090
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
åêòà, ìîãóò áûòü àêòèâèçèðîâàíû îäíîâðåìåííî, ÷òî ïîçâîëÿåò ïîëüçîâàòåëþ ïåðåêëþ÷àòüñÿ ìåæäó ïðèëîæåíèÿìè ùåë÷êîì ìûøè èëè ñ ïîìîùüþ êîìàíä ìåíþ.  ýòî æå âðåìÿ ìîæåò ðàáîòàòü îäíî èç ôîíîâûõ ïðèëîæåíèé, íàïðèìåð, êîìïèëÿòîð, ñèìóëÿòîð, âðåìåííîé àíàëèçàòîð è ïðîãðàììàòîð. Îäíè è òå æå êîìàíäû ðàçíûõ ïðèëîæåíèé ðàáîòàþò îäèíàêîâî, ÷òî îáëåã÷àåò çàäà÷ó ðàçðàáîòêè ïðîåêòà. Îêíî ëþáîãî ïðèëîæåíèÿ ìîæíî ñâåðíóòü äî ïèêòîãðàììû, íå çàêðûâàÿ ïðèëîæåíèÿ, à çàòåì ñíîâà ðàç-
123
AL2091
Ðèñ. 2.4. Ãëàâíîå îêíî ñèñòåìû MAX+PLUS II
Ðèñ. 2.5. Îêíî ìåíþ MAX+PLUS II
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II âåðíóòü åãî. Ýòî ïîçâîëÿåò ïîëüçîâàòåëþ ðàáîòàòü ýôôåêòèâíî, íå çàãðîìîæäàÿ ðàáî÷èé ýêðàí.  Òàáë. 2.3 ïðèâåäåíû ïèêòîãðàììû è îïèñàíèå ïðèëîæåíèé. Ðàíåå íà Ðèñ. 2.3 ïðîèëëþñòðèðîâàí ðàáî÷èé ìîìåíò ìíîãîîêîííîé ðàçðàáîòêè äèçàéíà, êîãäà íà ýêðàíå îäíîâðåìåííî îòêðûòû íåñêîëüêî îêîí îáçîðà èåðàðõèè è òåêñòîâîãî ðåäàêòîðà. Ïåðåä òåì êàê íà÷àòü ðàáîòàòü â ñèñòåìå MAX+PLUS II, ñëåäóåò ïîíÿòü ðàçíèöó ìåæäó ôàéëàìè ïðîåêòà (design file), âñïîìîãàòåëüíûìè ôàéëàìè è ïðîåêòàìè. Ôàéë ïðîåêòà ýòî ãðàôè÷åñêèé, òåêñòîâûé èëè ñèãíàëüíûé ôàéë, ñîçäàííûé ñ ïîìîùüþ ãðàôè÷åñêîãî èëè ñèãíàëüíîãî ðåäàêòîðà ñèñòåìû MAX+PLUS II èëè â ëþáîì äðóãîì ñõåìíîì èëè òåêñòîâîì ðåäàêòîðå, èñïîëüçóþùåì ïðîìûøëåííûå ñòàíäàðòû, ëèáî ïðè ïîìîùè ïðîãðàììû netlist writer, èìåþùåéñÿ â ïàêåòàõ, ïîääåðæèâàþùèõ EDIF, VHDL è Verilog HDL. Ýòîò ôàéë ñîäåðæèò ëîãèêó äëÿ ïðîåêòà MAX+PLUS II è îáðàáàòûâàåòñÿ êîìïèëÿòîðîì. Kîìïèëÿòîð ìîæåò àâòîìàòè÷åñêè îáðàáàòûâàòü ñëåäóþùèå ôàéëû ïðîåêòà: Òàáëèöà 2.3. Ïðèëîæåíèÿ ñèñòåìû MAX+PLUS II Ïðèëîæåíèå Âûïîëíÿåìàÿ ôóíêöèÿ Hierarchy Îáçîð èåðàðõèè îòîáðàæàåò òåêóùóþ èåðàðõè÷åñêóþ ñòðóêòóðó ôàéëîâ Display â âèäå äåðåâà ñ âåòâÿìè, ïðåäñòàâëÿþùèìè ñîáîé ïîääèçàéíû. Ìîæíî âèçóàëüíî îïðåäåëèòü, ÿâëÿåòñÿ ëè ôàéë ïðîåêòà ñõåìíûì, òåêñòîâûì èëè ñèãíàëüíûì; êàêèå ôàéëû îòêðûòû â äàííûé ìîìåíò; êàêèå âñïîìîãàòåëüíûå ôàéëû â ïðîåêòå äîñòóïíû ïîëüçîâàòåëþ äëÿ ðåäàêòèðîâàíèÿ. Ìîæíî òàêæå íåïîñðåäñòâåííî îòêðûòü èëè çàêðûòü îäèí èëè íåñêîëüêî ôàéëîâ äåðåâà è ââåñòè íàçíà÷åíèÿ ðåñóðñîâ äëÿ íèõ Graphic Editor Ãðàôè÷åñêèé ðåäàêòîð ïîçâîëÿåò ðàçðàáàòûâàòü ñõåìíûé ëîãè÷åñêèé äèçàéí â ôîðìàòå ðåàëüíîãî îòîáðàæåíèÿ íà ýêðàíå WYSIWYG. Ïðèìåíÿÿ ðàçðàáîòàííûå ôèðìîé «Altera» ïðèìèòèâû, ìåãàôóíêöèè è ìàêðîôóíêöèè â êà÷åñòâå îñíîâíûõ áëîêîâ ðàçðàáîòêè, ïîëüçîâàòåëü ìîæåò òàêæå èñïîëüçîâàòü ñîáñòâåííûå ñèìâîëû Symbol Editor Ñèìâîëüíûé ðåäàêòîð ïîçâîëÿåò ðåäàêòèðîâàòü ñóùåñòâóþùèå ñèìâîëû è ñîçäàâàòü íîâûå
124
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Òàáëèöà 2.3 (îêîí÷àíèå) Ïðèëîæåíèå Âûïîëíÿåìàÿ ôóíêöèÿ Text Òåêñòîâûé ðåäàêòîð ïîçâîëÿåò ñîçäàâàòü è ðåäàêòèðîâàòü òåêñòîâûå ôàéëû Editor ïðîåêòà, íàïèñàííûå íà ÿçûêàõ îïèñàíèÿ àïïàðàòóðû AHDL, VHDL è Verilog HDL. Kðîìå òîãî, â ýòîì ðåäàêòîðå ìîæíî ñîçäàâàòü, ïðîñìàòðèâàòü è ðåäàêòèðîâàòü äðóãèå ôàéëû ôîðìàòà ASCII, èñïîëüçóåìûå äðóãèìè ïðèëîæåíèÿìè MAX+PLUS II. Ìîæíî ñîçäàâàòü ôàéëû íà ÿçûêàõ HDL è â äðóãèõ òåêñòîâûõ ðåäàêòîðàõ, îäíàêî äàííûé òåêñòîâûé ðåäàêòîð ñèñòåìû MAX+PLUS II äàåò ïðåèìóùåñòâà â âèäå êîíòåêñòíîé ñïðàâêè, âûäåëåíèÿ öâåòîì ñèíòàêñè÷åñêèõ êîíñòðóêöèé è ãîòîâûõ øàáëîíîâ ÿçûêîâ AHDL, VHDL è Verilog HDL Waveform Editor Ñèãíàëüíûé ðåäàêòîð âûïîëíÿåò äâîéíóþ ôóíêöèþ: èíñòðóìåíò äëÿ ðàçðàáîòêè äèçàéíà è èíñòðóìåíò äëÿ ââîäà òåñòîâûõ ñèãíàëîâ è íàáëþäåíèÿ çà ðåçóëüòàòàìè òåñòèðîâàíèÿ Floorplan Editor
Ïîóðîâíåâûé ïëàíèðîâùèê ïîçâîëÿåò ãðàôè÷åñêèìè ñðåäñòâàìè äåëàòü íàçíà÷åíèÿ âûâîäàì óñòðîéñòâà è ðåñóðñîâ ëîãè÷åñêèõ ýëåìåíòîâ è áëîêîâ. Ìîæíî ðåäàêòèðîâàòü ðàñïîëîæåíèå âûâîäîâ íà ÷åðòåæå êîðïóñà óñòðîéñòâà è íàçíà÷àòü ñèãíàëû îòäåëüíûì ëîãè÷åñêèì ýëåìåíòàì íà áîëåå ïîäðîáíîé ñõåìå ëîãè÷åñêîé ñòðóêòóðû (LAB view). Ìîæíî òàêæå ïðîñìàòðèâàòü ðåçóëüòàòû ïîñëåäíåé êîìïèëÿöèè
Compiler
Kîìïèëÿòîð îáðàáàòûâàåò ëîãè÷åñêèå ïðîåêòû, ðàçðàáîòàííûå äëÿ ñåìåéñòâ óñòðîéñòâ «Altera» Classic, MAX5000, MAX7000, MAX9000, FLEX6000, FLEX8000 è FLEX10K. Áîëüøèíñòâî çàäàíèé âûïîëíÿåòñÿ àâòîìàòè÷åñêè. Îäíàêî ïîëüçîâàòåëü ìîæåò óïðàâëÿòü ïðîöåññîì êîìïèëÿöèè ïîëíîñòüþ èëè ÷àñòè÷íî
Simulator
Ñèìóëÿòîð ïîçâîëÿåò òåñòèðîâàòü ëîãè÷åñêèå îïåðàöèè è âíóòðåííþþ ñèíõðîíèçàöèþ ïðîåêòèðóåìîé ëîãè÷åñêîé ñõåìû. Âîçìîæíû òðè ðåæèìà òåñòèðîâàíèÿ: ôóíêöèîíàëüíîå, âðåìåííîå è òåñòèðîâàíèå íåñêîëüêèõ ñîåäèíåííûõ ìåæäó ñîáîé óñòðîéñòâ
Timing Analyzer
Àíàëèçàòîð âðåìåííûõ ïàðàìåòðîâ àíàëèçèðóåò ðàáîòó ïðîåêòèðóåìîé ëîãè÷åñêîé öåïè ïîñëå òîãî, êàê îíà áûëà ñèíòåçèðîâàíà è îïòèìèçèðîâàíà êîìïèëÿòîðîì, ïîçâîëÿåò îöåíèòü çàäåðæêè, âîçíèêàþùèå â ñõåìå
Programmer Ïðîãðàììàòîð ïîçâîëÿåò ïðîãðàììèðîâàòü, êîíôèãóðèðîâàòü, ïðîâîäèòü âåðèôèêàöèþ è èñïûòûâàòü óñòðîéñòâà ôèðìû «Altera» Message Processor
Ãåíåðàòîð ñîîáùåíèé âûäàåò íà ýêðàí ñîîáùåíèÿ îá îøèáêàõ, ïðåäóïðåæäàþùèå è èíôîðìàöèîííûå ñîîáùåíèÿ î ñîñòîÿíèè ïðîåêòà ïîëüçîâàòåëÿ è ïîçâîëÿåò ïîëüçîâàòåëþ àâòîìàòè÷åñêè íàéòè èñòî÷íèê ñîîáùåíèÿ â èñõîäíîì èëè âñïîìîãàòåëüíîì ôàéëå (ôàéëàõ) è â ïîóðîâíåâîì ïëàíå íàçíà÷åíèé
125
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II ãðàôè÷åñèå ôàéëû ïðîåêòà (.gdf); òåêñòîâûå ôàéëû ïðîåêòà íà ÿçûêå AHDL (.tdf); ñèãíàëüíûå ôàéëû ïðîåêòà (.wdf); ôàéëû ïðîåêòà íà ÿçûêå VHDL (.vhd); ôàéëû ïðîåêòà íà ÿçûêå Verilog (.v); ñõåìíûå ôàéëû OrCAD (.sch); âõîäíûå ôàéëû EDIF (.edf); ôàéëû ôîðìàòà Xilinx Netlist (.xnf); ôàéëû ïðîåêòà «Altera» (.adf); ôàéëû öèôðîâîãî àâòîìàòà (.smf). Âñïîìîãàòåëüíûå ôàéëû ýòî ôàéëû, ñâÿçàííûå ñ ïðîåêòîì MAX+PLUS II, íî íå ÿâëÿþùèåñÿ ÷àñòüþ èåðàðõè÷åñêîãî äåðåâà ïðîåêòà. Áîëüøèíñòâî òàêèõ ôàéëîâ íå ñîäåðæèò ëîãèêè äèçàéíà. Íåêîòîðûå èç íèõ ñîçäàþòñÿ àâòîìàòè÷åñêè ïðèëîæåíèåì ñèñòåìû MAX+PLUS II, äðóãèå ïîëüçîâàòåëåì. Ïðèìåðàìè âñïîìîãàòåëüíûõ ôàéëîâ ÿâëÿþòñÿ ôàéëû íàçíà÷åíèé è êîíôèãóðàöèè (.acf), ñèìâîëüíûå ôàéëû (.sym), ôàéëû îò÷åòà (.rpt) è ôàéëû òåñòîâûõ âåêòîðîâ (.vec). Ïðîåêò ñîñòîèò èç âñåõ ôàéëîâ èåðàðõè÷åñêîé ñòðóêòóðû äèçàéíà, â òîì ÷èñëå âñïîìîãàòåëüíûõ è âûõîäíûõ ôàéëîâ. Èìåíåì ïðîåêòà ÿâëÿåòñÿ èìÿ ôàéëà (ghjtrnf) âåðõíåãî óðîâíÿ áåç ðàñøèðåíèÿ. Ñèñòåìà MAX+PLUS II âûïîëíÿåò êîìïèëÿöèþ, òåñòèðîâàíèå, âðåìåííîé àíàëèç è ïðîãðàììèðîâàíèå ñðàçó öåëîãî ïðîåêòà, õîòÿ ïîëüçîâàòåëü ìîæåò â ýòî âðåìÿ ðåäàêòèðîâàòü ôàéëû ýòîãî ïðîåêòà â ðàìêàõ äðóãîãî ïðîåêòà. Íàïðèìåð, âî âðåìÿ êîìïèëÿöèè ïðîåêòà project1 ïîëüçîâàòåëü ìîæåò ðåäàêòèðîâàòü äèçàéí-ôàéë TDF ñ ïîìîùüþ ÿçûêà AHDL, êîòîðûé ÿâëÿåòñÿ òàêæå ôàéëîì ïðîåêòà project2, è ñîõðàíÿòü åãî; îäíàêî åñëè îí çàõî÷åò êîìïèëèðîâàòü åãî, íóæíî áóäåò ñíà÷àëà äàòü èìÿ project2 â êà÷åñòâå íàçâàíèÿ ïðîåêòà. Äëÿ êàæäîãî ïðîåêòà ñëåäóåò ñîçäàâàòü îòäåëüíûé ïîäêàòàëîã â ðàáî÷åì êàòàëîãå ñèñòåìû MAX+PLUS II (\max2work).  ñèñòåìå MAX+PLUS II ëåãêîäîñòóïíû âñå èíñòðóìåíòû äëÿ ñîçäàíèÿ ëîãè÷åñêîãî ïðîåêòà. Ðàçðàáîòêà ïðîåêòà óñêîðÿåòñÿ çà ñ÷åò èìåþùèõñÿ ñòàíäàðòíûõ ëîãè÷åñêèõ ôóíêöèé, â òîì ÷èñëå ïðèìèòèâîâ, ìåãàôóíêöèé, áèáëèîòåêè ïàðàìåòðèçèðîâàííûõ ìîäóëåé è ìàêðîôóíêöèé óñòàðåâøåãî òèïà ìèêðîñõåì 74-é ñåðèè. Kðàéíå âðåäíî èñïîëüçîâàòü óñòàðåâøèå áèáëèîòåêè è ïåðåíîñèòü íà ÏËÈÑ ñõåìîòåõíèêó ñòàíäàðòíûõ ÒÒË-ñåðèé. Ñëåäóåò ïðîåêòèðîâàòü ïðîåêò èìåííî ïîä àðõèòåêòóðó ÏËÈÑ äëÿ ïîëó÷åíèÿ áîëåå èëè ìåíåå ðàçóìíûõ ðåçóëüòàòîâ.
126
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Ñõåìíûå ôàéëû ïðîåêòà ñîçäàþòñÿ â ãðàôè÷åñêîì ðåäàêòîðå MAX+PLUS II. Ìîæíî òàêæå îòêðûòü, ðåäàêòèðîâàòü è ñîõðàíÿòü ñõåìû, ñîçäàííûå ñõåìíûì ðåäàêòîðîì OrCAD. Ïðîåêòû íà ÿçûêàõ AHDL, VHDL è Verilog HDL ñîçäàþòñÿ â òåêñòîâîì ðåäàêòîðå MAX+PLUS II èëè ëþáîì äðóãîì òåêñòîâîì ðåäàêòîðå. Ñèãíàëüíûå ïðîåêòû ñîçäàþòñÿ â ñèãíàëüíîì ðåäàêòîðå MAX+PLUS II. Ôàéëû ôîðìàòîâ EDIF è «Xilinx», ðàçðàáîòàííûå äðóãèìè ñòàíäàðòíûìè èíñòðóìåíòàìè ñèñòåìû EDA, ìîãóò áûòü èìïîðòèðîâàíû â ñðåäó MAX+PLUS II. Ñõåìíûå è òåñòîâûå ôàéëû, ñîçäàííûå â ñèñòåìå MAX+PLUS II (ïîä DOS) è ïðîãðàììíûõ ïàêåòàõ ôèðìû «Altera» A+PLUS è SAM+PLUS ìîãóò áûòü èíòåãðèðîâàíû â ñðåäå MAX+PLUS II. Íàçíà÷åíèÿ ôèçè÷åñêèõ ðåñóðñîâ äëÿ ëþáîãî óçëà èëè êîíòàêòà â òåêóùåì ïðîåêòå ìîãóò áûòü ââåäåíû â ãðàôè÷åñêóþ ñðåäó ñ ïîìîùüþ ïîóðîâíåâîãî ïëàíèðîâùèêà. Îí ñîõðàíÿåò äëÿ ïðîåêòà íàçíà÷åíèÿ â ôàéëå ñ ðàñøèðåíèåì .acf, â êîòîðîì õðàíÿòñÿ âñå òèïû íàçíà÷åíèé ðåñóðñîâ, çîíäîâ (Probes) è óñòðîéñòâ (Devices) òàê æå, êàê è êîíôèãóðàöèîííûå óñòàíîâêè (Assign) äëÿ êîìïèëÿòîðà, ñèìóëÿòîðà è âðåìåííîãî àíàëèçàòîðà. Ãðàôè÷åñêèå ñèìâîëû, ïðåäñòàâëÿþùèå ëþáîé òèï ôàéëà ïðîåêòà, ìîãóò áûòü àâòîìàòè÷åñêè ñîçäàíû â ëþáîì èç ðåäàêòîðîâ MAX+PLUS II, ïðåäíàçíà÷åííûõ äëÿ ðàçðàáîòêè ïðîåêòîâ ñ ïîìîùüþ êîìàíäû File/Create Default Symbol Command. Ñ ïîìîùüþ ñèìâîëüíîãî ðåäàêòîðà MAX+PLUS II ìîæíî ðåäàêòèðîâàòü ñèìâîëû èëè ñîçäàâàòü ñîáñòâåííûå, à çàòåì èñïîëüçîâàòü èõ â ëþáîì ñõåìíîì ôàéëå ïðîåêòà.  èåðàðõè÷åñêîé ñòðóêòóðå ïðîåêòà íà ëþáîì óðîâíå äîïóñêàåòñÿ ñìåøàííîå èñïîëüçîâàíèå ôàéëîâ ñ ðàñøèðåíèÿìè .gdf, .tdf, .vhd, .v, .edf, .sch. Îäíàêî ôàéëû ñ ðàñøèðåíèåì .wdf, .xnf, .adf, .smf äîëæíû áûòü ëèáî íà ñàìîì íèæíåì èåðàðõè÷åñêîì óðîâíå ïðîåêòà, ëèáî áûòü åäèíñòâåííûì ôàéëîì. Ñïîñîáû çàäàíèÿ ôàéëîâ ïðîåêòà ïîêàçàíû íà Ðèñ. 2.6. Âî âñåõ ïðèëîæåíèÿõ MAX+PLUS II åñòü âîçìîæíîñòü ñ ïîìîùüþ êîìàíä èç ìåíþ Assign (íàçíà÷èòü) ââîäèòü, ðåäàêòèðîâàòü è óäàëÿòü òèïû íàçíà÷åíèé ðåñóðñîâ, óñòðîéñòâ è ïàðàìåòðîâ, êîòîðûå óïðàâëÿþò êîìïèëÿöèåé ïðîåêòà, â òîì ÷èñëå ëîãè÷åñêèì ñèíòåçîì, ðàçäåëåíèåì íà ÷àñòè è ïîäãîíêîé. Íà Ðèñ. 2.7 ïðåäñòàâëåíû êîìàíäû ìåíþ Assign. Ïîëüçîâàòåëü ìîæåò äåëàòü íàçíà÷åíèÿ äëÿ òåêóùåãî ïðîåêòà íåçàâèñèìî îò òîãî, îòêðûòû ëè êàêîé-íèáóäü ôàéë ïðîåêòà èëè îêíî ïðèëîæåíèé. Ñèñòåìà MAX+PLUS II ñîõðàíÿåò èíôîðìàöèþ äëÿ ïðîåêòà â ôàéëå ñ ðàñøèðåíèåì .acf. Èçìåíåíèÿ íàçíà÷åíèé, ñäåëàííûå â îêíå ïîóðîâ-
127
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Текстовый редактор (Text Editor)
Символьный редактор (Symbol Editor)
Поуровневый планировщик (Floorplan Editor)
TopN Level File
.gdf
.sch
.wdf
.tdf
Сигнальный редактор (Waveform Editor)
.vhd
Файлы проекта
.v
Графические Файлы файлы сигналов
.edf
.xnf
Текстовые файлы
.adf
.smf
AL2103+
Графический редактор (Graphic Editor)
Ðèñ. 2.6. Ñïîñîáû îïèñàíèÿ ôàéëîâ ïðîåêòà
AL2104
íåâîãî ïëàíèðîâùèêà, òàêæå ñîõðàíÿþòñÿ â ôàéëå ACF. Kðîìå òîãî, ìîæíî ðåäàêòèðîâàòü ôàéë ACF äëÿ ïðîåêòà â òåêñòîâîì ðåäàêòîðå. Ñëåäóþùèå ôóíêöèè ÿâëÿþòñÿ îáùèìè äëÿ âñåõ ïðèëîæåíèé MAX+PLUS II: íàçíà÷åíèÿ óñòðîéñòâ, ðåñóðñîâ è çîíäîâ; ñîõðàíåíèå ïðåäûäóùåé âåðñèè; ãëîáàëüíûå îïöèè óñòðîéñòâà â ïðîåêòå; ãëîáàëüíûå ïàðàìåòðû ïðîåêòà; ãëîáàëüíûå òðåáîâàíèÿ ê âðåìåííûì ïàðàìåòðàì ïðîåêòà; ãëîáàëüíûé ëîãè÷åñêèé ñèíòåç ïðîåêòà. Ðàññìîòðèì èõ ïîäðîáíåå. Ðåñóðñ ÿâëÿåòñÿ ÷àñòüþ óñòðîéñòâà ôèðìû «Altera», êàê, íàïðèìåð, êîíòàêò èëè ëîãè÷åñêèé ýëåìåíò, êîòîðûé âûïîëíÿåò êîíêðåòíîå, îïðåäåëåííîå ïîëüçîâàòåëåì Ðèñ. 2.7. Ìåíþ íàçíà÷åíèé ïðîåêòà Assign
128
AL2105
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.8. Íàçíà÷åíèå êëèêè (êîìàíäà Assign/Clique)
çàäàíèå. Ïîëüçîâàòåëü ìîæåò íàçíà÷èòü ëîãèêó ðåñóðñàì óñòðîéñòâà äëÿ ãàðàíòèè òîãî, ÷òî êîìïèëÿòîð MAX+PLUS II ñäåëàåò ïîäãîíêó â ïðîåêòå òàê, êàê õî÷åò ïîëüçîâàòåëü. Åñòü ñëåäóþùèå òèïû íàçíà÷åíèé. Clique assignment (íàçíà÷åíèå êëèêè) çàäàåò, êàêèå ëîãè÷åñêèå ôóíêöèè äîëæíû îñòàâàòüñÿ âìåñòå. Ãðóïïèðîâêà ëîãè÷åñêèõ ôóíêöèé â êëèêè ãàðàíòèðóåò, ÷òî îíè ðåàëèçóþòñÿ â îäíîì è òîì æå áëîêå ëîãè÷åñêîé ñòðóêòóðû LAB, áëîêå ÿ÷ååê ïàìÿòè EAB, â îäíîì ðÿäó èëè óñòðîéñòâå. Äëÿ íàçíà÷åíèÿ êëèêè èñïîëüçóþò êîìàíäó Assign/Clique (Ðèñ. 2.8).  ïîëå Clique Name çàäàþò èìÿ êëèêè.  ïîëå Node Name çàäàþò èìÿ óçëà. Óçëû, îáúåäèíåííûå â êëèêè (èíîãäà íàçûâàþò ãðóïïû, íî òàêîå íàèìåíîâàíèå ïðèâîäèò ê ïóòàíèöå ñ ïîíÿòèåì ãðóïïû â AHDL), ïðè êîìïèëÿöèè áóäóò ðàçìåùàòüñÿ â ïðåäåëàõ îäíîãî ËÁ. Chip assignment (íàçíà÷åíèå ÷èïà) çàäàåò, êàêèå ëîãè÷åñêèå ôóíêöèè äîëæíû áûòü ðåàëèçîâàíû â îäíîì è òîì æå óñòðîéñòâå â ñëó÷àå ðàçäåëåíèÿ ïðîåêòà íà ÷àñòè (íà íåñêîëüêî óñòðîéñòâ).
129
AL2106
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.9. Îêíî êîìàíäû Assign/Pin/Location/Chip
Pin assignment (íàçíà÷åíèå âûâîäà) íàçíà÷àåò âõîä èëè âûõîä îäíîé ëîãè÷åñêîé ôóíêöèè, òàêîé êàê ïðèìèòèâ èëè ìåãàôóíêöèÿ, êîíêðåòíîìó êîíòàêòó èëè âåðòèêàëüíîìó (ãîðèçîíòàëüíîìó) ðÿäó âûâîäîâ ÏËÈÑ. Location assignment (íàçíà÷åíèå ÿ÷åéêè) íàçíà÷àåò åäèíñòâåííóþ ëîãè÷åñêóþ ôóíêöèþ, òàêóþ êàê âûõîä ïðèìèòèâà èëè ìåãàôóíêöèè, êîíêðåòíîé ÿ÷åéêå ÷èïà, òàêîé êàê ëîãè÷åñêèé ýëåìåíò, ÿ÷åéêà ââîäà/âûâîäà, ÿ÷åéêà ïàìÿòè, áëîêè LAB è EAB, ãîðèçîíòàëüíûå èëè âåðòèêàëüíûå ðÿäû. Íàçíà÷åíèÿ âûâîäà, ÷èïà è ÿ÷åéêè âûïîëíÿþòñÿ ñ ïîìîùüþ êîìàíäû Assign/Pin/Location/Chip, îêíî êîòîðîé ïðèâåäåíî íà Ðèñ. 2.9.  ïîëÿõ äàííîãî îêíà ìîæíî çàäàòü íîìåð âûâîäà (Pin), ëîãè÷åñêóþ ÿ÷åéêó èëè áëîê, à òàêæå, èñïîëüçóÿ êíîïêè Change è Delete, èçìåíèòü íàçíà÷åíèÿ. Probe assignment (íàçíà÷åíèå çîíäà) ïðèñâàèâàåò ëåãêî çàïîìèíàþùååñÿ óíèêàëüíîå èìÿ âõîäó èëè âûõîäó ëîãè÷åñêîé ôóíêöèè. Äàííîå íàçíà÷åíèå âåñüìà ïîëåçíî ïðè ìîäåëèðîâàíèè ñèñòåìû. Äëÿ íàçíà÷åíèÿ çîíäà èñïîëüçóþò êîìàíäó Assign/Probe (Ðèñ. 2.10).
130
AL2107
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.10. Ìåíþ êîìàíäû Assign/Probe
Connected pin assignment (íàçíà÷åíèå ñîåäèíåííûõ âûâîäîâ) çàäàåò âíåøíåå ñîåäèíåíèå äâóõ èëè áîëåå âûâîäîâ íà ñõåìå ïîëüçîâàòåëÿ. Ýòà èíôîðìàöèÿ òàêæå ïîëåçíà â ðåæèìå òåñòèðîâàíèÿ âðåìåííûõ ïàðàìåòðîâ è ïðè òåñòèðîâàíèè íåñêîëüêèõ ñêîìïîíîâàííûõ ïðîåêòîâ. Äëÿ âûïîëíåíèÿ íàçíà÷åíèÿ ñîåäèíåííûõ âûâîäîâ èñïîëüçóþò êîìàíäó Assign/Connected Pins (Ðèñ. 2.11). Local routing assignment (íàçíà÷åíèå ìåñòíîé òðàññèðîâêè) ïðèñâàèâàåò êîýôôèöèåíò ðàçâåòâëåíèÿ ïî âûõîäó óçëà ëîãè÷åñêîìó ýëåìåíòó, íàõîäÿùåìóñÿ â òîì æå áëîêå LAB, ÷òî è óçåë, èëè æå â ñîñåäíåì LAB, ñìåæíîì ñ âûáðàííûì óçëîì, ñ èñïîëüçîâàíèåì îáùèõ ìåñòíûõ ñâÿçåé. Ìåñòíàÿ òðàññèðîâêà òàêæå ïðîèçâîäèòñÿ ìåæäó óçëîì, ïîìåùåííûì â áëîê LAB íà ïåðèôåðèè óñòðîéñòâà, è âûõîäíûì êîíòàêòîì, ñ êîòîðûì îí ñîåäèíåí. Íàçíà÷åíèå ìåñòíîé òðàññèðîâêè ïðîèçâîäèòñÿ ñ ïîìîùüþ êîìàíäû Assign/Local routing (Ðèñ. 2.12). Device assignment (íàçíà÷åíèå óñòðîéñòâà) íàçíà÷àåò òèï ÏËÈÑ, â êîòîðîé áóäåò âîïëîùåí ïðîåêò. Åñëè ïðîåêò ñîñòîèò èç íåñêîëüêèõ óñòðîéñòâ, äàííûé òèï íàçíà÷åíèÿ äåëàåò íàçíà÷åíèÿ ÷èïîâ êîíêðåòíûì óñòðîéñòâàì. Ìîæíî òàêæå âûáðàòü îïöèþ AUTO è ïðåäîñòàâèòü êîìïèëÿòîðó âûáðàòü
131
AL2108
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
AL2109
Ðèñ. 2.11. Ìåíþ êîìàíäû Assign/Connected Pins
Ðèñ. 2.12. Îêíî êîìàíäû Assign/Local routing
132
AL2110
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.13. Îêíî êîìàíäû Assign/ Device
óñòðîéñòâî èç çàäàííîãî ñåìåéñòâà óñòðîéñòâ. Ïðîöåññîì àâòîìàòè÷åñêîãî âûáîðà óñòðîéñòâà ìîæíî óïðàâëÿòü, çàäàâàÿ äèàïàçîí è ÷èñëî óñòðîéñòâ â ñåìåéñòâå. Åñëè ïðîåêò îêàçàëñÿ ñëèøêîì áîëüøèì äëÿ ðåàëèçàöèè â îäíîì óñòðîéñòâå, ìîæíî çàäàòü òèï è ÷èñëî äîïîëíèòåëüíûõ óñòðîéñòâ. Äëÿ âûáîðà óñòðîéñòâà èñïîëüçóåòñÿ êîìàíäà Assign/Device (Ðèñ. 2.13). Logic option assignment (íàçíà÷åíèå ëîãè÷åñêîé îïöèè) óïðàâëÿåò ëîãè÷åñêèì ñèíòåçîì îòäåëüíûõ ëîãè÷åñêèõ ôóíêöèé âî âðåìÿ êîìïèëÿöèè ñ ïðèìåíåíèåì ñòèëÿ ëîãè÷åñêîãî ñèíòåçà è/èëè îòäåëüíûõ îïöèé ëîãè÷åñêîãî ñèíòåçà. Ôèðìà «Altera» îáåñïå÷èâàåò áîëüøîå êîëè÷åñòâî ëîãè÷åñêèõ îïöèé, à òàêæå ãîòîâûõ ñòèëåé, êàæäûé èç êîòîðûõ ïðåäñòàâëÿåò ñîáîé ñîáðàíèå óñòàíîâîê äëÿ ëîãè÷åñêèõ îïöèé, îáúåäèíåííûõ îäíèì èìåíåì ñòèëÿ ñèíòåçà (Synthesis Style). Ïîëüçîâàòåëü ìîæåò ïðèìåíÿòü ãîòî-
133
AL2111
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.14. Îêíî êîìàíäû Assign/Logic Options
âûå ñòèëè èëè ñîçäàâàòü íîâûå. Ñòèëè ñèíòåçà ïîçâîëÿþò íàñòðàèâàòü îïöèè ñèíòåçà íà îïðåäåëåííîå ñåìåéñòâî óñòðîéñòâ, ó÷èòûâàÿ ïðè ýòîì àðõèòåêòóðó ñåìåéñòâà. Äëÿ íàñòðîéêè ñòèëåé ñèíòåçà ïðèìåíÿåòñÿ êîìàíäà Assign/Logic Options (Ðèñ. 2.14). Timing assignment (íàçíà÷åíèå âðåìåííûõ ïàðàìåòðîâ) óïðàâëÿåò ëîãè÷åñêèì ñèíòåçîì è ïîäãîíêîé îòäåëüíûõ ëîãè÷åñêèõ ôóíêöèé äëÿ ïîëó÷åíèÿ òðåáóåìûõ õàðàêòåðèñòèê äëÿ âðåìåíè çàäåðæêè tPD (âõîäíåòàêòèðóåìûé âûõîä), tCO (ñèíõðîñèãíàëâûõîä), tSU (ñèíõðîñèãíàëâðåìÿ óñòàíîâêè), fMAX (÷àñòîòà ñèíõðîñèãíàëà). Ïîëüçîâàòåëü ìîæåò òàêæå âûðåçàòü ñîåäèíåíèÿ ìåæäó ïóòÿìè ðàñïðîñòðàíåíèÿ äëÿ êîíêðåòíîãî ñèãíàëà, íàçûâàåìîãî «óçëîì» â ñèñòåìå MAX+PLUS II è äðóãèìè óçëàìè ïðîåêòà. Íàçíà÷åíèå âðåìåííûõ ïàðàìåòðîâ óçëà ïðîèçâîäèòñÿ ïî êîìàíäå Assign/Timing Requirements (Ðèñ. 2.15).
134
AL2112
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.15. Îêíî êîìàíäû Assign/Timing Requirements
Kðîìå èñïîëüçîâàíèÿ êîìàíä ìåíþ Assign, íàçíà÷åíèÿ ìîæíî âûïîëíÿòü ùåë÷êîì ïðàâîé êíîïêè ìûøè ïî âûáðàííîìó óçëó ïðîåêòà è âûáèðàÿ ñîîòâåòñòâóþùåå íàçíà÷åíèå âî âñïëûâàþùåì ìåíþ (Ðèñ. 2.16). Ìîæíî îïðåäåëèòü ãëîáàëüíûå îïöèè êîìïèëÿòîðà äëÿ òîãî, ÷òîáû îí èõ èñïîëüçîâàë äëÿ âñåõ óñòðîéñòâ ïðè îáðàáîòêå ïðîåêòà. Äëÿ ðåçåðâèðîâàíèÿ äîïîëíèòåëüíûõ âîçìîæíîñòåé ëîãèêè íà áóäóùåå ìîæíî çàäàòü ïðîöåíòíîå ñîîòíîøåíèå âûâîäîâ è ëîãè÷åñêèõ ýëåìåíòîâ, êîòîðûå äîëæíû îñòàâàòüñÿ íåèñïîëüçîâàííûìè âî âðåìÿ òåêóùåé êîìïèëÿöèè. Ìîæíî òàêæå çàäàòü óñòàíîâêè äëÿ áèòîâ îïöèé óñòðîéñòâ è âûâîäîâ â êîíôèãóðàöèè óñòðîéñòâ, èñïîëüçóåìîé äëÿ íåñêîëüêèõ öåëåé. Íàïðèìåð, ìîæíî çàäàòü áèò çàùèòû îò íåñàíêöèîíèðîâàííîãî ñ÷èòûâàíèÿ (security bit) ãëîáàëüíûì, ÷òî ïðåäîòâðàòèò ïèðàòñêîå êîïèðîâàíèå òîïîëîãèè óñòðîéñòâ, áàçèðóþùèõñÿ íà ïàìÿòè EPROM èëè EEPROM.
135
AL2113
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.16. Âûáîð êîìàíä Assign ñ ïîìîùüþ âñïëûâàþùåãî ìåíþ
Ìîæíî çàäàòü èìåíà è ãëîáàëüíûå óñòàíîâêè, êîòîðûå áóäóò èñïîëüçîâàíû êîìïèëÿòîðîì äëÿ ïàðàìåòðîâ âî âñåõ ïàðàìåòðèçîâàííûõ ôóíêöèÿõ â ïðîåêòå. Ìîæíî ââåñòè ãëîáàëüíûå âðåìåííûå òðåáîâàíèÿ äëÿ ïðîåêòà, çàäàâàÿ îáùèå õàðàêòåðèñòèêè äëÿ âðåìåíè çàäåðæêè tPD (âõîäíåðåãèñòðèðóåìûé âûõîä), tCO (ñèíõðîñèãíàëâûõîä), tSU (ñèíõðîñèãíàëâðåìÿ óñòàíîâêè), fMAX (÷àñòîòà ñèíõðîñèãíàëà). Ìîæíî òàêæå âûðåçàòü ñîåäèíåíèÿ ìåæäó âñåìè äâóíàïðàâëåííûìè êîíòóðàìè îáðàòíîé ñâÿçè, öåïÿìè ïðîõîæäåíèÿ ñèãíàëîâ Preset (óñòàíîâêà 1) è Clear (óñòàíîâêà 0) è äðóãèìè öåïÿìè ñèíõðîíèçàöèè â ïðîåêòå. Äëÿ ýòèõ öåëåé èñïîëüçóåòñÿ êîìàíäà Assign/Global Project Timing Requirements (Ðèñ. 2.17). Ôëàæîê Cut All Bidirectional Feedback Timing Paths ïîçâîëÿåò èñêëþ÷èòü âñå öåïè îáðàòíîé ñâÿçè äëÿ äâóíàïðàâëåííûõ âûâîäîâ. Ôëàæîê Cut All Clear & Preset Timing Paths ïîçâîëÿåò óäàëèòü ñîåäèíåíèÿ ìåæäó âñåìè öåïÿìè ñáðîñà è ïðåäóñòàíîâêè ïðîåêòà. Ôëàæîê Ignore Timing Assignments During Fitting ïîçâîëÿåò çàïóñòèòü òðàññèðîâùèê (Fitter) áåç ó÷åòà âðåìåííûõ îãðàíè÷åíèé ïðîåêòà. Kîãäà ýòîò ôëàæîê ñáðîøåí è çàäàíû âðåìåííûå ïàðàìåòðû, îñóùåñòâëÿåòñÿ ò.í. óïðàâëÿåìûé ñèíòåç (time driving synthesis).
136
AL2 114
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.17. Îêíî êîìàíäû Assign/Global Project Timing Requirements
Èç ñîáñòâåííîãî îïûòà çàìå÷åíî, ÷òî âíà÷àëå äëÿ óñêîðåíèÿ êîìïèëÿöèè ñëåäóåò âûáðàòü ýòîò ôëàæîê, à â äàëüíåéøåì ïðè «âûëèçûâàíèè» ïðîåêòà ñáðîñèòü. Ñëåäóåò ïîìíèòü, ÷òî óïðàâëÿåìûé âðåìåííîé ñèíòåç âîçìîæåí òîëüêî äëÿ óñòðîéñòâ FLEX, äëÿ óñòðîéñòâ MAX âðåìåíà çàäåðæåê ïðåäîïðåäåëåíû, è â ñëó÷àå íàçíà÷åíèÿ âðåìåííûõ ïàðàìåòðîâ ïðîèñõîäèò òîëüêî ëèøü ïðîâåðêà ñîîòâåòñòâèÿ ïîëó÷åííûõ ïðè ñèíòåçå ïàðàìåòðîâ çàäàííûì. Ìîæíî ñäåëàòü ãëîáàëüíûå óñòàíîâêè äëÿ êîìïèëÿòîðà â ÷àñòè ëîãè÷åñêîãî ñèíòåçà ïðîåêòà. Ìîæíî çàäàòü èñïîëüçóåìûé ïî óìîë÷àíèþ ñòèëü ëîãè÷åñêîãî ñèíòåçà, îïðåäåëèòü ñòåïåíü îïòèìèçàöèè ïî ñêîðîñòè è çàíèìàåìûì ðåñóðñàì, äàòü óêàçàíèÿ êîìïèëÿòîðó ïî âûáîðó àâòîìàòè÷åñêèõ ãëîáàëüíûõ ñèãíàëîâ óïðàâëåíèÿ, òàêèõ êàê Clock (òàêòîâûé), Clear (óñòàíîâêà 0), Preset (óñòàíîâêà 1) è Output Enable (ðàçðåøåíèå âûõîäà). Ìîæíî òàêæå âûáðàòü äëÿ êîìïèëÿòîðà ðåæèì ñòàíäàðòíîãî èëè ìíîãîóðîâíåâîãî ñèíòåçà, ðåæèì êîäèðîâàíèÿ öèôðîâîãî àâòîìàòà ñ 1 ïðè ïîäêëþ÷åíèè ïèòàíèÿ, à òàêæå ðåæèì àâòîìàòè÷åñêîé óïàêîâêè ðåãèñòðîâ. Kðîìå òîãî, ìîæíî âûáðàòü âàðèàíò àâòîìàòè÷åñêîé ðåàëèçàöèè ëîãèêè â áûñòðûõ âõîäíûõ èëè âûõîäíûõ ëîãè÷åñêèõ ýëåìåíòàõ è ÿ÷åéêàõ âõîäà/âûõîäà, âûâîäàõ ñ îòêðûòûì ñòîêîì è áëîêàõ ÿ÷ååê ïàìÿòè. Äëÿ íàçíà÷åíèÿ ãëîáàëüíûõ ïàðàìåòðîâ ëîãè÷åñêîãî ñèíòåçà èñïîëüçóþò êîìàíäó Assign/Global Project Logic Synthesis (Ðèñ. 2.18).
137
AL2115
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.18. Îêíî êîìàíäû Assign/Global Project Logic Synthesis
Kíîïêà Define Synthesis Style ïîçâîëÿåò âûáðàòü áîëåå òîíêèå ïàðàìåòðû ñòèëÿ ñèíòåçà (Ðèñ. 2.19), òàêèå êàê èìÿ ñòèëÿ, ñïîñîá ðåàëèçàöèè è ìàêñèìàëüíóþ äëèíó öåïî÷åê ïåðåíîñà è êàñêàäèðîâàíèÿ, ñòåïåíü ìèíèìèçàöèè ëîãè÷åñêèõ ôóíêöèé è äðóãèå ïàðàìåòðû ñèíòåçà. Kíîïêà Advanced Options ïîçâîëÿåò âûáðàòü ïàðàìåòðû ñèíòåçà â äèàëîãîâîì îêíå, èçîáðàæåííîì íà Ðèñ. 2.20.
138
AL2116
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
AL2117
Ðèñ. 2.19. Îïðåäåëåíèå ñòèëÿ ñèíòåçà
Ðèñ. 2.20. Îêíî Advanced Options
139
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
2.3. Ðåäàêòîðû MAX+PLUS II Âñå ïÿòü ðåäàêòîðîâ MAX+PLUS II è òðè ðåäàêòîðà ñîçäàíèÿ ôàéëà ïðîåêòà (ãðàôè÷åñêèé, òåêñòîâûé è ñèãíàëüíûé) èìåþò îáùèå ôóíêöèè, òàêèå êàê, íàïðèìåð, ñîõðàíåíèå è âûçîâ ôàéëà. Kðîìå òîãî, ïðèëîæåíèÿ ðåäàêòîðà MAX+PLUS II èìåþò ñëåäóþùèå îáùèå ôóíêöèè: ñîçäàíèå ôàéëîâ ñèìâîëîâ è ôàéëîâ ñ ïðîòîòèïàìè ôóíêöèé (in-clude file symbol and include file generation); ïîèñê óçëîâ (node location); òðàâåðç èåðàðõè÷åñêîãî äåðåâà (hierarchy traversal); âñïëûâàþùèå îêíà ìåíþ, çàâèñÿùåãî îò êîíòåêñòà (context-sensitive menu comands); âðåìåííîé àíàëèç (timing analysis); ïîèñê è çàìåíà ôðàãìåíòîâ òåêñòà (find & replace text); îòìåíà ïîñëåäíåãî øàãà ðåäàêòèðîâàíèÿ, åãî âîçâðàùåíèå, âûðåçêà, êîïèðîâàíèå, âêëåèâàíèå è óäàëåíèå âûáðàííûõ ôðàãìåíòîâ, îáìåí ôðàãìåíòàìè ìåæäó ïðèëîæåíèÿìè MAX+PLUS II èëè ïðèëîæåíèÿìè Windows (undo, cut, copy, paste & delete); ïå÷àòü (print). Íà Ðèñ. 2.21 ïîêàçàíî îêíî ãðàôè÷åñêîãî ðåäàêòîðà (Graphic Editor) MAX+PLUS II, îáåñïå÷èâàþùåãî ïðîåêòèðîâàíèå â ðåàëüíîì ôîðìàòå èçîáðàæåíèÿ (WYSIWIG).  íåì ìîæíî ñîçäàâàòü íîâûå ôàéëû (êîìàíäà New èç ìåíþ File). Âûçûâàåòñÿ ãðàôè÷åñêèé ðåäàêòîð èç ìåíþ MAX+PLUS II. Ãðàôè÷åñêèå ôàéëû ïðîåêòà (.gdf) èëè ñõåìíûå ôàéëû OrCAD (.sch), ñîçäàííûå â äàííîì ãðàôè÷åñêîì ðåäàêòîðå, ìîãóò âêëþ÷àòü ëþáóþ êîìáèíàöèþ ñèìâîëîâ ïðèìèòèâîâ, ìåãàôóíêöèé è ìàêðîôóíêöèé. Ñèìâîëû ìîãóò ïðåäñòàâëÿòü ñîáîé ëþáîé òèï ôàéëà ïðîåêòà (.gdf, .sch, .tdf, .vhd, .v, .wdf, .edf, .xnf, .adf, .smf). Óíèâåðñàëüíîñòü ãðàôè÷åñêîãî ðåäàêòîðà õàðàêòåðèçóåòñÿ ñëåäóþùèìè ÷åðòàìè: èíñòðóìåíò âûáîðà («ñòðåëêà») îáëåã÷àåò ðàçðàáîòêó ïðîåêòà. Îí ïîçâîëÿåò äâèãàòü è êîïèðîâàòü îáúåêòû, à òàêæå ââîäèòü íîâûå ñèìâîëû. Kîãäà âû ïîìåùàåòå åãî íà âûâîä èëè êîíåö ëèíèè, îí àâòîìàòè÷åñêè ïðåîáðàçóåòñÿ â èíñòðóìåíò ðèñîâàíèÿ îðòîãîíàëüíûõ ëèíèé. Åñëè èì ùåëêíóòü íà òåêñòå, îí àâòîìàòè÷åñêè ïðåîáðàçóåòñÿ â èíñòðóìåíò ðåäàêòèðîâàíèÿ òåêñòà; ñèìâîëû ñîåäèíÿþòñÿ ñèãíàëüíûìè ëèíèÿìè, êîòîðûå íàçûâàþò óçëàìè (nodes) èëè ëèíèÿìè øèí (bus), êîòîðûå ïðåäñòàâëÿþò ñîáîé íå-
140
AL2118
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.21. Îêíî ãðàôè÷åñêîãî ðåäàêòîðà MAX+PLUS II
ñêîëüêî ëîãè÷åñêè ñãðóïïèðîâàííûõ óçëîâ. Kîãäà âû ïðèñâàèâàåòå óçëó èìÿ, âû ìîæåòå ñîåäèíèòü åãî ñ äðóãèìè óçëàìè èëè ñèìâîëàìè òîëüêî ïî èìåíè. Øèíû ñîåäèíÿþòñÿ ïî èìåíè, íî âîçìîæíî è èõ ãðàôè÷åñêîå ñîåäèíåíèå; ïîëüçîâàòåëü ìîæåò ïåðåîïðåäåëèòü ïîðòû, èñïîëüçóåìûå â êàæäîì îòäåëüíîì ïðèìåðå ñèìâîëà ìåãà- èëè ìàêðîôóíêöèè, à òàêæå èíâåðòèðîâàòü èõ. Ïðè ýòîì äëÿ óêàçàíèÿ èíâåðòèðîâàííîãî ïîðòà ïîÿâèòñÿ êðóæîê, îáîçíà÷àþùèé èíâåðñèþ; ìîæíî âûáðàòü íåñêîëüêî îáúåêòîâ â ïðÿìîóãîëüíîé îáëàñòè è ðåäàêòèðîâàòü èõ âìåñòå èëè ïî îòäåëüíîñòè. Ïðè ïåðåìåùåíèè âûáðàííîé îáëàñòè ñèãíàëüíûå ñâÿçè ñîõðàíÿþòñÿ; äëÿ êàæäîãî ñèìâîëà ìîæíî ïðèñâîèòü íàçíà÷åíèÿ çîíäîâ, âûâîäîâ, ðàñïîëîæåíèÿ, ÷èïîâ, êëèê, âðåìåííûõ ïàðàìåòðîâ, ìåñòíóþ òðàññèðîâêó, ëîãè÷åñêèå îïöèè è íàçíà÷åíèÿ ïàðàìåòðîâ. Äëÿ îáëåã÷åíèÿ òåñòèðîâàíèÿ ìîæíî òàêæå ñîçäàòü íàçíà÷åíèÿ ãðóïï âûâîäîâ, êîòîðûå áóäóò îïðåäåëÿòü ñîåäèíåíèÿ âíåøíåãî óñòðîéñòâà ìåæäó âûâîäàìè;
141
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II ïîñòàâëÿåìûå ôèðìîé «Altera» ïðèìèòèâû, ìåãà- è ìàêðîôóíêöèè ñîêðàùàþò âðåìÿ ðàçðàáîòêè äèçàéíà. Ïîëüçîâàòåëü ìîæåò òàêæå ñîçäàâàòü ñâîè ñîáñòâåííûå áèáëèîòåêè ôóíêöèé. Ïðè ðåäàêòèðîâàíèè ñèìâîëà èëè âîññòàíîâëåíèè åãî ïî óìîë÷àíèþ ìîæíî àâòîìàòè÷åñêè ñîçäàâàòü âûáðàííûå ïðèìåðû èëè âñå ïðèìåðû ýòîãî ñèìâîëà â ôàéëå â ãðàôè÷åñêîì ðåäàêòîðå. Ãðàôè÷åñêèé ðåäàêòîð îáåñïå÷èâàåò è ìíîãî äðóãèõ âîçìîæíîñòåé. Íàïðèìåð, ìîæíî óâåëè÷èòü èëè óìåíüøèòü ìàñøòàá îòîáðàæåíèÿ íà ýêðàíå è óâèäåòü äèçàéí öåëèêîì èëè êàêóþ-ëèáî åãî äåòàëü. Ìîæíî âûáèðàòü ãàðíèòóðó è ðàçìåð øðèôòà, çàäàâàòü ñòèëè ëèíèé, óñòàíàâëèâàòü è îòîáðàæàòü íàïðàâëÿþùèå. Ìîæíî êîïèðîâàòü, âûðåçàòü, âêëåèâàòü è óäàëÿòü âûáðàííûå ôðàãìåíòû; ïîëó÷àòü çåðêàëüíîå îòîáðàæåíèå (âåðòèêàëüíîå èëè ãîðèçîíòàëüíîå); ïîâîðà÷èâàòü âûäåëåííûå ôðàãìåíòû íà 90, 180 èëè 270 ãðàäóñîâ; çàäàâàòü ðàçìåð, ðàçìåùåíèå òåêóùåãî ëèñòà ñõåìû ïî âåðòèêàëè èëè ãîðèçîíòàëè. Íà Ðèñ. 2.22 ïðåäñòàâëåíî îêíî ñèìâîëüíîãî ðåäàêòîðà ñèñòåìû MAX+PLUS II, ñ ïîìîùüþ êîòîðîãî ìîæíî ïðîñìàòðèâàòü, ñîçäàâàòü è ðåäàêòèðîâàòü ñèìâîë, ïðåäñòàâëÿþùèé ñîáîé ëîãè÷åñêóþ ñõåìó.  íåì ìîæíî ñîçäàâàòü íîâûå ôàéëû (êîìàíäà New èç ìåíþ File). Âûçûâàåòñÿ ñèìâîëüíûé ðåäàêòîð èç ìåíþ MAX+PLUS II. Ñèìâîëüíûé ôàéë èìååò òî æå èìÿ, ÷òî è ôàéë ïðîåêòà, è ðàñøèðåíèå .sym. Kîìàíäà Creat Default Suymbol ìåíþ File, êîòîðàÿ åñòü â ãðàôè÷åñêîì, òåêñòîâîì è ñèãíàëüíîì ðåäàêòîðàõ, ñîçäàåò ñèìâîë äëÿ ëþáîãî ôàéëà äèçàéíà. Ñèìâîëüíûé ðåäàêòîð îáëàäàåò ñëåäóþùèìè õàðàêòåðèñòèêàìè: ìîæíî ïåðåîïðåäåëèòü ñèìâîë, ïðåäñòàâëÿþùèé ôàéë ïðîåêòà; ìîæíî ñîçäàâàòü è ðåäàêòèðîâàòü âûâîäû è èõ èìåíà, ðàçðàáàòûâàÿ âõîäíûå, âûõîäíûå è äâóíàïðàâëåííûå êîíòàêòû, à òàêæå çàäàâàòü âàðèàíòû ââîäà ñèìâîëà â ôàéë ãðàôè÷åñêîãî ðåäàêòîðà ñ îòîáðàæåíèåì íà ýêðàíå èìåí âûâîäîâ èëè áåç îòîáðàæåíèÿ, ñ îòîáðàæåíèåì ïîëíîãî èëè ñîêðàùåííîãî èìåíè. Òàêèì îáðàçîì, ïîëíîå èìÿ ïîðòà è èìÿ, îòîáðàæàåìîå â ôàéëå â îêíå ãðàôè÷åñêîãî ðåäàêòîð, ìîãóò áûòü ðàçíûìè; èìåíà âûâîäîâ àâòîìàòè÷åñêè äóáëèðóþòñÿ çà ãðàíèöó ñèìâîëà. Ðåäàêòèðîâàíèþ ïîäëåæàò òîëüêî èìåíà âíóòðè ãðàíèöû ñèìâîëà. Èìåíà ñíàðóæè íåëüçÿ ìåíÿòü, îíè ïðîñòî èëëþñòðèðóþò ñîåäèíåíèå âûâîäîâ; ìîæíî çàäàòü çíà÷åíèÿ ïàðàìåòðîâ è èõ çíà÷åíèÿ ïî óìîë÷àíèþ; ñåòêà è íàïðàâëÿþùèå ïîìîãàþò âûïîëíèòü òî÷íîå âûðàâíèâàíèå îáúåêòîâ;
142
AL2119
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.22. Ñèìâîëüíûé ðåäàêòîð MAX+PLUS II
â ñèìâîëàõ ìîæíî ââîäèòü êîììåíòàðèè èëè ïîëåçíûå çàìå÷àíèÿ, êîòîðûå òàêæå ïîÿâÿòñÿ ïðè ââîäå ñèìâîëà â ôàéë â ãðàôè÷åñêîì ðåäàêòîðå. Íà Ðèñ. 2.23 ïîêàçàíî îêíî òåêñòîâîãî ðåäàêòîðà MAX+PLUS II, êîòîðûé ÿâëÿåòñÿ ãèáêèì èíñòðóìåíòîì äëÿ ñîçäàíèÿ òåêñòîâûõ ôàéëîâ ïðîåêòà íà ÿçûêàõ îïèñàíèÿ àïïàðàòóðû: AHDL (.tdf), VHDL (.vhd), Verilog HDL (.v).  ýòîì òåêñòîâîì ðåäàêòîðå ìîæíî ðàáîòàòü òàêæå ñ ïðîèçâîëüíûì ôàéëîì ôîðìàòà ASCII.  íåì ìîæíî ñîçäàâàòü íîâûå ôàéëû (êîìàíäà New èç ìåíþ File). Âûçûâàåòñÿ ñèìâîëüíûé ðåäàêòîð èç ìåíþ MAX+PLUS II. Âñå ïåðå÷èñëåííûå ôàéëû ïðîåêòà ìîæíî ñîçäàâàòü â ëþáîì òåêñòîâîì ðåäàêòîðå, îäíàêî äàííûé ðåäàêòîð èìååò âñòðîåííûå âîçìîæíîñòè óäîáíîãî ââîäà ôàéëîâ ïðîåêòà, èõ êîìïèëÿöèè è îòëàäêè ñ âûäà÷åé ñîîáùåíèé îá îøèáêàõ è èõ ëîêàëèçàöèåé â èñõîäíîì òåêñòå èëè â òåêñòå âñïîìîãàòåëüíûõ ôàéëîâ; êðîìå òîãî, ñóùåñòâóþò øàáëîíû ÿçûêîâûõ êîíñòðóêöèé äëÿ AHDL, VHDL è Verilog HDL, âûïîëíåíî îêðàøèâàíèå ñèíòàêñè÷åñêèõ êîíñòðóêöèé.  äàííîì ðåäàêòîðå ìîæíî âðó÷íóþ ðåäàêòèðîâàòü ôàéëû íàçíà÷åíèé è êîíôèãóðàöèè (.acf), à òàêæå äåëàòü óñòàíîâêè êîíôèãóðàöèè äëÿ êîìïèëÿòîðà, ñèìóëÿòîðà è âðåìåííîãî àíàëèçàòîðà.
143
AL2120
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.23. Òåêñòîâûé ðåäàêòîð MAX+PLUS II
Ïîëüçóÿñü äàííûì òåêñòîâûì ðåäàêòîðîì, ìîæíî ñîçäàâàòü òåñòîâûå âåêòîðû (.vec), èñïîëüçóåìûå äëÿ òåñòèðîâàíèÿ, îòëàäêè ôóíêöèé è ïðè ââîäå ñèãíàëüíîãî ïðîåêòà. Ìîæíî òàêæå ñîçäàâàòü êîìàíäíûå ôàéëû (.cmd äëÿ ñèìóëÿòîðà è .edc äëÿ EDIF), à òàêæå ìàêðîáèáëèîòåêè (.lmf).  òåêñòîâîì ðåäàêòîðå MAX+PLUS II îáåñïå÷èâàåòñÿ êîíòåêñòóàëüíàÿ ñïðàâêà. Ñèãíàëüíûé ðåäàêòîð (Ðèñ. 2.24) âûïîëíÿåò äâå ðîëè: ñëóæèò èíñòðóìåíòîì ñîçäàíèÿ äèçàéíà è èíñòðóìåíòîì ââîäà òåñòîâûõ âåêòîðîâ è ïðîñìîòðà ðåçóëüòàòîâ òåñòèðîâàíèÿ. Ïîëüçîâàòåëü ìîæåò ñîçäàâàòü ñèãíàëüíûå ôàéëû ïðîåêòà (.wdf), êîòîðûå ñîäåðæàò ëîãèêó äèçàéíà äëÿ ïðîåêòà, à òàêæå ôàéëû êàíàëîâ òåñòèðîâàíèÿ (.scf), êîòîðûå ñîäåðæàò âõîäíûå âåêòîðû äëÿ òåñòèðîâàíèÿ è ôóíêöèîíàëüíîé îòëàäêè. Íîâûé ôàéë ñîçäàåòñÿ êîìàíäîé New ìåíþ File. Âûçûâàåòñÿ ñèãíàëüíûé ðåäàêòîð èç ìåíþ MAX+PLUS II. Ðàçðàáîòêà äèçàéíà â ñèãíàëüíîì ðåäàêòîðå ÿâëÿåòñÿ àëüòåðíàòèâîé ñîçäàíèþ äèçàéíà â ãðàôè÷åñêîì èëè òåêñòîâîì ðåäàêòîðàõ. Çäåñü ìîæ-
144
AL2121
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.24. Ñèãíàëüíûé ðåäàêòîð MAX+PLUS II
íî ãðàôè÷åñêèì ñïîñîáîì çàäàâàòü êîìáèíàöèè âõîäíûõ ëîãè÷åñêèõ óðîâíåé è òðåáóåìûõ âûõîäîâ. Ñîçäàííûé òàêèì îáðàçîì ôàéë ñ ðàñøèðåíèåì WDF (Waveform Design File) ìîæåò ñîäåðæàòü êàê ëîãè÷åñêèå âõîäû, òàê è âõîäû öèôðîâîãî àâòîìàòà, à òàêæå âûõîäû êîìáèíàòîðíîé ëîãèêè, ñ÷åò÷èêîâ è öèôðîâûõ àâòîìàòîâ. Ìîæíî èñïîëüçîâàòü òàêæå «çàìóðîâàííûå» (buried) óçëû, êîòîðûå ïîìîãàþò îïðåäåëèòü òðåáóåìûå âûõîäû. Ñïîñîá ðàçðàáîòêè ïðîåêòà â ñèãíàëüíîì ðåäàêòîðå ëó÷øå ïîäõîäèò äëÿ öåïåé ñ ÷åòêî îïðåäåëåííûìè ïîñëåäîâàòåëüíûìè âõîäàìè è âûõîäàìè, ò.å. äëÿ öèôðîâûõ àâòîìàòîâ, ñ÷åò÷èêîâ è ðåãèñòðîâ. Ñ ïîìîùüþ ñèãíàëüíîãî ðåäàêòîðà ìîæíî ëåãêî ïðåîáðàçîâûâàòü ôîðìû ñèãíàëîâ öåëèêîì èëè ÷àñòè÷íî, ñîçäàâàÿ è ðåäàêòèðóÿ óçëû è ãðóïïû. Ïðîñòûìè êîìàíäàìè ìîæíî ñîçäàâàòü ôàéë òàáëèöû ASCII-ñèìâîëîâ (.tbl) èëè èìïîðòèðîâàòü ôàéë òåñòîâûõ âåêòîðîâ â ôîðìàòå ASCII (.vec) äëÿ ñîçäàíèÿ ôàéëîâ òåñòèðóåìûõ êàíàëîâ SCF è ñèãíàëüíîãî äèçàéíà WDF. Ìîæíî òàêæå ñîõðàíèòü ôàéë WDF êàê SCF äëÿ ïðîâåäåíèÿ
145
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II òåñòèðîâàíèÿ èëè ïðåîáðàçîâàòü SCF â WDF äëÿ èñïîëüçîâàíèÿ åãî â êà÷åñòâå ôàéëà ïðîåêòà. Ñèãíàëüíûé ðåäàêòîð èìååò ñëåäóþùèå îòëè÷èòåëüíûå ÷åðòû: ìîæíî ñîçäàòü èëè îòðåäàêòèðîâàòü óçåë äëÿ ïîëó÷åíèÿ òèïà I/O (âõîä/âûõîä), êîòîðûé ïðåäñòàâëÿåò ñîáîé âõîäíîé èëè âûõîäíîé êîíòàêò èëè «çàìóðîâàííóþ» ëîãèêó; ïðè ðàçðàáîòêå WDF ìîæíî çàäàòü òèï ëîãèêè, êîòîðàÿ äåëàåò êàæäûé óçåë êîíòàêòîì, ïðè÷åì âõîäíûì, ðåãèñòðîâûì, êîìáèíàòîðíûì èëè öèôðîâûì àâòîìàòîì; ìîæíî òàêæå çàäàòü çíà÷åíèÿ ïî óìîë÷àíèþ â ëîãè÷åñêîì óçëå äëÿ àêòèâíîãî ëîãè÷åñêîãî óðîâíÿ: âûñîêèé ("1"), íåîïðåäåëåííûé (Õ) èëè ñ âûñîêèì èìïåäàíñîì (Z), à òàêæå èìÿ ñîñòîÿíèÿ ïî óìîë÷àíèþ â óçëå òèïà öèôðîâîãî àâòîìàòà; äëÿ óïðîùåíèÿ ñîçäàíèÿ òåñòîâîãî âåêòîðà ìîæíî ëåãêî äîáàâèòü â ôàéë òåñòèðóåìûõ êàíàëîâ SCF íåñêîëüêî óçëîâ èëè âñå èç èíôîðìàöèîííîãî ôàéëà ñèìóëÿòîðà (.snf), ñóùåñòâóþùåãî äëÿ ïîëíîñòüþ îòêîìïèëèðîâàííîãî è îïòèìèçèðîâàííîãî ïðîåêòà; ìîæíî îáúåäèíèòü îò 2 äî 256 óçëîâ äëÿ ñîçäàíèÿ íîâîé ãðóïïû (øèíû) èëè ðàçãðóïïèðîâàòü îáúåäèíåííûå ðàíåå â ãðóïïó óçëû. Ìîæíî òàêæå îáúåäèíÿòü ãðóïïû ñ äðóãèìè ãðóïïàìè. Çíà÷åíèå ãðóïïû ìîæåò áûòü îòîáðàæåíî â äâîè÷íîé, äåñÿòè÷íîé, øåñòíàäöàòåðè÷íîé èëè âîñüìåðè÷íîé ñèñòåìå ñ÷èñëåíèÿ ñ ïðåîáðàçîâàíèåì (èëè áåç) â êîä Ãðýÿ; ìîæíî êîïèðîâàòü, âêëåèâàòü, ïåðåìåùàòü èëè óäàëÿòü âûáðàííóþ ÷àñòü («èíòåðâàë») ôîðìû ñèãíàëà èëè âñþ ôîðìó ñèãíàëà, à òàêæå âåñü óçåë èëè ãðóïïó (ò.å. èìÿ óçëà èëè ãðóïïû ïëþñ ôîðìà ñèãíàëà). Îäíîé îïåðàöèåé ìîæíî îòðåäàêòèðîâàòü íåñêîëüêî èíòåðâàëîâ, öåëûå ôîðìû ñèãíàëîâ, à òàêæå öåëûå óçëû è ãðóïïû. Kîïèè öåëûõ óçëîâ è ãðóïï ñâÿçàíû, òàê ÷òî ðåäàêöèîííûå ïðàâêè îäíîé êîïèè îòðàæàþòñÿ âî âñåõ êîïèÿõ. Ìîæíî òàêæå èíâåðòèðîâàòü, âñòàâëÿòü, ïåðåïèñûâàòü, ïîâòîðÿòü, ðàñøèðÿòü èëè ñæèìàòü èíòåðâàë ôîðìû ñèãíàëà ëþáîé äëèíû ñ ëþáûì ëîãè÷åñêèì óðîâíåì, òàêòîâûì ñèãíàëîì, ïîñëåäîâàòåëüíîñòüþ ñ÷åòà èëè èìåíåì ñîñòîÿíèÿ; ìîæíî çàäàòü è, ïî æåëàíèþ, îòîáðàæàòü íà ýêðàíå ñåòêó äëÿ âûðàâíèâàíèÿ ïåðåõîäîâ ìåæäó ëîãè÷åñêèìè óðîâíÿìè ëèáî äî èõ ñîçäàíèÿ, ëèáî ïîñëå; â ëþáîì ìåñòå ôàéëà ìîæíî ââîäèòü êîììåíòàðèè ìåæäó ôîðìàìè ñèãíàëà; ìîæíî ìåíÿòü ìàñøòàá îòîáðàæåíèÿ;
146
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II äëÿ òîãî, ÷òîáû ïîêàçàòü ðàçíèöó ìåæäó âûõîäàìè ïðè òåñòèðîâàíèè è âûõîäàìè ðåàëüíîãî óñòðîéñòâà, ìîæíî ñäåëàòü íàëîæåíèå ëþáûõ âûõîäîâ â òåêóùåì ôàéëå èëè íàëîæèòü âòîðîé ôàéë ñèãíàëüíîãî ðåäàêòîðà äëÿ ñðàâíåíèÿ ôîðì ñèãíàëîâ åãî óçëîâ è ãðóïï ñ ñîîòâåòñòâóþùèìè èì èç òåêóùåãî ôàéëà. Äëÿ îòëàäêè óñòðîéñòâ ÖÎÑ ÷àñòî ïðèõîäèòñÿ òåñòèðîâàòü àëãîðèòì íà ðåàëüíûõ èëè ñìîäåëèðîâàííûõ ñèãíàëàõ. Äëÿ ýòîãî óäîáíî èñïîëüçîâàòü âåêòîðíûé ñèãíàëüíûé ôàéë (Vector File). Vector File (ôîðìàò òåêñòà ASCII) èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ âõîäíûõ óñëîâèé ìîäåëèðîâàíèÿ è óçëîâ, êîòîðûå íóæíî ìîäåëèðîâàòü. Vector File ìîæåò òàêæå èñïîëüçîâàòüñÿ, ÷òîáû ñîçäàòü Waveform Design File äëÿ âõîäíûõ äàííûõ ïðîåêòà. Ðàññìîòðèì ôîðìàò âåêòîðíîãî ôàéëà ïîäðîáíåå. Âñå ðàçäåëû, èñïîëüçóåìûå â Vector File, ðàññìàòðèâàþòñÿ íèæå â òîì ïîðÿäêå, â êîòîðîì îíè îáû÷íî ïðèñóòñòâóþò â ôàéëå. Âîçìîæíî ïîâòîðåíèå ëþáîãî ðàçäåëà ñ öåëüþ âíåñåíèÿ äîïîëíèòåëüíûõ óñëîâèé äëÿ âõîäíûõ äàííûõ â ïðåäåëàõ îäíîãî Vector File. Unit Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà UNIT ñ äàëüíåéøèì óêàçàíèåì åäèíèö èçìåðåíèÿ â ôàéëå. Ïàðàìåòð íåîáÿçàòåëüíûé. Ïî óìîë÷àíèþ åäèíèöû èçìåðåíèÿ ns. Âîçìîæíûå åäèíèöû èçìåðåíèÿ: ns (íc), ms (ìñ), us (ìêñ), s (ñ), mhz (ÌÃö). Ðàçäåë çàêàí÷èâàåòñÿ ñèìâîëîì «;». Ïðèìåð: UNIT ms; Start Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà START ñ ïîñëåäóþùèì óêàçàíèåì íà÷àëüíîãî âðåìåííîãî çíà÷åíèÿ. Ïàðàìåòð íåîáÿçàòåëüíûé. Çíà÷åíèå ïî óìîë÷àíèþ íóëåâîå. Åñëè íå óêàçàíû åäèíèöû èçìåðåíèÿ, òî îíè ïðèíèìàþòñÿ èç ðàçäåëà Unit Section. Ðàçäåë çàêàí÷èâàåòñÿ ñèìâîëîì «;». Ïðèìåð: START 5ns; Stop Section Àíàëîãè÷åí ðàçäåëó Start Section. Ïî óìîë÷àíèþ ïðèíèìàåòñÿ çíà÷åíèå âðåìåíè ïîñëåäíåãî âåêòîðà ìîäåëè. Ïðèìåð: STOP 150ms; Íåîáõîäèìî ó÷èòûâàòü, ÷òî Vector File äîëæåí ñîäåðæàòü êðàòíîå êîëè÷åñòâî Start-Stop Section, ïðåäñòàâëÿþùèõ ñîáîé âðåìåííûå èíòåðâàëû. Íåäîïóñòèìî îáðàùåíèå ê îäíîìó âðåìåííîìó èíòåðâàëó ðàçëè÷íûõ âåêòîðîâ ìîäåëè.
147
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Interval Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà INTERVAL ñ ïîñëåäóþùèì óêàçàíèåì âðåìåííîãî çíà÷åíèÿ. Îïðåäåëÿåò âðåìåííîé èíòåðâàë ââîäà âåêòîðîâ. Ïàðàìåòð íåîáÿçàòåëüíûé. Çíà÷åíèå ïî óìîë÷àíèþ 1 íñ. Ðàçäåë çàêàí÷èâàåòñÿ ñèìâîëîì «;». Ïðèìåð: INTERVAL 15ns; Group Create Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà GROUP CREATE. Äàííûé ðàçäåë òðåáóåòñÿ íå âñåãäà äëÿ ãðóïï, øèí èëè êîíå÷íûõ àâòîìàòîâ, êîòîðûå áûëè ñîçäàíû â èñõîäíûõ ôàéëàõ ïðîåêòà. Âñå óçëû â ãðóïïå äîëæíû èìåòü òèï I/O.  Vector File, èñïîëüçóåìîì äëÿ ñèìóëÿöèè, óçëû äîëæíû èìåòü èìåíà, ñîâïàäàþùèå ñ èìåíàìè óçëîâ, çàâåäåííûìè â ôàéë-ïðîåêòå, âêëþ÷àÿ èåðàðõè÷åñêèé ïóòü, åñëè ýòî íåîáõîäèìî. Ðàçäåë çàêàí÷èâàåòñÿ ñèìâîëîì «;». Ïðèìåð: GROUP CREATE groupABC = nodeA nodeB nodeC; Radix Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà RADIX ñ ïîñëåäóþùèì óêàçàíèåì îáîçíà÷åíèÿ ñèñòåìû ñ÷èñëåíèÿ. Ïàðàìåòð íåîáÿçàòåëüíûé. Ïî óìîë÷àíèþ ïðèíèìàåòñÿ øåñòíàäöàòåðè÷íàÿ ñèñòåìà ñ÷èñëåíèÿ. Ðàçëè÷àþò ÷åòûðå ñèñòåìû: BIN (äâîè÷íàÿ), DEC (äåñÿòè÷íàÿ), HEX (øåñòíàäöàòåðè÷íàÿ), OCT (âîñüìåðè÷íàÿ). Ðàçäåë çàêàí÷èâàåòñÿ ñèìâîëîì «;». Ïðèìåð: RADIX DEC; Inputs Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà INPUTS. Äàëåå ñëåäóåò ñïèñîê óçëîâ è/èëè èìåí ãðóïï.  Vector File, èñïîëüçóåìîì äëÿ ñèìóëÿöèè, èìåíà óçëîâ äîëæíû ñîâïàäàòü ñ èìåíàìè óçëîâ â ôàéëå-ïðîåêòå, âêëþ÷àÿ èåðàðõè÷åñêèé ïóòü, åñëè ýòî íåîáõîäèìî. Ðàçäåë çàêàí÷èâàåòñÿ ñèìâîëîì «;». Ïðèìåð: INPUT databus clk OEN nodeA;  ïðèâåäåííîì íèæå ïðèìåðå ïðè çàäåéñòâîâàíèè ñëåäóþùåé ñåêöèè âõîäíûõ äàííûõ çíà÷åíèÿ â ïðåäûäóùåé ñåêöèè òåðÿþòñÿ. Ïðèìåð: INPUTS A1 A2; START 0; STOP 25; PATTERN %Секция модели 1 с входами А1 и А2% 0 0 0 0 0 1;
148
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
START 26; STOP 50; PATTERN %Секция модели 2 с входами А1 и А2% 0 1 0 1 0 0; INPUTS A1 B1; START 51; STOP 100; PATTERN %Секция модели 3 с входами А1 и В1% 1 1 0 0 1 1; Outputs Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà OUTPUTS. Èñïîëüçóåòñÿ äëÿ îïèñàíèÿ âûõîäîâ. Àíàëîãèÿ ñ Inputs Section. Ïðèìåð: OUTPUTS RCO QA QB QC; Ïðèìåð: OUTPUTS A1 A2; START 0; STOP 25; PATTERN %Секция модели 1 с выходами А1 и А2% 0 0 0 0 0 1; START 26; STOP 50; PATTERN %Секция модели 2 с выходами А1 и А2% 0 1 0 1 0 0; OUTPUTS A1 B1;
149
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
START 51; STOP 100; PATTERN %Секция модели 3 с выходами А1 и В1% 1 1 0 0 1 1; Buried Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà BURIED. Èñïîëüçóåòñÿ äëÿ îïèñàíèÿ óçëîâ. Àíàëîãèÿ ñ Inputs Section. Ïðèìåð: BURIED nodeQA0 nodeQA1 nodeQB0 nodeQB1; Pattern Section Íà÷èíàåòñÿ ñ êëþ÷åâîãî ñëîâà PATTERN.  ýòîì ðàçäåëå èñïîëüçóþòñÿ äàííûå ïðåäûäóùèõ ðàçäåëîâ Inputs, Outputs è Buried Section. Äîáàâëåíèå íîâûõ Inputs, Outputs è Buried Section î÷èùàåò âñå ïðåäûäóùèå äàííûå ýòèõ òèïîâ, ò.å. ñòàðûå äàííûå çàìåíÿþòñÿ íîâûìè (ñì. ïðèìåð äëÿ Inputs Section). Ðàçäåë çàêàí÷èâàåòñÿ ñèìâîëîì «;». Vector File, èñïîëüçóåìûé, ÷òîáû ñîçäàòü WDF, ìîæåò ñîäåðæàòü äîïîëíèòåëüíûå ðàçäåëû Combinatorial Section, Machine Section, Registered Section. Ýòè ðàçäåëû èãíîðèðóþòñÿ, åñëè Vector File èñïîëüçóåòñÿ äëÿ ìîäåëèðîâàíèÿ. Ðàññìîòðèì ïðèìåð ñîçäàíèÿ Vector File äëÿ âîñüìèáèòíîãî ñóììàòîðà. Îïèñàíèå íà ÿçûêå AHDL. Ïðèìåð ïðîãðàììû sum8_.tdf: SUBDESIGN SUM8_ %8 разрядный сумматор без знака% ( clk:INPUT; a[7..0]:INPUT = GND; b[7..0]:INPUT = GND; sum[7..0]:OUTPUT; cr:OUTPUT; ) VARIABLE c[7..1]:NODE;
150
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II sum[7..0]:DFF; cr:DFF; BEGIN sum[7..0].clk=clk; sum[7..0].prn=VCC; sum[7..0].clrn=VCC; cr.clk=clk; cr.prn=VCC; cr.clrn=VCC;
If (a[0]&b[0])==VCC then sum[0]=GND; c[1]=VCC; ElsIf (a[0]#b[0])==GND then sum[0]=GND; c[1]=GND; Else sum[0]=VCC; c[1]=GND; End If; %% FOR i IN 1 TO 6 GENERATE If (a[i]&b[i]&c[i])==VCC then sum[i]=VCC; c[i+1]=VCC; ElsIf (a[i]#b[i]#c[i])==GND then sum[i]=GND; c[i+1]=GND; ElsIf (((a[i]&b[i])#(a[i]&c[i])#(b[i]&c[i]))&!(a[i]&b[i]&c[ i]))==VCC then sum[i]=GND; c[i+1]=VCC; Else sum[i]=VCC; c[i+1]=GND;
151
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II End If; END GENERATE; %% If (a[7]&b[7]&c[7])==VCC then sum[7]=VCC; cr=VCC; ElsIf (a[7]#b[7]#c[7])==GND then sum[7]=GND; cr=GND; ElsIf (((a[7]&b[7])#(a[7]&c[7])#(b[7]&c[7]))&!(a[7]&b[7]&c[ 7]))==VCC then sum[7]=GND; cr=VCC; Else sum[7]=VCC; cr=GND; End If; END; Ïðèìåð ïðîãðàììû sum8_.vec: START 0; STOP 500; INTERVAL 25; RADIX BIN; INPUTS clk; PATTERN 0 1; START 0; STOP 500; INTERVAL 50; RADIX BIN; INPUTS a7 a6 a5 a4 a3 a2 a1 a0 b7 b6 b5 b4 b3 b2 b1 b0;
152
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II OUTPUTS PATTERN %a7 a6 a5 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0
sum[7..0] cr; a4 0 1 0 1 1 0
a3 0 0 0 1 1 0
a2 0 0 0 1 1 0
a1 0 0 0 0 1 0
a0 1 0 0 0 1 0
b7 0 0 1 1 1 0
b6 0 0 1 0 1 0
b5 0 0 0 1 1 0
b4 0 0 0 1 1 0
b3 0 1 1 0 1 0
b2 b1 b0% 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0;
 äàííîì ïðèìåðå áóäóò ñëîæåíû 6 ïàð äâîè÷íûõ ÷èñåë. Ïðè ýòîì áóäåò çàäàí òàêòèðóþùèé ìåàíäð clk (òàêòèðóþùèé èìïóëüñ äëÿ D-òðèããåðîâ) ñ ïåðèîäîì ïîâòîðåíèÿ 50 íñ è ñêâàæíîñòüþ 2. Íà÷àëüíûì çíà÷åíèåì èìïóëüñà áóäåò 0. Ïðåîáðàçîâàíèå áóäåò ïðîâîäèòüñÿ îò 0 äî 500 íñ. Ïðè íà÷àëå ñèìóëÿöèè íåîáõîäèìî îòñóòñòâèå â ðàáî÷åé äèðåêòîðèè ñîîòâåòñòâóþùåãî ôàéëà sum8_.scf, òàê êàê èíà÷å ñèìóëÿòîð áóäåò ïî óìîë÷àíèþ èñïîëüçîâàòü ôàéë íå ñ ðàñøèðåíèåì .vec, à ôàéë ñ ðàñøèðåíèåì .scf. Ïîñëå ïðîöåññà ñèìóëÿöèè ñ èñïîëüçîâàíèåì .vec ôàéëà ôàéë ñ ðàñøèðåíèåì .scf áóäåò ñîçäàí àâòîìàòè÷åñêè. Íà Ðèñ. 2.25 ïîêàçàíî îêíî ïîóðîâíåâîãî ïëàíèðîâùèêà (Floorplan Editor), ñ ïîìîùüþ êîòîðîãî ïîëüçîâàòåëü íàçíà÷àåò ðåñóðñû ôèçè÷åñêèõ óñòðîéñòâ è ïðîñìàòðèâàåò ðåçóëüòàòû ðàçâåòâëåíèé è ìîíòàæà, ñäåëàííûõ êîìïèëÿòîðîì. Îêíî ïîóðîâíåâîãî ïëàíèðîâùèêà îòêðûâàåòñÿ ïðè âûáîðå îïöèè Floorplan Editor â ìåíþ MAX+PLUS II.  îêíå ïîóðîâíåâîãî ïëàíèðîâùèêà ìîãóò áûòü ïðåäñòàâëåíû äâà òèïà èçîáðàæåíèÿ: Device View (âèä óñòðîéñòâà) ïîêàçûâàåò âñå âûâîäû óñòðîéñòâà â ñáîðêå è èõ ôóíêöèè; LAB View (âèä ëîãè÷åñêîãî áëîêà) ïîêàçûâàåò âíóòðåííþþ ñòðóêòóðó óñòðîéñòâà, â òîì ÷èñëå âñå ëîãè÷åñêèå áëîêè è îòäåëüíûå ëîãè÷åñêèå ýëåìåíòû èëè ìàêðîÿ÷åéêè.
153
AL2122
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.25. Ïîóðîâíåâûé ïëàíèðîâùèê MAX+PLUS II
2.4. Ïðîöåññ êîìïèëÿöèè Ñíà÷àëà êîìïèëÿòîð èçâëåêàåò èíôîðìàöèþ îá èåðàðõè÷åñêèõ ñâÿçÿõ ìåæäó ôàéëàìè ïðîåêòà è ïðîâåðÿåò ïðîåêò íà ïðîñòûå îøèáêè ââîäà äèçàéíîâ. Îí ñîçäàåò îðãàíèçàöèîííóþ êàðòó ïðîåêòà è çàòåì, êîìáèíèðóÿ âñå ôàéëû ïðîåêòà, ïðåâðàùàåò èõ â áàçó äàííûõ áåç èåðàðõèè, êîòîðóþ ìîæåò ýôôåêòèâíî îáðàáàòûâàòü. Kîìïèëÿòîð ïðèìåíÿåò ðàçíîîáðàçíûå ñïîñîáû óâåëè÷åíèÿ ýôôåêòèâíîñòè ïðîåêòà è ìèíèìèçàöèè èñïîëüçîâàíèÿ ðåñóðñîâ óñòðîéñòâà. Åñëè ïðîåêò ñëèøêîì áîëüøîé, ÷òîáû áûòü ðåàëèçîâàííûì â îäíîé ÏËÈÑ, êîìïèëÿòîð ìîæåò àâòîìàòè÷åñêè ðàçáèòü åãî íà ÷àñòè äëÿ ðåàëèçàöèè â íåñêîëüêèõ óñòðîéñòâàõ òîãî æå ñàìîãî ñåìåéñòâà ÏËÈÑ, ïðè ýòîì ìèíèìèçèðóåòñÿ ÷èñëî ñîåäèíåíèé ìåæäó óñòðîéñòâàìè.  ôàéëå îò÷åòà (.rpt) çàòåì áóäåò îòðàæåíî, êàê ïðîåêò áóäåò ðåàëèçîâàí â îäíîì èëè íåñêîëüêèõ óñòðîéñòâàõ. Kðîìå òîãî, êîìïèëÿòîð ñîçäàåò ôàéëû ïðîãðàììèðîâàíèÿ èëè çàãðóçêè, êîòîðûå ïðîãðàììàòîð ñèñòåìû MAX+PLUS II èëè äðóãîé ñèñòåìû áó-
154
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
AL2123
äåò èñïîëüçîâàòü äëÿ ïðîãðàììèðîâàíèÿ îäíîé èëè íåñêîëüêèõ ÏËÈÑ ôèðìû «Altera». Íåñìîòðÿ íà òî ÷òî êîìïèëÿòîð ìîæåò àâòîìàòè÷åñêè êîìïèëèðîâàòü ïðîåêò, ñóùåñòâóåò âîçìîæíîñòü çàäàòü îáðàáîòêó ïðîåêòà â ñîîòâåòñòâèè ñ òî÷íûìè óêàçàíèÿìè ðàçðàáîò÷èêà. Íàïðèìåð âîçìîæíî çàäàòü ñòèëü ëîãè÷åñêîãî ñèíòåçà ïðîåêòà ïî óìîë÷àíèþ è äðóãèå ïàðàìåòðû ëîãè÷åñêîãî ñèíòåçà â ðàìêàõ âñåãî ïðîåêòà. Kðîìå òîãî, óäîáíî çàäàòü âðåìåííûå òðåáîâàíèÿ â ðàìêàõ âñåãî ïðîåêòà, òî÷íî çàäàòü ðàçáèåíèå áîëüøîãî ïðîåêòà íà ÷àñòè äëÿ ðåàëèçàöèè â íåñêîëüêèõ óñòðîéñòâàõ è âûáðàòü âàðèàíòû ïàðàìåòðîâ óñòðîéñòâ, êîòîðûå áóäóò ïðèìåíåíû äëÿ âñåãî ïðîåêòà â öåëîì. Âû ìîæåòå òàêæå âûáðàòü, ñêîëüêî âûâîäîâ è ëîãè÷åñêèõ ýëåìåíòîâ äîëæíî áûòü îñòàâëåíî íåèñïîëüçîâàííûìè âî âðåìÿ òåêóùåé êîìïèëÿöèè, ÷òîáû çàðåçåðâèðîâàòü èõ äëÿ ïîñëåäóþùèõ ìîäèôèêàöèé ïðîåêòà. Kîìïèëÿöèþ ìîæíî çàïóñòèòü èç ëþáîãî ïðèëîæåíèÿ MAX+PLUS II èëè èç îêíà êîìïèëÿòîðà. Kîìïèëÿòîð àâòîìàòè÷åñêè îáðàáàòûâàåò âñå âõîäíûå ôàéëû òåêóùåãî ïðîåêòà. Ïðîöåññ êîìïèëÿöèè ìîæíî íàáëþäàòü â îêíå êîìïèëÿòîðà â ñëåäóþùåì âèäå (Ðèñ. 2.26): îïóñòîøàþòñÿ è ïåðåâîðà÷èâàþòñÿ ïåñî÷íûå ÷àñû, ÷òî óêàçûâàåò íà àêòèâíîñòü êîìïèëÿòîðà; âûñâå÷èâàþòñÿ ïðÿìîóãîëüíèêè ìîäóëåé êîìïèëÿòîðà ïî î÷åðåäè, ïî ìåðå òîãî êàê êîìïèëÿòîð çàâåðøàåò êàæäûé ýòàï îáðàáîòêè; ïîä ïðÿìîóãîëüíèêîì ìîäóëÿ êîìïèëÿòîðà ïîÿâëÿåòñÿ ïèêòîãðàììà âûõîäíîãî ôàéëà, ñãåíåðèðîâàííîãî äàííûì ìîäóëåì. Äëÿ îòêðûòèÿ ñîîòâåòñòâóþùåãî ôàéëà ñëåäóåò äâàæäû ùåëêíóòü ëåâîé êíîïêîé ìûøè íà ïèêòîãðàììå, è îí îòêðîåòñÿ; ïðîöåíò çàâåðøåíèÿ êîìïèëÿöèè ïîñòåïåííî óâåëè÷èâàåòñÿ (äî 100%), ÷òî îòðàæàåòñÿ òàêæå ðàñòóùèì ïðÿìîóãîëüíèêîì («ãðàäóñíèê»);
Ðèñ. 2.26. Ïðîöåññ êîìïèëÿöèè
155
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II âî âðåìÿ ðàçáèåíèÿ è ìîíòàæà êíîïêà êîìïèëÿòîðà Stop (ñòîï) ïðåâðàùàåòñÿ â êíîïêó Stop/Show Status (ñòîï/ïîêàçàòü ñîñòîÿíèå), êîòîðóþ âû ìîæåòå âûáðàòü äëÿ îòêðûòèÿ äèàëîãîâîãî îêíà, â êîòîðîì îòðàæàåòñÿ òåêóùåå ñîñòîÿíèå ðàçáèåíèÿ è ìîíòàæà ïðîåêòà; ïðè îáíàðóæåíèè â ïðîöåññå êîìïèëÿöèè êàêèõ-ëèáî îøèáîê èëè âîçìîæíûõ ïðîáëåì àâòîìàòè÷åñêè îòêðûâàåòñÿ îêíî îáðàáîò÷èêà ñîîáùåíèé, â êîòîðîì îòîáðàæàåòñÿ ñïèñîê ñîîáùåíèé îá îøèáêå, ïðåäóïðåæäàþùèõ è èíôîðìàöèîííûõ ñîîáùåíèé, à òàêæå ñðàçó äàåòñÿ ñïðàâêà ïî èñïðàâëåíèþ îøèáêè. Kðîìå òîãî, âû ìîæåòå îïðåäåëèòü èñòî÷íèêè ñîîáùåíèé â ôàéëàõ ïðîåêòà èëè â åãî ïîóðîâíåâîì ïëàíå íàçíà÷åíèé. Kîìïèëÿòîð ìîæåò ðàáîòàòü â ôîíîâîì ðåæèìå. Âû ìîæåòå óìåíüøèòü äî ìèíèìóìà îêíî êîìïèëÿòîðà, ïîêà îí îáðàáàòûâàåò ïðîåêò, è ïðîäîëæèòü ðàáîòó íàä äðóãèìè ôàéëàìè ïðîåêòà. Ðàñòóùèé ïðÿìîóãîëüíèê («ãðàäóñíèê») ïîä ïèêòîãðàììîé óìåíüøåííîãî îêíà êîìïèëÿòîðà ïîçâîëÿåò âàì íàáëþäàòü çà ïðîäâèæåíèåì ïðîöåññà êîìïèëÿöèè, è â òî æå âðåìÿ âû ìîæåòå ñîñðåäîòî÷èòü ñâîå âíèìàíèå íà äðóãîé çàäà÷å. Îäíàêî ñëåäóåò ïîìíèòü, ÷òî òàêàÿ ðîñêîøü, êàê ìíîãîçàäà÷íàÿ ðàáîòà, âîçìîæíà òîëüêî íà âûñîêîïðîèçâîäèòåëüíîì ÏÊ. Åñëè ñóùåñòâóåò äåôèöèò îïåðàòèâíîé ïàìÿòè, òî ïðîöåññ êîìïèëÿöèè çàéìåò ìíîãî âðåìåíè. Ðåêîìåíäóåìàÿ êîíôèãóðàöèÿ ÏÊ äàíà â ðàçäåëå 2.1. Kîìïèëÿòîð ñèñòåìû MAX+PLUS II îáðàáàòûâàåò ïðîåêò, èñïîëüçóÿ ñëåäóþùèå ìîäóëè è óòèëèòû: Compiler Netlist Extractor (ýêñòðàêòîð ôîðìàòîâ), âêëþ÷àþùèé âñòðîåííûå ïðîãðàììû ÷òåíèÿ ôîðìàòîâ EDIF, VHDL, Verilog è XNF; Database Builder (ïîñòðîèòåëü áàçû äàííûõ); Logic Synthesizer (ëîãè÷åñêèé ñèíòåçàòîð); Partitioner (ðàçäåëèòåëü); Fitter (òðàññèðîâùèê); Functional SNF Extractor (ýêñòðàêòîð äëÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ); Timing SNF Extractor (ýêñòðàêòîð äëÿ òåñòèðîâàíèÿ âðåìåííûõ ïàðàìåòðîâ); Linked SNF Extractor (ýêñòðàêòîð äëÿ òåñòèðîâàíèÿ êîìïîíîâêè); EDIF Netlist Writer (ïðîãðàììà çàïèñè âûõîäíîãî ôàéëà â ôîðìàò EDIF); Verilog Netlist Writer (ïðîãðàììà çàïèñè âûõîäíîãî ôàéëà â ôîðìàò Verilog); VHDL Netlist Writer VHDL (ïðîãðàììà çàïèñè âûõîäíîãî ôàéëà â ôîðìàò VHDL);
156
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Assembler (ìîäóëü àññåìáëåðà); Design Doctor Utility (óòèëèòà äèàãíîñòèêè ïðîåêòà). Ìîäóëü Compiler Netlist Extractor ïðåîáðàçóåò êàæäûé ôàéë ïðîåêòà â îäèí èëè íåñêîëüêî äâîè÷íûõ ôàéëîâ ñ ðàñøèðåíèåì .cnf. (compiler netlist file). Ïîñêîëüêó êîìïèëÿòîð ïîäñòàâëÿåò çíà÷åíèÿ âñåõ ïàðàìåòðîâ, èñïîëüçóåìûõ â ïàðàìåòðèçîâàííûõ ôóíêöèÿõ, ñîäåðæèìîå ôàéëà CNF ìîæåò ìåíÿòüñÿ ïðè ïîñëåäîâàòåëüíîé êîìïèëÿöèè, åñëè çíà÷åíèÿ ïàðàìåòðîâ ìåíÿþòñÿ. Äàííûé ìîäóëü ñîçäàåò òàêæå ôàéë èåðàðõè÷åñêèõ âçàèìîñâÿçåé (.hif, hierarchy interconnect file), â êîòîðîì äîêóìåíòèðóþòñÿ èåðàðõè÷åñêèå ñâÿçè ìåæäó ôàéëàìè ïðîåêòà, à òàêæå ñîäåðæèòñÿ èíôîðìàöèÿ, íåîáõîäèìàÿ äëÿ ïîêàçà èåðàðõè÷åñêîãî äåðåâà ïðîåêòà â îêíå Hierarchy Display. Kðîìå òîãî, äàííûé ìîäóëü ñîçäàåò ôàéë áàçû äàííûõ óçëîâ (.ndb, node database), â êîòîðîì ñîäåðæàòñÿ èìåíà óçëîâ ïðîåêòà äëÿ áàçû äàííûõ íàçíà÷åíèé ðåñóðñîâ. Âñòðîåííûå ïðîãðàììû ÷òåíèÿ ôîðìàòîâ EDIF, VHDL, Verilog è XNF àâòîìàòè÷åñêè òðàíñëèðóþò èíôîðìàöèþ ïðîåêòà â ôàéëû ñîîòâåòñòâóþùèõ ôîðìàòîâ .edf, .vhd, .v, .xnf â ôîðìàò, ñîâìåñòèìûé ñ ñèñòåìîé MAX+PLUS II. Ïðîãðàììà ÷òåíèÿ ôîðìàòà EDIF îáðàáàòûâàåò âõîäíûå ôàéëû EDIF ñ ïîìîùüþ áèáëèîòå÷íûõ ôàéëîâ (.lmf, library mapping file), êîòîðûå óñòàíàâëèâàþò ñîîòâåòñòâèå ìåæäó ëîãè÷åñêèìè ôóíêöèÿìè, ðàçðàáîòàííûìè â äðóãèõ ÑÀÏÐ, è ôóíêöèÿìè ñèñòåìû MAX+PLUS II. Ïðîãðàììà ÷òåíèÿ ôîðìàòà XNF ìîæåò ñîçäàâàòü ôàéë äëÿ ýêñïîðòà òåêñòîâîãî äèçàéíà (.tdx, text design export file), êîòîðûé ñîäåðæèò èíôîðìàöèþ íà ÿçûêå AHDL, êîòîðàÿ ýêâèâàëåíòíà òîé, ÷òî ñîäåðæèòñÿ â ôàéëå ôîðìàòà XNF (.xnf). Ýòî äåëàåòñÿ äëÿ òîãî, ÷òîáû ðåäàêòèðîâàòü ïðîåêò íà ÿçûêå AHDL. Ìîäóëü Database Builder èñïîëüçóåò ôàéë èåðàðõè÷åñêèõ ñâÿçåé HIF äëÿ êîìïîíîâêè ñîçäàííûõ êîìïèëÿòîðîì ôàéëîâ CNF, â êîòîðûõ ñîäåðæèòñÿ îïèñàíèå ïðîåêòà. Íà îñíîâàíèè äàííûõ îá èåðàðõè÷åñêîé ñòðóêòóðå ïðîåêòà äàííûé ìîäóëü êîïèðóåò êàæäûé ôàéë CNF â îäíó áàçó äàííûõ áåç èåðàðõè÷åñêîé ñòðóêòóðû. Òàêèì îáðàçîì, ýòà áàçà äàííûõ ñîõðàíÿåò ýëåêòðè÷åñêóþ ñâÿçíîñòü ïðîåêòà. Ïðè ñîçäàíèè áàçû äàííûõ ìîäóëü èññëåäóåò ëîãè÷åñêóþ ïîëíîòó è ñîãëàñîâàííîñòü ïðîåêòà, à òàêæå ïðîâåðÿåò ïîãðàíè÷íóþ ñâÿçíîñòü è íàëè÷èå ñèíòàêñè÷åñêèõ îøèáîê (íàïðèìåð óçåë áåç èñòî÷íèêà èëè ìåñòà íàçíà÷åíèÿ). Íà ýòîé ñòàäèè êîìïèëÿöèè îáíàðóæèâàåòñÿ áîëüøèíñòâî îøèáîê, êîòîðûå ìîãóò áûòü òóò æå ëåãêî èñïðàâëåíû. Kàæäûé ìîäóëü êîìïèëÿòîðà ïîñëåäîâàòåëüíî îáðàáàòûâàåò è îáíîâëÿåò ýòó áàçó äàííûõ.
157
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Ïåðâûé ðàç, êîãäà êîìïèëÿòîð îáðàáàòûâàåò ïðîåêò, âñå ôàéëû ïðîåêòà êîìïèëèðóþòñÿ. Âû ìîæåòå èñïîëüçîâàòü âîçìîæíîñòü «áûñòðîé ïîâòîðíîé êîìïèëÿöèè» (smart recompile) äëÿ ñîçäàíèÿ ðàñøèðåííîé áàçû äàííûõ ïðîåêòà, êîòîðàÿ ïîìîãàåò óñêîðèòü ïîñëåäóþùèå êîìïèëÿöèè. Ýòà áàçà äàííûõ ïîçâîëÿåò âàì èçìåíèòü íàçíà÷åíèÿ ðåñóðñîâ ôèçè÷åñêîãî óñòðîéñòâà, òàêèå êàê íàçíà÷åíèÿ âûâîäîâ è ëîãè÷åñêèõ ýëåìåíòîâ, à òàêæå ïîâòîðíî êîìïèëèðîâàòü ïðîåêò áåç ïîâòîðíîãî ïîñòðîåíèÿ áàçû äàííûõ è ïîâòîðíîãî ñèíòåçà ëîãèêè ïðîåêòà. Èñïîëüçóÿ âîçìîæíîñòü «ïîëíîé ïîâòîðíîé êîìïèëÿöèè» (total recompile), âîçìîæíî ñäåëàòü âûáîð ìåæäó ïîâòîðíîé êîìïèëÿöèåé òîëüêî òåõ ôàéëîâ, êîòîðûå ðåäàêòèðîâàëèñü ïîñëå ïîñëåäíåé êîìïèëÿöèè, è ïîëíîé ïîâòîðíîé êîìïèëÿöèåé âñåãî ïðîåêòà. Ìîäóëü Logic Synthesizer ïðèìåíÿåò ðÿä àëãîðèòìîâ, êîòîðûå óìåíüøàþò èñïîëüçîâàíèå ðåñóðñîâ è óáèðàþò äóáëèðîâàííóþ ëîãèêó, îáåñïå÷èâàÿ òåì ñàìûì ìàêñèìàëüíî ýôôåêòèâíîå èñïîëüçîâàíèå ñòðóêòóðû ëîãè÷åñêîãî ýëåìåíòà äëÿ àðõèòåêòóðû öåëåâîãî ñåìåéñòâà óñòðîéñòâ. Äàííûé ìîäóëü êîìïèëÿòîðà ïðèìåíÿåò òàêæå ñïîñîáû ëîãè÷åñêîãî ñèíòåçà äëÿ òðåáîâàíèé ïîëüçîâàòåëÿ ïî âðåìåííûì ïàðàìåòðàì è äð. Kðîìå òîãî, ëîãè÷åñêèé ñèíòåçàòîð èùåò ëîãèêó äëÿ íåñîåäèíåííûõ óçëîâ. Åñëè íàõîäèò íåïðèñîåäèíåííûé óçåë, îí óáèðàåò ïðèìèòèâû, îòíîñÿùèåñÿ ê ýòîìó óçëó. Äëÿ óïðàâëåíèÿ ëîãè÷åñêèì ñèíòåçîì èìåþòñÿ òðè çàðàíåå îïèñàííûõ ñòèëÿ è áîëüøîå ÷èñëî ëîãè÷åñêèõ îïöèé.  ëþáîì ïðèëîæåíèè MAX+PLUS II ìîæíî ââåñòè çíà÷åíèÿ âðåìåííûõ ïàðàìåòðîâ ïðîåêòà è âûáðàòü ëîãè÷åñêèå îïöèè, à òàêæå îïðåäåëèòü ñòèëè ëîãè÷åñêîãî ñèíòåçà. Âû ìîæåòå çàäàòü ãëîáàëüíûé ëîãè÷åñêèé ñèíòåç ïî óìîë÷àíèþ è âðåìåííûå ïàðàìåòðû ïðîåêòà äëÿ âñåãî ïðîåêòà â öåëîì, à òàêæå âñå äîïîëíèòåëüíûå íàçíà÷åíèÿ ëîãè÷åñêèõ îïöèé è âðåìåííûõ ïàðàìåòðîâ ïðîåêòà è äëÿ îòäåëüíûõ ëîãè÷åñêèõ ôóíêöèé. Åñëè ïðîåêò íå ïîìåùàåòñÿ ïðè ìîíòàæå â îäíî óñòðîéñòâî, ìîäóëü Partitioner ðàçäåëÿåò áàçó äàííûõ, îáíîâëåííóþ ëîãè÷åñêèì ñèíòåçàòîðîì, íà íåñêîëüêî ÏËÈÑ îäíîãî è òîãî æå ñåìåéñòâà, ñòàðàÿñü ïðè ýòîì ðàçäåëèòü ïðîåêò íà ìèíèìàëüíî âîçìîæíîå ÷èñëî óñòðîéñòâ. Ðàçáèåíèå ïðîåêòà ïðîèñõîäèò ïî ãðàíèöàì ëîãè÷åñêèõ ýëåìåíòîâ, à ÷èñëî âûâîäîâ, èñïîëüçóåìîå äëÿ ñîîáùåíèÿ ìåæäó óñòðîéñòâàìè, ìèíèìèçèðóåòñÿ. Ðàçáèåíèå ìîæåò áûòü ïðîâåäåíî ïîëíîñòüþ àâòîìàòè÷åñêè ëèáî ïîä ÷àñòè÷íûì èëè ïîëíûì óïðàâëåíèåì ñî ñòîðîíû ïîëüçîâàòåëÿ. Íàçíà÷åíèÿ óñòðîéñòâ è óñòàíîâêè äëÿ àâòîìàòè÷åñêîãî âûáîðà óñòðîéñòâ ïîçâîëÿþò ïðèìåíèòü òîò óðîâåíü óïðàâëåíèÿ, êîòîðûé íàèáîëåå ïîäõîäèò äëÿ êîíêðåòíîãî ïðîåêòà.
158
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II Kîãäà ðàáîòàþò ìîäóëè Partitioner è Fitter, âû ìîæåòå ïðèîñòàíîâèòü êîìïèëÿöèþ. Kîìïèëÿòîð îòîáðàçèò èíôîðìàöèþ î òåêóùåì ñîñòîÿíèè ïðîöåññîâ ðàçáèåíèÿ è òðàññèðîâêè êðèñòàëëà, â òîì ÷èñëå ñðàâíåíèå òðåáóåìûõ è èìåþùèõñÿ ðåñóðñîâ. Ýòî íóæíî äëÿ òîãî, ÷òîáû ïðèíÿòü ðåøåíèå, ïðîäîëæàòü ëè êîìïèëÿöèþ èëè âíîñèòü êàðäèíàëüíûå èçìåíåíèÿ â ïðîåêò. Èñïîëüçóÿ áàçó äàííûõ, îáíîâëåííóþ ìîäóëåì ðàçáèåíèÿ, ìîäóëü Fitter ïðèâîäèò â ñîîòâåòñòâèå òðåáîâàíèÿ ïðîåêòà ñ èçâåñòíûìè ðåñóðñàìè îäíîãî èëè íåñêîëüêèõ óñòðîéñòâ. Îí íàçíà÷àåò êàæäîé ëîãè÷åñêîé ôóíêöèè ðàñïîëîæåíèå ðåàëèçóþùåãî åå ëîãè÷åñêîãî ýëåìåíòà è âûáèðàåò ñîîòâåòñòâóþùèå ïóòè âçàèìíûõ ñîåäèíåíèé è íàçíà÷åíèÿ âûâîäîâ. Äàííûé ìîäóëü ïûòàåòñÿ ñîãëàñîâàòü íàçíà÷åíèÿ ðåñóðñîâ, ò.å. âûâîäîâ, ëîãè÷åñêèõ ýëåìåíòîâ, ýëåìåíòîâ ââîäà/âûâîäà, ÿ÷ååê ïàìÿòè, ÷èïîâ, êëèê, óñòðîéñòâ, ìåñòíîé òðàññèðîâêè, âðåìåííûõ ïàðàìåòðîâ è íàçíà÷åíèÿ ñîåäèíåííûõ âûâîäîâ èç ôàéëà íàçíà÷åíèé è êîíôèãóðàöèè (.acf, Assignment & Configuration file), ñ èìåþùèìèñÿ ðåñóðñàìè. Ìîäóëü èìååò ïàðàìåòðû, ïîçâîëÿþùèå îïðåäåëèòü ñïîñîáû òðàññèðîâêè, íàïðèìåð àâòîìàòè÷åñêîå ââåäåíèå ëîãè÷åñêèõ ýëåìåíòîâ èëè îãðàíè÷åíèå êîýôôèöèåíòà îáúåäèíåíèÿ ïî âõîäó. Åñëè òðàññèðîâêà íå ìîæåò áûòü âûïîëíåíà, ìîäóëü âûäàåò ñîîáùåíèå è ïðåäëàãàåò âàì âûáîð, ïðîèãíîðèðîâàòü íåêîòîðûå èëè âñå âàøè íàçíà÷åíèÿ ëèáî ïðåêðàòèòü êîìïèëÿöèþ. Íåçàâèñèìî îò òîãî, çàâåðøåíà ëè ïîëíàÿ òðàññèðîâêà ïðîåêòà, äàííûé ìîäóëü ãåíåðèðóåò ôàéë îò÷åòà (.rpt, report file), â êîòîðîì äîêóìåíòèðóåòñÿ èíôîðìàöèÿ î ðàçáèåíèè ïðîåêòà, èìåíàõ âõîäíûõ è âûõîäíûõ êîíòàêòîâ, âðåìåííûõ ïàðàìåòðàõ ïðîåêòà è íåèñïîëüçîâàííûõ ðåñóðñàõ äëÿ êàæäîãî óñòðîéñòâà â ïðîåêòå. Âû ìîæåòå âêëþ÷èòü â ôàéë îò÷åòà ðàçäåëû, ïîêàçûâàþùèå íàçíà÷åíèÿ ïîëüçîâàòåëÿ, ôàéëîâóþ èåðàðõèþ, âçàèìíûå ñîåäèíåíèÿ ëîãè÷åñêèõ ýëåìåíòîâ è óðàâíåíèÿ, ðåàëèçîâàííûå â ËÝ. Kîìïèëÿòîð òàêæå àâòîìàòè÷åñêè ñîçäàåò ôàéë òðàññèðîâêè (.fit), â êîòîðîì äîêóìåíòèðóþòñÿ íàçíà÷åíèÿ ðåñóðñîâ è óñòðîéñòâ äëÿ âñåãî ïðîåêòà, à òàêæå èíôîðìàöèÿ î òðàññèðîâêå. Íåçàâèñèìî îò òîãî, óñïåøíî ëè ïðîøëà òðàññèðîâêà, ïîëüçîâàòåëü ìîæåò ïðîñìîòðåòü èíôîðìàöèþ î ñîãëàñîâàíèè, ðàçáèåíèè è òðàññèðîâêå èç ôàéëà ñîãëàñîâàíèÿ â îêíå ïîóðîâíåâîãî ïëàíèðîâùèêà. Âîçìîæíî òàêæå ïåðåïèñàòü íàçíà÷åíèÿ èç ôàéëà ñîãëàñîâàíèÿ â ôàéë íàçíà÷åíèé è êîíôèãóðàöèè ACF äëÿ ïîñëåäóþùåãî ðåäàêòèðîâàíèÿ. Ñóùåñòâóåò âîçìîæíîñòü äàòü óêàçàíèå ìîäóëþ Fitter ñãåíåðèðîâàòü âûõîäíûå òåêñòîâûå ôàéëû ïðîåêòà íà ÿçûêå AHDL (.tdo). Ïîñêîëüêó â ïðîåêòå ñ íåñêîëüêèìè óñòðîéñòâàìè äëÿ îäíîãî óñòðîéñòâà ãåíåðèðóåòñÿ
159
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II îäèí ôàéë, ñëåäóåò ðàçáèòü ïðîåêò íà íåñêîëüêî ïðîåêòîâ, êàæäûé äëÿ îäíîãî óñòðîéñòâà, åñëè òðåáóåòñÿ çàôèêñèðîâàòü ëîãèêó â íåêîòîðûõ óñòðîéñòâàõ, çàòåì ñîõðàíèòü ôàéë TDO äëÿ ýòîãî óñòðîéñòâà êàê ôàéë òåêñòîâîãî äèçàéíà (.tdf) è ïåðåêîìïèëèðîâàòü ëîãèêó äëÿ ýòîãî óñòðîéñòâà, ñîõðàíÿÿ ïðè ýòîì ðåçóëüòàòû ëîãè÷åñêîãî ñèíòåçà, ïîëó÷åííûå â õîäå ïðåäûäóùåé êîìïèëÿöèè. Functional SNF Extractor ñîçäàåò ôàéë äëÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ (.snf). Kîìïèëÿòîð ãåíåðèðóåò ýòîò ôàéë ïåðåä ñèíòåçîì ïðîåêòà, ïîýòîìó îí ñîäåðæèò âñå óçëû, ïðèñóòñòâóþùèå â ïåðâîíà÷àëüíûõ ôàéëàõ ïðîåêòà. Ýòîò ôóíêöèîíàëüíûé ôàéë SNF íå ñîäåðæèò èíôîðìàöèþ î âðåìåííûõ ïàðàìåòðàõ. Åãî ãåíåðàöèÿ âîçìîæíà òîëüêî â ñëó÷àå, åñëè êîìïèëÿöèÿ ïðîåêòà ïðîøëà áåç îøèáîê. Timing SNF Extractor ñîçäàåò (åñëè êîìïèëÿöèÿ ïðîåêòà ïðîøëà áåç îøèáîê) ôàéë äëÿ òåñòèðîâàíèÿ âðåìåííûõ ïàðàìåòðîâ (.snf), êîòîðûé ñîäåðæèò äàííûå î âðåìåííûõ ïàðàìåòðàõ ïðîåêòà. Ýòîò ôàéë èñïîëüçóåòñÿ äëÿ òåñòèðîâàíèÿ è àíàëèçà âðåìåííûõ ïàðàìåòðîâ. Kðîìå òîãî, ýòè ôàéëû SNF èñïîëüçóþò òàêæå ìîäóëè êîìïèëÿòîðà, ñîäåðæàùèå ïðîãðàììû çàïèñè â ôîðìàòû EDIF, Verilog è VHDL, ãåíåðèðóþùèå âûõîäíûå ôàéëû ýòèõ ôîðìàòîâ è òàêæå (ïî æåëàíèþ ïîëüçîâàòåëÿ) âûõîäíûå ôàéëû ôîðìàòà ñòàíäàðòíûõ çàäåðæåê (.sdo, standart delay format output file). Ìîæíî çàäàòü êîìïèëÿòîðó ñãåíåðèðîâàòü îïòèìèçèðîâàííûé ôàéë SNF ñ ïîìîùüþ êîìàíäû Processing/Timing SNF Extractor. Îïòèìèçàöèÿ ôàéëà SNF óâåëè÷èâàåò âðåìÿ êîìïèëÿöèè, íî ïîìîãàåò ñýêîíîìèòü âàøå âðåìÿ ïðè òåñòèðîâàíèè è àíàëèçå âðåìåííûõ ïàðàìåòðîâ. Linked SNF Extractor ñîçäàåò ôàéë (.snf) äëÿ òåñòèðîâàíèÿ êîìïîíîâêè ïðè òåñòèðîâàíèè íåñêîëüêèõ ïðîåêòîâ (íà óðîâíå ïëàòû). Òàêîé ôàéë SNF êîìáèíèðóåò èíôîðìàöèþ èç ôàéëîâ SNF äâóõ òèïîâ: äëÿ òåñòèðîâàíèÿ âðåìåííûõ ïàðàìåòðîâ è ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ, êîòîðûå áûëè ñãåíåðèðîâàíû äëÿ ýòèõ íåñêîëüêèõ ïðîåêòîâ ïî îòäåëüíîñòè. Ñêîìïîíîâàííûå ïðîåêòû ìîãóò èñïîëüçîâàòü óñòðîéñòâà, ïðèíàäëåæàùèå ðàçíûì ñåìåéñòâàì. Åñëè ôàéë äëÿ òåñòèðîâàíèÿ êîìïîíîâêè ñîäåðæèò òîëüêî èíôîðìàöèþ î âðåìåííûõ ïàðàìåòðàõ, åãî ìîæíî òàêæå èñïîëüçîâàòü ïðè ïðîãîíå àíàëèçà âðåìåííûõ ïàðàìåòðîâ. EDIF Netlist Writer. Kîìïèëÿòîð MAX+PLUS II ìîæåò âçàèìîäåéñòâîâàòü ñ áîëüøèíñòâîì ñòàíäàðòíûõ ïðîãðàììíûõ ñðåäñòâ ÑÀÏÐ, êîòîðûå ìîãóò ÷èòàòü ôàéëû ñòàíäàðòíîãî ôîðìàòà EDIF 200 èëè 300. Äàííûé (íåîáÿçàòåëüíûé) ìîäóëü êîìïèëÿòîðà, ñîäåðæàùèé ïðîãðàììó çàïèñè â ôîð-
160
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II ìàò EDIF, ñîçäàåò îäèí èëè íåñêîëüêî âûõîäíûõ ôàéëîâ â ôîðìàòå EDIF (.edo), ñîäåðæàùèõ èíôîðìàöèþ î ôóíêöèÿõ è (íåîáÿçàòåëüíî) âðåìåííûõ ïàðàìåòðàõ, ïîëó÷åííóþ ïîñëå ïðîâåäåíèÿ ñèíòåçà. Èíôîðìàöèÿ î âðåìåííûõ ïàðàìåòðàõ ìîæåò áûòü òàêæå çàïèñàíà â îòäåëüíûå âûõîäíûå ôàéëû ôîðìàòà ñòàíäàðòíîé çàäåðæêè (.sdo). Verilog Netlist Writer (íåîáÿçàòåëüíûé ìîäóëü ïðîãðàììû çàïèñè â ôîðìàò Verilog) ãåíåðèðóåò âûõîäíûå ôàéëû ñ ðàñøèðåíèåì .vo, ñîäåðæàùèå èíôîðìàöèþ î ôóíêöèÿõ è âðåìåííûõ ïàðàìåòðàõ, ïîëó÷åííóþ ïîñëå ïðîâåäåíèÿ ñèíòåçà. Èíôîðìàöèÿ î âðåìåííûõ ïàðàìåòðàõ ìîæåò áûòü òàêæå çàïèñàíà â îòäåëüíûå âûõîäíûå ôàéëû ôîðìàòà ñòàíäàðòíîé çàäåðæêè (.sdo). VHDL Netlist Writer VHDL (íåîáÿçàòåëüíûé ìîäóëü êîìïèëÿòîðà ñ ïðîãðàììîé çàïèñè â ôîðìàò VHDL) ãåíåðèðóåò îäèí èëè íåñêîëüêî âûõîäíûõ ôàéëîâ (.vho) íà ÿçûêå VHDL ñ ñèíòàêñèñîì 1987 èëè 1993, ñîäåðæàùèõ èíôîðìàöèþ î ôóíêöèÿõ è (íåîáÿçàòåëüíî) âðåìåííûõ ïàðàìåòðàõ, ïîëó÷åííóþ ïîñëå ïðîâåäåíèÿ ñèíòåçà. Èíôîðìàöèÿ î âðåìåííûõ ïàðàìåòðàõ ìîæåò áûòü òàêæå çàïèñàíà â îòäåëüíûå âûõîäíûå ôàéëû ôîðìàòà ñòàíäàðòíîé çàäåðæêè (.sdo). Âûõîäíûå ôàéëû íà ÿçûêàõ îïèñàíèÿ àïïàðàòóðû ìîæíî èñïîëüçîâàòü ïðè âåðèôèêàöèè ïðîåêòà ñ èñïîëüçîâàíèåì âíåøíåãî ñèìóëÿòîðà. Ýòè ôàéëû ãåíåðèðóþòñÿ òîëüêî â ñëó÷àå óñïåøíîé êîìïèëÿöèè ïðîåêòà. Ìîäóëü Assembler ïðåîáðàçóåò íàçíà÷åíèÿ ëîãè÷åñêèõ ýëåìåíòîâ, âûâîäîâ è óñòðîéñòâà, ñäåëàííûå ìîäóëåì Fitter, â ïðîãðàììíûé îáðàç äëÿ óñòðîéñòâà (óñòðîéñòâ) â âèäå îäíîãî èëè íåñêîëüêèõ äâîè÷íûõ îáúåêòíûõ ôàéëîâ äëÿ ïðîãðàììàòîðà (.pof) èëè îáúåêòíûõ ôàéëîâ SRAM (.sof); äëÿ íåêîòîðûõ óñòðîéñòâ êîìïèëÿòîð òàêæå ãåíåðèðóåò ASCII-ôàéëû JEDEC (.jed), ñîäåðæàùèå èíôîðìàöèþ äëÿ ïðîãðàììàòîðà, êîíôèãóðàöèîííûå ASCII-ôàéëû (.ttf) è ASCII-ôàéëû ôîðìàòà Intel (.hex). Îáúåêòíûå ôàéëû POF è SOF, à òàêæå êîíôèãóðàöèîííûå ôàéëû JEDEC çàòåì îáðàáàòûâàþòñÿ ïðîãðàììàòîðîì ñèñòåìû MAX+PLUS II è ïðîãðàììèðóþùåé àïïàðàòóðîé ôèðìû «Altera» (èëè äðóãèì ïðîãðàììàòîðîì). Ôàéëû HEX è TTF ìîãóò áûòü èñïîëüçîâàíû äëÿ êîíôèãóðèðîâàíèÿ óñòðîéñòâ FLEX6000, FLEX8000 è FLEX10K ñ ïîìîùüþ äðóãèõ ñðåäñòâ. Ìîäóëü àññåìáëåðà ñîçäàåò ôàéëû äëÿ ïðîãðàììàòîðà òîëüêî â ñëó÷àå óñïåøíîé êîìïèëÿöèè ïðîåêòà. Ïîñëå çàâåðøåíèÿ êîìïèëÿöèè êîìïèëÿòîð è ïðîãðàììàòîð ñèñòåìû MAX+PLUS II ïîçâîëÿþò ñãåíåðèðîâàòü äîïîëíèòåëüíûå ôàéëû äëÿ ïðîãðàììèðîâàíèÿ óñòðîéñòâà, êîòîðûå ìîæíî èñïîëüçîâàòü â äðóãèõ óñëîâè-
161
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
AL2124
ÿõ ïðîãðàììèðîâàíèÿ. Íàïðèìåð ìîæíî ñîçäàòü ôàéëû ñ ïîñëåäîâàòåëüíûì ïîòîêîì áèòîâ (.bbs) è íåîáðàáîòàííûå äâîè÷íûå ôàéëû (.rbf) äëÿ êîíôèãóðèðîâàíèÿ óñòðîéñòâ FLEX6000, FLEX8000 è FLEX10K. Ìîæíî ñîçäàòü ïîñëåäîâàòåëüíûå ôàéëû òåñòîâûõ âåêòîðîâ (.svf) èëè ôàéëû íà ÿçûêå JAM (.jam) äëÿ ïðîãðàììèðîâàíèÿ óñòðîéñòâ â àâòîìàòèçèðîâàííîé èñïûòàòåëüíîé àïïàðàòóðå òèïà ATE. Design Doctor Utility (íåîáÿçàòåëüíàÿ óòèëèòà äèàãíîñòèêè) ïðîåêòà ïðîâåðÿåò ëîãèêó êàæäîãî ôàéëà ïðîåêòà äëÿ âûÿâëåíèÿ ýëåìåíòîâ, êîòîðûå ìîãóò âûçâàòü ïðîáëåìû íàäåæíîñòè íà ñèñòåìíîì óðîâíå. Ýòè ïðîáëåìû îáû÷íî îáíàðóæèâàþòñÿ òîëüêî ïîñëå çàïóñêà óñòðîéñòâà «â æåëåçå». Ñóùåñòâóåò âîçìîæíîñòü âûáîðà îäíîãî èç òðåõ ïðåäâàðèòåëüíî îïðåäåëåííûõ íàáîðîâ ïðàâèë ðàçðàáîòêè ïðîåêòà ñ ðàçíûìè óðîâíÿìè. Kðîìå òîãî, âû ìîæåòå ðàçðàáîòàòü ñâîé ñîáñòâåííûé ñâîä ïðàâèë ðàçðàáîòêè äèçàéíà. Ïðàâèëà ðàçðàáîòêè äèçàéíà îñíîâûâàþòñÿ íà ïðèíöèïàõ íàäåæíîñòè, êîòîðûå îõâàòûâàþò ëîãèêó, ñîäåðæàùóþ àñèíõðîííûå âõîäû, òàêòîâûå ñèãíàëû (Clock), ìíîãîóðîâíåâóþ ëîãèêó íà êîíôèãóðàöèÿõ ñ ñèãíàëàìè Clock, Preset è Clear, à òàêæå â óñëîâèÿõ ñîñòÿçàíèé. Óñòàíîâêà ïðàâèë ïðîÐèñ. 2.27. Îêíî êîìàíäû âåðêè ïðîèçâîäèòñÿ ñ ïîìîùüþ êîìàíDesign Doctor Settings äû Design Doctor Settings (Ðèñ. 2.27).
2.5. Âåðèôèêàöèÿ ïðîåêòà Äëÿ âåðèôèêàöèè ïðîåêòà (Ðèñ. 2.28) â ñèñòåìå MAX+PLUS II èñïîëüçóþòñÿ òðè ïðèëîæåíèÿ: ñèìóëÿòîð, àíàëèçàòîð âðåìåííûõ ïàðàìåòðîâ è ñèãíàëüíûé ðåäàêòîð.
Ñèìóëÿòîð (Simulator) Ñèìóëÿòîð ñèñòåìû MAX+PLUS II òåñòèðóåò ëîãè÷åñêèå îïåðàöèè è âíóòðåííþþ ñèíõðîíèçàöèþ ïðîåêòà, ïîçâîëÿÿ ïîëüçîâàòåëþ ìîäåëèðîâàòü
162
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
.cmd
.hex .mif
.vec
.vec
MAX+PLUS II Симулятор
.log
.hst
.sif
.scf
.tbl
Сигнальный редактор
.tbl
.snf Протокол исполнения команд
История команд
Выходной табличный файл
MAX+PLUS II Временной анализатор
AL2125+
.tao
Ðèñ. 2.28. Âåðèôèêàöèÿ ïðîåêòà â ñèñòåìå MAX+PLUS II
ïðîåêò. Ñèìóëÿòîð ìîæåò ðàáîòàòü èëè â äèàëîãîâîì, èëè àâòîìàòè÷åñêîì (ïàêåòíîì) ðåæèìàõ. Îêíî ñèìóëÿòîðà ïîêàçàíî íà Ðèñ. 2.29. Ïåðåä òåñòèðîâàíèåì ïðîåêò íåîáõîäèìî ñêîìïèëèðîâàòü, çàäàâ êîìïèëÿòîðó îïöèþ ñãåíåðèðîâàòü ôàéë (.snf) äëÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ, òåñòèðîâàíèÿ âðåìåííûõ ïàðàìåòðîâ ëèáî òåñòèðîâàíèÿ êîìïîíîâêè íåñêîëüêèõ ïðîåêòîâ (óñòðîéñòâ). Çàòåì ïîëó÷åííûé äëÿ òåêóùåãî ïðîåêòà ôàéë SNF çàãðóæàåòñÿ àâòîìàòè÷åñêè ïðè îòêðûòèè ñèìóëÿòîðà.  êà÷åñòâå èñòî÷íèêà âõîäíûõ âåêòîðîâ èñïîëüçóþòñÿ ëèáî ãðàôè÷åñêèé ñèãíàëüíûé ôàéë êàíàëîâ òåñòèðîâàíèÿ (.scf), ëèáî òåêñòîâûé ASCIIôàéë (.vec). Äëÿ ïðîåêòîâ, ðàáîòàþùèõ ñ ïàìÿòüþ, ìîæíî çàäàòü íåêîå èñõîäíîå ñîäåðæèìîå ïàìÿòè â ôàéëàõ øåñòíàäöàòåðè÷íîãî ôîðìàòà («Intel») ñ ðàñøèðåíèåì .hex èëè â ôàéëàõ èíèöèàëèçàöèè ïàìÿòè ñ ðàñøèðåíèåì .mif. Ñèãíàëüíûé ðåäàêòîð ìîæåò àâòîìàòè÷åñêè ñîçäàâàòü ôàéë SCF ïî óìîë÷àíèþ, êîòîðûé ïîëüçîâàòåëü ìîæåò ðåäàêòèðîâàòü ñ öåëüþ ïîëó÷åíèÿ íóæíûõ åìó òåñòîâûõ âõîäíûõ âåêòîðîâ. Åñëè âìåñòî ýòîãî èñïîëüçóåòñÿ
163
AL2126
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II
Ðèñ. 2.29. Ñèìóëÿòîð MAX+PLUS II
òåêñòîâûé ASCII-ôàéë âåêòîðîâ, ñèãíàëüíûé ðåäàêòîð àâòîìàòè÷åñêè ãåíåðèðóåò èç íåãî ôàéë êàíàëîâ òåñòèðîâàíèÿ SCF ( Simulator Chanel File). Ñèìóëÿòîð ïîçâîëÿåò ïðîâåðèòü âûõîäíûå çíà÷åíèÿ, ïîëó÷àåìûå â õîäå òåñòèðîâàíèÿ, ïî âûõîäàì, ñîäåðæàùèìñÿ â ôàéëå SCF (çàäàííûì ïîëüçîâàòåëåì ïðîãíîçèðóåìûì çíà÷åíèÿì èëè ðåçóëüòàòàì ïðåäûäóùèõ òåñòîâ). Ñ ïîìîùüþ ñîîòâåòñòâóþùåé àïïàðàòóðû äëÿ ïðîãðàììèðîâàíèÿ ìîæíî òàêæå âûïîëíèòü ôóíêöèîíàëüíîå òåñòèðîâàíèå äëÿ ïðîâåðêè äåéñòâèòåëüíûõ çíà÷åíèé âûõîäîâ ïðîãðàììèðóåìîãî óñòðîéñòâà ïî ðåçóëüòàòàì òåñòèðîâàíèÿ. Èñïîëüçóÿ ðàçëè÷íûå îïöèè ñèìóëÿòîðà, ìîæíî êîíòðîëèðîâàòü ïðîåêò íà ïîÿâëåíèå ñáîåâ (glitches), à òàêæå íàðóøåíèå óñòàíîâî÷íûõ ïàðàìåòðîâ è âðåìåííûõ çàäåðæåê. Ïîñëå çàâåðøåíèÿ òåñòèðîâàíèÿ ìîæíî îòêðûòü ñèãíàëüíûé ðåäàêòîð äëÿ ïðîñìîòðà îáíîâëåííîãî ôàéëà SCF èëè ñîõðàíèòü ïîëó÷åííûå âûõîäíûå çíà÷åíèÿ â òàáëè÷íîì ôàéëå ñ ðàñøèðåíèåì .tbl, à çàòåì ïðîñìàòðèâàòü ðåçóëüòàòû â òåêñòîâîì ðåäàêòîðå. Ôóíêöèîíàëüíîå òåñòèðîâàíèå. Åñëè êîìïèëÿòîðó «äàíî çàäàíèå» ñãåíåðèðîâàòü ôàéë SNF äëÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ, îí ñîçäàåò åãî
164
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II ïåðåä ñèíòåçîì ïðîåêòà. Ñëåäîâàòåëüíî, ïðè ôóíêöèîíàëüíîì òåñòèðîâàíèè ìîæíî ñìîäåëèðîâàòü âñå óçëû ïðîåêòà. Âî âðåìÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ ñèìóëÿòîð èãíîðèðóåò âñå çàäåðæêè ðàñïðîñòðàíåíèÿ. Ïîýòîìó â ôàéëå SNF äëÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ íåò çàäåðæåê, âûõîäíûå ëîãè÷åñêèå óðîâíè èçìåíÿþòñÿ îäíîâðåìåííî ñî âõîäíûìè âåêòîðàìè. Òåñòèðîâàíèå âðåìåííûõ ïàðàìåòðîâ. Ôàéë SNF äëÿ òåñòèðîâàíèÿ âðåìåííûõ ïàðàìåòðîâ êîìïèëÿòîð ãåíåðèðóåò, ïîñëå òîãî êàê ïðîâåäåíû ïîëíûé ñèíòåç è îïòèìèçàöèÿ ïðîåêòà. Ïîýòîìó ýòîò ôàéë ñîäåðæèò òîëüêî òå óçëû, êîòîðûå íå áûëè óíè÷òîæåíû â ïðîöåññå ëîãè÷åñêîãî ñèíòåçà. Èç ýòîãî ôàéëà ñèìóëÿòîð áåðåò èíôîðìàöèþ îá àïïàðàòíîé ÷àñòè, êîòîðàÿ áûëà ñîáðàíà èç ôàéëîâ ìîäåëåé óñòðîéñòâ (.dmf), èìåþùèõñÿ â êîìïëåêòå ñèñòåìû MAX+PLUS II. Åñëè ïðîåêò áûë ðàçáèò íà íåñêîëüêî óñòðîéñòâ, êîìïèëÿòîð ñîçäàåò ôàéë SNF äëÿ ïðîåêòà â öåëîì è äëÿ êàæäîãî óñòðîéñòâà. Îäíàêî òåñòèðîâàíèå âðåìåííûõ ïàðàìåòðîâ îñóùåñòâëÿåòñÿ òîëüêî äëÿ ïðîåêòà â öåëîì. Ìîæíî óñêîðèòü òåñòèðîâàíèå âðåìåííûõ ïàðàìåòðîâ, âûäàâ êîìïèëÿòîðó óêàçàíèå ñãåíåðèðîâàòü îïòèìèçèðîâàííûé ôàéë SNF, ñîäåðæàùèé äèíàìè÷åñêèå ìîäåëè, êîòîðûå ïðåäñòàâëÿþò ñîáîé ðàçíûå òèïû êîìáèíàòîðíîé ëîãèêè. Ïðîöåññîðíîå âðåìÿ êîìïèëÿòîðà ïðè ýòîì óâåëè÷èâàåòñÿ, îäíàêî ïîëó÷åííûé îïòèìèçèðîâàííûé SNF ìîæåò óìåíüøèòü âðåìÿ òåñòèðîâàíèÿ, ïîñêîëüêó ñèìóëÿòîð ìîæåò ðàáîòàòü ñ äèíàìè÷åñêèìè ìîäåëÿìè, âìåñòî òîãî ÷òîáû èíòåðïðåòèðîâàòü âñþ ëîãèêó â êîìáèíàòîðíîé ñõåìå. Ïðè ñîçäàíèè ôàéëà SNF äëÿ òåñòèðîâàíèÿ êîìïîíîâêè íåñêîëüêèõ ïðîåêòîâ êîìïèëÿòîð êîìáèíèðóåò ôàéëû SNF äëÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ è/èëè ôàéëû äëÿ òåñòèðîâàíèÿ âðåìåííûõ ïàðàìåòðîâ íåñêîëüêèõ îòäåëüíûõ ïðîåêòîâ. Îòäåëüíûå ïîäïðîåêòû â êîìïîíîâî÷íîì SNF ìîãóò áûòü ïðåäíàçíà÷åíû äëÿ óñòðîéñòâ ðàçíûõ ñåìåéñòâ. Kðîìå òîãî, ïîñêîëüêó ôàéëû SNF äëÿ ôóíêöèîíàëüíîãî òåñòèðîâàíèÿ ñîçäàþòñÿ äî îêîí÷àíèÿ ïîëíîé êîìïèëÿöèè, ìîæíî ââåñòè ïîäïðîåêòû, êîòîðûå ïðåäñòàâëÿþò ëîãèêó, íå ðåàëèçîâàííóþ â óñòðîéñòâå ôèðìû «Altera». Kîìïîíîâî÷íûé ôàéë SNF ìîæíî èñïîëüçîâàòü äëÿ òåñòèðîâàíèÿ íà óðîâíå ïëàòû. Kðîìå òîãî, åñëè îí ñîäåðæèò òîëüêî èíôîðìàöèþ î âðåìåííûõ ïàðàìåòðàõ, åãî ìîæíî èñïîëüçîâàòü äëÿ ïðîãîíà âðåìåííîãî àíàëèçàòîðà ñèñòåìû MAX+PLUS II. Âìåñòå ñ äðóãèìè ïðèëîæåíèÿìè ñèñòåìû MAX+PLUS II ñèìóëÿòîð ïîçâîëÿåò âàì âûïîëíÿòü ñëåäóþùèå çàäà÷è:
165
Ñèñòåìà ïðîåêòèðîâàíèÿ MAX+PLUS II çàäàòü îæèäàåìûå ëîãè÷åñêèå óðîâíè íà âûõîäå, êîòîðûå ìîæíî áóäåò ñðàâíèòü ñ ðåçóëüòàòàìè òåñòèðîâàíèÿ; ñìîäåëèðîâàòü îòäåëüíûå óçëû èëè óçëû, îáúåäèíåííûå â ãðóïïû. Ìîæíî êîìáèíèðîâàòü áèòû öèôðîâîãî àâòîìàòà â ïðîåêòå, ìîäåëèðîâàòü èõ êàê ãðóïïó è îáðàùàòüñÿ ê íèì ïî èìåíè ñîñòîÿíèÿ; îïðåäåëèòü âðåìåííîé èíòåðâàë, ïðåäñòàâëÿþùèé ñîáîé äðîæàíèå ôðîíòà èìïóëüñà èëè ñáîé, è ïðîàíàëèçèðîâàòü ïðîåêò íà íàëè÷èå îáîèõ ýòèõ óñëîâèé èëè îäíîãî èç íèõ; êîíòðîëèðîâàòü íàëè÷èå â ïðîåêòå íàðóøåíèé íà÷àëüíûõ óñòàíîâîê ðåãèñòðîâ è âðåìåííûõ çàäåðæåê; ðåãèñòðèðîâàòü äåéñòâèòåëüíûå çíà÷åíèÿ âûõîäîâ óñòðîéñòâ âìåñòî ìîäåëèðîâàííûõ; ïðîâîäèòü ôóíêöèîíàëüíîå òåñòèðîâàíèå. Ìîæíî ïðîâåðèòü, ÿâëÿþòñÿ ëè ñìîäåëèðîâàííûå âûõîäíûå çíà÷åíèÿ ôóíêöèîíàëüíî ýêâèâàëåíòíûìè ðåàëüíûì âûõîäàì óñòðîéñòâ; çàäàâàòü óñëîâèÿ òî÷êè ïðåðûâàíèÿ, êîòîðàÿ çàñòàâëÿåò ñèìóëÿòîð äåëàòü ïàóçó ïðè èõ ðåàëèçàöèè â ïðîöåññå òåñòèðîâàíèÿ; ñîñòàâëÿòü ïåðå÷åíü èìåí è ëîãè÷åñêèõ óðîâíåé ëþáîé êîìáèíàöèè óçëîâ è ãðóïï è èíèöèàëèçèðîâàòü ëîãè÷åñêèå óðîâíè óçëà èëè ãðóïïû ïåðåä òåñòèðîâàíèåì; èíèöèàëèçèðîâàòü ñîäåðæèìîå áëîêîâ ïàìÿòè RAM (ÎÇÓ) èëè ROM (ÏÇÓ) ïåðåä òåñòèðîâàíèåì; ñîõðàíÿòü èíèöèàëèçèðîâàííûå çíà÷åíèÿ óçëîâ è ãðóïï, â òîì ÷èñëå èíèöèàëèçèðîâàííîå ñîäåðæèìîå ïàìÿòè, â ôàéëå èíèöèàëèçàöèè ñèìóëÿòîðà (.sif) èëè ïåðåçàãðóæàòü èíèöèàëèçèðîâàííûå çíà÷åíèÿ, õðàíÿùèåñÿ â ôàéëå; ðåãèñòðèðîâàòü êîìàíäû ñèìóëÿòîðà â òåêñòîâîì ôàéëå ïðîòîêîëà èñïûòàíèé (.log) òîãî æå ôîðìàòà, ÷òî è êîìàíäíûé ôàéë (.cmd), èñïîëüçóåìûé ïðè òåñòèðîâàíèè â àâòîìàòè÷åñêîì (ïàêåòíîì) ðåæèìå, à çàòåì èñïîëüçîâàòü ýòîò ôàéë LOG äëÿ ïîâòîðåíèÿ ýòîãî öèêëà òåñòèðîâàíèÿ. Kîìàíäû ñèìóëÿòîðà è ïîëó÷åííûå ðåçóëüòàòû ìîæíî òàêæå çàïèñàòü â òåñòîâûé ôàéë èñòîðèè òåñòèðîâàíèÿ ñ ðàñøèðåíèåì .hst. Òàêèì îáðàçîì, ìû ðàññìîòðåëè îñíîâíûå ïðèåìû ðàáîòû ïàêåòà MAX+PLUS II. Kîíå÷íî, â ðàìêàõ îäíîé ãëàâû ïðàêòè÷åñêè íåâîçìîæíî ïîäðîáíî ðàññìîòðåòü âñå ïðèåìû ðàáîòû ñ òàêèì ñëîæíûì è ðàçíîîáðàçíûì ïðîãðàììíûì ñðåäñòâîì, îäíàêî çàèíòåðåñîâàííûé ïîëüçîâàòåëü â ñîñòîÿíèè ñàìîñòîÿòåëüíî îñâîèòü ïàêåò, èñïîëüçóÿ äàííóþ êíèãó è ôèðìåííîå ðóêîâîäñòâî ïîëüçîâàòåëÿ.
166
Ãëàâà 3.
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.1. Îáùèå ñâåäåíèÿ ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ðàçðàáîòàí ôèðìîé «Altera» è ïðåäíàçíà÷åí äëÿ îïèñàíèÿ êîìáèíàöèîííûõ è ïîñëåäîâàòåëüíîñòíûõ ëîãè÷åñêèõ óñòðîéñòâ, ãðóïïîâûõ îïåðàöèé, öèôðîâûõ àâòîìàòîâ (state machine) è òàáëèö èñòèííîñòè ñ ó÷åòîì àðõèòåêòóðíûõ îñîáåííîñòåé ÏËÈÑ ôèðìû «Altera». Îí ïîëíîñòüþ èíòåãðèðóåòñÿ ñ ñèñòåìîé àâòîìàòèçèðîâàííîãî ïðîåêòèðîâàíèÿ ÏËÈÑ MAX+PLUS II. Ôàéëû îïèñàíèÿ àïïàðàòóðû, íàïèñàííûå íà ÿçûêå AHDL, èìåþò ðàñøèðåíèå .TDF (text design file). Äëÿ ñîçäàíèÿ TDF-ôàéëà ìîæíî èñïîëüçîâàòü êàê òåêñòîâûé ðåäàêòîð ñèñòåìû MAX+PLUS II, òàê è ëþáîé äðóãîé. Ïðîåêò, âûïîëíåííûé â âèäå TDFôàéëà, êîìïèëèðóåòñÿ, îòëàæèâàåòñÿ è èñïîëüçóåòñÿ äëÿ ôîðìèðîâàíèÿ ôàéëà ïðîãðàììèðîâàíèÿ èëè çàãðóçêè ÏËÈÑ ôèðìû «Altera». Îïåðàòîðû è ýëåìåíòû ÿçûêà AHDL ÿâëÿþòñÿ äîñòàòî÷íî ìîùíûì è óíèâåðñàëüíûì ñðåäñòâîì îïèñàíèÿ àëãîðèòìîâ ôóíêöèîíèðîâàíèÿ öèôðîâûõ óñòðîéñòâ, óäîáíûì â èñïîëüçîâàíèè. ßçûê îïèñàíèÿ àïïàðàòóðû AHDL äàåò âîçìîæíîñòü ñîçäàâàòü èåðàðõè÷åñêèå ïðîåêòû â ðàìêàõ îäíîãî ýòîãî ÿçûêà èëè æå â èåðàðõè÷åñêîì ïðîåêòå èñïîëüçîâàòü êàê TDF-ôàéëû, ðàçðàáîòàííûå íà ÿçûêå AHDL, òàê è äðóãèå òèïû ôàéëîâ. Äëÿ ñîçäàíèÿ ïðîåêòîâ íà AHDL ìîæíî, êîíå÷íî, ïîëüçîâàòüñÿ ëþáûì òåêñòîâûì ðåäàêòîðîì, íî òåêñòîâûé ðåäàêòîð ñèñòåìû MAX+PLUS II ïðåäîñòàâëÿåò ðÿä äîïîëíèòåëüíûõ âîçìîæíîñòåé äëÿ ââîäà, êîìïèëÿöèè è îòëàäêè ïðîåêòîâ (ñì. ãëàâó 2). Ïðîåêòû, ñîçäàííûå íà ÿçûêå AHDL, ëåãêî âíåäðÿþòñÿ â èåðàðõè÷åñêóþ ñòðóêòóðó. Ñèñòåìà MAX+PLUS II ïîçâîëÿåò àâòîìàòè÷åñêè ñîçäàòü ñèìâîë êîìïîíåíòà, àëãîðèòì ôóíêöèîíèðîâàíèÿ êîòîðîãî îïèñûâàåòñÿ
167
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL TDF-ôàéëîì, è çàòåì âñòàâèòü åãî â ôàéë ñõåìíîãî îïèñàíèÿ (GDF-ôàéë). Ïîäîáíûì æå îáðàçîì ìîæíî ââîäèòü ñîáñòâåííûå ôóíêöèè ðàçðàáîò÷èêà, ïîìèìî ïîðÿäêà 300 ìàêðîôóíêöèé, ðàçðàáîòàííûõ ôèðìîé «Altera», â ëþáîé TDF-ôàéë. Äëÿ âñåõ ôóíêöèé, âêëþ÷åííûõ â ìàêðîáèáëèîòåêó ñèñòåìû MAX+PLUS II, ôèðìà «Altera» ïîñòàâëÿåò ôàéëû ñ ðàñøèðåíèåì .inc, êîòîðûå èñïîëüçóþòñÿ â îïåðàòîðå âêëþ÷åíèÿ INCLUDE. Ïðè ðàñïðåäåëåíèè ðåñóðñîâ óñòðîéñòâ ðàçðàáîò÷èê ìîæåò ïîëüçîâàòüñÿ êîìàíäàìè òåêñòîâîãî ðåäàêòîðà èëè îïåðàòîðàìè ÿçûêà AHDL äëÿ òîãî, ÷òîáû ñäåëàòü íàçíà÷åíèÿ ðåñóðñîâ è óñòðîéñòâ. Kðîìå òîãî, ðàçðàáîò÷èê ìîæåò òîëüêî ïðîâåðèòü ñèíòàêñèñ èëè âûïîëíèòü ïîëíóþ êîìïèëÿöèþ äëÿ îòëàäêè è çàïóñêà ïðîåêòà. Ëþáûå îøèáêè àâòîìàòè÷åñêè îáíàðóæèâàþòñÿ îáðàáîò÷èêîì ñîîáùåíèé è âûñâå÷èâàþòñÿ â îêíå òåêñòîâîãî ðåäàêòîðà. Ïðè ðàáîòå ñ AHDL ñëåäóåò ñîáëþäàòü òàê íàçûâàåìûå «çîëîòûå ïðàâèëà» (golden rules). Âûïîëíåíèå ýòèõ ïðàâèë ïîçâîëèò ýôôåêòèâíî ïðèìåíÿòü ÿçûê AHDL è èçáåæàòü ìíîãèõ îøèáîê: • Ñîáëþäàéòå ôîðìàòû è ïðàâèëà ïðèñâîåíèÿ èìåí, îïèñàííûå â ðóêîâîäñòâå ïî ñòèëÿì AHDL, ÷òîáû ïðîãðàììà áûëà ÷èòàåìîé è ñîäåðæàëà ìåíüøå îøèáîê. • Íåñìîòðÿ íà òî, ÷òî ÿçûê AHDL íå ðàçëè÷àåò ïðîïèñíûå è ñòðî÷íûå áóêâû, ôèðìà «Altera» ðåêîìåíäóåò äëÿ óëó÷øåíèÿ ÷èòàåìîñòè èñïîëüçîâàòü ïðîïèñíûå áóêâû äëÿ êëþ÷åâûõ ñëîâ. • Íå ïðèìåíÿéòå âëîæåííûå êîíñòðóêöèè óñëîâíîãî îïåðàòîðà IF, åñëè ìîæíî èñïîëüçîâàòü îïåðàòîð âûáîðà CASE. • Ñòðîêà â TDF-ôàéëå ìîæåò áûòü äëèíîé äî 255 ñèìâîëîâ. Îäíàêî ñëåäóåò ñòðåìèòüñÿ ê äëèíå ñòðîêè, óìåùàþùåéñÿ íà ýêðàíå. Ñòðîêè çàêàí÷èâàþòñÿ íàæàòèåì êëàâèøè Enter. • Íîâóþ ñòðîêó ìîæíî íà÷èíàòü â ëþáîì ñâîáîäíîì ìåñòå, ò.å. íà ìåñòàõ ïóñòûõ ñòðîê, òàáóëÿöèé, ïðîáåëîâ. Îñíîâíûå êîíñòðóêöèè ÿçûêà îòäåëÿþòñÿ ïóñòûì ïðîñòðàíñòâîì. • Këþ÷åâûå ñëîâà, èìåíà è ÷èñëà äîëæíû ðàçäåëÿòüñÿ ñîîòâåòñòâóþùèìè ñèìâîëàìè èëè îïåðàòîðàìè è/èëè îäíèì èëè áîëåå ïðîáåëàìè. • Kîììåíòàðèè äîëæíû áûòü çàêëþ÷åíû â ñèìâîëû ïðîöåíòà (%). Kîììåíòàðèé ìîæåò âêëþ÷àòü ëþáîé ñèìâîë, êðîìå ñèìâîëà %, ïîñêîëüêó êîìïèëÿòîð ñèñòåìû MAX+PLUS II èãíîðèðóåò âñå, çàêëþ÷åííîå â ñèìâîëû ïðîöåíòà. Kîììåíòàðèè íå ìîãóò áûòü âëîæåííûìè. • Ïðè ñîåäèíåíèè îäíîãî ïðèìèòèâà ñ äðóãèì èñïîëüçóéòå òîëüêî «ðàç-
168
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
•
•
•
•
•
•
• •
ðåøåííûå» ñâÿçè ìåæäó íèìè, íå âñå ïðèìèòèâû ìîãóò ñîåäèíÿòüñÿ äðóã ñ äðóãîì. Èñïîëüçóéòå òîëüêî ìàêðîôóíêöèè EXPDFF, EXPLATCH, NANDLTCH è NORLTCH, âõîäÿùèå â ìàêðîáèáëèîòåêó ñèñòåìû MAX+PLUS II. Íå ñîçäàâàéòå ñâîè ñîáñòâåííûå ñòðóêòóðû ïåðåêðåñòíûõ ñâÿçåé. Èçáåãàéòå ìíîãîêðàòíîãî ñâÿçûâàíèÿ âìåñòå EXPDFF, EXPLATCH, NANDLTCH è NORLTCH. Ìíîãî÷èñëåííûå ïðèìåðû ýòèõ ìàêðîôóíêöèé äîëæíû âñåãäà ðàçäåëÿòüñÿ ïðèìèòèâàìè LCELL. Îáùèå «çîëîòûå ïðàâèëà» ââîäà ïðîåêòà: Åñëè ìíîãî÷èñëåííûå äâóíàïðàâëåííûå èëè âûõîäíûå âûâîäû ñâÿçàíû âìåñòå, ðàçðàáîò÷èê íå ìîæåò èñïîëüçîâàòü îïåðàòîð Pin Connection äëÿ ñîåäèíåíèÿ âûâîäîâ ïðè ôóíêöèîíàëüíîì ìîäåëèðîâàíèè ñ àïïàðàòíîé ïîääåðæêîé èëè ôóíêöèîíàëüíîì òåñòèðîâàíèè. Íåò íåîáõîäèìîñòè ñîçäàâàòü ïðîòîòèïû ôóíêöèé äëÿ ïðèìèòèâîâ. Îäíàêî ðàçðàáîò÷èê ìîæåò ïåðåîïðåäåëèòü ïðèìèòèâû â îáúÿâëåíèÿõ ïðîòîòèïîâ ôóíêöèé äëÿ èçìåíåíèÿ ïîðÿäêà âûçîâà âõîäîâ â âàøåì TDF-ôàéëå. Íå ðåäàêòèðóéòå ôàéë FIT. Åñëè ðàçðàáîò÷èê æåëàåò îòðåäàêòèðîâàòü íàçíà÷åíèÿ äëÿ ïðîåêòà, íåîáõîäèìî ñîõðàíèòü ñíà÷àëà ôàéë FIT êàê TDF-ôàéë èëè ñäåëàòü îáðàòíîå íàçíà÷åíèå ñ ïîìîùüþ êîìàíäû Project Back-Annotate è îòðåäàêòèðîâàòü èõ ñ ïîìîùüþ êîìàíä Chip to Device, Pin/LC/Chip è Enter Assignments. Åñëè ðàçðàáîò÷èê õî÷åò çàãðóçèòü ðåãèñòð ïî îïðåäåëåííîìó ôðîíòó ãëîáàëüíîãî òàêòîâîãî ñèãíàëà Clock, ôèðìà «Altera» ðåêîìåíäóåò, êîãäà ðåãèñòð çàãðóæåí, èñïîëüçîâàòü äëÿ óïðàâëåíèÿ âõîä Clock Enable îäíîãî èç òðèããåðîâ òèïà Enable: DFFE, TFFE, JKFFE èëè SRFFE; Kîãäà ðàçðàáîò÷èê íà÷èíàåò ðàáîòàòü ñ íîâûì ôàéëîì ïðîåêòà, ñðàçó æå íåîáõîäèìî çàäàòü ñåìåéñòâî ÏËÈÑ, íà êîòîðîå îðèåíòèðîâàí ïðîåêò, ñ ïîìîùüþ êîíñòðóêöèè Family äëÿ òîãî, ÷òîáû â äàëüíåéøåì èìåòü âîçìîæíîñòü âîñïîëüçîâàòüñÿ ìàêðîôóíêöèÿìè, ñïåöèôè÷íûìè äëÿ äàííîãî ñåìåéñòâà. Åñëè ðàçðàáîò÷èê íå çàäàñò ñåìåéñòâî, îíî áóäåò ñ÷èòàòüñÿ òàêèì æå, êàê è â òåêóùåì ïðîåêòå. Èñïîëüçóéòå îïöèþ Design Doctor äëÿ ïðîâåðêè íàäåæíîñòè ëîãèêè ïðîåêòà âî âðåìÿ êîìïèëÿöèè. Ïðåäîñòàâëÿåìûå ïî óìîë÷àíèþ ôèðìîé «Altera» ñòèëè äëÿ ëîãè÷åñêîãî ñèíòåçà èìåþò ðàçíûå óñòàíîâêè äëÿ ðàçíûõ ñåìåéñòâ óñòðîéñòâ, ÷òî îáåñïå÷èâàåò áîëåå ýôôåêòèâíîå èñïîëüçîâàíèå àðõèòåêòóðû êàæ-
169
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
•
•
• • •
•
äîãî óñòðîéñòâà. Kîãäà ðàçðàáîò÷èê èñïîëüçóåò êàêîé-íèáóäü èç ýòèõ ñòèëåé, åãî óñòàíîâêè èçìåíÿòñÿ ïðè ïåðåõîäå ê äðóãîìó ñåìåéñòâó óñòðîéñòâ. Ïîñëå ñìåíû ñåìåéñòâà íåîáõîäèìî ïðîâåðèòü íîâûå óñòàíîâêè ñòèëÿ. Îáùèå «çîëîòûå ïðàâèëà» ñèñòåìû MAX+PLUS II:  íà÷àëå ðàáîòû íàä íîâûì ïðîåêòîì ðåêîìåíäóåòñÿ ñðàçó æå çàäàòü åãî èìÿ êàê èìÿ íîâîãî ïðîåêòà ñ ïîìîùüþ ìåíþ Project Name äëÿ òîãî, ÷òîáû â äàëüíåéøåì åãî áûëî ëåãêî êîìïèëèðîâàòü. Ïîçæå ðàçðàáîò÷èê âñåãäà ìîæåò èçìåíèòü èìÿ ïðîåêòà. Èñïîëüçóéòå èåðàðõè÷åñêèå âîçìîæíîñòè ñèñòåìû MAX+PLUS II äëÿ ïåðåìåùåíèÿ ìåæäó ôàéëàìè ïðîåêòà. Äëÿ îòêðûòèÿ ôàéëà íèæíåãî óðîâíÿ èåðàðõèè îòêðîéòå ôàéë âåðõíåãî óðîâíÿ, çàòåì èñïîëüçóéòå îêíî Hierarchy Display èëè Hierarchy Down è îòêðîéòå ôàéë áîëåå íèçêîãî óðîâíÿ. Åñëè ðàçðàáîò÷èê âûáèðàåò Open èëè Retrieve äëÿ îòêðûòèÿ ôàéëà íèæíåãî óðîâíÿ, ñ÷èòàåòñÿ, ÷òî îí ÿâëÿåòñÿ ôàéëîì âåðõíåãî óðîâíÿ íîâîãî äåðåâà, è âñå íàçíà÷åíèÿ ðåñóðñîâ, óñòðîéñòâ è çîíäîâ ñîõðàíÿþòñÿ òîëüêî äëÿ ýòîé íîâîé èåðàðõèè, à íå äëÿ òåêóùåãî ïðîåêòà. Åñëè ðàçðàáîò÷èê ñîçäàåò âñïîìîãàòåëüíûé ôàéë äëÿ êàêîãî-íèáóäü ïðîåêòà, ïèêòîãðàììà ýòîãî ôàéëà ïîÿâèòñÿ â îêíå Hierarchy Display â òîì ñëó÷àå, åñëè èñïîëüçóåòñÿ òî æå èìÿ, ÷òî è äëÿ ïðîåêòà. Íå ðåêîìåíäóåòñÿ ðåäàêòèðîâàòü ñèñòåìíûå ôàéëû MAX+PLUS II, â òîì ÷èñëå ôàéëû ñ ðàñøèðåíèåì .prb, ôàéëû HIF èëè maxplus2.ini ëèáî ôàéëû <èìÿ ïðîåêòà>.ini. Åñëè ðàçðàáîò÷èê æåëàåò ïåðåèìåíîâàòü ôàéë ïðîåêòà èëè âñïîìîãàòåëüíûé ôàéë, ñëåäóåò èñïîëüçîâàòü êîìàíäó Save As... Íå ðåêîìåíäóåòñÿ ïåðåèìåíîâûâàòü ôàéëû ïðîåêòà âíå ñðåäû MAX+PLUS II (íàïðèìåð èç MS-DOS èëè Windows File Manager). Ïîñëå çàâåðøåíèÿ ïðîåêòà ðåêîìåíäóåòñÿ âûïîëíèòü êîìàíäó àðõèâèðîâàíèÿ ïðîåêòà Project Archive äëÿ ñîçäàíèÿ ðåçåðâíîé êîïèè âñåãî ïðîåêòà (âñåõ åãî ôàéëîâ). Íà àðõèâèðîâàííóþ êîïèþ íå ïîâëèÿþò íèêàêèå ïîñëåäóþùèå ðåäàêòèðîâàíèÿ.
170
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.2. Èñïîëüçîâàíèå ÷èñåë è êîíñòàíò â ÿçûêå AHDL 3.2.1. Èñïîëüçîâàíèå ÷èñåë ×èñëà èñïîëüçóþòñÿ äëÿ ïðåäñòàâëåíèÿ êîíñòàíò â áóëåâûõ âûðàæåíèÿõ è óðàâíåíèÿõ. ßçûê AHDL ïîääåðæèâàåò âñå êîìáèíàöèè äåñÿòè÷íûõ, äâîè÷íûõ, âîñüìåðè÷íûõ è øåñòíàäöàòåðè÷íûõ ÷èñåë. Íèæå ïðèâåäåí ôàéë decode1.tdf, êîòîðûé ïðåäñòàâëÿåò ñîáîé äåøèôðàòîð àäðåñà, ãåíåðèðóþùèé âûñîêèé àêòèâíûé óðîâåíü ñèãíàëà ðàçðåøåíèÿ äîñòóïà ê øèíå, åñëè àäðåñ ðàâåí øåñòíàäöàòåðè÷íîìó ÷èñëó 370h. SUBDESIGN decode1 ( address[15..0] : INPUT; chip_enable : OUTPUT; ) BEGIN chip_enable = (address[15..0] == H"0370"); END;  ýòîì ïðèìåðå äåñÿòè÷íûå ÷èñëà èñïîëüçîâàíû äëÿ óêàçàíèÿ ðàçìåðíîñòè ìàññèâà áèò, êîòîðûì çàïèñûâàåòñÿ àäðåñ øèíû. Øåñòíàäöàòåðè÷íûì ÷èñëîì H"0370" çàïèñàíî çíà÷åíèå àäðåñà, ïðè êîòîðîì îáåñïå÷èâàåòñÿ âûñîêèé óðîâåíü ñèãíàëà.
3.2.2. Èñïîëüçîâàíèå êîíñòàíò  ôàéëå AHDL ìîæíî èñïîëüçîâàòü êîíñòàíòû äëÿ îïèñàòåëüíûõ èìåí ðàçíûõ ÷èñåë. Òàêîå èìÿ, èñïîëüçóåìîå íà ïðîòÿæåíèè âñåãî ôàéëà, ìîæåò áûòü áîëåå èíôîðìàòèâíûì, ÷åì ÷èñëî; íàïðèìåð èìÿ UPPER_LI íåñåò áîëüøå èíôîðìàöèè, ÷åì ÷èñëî 103.  ÿçûêå AHDL êîíñòàíòû ââîäÿòñÿ îáúÿâëåíèåì CONSTANT. Ïðèâåäåííûé âûøå ôàéë ìîæíî çàïèñàòü ïîäðóãîìó, èñïîëüçóÿ âìåñòî ÷èñëà H"0370" êîíñòàíòó IO_ADDRESS. CONSTANT IO_ADDRESS = H"0370"; SUBDESIGN decode2 (
171
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL a[15..0] : INPUT; ce : OUTPUT; ) BEGIN ce = (a[15..0] == IO_ADDRESS); END; Ïðåèìóùåñòâî èñïîëüçîâàíèÿ êîíñòàíò îñîáåííî çàìåòíî, åñëè îäíî è òî æå ÷èñëî èñïîëüçóåòñÿ â ôàéëå íåñêîëüêî ðàç. Òîãäà, åñëè åãî íóæíî èçìåíèòü, ìåíÿþò åãî òîëüêî îäèí ðàç â îáúÿâëåíèè êîíñòàíòû.
3.3. Kîìáèíàöèîííàÿ ëîãèêà Kàê èçâåñòíî, ëîãè÷åñêàÿ ñõåìà íàçûâàåòñÿ êîìáèíàöèîííîé, åñëè â çàäàííûé ìîìåíò âðåìåíè âûõîäû ÿâëÿþòñÿ òîëüêî ôóíêöèÿìè âõîäîâ â ýòîò ìîìåíò âðåìåíè. Kîìáèíàöèîííàÿ ëîãèêà â ÿçûêå AHDL ðåàëèçîâàíà áóëåâûìè âûðàæåíèÿìè è óðàâíåíèÿìè, òàáëèöàìè èñòèííîñòè è áîëüøèì êîëè÷åñòâîì ìàêðîôóíêöèé.  ÷èñëî ïðèìåðîâ êîìáèíàòîðíûõ ëîãè÷åñêèõ ôóíêöèé âõîäÿò äåøèôðàòîðû, ìóëüòèïëåêñîðû è ñóììàòîðû.
3.3.1. Ðåàëèçàöèÿ áóëåâûõ âûðàæåíèé è óðàâíåíèé Áóëåâû âûðàæåíèÿ ýòî ìíîæåñòâî óçëîâ, ÷èñåë, êîíñòàíò è äðóãèõ áóëåâûõ âûðàæåíèé, âûäåëÿåìûõ îïåðàòîðàìè, êîìïàðàòîðàìè, è, âîçìîæíî, ñãðóïïèðîâàííûå â çàêëþ÷àþùèõ êðóãëûõ ñêîáêàõ. Áóëåâî óðàâíåíèå óñòàíàâëèâàåò ðàâåíñòâî ìåæäó óçëîì èëè ãðóïïîé è áóëåâûì âûðàæåíèåì.  êà÷åñòâå ïðèìåðà ïðèâåäåí ôàéë boole1.tdf, â êîòîðîì äàíû äâà ïðîñòûõ áóëåâûõ âûðàæåíèÿ, ïðåäñòàâëÿþùèå äâà ëîãè÷åñêèõ ýëåìåíòà. SUBDESIGN boole1 ( a0, a1, b : INPUT; out1, out2 : OUTPUT; ) BEGIN out1 = a1 & !a0; out2 = out1 # b; END;
172
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Çäåñü âûõîä out1 ïîëó÷àåòñÿ â ðåçóëüòàòå ëîãè÷åñêîé îïåðàöèè «È», ïðèìåíåííîé êî âõîäó à1 è èíâåðòèðîâàííîìó âõîäó à0, à âûõîä out2 â ðåçóëüòàòå ïðèìåíåíèÿ ëîãè÷åñêîé îïåðàöèè «ÈËÈ» ê âûõîäó out1 è âõîäó b. Ïîñêîëüêó ýòè óðàâíåíèÿ îáðàáàòûâàþòñÿ îäíîâðåìåííî, ïîñëåäîâàòåëüíîñòü èõ ñëåäîâàíèÿ â ôàéëå íå âàæíà.
3.3.2. Îáúÿâëåíèå NODE (óçåë) Óçåë, êîòîðûé îáúÿâëÿåòñÿ â ñåêöèè ïåðåìåííûõ VARIABLE â îáúÿâëåíèè NODE, ìîæíî èñïîëüçîâàòü äëÿ õðàíåíèÿ ïðîìåæóòî÷íûõ âûðàæåíèé. Ýòî ïîëåçíî äåëàòü, åñëè áóëåâî âûðàæåíèå ïîâòîðÿåòñÿ íåñêîëüêî ðàç è åãî öåëåñîîáðàçíî çàìåíèòü èìåíåì óçëà. Ïðèâåäåííûé âûøå ôàéë boole1.tdf ìîæíî ïåðåïèñàòü ïî-äðóãîìó: SUBDESIGN boole2 ( a0, a1, b : INPUT; out : OUTPUT; ) VARIABLE a_equals_2 : NODE; BEGIN a_equals_2 = a1 & !a0; out = a_equals_2 # b; END; Çäåñü îáúÿâëÿåòñÿ óçåë a_equals_2, è åìó ïðèñâàèâàåòñÿ çíà÷åíèå âûðàæåíèÿ a1 & !a0. Èñïîëüçîâàíèå óçëîâ ïîìîãàåò ýêîíîìèòü ðåñóðñû óñòðîéñòâ, åñëè óçåë èñïîëüçóåòñÿ â íåñêîëüêèõ âûðàæåíèÿõ.
3.3.3. Îïðåäåëåíèå ãðóïï Ãðóïïà ìîæåò âêëþ÷àòü â ñåáÿ äî 256 ýëåìåíòîâ (áèò), ðàññìàòðèâàåòñÿ êàê ñîâîêóïíîñòü óçëîâ è ó÷àñòâóåò â ðàçëè÷íûõ äåéñòâèÿõ êàê åäèíîå öåëîå.  áóëåâûõ óðàâíåíèÿõ ãðóïïà ìîæåò áûòü ïðèðàâíåíà áóëåâîìó âûðàæåíèþ, äðóãîé ãðóïïå, îäíîìó óçëó, VCC, GND, 1 èëè 0.  êàæäîì ñëó÷àå çíà÷åíèÿ ãðóïïû ðàçíûå. Åñëè ãðóïïà îïðåäåëåíà, äëÿ êðàòêîãî óêàçàíèÿ âñåãî äèàïàçîíà ñòàâÿò äâå êâàäðàòíûå ñêîáêè [ ]. Íàïðèìåð, ãðóïïó à[4..1] ìîæíî êðàòêî çàïèñàòü êàê à[ ].
173
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Ïðèìåðû îïðåäåëåíèÿ ãðóïï:
• Ïðè ïðèðàâíèâàíèè äâóõ ãðóïï îáå äîëæíû èìåòü îäèíàêîâîå ÷èñëî
•
•
•
áèò.  ïðèâîäèìîì íèæå ïðèìåðå êàæäûé áèò ïåðâîé ãðóïïû ñîåäèíÿåòñÿ ñ ñîîòâåòñòâóþùèì áèòîì âòîðîé ãðóïïû, à èìåííî d2 ñîåäèíÿåòñÿ ñ q8, d1 ñ q7 è d0 ñ q6: d[2..0] = q[8..6] Ïðè ïðèðàâíèâàíèè ãðóïïû îäíîìó óçëó âñå áèòû ãðóïïû ïðèñîåäèíÿþòñÿ ê óçëó.  ïðèâîäèìîì íèæå ïðèìåðå d1, d2 è d0 ïðèñîåäèíÿþòñÿ âñå âìåñòå ê n: d[2..0] = n Ïðè ïðèðàâíèâàíèè ãðóïïû çíà÷åíèþ VCC èëè GND âñå áèòû ãðóïïû ïðèñîåäèíÿþòñÿ ê ýòîìó çíà÷åíèþ.  ïðèâîäèìîì íèæå ïðèìåðå d1, d2 è d0 ïðèñîåäèíÿþòñÿ âñå âìåñòå ê VCC: d[2..0] = VCC Ïðè ïðèðàâíèâàíèè ãðóïïû ê 1 ìëàäøèé áèò ãðóïïû ïðèñîåäèíÿåòñÿ ê VCC, à âñå äðóãèå áèòû ê çíà÷åíèþ GND.  ïðèâîäèìîì íèæå ïðèìåðå òîëüêî d0 ïðèñîåäèíÿåòñÿ ê VCC, çíà÷åíèå 1 ðàñøèðÿåòñÿ äî ïðåäñòàâëåíèÿ B"001". d[2..0] = 1
3.3.4. Ðåàëèçàöèÿ óñëîâíîé ëîãèêè Óñëîâíàÿ ëîãèêà äåëàåò âûáîð ìåæäó ðåæèìàìè â çàâèñèìîñòè îò ëîãè÷åñêèõ âõîäîâ. Äëÿ ðåàëèçàöèè óñëîâíîé ëîãèêè èñïîëüçóþòñÿ îïåðàòîðû IF èëè CASE.  îïåðàòîðå IF îöåíèâàþòñÿ îäíî èëè íåñêîëüêî áóëåâûõ âûðàæåíèé, è çàòåì îïèñûâàþòñÿ ðåæèìû äëÿ ðàçíûõ çíà÷åíèé ýòèõ âûðàæåíèé.  îïåðàòîðå CASE äàåòñÿ ñïèñîê àëüòåðíàòèâ, êîòîðûå èìåþòñÿ äëÿ êàæäîãî âîçìîæíîãî çíà÷åíèÿ íåêîòîðîãî âûðàæåíèÿ. Îïåðàòîð îöåíèâàåò çíà÷åíèå âûðàæåíèÿ è ïî íåìó âûáèðàåò ðåæèì â ñîîòâåòñòâèè ñî ñïèñêîì. 3.3.4.1. Ëîãèêà îïåðàòîðà IF  êà÷åñòâå ïðèìåðà ðàññìîòðèì ôàéë priority.tdf, â êîòîðîì îïèñàí êîäèðîâùèê ïðèîðèòåòà, êîòîðûé ïðåîáðàçóåò óðîâåíü ñàìîãî ïðèîðèòåòíîãî àêòèâíîãî âõîäà â çíà÷åíèå. Îí ãåíåðèðóåò äâóõðàçðÿäíûé êîä, ïîêàçûâàþùèé âõîä ñ íàèâûñøèì ïðèîðèòåòîì, çàïóñêàåìûé VCC.
174
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL SUBDESIGN priority ( low, middle, high : INPUT; highest_level[1..0] : OUTPUT; ) BEGIN IF high THEN highest_level[] ELSIF middle THEN highest_level[] ELSIF low THEN highest_level[] ELSE highest_level[] END IF; END;
= 3; = 2; = 1; = 0;
Çäåñü îöåíèâàþòñÿ âõîäû low, middle è high, ÷òîáû îïðåäåëèòü, çàïóùåíû ëè îíè VCC. Íà âûõîäå ïîëó÷èòñÿ êîä, ñîîòâåòñòâóþùèé ïðèîðèòåòó òîãî âõîäà, êîòîðûé áûë çàïóùåí VCC. Åñëè íè îäèí âõîä íå çàïóùåí, çíà÷åíèå êîäà ñòàíåò 0. 3.3.4.2. Ëîãèêà îïåðàòîðà CASE  êà÷åñòâå ïðèìåðà ðàññìîòðèì ôàéë decoder.tdf, ðåàëèçóþùèé ôóíêöèè äåøèôðàòîðà, ïðåîáðàçóþùåãî êîä èç äâóõðàçðÿäíîãî â ÷åòûðåõðàçðÿäíûé.  ðåçóëüòàòå åãî ðàáîòû äâà äâóõðàçðÿäíûõ äâîè÷íûõ âõîäà ïðåîáðàçóþòñÿ â îäèí «ãîðÿ÷èé êîä», êîòîðûé òàê íàçûâàåòñÿ ïîòîìó, ÷òî ÷åòûðå åãî äîïóñòèìûõ çíà÷åíèÿ ñîäåðæàò ïî îäíîé åäèíèöå: 0001, 0010, 0100, 1000. SUBDESIGN decoder ( code[1..0] : INPUT; out[3..0] : OUTPUT; ) BEGIN
175
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
WHEN WHEN WHEN WHEN
0 1 2 3
=> => => =>
CASE code[] IS out[] = B"0001"; out[] = B"0010"; out[] = B"0100"; out[] = B"1000"; END CASE;
END; Çäåñü ãðóïïà âõîäà code [1..2] ìîæåò ïðèíèìàòü çíà÷åíèÿ 0, 1, 2, 3.  çàâèñèìîñòè îò ðåàëüíîãî êîäà àêòèâèçèðóåòñÿ ñîîòâåòñòâóþùàÿ âåòâü îïåðàòîðà, è òîëüêî îíà îäíà â äàííûé ìîìåíò âðåìåíè. Íàïðèìåð, åñëè íà âõîäå code [ ] ðàâåí 1, íà âûõîäå out óñòàíàâëèâàåòñÿ çíà÷åíèå Â"0010". 3.3.4.3. Ñðàâíåíèå îïåðàòîðîâ IF è CASE Îïåðàòîðû IF è CASE ïîõîæè. Èíîãäà èñïîëüçîâàíèå ëþáîãî èç íèõ ïðèâîäèò ê îäíèì è òåì æå ðåçóëüòàòàì: IF THEN
CASE
IF a[] == 0 THEN y = c & d;
CASE a[] IS WHEN 0 => y = c & d; WHEN 1 => y = e & f; WHEN 2 => y = g & h; WHEN 3 => y = i; WHEN OTHERS => y = GND; END CASE;
ELSIF a[] == 1 THEN y = e & f; ELSIF a[] == 2 THEN y = g & h; ELSIF a[] == 3 THEN y = i; ELSE y = GND; END IF;
Îäíàêî ìåæäó ýòèìè äâóìÿ îïåðàòîðàìè ñóùåñòâóþò íåñêîëüêî âàæíûõ ðàçëè÷èé: •  îïåðàòîðå IF ìîæíî èñïîëüçîâàòü ëþáîå áóëåâî âûðàæåíèå. Kàæäîå âûðàæåíèå, çàïèñûâàåìîå â ïðåäëîæåíèè, ñëåäóþùåì çà IF èëè ELSEIF, ìîæåò íå áûòü ñâÿçàííûì ñ äðóãèìè âûðàæåíèÿìè â îïåðàòîðå.  îïåðàòîðå CASE îäíî-åäèíñòâåííîå âûðàæåíèå ñðàâíèâàåòñÿ ñ ïðîâåðÿåìûì çíà÷åíèåì.
176
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
• Â ðåçóëüòàòå èíòåðïðåòàöèè îïåðàòîðà IF ìîæåò áûòü ñãåíåðèðîâàíà ëîãèêà, ñëèøêîì ñëîæíàÿ äëÿ êîìïèëÿòîðà ñèñòåìû MAX+PLUS II. Â ïðèâåäåííîì íèæå ïðèìåðå ïîêàçàíî, êàê êîìïèëÿòîð èíòåðïðåòèðóåò îïåðàòîð IF. Åñëè à è b ñëîæíûå âûðàæåíèÿ, òî èíâåðñèÿ êàæäîãî èç íèõ äàñò åùå áîëåå ñëîæíîå âûðàæåíèå. IF a THEN IF a THEN c = d; c = d; END IF; ELSIF b THEN c = e;
IF !a & b THEN c = e; END IF;
ELSE c = f; END IF;
IF !a & !b THEN c = f; END IF;
3.3.5. Îïèñàíèå äåøèôðàòîðîâ Äåøèôðàòîð ñîäåðæèò êîìáèíàòîðíóþ ëîãèêó, êîòîðàÿ ïðåîáðàçóåò âõîäíûå ñõåìû â âûõîäíûå çíà÷åíèÿ èëè çàäàåò âûõîäíûå çíà÷åíèÿ äëÿ âõîäíûõ ñõåì. Äëÿ ñîçäàíèÿ äåøèôðàòîðà â ÿçûêå AHDL èñïîëüçóåòñÿ îáúÿâëåíèå òàáëèöû èñòèííîñòè TABLE. Íèæå ïðèâåäåí ôàéë 7segment.tdf, ïðåäñòàâëÿþùèé ñîáîé äåøèôðàòîð, êîòîðûé çàäàåò ëîãèêó ñõåìû ñâåòîäèîäîâ. Ñâåòîäèîäû ñâåòÿòñÿ íà ñåìèñåãìåíòíîì äèñïëåå äëÿ èíäèêàöèè øåñòíàäöàòåðè÷íîé öèôðû (îò 0 äî 9 è áóêâû îò A äî F). % % % % % % % %
a % f| |b % g % e| |c % d % % 0 1 2 3 4 5 6 7 8 9 A b C d E F % %
SUBDESIGN 7segment
177
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ( i[3..0] : INPUT; a, b, c, d, e, f, g : OUTPUT; ) BEGIN TABLE i[3..0] => a, b, c, d, e, f, g; H"0" => 1, H"1" => 0, H"2" => 1, H"3" => 1, H"4" => 0, H"5" => 1, H"6" => 1, H"7" => 1, H"8" => 1, H"9" => 1, H"A" => 1, H"B" => 0, H"C" => 1, H"D" => 0, H"E" => 1, H"F" => 1, END TABLE; END;
1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0,
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0,
1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1,
0; 0; 1; 1; 1; 1; 1; 0; 1; 1; 1; 1; 0; 1; 1; 1;
 ýòîì ïðèìåðå ïåðå÷èñëåíû âñå âîçìîæíûå øåñòíàäöàòåðè÷íûå öèôðû (i[3..0]) è ñîîòâåòñòâóþùèå èì ñîñòîÿíèÿ ñâåòîäèîäîâ (a, b, c, d, e, f, g), êîòîðûå îáåñïå÷èâàþò «íà÷åðòàíèå» öèôðû íà äèñïëåå. Èçîáðàæåíèå ñâåòîäèîäîâ íà äèñïëåå äàíî â âèäå êîììåíòàðèÿ ïåðåä ôàéëîì. Íèæå ïðèâåäåí ôàéë äåøèôðàòîðà àäðåñà decode3.tdf äëÿ øåñòíàäöàòèðàçðÿäíîé ìèêðîïðîöåññîðíîé ñèñòåìû. SUBDESIGN decode3 ( addr[15..0], m/io : INPUT; rom, ram, print, sp[2..1] : OUTPUT;
178
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ) BEGIN TABLE m/io, addr[15..0] => rom, 1, B"00XXXXXXXXXXXXXX" => 1, B"100XXXXXXXXXXXXX" => 0, B"0000001010101110" => 0, B"0000001011011110" => 0, B"0000001101110000" => END TABLE; END;
ram, print, sp[]; 1, 0, 0, B"00"; 0, 1, 0, B"00"; 0, 0, 1, B"00"; 0, 0, 0, B"01"; 0, 0, 0, B"10";
 äàííîì ïðèìåðå ñóùåñòâóþò òûñÿ÷è âîçìîæíûõ âàðèàíòîâ âõîäà (àäðåñà), ïîýòîìó áûëî áû íåïðàêòè÷íî ñâîäèòü èõ âñå â òàáëèöó. Âìåñòî ýòîãî ìîæíî ïîìåòèòü ñèìâîëîì Õ íåñóùåñòâåííûå, íå âëèÿþùèå íà âûõîä ðàçðÿäû. Íàïðèìåð, âûõîäíîé ñèãíàë rom (ÏÇÓ) áóäåò âûñîêèì äëÿ âñåõ 16384 âàðèàíòîâ àäðåñà addr[15..0], êîòîðûå íà÷èíàþòñÿ ñ 00. Ïîýòîìó âàì íóæíî òîëüêî óêàçàòü îáùóþ äëÿ âñåõ âàðèàíòîâ ÷àñòü êîäà, ò.å. 00, à â îñòàëüíûõ ðàçðÿäàõ êîäà ïîñòàâèòü Õ. Òàêîé ïðèåì ïîçâîëèò ñäåëàòü ïðîåêò, òðåáóþùèé ìåíüøå óñòðîéñòâ è ðåñóðñîâ. Ïðèâåäåííûé íèæå ïðèìåð decode4.tdf ïîêàçûâàåò èñïîëüçîâàíèå ñòàíäàðòíîé ïàðàìåòðèçèðóåìîé ôóíêöèè lpm_decode â çàäà÷å ðàçðàáîòêè äåøèôðàòîðà, àíàëîãè÷íàÿ ïðèìåðó decode1.tdf. INCLUDE "lpm_decode.inc"; SUBDESIGN decode4 ( address[15..0] : INPUT; chip_enable : OUTPUT; ) BEGIN chip_enable = lpm_decode(.data[]=address[]) WITH (LPM_WIDTH=16, LPM_DECODES=2^10) RETURNS (.eq[H"0370"]); END;
179
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.3.6. Èñïîëüçîâàíèå äëÿ ïåðåìåííûõ çíà÷åíèé ïî óìîë÷àíèþ Ìîæíî îïðåäåëèòü çíà÷åíèÿ ïî óìîë÷àíèþ äëÿ óçëà èëè ãðóïïû, êîòîðûå áóäóò àâòîìàòè÷åñêè èñïîëüçîâàòüñÿ äëÿ íèõ, åñëè â ôàéëå èõ çíà÷åíèÿ íå áóäóò çàäàíû. ßçûê AHDL ïîçâîëÿåò ïðèñâàèâàòü çíà÷åíèå óçëó èëè ãðóïïå â ôàéëå íåîäíîêðàòíî. Åñëè ïðè ýòîì ïðîèçîéäåò êîíôëèêò, ñèñòåìà àâòîìàòè÷åñêè áóäåò èñïîëüçîâàòü çíà÷åíèÿ ïî óìîë÷àíèþ. Åñëè çíà÷åíèÿ ïî óìîë÷àíèþ íå áûëè çàäàíû, èñïîëüçóåòñÿ çíà÷åíèå GND. Îáúÿâëåíèå çíà÷åíèé ïî óìîë÷àíèþ DEFAULTS ìîæíî èñïîëüçîâàòü äëÿ çàäàíèÿ ïåðåìåííûõ â òàáëèöå èñòèííîñòè, îïåðàòîðàõ IF è CASE. Ïðèìå÷àíèå. Íå ñëåäóåò ïóòàòü çíà÷åíèÿ ïî óìîë÷àíèþ äëÿ ïåðåìåííûõ ñî çíà÷åíèÿìè ïî óìîë÷àíèþ äëÿ ïîðòîâ, êîòîðûå çàäàþòñÿ â ñåêöèè SUBDESIGN. Íèæå ïðèâîäèòñÿ ôàéë default1.tdf, â êîòîðîì ïðîèñõîäèò îöåíêà âõîäîâ è âûáîð ñîîòâåòñòâóþùåãî ASCII êîäà. SUBDESIGN default1 ( i[3..0] : INPUT; ascii_code[7..0] : OUTPUT; ) BEGIN DEFAULTS ascii_code[] = B"00111111";% ASCII question mark"?" % END DEFAULTS; TABLE i[3..0] => ascii_code[]; B"1000" => B"01100001"; % "a" % B"0100" => B"01100010"; % "b" % B"0010" => B"01100011"; % "c" % B"0001" => B"01100100"; % "d" % END TABLE; END; Åñëè çíà÷åíèå âõîäà ñîâïàäàåò ñ îäíèì èç çíà÷åíèé â ëåâîé ÷àñòè òàáëèöû, êîä íà âûõîäå ïðèîáðåòàåò ñîîòâåòñòâóþùåå çíà÷åíèå ASCII êîäà â ïðàâîé ÷àñòè òàáëèöû. Åñëè âõîäíîå çíà÷åíèå íå ñîâïàäàåò íè ñ îäíèì èç (â ëåâîé êîëîíêå) òàáëè÷íûõ, âûõîäó áóäåò ïðèñâîåíî çíà÷åíèå ïî óìîë÷àíèþ B"00111111" (âîïðîñèòåëüíûé çíàê).
180
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL  ïðèâåäåííîì íèæå ôàéëå default2.tdf ïîêàçàíî, êàê ïðè ìíîãîêðàòíîì ïðèñâàèâàíèè óçëó ðàçíûõ çíà÷åíèé âîçíèêàåò êîíôëèêò è êàê îí ðàçðåøàåòñÿ ñðåäñòâàìè AHDL. SUBDESIGN default2 ( a, b, c : INPUT; select_a, select_b, select_c : INPUT; wire_or, wire_and : OUTPUT; ) BEGIN DEFAULTS wire_or = GND; wire_and = VCC; END DEFAULTS; IF select_a THEN wire_or = a; wire_and = a; END IF; IF select_b THEN wire_or = b; wire_and = b; END IF; IF select_c THEN wire_or = c; wire_and = c; END IF; END;  äàííîì ïðèìåðå âûõîä wire_or óñòàíàâëèâàåòñÿ ðàâíûì a, b èëè ñ â çàâèñèìîñòè îò âõîäíûõ ñèãíàëîâ select_a, select_b è select_c. Åñëè íè îäèí èç íèõ íå ðàâåí VCC, òî âûõîä wire_or ïðèíèìàåò çíà÷åíèå ïî óìîë÷àíèþ, ðàâíîå GND. Åñëè áîëåå îäíîãî ñèãíàëà (select_a, select_b èëè select_c) ðàâíû VCC, òî wire_or ðàâíî ðåçóëüòàòó ëîãè÷åñêîé îïåðàöèè «ÈËÈ» íàä ñîîòâåòñòâóþùèìè âõîäíûìè ñèãíàëàìè. Íàïðèìåð, åñëè select_a è select_b ðàâíû VCC, òî wire_or ðàâíî a èëè b. Ñ ñèãíàëîì wire_and ïðîèçâîäÿòñÿ àíàëîãè÷íûå äåéñòâèÿ, íî îí ñòàíîâèòñÿ ðàâíûì VCC, êîãäà âõîäíûå ñèãíàëû select ðàâíû VCC, è ðàâåí ëî-
181
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ãè÷åñêîìó «È» îò ñîîòâåòñòâóþùèõ âõîäíûõ ñèãíàëîâ, åñëè áîëåå ÷åì îäèí èç íèõ ðàâåí VCC.
3.3.7. Ðåàëèçàöèÿ ëîãèêè ñ àêòèâíûì íèçêèì óðîâíåì Çíà÷åíèå ñèãíàëà ñ íèçêèì àêòèâíûì óðîâíåì ðàâíî GND. Ñèãíàëû ñ íèçêèì àêòèâíûì óðîâíåì ìîãóò áûòü èñïîëüçîâàíû äëÿ óïðàâëåíèÿ ïàìÿòüþ, ïåðèôåðèéíûìè óñòðîéñòâàìè è ìèêðîïðîöåññîðíûìè ÷èïàìè. Íèæå ïðèâîäèòñÿ ôàéë daisy.tdf, êîòîðûé ïðåäñòàâëÿåò ìîäóëü àðáèòðàæíîé ñõåìû äëÿ ñîåäèíåíèÿ «ãèðëÿíäîé» (daisy chain). Äàííûé ìîäóëü äåëàåò çàïðîñ íà äîñòóï ê øèíå äëÿ ïðåäûäóùåãî (â «ãèðëÿíäå») ìîäóëÿ. Îí ïîëó÷àåò çàïðîñ íà äîñòóï ê øèíå îò ñàìîãî ñåáÿ è îò ñëåäóþùåãî (â öåïî÷êå) ìîäóëÿ. Äîñòóï ê øèíå ïðåäîñòàâëÿåòñÿ òîìó ìîäóëþ, ó êîòîðîãî ïðèîðèòåò âûøå. SUBDESIGN daisy ( /local_request : INPUT; /local_grant : OUTPUT; /request_in : INPUT; % from lower priority % /request_out : OUTPUT; % to higher priority % /grant_in : INPUT; % from higher priority % /grant_out : OUTPUT; % to lower priority % ) BEGIN DEFAULTS /local_grant = VCC; % activelow output % /request_out = VCC; % signals should default % /grant_out = VCC; % to VCC % END DEFAULTS; IF /request_in == GND # /local_request == GND THEN /request_out = GND; END IF; IF /grant_in == GND THEN IF /local_request == GND THEN /local_grant = GND; ELSIF /request_in == GND THEN /grant_out = GND;
182
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL END IF; END IF; END; Âñå ñèãíàëû â äàííîì ôàéëå èìåþò àêòèâíûé íèçêèé óðîâåíü. Ôèðìà «Altera» ðåêîìåíäóåò ïîìå÷àòü êàê-ëèáî èìåíà ñèãíàëîâ ñ íèçêèì àêòèâíûì óðîâíåì, íàïðèìåð ïåðâûì ñèìâîëîì â èìåíè ñòàâèòü ñèìâîë /, êîòîðûé íå ÿâëÿåòñÿ îïåðàòîðîì, è èñïîëüçîâàòü åãî ïîñòîÿííî.  îïåðàòîðå IF ïðîâåðÿåòñÿ, ÿâëÿåòñÿ ëè ìîäóëü àêòèâíûì, ò.å. ðàâåí ëè îí GND. Åñëè ìîäóëü îêàçûâàåòñÿ àêòèâíûì, ðåàëèçóþòñÿ äåéñòâèÿ, çàïèñàííûå â îïåðàòîðå IF.  îáúÿâëåíèè ïî óìîë÷àíèþ DEFAULTS ñ÷èòàåòñÿ, ÷òî ñèãíàëó ïðèñâàèâàåòñÿ çíà÷åíèå VCC, åñëè îí íåàêòèâåí.
3.3.8. Ðåàëèçàöèÿ äâóíàïðàâëåííûõ âûâîäîâ Ñèñòåìà MAX+PLUS II ïîçâîëÿåò êîíôèãóðèðîâàòü ïîðòû ââîäà/âûâîäà â óñòðîéñòâàõ «Altera» êàê äâóíàïðàâëåííûå ïîðòû. Äâóíàïðàâëåííûé âûâîä çàäàåòñÿ êàê ïîðò BIDIR, êîòîðûé ïîäñîåäèíÿåòñÿ ê âûõîäó ïðèìèòèâà TRI. Ñèãíàë ìåæäó ýòèì âûâîäîì è áóôåðîì ñ òðåìÿ ñîñòîÿíèÿìè ÿâëÿåòñÿ äâóíàïðàâëåííûì, è åãî ìîæíî èñïîëüçîâàòü â ïðîåêòå äëÿ çàïóñêà äðóãèõ ëîãè÷åñêèõ ñõåì. Ïðèâîäèìûé íèæå ôàéë bus_reg2.tdf ðåàëèçóåò ðåãèñòð, êîòîðûé äåëàåò âûáîðêó çíà÷åíèÿ, íàéäåííîãî íà øèíå ñ òðåìÿ ñîñòîÿíèÿìè, à òàêæå ìîæåò ïåðåäàòü îáðàòíî íà øèíó õðàíèìîå çíà÷åíèå. SUBDESIGN bus_reg2 ( clk : INPUT; oe : INPUT; io : BIDIR; ) BEGIN io = TRI(DFF(io, clk,, ), oe); END; Äâóíàïðàâëåííûé ñèãíàë io, çàïóñêàåìûé ïðèìèòèâîì TRI, èñïîëüçóåòñÿ â êà÷åñòâå âõîäà d äëÿ D-òðèããåðà (DFF). Çàïÿòûå â êîíöå ñïèñêà ïàðàìåòðîâ îòäåëÿþò ìåñòà äëÿ ñèãíàëîâ òðèããåðà clrn è prn. Ýòè ñèãíàëû ïî óìîë÷àíèþ óñòàíîâëåíû â íåàêòèâíîå ñîñòîÿíèå.
183
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Äâóíàïðàâëåííûé âûâîä ìîæíî òàêæå èñïîëüçîâàòü äëÿ ïîäñîåäèíåíèÿ TDF-ôàéëà áîëåå íèçêîãî óðîâíÿ ê âûâîäó ñ âûñîêèì óðîâíåì. Ïðîòîòèï ôóíêöèè äëÿ TDF-ôàéëà áîëåå íèçêîãî óðîâíÿ äîëæåí ñîäåðæàòü äâóíàïðàâëåííûé âûâîä â ïðåäëîæåíèè RETURNS.  ïðèâåäåííîì íèæå ôàéëå bidir1.tdf äàíû ÷åòûðå ïðèìåðà èñïîëüçîâàíèÿ ìàêðîôóíêöèè bus_reg2. FUNCTION bus_reg2 (clk, oe) RETURNS (io); SUBDESIGN bidir1 ( clk, oe : INPUT; io[3..0] : BIDIR; ) BEGIN io0 = bus_reg2(clk, oe); io1 = bus_reg2(clk, oe); io2 = bus_reg2(clk, oe); io3 = bus_reg2(clk, oe); END;
3.4. Ïîñëåäîâàòåëüíîñòíàÿ ëîãèêà Ëîãè÷åñêàÿ ñõåìà íàçûâàåòñÿ ïîñëåäîâàòåëüíîñòíîé, åñëè âûõîäû â çàäàííûé ìîìåíò âðåìåíè ÿâëÿþòñÿ ôóíêöèåé âõîäîâ íå òîëüêî â òîò æå ìîìåíò, íî è âî âñå ïðåäûäóùèå ìîìåíòû âðåìåíè. Òàêèì îáðàçîì, â ïîñëåäîâàòåëüíîñòíóþ ñõåìó äîëæíû âõîäèòü íåêîòîðûå ýëåìåíòû ïàìÿòè (òðèããåðû).  ÿçûêå AHDL ïîñëåäîâàòåëüíîñòíàÿ ëîãèêà ðåàëèçîâàíà öèôðîâûìè àâòîìàòàìè ñ ïàìÿòüþ (state machines), ðåãèñòðàìè è òðèããåðàìè. Ïðè ýòîì ñðåäñòâà îïèñàíèÿ öèôðîâûõ àâòîìàòîâ çàíèìàþò îñîáîå ìåñòî. Kðîìå òîãî, ê ïîñëåäîâàòåëüíîñòíûì ëîãè÷åñêèì ñõåìàì îòíîñÿòñÿ ðàçëè÷íûå ñ÷åò÷èêè è êîíòðîëëåðû.
3.4.1. Îáúÿâëåíèå ðåãèñòðîâ Ðåãèñòðû èñïîëüçóþòñÿ äëÿ õðàíåíèÿ çíà÷åíèé äàííûõ è ïðîìåæóòî÷íûõ ðåçóëüòàòîâ ñ÷åò÷èêà, òàêòèðîâàíèå îñóùåñòâëÿåòñÿ ñèíõðîñèãíàëîì. Ðåãèñòð ñîçäàåòñÿ åãî îáúÿâëåíèåì â ñåêöèè VARIABLE. Äëÿ ïîäñîåäèíåíèÿ ïðèìåðà ïðèìèòèâà, ìàêðîôóíêöèè èëè öèôðîâîãî àâòîìàòà ê äðóãîé ëîãèêå â TDF-ôàéë ìîæíî èñïîëüçîâàòü ïîðòû. Ïîðò ïðèìåðà îïèñûâàåòñÿ â ñëåäóþùåì ôîðìàòå: <èìÿ ïðèìåðà>.<èìÿ ïîðòà>.
184
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Èìÿ ïîðòà ýòî âõîä èëè âûõîä ïðèìèòèâà, ìàêðîôóíêöèè èëè öèôðîâîãî àâòîìàòà, ÷òî ÿâëÿåòñÿ ñèíîíèìîì èìåíè âûâîäà â ôàéëàõ ïðîåêòîâ GDF-ôàéë, WDF è äðóãèõ. Íèæå ïðèâîäèòñÿ ôàéë bur_reg.tdf, ñîäåðæàùèé áàéòîâûé ðåãèñòð, êîòîðûé ôèêñèðóåò çíà÷åíèÿ íà âõîäàõ d ïî âûõîäàì q íà ôðîíòå ñèíõðîèìïóëüñà, êîãäà óðîâåíü çàãðóçêè âûñîêèé. SUBDESIGN bur_reg ( clk, load, d[7..0] : INPUT; q[7..0] : OUTPUT; ) VARIABLE ff[7..0] : DFFE; BEGIN ff[].clk = clk; ff[].ena = load; ff[].d = d[]; q[] = ff[].q; END; Kàê âèäíî èç ôàéëà, ðåãèñòð îáúÿâëåí â ñåêöèè VARIABLE êàê Dòðèããåð ñ ðàçðåøåíèåì (DFFE).  ïåðâîì áóëåâîì óðàâíåíèè â ëîãè÷åñêîé ñåêöèè ïðîèñõîäèò ñîåäèíåíèå âõîäà òàêòîâîãî ñèãíàëà ïîäïðîåêòà ê ïîðòàì òàêòîâîãî ñèãíàëà òðèããåðîâ ff [7..0]. Âî âòîðîì óðàâíåíèè îòïèðàþùèé òàêòîâûé ñèãíàë ñîåäèíÿåòñÿ ñ çàãðóçêîé.  òðåòüåì óðàâíåíèè âõîäû äàííûõ ïîäïðîåêòà ñîåäèíÿþòñÿ ñ ïîðòàìè äàííûõ òðèããåðîâ ff [7..0].  ÷åòâåðòîì óðàâíåíèè âûõîäû ïîäïðîåêòà ñîåäèíÿþòñÿ ñ âûõîäàìè òðèããåðîâ. Âñå ÷åòûðå óðàâíåíèÿ îöåíèâàþòñÿ îäíîâðåìåííî. Ìîæíî òàêæå â ñåêöèè VARIABLE îáúÿâèòü T-, JK- è SR-òðèããåðû è çàòåì èñïîëüçîâàòü èõ â ëîãè÷åñêîé ñåêöèè. Ïðè èñïîëüçîâàíèè T-òðèããåðîâ ïðèäåòñÿ â òðåòüåì óðàâíåíèè èçìåíèòü ïîðò d íà t. Ïðè èñïîëüçîâàíèè JKè SR-òðèããåðîâ âìåñòî òðåòüåãî óðàâíåíèÿ ïðèäåòñÿ çàïèñàòü äâà óðàâíåíèÿ, â êîòîðûõ ïðîèñõîäèò ñîåäèíåíèå ïîðòîâ j è k èëè s è r ñ ñèãíàëàìè. Ïðèìå÷àíèå. Ïðè çàãðóçêå ðåãèñòðà ïî çàäàííîìó ôðîíòó ãëîáàëüíîãî òàêòîâîãî ñèãíàëà ôèðìà «Altera» ðåêîìåíäóåò èñïîëüçîâàòü âõîä ðàçðå-
185
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL øåíèÿ îäíîãî èç ðåãèñòðîâ: DFFE, TFFE, JKFFE èëè SRFFE, ÷òîáû êîíòðîëèðîâàòü çàãðóçêó ðåãèñòðà.
3.4.2. Îáúÿâëåíèå ðåãèñòðîâûõ âûõîäîâ Ìîæíî îáúÿâèòü ðåãèñòðîâûå âûõîäû, åñëè îáúÿâèòü âûõîäû ïîäïðîåêòà êàê D-òðèããåðû â ñåêöèè VARIABLE. Ïðèâåäåííûé íèæå ôàéë reg_out.tdf îáåñïå÷èâàåò òå æå ôóíêöèè, ÷òî è ïðåäûäóùèé ôàéë bur_reg.tdf, íî èìååò ðåãèñòðîâûå âûõîäû. SUBDESIGN reg_out ( clk, load, d[7..0] : INPUT; q[7..0] : OUTPUT; ) VARIABLE q[7..0] : DFFE; BEGIN q[].clk = clk; q[].ena = load; q[] = d[]; END; Ïðè ïðèñâîåíèè çíà÷åíèÿ ðåãèñòðîâîìó âûõîäó â ëîãè÷åñêîé ñåêöèè ýòî çíà÷åíèå ôîðìèðóåò âõîäíûå d-ñèãíàëû ðåãèñòðîâ. Âûõîä ðåãèñòðà íå èçìåíÿåòñÿ äî òåõ ïîð, ïîêà íå ïðèäåò ôðîíò ñèíõðîñèãíàëà. Äëÿ îïðåäåëåíèÿ òàêòèðóþùåãî ñèãíàëà ðåãèñòðà íóæíî èñïîëüçîâàòü îïèñàíèå â ñëåäóþùåì ôîðìàòå: <èìÿ âûõîäíîãî âûâîäà>.clk äëÿ âõîäà òàêòèðóþùåãî ñèãíàëà ðåãèñòðà â ëîãè÷åñêîé ñåêöèè. Ãëîáàëüíûé ñèíõðîñèãíàë ìîæíî ðåàëèçîâàòü ïðèìèòèâîì GLOBAL èëè âûáîðîì â äèàëîãîâîì îêíå êîìïèëÿòîðà logic synthesis (ëîãè÷åñêèé ñèíòåç) îïöèè Automatic Global Clock. Kàæäûé îòïèðàþùèé D-òðèãåð, îáúÿâëåííûé â ñåêöèè VARIABLE, âîçáóæäàåò âûõîä ñ òàêèì æå èìåíåì, ïîýòîìó ìîæíî îáðàùàòüñÿ ê q-âûõîäàì îáúÿâëåííûõ òðèããåðîâ áåç èñïîëüçîâàíèÿ q-ïîðòà ýòèõ òðèããåðîâ.
3.4.3. Ñîçäàíèå ñ÷åò÷èêîâ Ñ÷åò÷èêàìè íàçûâàþòñÿ ïîñëåäîâàòåëüíîñòíûå ëîãè÷åñêèå ñõåìû äëÿ ñ÷åòà òàêòîâûõ èìïóëüñîâ.  íåêîòîðûõ ñ÷åò÷èêàõ ðåàëèçîâàí ñ÷åò íà ñëîæåíèå è
186
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL âû÷èòàíèå (ðåâåðñèâíûå ñ÷åò÷èêè), â íåêîòîðûå ñ÷åò÷èêè ìîæíî çàãðóæàòü äàííûå, à òàêæå îáíóëÿòü èõ. Ñ÷åò÷èêè îáû÷íî îïðåäåëÿþò êàê D-òðèããåðû (DFF è DFFE) è èñïîëüçóþò îïåðàòîðû IF. Íèæå ïðèâåäåí ôàéë ahdlcnt.tdf, êîòîðûé ðåàëèçóåò 16-ðàçðÿäíûé çàãðóæàåìûé ñ÷åò÷èê ñî ñáðîñîì. SUBDESIGN ahdlcnt ( clk, load, ena, clr, d[15..0] : INPUT; q[15..0] : OUTPUT; ) VARIABLE count[15..0] : DFF; BEGIN count[].clk = clk; count[].clrn = !clr; IF load THEN count[].d = d[]; ELSIF ena THEN count[].d = count[].q + 1; ELSE count[].d = count[].q; END IF; q[] = count[]; END;  äàííîì ôàéëå â ñåêöèè VARIABLE îáúÿâëåíû 16 D-òðèããåðîâ, è èì ïðèñâîåíû èìåíà îò count0 äî count15.  îïåðàòîðå IF îïðåäåëÿåòñÿ çíà÷åíèå, çàãðóæàåìîå â òðèããåðû ïî ôðîíòó ñèíõðîñèãíàëà (íàïðèìåð, åñëè çàãðóçêà çàïóñêàåòñÿ VCC, òî òðèããåðàì ïðèñâàèâàåòñÿ çíà÷åíèå d[ ]).
3.5. Öèôðîâûå àâòîìàòû ñ ïàìÿòüþ (state mashine) Öèôðîâûå àâòîìàòû òàê æå, êàê òàáëèöû èñòèííîñòè è áóëåâû óðàâíåíèÿ, ëåãêî ðåàëèçóþòñÿ â ÿçûêå AHDL. ßçûê ñòðóêòóðèðîâàí, ïîýòîìó ïîëüçîâàòåëü ìîæåò ëèáî ñàì íàçíà÷èòü áèòû è çíà÷åíèÿ ñîñòîÿíèé, ëèáî ïðåäîñòàâèòü ýòó ðàáîòó êîìïèëÿòîðó ñèñòåìû MAX+PLUS II. Kîìïèëÿòîð, ïî óâåðåíèÿì ïðîèçâîäèòåëÿ, «èñïîëüçóåò ïàòåíòîâàííûå ïåðñïåêòèâíûå ýâðèñòè÷åñêèå àëãîðèòìû», ïîçâîëÿþùèå ñäåëàòü òàêèå àâ-
187
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL òîìàòè÷åñêèå íàçíà÷åíèÿ ñîñòîÿíèé, êîòîðûå ìèíèìèçèðóþò ëîãè÷åñêèå ðåñóðñû, íóæíûå äëÿ ðåàëèçàöèè öèôðîâîãî àâòîìàòà. Ïîëüçîâàòåëþ ïðîñòî íóæíî íàðèñîâàòü äèàãðàììó ñîñòîÿíèé è ïîñòðîèòü òàáëèöó ñîñòîÿíèé. Çàòåì êîìïèëÿòîð âûïîëíÿåò àâòîìàòè÷åñêè ñëåäóþùèå ôóíêöèè: íàçíà÷àåò áèòû, âûáèðàÿ äëÿ êàæäîãî áèòà ëèáî T-òðèããåð, ëèáî Dòðèããåð; ïðèñâàèâàåò çíà÷åíèÿ ñîñòîÿíèé; ïðèìåíÿåò ñëîæíûå ìåòîäû ëîãè÷åñêîãî ñèíòåçà äëÿ ïîëó÷åíèÿ óðàâíåíèé âîçáóæäåíèÿ. Ïî æåëàíèþ ïîëüçîâàòåëÿ, ìîæíî çàäàòü â TDF-ôàéëå ïåðåõîäû â ìàøèíå ñîñòîÿíèé ñ ïîìîùüþ îáúÿâëåíèÿ òàáëèöû èñòèííîñòè.  ÿçûêå AHDL äëÿ çàäàíèÿ öèôðîâîãî àâòîìàòà íóæíî âêëþ÷èòü â TDF-ôàéë ñëåäóþùèå ýëåìåíòû: îáúÿâëåíèå öèôðîâîãî àâòîìàòà (â ñåêöèè VARIABLE); áóëåâû óðàâíåíèÿ óïðàâëåíèÿ (â ëîãè÷åñêîé ñåêöèè); ïåðåõîäû ìåæäó ñîñòîÿíèÿìè (â ëîãè÷åñêîé ñåêöèè). Öèôðîâûå àâòîìàòû â ÿçûêå AHDL ìîæíî òàêæå ýêñïîðòèðîâàòü è èìïîðòèðîâàòü, ñîâåðøàÿ îáìåí ìåæäó ôàéëàìè òèïà TDF è GDF èëè WDF, ïðè ýòîì âõîäíîé èëè âûõîäíîé ñèãíàë çàäàåòñÿ êàê ïîðò öèôðîâîãî àâòîìàòà â ñåêöèè SUBDESIGN.
3.5.1. Ðåàëèçàöèÿ öèôðîâûõ àâòîìàòîâ (state machine) Öèôðîâîé àâòîìàò çàäàþò â ñåêöèè VARIABLE ïóòåì îáúÿâëåíèÿ èìåíè öèôðîâîãî àâòîìàòà, åãî ñîñòîÿíèé è, âîçìîæíî, âûõîäíûõ áèòîâ. Íèæå ïðèâåäåí ôàéë simple.tdf, êîòîðûé ðåàëèçóåò ôóíêöèþ D-òðèããåðà. SUBDESIGN simple ( clk : INPUT; reset : INPUT; d : INPUT; q : OUTPUT; ) VARIABLE ss : MACHINE WITH STATES (s0, s1); BEGIN ss.clk = clk;
188
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ss.reset = reset; CASE ss IS WHEN s0 => q = GND; IF d THEN ss = s1; END IF; WHEN s1 => q = VCC; IF !d THEN ss = s0; END IF; END CASE; END; Â äàííîì ôàéëå â ñåêöèè VARIABLE îáúÿâëåí öèôðîâîé àâòîìàò (state machine) ss. Ñîñòîÿíèÿ àâòîìàòà îïðåäåëÿþòñÿ êàê s0 è s1. Áèòû ñîñòîÿíèé íå îïðåäåëåíû.
3.5.2. Óñòàíîâêà ñèãíàëîâ Clock, Reset è Enable Ñèãíàëû Clock, Reset è Enable óïðàâëÿþò òðèããåðàìè ðåãèñòðà ñîñòîÿíèé â öèôðîâîì àâòîìàòå. Ýòè ñèãíàëû çàäàþòñÿ áóëåâûìè óðàâíåíèÿìè óïðàâëåíèÿ â ëîãè÷åñêîé ñåêöèè.  ïðåäûäóùåì ïðèìåðå (ôàéë simple.tdf) ñèíõðîñèãíàë öèôðîâîãî àâòîìàòà (Clock) ôîðìèðóåòñÿ âõîäîì clk. Àñèíõðîííûé ñèãíàë ñáðîñà öèôðîâîãî àâòîìàòà (Reset) ôîðìèðóåòñÿ âõîäîì reset, èìåþùèì âûñîêèé àêòèâíûé óðîâåíü. Äëÿ ïîäêëþ÷åíèÿ ñèãíàëà îòïèðàíèÿ (Enable) íóæíî äîáàâèòü â äàííûé ôàéë ïðîåêòà ñòðîêó «ena : INPUT;» â ñåêöèþ SUBDESIGN, à òàêæå äîáàâèòü â ëîãè÷åñêóþ ñåêöèþ áóëåâî óðàâíåíèå «ss.ena = ena;».
3.5.3. Çàäàíèå âûõîäíûõ çíà÷åíèé äëÿ ñîñòîÿíèé Äëÿ çàäàíèÿ âûõîäíûõ çíà÷åíèé ìîæíî èñïîëüçîâàòü îïåðàòîðû IF è CASE.  ïðèâåäåííîì âûøå ïðèìåðå (ôàéë simple.tdf) çíà÷åíèå âûõîäà q óñòàíàâëèâàåòñÿ ðàâíûì GND, åñëè öèôðîâîé àâòîìàò ss íàõîäèòñÿ â ñîñòîÿíèè s0, è ðàâíûì VCC, êîãäà îí íàõîäèòñÿ â ñîñòîÿíèè s1. Ýòè ïðèñâàèâàíèÿ äåëàþòñÿ â ïðåäëîæåíèÿõ WHEN îïåðàòîðà CASE. Âûõîäíûå çíà-
189
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ÷åíèÿ ìîæíî òàêæå çàäàâàòü â òàáëèöàõ èñòèííîñòè, êàê áóäåò îïèñàíî â ðàçäåëå 3.5.5.
3.5.4. Çàäàíèå ïåðåõîäîâ ìåæäó ñîñòîÿíèÿìè Ïåðåõîäû ìåæäó ñîñòîÿíèÿìè îïðåäåëÿþò óñëîâèÿ, ïðè êîòîðûõ ìàøèíà ïåðåõîäèò â íîâîå ñîñòîÿíèå. Ïåðåõîäû â ìàøèíå ñîñòîÿíèé çàäàþòñÿ ïóòåì óñëîâíîãî ïðèñâîåíèÿ ñîñòîÿíèÿ â ðàìêàõ îäíîé êîíñòðóêöèè, îïèñûâàþùåé ðåæèì. Äëÿ ýòîé öåëè ðåêîìåíäóåòñÿ èñïîëüçîâàòü îïåðàòîð CASE èëè òàáëèöó èñòèííîñòè. Â ïðèâåäåííîì âûøå ïðèìåðå (ôàéë simple.tdf) ïåðåõîäû äëÿ êàæäîãî ñîñòîÿíèÿ îïðåäåëåíû â ïðåäëîæåíèÿõ WHEN îïåðàòîðà CASE.
3.5.5. Ïðèñâîåíèå áèòîâ è çíà÷åíèé â öèôðîâîì àâòîìàòå Áèò ñîñòîÿíèÿ ýòî âûõîä òðèããåðà, èñïîëüçóåìûé äëÿ õðàíåíèÿ îäíîãî áèòà çíà÷åíèé öèôðîâîãî àâòîìàòà.  áîëüøèíñòâå ñëó÷àåâ äëÿ ìèíèìèçàöèè ëîãè÷åñêèõ ðåñóðñîâ ñëåäóåò ïðåäîñòàâèòü êîìïèëÿòîðó ñèñòåìû MAX+PLUS II ïðèñâîåíèå áèòîâ è çíà÷åíèé ñîñòîÿíèÿ. Îäíàêî ïîëüçîâàòåëü ìîæåò ñäåëàòü ýòî ñàìîñòîÿòåëüíî â îáúÿâëåíèè öèôðîâîãî àâòîìàòà, åñëè, íàïðèìåð, îí õî÷åò, ÷òîáû îïðåäåëåííûå áèòû áûëè âûõîäàìè öèôðîâîãî àâòîìàòà. Íèæå ïðèâåäåí ôàéë stepper.tdf, ðåàëèçóþùèé ôóíêöèþ êîíòðîëëåðà øàãîâîãî äâèãàòåëÿ. SUBDESIGN stepper ( clk, reset : INPUT; ccw, cw : INPUT; phase[3..0] : OUTPUT; ) VARIABLE ss : MACHINE OF BITS (phase[3..0]) WITH STATES ( s0 = B"0001", s1 = B"0010", s2 = B"0100", s3 = B"1000"); BEGIN ss.clk = clk; ss.reset = reset; TABLE
190
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ss, s0, s0, s1, s1, s2, s2, s3, s3, END TABLE; END;
ccw, 1, x, 1, x, 1, x, 1, x,
cw x 1 x 1 x 1 x 1
=> => => => => => => => =>
ss; s3; s1; s0; s2; s1; s3; s2; s0;
 äàííîì ïðèìåðå âûõîäû phase[3..0], îáúÿâëåííûå â ñåêöèè SUBDESIGN, îáúÿâëÿþòñÿ òàê æå, êàê áèòû öèôðîâîãî àâòîìàòà ss â îáúÿâëåíèè öèôðîâîãî àâòîìàòà.
3.5.6. Öèôðîâûå àâòîìàòû ñ ñèíõðîííûìè âûõîäàìè Åñëè âûõîäû öèôðîâîãî àâòîìàòà çàâèñÿò òîëüêî îò åãî ñîñòîÿíèÿ, èõ ìîæíî çàäàòü â ïðåäëîæåíèè WITH STATES îáúÿâëåíèÿ öèôðîâîãî àâòîìàòà. Ýòî ñäåëàåò èõ ìåíåå ïîäâåðæåííûìè îøèáêàì. Kðîìå òîãî, â íåêîòîðûõ ñëó÷àÿõ äëÿ ëîãè÷åñêèõ îïåðàöèé ïîòðåáóåòñÿ ìåíüøå ëîãè÷åñêèõ ÿ÷ååê. Íèæå ïðèâåäåí ïðèìåð (ôàéë moorel.tdf), â êîòîðîì ðåàëèçîâàí àâòîìàò Ìóðà ñ ÷åòûðüìÿ ñîñòîÿíèÿìè. SUBDESIGN moore1 ( clk : INPUT; reset : INPUT; y : INPUT; z : OUTPUT; ) VARIABLE % current current % state output % ss :MACHINE OF BITS (z) WITH STATES (s0 = s1 = s2 = s3 =
191
%
0, 1, 1, 0);
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL BEGIN ss.clk = clk; ss.reset = reset; TABLE % current current next % % state input state % ss, y => ss; s0, 0 => s0; s0, 1 => s2; s1, 0 => s0; s1, 1 => s2; s2, 0 => s2; s2, 1 => s3; s3, 0 => s3; s3, 1 => s1; END TABLE; END;  äàííîì ïðèìåðå ñîñòîÿíèÿ îïðåäåëåíû â îáúÿâëåíèè öèôðîâîãî àâòîìàòà. Ïåðåõîäû ìåæäó ñîñòîÿíèÿìè îïðåäåëåíû â òàáëèöå next_state, êîòîðàÿ çàäàíà â îáúÿâëåíèè òàáëèöû èñòèííîñòè.  äàííîì ïðèìåðå ìàøèíà èìååò ÷åòûðå ñîñòîÿíèÿ è òîëüêî îäèí áèò ñîñòîÿíèÿ Z. Kîìïèëÿòîð ñèñòåìû MAX+PLUS II àâòîìàòè÷åñêè äîáàâëÿåò åùå îäèí áèò è äåëàåò ñîîòâåòñòâóþùèå ïðèñâîåíèÿ ýòîé ñèíòåçèðîâàííîé ïåðåìåííîé äëÿ òîãî, ÷òîáû ïîëó÷èëàñü ìàøèíà ñ ÷åòûðüìÿ ñîñòîÿíèÿìè. Òàêîé öèôðîâîé àâòîìàò (state machine) òðåáóåò, ïî êðàéíåé ìåðå, äâóõ áèòîâ. Åñëè çíà÷åíèÿ ñîñòîÿíèé èñïîëüçóþòñÿ êàê âûõîäû (êàê â ôàéëå moorel.tdf), äëÿ ïðîåêòà ïîòðåáóåòñÿ ìåíüøå ëîãè÷åñêèõ ÿ÷ååê, íî, âîçìîæíî, ëîãè÷åñêèå ÿ÷åéêè ïîòðåáóþò áîëüøå ëîãèêè, ÷òîáû âîçáóäèòü âõîäû òðèããåðà.  ýòîì ñëó÷àå ìîäóëü ëîãè÷åñêîãî ñèíòåçàòîðà êîìïèëÿòîðà, âîçìîæíî, íå ñìîæåò ïîëíîñòüþ ìèíèìèçèðîâàòü àâòîìàò. Äðóãîé ñïîñîá ïîñòðîåíèÿ öèôðîâîãî àâòîìàòà çàêëþ÷àåòñÿ â òîì, ÷òîáû íå äåëàòü ïðèñâîåíèÿ ñîñòîÿíèé è ÿâíî îáúÿâèòü âûõîäíûå òðèããåðû. Ýòîò àëüòåðíàòèâíûé ìåòîä èñïîëüçîâàí â ïðèâåäåííîì íèæå ôàéëå moore2.tdf. SUBDESIGN moore2 (
192
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL clk : INPUT; reset : INPUT; y : INPUT; z : OUTPUT; ) VARIABLE ss : MACHINE WITH STATES (s0, s1, s2, s3); zd : NODE; BEGIN ss.clk = clk; ss.reset = reset; z = DFF(zd, clk, VCC, VCC); TABLE % current current next next % % state input state output % ss, y => ss, zd; s0, 0 => s0, 0; s0, 1 => s2, 1; s1, 0 => s0, 0; s1, 1 => s2, 1; s2, 0 => s2, 1; s2, 1 => s3, 0; s3, 0 => s3, 0; s3, 1 => s1, 1; END TABLE; END;  äàííîì ïðèìåðå âìåñòî òîãî, ÷òîáû çàäàòü âûõîäû ïðèñâîåíèåì çíà÷åíèé ñîñòîÿíèÿì â îáúÿâëåíèè öèôðîâîãî àâòîìàòà, â îáúÿâëåíèå òàáëèöû èñòèííîñòè äîáàâëåí îäèí ñòîëáåö ïîä íàçâàíèåì "next output" (ñëåäóþùèé âûõîä).  ýòîì ìåòîäå äëÿ ñèíõðîíèçàöèè âûõîäîâ ñèíõðîñèãíàëîì èñïîëüçóåòñÿ D-òðèããåð, âûçîâ êîòîðîãî çàïèñàí ñ ïîìîùüþ íåïîñðåäñòâåííîé ññûëêè.
3.5.7. Öèôðîâûå àâòîìàòû ñ àñèíõðîííûìè âûõîäàìè Â ÿçûêå AHDL âîçìîæíà ðåàëèçàöèÿ öèôðîâîãî àâòîìàòà ñ àñèíõðîííûìè âûõîäàìè. Âûõîäû òàêîãî òèïà àâòîìàòîâ âñåãäà èçìåíÿþòñÿ, êîãäà èçìåíÿþòñÿ âõîäû, íåçàâèñèìî îò ñîñòîÿíèÿ ñèíõðîñèãíàëà. Â ïðèâåäåí-
193
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL íîì íèæå ôàéëå mealy.tdf ðåàëèçîâàí àâòîìàò Ìèëè ñ ÷åòûðüìÿ ñîñòîÿíèÿìè è àñèíõðîííûìè âûõîäàìè. SUBDESIGN mealy ( clk : INPUT; reset : INPUT; y : INPUT; z : OUTPUT; ) VARIABLE ss : MACHINE WITH STATES (s0, s1, s2, s3); BEGIN ss.clk = clk; ss.reset = reset; TABLE % current current current next % % state input outputstate % ss, y => z, ss; s0, 0 => 0, s0; s0, 1 => 1, s1; s1, 0 => 1, s1; s1, 1 => 0, s2; s2, 0 => 0, s2; s2, 1 => 1, s3; s3, 0 => 0, s3; s3, 1 => 1, s0; END TABLE; END;
3.5.8. Âîññòàíîâëåíèå ïîñëå íåïðàâèëüíûõ ñîñòîÿíèé Ëîãèêà, ñãåíåðèðîâàííàÿ äëÿ öèôðîâîãî àâòîìàòà êîìïèëÿòîðîì ñèñòåìû MAX+PLUS II, áóäåò ðàáîòàòü òàê, êàê îïðåäåëåíî â TDF-ôàéëå. Îäíàêî ïðîåêòû ñ èñïîëüçîâàíèåì öèôðîâûõ àâòîìàòîâ ÷àñòî äîïóñêàþò çíà÷åíèÿ áèòîâ ñîñòîÿíèé, êîòîðûå íå ïðèñâàèâàþòñÿ ïðàâèëüíûì ñîñòîÿíèÿì. Ýòè çíà÷åíèÿ ñ íå ïðèñâîåííûìè áèòàìè ñîñòîÿíèé íàçûâàþòñÿ íåïðàâèëüíûìè ñîñòîÿíèÿìè. Ïðîåêò, êîòîðûé ïåðåõîäèò â íåïðàâèëüíîå ñîñòîÿíèå, íàïðèìåð, â ðåçóëüòàòå íàðóøåíèé âðåìåííûõ òðåáîâàíèé ê óñòàíîâêå èëè çàäåðæêå,
194
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ìîæåò ðåàëèçîâàòü îøèáî÷íûå âûõîäû. Íåñìîòðÿ íà ðåêîìåíäàöèè ôèðìû «Altera» ïî ñîáëþäåíèþ âðåìåííûõ òðåáîâàíèé ê óñòàíîâêå è çàäåðæêå, ïîëüçîâàòåëü ìîæåò ñäåëàòü âîññòàíîâëåíèå öèôðîâîãî àâòîìàòà ïîñëå íåïðàâèëüíîãî ñîñòîÿíèÿ ïóòåì ïðèíóäèòåëüíîãî ïðåîáðàçîâàíèÿ íåïðàâèëüíîãî ñîñòîÿíèÿ ê èçâåñòíîìó ïðàâèëüíîìó â ðàìêàõ îïåðàòîðà CASE. Äëÿ âîññòàíîâëåíèÿ èç íåïðàâèëüíûõ ñîñòîÿíèé ñëåäóåò îáúÿâèòü èõ ïîèìåííî äëÿ äàííîãî àâòîìàòà. Ïðåäëîæåíèå WHEN OTHERS â îïåðàòîðå CASE, êîòîðîå ïðèíóäèòåëüíî ïðåîáðàçóåò ñîñòîÿíèÿ, ïðèìåíÿåòñÿ òîëüêî ê ñîñòîÿíèÿì, êîòîðûå áûëè îáúÿâëåíû, à íå óïîìÿíóòû â ïðåäëîæåíèè WHEN. Äàííûé ìåòîä ðàáîòàåò, òîëüêî åñëè âñå íåïðàâèëüíûå ñîñòîÿíèÿ îïðåäåëåíû â îáúÿâëåíèè öèôðîâîãî àâòîìàòà. Äëÿ n-áèòîâîãî öèôðîâîãî àâòîìàòà ñóùåñòâóþò 2n âîçìîæíûõ ñîñòîÿíèÿ. Ïîýòîìó íóæíî äîáàâèòü âîîáðàæàåìûå èìåíà ñîñòîÿíèé, ÷òîáû ïîëó÷èëîñü òàêîå èõ ÷èñëî. Íèæå ïðèâåäåí ôàéë recover.tdf, â êîòîðîì ðåàëèçîâàí öèôðîâîé àâòîìàò, êîòîðûé ìîæåò âîññòàíàâëèâàòüñÿ èç íåïðàâèëüíûõ ñîñòîÿíèé. SUBDESIGN recover ( clk : INPUT; go : INPUT; ok : OUTPUT; ) VARIABLE sequence : MACHINE OF BITS (q[2..0]) WITH STATES (idle, one, two, three, four, illegal1, illegal2, illegal3); BEGIN sequence.clk = clk; CASE sequence IS WHEN idle => IF go THEN sequence = one; END IF; WHEN one => sequence = two; WHEN two =>
195
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL sequence = three; WHEN three => sequence = four; WHEN OTHERS => sequence = idle; END CASE; ok = (sequence == four); END; Â äàííîì ïðèìåðå öèôðîâîé àâòîìàò èìååò òðè áèòà, ïîýòîìó îí äîëæåí èìåòü 23 èëè 8 ñîñòîÿíèé. Â îáúÿâëåíèè çàäàíû òîëüêî 5 ñîñòîÿíèé. Ñëåäîâàòåëüíî, íóæíî òóäà äîáàâèòü åùå òðè âîîáðàæàåìûõ ñîñòîÿíèÿ illegal1, illegal2, illegal3.
3.6. Ðåàëèçàöèÿ èåðàðõè÷åñêîãî ïðîåêòà  èåðàðõè÷åñêîé ñòðóêòóðå ïðîåêòà TDF-ôàéëû, íàïèñàííûå íà ÿçûêå AHDL, ìîæíî èñïîëüçîâàòü âìåñòå ñ äðóãèìè ôàéëàìè ïðîåêòîâ. Íà íèæíåì óðîâíå ïðîåêòà ìîãóò áûòü ìàêðîôóíêöèè, ïîñòàâëÿåìûå ôèðìîé «Altera» èëè ðàçðàáîòàííûå ïîëüçîâàòåëÿìè.
3.6.1. Èñïîëüçîâàíèå ìàêðîôóíêöèé ñèñòåìû MAX+PLUS II ôèðìû «Altera»  ñèñòåìå MAX+PLUS II åñòü áîëüøàÿ áèáëèîòåêà, â êîòîðóþ âõîäÿò 74 ñòàíäàðòíûå ìàêðîôóíêöèè, ðåàëèçóþùèå øèíû ñ ïîñëåäîâàòåëüíûì îïðîñîì, îïòèìèçàöèþ àðõèòåêòóðû è êîíêðåòíûå ïðèëîæåíèÿ. Áèáëèîòåêà ïðåäñòàâëÿåò ñîáîé ñîáðàíèå áëîêîâ âûñîêîãî óðîâíÿ, èñïîëüçóåìûõ äëÿ ñîçäàíèÿ ïðîåêòà ñ èåðàðõè÷åñêîé ëîãèêîé. Âî âðåìÿ èíñòàëëÿöèè ñèñòåìû ýòè ìàêðîôóíêöèè àâòîìàòè÷åñêè çàïèñûâàþòñÿ â êàòàëîã \maxplus2\max2lib è åãî ïîäêàòàëîãè, ñîçäàâàåìûå â ïðîöåññå èíñòàëëÿöèè.  ÿçûêå AHDL ñóùåñòâóþò äâà ñïîñîáà âûçîâà (ò. å. âñòàâêè â êà÷åñòâå ïðèìåðà) ìàêðîôóíêöèè: îáúÿâèòü ïåðåìåííóþ òèïà <macrofunction> â îáúÿâëåíèè ïðèìåðîâ INSTANCE â ñåêöèè VARIABLE è èñïîëüçîâàòü ïîðòû ïðèìåðà ìàêðîôóíêöèè â ëîãè÷åñêîé ñåêöèè.  ýòîì ñïîñîáå âàæíîå çíà÷åíèå èìåþò èìåíà ïîðòîâ;
196
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL èñïîëüçîâàòü äëÿ ìàêðîôóíêöèè íåïîñðåäñòâåííóþ ññûëêó â ëîãè÷åñêîé ñåêöèè ôàéëà TDF.  ýòîì ñïîñîáå âàæåí ïîðÿäîê ïîðòîâ. Âõîäû è âûõîäû ìàêðîôóíêöèé ïåðå÷èñëÿþòñÿ â îïèñàíèè ïðîòîòèïîâ ôóíêöèé (FUNCTION PROTOTYPE). Ïðîòîòèïû ôóíêöèé ìîæíî çàïèñàòü â îòäåëüíûé ôàéë è óêàçàòü åãî â ñâîåì ôàéëå ñ ïîìîùüþ äèðåêòèâû INCLUDE. Òàêèå Include-ôàéëû ñîçäàþòñÿ àâòîìàòè÷åñêè äëÿ äàííîãî ïðîåêòà ñ ïîìîùüþ êîìàíäû Create Default Include File. Include-ôàéë âñòàâëÿåòñÿ âìåñòî âûçûâàþùåé åãî äèðåêòèâû INCLUDE. Äëÿ âñåõ ìàêðîôóíêöèé ñèñòåìû MAX+PLUS II Include-ôàéëû äîëæíû íàõîäèòüñÿ â êàòàëîãå \maxplus2\max2inc. Íèæå ïðèâåäåí ôàéë macro1.tdf, êîòîðûé ðåàëèçóåò ÷åòûðåõðàçðÿäíûé ñ÷åò÷èê, ïîäñîåäèíåííûé ñâîèìè âûõîäàìè ê äåøèôðàòîðó 4 â 16. Ñîîòâåòñòâóþùèå ìàêðîôóíêöèè âûçûâàþòñÿ îáúÿâëåíèÿìè ïðèìåðîâ â ñåêöèè VARIABLE. INCLUDE "4count"; INCLUDE "16dmux"; SUBDESIGN macro1 ( clk : INPUT; out[15..0] : OUTPUT; ) VARIABLE counter : 4count; decoder : 16dmux; BEGIN counter.clk = clk; counter.dnup = GND; decoder.(d,c,b,a) = counter.(qd,qc,qb,qa); out[15..0] = decoder.q[15..0]; END;  äàííîì ôàéëå èñïîëüçóþòñÿ äèðåêòèâû INCLUDE äëÿ èìïîðòèðîâàíèÿ ïðîòîòèïîâ ôóíêöèé äëÿ äâóõ ìàêðîôóíêöèé ôèðìû «Altera»: 4count è 16dmux.  ñåêöèè VARIABLE îáúÿâëÿþòñÿ äâå ïåðåìåííûå counter è decoder êàê ïðèìåðû ýòèõ ìàêðîôóíêöèé.  ëîãè÷åñêîé ñåêöèè îïðåäåëÿþòñÿ âõîäíûå ïîðòû äëÿ îáåèõ ìàêðîôóíêöèé â ôîðìàòå <èìÿ ïåðåìåííîé-ïðèìåðà>.<èìÿ ïîðòà> (îíè ñòàâÿòñÿ â ëåâîé ÷àñòè áóëåâûõ óðàâíå-
197
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL íèé, à âûõîäíûå ïîðòû ñïðàâà.) Ïîðÿäîê ïîðòîâ â ïðîòîòèïå ôóíêöèè íå âàæåí, òàê êàê èìåíà ïîðòîâ â ëîãè÷åñêîé ñåêöèè ïåðå÷èñëÿþòñÿ ÿâíî. Íèæå ïðèâåäåí ôàéë macro2.tdf, âûïîëíÿþùèé òå æå ôóíêöèè, ÷òî è ïðåäûäóùèé, íî ìàêðîôóíêöèè â íåì âûçûâàþòñÿ íåïîñðåäñòâåííîé ññûëêîé. INCLUDE "4count"; INCLUDE "16dmux"; SUBDESIGN macro2 ( clk : INPUT; out[15..0] : OUTPUT; ) VARIABLE q[3..0] : NODE; BEGIN (q[3..0], ) = 4count (clk, , , , , GND, , , , ); out[15..0] = 16dmux (.(d, c, b, a)=q[3..0]); % equivalent inline ref. with positional port association % % out[15..0] = 16dmux (q[3..0]); % END; Âûçîâ ìàêðîôóíêöèé 4count è 16dmux îñóùåñòâëÿåòñÿ â ëîãè÷åñêîé ñåêöèè íåïîñðåäñòâåííîé ññûëêîé (â ïðàâîé ÷àñòè áóëåâûõ óðàâíåíèé). Íèæå ïðèâåäåíû ïðîòîòèïû ýòèõ ìàêðîôóíêöèé, çàïèñàííûå â ôàéëàõ 4count.inc, 16dmux.inc: FUNCTION 4count (clk, clrn, setn, ldn, cin, dnup, d, c, b, a) RETURNS (qd, qc, qb, qa, cout); FUNCTION 16dmux (d, c, b, a) RETURNS (q[15..0]); Ñîåäèíåíèå ïîðòîâ ïîêàçàíî â ëîãè÷åñêîé ñåêöèè ôàéëà macro2.tdf. Ïîðÿäîê ïîðòîâ âàæåí, òàê êàê äîëæíî áûòü îäíîçíà÷íîå ñîîòâåòñòâèå ìåæäó ïîðòàìè, îïèñàííûìè â ïðîòîòèïå ôóíêöèè è ïðè åå ðåàëèçàöèè â ëîãè÷åñêîé ñåêöèè.  äàííîì ïðèìåðå çàïÿòûìè îòäåëÿþòñÿ (íî íå ïåðå÷èñëÿþòñÿ) ïîðòû, äëÿ êîòîðûõ íå äåëàåòñÿ ÿâíîå ïîäêëþ÷åíèå.
198
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.6.2. Ñîçäàíèå è ïðèìåíåíèå ïîëüçîâàòåëüñêèõ ìàêðîôóíêöèé  ôàéëàõ, íàïèñàííûõ íà AHDL, ìîæíî ëåãêî ñîçäàâàòü è èñïîëüçîâàòü ïîëüçîâàòåëüñêèå ìàêðîôóíêöèè, âûïîëíÿÿ ñëåäóþùèå äåéñòâèÿ: Ñîçäàòü ëîãèêó äëÿ ìàêðîôóíêöèè â ôàéëå ïðîåêòà. Îïðåäåëèòü ïîðòû ìàêðîôóíêöèè â îáúÿâëåíèè ïðîòîòèïà ôóíêöèè. Ïðîòîòèï ôóíêöèè äàåò êðàòêîå îïèñàíèå ôóíêöèè: åå èìÿ, à òàêæå âõîäíûå, âûõîäíûå è äâóíàïðàâëåííûå ïîðòû. Ìîæíî òàêæå èñïîëüçîâàòü ìàøèííûå ïîðòû äëÿ ìàêðîôóíêöèé, êîòîðûå èìïîðòèðóþò èëè ýêñïîðòèðóþò öèôðîâîé àâòîìàò. Îáúÿâëåíèå ïðîòîòèïîâ ôóíêöèé ìîæåò áûòü ðàçìåùåíî â Include-ôàéëå, êîòîðûé âûçûâàåòñÿ â ïîëüçîâàòåëüñêîì ôàéëå. Èñïîëüçóÿ êîìàíäó Create Default Include File, ìîæíî àâòîìàòè÷åñêè ñîçäàâàòü Include-ôàéë ñ ïðîòîòèïîì ôóíêöèè äëÿ ëþáîãî ôàéëà ïðîåêòà: âñòàâèòü â ôàéë ïðèìåð ìàêðîôóíêöèè ñ ïîìîùüþ îáúÿâëåíèÿ ïðèìåðà â ñåêöèè VARIABLE èëè ñ ïîìîùüþ íåïîñðåäñòâåííîé ññûëêè â òåêñòå; èñïîëüçîâàòü ìàêðîôóíêöèþ â ôàéëå.
3.6.3. Îïðåäåëåíèå ïîëüçîâàòåëüñêîé ìàêðîôóíêöèè Äëÿ èñïîëüçîâàíèÿ ìàêðîôóíêöèè åå íóæíî ëèáî âêëþ÷èòü â îïèñàíèå ïðîòîòèïà ôóíêöèè â TDF-ôàéëå, ëèáî óêàçàòü â äèðåêòèâå INCLUDE ôàéëà TDF èìÿ Include-ôàéëà, ñîäåðæàùåãî ïðîòîòèï ýòîé ìàêðîôóíêöèè. Kàê óæå óïîìèíàëîñü âûøå, Include-ôàéëû ìîæíî ñîçäàâàòü àâòîìàòè÷åñêè. Íèæå ïðèâîäèòñÿ ôàéë keyboard.tdf, â êîòîðîì ðåàëèçîâàí êîäèðîâùèê äëÿ 16-êëàâèøíîé êëàâèàòóðû. TITLE "Keyboard Encoder"; INCLUDE "74151"; INCLUDE "74154"; INCLUDE "4count"; FUNCTION debounce (clk, key_pressed) RETURNS (pulse); SUBDESIGN keyboard ( clk : INPUT; % 50KHz clock % col[3..0] : INPUT; % keyboard columns % row[3..0], d[3..0] : OUTPUT; % keyboard rows, key code %
199
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL strobe : OUTPUT; % key code is valid % ) VARIABLE key_pressed : NODE; % VCC when key d[3..0] is pressed % mux : 74151; decoder : 74154; counter : 4count; opencol[3..0] : TRI; BEGIN % Drive keyboard rows with a decoder and opencollector outputs % row[] = opencol[].out; opencol[].in = GND; opencol[].oe = decoder.(o0n,o1n,o2n,o3n); decoder.(b,a) = counter.(qd,qc); % Sense keyboard columns with a multiplexer % mux.d[3..0] = col[3..0]; mux.(b,a) = counter.(qb,qa); key_pressed = !mux.y; % Scan keyboard until a key is pressed. % % Drive key’s code onto d[] outputs % counter.clk = clk; counter.cin = !key_pressed; d[] = counter.(qd,qc,qb,qa); % Generate strobe when key has settled % strobe = debounce(clk, key_pressed); END;  äàííîì ïðèìåðå â äèðåêòèâàõ INCLUDE óêàçûâàþòñÿ ôàéëû ïðîòîòèïîâ ôóíêöèè äëÿ ñòàíäàðòíûõ ìàêðîôóíêöèé ôèðìû «Altera»: 4count, 74151 è 74154. Îòäåëüíî â ôàéëå äàí ïðîòîòèï ôóíêöèè äëÿ ìàêðîôóíêöèè debounce, â êîòîðîì îïèñàíû âõîäû clk è key_pressed è âûõîä pulse. Ïðèìåðû ìàêðîôóíêöèé 4count, 74151 è 74154 âûçûâàþòñÿ îáúÿâëåíèåì ïðèìåðîâ â ñåêöèè VARIABLE. Ïðèìåð ìàêðîôóíêöèè debounce âûçûâàåòñÿ íåïîñðåäñòâåííîé ññûëêîé â òåêñòå ëîãè÷åñêîé ñåêöèè.
200
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.6.4. Èìïîðò è ýêñïîðò öèôðîâûõ àâòîìàòîâ (state machine) Îïåðàöèè èìïîðòà è ýêñïîðòà öèôðîâûõ àâòîìàòîâ îñóùåñòâëÿþòñÿ ìåæäó ôàéëàìè TDF è äðóãèìè ôàéëàìè ïðîåêòà ïóòåì çàäàíèÿ âõîäíîãî èëè âûõîäíîãî ïîðòà êàê âõîäà àâòîìàòà (MACHINÅ INPUT) è åãî âûõîäà (MACHINÅ OUTPUT) â ñåêöèè SUBDESIGN. Ïðîòîòèï ôóíêöèè, êîòîðûé ïðåäñòàâëÿåò ñîáîé ôàéë, ñîäåðæàùèé ìàøèíó ñîñòîÿíèé, äîëæåí óêàçûâàòü, êàêèå âõîäû è âûõîäû ïðèíàäëåæàò ìàøèíå ñîñòîÿíèé. Ýòî îñóùåñòâëÿåòñÿ ñíàáæåíèåì èìåí ñèãíàëîâ ïðåôèêñîì êëþ÷åâûì ñëîâîì MACHINE. Çàìå÷àíèå. Ïîðòû òèïà MACHINÅ INPUT è MACHINÅ OUTPUT íåëüçÿ èñïîëüçîâàòü â ôàéëå ïðîåêòà âåðõíåãî óðîâíÿ. Ìîæíî ïåðåèìåíîâàòü àâòîìàò, äàâ åìó âðåìåííîå èìÿ (ïñåâäîíèì) â îáúÿâëåíèè MACHINE â ñåêöèè VARIABLE. Ïñåâäîíèì öèôðîâîãî àâòîìàòà ìîæíî èñïîëüçîâàòü â òîì ôàéëå, ãäå ñîçäàåòñÿ öèôðîâîé àâòîìàò, èëè â òîì ôàéëå, ãäå èñïîëüçóåòñÿ ïîðò MACHINÅ INPUT äëÿ èìïîðòèðîâàíèÿ öèôðîâîãî àâòîìàòà. Ýòî èìÿ ìîæíî ïîòîì èñïîëüçîâàòü âìåñòî ïåðâîíà÷àëüíîãî èìåíè öèôðîâîãî àâòîìàòà. Íèæå ïðèâîäèòñÿ ôàéë ss_def.tdf, êîòîðûé îïðåäåëÿåò è ýêñïîðòèðóåò öèôðîâîé àâòîìàò ss ñ ïîðòîì ss_out òèïà MACHINÅ OUTPUT. SUBDESIGN ss_def ( clk, reset, count : INPUT; ss_out : MACHINE OUTPUT; ) VARIABLE ss : MACHINE WITH STATES (s1, s2, s3, s4, s5); BEGIN ss_out = ss; CASE ss IS WHEN s1=> IF count THEN ss = s2; ELSE ss = s1; END IF; WHEN s2=> IF count THEN ss = s3; ELSE ss = s2; END IF; WHEN s3=> IF count THEN ss = s4; ELSE ss = s3; END IF; WHEN s4=>
201
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL IF count THEN ss = s5; ELSE ss = s4; END IF; WHEN s5=> IF count THEN ss = s1; ELSE ss = s5; END IF; END CASE; ss.(clk, reset) = (clk, reset); END; Íèæå ïðèâîäèòñÿ ôàéë ss_use.tdf, êîòîðûé èìïîðòèðóåò öèôðîâîé àâòîìàò ñ ïîðòîì ss_in òèïà MACHINE INPUT. SUBDESIGN ss_use ( ss_in : MACHINE INPUT; out : OUTPUT; ) BEGIN out = (ss_in == s2) OR (ss_in == s4); END; Íèæå ïðèâåäåí ôàéë top1.tdf, â êîòîðîì èñïîëüçóþòñÿ íåïîñðåäñòâåííûå ññûëêè â òåêñòå äëÿ âñòàâêè ïðèìåðîâ ôóíêöèé ss_def è ss_use.  ïðîòîòèïàõ ýòèõ ôóíêöèé ñîäåðæèòñÿ êëþ÷åâîå ñëîâî MACHINE äëÿ óêàçàíèÿ, êàêèå âõîäû è âûõîäû ÿâëÿþòñÿ öèôðîâûìè àâòîìàòàìè ñ ïàìÿòüþ. FUNCTION ss_def (clk, reset, count)RETURNS (MACHINE ss_out); FUNCTION ss_use (MACHINE ss_in) RETURNS (out); DESIGN IS «top1» DEVICE IS «AUTO»; SUBDESIGN top1 ( sys_clk, /reset, hold : INPUT; sync_out : OUTPUT; ) VARIABLE ss_ref: MACHINE; % Machine Alias Declaration % BEGIN ss_ref = ss_def(sys_clk, !/reset, !hold);
202
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL sync_out = ss_use(ss_ref); END; Âíåøíèé öèôðîâîé àâòîìàò ìîæíî òàêæå ðåàëèçîâàòü â TDF-ôàéëå âåðõíåãî óðîâíÿ ñ îáúÿâëåíèåì ïðèìåðà â ñåêöèè VARIABLE. Íèæå ïðèâåäåí ôàéë top2.tdf, êîòîðûé èìååò òó æå ôóíêöèþ, ÷òî è ôàéë top1.tdf, íî äëÿ âûçîâà ìàêðîôóíêöèé èñïîëüçóåò îáúÿâëåíèå ïðèìåðîâ. FUNCTION ss_def (clk, reset, count) RETURNS (MACHINE ss_out); FUNCTION ss_use (MACHINE ss_in) RETURNS (out); DESIGN IS "top2" DEVICE IS "AUTO"; SUBDESIGN top2 ( sys_clk, /reset, hold : INPUT; sync_out : OUTPUT; ) VARIABLE sm_macro : ss_def; sync : ss_use; BEGIN sm_macro.(clk, reset, count) = (sys_clk, !/reset,!hold); sync.ss_in = sm_macro.ss_out; sync_out = sync.out; END;
3.7. Óïðàâëåíèå ñèíòåçîì 3.7.1. Ðåàëèçàöèÿ ïðèìèòèâîâ LCELL è SOFT Ìîæíî îãðàíè÷èòü ëîãè÷åñêèé ñèíòåç ñ ïîìîùüþ çàìåíû ïåðåìåííûõ òèïà óçåë (NODE) ïðèìèòèâàìè SOFT è LCELL. Ïåðåìåííûå NODE è ïðèìèòèâû LCELL îáåñïå÷èâàþò íàèëó÷øåå óïðàâëåíèå ëîãè÷åñêèì ñèíòåçîì. Ïðèìèòèâû SOFT îáåñïå÷èâàþò áîëåå ñëàáîå óïðàâëåíèå ëîãè÷åñêèì ñèíòåçîì. Ïåðåìåííûå NODE, êîòîðûå îáúÿâëÿþòñÿ â ñåêöèè VARIABLE, íàêëàäûâàþò ñëàáûå îãðàíè÷åíèÿ íà ëîãè÷åñêèé ñèíòåç. Âî âðåìÿ ñèíòåçà ìîäóëü ëîãè÷åñêîãî ñèíòåçà êîìïèëÿòîðà ñèñòåìû MAX+PLUS II çàìåíÿåò êàæäûé ïðèìåð èñïîëüçîâàíèÿ ïåðåìåííîé NODE ëîãèêîé, êîòîðóþ
203
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL îíà ïðåäñòàâëÿåò. Çàòåì ïðîèñõîäèò ìèíèìèçàöèÿ ëîãèêè äî îäíîé ëîãè÷åñêîé ÿ÷åéêè. Ýòîò ìåòîä îáû÷íî ïðèâîäèò ê óñêîðåíèþ ðàáîòû ñõåìû, íî â ðåçóëüòàòå ìîæåò ïîëó÷èòüñÿ ñëèøêîì ñëîæíàÿ ëîãèêà èëè æå åå òðóäíî ñâåñòè ê îäíîé ÿ÷åéêå. Áóôåðû SOFT îáåñïå÷èâàþò ëó÷øåå óïðàâëåíèå èñïîëüçîâàíèåì ðåñóðñîâ, ÷åì ïåðåìåííûå NODE. Ìîäóëü ëîãè÷åñêîãî ñèíòåçàòîðà âûáèðàåò, êîãäà çàìåíèòü ïðèìåðû èñïîëüçîâàíèÿ ïðèìèòèâîâ SOFT ïðèìèòèâàìè LCELL. Áóôåðû SOFT ìîãóò ïîìî÷ü óíè÷òîæèòü ëîãèêó, êîòîðàÿ îêàçàëàñü ñëèøêîì ñëîæíîé, è ñäåëàòü ïðîåêò ïðîùå. Îäíàêî ïðè ýòîì ìîæåò áûòü óâåëè÷åíî ÷èñëî ëîãè÷åñêèõ îïåðàöèé è ñêîðîñòü âûïîëíåíèÿ ïðîãðàììû ñîîòâåòñòâåííî óìåíüøèòñÿ. Íàèáîëåå ñèëüíîå óïðàâëåíèå ïðîöåññîì ëîãè÷åñêîãî ñèíòåçà îáåñïå÷èâàåòñÿ ïðèìèòèâàìè LCELL. Ìîäóëü ëîãè÷åñêîãî ñèíòåçàòîðà ìèíèìèçèðóåò âñþ ëîãèêó, êîòîðàÿ çàïóñêàåò ïðèìèòèâ LCELL, òàêèì îáðàçîì, ÷òîáû ìîæíî áûëî ñâåñòè åå ê îäíîé ëîãè÷åñêîé ÿ÷åéêå. Ïðèìèòèâû LCELL ðåàëèçóþòñÿ â âèäå îäíîé ëîãè÷åñêîé ÿ÷åéêè (èõ íåëüçÿ óáðàòü èç ïðîåêòà, äàæå åñëè îíè èìåþò åäèíñòâåííûé âõîä). Åñëè ïðîåêò ìèíèìèçèðîâàí äî òàêîé ñòåïåíè, ÷òî îäèí ïðèìèòèâ LCELL èìååò åäèíñòâåííûé âõîä, òî â ýòîì ñëó÷àå âìåñòî ïðèìèòèâîâ LCELL ìîæíî èñïîëüçîâàòü ïðèìèòèâû SOFT, êîòîðûå óáèðàþòñÿ â ïðîöåññå ëîãè÷åñêîãî ñèíòåçà. Ïðèìå÷àíèå. Ïðè ìíîãîóðîâíåâîì ñèíòåçå êîìïèëÿòîð ñèñòåìû MAX+PLUS II àâòîìàòè÷åñêè ïîìåùàåò áóôåðû SOFT â áîëåå âûãîäíîå ìåñòî ïðîåêòà, åñëè âêëþ÷èòü îïöèþ SOFT Buffer Insertion logic. Íèæå ïðèâîäÿòñÿ äâå âåðñèè ôàéëà TDF ñ ïåðåìåííûìè NODE è ñ ïðèìèòèâàìè SOFT.  âåðñèè nodevar ïåðåìåííàÿ odd_parity îáúÿâëåíà êàê NODE, çàòåì åé ïðèñâàèâàåòñÿ áóëåâî âûðàæåíèå d0 $ d1 $... $ d8.  âåðñèè softbuf êîìïèëÿòîð çàìåíèò íåêîòîðûå ïðèìèòèâû SOFT ïðèìèòèâàìè LCELL âî âðåìÿ îáðàáîòêè äàííûõ äëÿ ëó÷øåãî èñïîëüçîâàíèÿ ðåñóðñîâ óñòðîéñòâà. TDF with NODE Primitives: SUBDESIGN nodevar ( : )
TDF with SOFT Variables: SUBDESIGN softbuf ( : )
204
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL VARIABLE odd_parity : NODE; BEGIN odd_parity = d0 $ d1 $ d2 $ d3 $ d4 $ d5 $ d6 $ d7 $ d8; END;
VARIABLE odd_parity : NODE; BEGIN odd_parity = SOFT(d0 $ d1 $ d2) $ SOFT(d3 $ d4 $ d5) $ SOFT(d6 $ d7 $ d8); END;
3.7.2. Çíà÷åíèÿ êîíñòàíò ïî óìîë÷àíèþ Ëîãè÷åñêèé ñèíòåçàòîð àâòîìàòè÷åñêè âûïîëíÿåò ïîäêëþ÷åíèå ê GND âñåõ âûõîäîâ òàáëèöû èñòèííîñòè, åñëè íå óäîâëåòâîðÿåòñÿ íè îäíî èç óñëîâèé âõîäà òàáëèöû. Äëÿ ïðèñâîåíèÿ âûõîäàì òàáëèöû èñòèííîñòè çíà÷åíèÿ VCC ìîæíî èñïîëüçîâàòü îäíî èëè íåñêîëüêî îáúÿâëåíèé ÿçûêà AHDL ïî óìîë÷àíèþ. Ñ ïîìîùüþ ýòèõ îáúÿâëåíèé ìîæíî çàäàòü çíà÷åíèÿ ïî óìîë÷àíèþ äëÿ ñîîòâåòñòâóþùèõ âûõîäîâ. Íàïðèìåð, åñëè áîëüøèíñòâî âûõîäîâ òàáëèöû èñòèííîñòè ðàâíî "1", ìîæíî çàäàòü çíà÷åíèå ïî óìîë÷àíèþ VCC. Ïðèìå÷àíèå. Íå ñëåäóåò ïóòàòü çíà÷åíèÿ ïî óìîë÷àíèþ äëÿ ïåðåìåííûõ è ïîðòîâ, êîòîðûå ïðèñâàèâàþòñÿ â ñåêöèè SUBDESIGN.
3.7.3. Ïðèñâîåíèå áèòîâ è çíà÷åíèé â öèôðîâîì àâòîìàòå Ëîãè÷åñêèé ñèíòåçàòîð àâòîìàòè÷åñêè ìèíèìèçèðóåò ÷èñëî áèòîâ ñîñòîÿíèÿ, òðåáóåìîå äëÿ öèôðîâîãî àâòîìàòà. Ïðè ýòîì îïòèìèçèðóþòñÿ êàê èñïîëüçîâàíèå óñòðîéñòâà, òàê è õàðàêòåðèñòèêè åãî ðàáîòû. Îäíàêî íåêîòîðûå óñòðîéñòâà öèôðîâîãî àâòîìàòà ìîãóò ðàáîòàòü áûñòðåå ïðè çíà÷åíèÿõ ñîñòîÿíèÿ, èñïîëüçóþùèõ ÷èñëî áèòîâ áîëüøå ìèíèìàëüíîãî. Äëÿ êîíòðîëÿ ýòèõ ñëó÷àåâ ïîëüçîâàòåëü ñàì îáúÿâëÿåò áèòû è çíà÷åíèÿ äëÿ öèôðîâîãî àâòîìàòà.
3.8. Ýëåìåíòû ÿçûêà AHDL 3.8.1. Çàðåçåðâèðîâàííûå êëþ÷åâûå ñëîâà Çàðåçåðâèðîâàííûå êëþ÷åâûå ñëîâà èñïîëüçóþòñÿ äëÿ ñëåäóþùèõ öåëåé: äëÿ îáîçíà÷åíèÿ íà÷àëà, êîíöà è ïåðåõîäîâ â îáúÿâëåíèÿõ ÿçûêà AHDL;
205
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL äëÿ îáîçíà÷åíèÿ ïðåäîïðåäåëåííûõ êîíñòàíò, ò.å. GND è VCC. Këþ÷åâûå ñëîâà ìîæíî èñïîëüçîâàòü êàê ñèìâîëè÷åñêèå èìåíà, òîëüêî åñëè îíè çàêëþ÷åíû â ñèìâîëû îäèíàðíûõ êàâû÷åê ('). Èõ ìîæíî òàêæå èñïîëüçîâàòü â êîììåíòàðèÿõ. Äëÿ òîãî ÷òîáû ïîëó÷èòü êîíòåêñòîâóþ ïîìîùü ïî êëþ÷åâîìó ñëîâó, óáåäèòåñü, ÷òî âàø ôàéë ñîõðàíåí ñ ðàñøèðåíèåì .tdf, çàòåì íàæìèòå îäíîâðåìåííî äâå êíîïêè Shift+F1 â îêíå òåêñòîâîãî ðåäàêòîðà Text Editor è ùåëêíèòå êíîïêîé ìûøè Button 1 íà êëþ÷åâîì ñëîâå. Ôèðìà «Altera» ðåêîìåíäóåò âñå êëþ÷åâûå ñëîâà íàáèðàòü ïðîïèñíûìè áóêâàìè. Ñïèñîê âñåõ çàðåçåðâèðîâàííûõ êëþ÷åâûõ ñëîâ ÿçûêà AHDL: FUNCTION
OTHERS
JKFFE
CASE
TABLE
NCLUDE
BITS
SRFFE
NODE
DFF
VCC
NOR
DFFE
WHEN
NOT
ELSE
WITH
OPTIONS
END
XNOR
OR
EXP
XOR
OUTPUT
AND
GLOBAL
RETURNS
BEGIN
GND
SOFT
BURIED
INPUT
SRFF
BIDIR
IF
STATES
CARRY
IS
SUBDESIGN
CASCADE
JKFF
TFF
CLIQUE
LATCH
TFFE
CONNECTED_PINS
LCELL
THEN
CONSTANT
MACHINE
TITLE
DEFAULTS
MACRO
TRI
DESIGN
MCELL
VARIABLE
DEVICE
NAND
X
ELSIF
OF
206
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.8.2. Ñèìâîëû  Òàáë. 3.1 ïðèâåäåíû ñèìâîëû, èìåþùèå îïðåäåëåííîå çíà÷åíèå â ÿçûêå AHDL.  ýòîò ïåðå÷åíü íå âêëþ÷åíû ñèìâîëû, èñïîëüçóåìûå â áóëåâûõ âûðàæåíèÿõ êàê îïåðàòîðû è äëÿ îïåðàöèé ñðàâíåíèÿ. Òàáëèöà 3.1. Ñèìâîëû, èñïîëüçóåìûå â ÿçûêå AHDL Ñèìâîë _ (ïîä÷åðêèâàíèå) (òèðå) (äâà òèðå) % (ïðîöåíò)
() (êðóãëûå ñêîáêè)
Ôóíêöèÿ Èñïîëüçóåìûå ïîëüçîâàòåëåì èäåíòèôèêàòîðû Ñèìâîëû â ñèìâîëè÷åñêèõ èìåíàõ Íà÷èíàåò êîììåíòàðèé â ñòèëå VHDL, êîòîðûé ïðîäîëæàåòñÿ äî êîíöà ñòðîêè Çàêëþ÷àåò ñ äâóõ ñòîðîí êîììåíòàðèé ñòèëÿ AHDL Çàêëþ÷àþò è îïðåäåëÿþò ïîñëåäîâàòåëüíûå èìåíà ãðóïï. Çàêëþ÷àþò èìåíà âûâîäîâ â ñåêöèè ïîäïðîåêòà (Subdesign Section) è â ïðîòîòèïàõ ôóíêöèé. Çàêëþ÷àþò (íåîáÿçàòåëüíî) âõîäû è âûõîäû òàáëèö â îáúÿâëåíèè Truth Table. Çàêëþ÷àþò ñîñòîÿíèÿ â îáúÿâëåíèè öèôðîâîãî àâòîìàòà State Machine. Çàêëþ÷àþò áîëåå ïðèîðèòåòíûå îïåðàöèè â áóëåâûõ âûðàæåíèÿõ. Çàêëþ÷àþò íåîáÿçàòåëüíûå âàðèàíòû â ñåêöèè ïðîåêòà Design Section (âíóòðè îáúÿâëåíèÿ íàçíà÷åíèÿ ðåñóðñîâ Assignment)
[] Çàêëþ÷àþò äèàïàçîí çíà÷åíèé â äåñÿòè÷íîì èìåíè ãðóïïû (êâàäðàòíûå ñêîáêè) '...' Çàêëþ÷àþò ñèìâîëè÷åñêèå èìåíà (îäèíàðíûå êàâû÷êè)
"..." (äâîéíûå êàâû÷êè)
. (òî÷êà) ... (ìíîãîòî÷èå) ; (òî÷êà ñ çàïÿòîé) , (çàïÿòàÿ)
Çàêëþ÷àþò ñòðîêó â îáúÿâëåíèè íàçâàíèÿ Title. Çàêëþ÷àþò öèôðû â íåäåñÿòè÷íûõ íîìåðàõ. Çàêëþ÷àþò ïóòü â îáúÿâëåíèè Include Ìîãóò (íåîáÿçàòåëüíî) çàêëþ÷àòü èìÿ ïðîåêòà è óñòðîéñòâà â ñåêöèè ïðîåêòà Design Section. Ìîãóò (íåîáÿçàòåëüíî) çàêëþ÷àòü èìÿ â îáúÿâëåíèè íàçíà÷åíèÿ êëèêè Clique Assignment Îòäåëÿåò ñèìâîëè÷åñêèå èìåíà ïåðåìåííûõ â ìàêðîôóíêöèè èëè ïðèìèòèâå îò èìåí ïîðòîâ. Îòäåëÿåò èìÿ ôàéëà îò ðàñøèðåíèÿ Ðàçäåëÿåò íàèìåíüøåå è íàèáîëüøåå çíà÷åíèå â äèàïàçîíàõ Çàêàí÷èâàåò îáúÿâëåíèÿ è ñåêöèè â ÿçûêå AHDL Ðàçäåëÿåò ýëåìåíòû ïîñëåäîâàòåëüíûõ ãðóïï è ñïèñêîâ
207
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Òàáëèöà 3.1 (îêîí÷àíèå) Ñèìâîë : (äâîåòî÷èå) @ «ñîáàêà» = (ðàâåíñòâî)
=> (ñòðåëêà)
Ôóíêöèÿ Îòäåëÿåò ñèìâîëè÷åñêèå èìåíà îò òèïîâ â îáúÿâëåíèÿõ è íàçíà÷åíèÿõ ðåñóðñîâ Ïðèñâàèâàåò ñèìâîëè÷åñêèå óçëû âûâîäàì óñòðîéñòâà è ëîãè÷åñêèì ÿ÷åéêàì â îáúÿâëåíèÿõ íàçíà÷åíèÿ ðåñóðñîâ Resource Assignment Ïðèñâàèâàåò çíà÷åíèÿ ïî óìîë÷àíèþ GND è VCC âõîäàì â ñåêöèè ïîäïðîåêòà Subdesign. Ïðèñâàèâàåò óñòàíîâî÷íûå çíà÷åíèÿ â âàðèàíòàõ. Ïðèñâàèâàåò çíà÷åíèÿ ñîñòîÿíèÿì â ìàøèíå ñîñòîÿíèé. Ïðèñâàèâàåò çíà÷åíèÿ â áóëåâûõ óðàâíåíèÿõ Îòäåëÿåò âõîäû îò âûõîäîâ â îáúÿâëåíèÿõ òàáëèöû èñòèííîñòè Truth Table. Îòäåëÿåò ïðåäëîæåíèÿ ñ WHEN îò áóëåâûõ âûðàæåíèé â îïåðàòîðå Case
3.8.3. Èìåíà â êàâû÷êàõ è áåç êàâû÷åê  ÿçûêå AHDL åñòü òðè òèïà èìåí: Ñèìâîëè÷åñêèå èìåíà ýòî îïðåäåëÿåìûå ïîëüçîâàòåëåì èäåíòèôèêàòîðû. Îíè èñïîëüçóþòñÿ äëÿ îáîçíà÷åíèÿ ñëåäóþùèõ ÷àñòåé TDF: âíóòðåííèõ è âíåøíèõ óçëîâ (âåðøèí); êîíñòàíò; ïåðåìåííûõ öèôðîâîãî àâòîìàòà, áèòîâ ñîñòîÿíèé, èìåí ñîñòîÿíèé; ïðèìåðîâ (Instance). Èìåíà ïîäïðîåêòà ýòî îïðåäåëÿåìûå ïîëüçîâàòåëåì èìåíà äëÿ ôàéëîâ ïðîåêòà áîëåå íèçêîãî óðîâíÿ. Èìÿ ïîäïðîåêòà äîëæíî áûòü òàêèì æå, êàê èìÿ ôàéëà TDF. Èìåíà ïîðòîâ ýòî ñèìâîëè÷åñêèå èìåíà, èäåíòèôèöèðóþùèå âõîä èëè âûõîä ïðèìèòèâà èëè ìàêðîôóíêöèè.  ôàéëå FIT âàøåãî ïðîåêòà ìîãóò ïîÿâèòüñÿ ãåíåðèðóåìûå êîìïèëÿòîðîì èìåíà âûâîäîâ ñ ñèìâîëîì «òèëüäà» (~). Ýòîò ñèìâîë çàðåçåðâèðîâàí äëÿ èìåí, ãåíåðèðóåìûõ êîìïèëÿòîðîì, ïîëüçîâàòåëþ çàïðåùàåòñÿ åãî èñïîëüçîâàòü äëÿ îáîçíà÷åíèÿ èìåí âûâîäîâ, óçëîâ (âåðøèí), ãðóïï (øèí). Ñóùåñòâóþò äâå ôîðìû çàïèñè äëÿ âñåõ òðåõ òèïîâ èìåí (ñèìâîëè÷åñêèõ, ïîäïðîåêòà è ïîðòîâ): â êàâû÷êàõ (') è áåç êàâû÷åê. Åñëè ðàçðàáîò÷èê ñîçäàåò ñèìâîë ïî óìîë÷àíèþ äëÿ ôàéëà TDF, êîòîðûé âêëþ÷àåò â ñåáÿ èìåíà ïîðòîâ â êàâû÷êàõ, ñîáñòâåííî êàâû÷êè íå âõîäÿò â èìåíà âûâîäîâ. Íèæå â Òàáë. 3.2 óêàçàíû âñå âîçìîæíûå âàðèàíòû çàïèñè èìåí â ÿçûêå AHDL.
208
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Òàáëèöà 3.2. Âàðèàíòû çàïèñè èìåí â ÿçûêå AHDL Èìÿ ïîäïðîåêòà Ðàçðåøåííûå ñèìâîëû
Ñèìâîëè÷åñêîå èìÿ
Èìÿ ïîðòà
Áåç êàâû-  êàâû÷- Áåç êàâû-  êàâû÷- Áåç êàâû-  êàâû÷÷åê êàõ ÷åê êàõ ÷åê êàõ
A-Z
+
+
+
+
+
+
A-z
+
+
+
+
+
+
0-9
+
+
+
+
+
+
Ïîä÷åðêèâàíèå (_)
+
+
+
+
+
+
Kîñàÿ ÷åðòà (/)
+
+
+
+
Òèðå ()
+
+
+
Òîëüêî öèôðû (0-9)
+
+
+
+
+
Këþ÷åâîå ñëîâî
+
+
+
Ìàêñèìàëüíîå ÷èñëî ñèìâîëîâ
8
8
32
32
32
32
Ïðèìåðû: Ñèìâîëè÷åñêèå èìåíà áåç êàâû÷åê: a, /a: ðàçðåøåííûå -foo, node, 55: íåðàçðåøåííûå Ñèìâîëè÷åñêèå èìåíà â êàâû÷êàõ: '-bar', 'table', '1221': ðàçðåøåííûå 'bowling4$', 'has a space ', 'a_name_with_more_than_32_characters': íåðàçðåøåííûå
3.8.4. Ãðóïïû Ñèìâîëè÷åñêèå èìåíà è ïîðòû îäíîãî è òîãî æå òèïà ìîæíî îáúÿâèòü è èñïîëüçîâàòü êàê ãðóïïû â áóëåâûõ âûðàæåíèÿõ è óðàâíåíèÿõ. Ãðóïïà, â êîòîðóþ ìîæåò âõîäèòü äî 256 ýëåìåíòîâ (èëè «áèòîâ»), îáðàáàòûâàåòñÿ êàê êîëëåêöèÿ óçëîâ (âåðøèí) è ñ÷èòàåòñÿ åäèíûì öåëûì. Ãðóïïà â ëîãè÷åñêîé ñåêöèè ôàéëà TDF ìîæåò ñîñòîÿòü èç óçëîâ èëè ÷èñåë. Îäèíî÷íûå óçëû è êîíñòàíòû GND è VCC ìîãóò äóáëèðîâàòüñÿ äëÿ îáðàçîâàíèÿ ãðóïï â áóëåâûõ âûðàæåíèÿõ è óðàâíåíèÿõ.  ôàéëå FIT ìîãóò ïîÿâèòüñÿ ãåíåðèðóåìûå êîìïèëÿòîðîì èìåíà âûâîäîâ ñ ñèìâîëîì «òèëüäà» (~). Ýòîò ñèìâîë çàðåçåðâèðîâàí äëÿ èìåí, ãåíåðèðóåìûõ êîìïèëÿòîðîì, ïîëüçîâàòåëþ çàïðåùàåòñÿ åãî èñïîëüçîâàòü äëÿ îáîçíà÷åíèÿ èìåí âûâîäîâ, óçëîâ (âåðøèí), ãðóïï (øèí).
209
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL 3.8.4.1. Ôîðìà çàïèñè ãðóïï Ñóùåñòâóþò äâå ôîðìû çàïèñè ïðè îáúÿâëåíèè ãðóïï: 1. Äåñÿòè÷íîå èìÿ ãðóïïû ñîñòîèò èç ñèìâîëè÷åñêîãî èìåíè (èëè èìåíè ïîðòà), çà êîòîðûì ñëåäóåò äèàïàçîí äåñÿòè÷íûõ ÷èñåë, çàêëþ÷åííûé â êâàäðàòíûå ñêîáêè, íàïðèìåð a[4..1]. Ïîñëå ýòîãî èìåíè ãðóïïû óêàçûâàåòñÿ òîëüêî îäèí äèàïàçîí. Âñåãî ñèìâîëè÷åñêîå èìÿ (èëè èìÿ ïîðòà) âìåñòå ñ ñàìûì äëèííûì (ïî íàïèñàíèþ) íîìåðîì â äèàïàçîíå ìîæåò ñîäåðæàòü äî 32 ñèìâîëîâ. Åñëè ãðóïïà îïðåäåëåíà, êâàäðàòíûå ñêîáêè îáåñïå÷èâàþò ñàìûé êðàòêèé ïóòü çàäàíèÿ âñåãî äèàïàçîíà. Âìåñòî äèàïàçîíà ìîæíî òàêæå óêàçûâàòü òîëüêî îäíî äåñÿòè÷íîå ÷èñëî, íàïðèìåð a[5]. Îäíàêî òàêàÿ ôîðìà çàïèñè îçíà÷àåò åäèíñòâåííîå ñèìâîëè÷åñêîå èìÿ, à íå èìÿ ãðóïïû è ýêâèâàëåíòíî èìåíè a5. 2. Ïîñëåäîâàòåëüíîå èìÿ ãðóïïû ñîñòîèò èç çàêëþ÷åííîãî â ñêîáêè ïåðå÷íÿ ñèìâîëè÷åñêèõ èìåí, èìåí ïîðòîâ èëè ÷èñåë, ðàçäåëåííûõ çàïÿòûìè, íàïðèìåð (a, b, c).  ýòîì ïåðå÷íå ìîãóò áûòü òàêæå äåñÿòè÷íûå èìåíà ãðóïï, íàïðèìåð (a, b, c[5..1]). Òàêàÿ çàïèñü èñïîëüçóåòñÿ äëÿ çàäàíèÿ èìåí ïîðòîâ. Íàïðèìåð: reg. (d, clk, clrn, prn).  ñëåäóþùåì ïðèìåðå ïîêàçàíû âàðèàíòû çàïèñè îäíîé è òîé æå ãðóïïû: b[5..0] (b5, b4, b3, b2, b1, b0) b[ ] 3.8.4.2. Äèàïàçîí è ïîääèàïàçîí ãðóïï Äèàïàçîíû â äåñÿòè÷íûõ èìåíàõ ãðóïï îáîçíà÷àþòñÿ äåñÿòè÷íûìè íîìåðàìè, îáû÷íî ïåðå÷èñëÿåìûìè â ïîðÿäêå óáûâàíèÿ. Äëÿ òîãî ÷òîáû óêàçàòü äèàïàçîí â ïîðÿäêå âîçðàñòàíèÿ èëè â îáîèõ ïîðÿäêàõ, ðàçðàáîò÷èê äîëæåí óñòàíîâèòü îïöèþ BIT0 â îáúÿâëåíèè îïöèé Options, òîãäà êîìïèëÿòîð íå áóäåò âûäàâàòü ïðåäóïðåæäàþùèå ñîîáùåíèÿ. Ïîääèàïàçîíû âêëþ÷àþò ïîäìíîæåñòâî óçëîâ, çàäàííûõ â îáúÿâëåíèè ãðóïïû, èõ ìîæíî óêàçûâàòü ðàçëè÷íûìè ñïîñîáàìè. Íàïðèìåð, åñëè ðàçðàáîò÷èê îáúÿâèë ãðóïïó c[5..1], îí ìîæåò èñïîëüçîâàòü ñëåäóþùèå ïîääèàïàçîíû ýòîé ãðóïïû: c[3..1], c4, c[5], (c2,,c4).  ëåâîé ÷àñòè áóëåâûõ óðàâíåíèé èëè â ññûëêàõ (reference) ïî òåêñòó ïðîãðàììû (in-line) íà ìàêðîôóíêöèè èëè ïðèìèòèâû â íàïèñàíèè èìåíè ãðóïïû ìîæíî èñïîëüçîâàòü çàïÿòûå âìåñòî ïåðå÷èñëåíèÿ èìåí.
210
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Ïðè óêàçàíèè äèàïàçîíà âìåñòî ÷èñåë ìîæíî èñïîëüçîâàòü êîíñòàíòû. Íàïðèìåð q[MAX...0] ÿâëÿåòñÿ ðàçðåøåííîé ôîðìîé çàïèñè, åñëè êîíñòàíòà MAX îïðåäåëåíà â îáúÿâëåíèè CONSTANT.
3.8.5. ×èñëà â ÿçûêå AHDL  ÿçûêå AHDL ìîæíî èñïîëüçîâàòü äåñÿòè÷íûå, äâîè÷íûå, âîñüìåðè÷íûå è øåñòíàäöàòåðè÷íûå ÷èñëà â ëþáîé êîìáèíàöèè.  Òàáë. 3.3 ïðèâåäåí ñèíòàêñèñ çàïèñè ÷èñåë â ÿçûêå AHDL äëÿ êàæäîé ñèñòåìû ñ÷èñëåíèÿ. Òàáëèöà 3.3. Ñèíòàêñèñ çàïèñè ÷èñåë â ÿçûêå AHDL Ñèñòåìà ñ÷èñëåíèÿ Äåñÿòè÷íàÿ Äâîè÷íàÿ Âîñüìåðè÷íàÿ Øåñòíàäöàòåðè÷íàÿ
Çíà÷åíèÿ <ïîñëåäîâàòåëüíîñòü öèôð 09> B"<ïîñëåäîâàòåëüíîñòü èç 0, 1, X>", ãäå ñèìâîë Õ îáîçíà÷àåò áåçðàçëè÷íîå çíà÷åíèå O"< ïîñëåäîâàòåëüíîñòü öèôð 07>" èëè Q"< ïîñëåäîâàòåëüíîñòü öèôð 07>" X"< ïîñëåäîâàòåëüíîñòü öèôð 09, áóêâ AF>" èëè H"< ïîñëåäîâàòåëüíîñòü öèôð 09, áóêâ AF>"
Ïðèìåðû ðàçðåøåííîé çàïèñè ÷èñåë â ÿçûêå AHDL: B"0110X1X10" Q"4671223" H"123AECF" K ÷èñëàì â ÿçûêå AHDL ïðèìåíÿþòñÿ ñëåäóþùèå ïðàâèëà: • Kîìïèëÿòîð ñèñòåìû MAX+PLUS II âñåãäà èíòåðïðåòèðóåò ÷èñëà êàê ãðóïïû äâîè÷íûõ öèôð. •  áóëåâûõ âûðàæåíèÿõ ÷èñëà íåëüçÿ ïðèñâàèâàòü îäèíî÷íûì óçëàì (âåðøèíàì). Âìåñòî ýòîãî íóæíî èñïîëüçîâàòü êîíñòàíòû VCC è GND.
3.8.6. Áóëåâû âûðàæåíèÿ Áóëåâû âûðàæåíèÿ ñîñòîÿò èç îïåðàíäîâ, ðàçäåëåííûõ ëîãè÷åñêèìè è àðèôìåòè÷åñêèìè îïåðàòîðàìè è êîìïàðàòîðàìè è (íåîáÿçàòåëüíî) ñãðóïïèðîâàííûõ ñ ïîìîùüþ êðóãëûõ ñêîáîê. Âûðàæåíèÿ èñïîëüçóþòñÿ â áóëåâûõ óðàâíåíèÿõ, à òàêæå â äðóãèõ êîíñòðóêöèÿõ ÿçûêà, òàêèõ êàê îïåðàòîðû CASE è IF. Ñóùåñòâóþò ñëåäóþùèå ïðèìåíåíèÿ áóëåâûõ âûðàæåíèé: • Îïåðàíä. Ïðèìåð: a, b[5..1], 7, VCC
211
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
• Âñòðîåííàÿ â òåêñò (in-line) ññûëêà (reference) íà ïðèìèòèâ èëè ìàêðîôóíêöèþ. • Ïðåôèêñíûé îïåðàòîð (! èëè -), ïðèìåíåííûé ê áóëåâó âûðàæåíèþ. Ïðèìåð: !c • Äâà áóëåâûõ âûðàæåíèÿ, ðàçäåëåííûå äâîè÷íûì (íå ïðåôèêñíûì) îïåðàòîðîì. Ïðèìåð: d1 $ d3 • Çàêëþ÷åííîå â êðóãëûå ñêîáêè áóëåâî âûðàæåíèå. Ïðèìåð: (!foo & bar) Ðåçóëüòàò êàæäîãî áóëåâà âûðàæåíèÿ äîëæåí èìåòü òó æå øèðèíó, ÷òî è óçåë èëè ãðóïïà (â ëåâîé ñòîðîíå óðàâíåíèÿ), êîòîðîìó îí, â êîíå÷íîì ñ÷åòå, ïðèñâàèâàåòñÿ. 3.8.7 Ëîãè÷åñêèå îïåðàòîðû  Òàáë. 3.4 ïðèâåäåíû ëîãè÷åñêèå îïåðàòîðû äëÿ áóëåâûõ âûðàæåíèé. Òàáëèöà 3.4. Ëîãè÷åñêèå îïåðàòîðû äëÿ áóëåâûõ âûðàæåíèé Îïåðàòîð
Ïðèìåð
!
!tob
NOT
NOT tob
&
bread & butter
AND
bread AND butter
!&
a[3..1] !& b[5..3]
NAND
a[3..1] NAND b[5..3]
#
trick # treat
OR
trick OR treat
!#
c[8..5] !# d[7..4]
NOR
c[8..5] NOR d[7..4]
$
foo $ bar
XOR
foo XOR bar
!$
x2 !$ x4
XNOR
x2 XNOR x4
Îïèñàíèå Äîïîëíåíèå (ïðåôèêñíîå îáðàùåíèå) Ëîãè÷åñêîå «È» Îáðàùåíèå ëîãè÷åñêîãî «È» Ëîãè÷åñêîå «ÈËÈ» Îáðàùåíèå ëîãè÷åñêîãî «ÈËÈ» «Èñêëþ÷àþùåå ÈËÈ» Îáðàùåíèå «èñêëþ÷àþùåãî ëîãè÷åñêîãî ÈËÈ»
Kàæäûé îïåðàòîð ïðåäñòàâëÿåò ñîáîé ëîãè÷åñêèé âåíòèëü ñ äâóìÿ âõîäàìè; èñêëþ÷åíèå ñîñòàâëÿåò îïåðàòîð NOT, ÿâëÿþùèéñÿ ïðåôèêñíûì èíâåðòîðîì. Äëÿ çàïèñè ëîãè÷åñêîãî îïåðàòîðà ìîæíî èñïîëüçîâàòü åãî èìÿ èëè ñèìâîë.
212
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Âûðàæåíèÿ, â êîòîðûõ èñïîëüçóþòñÿ ýòè îïåðàòîðû, èíòåðïðåòèðóþòñÿ ïî-ðàçíîìó â çàâèñèìîñòè îò òîãî, ÷òî ïðåäñòàâëÿþò ñîáîé îïåðàíäû: îäèíî÷íûå óçëû (âåðøèíû), ãðóïïû èëè ÷èñëà. Kðîìå òîãî, âûðàæåíèÿ ñ îïåðàòîðîì NOT èíòåðïðåòèðóþòñÿ íå òàê êàê äðóãèå ëîãè÷åñêèå îïåðàòîðû.
3.8.8. Âûðàæåíèÿ ñ îïåðàòîðîì NOT Ñ îïåðàòîðîì NOT ìîæíî èñïîëüçîâàòü òðè òèïà îïåðàíäîâ: • Åñëè îïåðàíä ïðåäñòàâëÿåò ñîáîé îäèíî÷íûé óçåë, êîíñòàíòû GND èëè VCC, âûïîëíÿåòñÿ îäíà îïåðàöèÿ îáðàùåíèÿ. Ïðèìåð: !a. • Åñëè îïåðàíä ïðåäñòàâëÿåò ñîáîé ãðóïïó óçëîâ, êàæäûé ýëåìåíò ãðóïïû ïðîõîäèò ÷åðåç èíâåðòîð. Ïðèìåð: !a[4..1] èíòåðïðåòèðóåòñÿ êàê (!a4, !a3, !a2, !a1). • Åñëè îïåðàíä ïðåäñòàâëÿåò ñîáîé ÷èñëî, îí îáðàáàòûâàåòñÿ êàê äâîè÷íîå ÷èñëî, ò.å. êàê ãðóïïà ñîîòâåòñòâóþùåãî ÷èñëà áèòîâ, ãäå îáðàùàåòñÿ êàæäûé áèò. Ïðèìåð: !9 îïåðàíä èíòåðïðåòèðóåòñÿ êàê äâîè÷íîå ÷èñëî !B"1001" (ãðóïïà èç ÷åòûðåõ ýëåìåíòîâ), ðåçóëüòàò B"0110".
3.8.9. Âûðàæåíèÿ ñ îïåðàòîðàìè AND, NAND, OR, NOR, XOR, & XNOR Ñóùåñòâóþò ÷åòûðå êîìáèíàöèè îïåðàíäîâ ñ äâîè÷íûìè (íå ïðåôèêñíûìè) îïåðàòîðàìè, è êàæäàÿ èç íèõ èíòåðïðåòèðóåòñÿ ïî-îñîáîìó: • Åñëè îïåðàíä ïðåäñòàâëÿåò ñîáîé îäèíî÷íûé óçåë, êîíñòàíòû GND èëè VCC, îïåðàòîð âûïîëíÿåò ëîãè÷åñêóþ îïåðàöèþ íàä äâóìÿ ýëåìåíòàìè. Ïðèìåð: (a&b). • Åñëè îáà îïåðàòîðà ÿâëÿþòñÿ ãðóïïàìè óçëîâ, îïåðàòîð ïðèìåíÿåòñÿ ê ñîîòâåòñòâóþùèì óçëàì êàæäîé ãðóïïû, ïðîèçâîäÿ ðÿä îïåðàöèé íà áèòîâîì óðîâíå ìåæäó ãðóïïàìè. Ãðóïïû äîëæíû áûòü îäèíàêîâîãî ðàçìåðà. Ïðèìåð: (a,b) # (c,d) èíòåðïðåòèðóåòñÿ êàê (a#c, b#d). • Åñëè îäèí îïåðàòîð ïðåäñòàâëÿåò ñîáîé îäèíî÷íûé óçåë, êîíñòàíòû GND èëè VCC, à äðóãîé îïåðàíä ãðóïïó óçëîâ, òî îäèíî÷íûé óçåë èëè êîíñòàíòà äóáëèðóþòñÿ äëÿ îáðàçîâàíèÿ ãðóïïû òàêîãî æå ðàçìåðà, ÷òî è âòîðîé îïåðàíä. Çàòåì âûðàæåíèå èíòåðïðåòèðóåòñÿ êàê ãðóïïîâàÿ îïåðàöèÿ. Ïðèìåð: a & b[2..1] èíòåðïðåòèðóåòñÿ êàê (a&b2, a&b1). • Åñëè îáà îïåðàíäà ïðåäñòàâëÿþò ñîáîé ÷èñëà, áîëåå êîðîòêîå (â ñìûñëå ÷èñëà áèòîâ â äâîè÷íîì ïðåäñòàâëåíèè) ÷èñëî äîïîëíÿåòñÿ íåçíà-
213
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ÷àùèìè íóëÿìè, ÷òîáû ñðàâíÿòüñÿ ïî ÷èñëó áèòîâ ñ äðóãèì îïåðàíäîì. Çàòåì âûðàæåíèå èíòåðïðåòèðóåòñÿ êàê ãðóïïîâàÿ îïåðàöèÿ. Ïðèìåð: â âûðàæåíèè (3#8) 3 è 8 ïðåîáðàçóþòñÿ â äâîè÷íûå ÷èñëà B"0011" è B"1000". Ðåçóëüòàòîì ÿâëÿåòñÿ B"1011". • Åñëè îäèí îïåðàíä ïðåäñòàâëÿåò ñîáîé ÷èñëî, à äðóãîé óçåë èëè ãðóïïó óçëîâ, òî ÷èñëî óñåêàåòñÿ èëè ðàñøèðÿåòñÿ äî ðàçìåðà ãðóïïû. Ïðè óñå÷åíèè çíà÷àùèõ áèòîâ ãåíåðèðóåòñÿ ñîîáùåíèå îá îøèáêå. Âûðàæåíèå çàòåì èíòåðïðåòèðóåòñÿ êàê ãðóïïîâàÿ îïåðàöèÿ. Ïðèìåð: (a,b,c)&1 èíòåðïðåòèðóåòñÿ êàê (a&0, b&0, c&1). Âûðàæåíèå ñ êîíñòàíòîé VCC èíòåðïðåòèðóåòñÿ íå òàê êàê âûðàæåíèå ñ îïåðàíäîì 1.  ïåðâîì âûðàæåíèè ïðèâåäåííîãî íèæå ïðèìåðà ÷èñëî 1 ðàñøèðÿåòñÿ ïî ÷èñëó áèòîâ äâîè÷íîãî ïðåäñòàâëåíèÿ, ÷òîáû ñîîòâåòñòâîâàòü ðàçìåðó ãðóïïû. Âî âòîðîì óðàâíåíèè óçåë VCC äóáëèðóåòñÿ äëÿ îáðàçîâàíèÿ ãðóïïû òîãî æå ðàçìåðà. Çàòåì êàæäîå óðàâíåíèå èíòåðïðåòèðóåòñÿ êàê ãðóïïîâàÿ îïåðàöèÿ. ! operation. (a, b, c) & 1 = (0, 0, c) (a, b, c) & VCC = (a, b, c).
3.8.10. Àðèôìåòè÷åñêèå îïåðàòîðû Àðèôìåòè÷åñêèå îïåðàòîðû èñïîëüçóþòñÿ äëÿ âûïîëíåíèÿ àðèôìåòè÷åñêèõ îïåðàöèé ñëîæåíèÿ è âû÷èòàíèÿ íàä ãðóïïàìè è ÷èñëàìè.  ÿçûêå AHDL ïðèìåíÿþòñÿ ñëåäóþùèå àðèôìåòè÷åñêèå îïåðàòîðû (Òàáë. 3.5). Òàáëèöà 3.5. Àðèôìåòè÷åñêèå îïåðàòîðû, ïðèìåíÿåìûå â ÿçûêå AHDL Îïåðàòîð
Ïðèìåð
Îïèñàíèå
+ (óíàðíûé)
+1
Ïîëîæèòåëüíîå çíà÷åíèå
(óíàðíûé)
a[4..1]
Îòðèöàòåëüíîå çíà÷åíèå
+
count[7..0] + delta[7..0]
Ñëîæåíèå
rightmost_x[] leftmost_x[]
Âû÷èòàíèå
Óíàðíûå ïëþñ (+) è ìèíóñ () ÿâëÿþòñÿ ïðåôèêñíûìè îïåðàòîðàìè. Îïåðàòîð + íå âëèÿåò íà ñâîé îïåðàíä, è ðàçðàáîò÷èê ìîæåò èñïîëüçîâàòü åãî äëÿ èëëþñòðàòèâíûõ öåëåé (ò.å. äëÿ óêàçàíèÿ ïîëîæèòåëüíîãî ÷èñëà). Îïåðàòîð èíòåðïðåòèðóåò ñâîé îïåðàíä â äâîè÷íîì ïðåäñòàâëåíèè (åñëè îí òàêîâûì íå ÿâëÿåòñÿ ñ ñàìîãî íà÷àëà). Çàòåì îí âûïîëíÿåò îïåðàöèþ óíàðíîãî ìèíóñà, ò.å. ïîëó÷àåò äîïîëíåíèå îïåðàíäà êàê äâîè÷íîãî ÷èñëà.
214
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL K äðóãèì àðèôìåòè÷åñêèì îïåðàòîðàì ïðèìåíÿþòñÿ ñëåäóþùèå ïðàâèëà:
• Îïåðàöèè âûïîëíÿþòñÿ ìåæäó äâóìÿ îïåðàíäàìè, êîòîðûå äîëæíû áûòü ãðóïïàìè óçëîâ èëè ÷èñëàìè.
• Åñëè îáà îïåðàíäà ïðåäñòàâëÿþò ñîáîé ãðóïïû óçëîâ, òî îíè äîëæíû èìåòü îäèíàêîâûé ðàçìåð.
• Åñëè îáà îïåðàíäà ïðåäñòàâëÿþò ñîáîé ÷èñëà, òî áîëåå êîðîòêîå (â äâîè÷•
íîì ïðåäñòàâëåíèè) ÷èñëî ðàñøèðÿåòñÿ (äîïîëíÿåòñÿ íåçíà÷àùèìè íóëÿìè), ÷òîáû ñðàâíÿòüñÿ ïî ÷èñëó áèòîâ ñ äðóãèì îïåðàíäîì. Åñëè îäèí îïåðàíä ïðåäñòàâëÿåò ñîáîé ÷èñëî, à äðóãîé ÿâëÿåòñÿ ãðóïïîé óçëîâ, òî ÷èñëî óñåêàåòñÿ èëè ðàñøèðÿåòñÿ â äâîè÷íîì ïðåäñòàâëåíèè äî ðàçìåðà ãðóïïû. Åñëè ïðè ýòîì óñåêàþòñÿ çíà÷àùèå áèòû, êîìïèëÿòîð ñèñòåìû MAX+PLUS II ãåíåðèðóåò ñîîáùåíèå îá îøèáêå.
3.8.11. Kîìïàðàòîðû (îïåðàòîðû ñðàâíåíèÿ) Kîìïàðàòîðû èñïîëüçóþòñÿ äëÿ ñðàâíåíèÿ îäèíî÷íûõ óçëîâ èëè ãðóïï. Ñóùåñòâóþò äâà òèïà êîìïàðàòîðîâ: ëîãè÷åñêèå è àðèôìåòè÷åñêèå.  ÿçûêå AHDL ðåàëèçîâàíû ñëåäóþùèå êîìïàðàòîðû (Òàáë. 3.6). Òàáëèöà 3.6. Kîìïàðàòîðû, ðåàëèçîâàííûå â ÿçûêå AHDL Kîìïàðàòîð == (ëîãè÷åñêèé)
Ïðèìåð addr[19..4] == B"B800"
Ðàâíû
Îïèñàíèå
!= (ëîãè÷åñêèé)
b1 != b3
Íå ðàâíû
< (àðèôìåòè÷åñêèé)
fame[] < power[]
Ìåíüøå ÷åì
<= (àðèôìåòè÷åñêèé)
money[] <= power[]
Ìåíüøå ëèáî ðàâíî
> (àðèôìåòè÷åñêèé c) >= (àðèôìåòè÷åñêèé)
love[] > money[] delta[] >= 0
Áîëüøå ÷åì Áîëüøå ëèáî ðàâíî
Îïåðàòîð (==) èñïîëüçóåòñÿ èñêëþ÷èòåëüíî â áóëåâûõ âûðàæåíèÿõ. Ëîãè÷åñêèå êîìïàðàòîðû ìîãóò ñðàâíèâàòü îäèíî÷íûå óçëû, ãðóïïû óçëîâ è ÷èñëà. Ïðè ñðàâíåíèè ãðóïï óçëîâ èëè ÷èñåë ðàçìåð ãðóïï äîëæåí áûòü îäèíàêîâûì. Kîìïèëÿòîð ñèñòåìû MAX+PLUS II âûïîëíÿåò ïîáèòîâîå ñðàâíåíèå ãðóïï è âîçâðàùàåò çíà÷åíèå VCC, åñëè ðåçóëüòàò èñòèíà, è GND, åñëè ðåçóëüòàò ëîæü. Àðèôìåòè÷åñêèå êîìïàðàòîðû ìîãóò ñðàâíèâàòü òîëüêî ãðóïïû óçëîâ è ÷èñëà, è ãðóïïû äîëæíû èìåòü îäèíàêîâûé ðàçìåð. Kîìïèëÿòîð âûïîëíÿåò íàä ãðóïïàìè îïåðàöèè áåççíàêîâîãî ñðàâíåíèÿ çíà÷åíèé, ò.å. êàæäàÿ ãðóïïà èíòåðïðåòèðóåòñÿ êàê ïîëîæèòåëüíîå äâîè÷íîå ÷èñëî è ñðàâíèâàåòñÿ ñ äðóãîé ãðóïïîé.
215
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.8.12. Ïðèîðèòåòû â áóëåâûõ óðàâíåíèÿõ Îïåðàíäû, ðàçäåëåííûå ëîãè÷åñêèìè è àðèôìåòè÷åñêèìè îïåðàòîðàìè è êîìïàðàòîðàìè, îöåíèâàþòñÿ ïî ïðàâèëàì ïðèîðèòåòîâ, ïåðå÷èñëåííûì íèæå (Òàáë. 3.7) (ïðèîðèòåò 1 ÿâëÿåòñÿ íàèâûñøèì). Ðàâíîïðèîðèòåòíûå îïåðàöèè âûïîëíÿþòñÿ ïî î÷åðåäè ñëåâà íàïðàâî. Ïîðÿäîê âûïîëíåíèÿ ìîæåò áûòü èçìåíåí ñ ïîìîùüþ çàêëþ÷åíèÿ â êðóãëûå ñêîáêè. Òàáëèöà 3.7. Îïåðàíäû è èõ ïðèîðèòåòû Ïðèîðèòåò
Îïåðàòîð
1
Îòðèöàíèå
Kîìïàðàòîð
1
!
Ëîãè÷åñêîå «ÍÅ»
2
+
Ñëîæåíèå
2
Âû÷èòàíèå
3
==
Ðàâíî
3
!=
Íå ðàâíî
3
<
Ìåíüøå ÷åì ...
3
<=
Ìåíüøå ëèáî ðàâíî ...
3
>
Áîëüøå ÷åì ...
3
>=
Áîëüøå ëèáî ðàâíî ...
4
&
AND
4
!&
NAND
5
$
XOR
5
!$
XNOR
6
#
OR
6
!#
NOR
3.8.13. Ïðèìèòèâû  ñèñòåìå MAX+PLUS II åñòü ðàçíîîáðàçíûå ïðèìèòèâíûå ôóíêöèè äëÿ ïðîåêòèðîâàíèÿ ýëåêòðè÷åñêèõ ñõåì. Ïîñêîëüêó ëîãè÷åñêèå îïåðàòîðû, ïîðòû è íåêîòîðûå îáúÿâëåíèÿ ÿçûêà AHDL çàìåíÿþò ïðèìèòèâû â ôàéëàõ TDF, íàïèñàííûõ íà ÿçûêå AHDL, ïðèìèòèâû ÿçûêà AHDL ÿâëÿþòñÿ ïîäìíîæåñòâîì ïðèìèòèâîâ, êîòîðûå èìåþòñÿ äëÿ ôàéëîâ ãðàôè÷åñêîãî ïðîåêòà (GDF-ôàéë), êàê áóäåò ïîêàçàíî íèæå.  ôàéëàõ TDF íåò íåîáõîäèìîñòè èñïîëüçîâàíèÿ ïðîòîòèïîâ ôóíêöèé ÿçûêà AHDL äëÿ ïðèìèòèâîâ. Îäíàêî ïóòåì âêëþ÷åíèÿ â âàø TDF-ôàéë
216
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ïðîòîòèïà ôóíêöèè ðàçðàáîò÷èê ìîæåòå ïåðåîïðåäåëèòü ïîðÿäîê âûçîâà âõîäîâ ïðèìèòèâà. 3.8.13.1. Ïðèìèòèâû áóôåðîâ CARRY LCELL (MCELL) CASCADE SOFT EXP TRI GLOBAL (SCLK) Ïðèìèòèâ CARRY (ïåðåíîñ) Ïðîòîòèï ôóíêöèè: FUNCTION CARRY (in) RETURNS (out); Ïðèìèòèâ CARRY îïðåäåëÿåò ëîãèêó «ïåðåíîñà íà âûõîä» (carry-out) äëÿ îäíîé ôóíêöèè è äåéñòâóåò êàê «ïåðåíîñ íà âõîä» (carry-in) äëÿ äðóãîé ôóíêöèè. Ôóíêöèÿ ïåðåíîñà îñóùåñòâëÿåò ëîãèêó áûñòðîãî ïåðåíîñà ïî öåïî÷êå äëÿ òàêèõ ôóíêöèé êàê ñóììàòîðû è ñ÷åò÷èêè. Ïðèìèòèâ CARRY ïîääåðæèâàåòñÿ òîëüêî äëÿ óñòðîéñòâ ñåìåéñòâà FLEX8000. Äëÿ äðóãèõ óñòðîéñòâ îí èãíîðèðóåòñÿ. Åñëè ðàçðàáîò÷èê èñïîëüçóåò ïðèìèòèâ CARRY íåêîððåêòíî, îí èãíîðèðóåòñÿ è êîìïèëÿòîð âûäàåò ñîîòâåòñòâóþùåå ïðåäóïðåæäàþùåå ñîîáùåíèå. Âû ìîæåòå ïîçâîëèòü êîìïèëÿòîðó àâòîìàòè÷åñêè âñòàâëÿòü è óáèðàòü CARRY âî âðåìÿ ñèíòåçà ëîãèêè, äëÿ ýòîãî íóæíî âûáðàòü îïöèþ ëîãèêè ñ ïåðåíîñîì ïî öåïî÷êå Carry Chain èëè ñòèëü ñèíòåçà ëîãèêè, êîòîðûé âêëþ÷àåò ýòó îïöèþ. Ïðèìèòèâ CASCADE (êàñêàä) Ïðîòîòèï ôóíêöèè: FUNCTION CASCADE (in) RETURNS (out); Áóôåð CASCADE îïðåäåëÿåò ôóíêöèþ êàñêàäíîãî âûõîäà èç ëîãè÷åñêîé ñõåìû «È» (AND) èëè «ÈËÈ» (OR) è äåéñòâóåò êàê âõîäíîé êàñêàä äëÿ äðóãîé ëîãè÷åñêîé ñõåìû «È» èëè «ÈËÈ». Ôóíêöèÿ âõîäíîãî êàñêàäà ïîçâîëÿåò îðãàíèçîâàòü êàñêàäíûé ïðîöåññ, êîòîðûé ïðåäñòàâëÿåò ñîáîé áûñòðûé âûõîä, ðàñïîëîæåííûé íà êàæäîé êîìáèíàöèîííîé ëîãè÷åñêîé ÿ÷åéêå è ó÷àñòâóþùèé â îïåðàöèè «ÈËÈ» èëè «È» ñ âûõîäîì ñîñåäíåé êîìáèíàöèîííîé ëîãè÷åñêîé ÿ÷åéêè â óñòðîéñòâå. Ñ ïîìîùüþ ïðèìèòèâà CASCADE ëîãè÷åñêàÿ ÿ÷åéêà «È» èëè «ÈËÈ», êîòîðàÿ ïèòàåò ïðèìèòèâ CASCADE, è ëîãè÷åñêàÿ ÿ÷åéêà «È» èëè «ÈËÈ», êîòîðàÿ çàïèòûâàåòñÿ ïðèìèòèâîì CASCADE, ïîìåùàþòñÿ â îäíîì óñòðîéñòâå, ïðè÷åì ïåðâûé ñèìâîë ïîñëå ïðîâåäåíèÿ íàä íèì ëîãè÷åñêîé îïåðàöèè «È» èëè «ÈËÈ» ïåðåõîäèò âî âòîðîé ñèìâîë. Ïðèìèòèâ CASCADE ïîä-
217
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL äåðæèâàåòñÿ òîëüêî äëÿ óñòðîéñòâ ñåìåéñòâà FLEX8000. Äëÿ äðóãèõ óñòðîéñòâ îí èãíîðèðóåòñÿ. Ïðè èñïîëüçîâàíèè ïðèìèòèâà CASCADE íóæíî ñîáëþäàòü ñëåäóþùèå ïðàâèëà: • Ïðèìèòèâ CASCADE ìîæåò ôîðìèðîâàòü ñèãíàë äëÿ ëîãè÷åñêîé ÿ÷åéêè «È» èëè «ÈËÈ» èëè áûòü çàïèòàííûì îäíîé-åäèíñòâåííîé ñõåìîé «È» èëè «ÈËÈ». • Îáðàùåííàÿ ëîãè÷åñêàÿ ñõåìà «ÈËÈ» ðàññìàòðèâàåòñÿ êàê ñõåìà «È», è íàîáîðîò. Ëîãè÷åñêèìè ýêâèâàëåíòàìè ñõåìû «È» ÿâëÿþòñÿ BAND, BNAND è NOR. Ëîãè÷åñêèìè ýêâèâàëåíòàìè ñõåìû «ÈËÈ» ÿâëÿþòñÿ BOR, BNOR and NAND. • Äâà ïðèìèòèâà CASCADE íå ìîãóò ôîðìèðîâàòü ñèãíàë äëÿ îäíîé è òîé æå ëîãè÷åñêîé ñõåìû. • Ïðèìèòèâ CASCADE íå ìîæåò ôîðìèðîâàòü ñèãíàë äëÿ ëîãè÷åñêîé ñõåìû XOR. • Ïðèìèòèâ CASCADE íå ìîæåò ôîðìèðîâàòü ñèãíàë äëÿ ïðèìèòèâà âûâîäà OUTPUT èëè OUTPUTC, èëè ðåãèñòðà. •  ñîîòâåòñòâèè ñ ïðàâèëàìè Äå Ìîðãàíà (De Morgan) îá èíâåðñèè äëÿ êàñêàäèðîâàííûõ ëîãè÷åñêèõ ñõåì «È» èëè «ÈËÈ» íóæíî, ÷òîáû âñå ïðèìèòèâû â êàñêàäèðîâàííîé öåïî÷êå áûëè îäíîãî è òîãî æå òèïà. Kàñêàäèðîâàííàÿ ëîãè÷åñêàÿ ñõåìà «È» íå ìîæåò ôîðìèðîâàòü ñèãíàë äëÿ êàñêàäèðîâàííîé ñõåìû «ÈËÈ», è íàîáîðîò. Åñëè ðàçðàáîò÷èê èñïîëüçóåò ïðèìèòèâ CASCADE íåêîððåêòíî, îí èãíîðèðóåòñÿ è êîìïèëÿòîð âûäàåò ñîîòâåòñòâóþùåå ïðåäóïðåæäàþùåå ñîîáùåíèå. Âû ìîæåòå ïîçâîëèòü êîìïèëÿòîðó àâòîìàòè÷åñêè âñòàâëÿòü è óáèðàòü ïðèìèòèâû CASCADE âî âðåìÿ ñèíòåçà ëîãèêè, äëÿ ýòîãî íóæíî âûáðàòü îïöèþ ëîãèêè ñ ïåðåíîñîì ïî öåïî÷êå Cascade Chain èëè ñòèëü ñèíòåçà ëîãèêè, êîòîðûé âêëþ÷àåò ýòó îïöèþ. Ïðèìèòèâ EXP (ðàñøèðèòåëü) Ïðîòîòèï ôóíêöèè: FUNCTION EXP (in) RETURNS (out); Ðàñøèðèòåëüíûé áóôåð EXP îïðåäåëÿåò íåîáõîäèìîñòü äîïîëíèòåëüíîãî ìåñòà ïðè âû÷èñëåíèè ïðîèçâåäåíèÿ â ïðîåêòå. Ïðîèçâåäåíèå èç ðàñøèðèòåëÿ â óñòðîéñòâå èíâåðòèðóåòñÿ. Ïðèìèòèâ EXP ïîääåðæèâàåòñÿ òîëüêî ñåìåéñòâîì óñòðîéñòâ MAX5000/EPS464 è MAX7000.  äðóãèõ óñòðîéñòâàõ îí ðàññìàòðèâàåòñÿ êàê ëîãè÷åñêàÿ ñõåìà «ÍÅ» (NOT). Äëÿ êàæäîãî îòäåëüíîãî óñòðîéñòâà
218
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL íóæíî îçíàêîìèòüñÿ ñ åãî òåõíè÷åñêèì ïàñïîðòîì, ÷òîáû óçíàòü, êàê êîíêðåòíîå óñòðîéñòâî èñïîëüçóåò ëîãè÷åñêèå ÿ÷åéêè è ðàñøèðèòåëüíûå áóôåðû äëÿ âû÷èñëåíèÿ ïðîèçâåäåíèé. Áóäåò èëè íåò èñïîëüçîâàòüñÿ ðàñøèðèòåëü äëÿ ïðîèçâåäåíèÿ, çàâèñèò îò ïîëÿðíîñòè ëîãèêè, òðåáóåìîé âû÷èñëÿåìûìè ôóíêöèÿìè. Íàïðèìåð, åñëè áóôåð EXP ïèòàåò äâå ëîãè÷åñêèå ñõåìû «È» (ò.å. ëîãè÷åñêîå óìíîæåíèå), à âòîðàÿ ñõåìà «È» èìååò èíâåðòèðîâàííûé âõîä, òî ïðèìèòèâ EXP, ïèòàþùèé èíâåðòèðîâàííûé âõîä, âî âðåìÿ ëîãè÷åñêîãî ñèíòåçà óáèðàåòñÿ, ñîçäàâàÿ, òàêèì îáðàçîì, ïîëîæèòåëüíóþ ëîãèêó. Ïðèìèòèâ EXP, ïèòàþùèé íåèíâåðòèðîâàííûé âõîä, íå óáèðàåòñÿ, è äëÿ ðåàëèçàöèè ëîãèêè èñïîëüçóåòñÿ ðàñøèðèòåëü äëÿ ïðîèçâåäåíèÿ. Îáû÷íî ëîãè÷åñêèé ñèíòåçàòîð îïðåäåëÿåò, êóäà âñòàâëÿòü è îòêóäà óáèðàòü áóôåðû. Ôèðìà «Altera» ðåêîìåíäóåò, ÷òîáû òîëüêî îïûòíûå ðàçðàáîò÷èêè èñïîëüçîâàëè ïðèìèòèâ EXP â ñâîèõ ïðîåêòàõ.  óñòðîéñòâàõ, ñîäåðæàùèõ ìíîãî ëîãè÷åñêèõ áëîêîâ (LAB), âûõîä áóôåðà EXP ìîæåò ôîðìèðîâàòü ñèãíàë òîëüêî â ïðåäåëàõ îäíîãî LAB. Ïðèìèòèâ EXP äóáëèðóåòñÿ äëÿ êàæäîãî LAB, ãäå îí òðåáóåòñÿ. Åñëè ïðîåêò ñîäåðæèò ìíîãî ðàñøèðèòåëüíûõ áóôåðîâ, ëîãè÷åñêèé ñèíòåçàòîð ìîæåò ïðåîáðàçîâàòü èõ â áóôåðû LCELL, ÷òîáû ñáàëàíñèðîâàòü èñïîëüçîâàíèå ðàñøèðèòåëÿ äëÿ ïðîèçâåäåíèÿ è ëîãè÷åñêîé ÿ÷åéêè. Íå èñïîëüçóéòå ïðèìèòèâû EXP äëÿ ñîçäàíèÿ íàìåðåííîé çàäåðæêè èëè àñèíõðîííîãî èìïóëüñà. Çàäåðæêà ýòèõ ýëåìåíòîâ èçìåíÿåòñÿ ñ òåìïåðàòóðîé, íàïðÿæåíèåì ïèòàíèÿ è ïðè ïðîöåññàõ èçãîòîâëåíèÿ óñòðîéñòâà, ïîýòîìó ìîæåò âîçíèêíóòü ðåæèì ñîñòÿçàíèÿ è ïîëó÷èòñÿ íåíàäåæíàÿ ñõåìà. Ïðèìèòèâ GLOBAL (ãëîáàëüíûé) Ïðîòîòèï ôóíêöèè: FUNCTION GLOBAL (in) RETURNS (out); Áóôåð GLOBAL óêàçûâàåò, ÷òî ñèãíàë (signal) äîëæåí èñïîëüçîâàòü ãëîáàëüíûé ñèíõðîííûé ñèãíàë Clock, Clear, Preset èëè Output Enable âìåñòî ñèãíàëîâ, ñãåíåðèðîâàííûõ âíóòðåííåé ëîãèêîé èëè ïîñòóïàþùèõ ÷åðåç îáû÷íûå âûâîäû âõîä/âûõîä. Ãëîáàëüíûå ñèãíàëû èñïîëüçóþòñÿ â ðàçëè÷íûõ ñåìåéñòâàõ óñòðîéñòâ â ñîîòâåòñòâèè ñ èõ ñèíõðîíèçàöèåé. Åñëè âõîäíîé âûâîä ôîðìèðóåò ñèãíàë íåïîñðåäñòâåííî íà âõîä ïðèìèòèâà GLOBAL, òî âûõîä ïðèìèòèâà GLOBAL ìîæåò áûòü èñïîëüçîâàí, ÷òîáû ôîðìèðîâàòü ñèãíàë íà âõîäû Clock, Clear, Preset èëè Output Enable ê ïðèìèòèâó. Äîëæíî ñóùåñòâîâàòü íåïîñðåäñòâåííîå ñîåäèíåíèå îò âûõîäà GLOBAL êî âõîäó ðåãèñòðà èëè áóôåðà TRI. Åñëè áóôåð GLOBAL
219
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL ôîðìèðóåò ñèãíàë, ÿâëÿþùèéñÿ âõîäíûì ñèãíàëîì Output Enable áóôåðà TRI, òî ìîæåò ïîòðåáîâàòüñÿ ëîãè÷åñêàÿ ñõåìà «ÍÅ». Îäèí âõîä ìîæåò ïðîõîäèòü ÷åðåç GLOBAL, ïåðåä òåì êàê ôîðìèðîâàòü ñèãíàë äëÿ âõîäà ðåãèñòðà ñèãíàëîâ Clock, Clear èëè Preset èëè âõîä áóôåðà TRI äëÿ ñèãíàëà Output Enable. Ãëîáàëüíûå ñèíõðîñèãíàëû ðàñïðîñòðàíÿþòñÿ áûñòðåå, ÷åì àñèíõðîííûå (array) ñèãíàëû, è ìîãóò îñâîáîæäàòü ðåñóðñû óñòðîéñòâà äëÿ ðåàëèçàöèè äðóãîé ëîãèêè. Äëÿ îñóùåñòâëåíèÿ ñèíõðîíèçàöèè ÷àñòè èëè âñåãî ïðîåêòà ñëåäóåò èñïîëüçîâàòü ïðèìèòèâ GLOBAL. Äëÿ òîãî ÷òîáû ïðîâåðèòü, èìåþò ëè ðåãèñòðû ãëîáàëüíóþ ñèíõðîíèçàöèþ, íóæíî ïðîñìîòðåòü ôàéë îò÷åòà Report File îáðàáàòûâàåìîãî ïðîåêòà. Åñëè âàø ïðîåêò óñòðîéñòâà MAX5000 ñî÷åòàåò àñèíõðîííûé ðåæèì ðàáîòû è ðåæèì ñ ãëîáàëüíîé ñèíõðîíèçàöèåé, à ìîäóëü êîìïèëÿòîðà Fitter íå ìîæåò âûáðàòü ïîäõîäÿùèé, ïðîáëåìà ìîæåò áûòü ðåøåíà óäàëåíèåì áóôåðà GLOBAL. Åñëè àíàëîãè÷íàÿ ïðîáëåìà âñòðåòèòñÿ âàì â ïðîåêòå MAX7000, çàìåíèòå àñèíõðîííûé ðåæèì ðåæèìîì ñ ãëîáàëüíîé ñèíõðîíèçàöèåé.  êà÷åñòâå àëüòåðíàòèâû èñïîëüçîâàíèþ ïðèìèòèâà GLOBAL ðàçðàáîò÷èê ìîæåò ïðåäîñòàâèòü êîìïèëÿòîðó àâòîìàòè÷åñêè âûáèðàòü, êàêèì áóäåò ñóùåñòâóþùèé ñèãíàë ïðîåêòà, ãëîáàëüíûì Clock, Clear, Preset èëè Output Enable, ïîñðåäñòâîì êîìàíäû Logic Synthesis. Ïðèìèòèâ LCELL Ïðîòîòèï ôóíêöèè: FUNCTION LCELL (in) RETURNS (out); Áóôåð LCELL âûäåëÿåòñÿ äëÿ ëîãè÷åñêîé ÿ÷åéêè ïðîåêòà. Áóôåð LCELL âûðàáàòûâàåò èñòèííîå çíà÷åíèå è äîïîëíåíèå ëîãè÷åñêîé ôóíêöèè è äåëàåò èõ äîñòóïíûìè äëÿ âñåé ëîãèêè óñòðîéñòâà. Äëÿ îáðàòíîé ñîâìåñòèìîñòè ñ áîëåå ðàííèìè âåðñèÿìè ñèñòåìû MAX+PLUS II èìååòñÿ áóôåð MCELL, ôóíêöèîíàëüíî òàêîé æå, êàê è áóôåð LCELL.  íîâûõ ïðîåêòàõ ñëåäóåò èñïîëüçîâàòü òîëüêî áóôåð LCELL. Áóôåð LCELL âñåãäà çàíèìàåò îäíó ëîãè÷åñêóþ ÿ÷åéêó. Îí íå óäàëÿåòñÿ èç ïðîåêòà âî âðåìÿ ëîãè÷åñêîãî ñèíòåçà. Íå èñïîëüçóéòå ïðèìèòèâû LCELL äëÿ ñîçäàíèÿ çàäåðæêè èëè àñèíõðîííîãî èìïóëüñà. Çàäåðæêà ýòèõ ýëåìåíòîâ èçìåíÿåòñÿ ñ òåìïåðàòóðîé, íàïðÿæåíèåì ïèòàíèÿ è â ïðîöåññå èçãîòîâëåíèÿ èçäåëèÿ, ïîýòîìó ìîãóò âîçíèêíóòü ðåæèìû ñîñòÿçàíèé.
220
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Ñ ïîìîùüþ êîìàíäû êîìïèëÿòîðà Automatic LCELL Insertion ðàçðàáîò÷èê ìîæåò äàòü óêàçàíèå êîìïèëÿòîðó àâòîìàòè÷åñêè âñòàâëÿòü áóôåðû LCELL â ïðîåêò, åñëè ýòî íåîáõîäèìî äëÿ òðàññèðîâêè ïðîåêòà â òîì ñëó÷àå, êîãäà íàçíà÷åíèÿ îïðåäåëåííûõ ïîëüçîâàòåëåì ðåñóðñîâ è èìåþùèåñÿ ó óñòðîéñòâà íå îáåñïå÷èâàþò ïîäãîíêè ìîíòàæà â ïðîåêòå. Ïðèìèòèâ SOFT Ïðîòîòèï ôóíêöèè: FUNCTION SOFT (in) RETURNS (out); Áóôåð SOFT óñòàíàâëèâàåò, ÷òî ëîãè÷åñêàÿ ÿ÷åéêà ìîæåò ïîíàäîáèòüñÿ â ïðîåêòå. Ïðè îáðàáîòêå ïðîåêòà ïðîöåññîðîì ëîãè÷åñêèé ñèíòåçàòîð èññëåäóåò ëîãèêó, ïèòàþùóþ ïðèìèòèâ, è îïðåäåëÿåò, íóæíà ëè ëîãè÷åñêàÿ ÿ÷åéêà. Åñëè íóæíà, áóôåð SOFT ïðåîáðàçóåòñÿ â LCELL, â ïðîòèâíîì ñëó÷àå SOFT óäàëÿåòñÿ. Åñëè êîìïèëÿòîð ïîêàçûâàåò, ÷òî ïðîåêò ñëèøêîì ñëîæíûé, ðàçðàáîò÷èê ìîæåò ðåäàêòèðîâàòü ïðîåêò, âñòàâëÿÿ áóôåðû SOFT äëÿ ïðåäîòâðàùåíèÿ ðàñøèðåíèÿ ëîãèêè. Íàïðèìåð, ðàçðàáîò÷èê ìîæåò äîáàâèòü áóôåð SOFT â êîìáèíàòîðíûé âûõîä ìàêðîôóíêöèè äëÿ ðàçâÿçêè äâóõ êîìáèíàòîðíûõ öåïåé. Ðàçðàáîò÷èê ìîæåò òàêæå âêëþ÷èòü ëîãè÷åñêóþ îïöèþ SOFT Buffer Insertion â ñòèëè ëîãè÷åñêîãî ñèíòåçà ïî óìîë÷àíèþ â ïðîåêò, ÷òîáû êîìïèëÿòîð âñòàâëÿë áóôåðû SOFT àâòîìàòè÷åñêè. Ïðèìèòèâ TRI Ïðîòîòèï ôóíêöèè: FUNCTION TRI (in, oe) RETURNS (out); Ïðèìèòèâ TRI ïðåäñòàâëÿåò ñîáîé òðåõñòàáèëüíûé áóôåð ñ ñèãíàëàìè âõîäíûì, âûõîäíûì è Output Enable (îòïèðàíèå âûõîäà). Åñëè óðîâåíü ñèãíàëà Output Enable ÂÛÑÎÊÈÉ, âûõîä áóäåò óïðàâëÿòüñÿ âõîäîì. Ïðè ÍÈÇKÎÌ óðîâíå ñèãíàëà Output Enable âûõîä ïåðåõîäèò â ñîñòîÿíèå âûñîêîãî èìïåäàíñà, ÷òî ïîçâîëÿåò èñïîëüçîâàòü I/O êàê âõîäíîé âûâîä. Ïî óìîë÷àíèþ ñèãíàë Output Enable óñòàíàâëèâàåòñÿ â çíà÷åíèå VCC. Åñëè ñèãíàë Output Enable áóôåðà TRI ïîäñîåäèíÿåòñÿ ê VCC èëè ëîãè÷åñêîé ôóíêöèè, êîòîðàÿ áóäåò ìèíèìèçèðîâàòü äî èñòèíû, áóôåð TRI ìîæåò áûòü ïðåîáðàçîâàí â áóôåð SOFT âî âðåìÿ ëîãè÷åñêîãî ñèíòåçà. Ïðè èñïîëüçîâàíèè áóôåðà TRI íóæíî ñîáëþäàòü ñëåäóþùèå ïðàâèëà: • Áóôåð TRI ìîæåò óïðàâëÿòü òîëüêî îäíèì âûâîäîì BIDIR èëè BIDIRC. Ðàçðàáîò÷èê äîëæåí èñïîëüçîâàòü âûâîä BIDIR èëè BIDIRC, åñëè ïîñëå áóôåðà TRI ïðèìåíÿåòñÿ îáðàòíàÿ ñâÿçü. Åñëè áóôåð TRI ôîðìèðóåò ñèãíàë íà ëîãèêó, îí äîëæåí òàêæå ôîðìèðîâàòü ñèãíàë äëÿ BIDIR
221
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL èëè BIDIRC. Åñëè îí ôîðìèðóåò ñèãíàë íà âûâîä BIDIR èëè BIDIRC, îí íå ìîæåò ôîðìèðîâàòü ñèãíàë íà êàêèå-ëèáî äðóãèå âûõîäû. • Åñëè ñèãíàë Output Enable íå ïðèâÿçûâàåòñÿ ê VCC, áóôåð TRI äîëæåí ôîðìèðîâàòü ñèãíàë äëÿ âûâîäîâ OUTPUT, OUTPUTC, BIDIR èëè BIDIRC. Âíóòðåííèå ñèãíàëû ìîãóò íå áûòü òðåõñòàáèëüíûìè. Ïðèìèòèâû FLIPFLOP (áèñòàáèëüíûé ìóëüòèâèáðàòîð) & LATCH (òðèããåð-çàùåëêà) DFF SRFF DFFE SRFFE JKFF TFF JKFFE TFFE LATCH Ïðèìèòèâû LATCH îïèñûâàþò D-òðèããåð, óïðàâëÿåìûé óðîâíÿìè òàêòîâûõ ñèãíàëîâ. Kîãäà âõîäíîé ñèãíàë ðàçðåøåíèÿ D-òðèããåðà ENA (Latch Enable) èìååò ÂÛÑÎKÈÉ óðîâåíü, D-òðèããåð ïðîïóñêàåò ñèãíàë îò D ê Q. Åñëè âõîä ENA èìååò ÍÈÇKÈÉ óðîâåíü, ñîõðàíÿåòñÿ ñîñòîÿíèå Q, íåñìîòðÿ íà âõîäíîé ñèãíàë D. Äëÿ óñòðîéñòâ, íå ïîääåðæèâàþùèõ ñèãíàë Latch Enable, ëîãè÷åñêèé ñèíòåç ãåíåðèðóåò ëîãè÷åñêèå óðàâíåíèÿ, ñîäåðæàùèå D-òðèããåðû ñ ñèãíàëàìè Latch Enable. Ýòè ëîãè÷åñêèå óðàâíåíèÿ êîððåêòíî ýìóëèðóþò ëîãèêó, çàäàííóþ â âàøåì ïðîåêòå. Âñå æäóùèå ìóëüòèâèáðàòîðû (Flipflop) ïåðåõîäÿò â ðàáî÷åå ñîñòîÿíèå ïî ïîëîæèòåëüíîìó ïåðåïàäó ñèãíàëà. Ïðèìèòèâ LATCH Ïðîòîòèï ôóíêöèè: FUNCTION LATCH (D, ENA) RETURNS (Q); ENA
Âõîäû D
Âûõîä Q
L
X
Q 0*
H H
L H
L H
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
Ïðèìèòèâ DFF (D-òðèããåð òèïà Flipflop) Ïðîòîòèï ôóíêöèè: FUNCTION DFF (D, CLK, CLRN, PRN) RETURNS (Q);
222
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Âõîäû CLK X X X
D X X X L
Âûõîä Q H L Çàïðåùåííîå ñîñòîÿíèå L
PRN L H L H
CLRN H L L H
H
H
H
H
H
H
L
X
Q0 *
H
H
H
X
Q0
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
Ïðèìèòèâ DFFE Ïðîòîòèï ôóíêöèè: FUNCTION DFFE (D, CLK, CLRN, PRN, ENA) RETURNS (Q); CLRN L H L H
PRN H L L H
Âõîäû ENA X X X L
CLK X X X X
Âûõîä Q L H Çàïðåùåííîå ñîñòîÿíèå Q 0*
H
H
H
H
H
H
L
L
H L
H Q 0*
H
H
X
X
D X X X X
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
Ïðèìèòèâ TFF (Òðèããåð Ò-òèïà, Flipflop) Ïðîòîòèï ôóíêöèè: FUNCTION TFF (T, CLK, CLRN, PRN) RETURNS (Q); Âõîäû CLK X X X
CLRN H L L
H
H
L
Q 0*
H
H
H
Áèñòàáèëüíîå ñîñòîÿíèå
H
H
X
Q 0*
L
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
223
T X X X
Âûõîä Q H L Çàïðåùåííîå ñîñòîÿíèå
PRN L H L
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Ïðèìèòèâ TFFE Ïðîòîòèï ôóíêöèè: FUNCTION TFFE (T, CLK, CLRN, PRN, ENA) RETURNS (Q); CLRN L H L
PRN H L L
Âõîäû ENA X X X
T X X X
CLK X X X
Âûõîä Q L H Çàïðåùåííîå ñîñòîÿíèå Q 0*
H
H
L
X
Õ
H
H
H
L
Q 0*
H
H
H
H
Áèñòàáèëüíîå ñîñòîÿíèå
H
H
X
X
Q 0*
L
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
Ïðèìèòèâ JKFF (Òðèããåð JK-òèïà, Flipflop) Ïðîòîòèï ôóíêöèè: FUNCTION JKFF (J, K, CLK, CLRN, PRN) RETURNS (Q); Âõîäû
Âûõîä
PRN
CLRN
CLK
J
K
Q
L
H
X
X
X
H
H
L
X
X
X
L
L
L
X
X
X
Çàïðåùåííîå ñîñòîÿíèå
H
H
L
X
X
Q 0*
H
H
L
L
Q 0*
H
H
H
L
H
H
H
L
H
L
H
H
H
H
Áèñòàáèëüíîå ñîñòîÿíèå
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
Ïðèìèòèâ JKFFE Ïðîòîòèï ôóíêöèè: FUNCTION JKFFE (J, K, CLK, CLRN, PRN, ENA) RETURNS (Q);
224
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Âõîäû CLRN CLK H X L X L X
ENA X X X
PRN L H L
X
H
H
H
H
H
H
H
H
H
H
H
H
H
H
L
H
H
L
X
J X X X
K X X X
X
X
Âûõîä Q H L Çàïðåùåííîå ñîñòîÿíèå Q 0*
L
L
Q 0*
H
L
H
L
H
L
H
H
Áèñòàáèëüíîå ñîñòîÿíèå
X
X
Q 0*
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
Ïðèìèòèâ SRFF (Òðèããåð SR-òèïà, Flipflop) Ïðîòîòèï ôóíêöèè: FUNCTION SRFF (S, R, CLK, CLRN, PRN) RETURNS (Q); PRN L H L
CLRN H L L
Âõîäû CLK X X X
S X X X
R X X X
Âûõîä Q H L Çàïðåùåííîå ñîñòîÿíèå
H
H
L
X
X
Q 0*
H
H
L
L
Q 0*
H
H
H
L
H
H
H
L
H
L
H
H
H
H
Áèñòàáèëüíîå ñîñòîÿíèå
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
Ïðèìèòèâ SRFFE Ïðîòîòèï ôóíêöèè: FUNCTION SRFFE (S, R, CLK, CLRN, PRN, ENA) RETURNS (Q);
225
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
S X X X X
R X X X X
Âûõîä Q H L Çàïðåùåííîå ñîñòîÿíèå Q 0*
H
L
L
Q 0*
H
H
H
L
H
H
H
L
H
L
H
H
H
H
H
Áèñòàáèëüíîå ñîñòîÿíèå
L
H
H
X
X
Q 0*
ENA X X X X
PRN L H L H
H
H
H H
Âõîäû CLRN CLK H X L X L X H L
X
* Q0 = óðîâåíü Q ïåðåä òàêòîâûì èìïóëüñîì.
3.8.14. Ïîðòû Ïîðò ïðåäñòàâëÿåò ñîáîé âõîä èëè âûõîä ïðèìèòèâà, ìàêðîôóíêöèè èëè öèôðîâîãî àâòîìàòà. Ïîðò ìîæåò ïîÿâëÿòüñÿ â òðåõ ìåñòàõ ôàéëà: • ïîðò, ÿâëÿþùèéñÿ âõîäîì èëè âûõîäîì òåêóùåãî ôàéëà, îáúÿâëÿåòñÿ â ñåêöèè ïîäïðîåêòà Subdesign; • ïîðò, ÿâëÿþùèéñÿ âõîäîì èëè âûõîäîì òåêóùåãî ôàéëà, ìîæåò áûòü íàçíà÷åí (ïðèñâîåí) âûâîäó, ëîãè÷åñêîìó ýëåìåíòó èëè ÷èïó â ñåêöèè ïðîåêòà Design; • ïîðò, ÿâëÿþùèéñÿ âõîäîì èëè âûõîäîì ïðèìåðà (Instance) ïðèìèòèâà èëè ôàéë ïðîåêòà áîëåå íèçêîãî óðîâíÿ, èñïîëüçóåòñÿ â ëîãè÷åñêîé ñåêöèè Logic. 3.8.14.1. Ïîðòû òåêóùåãî ôàéëà Ïîðò, ÿâëÿþùèéñÿ âõîäîì èëè âûõîäîì òåêóùåãî ôàéëà, îáúÿâëÿåòñÿ â ñåêöèè ïîäïðîåêòà Subdesign ñëåäóþùèì îáðàçîì: <èìÿ ïîðòà> : <òèï ïîðòà> [ = <çíà÷åíèå ïîðòà ïî óìîë÷àíèþ> ] Åñòü ñëåäóþùèå òèïû ïîðòîâ: INPUT MACHINE INPUT OUTPUT MACHINE OUTPUT BIDIR Åñëè TDF-ôàéë ÿâëÿåòñÿ ôàéëîì âåðõíåãî óðîâíÿ èåðàðõèè, èìÿ ïîðòà ÿâëÿåòñÿ ñèíîíèìîì èìåíè âûâîäà. Äëÿ ïîðòîâ òèïà INPUT è BIDIR ìî-
226
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL æåò áûòü îïðåäåëåíî ïî óìîë÷àíèþ çíà÷åíèå VCC èëè GND.  ñëó÷àå èñïîëüçîâàíèÿ ïðèìåðà äàííîãî TDF â ôàéëå áîëåå âûñîêîãî óðîâíÿ ýòî çíà÷åíèå èñïîëüçóåòñÿ òîëüêî åñëè ïîðò îñòàåòñÿ íåïîäêëþ÷åííûì. Âõîäíûå è âûõîäíûå ïîðòû, îáúÿâëåííûå â ñåêöèè ïîäïðîåêòà Subdesign, ìîãóò áûòü íàçíà÷åíû âûâîäàì, ëîãè÷åñêèì ýëåìåíòàì, ÷èïàì, êëèêàì è ëîãè÷åñêèì îïöèÿì ïðè íàçíà÷åíèè ðåñóðñîâ Resource Assignment â ñåêöèè ïðîåêòà Design. Íàçíà÷åíèÿ âûâîäîâ ìîãóò áûòü ñäåëàíû òîëüêî íà âåðõíåì óðîâíå èåðàðõèè. Ëþáûå íàçíà÷åíèÿ âûâîäîâ íà áîëåå íèçêèõ èåðàðõè÷åñêèõ óðîâíÿõ èãíîðèðóþòñÿ.  ïðèâîäèìîì íèæå ïðèìåðå â ñåêöèè ïîäïðîåêòà Subdesign îáúÿâëåíû âõîäíûå, âûõîäíûå è äâóíàïðàâëåííûå ïîðòû, à â ñåêöèè ïðîåêòà Design äâà âõîäíûõ ïîðòà íàçíà÷àþòñÿ (ïðèñâàèâàþòñÿ) âûâîäàì. DESIGN IS top BEGIN DEVICE IS AUTO BEGIN foo @ 1, bar @ 2 : INPUT; END; END; SUBDESIGN top ( foo, bar, clk1, clk2 : INPUT = VCC; % VCC это значение порта по умолчанию % a0, a1, a2, a3, a4 : OUTPUT; b[7..0] : BIDIR; ) Ìåæäó ôàéëàìè TDF, (GDF-ôàéë) èëè WDF ìîæíî îñóùåñòâëÿòü èìïîðòèðîâàíèå è ýêñïîðòèðîâàíèå öèôðîâûõ àâòîìàòîâ, åñëè ðàçðàáîò÷èê îïðåäåëèò âõîäíîé èëè âûõîäíîé ïîðò êàê MACHINE INPUT èëè MACHINE OUTPUT â ñåêöèè ïîäïðîåêòà Subdesign.  ïðîòîòèïå ôóíêöèè (Function Prototype), îïèñûâàþùåì ýòîò ôàéë, äîëæíî áûòü óêàçàíî, êàêèå ïîðòû ÿâëÿþòñÿ öèôðîâûìè àâòîìàòàìè ñ ïàìÿòüþ. Ïîðòû MACHINE INPUT è MACHINE OUTPUT ìîæíî èñïîëüçîâàòü òîëüêî â ôàéëàõ áîëåå íèçêèõ óðîâíåé â èåðàðõèè ïðîåêòà.
227
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL 3.8.15.2. Ïîðòû ïðèìåðîâ (INSTANCE) Ñîåäèíåíèå ïîðòà, ÿâëÿþùåãîñÿ âõîäîì èëè âûõîäîì ïðèìåðà (Instance) â ôàéë ïðîåêòà áîëåå íèçêîãî óðîâíÿ èëè ïðèìèòèâà, îñóùåñòâëÿåòñÿ â ëîãè÷åñêîé ñåêöèè Logic. Äëÿ ñîåäèíåíèÿ ïðèìèòèâà, ìàêðîôóíêöèè èëè öèôðîâîãî àâòîìàòà ñ äðóãèìè ÷àñòÿìè ôàéëà TDF íóæíî âñòàâèòü ïðèìåð (Instance) ïðèìèòèâà èëè ìàêðîôóíêöèè êàê ññûëêó ñ êëþ÷åâûì ñëîâîì in-line èëè äàòü â êîíñòðóêöèè îáúÿâëåíèÿ ïðèìåðà Instance, èëè îáúÿâèòü öèôðîâîé àâòîìàò â êîíñòðóêöèè, à çàòåì èñïîëüçîâàòü ïîðòû ôóíêöèè â ëîãè÷åñêîé ñåêöèè. Åñëè ðàçðàáîò÷èê äëÿ âñòàâêè ïðèìåðà ïðèìèòèâà èëè ìàêðîôóíêöèè èñïîëüçóåò ññûëêó ñ êëþ÷åâûì ñëîâîì in-line, âàæåí ïîðÿäîê ïåðå÷èñëåíèÿ ïîðòîâ, íî íå èõ èìåíà. Ýòîò ïîðÿäîê îïðåäåëÿåòñÿ â ïðîòîòèïå ôóíêöèè äëÿ ïðèìèòèâà èëè ìàêðîôóíêöèè. Åñëè äëÿ âñòàâêè ïðèìåðà ðàçðàáîò÷èê èñïîëüçóåò êîíñòðóêöèþ îáúÿâëåíèÿ ïðèìåðà Instance, âàæíû èìåíà ïîðòîâ, à íå ïîðÿäîê èõ ïåðå÷èñëåíèÿ. Èìåíà ïîðòîâ äàþòñÿ â ñëåäóþùåì ôîðìàòå: <èìÿ ïðèìåðà>.<èìÿ ïîðòà> Çäåñü <èìÿ ïðèìåðà> ïðåäñòàâëÿåò ñîáîé îïðåäåëåííîå ïîëüçîâàòåëåì èìÿ ôóíêöèè, à <èìÿ ïîðòà> ñîâïàäàåò ñ èìåíåì ïîðòà, îáúÿâëåííîãî â ëîãè÷åñêîé ñåêöèè ôàéëà TDF áîëåå íèçêîãî óðîâíÿ èëè ñîâïàäàåò ñ èìåíåì âûâîäà â ôàéëå ïðîåêòà äðóãîãî òèïà. Ýòî <èìÿ ïîðòà> ÿâëÿåòñÿ ñèíîíèìîì èìåíè øòûðåâîãî âûâîäà äëÿ ñèìâîëà, êîòîðûé ïðåäñòàâëÿåò ïðèìåð äàííîãî ôàéë ïðîåêòà â ôàéëå (GDF-ôàéë).  ïðèâîäèìîì íèæå ïðèìåðå òðèããåð òèïà D îáúÿâëåí êàê ïåðåìåííàÿ reg â ñåêöèè îáúÿâëåíèÿ ïåðåìåííûõ VARIABLE è çàòåì èñïîëüçóåòñÿ â ëîãè÷åñêîé ñåêöèè. VARIABLE reg : DFF; BEGIN reg.clk = clk reg.d = d out = reg.q END;
228
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Âñå ïîñòàâëÿåìûå ôèðìîé «Altera» ïðèìèòèâû è ìàêðîôóíêöèè èìåþò ïðåäîïðåäåëåííûå èìåíà ïîðòîâ (øòûðåâûå âûâîäû), êîòîðûå îïèñûâàþòñÿ â ïðîòîòèïå ôóíêöèè. Íàèáîëåå øèðîêî èñïîëüçóåìûå èìåíà ïîðòîâ ïðèâåäåíû â Òàáë. 3.8. Òàáëèöà 3.8. Èìåíà ïîðòîâ Èìÿ ïîðòà .q .d .t .j .k .s .r .clk
Îïèñàíèå
Âûõîä áèñòàáèëüíîãî ìóëüòèâèáðàòîðà (Flipflop) èëè òðèããåðà-çàùåëêè (Latch) Èíôîðìàöèîííûé âõîä â òðèããåð D-òèïà (Flipflop) èëè òðèããåð-çàùåëêó (Latch) Âõîä ïåðåêëþ÷åíèÿ (Toggle) òðèããåðà T-òèïà (Flipflop) Âõîä J òðèããåðà J-K-òèïà (Flipflop) Âõîä K òðèããåðà J-K-òèïà (Flipflop) Âõîä S òðèããåðà S-R-òèïà (Flipflop) Âõîä R òðèããåðà S-R-òèïà (Flipflop) Âõîä òàêòîâîãî ñèãíàëà (Clock) òðèããåðà (Flipflop) Âõîä îòïèðàíèÿ òàêòîâîãî ñèãíàëà (Clock Enable) äëÿ òðèããåðà, îòïèðàíèÿ çàùåëêè .ena (Latch Enable) è îòïèðàíèÿ öèôðîâîãî àâòîìàòà (Enable) .prn Âõîä óñòàíîâêè òðèããåðà (Flipflop) Preset ñ íèçêèì àêòèâíûì óðîâíåì .clrn Âõîä ñáðîñà òðèããåðà (Flipflop) Clear ñ íèçêèì àêòèâíûì óðîâíåì .reset Âõîä öèôðîâîãî àâòîìàòà Reset ñ âûñîêèì àêòèâíûì óðîâíåì .oe Âõîä Output Enable (îòïèðàíèå âûõîäà) ïðèìèòèâà TRI .in Îñíîâíîé âõîä ïðèìèòèâîâ TRI, SOFT, GLOBAL è LCELL .out Âûõîä ïðèìèòèâîâ TRI, SOFT, GLOBAL è LCELL
3.9. Ñèíòàêñèñ ÿçûêà AHDL 3.9.1. Ëåêñè÷åñêèå ýëåìåíòû Ñèíòàêñèñ ëåêñè÷åñêèõ ýëåìåíòîâ ÿçûêà AHDL îïèñàí íèæå ñ èñïîëüçîâàíèåì ôîðìóë ÁýêóñàÍàóðà. <îñíîâàíèå ñèñòåìû ñ÷èñëåíèÿ> ::= B | Q | H | O | X | b | q | h | o | x <÷èñëî ñ îñíîâàíèåì> ::= < îñíîâàíèå ñèñòåìû ñ÷èñëåíèÿ > " <öèôðà> { <öèôðà> }" <öèôðà> ::= <áóêâà> | <äåñÿòè÷íàÿ öèôðà> <ñòîëáåö> ::= <äåñÿòè÷íàÿ öèôðà >:1:2 <ñèìâîë êîììåíòàðèÿ> ::= <ëþáîé ñèìâîë, êðîìå %> | %% <êîììåíòàðèé> ::= % { < ñèìâîë êîììåíòàðèÿ > } %
229
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL | { < ñèìâîë êîììåíòàðèÿ > } <êîíåö ñòðîêè> <äåñÿòè÷íîå ÷èñëî> ::= <äåñÿòè÷íàÿ öèôðà>:1:10 <èìÿ ïðîåêòà> ::= <èìÿ ôàéëà> <âûâîä óñòðîéñòâà> ::= <ñèìâîë èìåíè>:1:3 <äåñÿòè÷íàÿ öèôðà> ::= 0 | 1 |... | 9 <èìÿ ôàéëà> ::= (<ñèìâîë èìåíè>):1:8 | ' (<ñèìâîë èìåíè â êàâû÷êàõ>):1:8 ' <ëàáèðèíò> ::= <ñòðîêà ìàòðèöû> <ñòîëáåö> <áóêâà> ::= A |... | Z | a |... | z <ëîãè÷åñêèé ýëåìåíò> ::= LC <äåñÿòè÷íàÿ öèôðà>:1:3 | LC <äåñÿòè÷íàÿ öèôðà>:1:2 <ëàáèðèíò> | MC <äåñÿòè÷íàÿ öèôðà>:1:3 | MC <äåñÿòè÷íàÿ öèôðà>:1:2 <ëàáèðèíò> <ñèìâîë èìåíè> ::= <áóêâà> | <äåñÿòè÷íàÿ öèôðà> | _ <÷èñëî> ::= <äåñÿòè÷íîå ÷èñëî> | <÷èñëî ñ îñíîâàíèåì> <èìÿ ïîðòà> ::= (<ñèìâîë èìåíè> | /):1:32 | ' (<ñèìâîë èìåíè â êàâû÷êàõ> | /):1:32 ' < ñèìâîë èìåíè â êàâû÷êàõ >::= <ñèìâîë èìåíè> | <ñòðîêà ìàòðèöû> ::= <áóêâà> <ñèìâîë ñòðîêè> ::= <ëþáîé ñèìâîë, êðîìå " è ñèìâîëà ïåðåõîäà íà íîâóþ ñòðîêó> | "" <ñòðîêà> ::= " { <ñèìâîë ñòðîêè> }" <ñèìâîëè÷åñêîå èìÿ> ::= (<èìÿ ñèìâîëà> | /):1:32 | ' (<ñèìâîë èìåíè â êàâû÷êàõ> | /):1:32 ' Ñèìâîëè÷åñêîå èìÿ áåç êàâû÷åê íå ìîæåò ñîñòîÿòü èç îäíèõ öèôð.
3.9.2. Îñíîâíûå êîíñòðóêöèè ÿçûêà AHDL Ñ ïîìîùüþ ôîðìóë ÁýêóñàÍàóðà ñèíòàêñèñ ôàéëà TDF ìîæíî îïèñàòü ñëåäóþùèì îáðàçîì: <ôàéë AHDL > ::= <îïåðàòîð AHDL > { < îïåðàòîð AHDL > } < îïåðàòîð AHDL > ::=
230
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL <íàçâàíèå> | <çàäàíèå êîíñòàíòû> | <ïðîòîòèï> | <îïåðàòîð âêëþ÷åíèÿ > | < âàðèàíòû> | < ñåêöèÿ ïðîåêòà > | <ñåêöèÿ ïîäïðîåêòà> <îïåðàòîðû> ::= <îïåðàòîð> { <îïåðàòîð> } <îïåðàòîð> ::= <áóëåâî óðàâíåíèå> | <îïåðàòîð âûáîðà> | <óñëîâíûé îïåðàòîð> | <îïåðàòîð òàáëèöû> | <ïðèñâîåíèå ïî óìîë÷àíèþ> <íàçâàíèå> ::= TITLE <ñòðîêà>; <çàäàíèå êîíñòàíòû> ::= CONSTANT <ñèìâîëè÷åñêîå èìÿ> = <÷èñëî>; <ïðîòîòèï> ::= FUNCTION <ìàêðîôóíêöèÿ> ( <ñïèñîê âõîäîâ> ) RETURNS ( <ñïèñîê âûõîäîâ> ); | FUNCTION <ïðèìèòèâ> ( <ñïèñîê âõîäîâ> ) RETURNS ( <ñïèñîê âûõîäîâ> ); <ìàêðîôóíêöèÿ> ::= <èìÿ ïðîåêòà> <ïðèìèòèâ> ::= <ñèìâîëè÷åñêîå èìÿ> <ñïèñîê âõîäîâ> ::=
231
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL <ãðóïïà ïðîòîòèïà> {, <ãðóïïà ïðîòîòèïà> } <ñïèñîê âûõîäîâ> ::= <ãðóïïà ïðîòîòèïà> {, <ãðóïïà ïðîòîòèïà> } <îïåðàòîð âêëþ÷åíèÿ> ::= INCLUDE <ñòðîêà> ; <âàðèàíò> ::= <âàðèàíò óñòðîéñòâà> | <âàðèàíò 0-ãî áèòà AHDL > | <ëîãè÷åñêàÿ îïöèÿ> <âàðèàíò óñòðîéñòâà> ::= | SECURITY = (ON | OFF) | TURBO = (ON | OFF | DEFAULT) <âàðèàíò 0-ãî áèòà AHDL > ::= BIT0 = (ANY-ïðîèçâîëüíûé | LSB-ìëàäøèé | MSB-ñòàðøèé) <ëîãè÷åñêàÿ îïöèÿ> ::= CARRY_CHAIN = (AUTO | IGNORE | MANUAL | DEFAULT) | CASCADE_CHAIN = (AUTO | IGNORE | MANUAL | DEFAULT) | DECOMPOSE_GATES = (ON | OFF | DEFAULT) | DUPLICATE_LOGIC_EXTRACTION = (ON | OFF | DEFAULT) | EXPANDER_FACTORING = (ON | OFF | DEFAULT) | MINIMIZATION = (FULL | PARTIAL | NONE | DEFAULT) | MULTI-LEVEL_FACTORING = (ON | OFF | DEFAULT) | NOT_GATE_PUSH-BACK = (ON | OFF | DEFAULT) | OPTIMIZE = (AREA | DELAY | ROUTING | DEFAULT) | PARALLEL_EXPANDERS = (ON | OFF | DEFAULT) | PERIPHERAL_REGISTER = (ON | OFF | DEFAULT) | REDUCE_LOGIC = (ON | OFF | DEFAULT) | REFACTORIZATION = (ON | OFF | DEFAULT) | REGISTER_OPTIMIZATION = (ON | OFF | DEFAULT) | RESYNTHESIZE_NETWORK = (ON | OFF | DEFAULT) | SLOW_SLEW_RATE = (ON | OFF | DEFAULT) | SOFT_BUFFER_INSERTION = (ON | OFF | DEFAULT)
232
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL | STYLE = <èìÿ ñòèëÿ> | SUBFACTOR_EXTRACTION = (ON | OFF | DEFAULT) | TURBO = (ON | OFF | DEFAULT) | XOR_SYNTHESIS = (ON | OFF | DEFAULT) <èìÿ ñòèëÿ> ::= FAST | WYSIWYG | NORMAL | <ñòèëü ïîëüçîâàòåëÿ> <ñòèëü ïîëüçîâàòåëÿ> ::= <ñèìâîëè÷åñêîå èìÿ> Kàæäûé <âàðèàíò> çà èñêëþ÷åíèåì BIT0 è èìåíè ñòèëÿ ìîæåò áûòü ñîêðàùåí äî 3 ïåðâûõ ñèìâîëîâ ïî îáå ñòîðîíû îò çíàêà ðàâåíñòâà (=). Îäíàêî ôèðìà «Altera» ðåêîìåíäóåò ïèñàòü ïîëíûå èìåíà äëÿ óäîáñòâà äîêóìåíòèðîâàíèÿ.
3.9.3. Ñèíòàêñèñ îáúÿâëåíèÿ íàçâàíèÿ <íàçâàíèå> ::= TITLE <ñòðîêà>;
3.9.4. Ñèíòàêñèñ îïåðàòîðà âêëþ÷åíèÿ <îïåðàòîð âêëþ÷åíèÿ> ::= INCLUDE <èìÿ ôàéëà> ; Îïèñûâàåìûé â îïåðàòîðå âêëþ÷åíèÿ ôàéë äîëæåí èìåòü ðàñøèðåíèå .inc, à <èìÿ ôàéëà> íå äîëæíî ñîäåðæàòü ïóòü.
3.9.5. Ñèíòàêñèñ çàäàíèÿ êîíñòàíòû <çàäàíèå êîíñòàíòû> ::= CONSTANT <ñèìâîëüíîå èìÿ> = <÷èñëî>;
3.9.6. Ñèíòàêñèñ ïðîòîòèïà ôóíêöèè <ïðîòîòèï> ::= FUNCTION <ìàêðîôóíêöèÿ> ( <ñïèñîê âõîäîâ> )
233
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL RETURNS ( <ñïèñîê âûõîäîâ> ); | FUNCTION <ïðèìèòèâ> ( <ñïèñîê âõîäîâ> ) RETURNS ( <ñïèñîê âûõîäîâ> ); <ìàêðîôóíêöèÿ> ::= <èìÿ ïðîåêòà> <ïðèìèòèâ> ::= <ñèìâîëüíîå èìÿ> <ñïèñîê âõîäîâ> ::= <ãðóïïà ïðîòîòèïà> {, <ãðóïïà ïðîòîòèïà> } <ñïèñîê âûõîäîâ> ::= <ãðóïïà ïðîòîòèïà> {, <ãðóïïà ïðîòîòèïà> }
3.9.7. Ñèíòàêñèñ îïåðàòîðà âàðèàíòîâ <âàðèàíòû> ::= OPTIONS <âàðèàíò> {, <âàðèàíò> }; <âàðèàíò> ::= <âàðèàíò óñòðîéñòâà> | <âàðèàíò 0-ãî áèòà AHDL> | <ëîãè÷åñêàÿ îïöèÿ> <âàðèàíò óñòðîéñòâà> ::= | SECURITY = (ON-âêë | OFF-îòêë) | TURBO = (ON-âêë | OFF-îòêë | DEFAULT-ïî óìîë÷àíèþ) <âàðèàíò 0-ãî áèòà AHDL> ::= BIT0 = (ANY-ïðîèçâîëüíûé | LSB-ìëàäøèé | MSB-ñòàðøèé) <ëîãè÷åñêàÿ îïöèÿ> ::= CARRY_CHAIN = (AUTO-àâòî | IGNORE-èãíîðèðîâàòü | MANUALðó÷íîé | DEFAULT-ïî óìîë÷àíèþ) | CASCADE_CHAIN = (AUTO | IGNORE | MANUAL | DEFAULT) | DECOMPOSE_GATES = (ON-âêë | OFF-îòêë | DEFAULT-ïî óìîë÷àíèþ)
234
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL | DUPLICATE_LOGIC_EXTRACTION = (ON | OFF | DEFAULT) | EXPANDER_FACTORING = (ON | OFF | DEFAULT) | MINIMIZATION = (FULL-ïîëíàÿ | PARTIAL-÷àñòè÷íàÿ | NONE-íåò | DEFAULT-ïî óìîë÷àíèþ) | MULTI-LEVEL_FACTORING = (ON | OFF | DEFAULT) | NOT_GATE_PUSH-BACK = (ON | OFF | DEFAULT) | OPTIMIZE = (AREA-ïëîùàäü | DELAY-çàäåðæêà | ROUTING-ìàðøðóòèçàöèÿ | DEFAULT-ïî óìîë÷àíèþ) | PARALLEL_EXPANDERS = (ON | OFF | DEFAULT) | PERIPHERAL_REGISTER = (ON | OFF | DEFAULT) | REDUCE_LOGIC = (ON | OFF | DEFAULT) | REFACTORIZATION = (ON | OFF | DEFAULT) | REGISTER_OPTIMIZATION = (ON | OFF | DEFAULT) | RESYNTHESIZE_NETWORK = (ON | OFF | DEFAULT) | SLOW_SLEW_RATE = (ON | OFF | DEFAULT) | SOFT_BUFFER_INSERTION = (ON | OFF | DEFAULT) | STYLE = <èìÿ ñòèëÿ> | SUBFACTOR_EXTRACTION = (ON | OFF | DEFAULT) | TURBO = (ON | OFF | DEFAULT) | XOR_SYNTHESIS = (ON | OFF | DEFAULT) <èìÿ ñòèëÿ> ::= FAST | WYSIWYG | NORMAL | <ñòèëü ïîëüçîâàòåëÿ> <ñòèëü ïîëüçîâàòåëÿ> ::= <ñèìâîëüíîå èìÿ> 1. Kàæäûé <âàðèàíò>, êðîìå BIT0 è èìåíè ñòèëÿ, ìîæåò áûòü ñîêðàùåí äî òðåõ ñèìâîëîâ ïî îáåèì ñòîðîíàì çíàêà ðàâåíñòâà (=). Îäíàêî ôèðìà «Altera» ðåêîìåíäóåò èñïîëüçîâàòü ïîëíîå èìÿ äëÿ óäîáñòâà äîêóìåíòàöèè. 2. Òèïû âàðèàíòîâ, êîòîðûå ìîãóò áûòü âêëþ÷åíû â îïåðàòîð OPTIONS, îïðåäåëÿþòñÿ ìåñòîïîëîæåíèåì ýòîãî îïåðàòîðà è ïðàâèëàìè ïîñòðîåíèÿ ñîäåðæèìîãî ôàéëà.
235
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.9.8. Ñèíòàêñèñ ñåêöèè ïîäïðîåêòà Subdesign <ñåêöèÿ ïîäïðîåêòà> ::= SUBDESIGN <èìÿ ïðîåêòà> ( { <ñïèñîê ñèãíàëîâ> ; } <ñïèñîê ñèãíàëîâ> [ ; ] ) [ <ïåðåìåííûå> ] BEGIN <îïåðàòîðû> END; <ñïèñîê ñèãíàëîâ> ::= <ñïèñîê ïîðòîâ> : <òèï ïîðòà> <òèï ïîðòà> ::= INPUT [ = VCC | = GND ] | OUTPUT | BIDIR [ = VCC | = GND ] | MACHINE INPUT | MACHINE OUTPUT Këþ÷åâûå ñëîâà BEGIN è END îáðàìëÿþò ëîãè÷åñêóþ ñåêöèþ, êîòîðàÿ ÿâëÿåòñÿ òåëîì ñåêöèè ïîäïðîåêòà.
3.9.9. Ñèíòàêñèñ ñåêöèè ïåðåìåííûõ <ïåðåìåííûå> ::= VARIABLE <ñïèñîê ïîðòîâ> : <òèï ïåðåìåííîé> ; { <ñïèñîê ïîðòîâ> : <òèï ïåðåìåííîé> ; } <òèï ïåðåìåííîé> ::= NODE | <ìàêðîôóíêöèÿ> | <ïðèìèòèâ>
236
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL | <öèôðîâîé àâòîìàò (state machine)> | <ïñåâäîíèì öèôðîâîãî àâòîìàòà> <ìàêðîôóíêöèÿ> ::= <èìÿ ïðîåêòà> <ïðèìèòèâ> ::= <ñèìâîëüíîå èìÿ>
3.9.10. Ñèíòàêñèñ îáúÿâëåíèÿ öèôðîâîãî àâòîìàòà <ñèìâîëüíîå èìÿ> : <öèôðîâîé àâòîìàò (state machine)>; <öèôðîâîé àâòîìàò (state machine)> ::= MACHINE [ <áèòû> ] <ñîñòîÿíèÿ> <áèòû> ::= OF BITS ( <ñïèñîê ïîðòîâ> ) <ñîñòîÿíèÿ> ::= WITH STATES ( <ñîñòîÿíèå> {, <ñîñòîÿíèå> } ) <ñîñòîÿíèå> ::= <ñèìâîëüíîå èìÿ> [ = <çíà÷åíèå ñîñòîÿíèÿ> ] <çíà÷åíèå ñîñòîÿíèÿ> ::= <÷èñëî> | <ñèìâîëüíîå èìÿ>
3.9.11. Ñèíòàêñèñ îáúÿâëåíèÿ ïñåâäîíèìà öèôðîâîãî àâòîìàòà <ñèìâîëüíîå èìÿ> : MACHINE; Îáúÿâëåíèå ïñåâäîíèìà öèôðîâîãî àâòîìàòà íå çàäàåò áèòû èëè èìåíà ñîñòîÿíèé. Ýòà èíôîðìàöèÿ èìïîðòèðóåòñÿ èç ñåêöèè ïîäïðîåêòà ÷åðåç ïîðò MACHINE INPUT ôàéëà áîëåå âûñîêîãî óðîâíÿ â èåðàðõèè ïðîåêòà èëè æå ÷åðåç ïðîòîòèï ôóíêöèè èç ôàéëà áîëåå íèçêîãî óðîâíÿ â èåðàðõèè ïðîåêòà.
237
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.9.12. Ñèíòàêñèñ ëîãè÷åñêîé ñåêöèè Ëîãè÷åñêàÿ ñåêöèÿ, çàêëþ÷åííàÿ ìåæäó êëþ÷åâûìè ñëîâàìè BEGIN è END, ïðåäñòàâëÿåò ñîáîé òåëî ñåêöèè ïîäïðîåêòà. Èíôîðìàöèÿ î ñèíòàêñèñå ïðèâîäèòñÿ îòäåëüíî äëÿ êàæäîãî âàðèàíòà ëîãè÷åñêîé ñåêöèè.
3.9.13. Ñèíòàêñèñ áóëåâûõ óðàâíåíèé <áóëåâî óðàâíåíèå> ::= <ëåâàÿ ÷àñòü> = <ïðàâàÿ ÷àñòü>;
3.9.14. Ñèíòàêñèñ áóëåâûõ óðàâíåíèé óïðàâëåíèÿ <ñèìâîëüíîå èìÿ>.clk = <ïðàâàÿ ÷àñòü>; [<ñèìâîëüíîå èìÿ>.reset = <ïðàâàÿ ÷àñòü>;] [<ñèìâîëüíîå èìÿ>.ena = <ïðàâàÿ ÷àñòü>;] Ýëåìåíò <ñèìâîëüíîå èìÿ> â áóëåâîì óðàâíåíèè óïðàâëåíèÿ äîëæåí áûòü îáúÿâëåí òàê æå, êàê â îáúÿâëåíèè öèôðîâîãî àâòîìàòà â ñåêöèè ïåðåìåííûõ.
3.9.15. Ñèíòàêñèñ îïåðàòîðà CASE <îïåðàòîð âûáîðà> ::= CASE <ïðàâàÿ ÷àñòü> IS WHEN <âûáîð> => <îïåðàòîðû> { WHEN <âûáîð> => <îïåðàòîðû> } [ WHEN OTHERS => <îïåðàòîðû> ] END CASE; <âûáîð> ::= <ãðóïïà êîíñòàíò> {, <ãðóïïà êîíñòàíò> }
3.9.16. Îáúÿâëåíèå ïî óìîë÷àíèþ <îáúÿâëåíèå ïî óìîë÷àíèþ> ::= DEFAULTS <çàäàíèå çíà÷åíèÿ> ; { <çàäàíèå çíà÷åíèÿ> ; } END DEFAULTS; <çàäàíèå çíà÷åíèÿ> ::= <ëåâàÿ ÷àñòü> = <ãðóïïà êîíñòàíò>
238
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL
3.9.17. Ñèíòàêñèñ óñëîâíîãî îïåðàòîðà IF <óñëîâíûé îïåðàòîð> ::= IF <ïðàâàÿ ÷àñòü> THEN <îïåðàòîðû> { ELSIF <ïðàâàÿ ÷àñòü> THEN <îïåðàòîðû> } [ ELSE <ïðàâàÿ ÷àñòü> THEN <îïåðàòîðû> ] END IF;
3.9.18. Ñèíòàêñèñ âñòðîåííûõ (in-line) ññûëîê íà ìàêðîôóíêöèþ èëè ïðèìèòèâ <ìàêðîôóíêöèÿ> ( <ñïèñîê ïðàâûõ ÷àñòåé> ) <ïðèìèòèâ> ( <ñïèñîê ïðàâûõ ÷àñòåé> )
3.9.19. Ñèíòàêñèñ îáúÿâëåíèÿ òàáëèöû èñòèííîñòè <îïåðàòîð òàáëèöû> ::= TABLE <âõîäû> => <âûõîäû> ; <âõîäíûå çíà÷åíèÿ> => <âûõîäíûå çíà÷åíèÿ> ; { <âõîäíûå çíà÷åíèÿ> => <âûõîäíûå çíà÷åíèÿ> ; } END TABLE; <âõîäû> ::= <ïðàâàÿ ÷àñòü> {, <ïðàâàÿ ÷àñòü> } <âûõîäû> ::= <ëåâàÿ ÷àñòü> {, <ëåâàÿ ÷àñòü> } <âõîäíûå çíà÷åíèÿ> ::= <ãðóïïà êîíñòàíò> {, <ãðóïïà êîíñòàíò> } <âûõîäíûå çíà÷åíèÿ> ::= <ãðóïïà êîíñòàíò> {, <ãðóïïà êîíñòàíò> }
3.9.20. Ñèíòàêñèñ ïîðòà Ïîðò, ÿâëÿþùèéñÿ â òåêóùåì ôàéëå âõîäîì èëè âûõîäîì, îáúÿâëÿåòñÿ â ñåêöèè ïîäïðîåêòà â ñëåäóþùåì ôîðìàòå: <èìÿ ïîðòà> : <òèï ïîðòà> [ = <çíà÷åíèå ïîðòà ïî óìîë÷àíèþ> ]
239
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Èìåþòñÿ ñëåäóþùèå òèïû ïîðòîâ: INPUT OUTPUT
MACHINE INPUT MACHINE OUTPUT BIDIR
Ïîðòû, ÿâëÿþùèåñÿ âõîäàìè è âûõîäàìè ïðèìåðà (Instance) ïðèìèòèâà èëè ìàêðîôóíêöèè, èñïîëüçóþòñÿ â ñëåäóþùåì ôîðìàòå: <èìÿ ïðèìåðà>.<èìÿ ïîðòà> <èìÿ ïðèìåðà> ::= <ñèìâîëüíîå èìÿ>
3.9.21. Ñèíòàêñèñ ãðóïïû Ãðóïïû ìîãóò áûòü çàïèñàíû â ñëåäóþùèõ äâóõ íîòàöèÿõ: 1. Íîòàöèÿ <äåñÿòè÷íîå èìÿ ãðóïïû> ñîñòîèò èç ñèìâîëüíîãî èìåíè, çà êîòîðûì ñëåäóåò äèàïàçîí äåñÿòè÷íûõ ÷èñåë, çàêëþ÷åííûé â êâàäðàòíûå ñêîáêè, íàïðèìåð a[4..1]. Äîïóñêàåòñÿ óêàçàíèå òîëüêî îäíîãî äèàïàçîíà ïîñëå ñèìâîëüíîãî èìåíè. <äåñÿòè÷íîå èìÿ ãðóïïû> ::= <ñèìâîëüíîå èìÿ> [ <äèàïàçîí> ] <äèàïàçîí> ::= <äåñÿòè÷íîå ÷èñëî> | <äåñÿòè÷íîå ÷èñëî>..<äåñÿòè÷íîå ÷èñëî> Åñëè ãðóïïà óæå îïðåäåëåíà, ìîæíî äëÿ êðàòêîñòè âìåñòî äèàïàçîíà óêàçûâàòü òîëüêî ïóñòûå ñêîáêè [ ]. Âìåñòî äèàïàçîíà ìîæíî òàêæå èñïîëüçîâàòü îäíî òîëüêî ÷èñëî, íàïðèìåð a[5]. Îäíàêî â òàêîé íîòàöèè îáîçíà÷àåòñÿ òîëüêî îäíî ñèìâîëüíîå èìÿ, à íå èìÿ ãðóïïû, è ýòî ýêâèâàëåíòíî çàïèñè a5. 2. Íîòàöèÿ <ïîñëåäîâàòåëüíîå èìÿ ãðóïïû> ñîñòîèò èç ñïèñêà ñèìâîëüíûõ èìåí, ïîðòîâ èëè ÷èñåë, ðàçäåëåííûõ çàïÿòîé è çàêëþ÷åííûõ â êðóãëûå ñêîáêè, íàïðèìåð (a, b, c). Äåñÿòè÷íûå èìåíà ãðóïïû òàêæå ìîæíî ïåðå÷èñëÿòü â êðóãëûõ ñêîáêàõ. <ïîñëåäîâàòåëüíîå èìÿ ãðóïïû> ::= ( <ñïèñîê ïðàâûõ ÷àñòåé> ) <ñïèñîê ïðàâûõ ÷àñòåé> ::= [ <ïðàâàÿ ÷àñòü> ] {, [ <ïðàâàÿ ÷àñòü> ] }
240
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL Äàííàÿ íîòàöèÿ ïîëåçíà äëÿ çàäàíèÿ ïîðòîâ ïðèìåðà (Instance) ôóíêöèè, êîòîðûé îáúÿâëÿåòñÿ â îáúÿâëåíèè ïðèìåðà.
3.9.22. Ñèíòàêñè÷åñêèå ãðóïïû è ñïèñêè <ãðóïïà êîíñòàíò> ::= <ñèìâîëüíîå èìÿ> | <÷èñëî> | VCC | GND | ( <ñïèñîê ãðóïïû êîíñòàíò> ) <ñïèñîê ãðóïïû êîíñòàíò> ::= [ <ãðóïïà êîíñòàíò> ] {, [ <ãðóïïà êîíñòàíò> ] } <ãðóïïà òî÷åê> ::= <èìÿ ïîðòà> | <ñèìâîëüíîå èìÿ> [ ] | <ñèìâîëüíîå èìÿ> [ <äèàïàçîí> ] | ( <ñïèñîê ãðóïïû òî÷åê> ) <ñïèñîê ãðóïïû òî÷åê> ::= [ <ãðóïïà òî÷åê> ] {, [ <ãðóïïà òî÷åê> ] } <ëåâàÿ ÷àñòü> ::= < ëåâàÿ ÷àñòü >. <ãðóïïà òî÷åê> | <ñèìâîëüíîå èìÿ> | <ñèìâîëüíîå èìÿ> [ ] | <ñèìâîëüíîå èìÿ> [ <äèàïàçîí> ] | ! < ëåâàÿ ÷àñòü > | ( <ñïèñîê ëåâûõ ÷àñòåé> ) <ñïèñîê ëåâûõ ÷àñòåé> ::= [ < ëåâàÿ ÷àñòü > ] {, [ < ëåâàÿ ÷àñòü > ] } <ãðóïïà ïîðòîâ> ::= <èìÿ ïîðòà> | <ñèìâîëüíîå èìÿ> [ <äèàïàçîí> ] | ( <ñïèñîê ïîðòîâ> ) <ñïèñîê ïîðòîâ> ::= <ãðóïïà ïîðòîâ> {, <ãðóïïà ïîðòîâ> }
241
ßçûê îïèñàíèÿ àïïàðàòóðû AHDL <ãðóïïà ïðîòîòèïà> ::= <ãðóïïà ïîðòîâ> | MACHINE <ñèìâîëüíîå èìÿ> <äèàïàçîí> ::= <äåñÿòè÷íîå ÷èñëî> [.. <äåñÿòè÷íîå ÷èñëî> ] <ïðàâàÿ ÷àñòü> ::= <ïðàâàÿ ÷àñòü>. <ãðóïïà òî÷åê> | ! <ïðàâàÿ ÷àñòü> | <÷èñëî> | <ñèìâîëüíîå èìÿ> | <ñèìâîëüíîå èìÿ> [ ] | <ñèìâîëüíîå èìÿ> [ <äèàïàçîí> ] | VCC | GND | <ïðàâàÿ ÷àñòü> == <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> >= <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> > <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> <= <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> < <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> != <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> # <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> !# <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> & <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> !& <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> $ <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> !$ <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> + <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> <ïðàâàÿ ÷àñòü> | <ïðàâàÿ ÷àñòü> | + <ïðàâàÿ ÷àñòü> | <ìàêðîôóíêöèÿ> ( <ñïèñîê ïðàâûõ ÷àñòåé> ) | <ïðèìèòèâ> ( <ñïèñîê ïðàâûõ ÷àñòåé> ) | ( <ñïèñîê ïðàâûõ ÷àñòåé> ) <ñïèñîê ïðàâûõ ÷àñòåé> ::= [ <ïðàâàÿ ÷àñòü> ] {, [ <ïðàâàÿ ÷àñòü> ] }
242
Ãëàâà 4.
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.1. Îáùèå ñâåäåíèÿ ßçûêè îïèñàíèÿ àïïàðàòóðû (Hardware Description Language) ÿâëÿþòñÿ ôîðìàëüíîé çàïèñüþ, êîòîðàÿ ìîæåò áûòü èñïîëüçîâàíà íà âñåõ ýòàïàõ ðàçðàáîòêè öèôðîâûõ ýëåêòðîííûõ ñèñòåì. Ýòî âîçìîæíî âñëåäñòâèå òîãî, ÷òî ÿçûê ëåãêî âîñïðèíèìàåòñÿ êàê ìàøèíîé, òàê è ÷åëîâåêîì, îí ìîæåò èñïîëüçîâàòüñÿ íà ýòàïàõ ïðîåêòèðîâàíèÿ, âåðèôèêàöèè, ñèíòåçà è òåñòèðîâàíèÿ àïïàðàòóðû òàê æå, êàê è äëÿ ïåðåäà÷è äàííûõ î ïðîåêòå, ìîäèôèêàöèè è ñîïðîâîæäåíèè. Íàèáîëåå óíèâåðñàëüíûì è ðàñïðîñòðàíåííûì ÿçûêîì îïèñàíèÿ àïïàðàòóðû ÿâëÿåòñÿ VHDL. Íà ýòîì ÿçûêå âîçìîæíî êàê ïîâåäåí÷åñêîå, òàê ñòðóêòóðíîå è ïîòîêîâîå îïèñàíèå öèôðîâûõ ñõåì. ßçûê VHDL èñïîëüçóåòñÿ âî ìíîãèõ ñèñòåìàõ äëÿ ìîäåëèðîâàíèÿ öèôðîâûõ ñõåì, ïðîåêòèðîâàíèÿ ïðîãðàììèðóåìûõ ëîãè÷åñêèõ èíòåãðàëüíûõ ìèêðîñõåì, áàçîâûõ ìàòðè÷íûõ êðèñòàëëîâ, çàêàçíûõ èíòåãðàëüíûõ ìèêðîñõåì. Ñ òî÷êè çðåíèÿ ïðîãðàììèñòà, ÿçûê VHDL ñîñòîèò êàê áû èç äâóõ êîìïîíåíò îáùåàëãîðèòìè÷åñêîé è ïðîáëåìíî-îðèåíòèðîâàííîé. Îáùåàëãîðèòìè÷åñêàÿ êîìïîíåíòà VHDL ýòî ÿçûê, áëèçêèé ïî ñèíòàêñèñó è ñåìàíòèêå ê ñîâðåìåííûì ÿçûêàì ïðîãðàììèðîâàíèÿ òèïà «Ïàñêàëü», «C» è äð. ßçûê îòíîñèòñÿ ê êëàññó ñòðîãî òèïèçèðîâàííûõ. Ïîìèìî âñòðîåííûõ (ïàêåò STANDART), ïðîñòûõ (ñêàëÿðíûõ) òèïîâ äàííûõ: öåëûé, âåùåñòâåííûé, áóëåâñêèé, áèòîâûé, äàííûõ òèïà âðåìÿ, äàííûõ òèïà ññûëêà (óêàçàòåëü), ïîëüçîâàòåëü ìîæåò ââîäèòü ñâîè òèïû äàííûõ (ïåðå÷èñëèìûé, äèàïàçîííûé è äð.). Ïîìèìî ñêàëÿðíûõ äàííûõ, ìîæíî èñïîëüçîâàòü àãðåãàòû: ìàññèâû ARRAY, â òîì ÷èñëå è áèòîâûå âåêòîðû BIT_VECTOR, è ñèìâîëüíûå ñòðîêè STRING, çàïèñè RECORD, ôàéëû FILE.
243
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîñëåäîâàòåëüíî âûïîëíÿåìûå (ïîñëåäîâàòåëüíûå) îïåðàòîðû VHDL ìîãóò èñïîëüçîâàòüñÿ â îïèñàíèè ïðîöåññîâ, ïðîöåäóð è ôóíêöèé. Èõ ñîñòàâ âêëþ÷àåò: • îïåðàòîð ïðèñâàèâàíèÿ ïåðåìåííîé (:=); • ïîñëåäîâàòåëüíûé îïåðàòîð íàçíà÷åíèÿ ñèãíàëó (<=); • ïîñëåäîâàòåëüíûé îïåðàòîð óòâåðæäåíèÿ (ASSERT); • óñëîâíûé îïåðàòîð (IF); • îïåðàòîð âûáîðà (CASE); • îïåðàòîð öèêëà (LOOP); • ïóñòîé îïåðàòîð (NULL); • îïåðàòîð âîçâðàòà ïðîöåäóðû-ôóíêöèè (RETURN); • îïåðàòîð ïîñëåäîâàòåëüíîãî âûçîâà ïðîöåäóðû. ßçûê ïîääåðæèâàåò êîíöåïöèþ ïàêåòíîãî è ñòðóêòóðíîãî ïðîãðàììèðîâàíèÿ. Ñëîæíûå îïåðàòîðû çàêëþ÷åíû â îïåðàòîðíûå ñêîáêè: IFEND IF; PROCESS- END PROCESS; CASE- END CASE; LOOP- END LOOP è ò. ä. Ðàçëè÷àþòñÿ ëîêàëüíûå è ãëîáàëüíûå ïåðåìåííûå. Îáëàñòü «âèäèìîñòè» ëîêàëüíûõ ïåðåìåííûõ îãðàíè÷åíà ïðåäåëàìè áëîêà (ïðîöåññíîãî, ïðîöåäóðíîãî, îïåðàòîðà áëîêà, îïåðàòîðà îïèñàíèÿ àðõèòåêòóðû). Ôðàãìåíòû îïèñàíèé, êîòîðûå ìîãóò íåçàâèñèìî àíàëèçèðîâàòüñÿ êîìïèëÿòîðîì è ïðè îòñóòñòâèè îøèáîê ïîìåùàòüñÿ â áèáëèîòåêó ïðîåêòà (ðàáî÷óþ áèáëèîòåêó WORK), íàçûâàþòñÿ ïðîåêòíûìè ïàêåòàìè (Design Unit). Òàêèìè ïàêåòàìè ìîãóò áûòü îáúÿâëåíèå èíòåðôåéñà îáúåêòà ïðîåêòà (Entity), îáúÿâëåíèå àðõèòåêòóðû (Architecture), îáúÿâëåíèå êîíôèãóðàöèè (Configuration), îáúÿâëåíèå èíòåðôåéñà ïàêåòà (Package) è îáúÿâëåíèå òåëà ïàêåòà (Package body). Ìîäóëè ïðîåêòà, â ñâîþ î÷åðåäü, ìîæíî ðàçáèòü íà äâå êàòåãîðèè: ïåðâè÷íûå è âòîðè÷íûå. K ïåðâè÷íûì ïàêåòàì îòíîñÿòñÿ îáúÿâëåíèÿ ïàêåòà, îáúåêòà ïðîåêòà, êîíôèãóðàöèè. K âòîðè÷íûì îáúÿâëåíèå àðõèòåêòóðû, òåëà ïàêåòà. Îäèí èëè íåñêîëüêî ìîäóëåé ïðîåêòà ìîãóò áûòü ïîìåùåíû â îäèí ôàéë, íàçûâàåìûé ôàéëîì ïðîåêòà. Kàæäûé ïðîàíàëèçèðîâàííûé ìîäóëü ïðîåêòà ïîìåùàåòñÿ â áèáëèîòåêó ïðîåêòà (Design Library) è ñòàíîâèòñÿ áèáëèîòå÷íûì ìîäóëåì (Library Unit). Kàæäàÿ áèáëèîòåêà ïðîåêòà â ÿçûêå VHDL èìååò ëîãè÷åñêîå èìÿ (èäåíòèôèêàòîð). Ïî îòíîøåíèþ ê ñåàíñó ðàáîòû ñ VHDL-ñèñòåìîé ñóùåñòâóþò äâà êëàññà ðàáî÷èõ áèáëèîòåê ïðîåêòà: ðàáî÷èå áèáëèîòåêè è áèáëèîòåêè ðåñóðñîâ.
244
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ðàáî÷àÿ áèáëèîòåêà ýòî áèáëèîòåêà WORK, ñ êîòîðîé â äàííîì ñåàíñå ðàáîòàåò ïîëüçîâàòåëü è â êîòîðóþ ïîìåùàåòñÿ ïàêåò, ïîëó÷åííûé â ðåçóëüòàòå àíàëèçà ïàêåòà ïðîåêòà. Áèáëèîòåêà ðåñóðñîâ ýòî áèáëèîòåêà, ñîäåðæàùàÿ áèáëèîòå÷íûå ìîäóëè, ññûëêà íà êîòîðûå èìååòñÿ â àíàëèçèðóåìîì ìîäóëå ïðîåêòà.  êàæäûé êîíêðåòíûé ìîìåíò âðåìåíè ïîëüçîâàòåëü ðàáîòàåò ñ îäíîé ðàáî÷åé áèáëèîòåêîé è ïðîèçâîëüíûì êîëè÷åñòâîì áèáëèîòåê ðåñóðñîâ. Ìîäóëè, êàê è â îáû÷íûõ àëãîðèòìè÷åñêèõ ÿçûêàõ, ýòî ñðåäñòâî âûäåëåíèÿ èç ðÿäà ïðîãðàìì è ïîäïðîãðàìì îáùèõ òèïîâ äàííûõ, ïåðåìåííûõ, ïðîöåäóð è ôóíêöèé, ïîçâîëÿþùåå óïðîñòèòü, â ÷àñòíîñòè, ïðîöåññ èõ çàìåíû. Òàê æå, êàê â îïèñàíèÿõ ïðîåêòèðóåìûõ ñèñòåì ðàçäåëÿþòñÿ îïèñàíèÿ èíòåðôåéñîâ è òåë, â VHDL ó ïàêåòà ðàçäåëÿþòñÿ îïèñàíèå èíòåðôåéñà è òåëà ïàêåòà. Ïî óìîë÷àíèþ ïðåäóñìîòðåíî ïîäêëþ÷åíèå ñòàíäàðòíûõ ïàêåòîâ STANDART è TEXT 10. Ïàêåò STANDART, â ÷àñòíîñòè, ñîäåðæèò îïèñàíèå áóëåâñêèõ îïåðàöèé íàä áèòîâûìè äàííûìè è áèòîâûìè âåêòîðàìè. Íåñòàíäàðòíûå ïàêåòû ðåàëèçóþòñÿ ïîëüçîâàòåëÿìè, æåëàþùèìè áîëåå òî÷íî îòîáðàçèòü ñâîéñòâà îïèñûâàåìûõ èìè îáúåêòîâ. Íàïðèìåð, ìîæíî â ïîëüçîâàòåëüñêîì ïàêåòå ïåðåîïðåäåëèòü ëîãè÷åñêèå îïåðàöèè «È», «ÈËÈ» è «ÍÅ» è ïåðåéòè îò áóëåâà ("0", "1") ê ìíîãîçíà÷íîìó ("1", "0", "X", "Z") àëôàâèòó ìîäåëèðîâàíèÿ. Ïðîáëåìíî-îðèåíòèðîâàííàÿ êîìïîíåíòà ïîçâîëÿåò îïèñûâàòü öèôðîâûå ñèñòåìû â ïðèâû÷íûõ ðàçðàáîò÷èêó ïîíÿòèÿõ è òåðìèíàõ. Ñþäà ìîæíî îòíåñòè: • ïîíÿòèå ìîäåëüíîãî âðåìåíè (Now); • äàííûå òèïà (Time), ïîçâîëÿþùèå óêàçûâàòü âðåìÿ çàäåðæêè â ôèçè÷åñêèõ åäèíèöàõ; • äàííûå âèäà ñèãíàë (Signal), çíà÷åíèå êîòîðûõ èçìåíÿåòñÿ íå ìãíîâåííî, êàê ó îáû÷íûõ ïåðåìåííûõ, à ñ óêàçàííîé çàäåðæêîé, à òàêæå ñïåöèàëüíûå îïåðàöèè è ôóíêöèè íàä íèìè; • ñðåäñòâà îáúÿâëåíèÿ îáúåêòîâ è èõ àðõèòåêòóð. Åñëè ãîâîðèòü ïðî îïåðàòîðíóþ ÷àñòü ïðîáëåìíî-îðèåíòèðîâàííîé êîìïîíåíòû, òî óñëîâíî åå ìîæíî ðàçäåëèòü íà: ñðåäñòâà ïîâåäåí÷åñêîãî îïèñàíèÿ àïïàðàòóðû (ïàðàëëåëüíûå ïðîöåññû è ñðåäñòâà èõ âçàèìîäåéñòâèÿ); ñðåäñòâà ïîòîêîâîãî îïèñàíèÿ (îïèñàíèå íà óðîâíå ìåæðåãèñòðîâûõ ïåðåäà÷) ïàðàëëåëüíûå îïåðàòîðû íàçíà÷åíèÿ ñèãíàëà (<=) ñ òðàíñïîðòíîé èëè èíåðöèàëüíîé çàäåðæêîé ïåðåäà÷è ñèãíàëîâ è ñðåäñòâà
245
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL ñòðóêòóðíîãî îïèñàíèÿ îáúåêòîâ (îïåðàòîðû êîíêðåòèçàöèè êîìïîíåíò ñ çàäàíèåì êàðò ïîðòîâ (PORT MAP) è êàðò íàñòðîéêè (GENERIC MAP), îáúÿâëåíèå êîíôèãóðàöèè è ò. ä.). Ïàðàëëåëüíûå îïåðàòîðû VHDL âêëþ÷àþò: • îïåðàòîð ïðîöåññà (PROCESS); • îïåðàòîð áëîêà (BLOCK); • ïàðàëëåëüíûé îïåðàòîð íàçíà÷åíèÿ ñèãíàëó (<=); • îïåðàòîð óñëîâíîãî íàçíà÷åíèÿ ñèãíàëó (WHEN); • îïåðàòîð ñåëåêòèâíîãî íàçíà÷åíèÿ ñèãíàëó (SELECT); • ïàðàëëåëüíûé îïåðàòîð óòâåðæäåíèÿ (ASSERT); • ïàðàëëåëüíûé îïåðàòîð âûçîâà ïðîöåäóðû; • îïåðàòîð êîíêðåòèçàöèè êîìïîíåíòû (PORT MAP); • îïåðàòîð ãåíåðàöèè êîíêðåòèçàöèè (GENERATE). Kàê âèäíî èç ýòîãî ïåðå÷íÿ, ïîñëåäîâàòåëüíûå è ïàðàëëåëüíûå îïåðàöèè íàçíà÷åíèÿ, âûçîâà ïðîöåäóðû è óòâåðæäåíèÿ ðàçëè÷àþòñÿ êîíòåêñòíî, ò.å. âíóòðè ïðîöåññîâ è ïðîöåäóð îíè ïîñëåäîâàòåëüíûå, âíå ïàðàëëåëüíûå. Áàçîâûì ýëåìåíòîì îïèñàíèÿ ñèñòåì íà ÿçûêå VHDL ÿâëÿåòñÿ áëîê. Áëîê ñîäåðæèò ðàçäåë îïèñàíèé äàííûõ è ðàçäåë ïàðàëëåëüíî èñïîëíÿåìûõ îïåðàòîðîâ. ×àñòíûì ñëó÷àåì áëîêà ÿâëÿåòñÿ îïèñàíèå àðõèòåêòóðû îáúåêòà.  ðàìêàõ îïèñàíèÿ àðõèòåêòóðû ìîãóò èñïîëüçîâàòüñÿ âíóòðåííèå, âëîæåííûå áëîêè. Íàðÿäó ñî âñåìè ïðåèìóùåñòâàìè áëî÷íîé ñòðóêòóðû ïðîãðàììû è åå ñîîòâåòñòâèåì åñòåñòâåííîìó èåðàðõè÷åñêîìó ïðåäñòàâëåíèþ ñòðóêòóðû ïðîåêòà îïåðàòîðû áëîêà ÿçûêà VHDL ïîçâîëÿþò óñòàíàâëèâàòü óñëîâèÿ îõðàíû (çàïðåòà) âõîäà â áëîê. Òîëüêî ïðè èñòèííîñòè çíà÷åíèÿ îõðàííîãî âûðàæåíèÿ óïðàâëåíèå ïåðåäàåòñÿ â áëîê è èíèöèèðóåò âûïîëíåíèå îïåðàòîðîâ åãî òåëà.
4.2. Àëôàâèò ÿçûêà Kàê è ëþáîé äðóãîé ÿçûê ïðîãðàììèðîâàíèÿ, VHDL èìååò ñâîé àëôàâèò íàáîð ñèìâîëîâ, ðàçðåøåííûõ ê èñïîëüçîâàíèþ è âîñïðèíèìàåìûõ êîìïèëÿòîðîì.  àëôàâèò ÿçûêà âõîäÿò: 1. Ëàòèíñêèå ñòðî÷íûå è ïðîïèñíûå áóêâû: A, B, . . . , Z è a, b, . . . , z. 2. Öèôðû îò 0 äî 9. 3. Ñèìâîë ïîä÷åðêèâàíèÿ «_» (êîä ASCII íîìåð 95).
246
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Èç ñèìâîëîâ, ïåðå÷èñëåííûõ â ïï.13 (è òîëüêî èç íèõ!), ìîãóò êîíñòðóèðîâàòüñÿ èäåíòèôèêàòîðû â ïðîãðàììå. Kðîìå òîãî, íàïèñàíèå èäåíòèôèêàòîðîâ äîëæíî ïîä÷èíÿòüñÿ ñëåäóþùèì ïðàâèëàì: èäåíòèôèêàòîð íå ìîæåò áûòü çàðåçåðâèðîâàííûì ñëîâîì ÿçûêà; èäåíòèôèêàòîð äîëæåí íà÷èíàòüñÿ ñ áóêâû; èäåíòèôèêàòîð íå ìîæåò çàêàí÷èâàòüñÿ ñèìâîëîì ïîä÷åðêèâàíèÿ «_»; èäåíòèôèêàòîð íå ìîæåò ñîäåðæàòü äâà ïîñëåäîâàòåëüíûõ ñèìâîëà ïîä÷åðêèâàíèÿ «__». Ïðèìåðû êîððåêòíûõ èäåíòèôèêàòîðîâ: cont, clock2, full_add Ïðèìåðû íåêîððåêòíûõ èäåíòèôèêàòîðîâ: 1clock, _adder, add__sub, entity Ñëåäóåò îòìåòèòü ÷òî ïðîïèñíûå è ñòðî÷íûå áóêâû íå ðàçëè÷àþòñÿ, ò.å. èäåíòèôèêàòîðû clock è CLOCK ÿâëÿþòñÿ ýêâèâàëåíòíûìè. 4. Ñèìâîë «ïðîáåë» (êîä 32), ñèìâîë òàáóëÿöèè (êîä 9), ñèìâîë íîâîé ñòðîêè (êîäû 10 è 13). Äàííûå ñèìâîëû ÿâëÿþòñÿ ðàçäåëèòåëÿìè ñëîâ â êîíñòðóêöèÿõ ÿçûêà. Kîëè÷åñòâî ðàçäåëèòåëåé íå èìååò çíà÷åíèÿ. Òàêèì îáðàçîì, ñëåäóþùèå âûðàæåíèÿ äëÿ êîìïèëÿòîðà áóäóò ýêâèâàëåíòíû: count:=2+2; count := 2 + 2; count := 2 + 2; 5. Ñïåöèàëüíûå ñèìâîëû, ó÷àñòâóþùèå â ïîñòðîåíèè êîíñòðóêöèé ÿçûêà: +*/=<>.,():;#«| 6. Ñîñòàâíûå ñèìâîëû, âîñïðèíèìàåìûå êîìïèëÿòîðîì êàê îäèí ñèìâîë: <= >= => := /= Ðàçäåëèòåëè ìåæäó ýëåìåíòàìè ñîñòàâíûõ ñèìâîëîâ íåäîïóñòèìû.
4.2.1. Kîììåíòàðèè Ïðèçíàêîì êîììåíòàðèÿ ÿâëÿþòñÿ äâà ñèìâîëà òèðå («»). Kîìïèëÿòîð èãíîðèðóåò òåêñò íà÷èíàÿ ñ ñèìâîëîâ «» äî êîíöà ñòðîêè, ò.å. êîììåíòàðèé ìîæåò âêëþ÷àòü â ñåáÿ ñèìâîëû, íå âõîäÿùèå â àëôàâèò ÿçûêà (â ÷àñòíîñòè ðóññêèå áóêâû).
247
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.2.2. ×èñëà  ñòàíäàðòå ÿçûêà îïðåäåëåíû ÷èñëà êàê öåëîãî, òàê è âåùåñòâåííîãî òèïà. Îäíàêî ñðåäñòâà ñèíòåçà ÏËÈÑ äîïóñêàþò ïðèìåíåíèå òîëüêî öåëûõ ÷èñåë. Öåëîå ÷èñëî â VHDL ìîæåò áûòü ïðåäñòàâëåíî â îäíîé èç ÷åòûðåõ ñèñòåì ñ÷èñëåíèÿ: äâîè÷íîé, äåñÿòè÷íîé, âîñüìåðè÷íîé è øåñòíàäöàòåðè÷íîé. Kîíêðåòíûå ôîðìàòû íàïèñàíèÿ ÷èñëîâûõ çíà÷åíèé áóäóò îïèñàíû äàëåå ïðè ðàññìîòðåíèè ðàçëè÷íûõ òèïîâ ÿçûêà. K ðàçíîâèäíîñòè ÷èñëîâûõ çíà÷åíèé ìîæíî îòíåñòè òàêæå áèòîâûå ñòðîêè.
4.2.3. Ñèìâîëû Çàïèñü ñèìâîëà ïðåäñòàâëÿåò ñîáîé ñîáñòâåííî ñèìâîë, çàêëþ÷åííûé â îäèíî÷íûå êàâû÷êè. Íàïðèìåð: 'A', '*', ' '  ñðåäñòâàõ ñèíòåçà ÏËÈÑ îáëàñòü ïðèìåíåíèÿ ñèìâîëîâ îãðàíè÷åíà èñïîëüçîâàíèåì èõ â êà÷åñòâå ýëåìåíòîâ ïåðå÷èñëèìûõ òèïîâ.
4.2.4. Ñòðîêè Ñòðîêè ïðåäñòàâëÿþò ñîáîé íàáîð ñèìâîëîâ, çàêëþ÷åííûõ â äâîéíûå êàâû÷êè. ×òîáû âêëþ÷èòü äâîéíóþ êàâû÷êó â ñòðîêó, íåîáõîäèìî ââåñòè äâå äâîéíûå êàâû÷êè. Íàïðèìåð: "A string" "A string in a string "A string""
4.3. Òèïû äàííûõ Ïîäîáíî âûñîêîóðîâíåâûì ÿçûêàì ïðîãðàììèðîâàíèÿ, VHDL ÿâëÿåòñÿ ÿçûêîì ñî ñòðîãîé òèïèçàöèåé. Kàæäûé òèï äàííûõ â VHDL èìååò îïðåäåëåííûé íàáîð ïðèíèìàåìûõ çíà÷åíèé è íàáîð äîïóñòèìûõ îïåðàöèé.  ÿçûêå ïðåäîïðåäåëåíî äîñòàòî÷íîå êîëè÷åñòâî ïðîñòûõ è ñëîæíûõ òèïîâ, à òàêæå èìåþòñÿ ñðåäñòâà äëÿ îáðàçîâàíèÿ òèïîâ, îïðåäåëÿåìûõ ïîëüçîâàòåëåì. Íåîáõîäèìî îòìåòèòü, ÷òî â äàííîì ïîñîáèè ðàññìàòðèâàþòñÿ íå âñå òèïû äàííûõ, îïðåäåëåííûå â ñòàíäàðòå, à òîëüêî òå, êîòîðûå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà ÏËÈÑ.
248
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.3.1. Ïðîñòûå òèïû Ñëåäóþùèå ïðîñòûå òèïû ÿâëÿþòñÿ ïðåäîïðåäåëåííûìè: 1. BOOLEAN (ëîãè÷åñêèé) îáúåêòû äàííîãî òèïà ìîãóò ïðèíèìàòü çíà÷åíèÿ FALSE (ëîæü) è TRUE (èñòèíà). 2. INTEGER (öåëûé) çíà÷åíèÿ äàííîãî òèïà ïðåäñòàâëÿþò ñîáîé 32-ðàçðÿäíûå ÷èñëà ñî çíàêîì. Îáúåêòû òèïà INTEGER ìîãóò ñîäåðæàòü çíà÷åíèÿ èç äèàïàçîíà (2311)
2311 (2147483647
2147483647). 3. BIT (áèòîâûé) ïðåäñòàâëÿåò îäèí ëîãè÷åñêèé áèò. Îáúåêòû äàííîãî òèïà ìîãóò ñîäåðæàòü çíà÷åíèå '0' èëè '1'. 4. STD_LOGIC (áèòîâûé) ïðåäñòàâëÿåò îäèí áèò äàííûõ. Îáúåêòû äàííîãî òèïà ìîãóò ïðèíèìàòü 9 ñîñòîÿíèé. Äàííûé òèï îïðåäåëåí ñòàíäàðòîì IEEE 1164 äëÿ çàìåíû òèïà BIT. 5. STD_ULOGIC (áèòîâûé) ïðåäñòàâëÿåò îäèí áèò äàííûõ. Îáúåêòû äàííîãî òèïà ìîãóò ïðèíèìàòü 9 ñîñòîÿíèé. Äàííûé òèï îïðåäåëåí ñòàíäàðòîì IEEE 1164 äëÿ çàìåíû òèïà BIT (ñì. ïðèìå÷àíèå). 6. ENUMERATED (ïåðå÷èñëèìûé) èñïîëüçóåòñÿ äëÿ çàäàíèÿ ïîëüçîâàòåëüñêèõ òèïîâ. 7. SEVERITY_LEVEL ïåðå÷èñëèìûé òèï, èñïîëüçóåòñÿ òîëüêî â îïåðàòîðå ASSERT. 8. CHARACTER ñèìâîëüíûé òèï. Ïðèìå÷àíèå.  äåéñòâèòåëüíîñòè òèï STD_ULOGIC ÿâëÿåòñÿ áàçîâûì òèïîì äëÿ òèïà STD_LOGIC, ò.å. îáúåêòû îáîèõ òèïîâ ìîãóò ïðèíèìàòü îäíî è òî æå ìíîæåñòâî çíà÷åíèé è èìåþò îäèíàêîâûé íàáîð äîïóñòèìûõ îïåðàöèé. Åäèíñòâåííîå ðàçëè÷èå ìåæäó òèïàìè çàêëþ÷àåòñÿ â òîì, ÷òî äëÿ òèïà STD_ULOGIC íå îïðåäåëåíà ôóíêöèÿ ðàçðåøåíèÿ (resolving function).  ÿçûêå VHDL ôóíêöèÿ ðàçðåøåíèÿ èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ çíà÷åíèÿ ñèãíàëà, èìåþùåãî íåñêîëüêî èñòî÷íèêîâ (äðàéâåðîâ). Ïðèìåð: Âûõîäû äâóõ áóôåðîâ ñ òðåìÿ ñîñòîÿíèÿìè ïîäêëþ÷åíû ê îäíîé öåïè X. Ïóñòü âûõîä îäíîãî áóôåðà óñòàíîâèëñÿ â ñîñòîÿíèå 'Z', à âûõîä äðóãîãî â ñîñòîÿíèå '1'. Ôóíêöèÿ ðàçðåøåíèÿ îïðåäåëÿåò, ÷òî â ýòîì ñëó÷àå çíà÷åíèå ñèãíàëà X áóäåò ðàâíî '1'. Ïîñêîëüêó äëÿ òèïà STD_ULOGIC íå îïðåäåëåíà ôóíêöèÿ ðàçðåøåíèÿ, ñèãíàëû ýòîãî òèïà ìîãóò èìåòü òîëüêî îäèí èñòî÷íèê. Äàëåå ðàññìàòðèâàåòñÿ òîëüêî òèï STD_LOGIC, îäíàêî âñå ñêàçàííîå áóäåò ñïðàâåäëèâî è äëÿ òèïà STD_ULOGIC. Íà ïðàêòèêå â ïîäàâëÿþùåì áîëüøèíñòâå ñëó÷àåâ äîñòàòî÷íî èñïîëüçîâàíèÿ òèïà STD_LOGIC.
249
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.3.2. Ñëîæíûå òèïû Èç âñåé ñîâîêóïíîñòè ñëîæíûõ òèïîâ, îïðåäåëåííûõ â ñòàíäàðòå ÿçûêà, äëÿ ñèíòåçà ëîãè÷åñêèõ ñõåì èñïîëüçóþòñÿ òîëüêî ìàññèâû (òèï ARRAY) è çàïèñè (òèï RECORD). Îäíàêî òèï RECORD ïîääåðæèâàåòñÿ íå âñåìè ñðåäñòâàìè ñèíòåçà è â äàííîé êíèãå ðàññìîòðåí íå áóäåò. Ñëåäóþùèå òèïû-ìàññèâû ÿâëÿþòñÿ ïðåäîïðåäåëåííûìè: 1. BIT_VECTOR îäíîìåðíûé ìàññèâ ýëåìåíòîâ òèïà BIT; 2. STD_LOGIC_VECTOR îäíîìåðíûé ìàññèâ ýëåìåíòîâ òèïà STD_LOGIC; 3. STD_ULOGIC_VECTOR îäíîìåðíûé ìàññèâ ýëåìåíòîâ òèïà STD_ULOGIC; 4. STRING îäíîìåðíûé ìàññèâ ýëåìåíòîâ òèïà CHARACTER. Íàïðàâëåíèå è ãðàíèöû äèàïàçîíà èíäåêñîâ íå ñîäåðæàòñÿ â îïðåäåëåíèè óêàçàííûõ òèïîâ è äîëæíû áûòü óêàçàíû íåïîñðåäñòâåííî ïðè îáúÿâëåíèè îáúåêòîâ äàííûõ òèïîâ.
4.3.3. Îïèñàíèå ïðîñòûõ òèïîâ Òèï BOOLEAN. Òèï BOOLEAN ÿâëÿåòñÿ ïåðå÷èñëèìûì òèïîì. Îáúåêò äàííîãî òèïà ìîæåò ïðèíèìàòü çíà÷åíèÿ FALSE (ëîæü) è TRUE (èñòèíà), ïðè÷åì FALSE ýêâèâàëåíòíî "0", à TRUE ýêâèâàëåíòíî "1". Âñå òðè òèïà îáúåêòîâ â VHDL (êîíñòàíòû, ïåðåìåííûå è ñèãíàëû) ìîãóò èìåòü òèï BOOLEAN. Òàêèì îáúåêòàì ìîæåò áûòü ïðèñâîåíî òîëüêî çíà÷åíèå òèïà BOOLEAN. Ïðèìåð: PROCESS (a, b) VARIABLE cond : BOOLEAN; BEGIN cond := a > b; IF cond THEN output <= ‘1’; ELSE output <= ‘0’; END IF; END PROCESS;
250
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Îïåðàòîðû îòíîøåíèÿ. Çíà÷åíèÿ òèïà BOOLEAN ìîãóò ó÷àñòâîâàòü â âûðàæåíèÿõ. Îïåðàòîðû îòíîøåíèÿ (=, /=, <, <=, >, >=) îïðåäåëåíû äëÿ îïåðàíäîâ òèïà BOOLEAN è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà BOOLEAN. Ðåçóëüòàò âûðàæåíèÿ òàêæå èìååò òèï BOOLEAN. (Kàê äëÿ âñåõ ïåðå÷èñëèìûõ òèïîâ, îïåðàöèè ñðàâíåíèÿ íàä îäíîìåðíûìè ìàññèâàìè òèïà BOOLEAN ïðîèçâîäÿòñÿ ïîýëåìåíòíî, íà÷èíàÿ ñ êðàéíåãî ëåâîãî ýëåìåíòà). Ëîãè÷åñêèå îïåðàòîðû. Äëÿ îïåðàíäîâ òèïà BOOLEAN è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà BOOLEAN, îïðåäåëåíû âñå ëîãè÷åñêèå îïåðàöèè (AND, OR, NAND, NOR, XOR è NOT). Òèï è ðàçìåð îïåðàíäîâ äîëæíû áûòü îäèíàêîâûìè. Òèï è ðàçìåð ðåçóëüòàòà òàêîé æå, êàê òèï è ðàçìåð îïåðàíäîâ. Îïåðàòîð êîíêàòåíàöèè. Îïåðàòîð êîíêàòåíàöèè òàêæå îïðåäåëåí äëÿ îïåðàíäîâ òèïà BOOLEAN è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà BOOLEAN. Ðåçóëüòàò âûðàæåíèÿ ïðåäñòàâëÿåò ñîáîé îäíîìåðíûé ìàññèâ, ñîäåðæàùèé ýëåìåíòû òèïà BOOLEAN. Ðàçìåð ìàññèâà ðàâåí ñóììå ðàçìåðîâ îïåðàíäîâ. Äðóãèå îïåðàòîðû. Äðóãèå îïåðàöèè íàä îïåðàíäàìè òèïà BOOLEAN íå îïðåäåëåíû. Òèï INTEGER. Ñòàíäàðò VHDL îïðåäåëÿåò òèï INTEGER äëÿ èñïîëüçîâàíèÿ â àðèôìåòè÷åñêèõ âûðàæåíèÿõ. Ïî óìîë÷àíèþ îáúåêòû òèïà INTEGER èìåþ ðàçìåðíîñòü 32 áèòà è ïðåäñòàâëÿþò öåëîå ÷èñëî â èíòåðâàëå (2311)...2311 (2147483647...2147483647). Ñòàíäàðò ÿçûêà ïîçâîëÿåò òàêæå îáúÿâëÿòü îáúåêòû òèïà INTEGER, èìåþùèå ðàçìåð ìåíüøå 32 áèò, èñïîëüçóÿ êëþ÷åâîå ñëîâî RANGE, îãðàíè÷èâàþùåå äèàïàçîí âîçìîæíûõ çíà÷åíèé: SIGNAL X : INTEGER RANGE 127 TO 127 Äàííàÿ êîíñòðóêöèÿ îïðåäåëÿåò X êàê 8-áèòíîå ÷èñëî. Kðîìå òîãî, ìîæíî îïðåäåëèòü îãðàíè÷åííûé öåëûé òèï, èñïîëüçóÿ ñëåäóþùóþ êîíñòðóêöèþ: TYPE èìÿ_òèïà IS RANGE äèàïàçîí_èíäåêñîâ; äèàïàçîí_èíäåêñîâ îïðåäåëÿåòñÿ ñëåäóþùèì îáðàçîì: m TO n n DOWNTO m, ãäå m, n öåëî÷èñëåííûå êîíñòàíòû, m <= n. Ïðèìåð: TYPE byte_int 0 TO 255;
251
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL TYPE signed_word_int is range 32768 TO 32768; TYPE bit_index is range 31 DOWNTO 0; Çíà÷åíèÿ òèïà INTGER çàïèñûâàþòñÿ â ñëåäóþùåé ôîðìå: [ îñíîâàíèå # ] ðàçðÿä { [_ ] ðàçðÿä} [ # ] Ïî óìîë÷àíèþ «îñíîâàíèå» ïðèíèìàåòñÿ ðàâíûì 10. Äîïóñòèìûìè òàêæå ÿâëÿþòñÿ çíà÷åíèÿ 2, 8, 16. Ïðè çàïèñè ÷èñëà äîïóñêàåòñÿ èñïîëüçîâàíèå îäèíî÷íûõ ñèìâîëîâ ïîä÷åðêèâàíèÿ, êîòîðûå íå âëèÿþò íà ðåçóëüòèðóþùåå çíà÷åíèå. Ïðèìåð: CONSTANT min : INTEGER := 0; CONSTANT group : INTEGER := 13_452; ýêâèâàëåíòíî 13452 CONSTANT max : INTEGER := 16#FF#;
Äîïóñòèìîå èñïîëüçîâàíèå Îïåðàòîðû îòíîøåíèÿ. Çíà÷åíèÿ òèïà INTEGER ìîãóò ó÷àñòâîâàòü â âûðàæåíèÿõ. Îïåðàòîðû îòíîøåíèÿ (=, /=, <, <=, >, >=) îïðåäåëåíû äëÿ îïåðàíäîâ òèïà INTEGER è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà INTEGER. Ðåçóëüòàò âûðàæåíèÿ èìååò òèï BOOLEAN. Àðèôìåòè÷åñêèå îïåðàòîðû. Îïåðàòîðû +, , ABS äîïóñòèìû äëÿ îïåðàíäîâ òèïà INTEGER. Ðåçóëüòàò âûðàæåíèÿ èìååò òèï INTEGER. Îïåðàòîðû *, /, MOD, REM äîïóñòèìû â ñëåäóþùèõ ñëó÷àÿõ: åñëè îáà îïåðàíäà ÿâëÿþòñÿ êîíñòàíòàìè (CONSTANT); åñëè âòîðîé îïåðàíä ÿâëÿåòñÿ êîíñòàíòîé, è åãî çíà÷åíèå ðàâíî 2n, ãäå n = 0, 1, 2, 3
. Ïðèìåíåíèå îïåðàòîðîâ *, /, MOD, REM íåäîïóñòèìî, åñëè îáà îïåðàíäà ÿâëÿþòñÿ ñèãíàëàìè (SIGNAL) èëè ïåðåìåííûìè (VARIABLE). Îïåðàòîð âîçâåäåíèÿ â ñòåïåíü (**), êàê ïðàâèëî, íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. Äðóãèå îïåðàòîðû. Äðóãèå îïåðàöèè íàä îïåðàíäàìè òèïà INTEGER íå îïðåäåëåíû. Òèï BIT. Îáúåêò äàííîãî òèïà ìîæåò ïðèíèìàòü çíà÷åíèå '0' (ëîã. "0") èëè '1' (ëîã. "1"). Ïðèìå÷àíèå. Ñòàíäàðòîì IEEE 1164 îïðåäåëåíà çàìåíà òèïà BIT íà áîëåå ãèáêèé òèï STD_LOGIC. Ïîýòîìó èñïîëüçîâàíèå òèïà BIT â íîâûõ ðàçðàáîòêàõ íå ðåêîìåíäóåòñÿ.
252
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
Äîïóñòèìîå èñïîëüçîâàíèå Îïåðàòîðû îòíîøåíèÿ. Çíà÷åíèÿ òèïà BIT ìîãóò ó÷àñòâîâàòü â âûðàæåíèÿõ. Îïåðàòîðû îòíîøåíèÿ (=, /=, <, <=, >, >=) îïðåäåëåíû äëÿ îïåðàíäîâ òèïà BIT è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà BIT. Ðåçóëüòàò âûðàæåíèÿ èìååò òèï BOOLEAN. (Kàê äëÿ âñåõ ïåðå÷èñëèìûõ òèïîâ, îïåðàöèè ñðàâíåíèÿ íàä îäíîìåðíûìè ìàññèâàìè òèïà BIT ïðîèçâîäÿòñÿ ïîýëåìåíòíî, íà÷èíàÿ ñ êðàéíåãî ëåâîãî ýëåìåíòà). Ëîãè÷åñêèå îïåðàòîðû. Äëÿ îïåðàíäîâ òèïà BIT è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà BIT, îïðåäåëåíû âñå ëîãè÷åñêèå îïåðàöèè (AND, OR, NAND, NOR, XOR è NOT). Òèï è ðàçìåð îïåðàíäîâ äîëæíû áûòü îäèíàêîâûìè. Òèï è ðàçìåð ðåçóëüòàòà òàêîé æå, êàê òèï è ðàçìåð îïåðàíäîâ. Îïåðàòîð êîíêàòåíàöèè. Îïåðàòîð êîíêàòåíàöèè òàêæå îïðåäåëåí äëÿ îïåðàíäîâ òèïà BIT è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà BIT. Ðåçóëüòàò âûðàæåíèÿ ïðåäñòàâëÿåò ñîáîé îäíîìåðíûé ìàññèâ, ñîäåðæàùèé ýëåìåíòû òèïà BIT. Ðàçìåð ìàññèâà ðàâåí ñóììå ðàçìåðîâ îïåðàíäîâ. Äðóãèå îïåðàòîðû. Äðóãèå îïåðàöèè íàä îïåðàíäàìè òèïà BIT íå îïðåäåëåíû. Òèï STD_LOGIC. Òèï STD_LOGIC ÿâëÿåòñÿ ïåðå÷èñëèìûì òèïîì. Îáúåêòû òèïà STD_LOGIC ìîãóò ïðèíèìàòü 9 çíà÷åíèé: '0', '1', 'Z', '', 'L', 'H', 'U', 'X', 'W'. Äëÿ ñèíòåçà ëîãè÷åñêèõ ñõåì èñïîëüçóþòñÿ òîëüêî ïåðâûå ÷åòûðå: '0' ëîãè÷åñêèé "0"; '1' ëîãè÷åñêàÿ "1"; 'Z' òðåòüå ñîñòîÿíèå; '' íå ïîäêëþ÷åí.
Äîïóñòèìîå èñïîëüçîâàíèå Îïåðàòîðû îòíîøåíèÿ. Çíà÷åíèÿ òèïà STD_LOGIC ìîãóò ó÷àñòâîâàòü â âûðàæåíèÿõ. Îïåðàòîðû îòíîøåíèÿ (=, /=, <, <=, >, >=) îïðåäåëåíû äëÿ îïåðàíäîâ òèïà STD_LOGIC è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà STD_LOGIC. Ðåçóëüòàò âûðàæåíèÿ èìååò òèï BOOLEAN. (Kàê äëÿ âñåõ ïåðå÷èñëèìûõ òèïîâ, îïåðàöèè ñðàâíåíèÿ íàä îäíîìåðíûìè ìàññèâàìè òèïà STD_LOGIC ïðîèçâîäÿòñÿ ïîýëåìåíòíî, íà÷èíàÿ ñ êðàéíåãî ëåâîãî ýëåìåíòà).
253
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ëîãè÷åñêèå îïåðàòîðû. Äëÿ îïåðàíäîâ òèïà STD_LOGIC è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà STD_LOGIC îïðåäåëåíû âñå ëîãè÷åñêèå îïåðàöèè (AND, OR, NAND, NOR, XOR è NOT). Òèï è ðàçìåð îïåðàíäîâ äîëæíû áûòü îäèíàêîâûìè. Òèï è ðàçìåð ðåçóëüòàòà òàêîé æå, êàê òèï è ðàçìåð îïåðàíäîâ. Îïåðàòîð êîíêàòåíàöèè. Îïåðàòîð êîíêàòåíàöèè òàêæå îïðåäåëåí äëÿ îïåðàíäîâ òèïà STD_LOGIC è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû òèïà STD_LOGIC. Ðåçóëüòàò âûðàæåíèÿ ïðåäñòàâëÿåò ñîáîé îäíîìåðíûé ìàññèâ, ñîäåðæàùèé ýëåìåíòû òèïà STD_LOGIC. Ðàçìåð ìàññèâà ðàâåí ñóììå ðàçìåðîâ îïåðàíäîâ. Äðóãèå îïåðàòîðû. Äðóãèå îïåðàöèè íàä îïåðàíäàìè òèïà STD_LOGIC íå îïðåäåëåíû. Ïåðå÷èñëèìûé òèï. Ïåðå÷èñëèìûé òèï ýòî òàêîé òèï äàííûõ, ïðè êîòîðîì êîëè÷åñòâî âñåõ âîçìîæíûõ çíà÷åíèé êîíå÷íî. Ñòðîãî ãîâîðÿ, âñå îïèñàííûå âûøå òèïû ÿâëÿþòñÿ ïåðå÷èñëèìûìè. Ïðèìåíåíèå ïåðå÷èñëèìûõ òèïîâ ïðåñëåäóåò äâå öåëè: óëó÷øåíèå ñìûñëîâîé ÷èòàåìîñòè ïðîãðàììû; áîëåå ÷åòêèé è ïðîñòîé âèçóàëüíûé êîíòðîëü çíà÷åíèé. Íàèáîëåå ÷àñòî ïåðå÷èñëèìûé òèï èñïîëüçóåòñÿ äëÿ îáîçíà÷åíèÿ ñîñòîÿíèé êîíå÷íûõ àâòîìàòîâ. Ïåðå÷èñëèìûé òèï îáúÿâëÿåòñÿ ïóòåì ïåðå÷èñëåíèÿ íàçâàíèé ýëåìåíòîâ-çíà÷åíèé. Îáúåêòû, òèï êîòîðûõ îáúÿâëåí êàê ïåðå÷èñëèìûé, ìîãóò ñîäåðæàòü òîëüêî òå çíà÷åíèÿ, êîòîðûå óêàçàíû ïðè ïåðå÷èñëåíèè. Ýëåìåíòû ïåðå÷èñëèìîãî òèïà äîëæíû áûòü èäåíòèôèêàòîðàìè èëè ñèìâîëàìè, êîòîðûå äîëæíû áûòü óíèêàëüíûìè â ïðåäåëàõ îäíîãî òèïà. Ïîâòîðíîå èñïîëüçîâàíèå íàçâàíèé ýëåìåíòîâ â äðóãèõ ïåðå÷èñëèìûõ òèïàõ ðàçðåøàåòñÿ. Îáúÿâëåíèå ïåðå÷èñëèìîãî òèïà èìååò âèä: TYPE èìÿ_òèïà IS (íàçâàíèå_ýëåìåíòà [, íàçâàíèå_ýëåìåíòà]). Ïðèìåð: Type State_type IS (stateA, stateB, stateC); VARIABLE State : State_type; . . . State := stateB
254
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL  äàííîì ïðèìåðå îáúÿâëÿåòñÿ ïåðåìåííàÿ state, äîïóñòèìûìè çíà÷åíèÿìè êîòîðîé ÿâëÿþòñÿ stateA, stateB, stateC. Ïðèìåðû ïðåäîïðåäåëåííûõ ïåðå÷èñëèìûõ òèïîâ: TYPE SEVERITY_LEVEL IS (NOTE, WARNING, ERROR, FAILURE); TYPE BOOLEAN IS (FALSE, TRUE); TYPE BIT IS ('0', '1'); TYPE STD_LOGIC IS ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', ''); Ëþáîé ïåðå÷èñëèìûé òèï èìååò âíóòðåííþþ íóìåðàöèþ: ïåðâûé ýëåìåíò âñåãäà èìååò íîìåð 0, âòîðîé íîìåð 1 è ò.ä. Ïîðÿäîê íóìåðàöèè ñîîòâåòñòâóåò ïîðÿäêó ïåðå÷èñëåíèÿ.
Äîïóñòèìîå èñïîëüçîâàíèå Îïåðàòîðû îòíîøåíèÿ. Çíà÷åíèÿ îïðåäåëåííûõ ïîëüçîâàòåëåì ïåðå÷èñëèìûõ òèïîâ ìîãóò ó÷àñòâîâàòü â âûðàæåíèÿõ. Îïåðàòîðû îòíîøåíèÿ (=, /=, <, <=, >, >=) îïðåäåëåíû êàê äëÿ ïåðå÷èñëèìûõ òèïîâ, òàê è äëÿ îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû ýòèõ òèïîâ. Ðåçóëüòàò âûðàæåíèÿ èìååò òèï BOOLEAN. Îïåðàòîð êîíêàòåíàöèè. Îïåðàòîð êîíêàòåíàöèè îïðåäåëåí äëÿ îïåðàíäîâ, èìåþùèõ ïåðå÷èñëèìûé òèï, è îäíîìåðíûõ ìàññèâîâ, ñîäåðæàùèõ ýëåìåíòû ïåðå÷èñëèìîãî òèïà. Ïðè ýòîì îáà îïåðàíäà äîëæíû áûòü îäíîãî òèïà. Ðåçóëüòàò âûðàæåíèÿ ïðåäñòàâëÿåò ñîáîé îäíîìåðíûé ìàññèâ, òèï ýëåìåíòîâ êîòîðîãî ðàâåí òèïó îïåðàíäîâ. Ðàçìåð ìàññèâà ðàâåí ñóììå ðàçìåðîâ îïåðàíäîâ. Äðóãèå îïåðàòîðû. K îïåðàíäàì ïåðå÷èñëèìûõ òèïîâ ïðèìåíèì îïåðàòîð óêàçàíèÿ òèïà. Äàííûé îïåðàòîð èñïîëüçóåòñÿ äëÿ óòî÷íåíèÿ òèïà îáúåêòà â ñëó÷àå, åñëè îäíî è òî æå íàçâàíèå ýëåìåíòà èñïîëüçóåòñÿ ðàçëè÷íûìè òèïàìè. Ïðèìåð: TYPE COLOR IS (green, red, tellow, orange); TYPE FRUIT IS (orange, apple, pear); VARIABLE VC : COLOR; VARIABLE VF : FRUIT; VC := COLOR'orange; VF := FRUIT'orange;
255
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Äðóãèå îïåðàöèè íàä îïåðàíäàìè ïåðå÷èñëèìûõ òèïîâ, îïðåäåëåííûõ ïîëüçîâàòåëåì, íå îïðåäåëåíû. Òèï SEVERITY_LEVEL. Ïåðåìåííûå ýòîãî òèïà èñïîëüçóþòñÿ òîëüêî â îïåðàòîðå ASSERT è èãíîðèðóþòñÿ ïðè ñèíòåçå ëîãè÷åñêèõ ñõåì. Ïåðåìåííûå òèïà SEVERITY_LEVEL ìîãóò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ: NOTE, WARNING, ERROR è FAILURE. Òèï CHARACTER. Ïåðå÷èñëèìûé òèï. Çíà÷åíèåì îáúåêòà äàííîãî òèïà ìîæåò áûòü ëþáîé ñèìâîë èç íàáîðà ASCII (128 ïåðâûõ ñèìâîëîâ). Ìàññèâû. Ìàññèâ (òèï «ìàññèâ») ÿâëÿåòñÿ ñëîæíûì òèïîì. Ìàññèâ ïðåäñòàâëÿåò ñîáîé óïîðÿäî÷åííóþ ñòðóêòóðó îäíîòèïíûõ äàííûõ. Ìàññèâ èìååò äèàïàçîí èíäåêñîâ, êîòîðûé ìîæåò áûòü âîçðàñòàþùèì ëèáî óáûâàþùèì. Íà ëþáîé ýëåìåíò ìàññèâà ìîæíî ñîñëàòüñÿ, èñïîëüçóÿ åãî èíäåêñ. Íåñìîòðÿ íà òî ÷òî ñòàíäàðòîì ÿçûêà äîïóñêàåòñÿ èñïîëüçîâàíèå ìàññèâîâ ëþáîé ðàçìåðíîñòè, äëÿ ñèíòåçà ÏËÈÑ èñïîëüçóþòñÿ òîëüêî îäíîìåðíûå (ïîääåðæèâàþòñÿ âñåìè ñðåäñòâàìè ñèíòåçà) è äâóõìåðíûå (ïîääåðæèâàþòñÿ îãðàíè÷åííûì ÷èñëîì ñðåäñòâ ñèíòåçà) ìàññèâû. Òàêæå ìîæíî ñîñëàòüñÿ íà ÷àñòü îäíîìåðíîãî ìàññèâà, èñïîëüçóÿ âìåñòî èíäåêñà äèàïàçîí èíäåêñîâ. Ñóùåñòâóþò äâå ðàçíîâèäíîñòè òèïà «ìàññèâ»: îãðàíè÷åííûé (constrained) è íåîãðàíè÷åííûé (unconstrained): îáúÿâëåíèå îãðàíè÷åííîãî òèïà îïðåäåëÿåò ãðàíèöû äèàïàçîíà èíäåêñîâ (÷èñëî ýëåìåíòîâ ìàññèâà) â êàæäîì èçìåðåíèè ïðè îïðåäåëåíèè òèïà. îáúÿâëåíèå íåîãðàíè÷åííîãî òèïà íå îïðåäåëÿåò ãðàíèöû äèàïàçîíà èíäåêñîâ.  ýòîì ñëó÷àå ãðàíèöû äèàïàçîíà óñòàíàâëèâàþòñÿ ïðè îáúÿâëåíèè êîíêðåòíîãî ýêçåìïëÿðà îáúåêòà äàííîãî òèïà. Îáúÿâëåíèå îãðàíè÷åííîãî òèïà «ìàññèâ» èìååò âèä: TYPE èìÿ_òèïà IS ARRAY (äèàïàçîí_èíäåêñîâ [, äèàïàçîí_èíäåêñîâ]) OF òèï_ýëåìåíòà; äèàïàçîí_èíäåêñîâ ìîæåò îïðåäåëÿòüñÿ äâóìÿ ñïîñîáàìè: 1) ÿâíûì çàäàíèåì ãðàíèö äèàïàçîíà m TO n n DOWNTO m, ãäå m, n öåëî÷èñëåííûå êîíñòàíòû, m <= n; 2) ñ èñïîëüçîâàíèåì èäåíòèôèêàòîðà îãðàíè÷åííîãî ïîäòèïà.  ýòîì ñëó÷àå çíà÷åíèÿ ãðàíèö ïîäòèïà ÿâëÿþòñÿ çíà÷åíèÿìè ãðàíèö èíäåêñà ìàññèâà. Îïèñàíèå ïîäòèïîâ ñì. äàëåå.
256
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Îáúÿâëåíèå íåîãðàíè÷åííîãî òèïà «ìàññèâ» èìååò âèä: TYPE èìÿ_òèïà IS ARRAY (òèï_èíäåêñà [, òèï_èíäåêñà]) OF òèï_ýëåìåíòà; òèï_èíäåêñà îïðåäåëÿåòñÿ ñëåäóþùèì îáðàçîì: ïîäòèï RANGE <>, ãäå ïîäòèï ìîæåò áûòü: INTEGER èíäåêñ íàõîäèòñÿ â äèàïàçîíå (2311)
2311; NATURAL èíäåêñ íàõîäèòñÿ â äèàïàçîíå 0...2311; POSITIVE èíäåêñ íàõîäèòñÿ â äèàïàçîíå 1...2311. Ïðèìåðû: 1) Îáúÿâëåíèå îãðàíè÷åííîãî ìàññèâíîãî òèïà: TYPE word IS ARRAY (31 DOWNTO 0) OF STD_LOGIC; TYPE register_bank IS ARRAY (byte RANGE 0 TO 132) OF INTEGER; TYPE memory IS ARRAY (address) OF word; äâóìåðíûé ìàññèâ 2) Îáúÿâëåíèå íåîãðàíè÷åííîãî ìàññèâíîãî òèïà: TYPE logic IS ARRAY (INTEGER RANGE <>) OF BOOLEAN; 3) Îáúÿâëåíèå äâóõìåðíîãî ìàññèâà: TYPE Reg IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0); TYPE transform IS ARRAY (1 TO 4, 1 TO 4) OF BIT; Kàê áûëî ñêàçàíî, â ÿçûêå èìååòñÿ íåñêîëüêî ïðåäîïðåäåëåííûõ òèïîâ «ìàññèâ». Èõ îáúÿâëåíèÿ âûãëÿäÿò ñëåäóþùèì îáðàçîì: TYPE STRING IS ARRAY (POSITIVE RANGE <>) OF CHARACTER; TYPE BIT_VECTOR IS ARRAY (NATURAL RANGE <>) OF BIT; TYPE STD_LOGIC_VECTOR IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC; TYPE STD_ULOGIC_VECTOR IS ARRAY (NATURAL RANGE <>) OF STD_ULOGIC; Îáúÿâëåíèå îáúåêòà òèïà «íåîãðàíè÷åííûé ìàññèâ» äîëæíî ñîäåðæàòü îãðàíè÷åíèÿ íà èíäåêñ. Äèàïàçîí èçìåíåíèÿ èíäåêñîâ ìîæåò áûòü îãðàíè÷åí:
257
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 1) ñ èñïîëüçîâàíèåì êëþ÷åâûõ ñëîâ TO èëè DOWNTO: BIT; ...
TYPE data_memory_type IS ARRAY (INTEGER RANGE <>) OF VARIABLE data_ memory : data_memory_type(0 TO 255);
2) ïóòåì èñïîëüçîâàíèÿ äèàïàçîíà íà÷àëüíîãî çíà÷åíèÿ: CONSTANT part_id : STRING :="M38006"; Ñòðîêè, áèòîâûå ñòðîêè è àãðåãàòû. Ñòðîêè, áèòîâûå ñòðîêè, àãðåãàòû (STRINGS, BIT STRINGS, AGGREGATES) èñïîëüçóþòñÿ äëÿ êîíñòðóèðîâàíèÿ çíà÷åíèé îáüåêòîâ ìàññèâíûõ òèïîâ. Îíè ìîãóò èñïîëüçîâàòüñÿ â ëþáîì ìåñòå, ãäå äîïóñêàåòñÿ çíà÷åíèå òèïà «ìàññèâ», íàïðèìåð êàê íà÷àëüíîå çíà÷åíèå êîíñòàíòû èëè îïåðàíä â âûðàæåíèè. Ñòðîêîâàÿ çàïèñü ìîæåò áûòü èñïîëüçîâàíà äëÿ ïðåäñòàâëåíèÿ çíà÷åíèé êàê îáúåêòîâ íåêîòîðûõ ïðåäîïðåäåëåííûõ òèïîâ (STRING, BIT_VECTOR, STD_LOGIC_VECTOR), òàê è äëÿ ëþáîãî îäíîìåðíîãî ìàññèâà, ýëåìåíòû êîòîðîãî èìåþò òèï CHARACTER; íàïðèìåð: TYPE bit6 IS ('U', '0', '1', 'F', 'R', 'X'); TYPE bit6_data IS ARRAY (POSITIVE RANGE<>) OF bit6; ... SIGNAL data_bus : bit6_data(15 DOWNTO 0); . . data_bus <= "UUUUUUUUFFFFFFFF"; VHDL ïîçâîëÿåò êîìïàêòíî îïèñûâàòü áèòîâûå ñòðîêè (çíà÷åíèå òèïà BIT_VECTOR èëè STD_LOGIC_VECTOR) â áàçèñå 2, 8 è 16. Íàïðèìåð: CONSTANT clear : bit_vector := B"00_101_010"; CONSTANT empty : bit_vector := O"052"; CONSTANT null : bit_vector := X"2A"; Âñå òðè êîíñòàíòû èìåþò îäíî è òî æå çíà÷åíèå. Îòìåòèì, ÷òî ñèìâîëû ïîä÷åðêèâàíèÿ ìîãóò èñïîëüçîâàòüñÿ â ëþáîì ìåñòå áèòîâîé ñòðîêè
258
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL äëÿ îáëåã÷åíèÿ ÷òåíèÿ. Ðàñøèðåííûìè öèôðàìè (extended digits) äëÿ øåñòíàäöàòåðè÷íîãî ïðåäñòàâëåíèÿ ÿâëÿþòñÿ áóêâû îò A äî F, ïðè÷åì ìîãóò èñïîëüçîâàòüñÿ êàê ïðîïèñíûå, òàê è ñòðî÷íûå áóêâû. Ìàññèâíûå àãðåãàòû èñïîëüçóþòñÿ äëÿ ïðèñâàèâàíèÿ çíà÷åíèé îáúåêòàì òèïà «ìàññèâ». Ìàññèâíûå àãðåãàòû ôîðìèðóþòñÿ ïðè ïîìîùè ïîçèöèîííîé (positional) çàïèñè, ïîèìåíîâàííîé (named) çàïèñè èëè êîìáèíàöèè ýòèõ äâóõ ôîðì. Ðàññìîòðèì ïðèìåð. Ïðåäïîëîæèì, ÷òî èìåþòñÿ ñëåäóþùèå îïèñàíèÿ: TYPE ArayType IS ARRAY (1 TO 4) OF CHARACTER; ... VARIABLE Test : ArrayType, è òðåáóåòñÿ, ÷òîáû ïåðåìåííàÿ Test ñîäåðæàëà ýëåìåíòû 'f ', 'o', 'o', 'd' â óêàçàííîì ïîðÿäêå. Ïîçèöèîííàÿ çàïèñü èìååò âèä: Test := ('f'', 'o', 'o', 'd'). Àãðåãàò â äàííîì ñëó÷àå çàïèñûâàåòñÿ êàê ñïèñîê çíà÷åíèé ýëåìåíòîâ, ðàçäåëåííûõ çàïÿòûìè. Ïåðâîå çíà÷åíèå íàçíà÷àåòñÿ ýëåìåíòó ñ íàèìåíüøèì çíà÷åíèåì èíäåêñà (êðàéíåìó ëåâîìó). Ïîèìåíîâàííàÿ çàïèñü èìååò âèä: Test := (1=>'f ', 3=>'o', 4=>'d', 2=>'o').  ýòîì ñëó÷àå àãðåãàò òàêæå ÿâëÿåòñÿ ñïèñêîì, ýëåìåíòû êîòîðîãî ðàçäåëåíû çàïÿòûìè, îäíàêî ýëåìåíòû ñïèñêà èìåþò ôîðìàò: ïîçèöèÿ => çíà÷åíèå. Ïîðÿäîê ïåðå÷èñëåíèÿ ýëåìåíòîâ ïðè ïîèìåíîâàííîé çàïèñè íå èìååò çíà÷åíèÿ. Kîìáèíèðîâàííàÿ çàïèñü èìååò âèä: Test := ('f ', 'o', 4=>'d', 3=>'o').  ýòîì ñëó÷àå ñíà÷àëà çàïèñûâàþòñÿ ýëåìåíòû, ïðèñâàèâàåìûå ñ èñïîëüçîâàíèåì ïîçèöèîííîé çàïèñè, à îñòàâøèåñÿ ýëåìåíòû ïðèñâàèâàþòñÿ ñ èñïîëüçîâàíèåì ïîèìåíîâàííîé çàïèñè. Ïðè ôîðìèðîâàíèè àãðåãàòà ñ èñïîëüçîâàíèåì ïîèìåíîâàííîé (èëè êîìáèíèðîâàííîé) çàïèñè âìåñòî íîìåðà ïîçèöèè ìîæíî óêàçûâàòü êëþ÷åâîå ñëîâî OTHERS, êîòîðîå îïðåäåëÿåò çíà÷åíèå äëÿ âñåõ ýëåìåíòîâ, êîòîðûå åùå íå áûëè îïèñàíû â àãðåãàòå. Íàïðèìåð: Test := ('f ', 4=>'d', OTHERS=>'0').
259
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîäòèïû. Èñïîëüçîâàíèå ïîäòèïîâ ïîçâîëÿåò îáúÿâëÿòü îáúåêòû, ïðèíèìàþùèå îãðàíè÷åííûé íàáîð çíà÷åíèé èç äèàïàçîíà, äîïóñòèìîãî äëÿ áàçîâîãî òèïà. Ïîäòèïû ïðèìåíÿþòñÿ â äâóõ ñëó÷àÿõ: 1) Ïîäòèï ìîæåò îãðàíè÷èòü äèàïàçîí çíà÷åíèé áàçîâîãî ñêàëÿðíîãî òèïà (îãðàíè÷åíèå ïî äèàïàçîíó).  ýòîì ñëó÷àå îáúÿâëåíèå ïîäòèïà âûãëÿäèò ñëåäóþùèì îáðàçîì: SUBTYPE èìÿ_ïîäòèïà IS èìÿ_áàçîâîãî_òèïà RANGE äèàïàçîí_èíäåêñîâ; äèàïàçîí_èíäåêñîâ îïðåäåëÿåòñÿ ñëåäóþùèì îáðàçîì: m TO n n DOWNTO m, ãäå m, n öåëî÷èñëåííûå êîíñòàíòû, m <= n. Ïðèìåð: Ïðåäïîëîæèì ÷òî ðàçðàáîò÷èê æåëàåò ñîçäàòü ñèãíàë A òèïà SEVERITY è ÷òî A ìîæåò ïðèíèìàòü çíà÷åíèÿ òîëüêî OKAY, NOTE è WARNING. TYPE sevirity IS (OKAY, NOTE, WARNING, ERROR, FAILURE); SUBTYPE go_status IS severity RANGE OKAY TO WARNING; SIGNAL A : go_status; Áàçîâûé òèï è îãðàíè÷åíèå äèàïàçîíà ìîãóò áûòü âêëþ÷åíû íåïîñðåäñòâåííî â îáúÿâëåíèå îáúåêòà. Îáúÿâëåíèå ñèãíàëà A, ýêâèâàëåíòíîå ïðèâåäåííîìó âûøå, áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì: SIGNAL A : severity RANGE OKAY TO WARNING; Äðóãèå ïðèìåðû: SUBTYPE pin_count IS INTEGER RANGE 0 TO 400; SUBYUPE digits IS character range '0' TO '9'. Ïîäòèïû, îáúÿâëåííûå òàêèì îáðàçîì, ìîãóò òàêæå ó÷àñòâîâàòü â îïèñàíèè îãðàíè÷åííûõ ìàññèâíûõ òèïîâ (ñì. «Ìàññèâû»). 2) Ïîäòèï ìîæåò îïðåäåëèòü ãðàíèöû äèàïàçîíà èíäåêñîâ äëÿ íåîãðàíè÷åííîãî (unconstrained) ìàññèâíîãî òèïà.  ýòîì ñëó÷àå îáúÿâëåíèå ïîäòèïà âûãëÿäèò ñëåäóþùèì îáðàçîì: SUBTYPE èìÿ_ïîäòèïà IS èìÿ_áàçîâîãî_òèïà (äèàïàçîí_èíäåêñîâ [, äèàïàçîí_èíäåêñîâ]); äèàïàçîí_èíäåêñîâ îïðåäåëÿåòñÿ ñëåäóþùèì îáðàçîì:
260
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL m TO n n DOWNTO m, ãäå m, n öåëî÷èñëåííûå êîíñòàíòû, m <= n. Òàêîå èñïîëüçîâàíèå ïîäòèïà ìîæåò áûòü óäîáíî ïðè íàëè÷èè áîëüøîãî ÷èñëà îáúåêòîâ íåêîòîðîãî òèïà ñ îäèíàêîâûìè îãðàíè÷åíèÿìè íà èíäåêñû. Ïðèìåð: TYPE bit6_data IS ARRAY (POSITIVE RANGE <>) OF bit6; SUBTYPE data_store IS bit6_data (63 DOWNTO 0); SIGNAL A_reg, B_reg,C_reg : data_store; VARIABLE temp : data_store.  ÿçûêå èìåþòñÿ äâà ïðåäîïðåäåëåííûõ ÷èñëîâûõ ïîäòèïà NATURAL è POSITIVE, êîòîðûå îïðåäåëåíû êàê: SUBTYPE NATURAL IS INTEGER RANGE 0 TO highest_integer; SUBTYPE POSITIVE IS INTEGER RANGE 1 TO highest_integer;
4.4. Îïåðàòîðû VHDL 4.4.1. Îñíîâû ñèíòàêñèñà Èñõîäíûé òåêñò ïðîãðàììû íà VHDL ñîñòîèò èç ïîñëåäîâàòåëüíîñòåé îïåðàòîðîâ, çàïèñàííûõ ñ ó÷åòîì ñëåäóþùèõ ïðàâèë: • êàæäûé îïåðàòîð ýòî ïîñëåäîâàòåëüíîñòü ñëîâ, ñîäåðæàùèõ áóêâû àíãëèéñêîãî àëôàâèòà, öèôðû è çíàêè ïóíêòóàöèè; • ñëîâà ðàçäåëÿþòñÿ ïðîèçâîëüíûì êîëè÷åñòâîì ïðîáåëîâ, òàáóëÿöèé è ïåðåâîäîâ ñòðîêè; • îïåðàòîðû ðàçäåëÿþòñÿ ñèìâîëàìè «;»; • â íåêîòîðûõ îïåðàòîðàõ ìîãóò âñòðå÷àòüñÿ ñïèñêè îáúåêòîâ, ðàçäåëÿåìûå ñèìâîëàìè «,» èëè «;». Kîììåíòàðèè ìîãóò áûòü âêëþ÷åíû â òåêñò ïðîãðàììû ñ ïîìîùüþ äâóõ ïîäðÿä èäóùèõ ñèìâîëîâ «». Ïîñëå ïîÿâëåíèÿ ýòèõ ñèìâîëîâ âåñü òåêñò äî êîíöà ñòðîêè ñ÷èòàåòñÿ êîììåíòàðèåì. Äëÿ óêàçàíèÿ ñèñòåìû ñ÷èñëåíèÿ äëÿ êîíñòàíò ìîãóò áûòü ïðèìåíåíû ñïåöèôèêàòîðû: • B äâîè÷íàÿ ñèñòåìà ñ÷èñëåíèÿ, íàïðèìåð B"0011"; • Î âîñüìåðè÷íàÿ ñèñòåìà ñ÷èñëåíèÿ, íàïðèìåð O"3760"; • Í øåñòíàäöàòåðè÷íàÿ ñèñòåìà ñ÷èñëåíèÿ, íàïðèìåð Í"F6A0".
261
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.4.2. Îáúåêòû Îáúåêòû ÿâëÿþòñÿ êîíòåéíåðàìè äëÿ õðàíåíèÿ ðàçëè÷íûõ çíà÷åíèé â ðàìêàõ ìîäåëè. Èäåíòèôèêàòîðû îáúåêòîâ ñîäåðæàò áóêâû, öèôðû è çíàêè ïîä÷åðêèâàíèÿ. Èäåíòèôèêàòîðû äîëæíû íà÷èíàòüñÿ ñ áóêâû, íå äîëæíû çàêàí÷èâàòüñÿ çíàêîì ïîä÷åðêèâàíèÿ, è çíàêè ïîä÷åðêèâàíèÿ íå ìîãóò èäòè ïîäðÿä. Ïðîïèñíûå è ñòðî÷íûå áóêâû â VHDL íå ðàçëè÷àþòñÿ. Âñå îáúåêòû äîëæíû áûòü ÿâíî îáúÿâëåíû ïåðåä èñïîëüçîâàíèåì, çà èñêëþ÷åíèåì ïåðåìåííîé öèêëà â îïåðàòîðå FOR, êîòîðàÿ îáúÿâëÿåòñÿ ïî óìîë÷àíèþ. Kàæäûé îáúåêò õàðàêòåðèçóåòñÿ òèïîì è êëàññîì. Òèïû ðàçäåëÿþòñÿ íà ïðåäîïðåäåëåííûå â VHDL è îïðåäåëÿåìûå ïîëüçîâàòåëåì. Òèï ïîêàçûâàåò, êàêîãî ðîäà äàííûå ìîæåò ñîäåðæàòü îáúåêò. Këàññ ïîêàçûâàåò, ÷òî ìîæíî ñäåëàòü ñ äàííûìè, ñîäåðæàùèìèñÿ â îáúåêòå.  VHDL îïðåäåëåíû ñëåäóþùèå êëàññû îáúåêòîâ: • Constant êîíñòàíòû. Çíà÷åíèå êîíñòàíòû îïðåäåëÿåòñÿ ïðè åå îáúÿâëåíèè è íå ìîæåò áûòü èçìåíåíî. Kîíñòàíòû ìîãóò èìåòü ëþáîé èç ïîääåðæèâàåìûõ òèïîâ äàííûõ. • Variable ïåðåìåííûå. Çíà÷åíèå, õðàíèìîå â ïåðåìåííîé, ìåíÿåòñÿ âåçäå, ãäå âñòðå÷àåòñÿ ïðèñâàèâàíèå äàííîé ïåðåìåííîé. Ïåðåìåííûå ìîãóò èìåòü ëþáîé èç ïîääåðæèâàåìûõ òèïîâ äàííûõ. • Signal ñèãíàëû. Ñèãíàëû ïðåäñòàâëÿþò çíà÷åíèÿ, ïåðåäàâàåìûå ïî ïðîâîäàì è îïðåäåëÿåìûå ïðèñâîåíèåì ñèãíàëîâ (îòëè÷íûì îò ïðèñâîåíèÿ ïåðåìåííûõ). Ñèãíàëû ìîãóò èìåòü îãðàíè÷åííûé íàáîð òèïîâ (îáû÷íî BIT, BIT_VECTOR, STD_LOGIC, STD_LOGIC_VECTOR, INTEGER è, âîçìîæíî, äðóãèå, â çàâèñèìîñòè îò ñðåäû ðàçðàáîòêè). Ïîâòîðíîå èñïîëüçîâàíèå ïðèñâàèâàíèÿ ñèãíàëîâ â íàáîðå ïàðàëëåëüíûõ îïåðàòîðîâ íå äîïóñêàåòñÿ.  íàáîðå ïîñëåäîâàòåëüíûõ îïåðàòîðîâ òàêîå ïðèñâàèâàíèå äîïóñòèìî è äàñò çíà÷åíèå ñèãíàëà, ñîîòâåòñòâóþùåå ïîñëåäíåìó ïî ïîðÿäêó ïðèñâàèâàíèþ. Ñèíòàêñèñ îáúÿâëåíèÿ îáúåêòîâ: Constant { name [, name] } : Type [ ( index_range [ , index_range ] ) ] := initial_value; Variable { name [, name] } : Type [ ( index_range [ , index_range ] ) ] [ := initial_value ]; Signal { name [, name] } : Type [ ( index_range ) ]; Äèàïàçîí çíà÷åíèé èíäåêñîâ çàäàåòñÿ â âèäå int_value to int_value èëè int_value downto int_value.
262
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.4.3. Àòðèáóòû Àòðèáóòû (èëè èíà÷å ñâîéñòâà) îïðåäåëÿþò õàðàêòåðèñòèêè îáúåêòîâ, ê êîòîðûì îíè îòíîñÿòñÿ. Ñòàíäàðò VHDL ïðåäóñìàòðèâàåò êàê ïðåäîïðåäåëåííûå, òàê è îïðåäåëÿåìûå ïîëüçîâàòåëåì àòðèáóòû, îäíàêî ñîâðåìåííûå èíñòðóìåíòàëüíûå ñðåäñòâà â áîëüøèíñòâå ñâîåì ïîääåðæèâàþò òîëüêî ïðåäîïðåäåëåííûå àòðèáóòû. Äëÿ îáðàùåíèÿ ê àòðèáóòàì îáúåêòà èñïîëüçóåòñÿ ñèìâîë «'» (íàïðèìåð A1'left).  VHDL îïðåäåëåíû ñëåäóþùèå àòðèáóòû: 'left ëåâàÿ ãðàíèöà äèàïàçîíà èíäåêñîâ ìàññèâà; 'right ïðàâàÿ ãðàíèöà äèàïàçîíà èíäåêñîâ ìàññèâà; 'low íèæíÿÿ ãðàíèöà äèàïàçîíà èíäåêñîâ ìàññèâà; 'high âåðõíÿÿ ãðàíèöà äèàïàçîíà èíäåêñîâ ìàññèâà; 'range äèàïàçîí èíäåêñîâ ìàññèâà; 'reverse-range îáðàùåííûé äèàïàçîí èíäåêñîâ ìàññèâà; 'length øèðèíà äèàïàçîíà èíäåêñîâ ìàññèâà.
4.4.4. Kîìïîíåíòû Îáúÿâëåíèå êîìïîíåíòû îïðåäåëÿåò èíòåðôåéñ ê ìîäåëè íà VHDL (Entity è Architecture), îïèñàííîé â äðóãîì ôàéëå. Îáû÷íî îáúÿâëåíèå êîìïîíåíòû ñîâïàäàåò ñ ñîîòâåòñòâóþùèì îáúÿâëåíèåì Entity. Îíè ìîãóò ðàçëè÷àòüñÿ òîëüêî çíà÷åíèÿìè ïî óìîë÷àíèþ. Ýòè çíà÷åíèÿ èñïîëüçóþòñÿ, êîãäà êàêîé-ëèáî èç îòâîäîâ êîìïîíåíòû îñòàåòñÿ íå ïðèñîåäèíåííûì (êëþ÷åâîå ñëîâî Open) ïðè óñòàíîâêå êîìïîíåíòû â ñõåìó. Îïåðàòîð îáúÿâëåíèÿ êîìïîíåíòà ìîæåò íàõîäèòüñÿ âíóòðè îáúÿâëåíèÿ Architecture èëè â çàãîëîâêå ïàêåòà (Package). Ñîîòâåòñòâóþùèå êîìïîíåíòå îáúÿâëåíèÿ entity è Architecture íå îáÿçàòåëüíî äîëæíû ñóùåñòâîâàòü â ìîìåíò àíàëèçà ñõåìû.  ìîìåíò ìîäåëèðîâàíèÿ èëè ñèíòåçà äîëæíû ñóùåñòâîâàòü îáúÿâëåíèÿ Entity è Architecture äëÿ êîìïîíåíò, êîòîðûå íå òîëüêî îáúÿâëåíû, íî è óñòàíîâëåíû â ñõåìó. Ýòî ïîçâîëÿåò, íàïðèìåð, êîíñòðóêòîðó çàäàòü îáúÿâëåíèÿ áèáëèîòå÷íûõ ýëåìåíòîâ, à ðåàëüíîå èõ îïèñàíèå (îáúÿâëåíèÿ Entity è Architecture) çàäàâàòü ïî ìåðå èñïîëüçîâàíèÿ ýòèõ ýëåìåíòîâ â êîíñòðóêöèè. Îáúÿâëåíèå êîìïîíåíòû çàïèñûâàåòñÿ ñëåäóþùèì îáðàçîì: Component name [ port( port_list ); ] end component;
263
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.4.5. Âûðàæåíèÿ Âûðàæåíèÿ ìîãóò ñîäåðæàòü ñëåäóþùèå îïåðàòîðû: ïðåîáðàçîâàíèå òèïà AND, OR, NAND, NOR, XOR, =, /=, <, <=, >, >=, +, , &, *, /, MOD, REM, ABS, NOT.  çàâèñèìîñòè îò èçáðàííîé ÑÀÏÐ ïðè ñèíòåçå ìîæåò ïîääåðæèâàòüñÿ ïîäìíîæåñòâî ïðèâåäåííûõ âûøå îïåðàòîðîâ. Ïîðÿäîê âû÷èñëåíèÿ âûðàæåíèé îïðåäåëÿåòñÿ ïðèîðèòåòîì îïåðàòîðîâ: AND, OR, NAND, NOR, XOR ñàìûé íèçêèé ïðèîðèòåò =, /=, <, <=, >, >= +, , & (áèíàðíûå) +, (óíàðíûå) *, /, MOD, REM ABS, NOT âûñøèé ïðèîðèòåò Îïåðàòîðû ñ áîëåå âûñîêèì ïðèîðèòåòîì âûïîëíÿþòñÿ ðàíüøå. ×òîáû èçìåíèòü òàêîé ïîðÿäîê, èñïîëüçóþòñÿ ñêîáêè. Ïðè ìîäåëèðîâàíèè (íî íå ïðè ñèíòåçå) ñõåìû âîçìîæíî òàêæå îïèñàíèå ôîðìû ñèãíàëà â âèäå âûðàæåíèÿ. Çàïèñûâàåòñÿ îíî ñëåäóþùèì îáðàçîì: Value_expression [ after time_expression ] { , value_expression [ after time_expression ] }
4.4.6. Îïåðàòîðû Ñ ïîìîùüþ îïåðàòîðîâ îïèñûâàåòñÿ àëãîðèòì, îïðåäåëÿþùèé ôóíêöèîíèðîâàíèå ñõåìû. Îíè ìîãóò íàõîäèòüñÿ â òåëå ôóíêöèè, ïðîöåäóðû èëè ïðîöåññà. WAIT UNTIL condition; Ïðèîñòàíàâëèâàåò âûïîëíåíèå ïðîöåññà, ñîäåðæàùåãî äàííûé îïåðàòîð äî ìîìåíòà âûïîëíåíèÿ óñëîâèÿ. Signal <= expression Îïåðàòîð ïðèñâàèâàíèÿ ñèãíàëà óñòàíàâëèâàåò åãî çíà÷åíèå ðàâíûì âûðàæåíèþ ñïðàâà.
264
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Variable := expression Îïåðàòîð ïðèñâàèâàíèÿ óñòàíàâëèâàåò çíà÷åíèå ïåðåìåííîé ðàâíûì âûðàæåíèþ ñïðàâà. Procedure_name (parameter {, parameter}) Îïåðàòîð âûçîâà ïðîöåäóðû ñîñòîèò èç èìåíè ïðîöåäóðû è ñïèñêà ôàêòè÷åñêèõ ïàðàìåòðîâ. If condition then Sequence_of_statements { Elsif condition then Sequence_of_statements } [ else sequence_of_statements ] end if ; Îïåðàòîð IF èñïîëüçóåòñÿ äëÿ âåòâëåíèÿ àëãîðèòìà ïî ðàçëè÷íûì óñëîâèÿì. Case expression is When choices_list => sequence_of_statements; { When choices_list => sequence_of_statements; } When others => sequence_of_statements; End case; Îïåðàòîð CASE, ïîäîáíî îïåðàòîðó IF, çàäàåò âåòâëåíèå àëãîðèòìà. Çíà÷åíèÿ â ñïèñêàõ ðàçäåëÿþòñÿ ñèìâîëîì «|». Kîãäà çíà÷åíèå âûðàæåíèÿ âñòðå÷àåòñÿ â îäíîì èç ñïèñêîâ çíà÷åíèé, âûïîëíÿåòñÿ ñîîòâåòñòâóþùàÿ ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ. Åñëè çíà÷åíèå âûðàæåíèÿ íå ïðèñóòñòâóåò íè â îäíîì èç ñïèñêîâ, òî âûïîëíÿåòñÿ ñïèñîê îïåðàòîðîâ, ñîîòâåòñòâóþùèé âåòâè WHEN OTHERS. [ loop_label : ] for loop_index_variable in range loop sequence_of_statements end loop [ loop_label ] ; Îïåðàòîð öèêëà ïîçâîëÿåò ìíîãîêðàòíî âûïîëíÿòü ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ. Äèàïàçîí çíà÷åíèé çàäàåòñÿ â âèäå value1 to value2 èëè value1 downto value2. Ïåðåìåííàÿ öèêëà ïîñëåäîâàòåëüíî ïðèíèìàåò çíà÷åíèÿ èç
265
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL çàäàííîãî äèàïàçîíà. Kîëè÷åñòâî èòåðàöèé ðàâíî êîëè÷åñòâó çíà÷åíèé â äèàïàçîíå. RETURN expression ; Ýòîò îïåðàòîð âîçâðàùàåò çíà÷åíèå èç ôóíêöèè. NULL Ïóñòîé îïåðàòîð, íå âûïîëíÿåò íèêàêèõ äåéñòâèé.
4.5. Èíòåðôåéñ è òåëî îáúåêòà Ïîëíîå VHDL-îïèñàíèå îáúåêòà ñîñòîèò êàê ìèíèìóì èç äâóõ îòäåëüíûõ îïèñàíèé: îïèñàíèå èíòåðôåéñà îáúåêòà è îïèñàíèå òåëà îáúåêòà (îïèñàíèå àðõèòåêòóðû). Èíòåðôåéñ îïèñûâàåòñÿ â îáúÿâëåíèè îáúåêòà Entity Declaration è îïðåäåëÿåò âõîäû è âûõîäû îáúåêòà, åãî âõîäíûå è âûõîäíûå ïîðòû Ports è ïàðàìåòðû íàñòðîéêè Generic. Ïàðàìåòðû íàñòðîéêè îòðàæàþò òîò ôàêò, ÷òî íåêîòîðûå îáúåêòû ìîãóò èìåòü óïðàâëÿþùèå âõîäû, ñ ïîìîùüþ êîòîðûõ ìîæåò ïðîèçâîäèòüñÿ íàñòðîéêà ýêçåìïëÿðîâ îáúåêòîâ, â ÷àñòíîñòè, çàäàâàòüñÿ âðåìåíåì çàäåðæêè. Íàïðèìåð ó îáúåêòà Q1 òðè âõîäíûõ ïîðòà Õ1, Õ2, Õ3 è äâà âûõîäà Ó1, Ó2. Îïèñàíèå åãî èíòåðôåéñà íà VHDL èìååò âèä: Entity Q1 is Port (X1, X2, X3: in real; Y1, Y2: out real); End Q1. Ïîðòû îáúåêòà õàðàêòåðèçóþòñÿ íàïðàâëåíèåì ïîòîêà èíôîðìàöèè. Îíè ìîãóò áûòü: • âõîäíûìè (in); • âûõîäíûìè (out); • äâóíàïðàâëåííûìè (inout); • äâóíàïðàâëåííûìè áóôåðíûìè (buffer); • ñâÿçíûìè (linkage). À òàêæå èìåþò òèï, õàðàêòåðèçóþùèé çíà÷åíèÿ ïîñòóïàþùèõ íà íèõ ñèãíàëîâ: • öåëûé (INTEGER); • âåùåñòâåííûé (REAL); • áèòîâûé (BIT); • ñèìâîëüíûé (CHARACTER).
266
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Òåëî îáúåêòà ñïåöèôèöèðóåò åãî ñòðóêòóðó èëè ïîâåäåíèå. Åãî îïèñàíèå ïî òåðìèíîëîãèè VHDL ñîäåðæèòñÿ â îïèñàíèè åãî àðõèòåêòóðû. VHDL ïîçâîëÿåò îòîæäåñòâëÿòü ñ îäíèì è òåì æå èíòåðôåéñîì íåñêîëüêî àðõèòåêòóð. Ýòî ñâÿçàíî ñ òåì, ÷òî â ïðîöåññå ïðîåêòèðîâàíèÿ ïðîèñõîäèò ïðîðàáîòêà àðõèòåêòóðû îáúåêòà: ïåðåõîä îò ñòðóêòóðíîé ñõåìû ê ýëåêòðè÷åñêîé ïðèíöèïèàëüíîé, îò ïîâåäåí÷åñêîãî ê ñòðóêòóðíîìó îïèñàíèþ. Ñðåäñòâà VHDL äëÿ îòîáðàæåíèÿ ñòðóêòóð öèôðîâûõ ñèñòåì áàçèðóþòñÿ íà ïðåäñòàâëåíèè î òîì, ÷òî îïèñûâàåìûé îáúåêò Entity ïðåäñòàâëÿåò ñîáîé ñòðóêòóðó èç êîìïîíåíò Component, ñîåäèíÿåìûõ äðóã ñ äðóãîì ëèíèÿìè ñâÿçè. Kàæäàÿ êîìïîíåíòà, â ñâîþ î÷åðåäü, ÿâëÿåòñÿ îáúåêòîì è ìîæåò ñîñòîÿòü èç êîìïîíåíò íèçøåãî óðîâíÿ (èåðàðõèÿ îáúåêòîâ). Âçàèìîäåéñòâóþò îáúåêòû ïóòåì ïåðåäà÷è ñèãíàëîâ Signal ïî ëèíèÿì ñâÿçè. Ëèíèè ñâÿçè ïîäêëþ÷àþòñÿ ê âõîäíûì è âûõîäíûì ïîðòàì êîìïîíåíò.  VHDL ñèãíàëû îòîæäåñòâëÿþòñÿ ñ ëèíèÿìè ñâÿçè. Èìåíà ñèãíàëîâ è èìåíà ëèíèé ñâÿçè ñîâïàäàþò (îíè îòîæäåñòâëÿþòñÿ). Äëÿ ñèãíàëîâ (ëèíèé), ñâÿçûâàþùèõ êîìïîíåíòû äðóã ñ äðóãîì, íåîáõîäèìî óêàçûâàòü èíäèâèäóàëüíûå èìåíà. Îïèñàíèå ñòðóêòóðû îáúåêòà ñòðîèòñÿ êàê îïèñàíèå ñâÿçåé êîíêðåòíûõ êîìïîíåíò, êàæäàÿ èç êîòîðûõ èìååò èìÿ, òèï è êàðòû ïîðòîâ. Kàðòà ïîðòîâ PORT MAP îïðåäåëÿåò ñîîòâåòñòâèå ïîðòîâ êîìïîíåíò ïîñòóïàþùèì íà íèõ ñèãíàëàì, ìîæíî èíòåðïðåòèðîâàòü êàðòó ïîðòîâ êàê ðàçúåì, íà êîòîðûé ïðèõîäÿò ñèãíàëû è â êîòîðûé âñòàâëÿåòñÿ îáúåêò-êîìïîíåíòà. Ïðèíÿòàÿ â VHDL ôîðìà îïèñàíèÿ ñâÿçåé êîíêðåòíûõ êîìïîíåíò èìååò ñëåäóþùèé âèä: Èìÿ: òèï ñâÿçè (ñèãíàë, ïîðò) Íàïðèìåð, îïèñàíèå ñâÿçåé íåêîòîðîãî îáúåêòà Q1, ñîñòîÿùåãî èç òðåõ êîìïîíåíò Ê1, Ê2, Ê3 è ñèãíàëîâ ìåæäó êîìïîíåíòàìè Õ1, Õ2, Õ3, S, Y1, Y2 èìååò ñëåäóþùèé âèä: K1: SM port map (X1, X2, S); K3: M port map (S, Y1); K2: SM port map (S, X3, Y2); Çäåñü K1, K2, K3 èìåíà êîìïîíåíò; SM, M òèïû êîìïîíåíò; Õ1, Õ2, Õ3, S, Y1, Y2 èìåíà ñèãíàëîâ, ñâÿçàííûõ ñ ïîðòàìè.
267
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîëíîå VHDL-îïèñàíèå àðõèòåêòóðû STRUCTURA îáúåêòà Q1 èìååò âèä: Architecture STRUCTURA of Q1 is Component SM port (A, B: in real; C: out real); End component; Component M port (E: in real; D: out real); End component; Signal S: real; Begin K1: SM port map (X1, X2, S); K3: M port map (S, Y1); K2: SM port map (S, X3, Y2); End STRUCTURA; Ñðåäñòâà VHDL äëÿ îòîáðàæåíèÿ ïîâåäåíèÿ îïèñûâàåìûõ àðõèòåêòóð ñòðîèòñÿ íà ïðåäñòàâëåíèè èõ êàê ñîâîêóïíîñòè ïàðàëëåëüíî âçàèìîäåéñòâóþùèõ ïðîöåññîâ. Ïîíÿòèå ïðîöåññà PROCESS îòíîñèòñÿ ê áàçîâûì ïîíÿòèÿì ÿçûêà VHDL. Àðõèòåêòóðà âêëþ÷àåò â ñåáÿ îïèñàíèå îäíîãî èëè íåñêîëüêèõ ïàðàëëåëüíûõ ïðîöåññîâ. Îïèñàíèå ïðîöåññà ñîñòîèò èç ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ, îòîáðàæàþùèõ äåéñòâèÿ ïî ïåðåðàáîòêå èíôîðìàöèè. Âñå îïåðàòîðû âíóòðè ïðîöåññà âûïîëíÿþòñÿ ïîñëåäîâàòåëüíî. Ïðîöåññ ìîæåò íàõîäèòüñÿ â îäíîì èç äâóõ ñîñòîÿíèé: ëèáî ïàññèâíîì, êîãäà ïðîöåññ îæèäàåò ïðèõîäà ñèãíàëîâ çàïóñêà èëè íàñòóïëåíèÿ ñîîòâåòñòâóþùåãî ìîìåíòà âðåìåíè, ëèáî àêòèâíîì, êîãäà ïðîöåññ èñïîëíÿåòñÿ. Ïðîöåññû âçàèìîäåéñòâóþò ïóòåì îáìåíà ñèãíàëàìè.  îáùåì ñëó÷àå â ïîâåäåí÷åñêîì îïèñàíèè ñîñòàâ ïðîöåññîâ íå îáÿçàòåëüíî ñîîòâåòñòâóåò ñîñòàâó êîìïîíåíò, êàê ýòî èìååò ìåñòî â ñòðóêòóðíîì îïèñàíèè. Ïîâåäåíèå VHDL-îáúåêòîâ âîñïðîèçâîäèòñÿ íà ÝÂÌ, è ïðèõîäèòñÿ ó÷èòûâàòü îñîáåííîñòè âîñïðîèçâåäåíèÿ ïàðàëëåëüíûõ ïðîöåññîâ íà îäíîïðîöåññîðíîé ÝÂÌ. Îñîáàÿ ðîëü â ñèíõðîíèçàöèè ïðîöåññîâ îòâîäèòñÿ ìåõàíèçìó ñîáûòèéíîãî âîñïðîèçâåäåíèÿ ìîäåëüíîãî âðåìåíè Now. Kîãäà ïðîöåññ âûðàáàòûâàåò íîâîå çíà÷åíèå ñèãíàëà ïåðåä åãî ïîñûëêîé íà ëèíèþ ñâÿçè, ãîâîðÿò, ÷òî îí âûðàáàòûâàåò áóäóùåå ñîîáùåíèå
268
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Transaction. Ñ êàæäîé ëèíèåé ñâÿçè (ñèãíàëîì) ìîæåò áûòü ñâÿçàíî ìíîæåñòâî áóäóùèõ ñîîáùåíèé. Ìíîæåñòâî ñîîáùåíèé äëÿ ñèãíàëà íàçûâàåòñÿ åãî äðàéâåðîì Driver. Òàêèì îáðàçîì, äðàéâåð ñèãíàëà ýòî ìíîæåñòâî ïàð âðåìÿ-çíà÷åíèå (ìíîæåñòâî ïëàíèðóåìûõ ñîáûòèé). VHDL ðåàëèçóåò ìåõàíèçì âîñïðîèçâåäåíèÿ ìîäåëüíîãî âðåìåíè, ñîñòîÿùèé èç öèêëîâ. Íà ïåðâîé ñòàäèè öèêëà âûðàáàòûâàþòñÿ íîâûå çíà÷åíèÿ ñèãíàëîâ. Íà âòîðîé ñòàäèè ïðîöåññû ðåàãèðóþò íà èçìåíåíèÿ ñèãíàëîâ è ïåðåõîäÿò â àêòèâíóþ ôàçó. Ýòà ñòàäèÿ çàâåðøàåòñÿ, êîãäà âñå ïðîöåññû ïåðåéäóò ñíîâà â ñîñòîÿíèå îæèäàíèÿ. Ïîñëå ýòîãî ìîäåëüíîå âðåìÿ ñòàíîâèòñÿ ðàâíûì âðåìåíè áëèæàéøåãî çàïëàíèðîâàííîãî ñîáûòèÿ, è âñå ïîâòîðÿåòñÿ. Îñîáûé ñëó÷àé ïðåäñòàâëÿåò ñèòóàöèÿ, êîãäà â ïðîöåññàõ îòñóòñòâóþò îïåðàòîðû çàäåðæêè. Äëÿ ýòîãî â VHDL ïðåäóñìîòðåí ìåõàíèçì òàê íàçûâàåìîé äåëüòà-çàäåðæêè.  ñëó÷àå äåëüòà-çàäåðæåê íîâûé öèêë ìîäåëèðîâàíèÿ íå ñâÿçàí ñ óâåëè÷åíèåì ìîäåëüíîãî âðåìåíè.  ïðèâåäåííîì âûøå ïðèìåðå íîâîå çíà÷åíèå ñèãíàëà Ó1 âûðàáàòûâàåòñÿ ÷åðåç äåëüòà-çàäåðæêó ïîñëå èçìåíåíèÿ ñèãíàëà S. Äðóãàÿ ñïîñîáíîñòü VHDL-ïðîöåññîâ ñâÿçàíà ñ òàê íàçûâàåìûìè ðàçðåøåííûìè (Resolved) ñèãíàëàìè. Åñëè íåñêîëüêî ïðîöåññîâ èçìåíÿþò îäèí è òîò æå ñèãíàë (ñèãíàë èìååò íåñêîëüêî äðàéâåðîâ), òî â îïèñàíèè îáúåêòîâ ìîæåò óêàçûâàòüñÿ ôóíêöèÿ ðàçðåøåíèÿ. Ýòà ôóíêöèÿ îáúåäèíÿåò çíà÷åíèÿ èç ðàçíûõ äðàéâåðîâ è âûðàáàòûâàåò îäíî. Ýòî ïîçâîëÿåò, íàïðèìåð, îñîáåííîñòè ðàáîòû íåñêîëüêèõ ýëåìåíòîâ ïîäàòü íà îáùóþ øèíó.  ÿçûêå VHDL äëÿ íàèáîëåå ÷àñòî èñïîëüçóåìûõ âèäîâ ïðîöåññîâ (ïðîöåññîâ ìåæðåãèñòðîâûõ ïåðåäà÷) ââåäåíà êîìïàêòíàÿ ôîðìà çàïèñè. Ïîëíîå îïèñàíèå àðõèòåêòóðû POVEDENIE îáúåêòà Q1 â ýòîì ñëó÷àå èìååò ñëåäóþùèé âèä: Architecture POVEDENIE of Q1 is Signal S: real; Begin Y1<=S; Y2<=S+X3 after 10 ns; S<=X3+X2 after 10 ns; End POVEDENIE;
269
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.5.1. Îïèñàíèå ïðîñòîãî îáúåêòà Äëÿ èëëþñòðàöèè âîçìîæíîñòåé VHDL ðàññìîòðèì ïðèìåð ïðîåêòèðîâàíèÿ ïðîñòîé êîìáèíàöèîííîé ñõåìû, íàçîâåì åå îáúåêò F. Îáúåêò ïðîåêòà F èìååò äâà âõîäà À1 è À2 è äâà âûõîäà Â1 è Â2.
4.5.2. Îáúÿâëåíèå îáúåêòà ïðîåêòà F Entity F is Port (A1, A2: in BIT; B1, B2: out BIT) Ñèãíàëû ïðèíèìàþò çíà÷åíèÿ '1' èëè '0' â ñîîòâåòñòâèè ñ òàáëèöåé èñòèííîñòè. À1 0 0 1 1
Âõîäû
À2 0 1 0 1
Â1 0 0 0 1
Âûõîäû
Â2 1 1 1 0
4.5.3. Ïîâåäåí÷åñêîå îïèñàíèå àðõèòåêòóðû Âàðèàíò îïèñàíèÿ àðõèòåêòóðû BEHAVIOR îáúåêòà F èñïîëüçóåò óñëîâíûé îïåðàòîð IF ÿçûêà VHDL è ó÷èòûâàåò, ÷òî òîëüêî ïðè îáîèõ âõîäàõ À1 è À2, ðàâíûõ '1', âûõîäû Â1 = '1' è Â2 = '0'.  îñòàëüíûõ ñëó÷àÿõ íàîáîðîò Â1 = '0' è Â2 = '1'. Architecture BEHAVIOR of F is Begin Process Begin Wait on (A1' A2) If (A1='1') and (A2='1') Then B1<='1'; B2<='0'; End if; End process; End;  êàæäîì ïðîöåññå ìîæåò áûòü òîëüêî îäèí îïåðàòîð WAIT ON. Âòîðîé âàðèàíò ïîâåäåí÷åñêîãî îïèñàíèÿ àðõèòåêòóðû îáúåêòà F, íàçîâåì åãî BEHAVIOR_F, èñïîëüçóåò âûáîð CASE ÿçûêà VHDL è ó÷èòûâàåò òî ñâîé-
270
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL ñòâî ôóíêöèè F, ÷òî äëÿ ïåðâûõ òðåõ ñòðîê åå çíà÷åíèå íå ìåíÿåòñÿ.  çàãîëîâêå ïðîöåññà óêàçàí ñïèñîê ÷óâñòâèòåëüíîñòè ïðîöåññà PROCESS (A1, A2). Ýòî óêàçàíèå ýêâèâàëåíòíî îïåðàòîðó WAIT ON (A1, A2) â íà÷àëå îïèñàíèÿ ïðîöåññà. Architecture BEHAVIOR_F of F is Begin Process (A1,A2); Begin —&операция case (A1& A2) is —первые три строки таблицы when "00"/ "01"/ "10"=> B1<='0'; B2<='1' —последняя строка таблицы when "11" => B1<='1'; B2<='0' end case end process end BEHAVIOR_F;
4.5.4. Ïîòîêîâàÿ ôîðìà  ïðîöåññå ïðîåêòèðîâàíèÿ îáúåêòà F ìîãóò áûòü ïðåäëîæåíû ðàçëè÷íûå âàðèàíòû åãî ôóíêöèîíàëüíûõ ñõåì. Îïèñàíèå àðõèòåêòóðû îáúåêòà F ìîæåò áûòü òàêèì: Architecture F_A of F is Begin —каждому вентилю сопоставлен сигнала B1<= A1 and A2; B2<= not (A1 and A2); End;
оператор
назначения
Çäåñü êàæäîìó ýëåìåíòó çàäàí ïðîöåññ, îòîáðàæàþùèé ïîñëåäîâàòåëüíîñòü ïðåîáðàçîâàíèÿ âõîäíîé èíôîðìàöèè è ïåðåäà÷è åå íà âûõîä. Ïðîöåññ ïðåäñòàâëåí â ôîðìå îïåðàòîðà ïàðàëëåëüíîãî íàçíà÷åíèÿ ñèãíàëà. Îïåðàòîðû íàçíà÷åíèÿ ñèãíàëà (<=) ñðàáàòûâàþò ïàðàëëåëüíî ïðè èçìåíåíèè õîòÿ áû îäíîãî èç ñèãíàëîâ â ñâîèõ ïðàâûõ ÷àñòÿõ.
271
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Äðóãîé âàðèàíò îïèñàíèÿ àðõèòåêòóðû F_B. Çäåñü âåíòèëè âêëþ÷åíû ïîñëåäîâàòåëüíî. Architecture F_B of F is Signal X: bit Begin B2<= not (X); X <= A1 and A2; B1 <= X; End; Ïðîìåæóòî÷íûé ñèãíàë Õ ââåäåí â îïèñàíèå àðõèòåêòóðû F_B îáúåêòà F ïîòîìó, ÷òî â îïèñàíèè èíòåðôåéñà îáúåêòà F ïîðò Â1 îáúÿâëåí âûõîäíûì, ò. å. ñ íåãî íåëüçÿ ñ÷èòûâàòü ñèãíàë è çàïèñü B2 <= not (B1) áûëà áû íåêîððåêòíîé. Ñèãíàë B2 âûðàáàòûâàåòñÿ òîëüêî ïîñëå èçìåíåíèÿ ñèãíàëà Õ. Îïåðàòîð B2 <= not (X) ñðàáîòàåò òîëüêî òîãäà, êîãäà èçìåíèòñÿ ñèãíàë Õ, ò. å. ïîñëå îïåðàòîðà X <= A1 and A2, òàê êàê îí ðåàãèðóåò òîëüêî íà èçìåíåíèå ñèãíàëà â ñâîåé ïðàâîé ÷àñòè. Ñ ó÷åòîì çàäåðæêè Å1 = 10 íñ, à Å2 = 5 íñ îïèñàíèå àðõèòåêòóðû áóäåò èìåòü âèä: Architecture F_B_TIME of F is Signal X: bit Begin —задержка на В1 10 нс. —задержка на В2 5 нс. B1<=X; B2<= not (X) after 5 ns; X<= A1 and A2 after 10 ns; End; ×åðåç 10 íñ ïîñëå èçìåíåíèÿ îäíîãî èç âõîäíûõ ñèãíàëîâ (À1 èëè À2) ìîæåò èçìåíèòüñÿ âûõîäíîé ñèãíàë Â1, è ñ çàäåðæêîé 5 íñ ïîñëå íåãî èçìåíèòñÿ Â2.
4.5.5. Ñòðóêòóðíîå îïèñàíèå àðõèòåêòóðû Îïèñàíèå àðõèòåêòóðû ïðåäñòàâëÿåò ñîáîé ñòðóêòóðó îáúåêòà êàê êîìïîçèöèþ êîìïîíåíò, ñîåäèíåííûõ ìåæäó ñîáîé è îáìåíèâàþùèõñÿ ñèã-
272
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL íàëàìè. Ôóíêöèè, ðåàëèçóåìûå êîìïîíåíòàìè â ÿâíîì âèäå, â îòëè÷èå îò ïðåäûäóùèõ ïðèìåðîâ â ñòðóêòóðíîì îïèñàíèè íå óêàçûâàþòñÿ. Ñòðóêòóðíîå îïèñàíèå âêëþ÷àåò îïèñàíèå èíòåðôåéñîâ êîìïîíåíò, èç êîòîðûõ ñîñòîèò ñõåìà, è èõ ñâÿçåé. Ïîëíûå (èíòåðôåéñ + àðõèòåêòóðà) îïèñàíèÿ îáúåêòîâ-êîìïîíåíò äîëæíû áûòü ðàíåå ïîìåùåíû â ïðîåêòèðóåìóþ áèáëèîòåêó, ïîäêëþ÷åííóþ ê ñòðóêòóðíîìó îïèñàíèþ àðõèòåêòóðû. Library WORK; use WORK.all —подключение рабочей библиотеки WORK, содержащей описание объекта соответствующего компоненте INE2 Architecture СХЕМ_F_C of F is —ниже интерфейсы компоненты INE2 Component INE2 Port (X1, X2: in bit; Y: out bit); End component; —ниже описание связей экземпляров компонент Signal X: bit; Begin E1: INE2 port map (A1, A2, X); E2: INE2 port map (X, X, B1); B2<= X; End;  îïèñàíèè àðõèòåêòóðû ÑÕÅÌ_F_C îáúåêòà F ñíà÷àëà óêàçàí èíòåðôåéñ êîìïîíåíò, èç êîòîðûõ ñòðîèòñÿ ñõåìà. Ýòî êîìïîíåíòû òèïà INE2 ñ äâóìÿ âõîäíûìè è îäíèì âûõîäíûì ïîðòîì. Çàòåì ïîñëå begin èäóò îïåðàòîðû êîíêðåòèçàöèè êîìïîíåíò. Äëÿ êàæäîãî ýêçåìïëÿðà êîìïîíåíòû çàäàíî åå èìÿ, êàðòà ïîðòîâ, óêàçûâàþùàÿ ñîîòâåòñòâèå ïîðòîâ ýêçåìïëÿðà êîìïîíåíòû ïîñòóïàþùèì íà íèõ ñèãíàëàì. Íàïðèìåð, äëÿ êîìïîíåíòû ïî èìåíè Å1 òèïà INE2 íà ïîðò Õ1 ïîäàí ñèãíàë À1, íà ïîðò Õ2 ñèãíàë À2. Ïîðÿäîê êîíêðåòèçàöèè áåçðàçëè÷åí, òàê êàê ýòî ïàðàëëåëüíûå îïåðàòîðû. Äëÿ òîãî ÷òîáû îïèñàíèå F áûëî ïîëíûì, â äàííîì ñëó÷àå â ðàáî÷åé áèáëèîòåêå ïðîåêòà WORK íåîáõîäèìî èìåòü îïèñàíèå èíòåðôåéñà è àðõèòåêòóðû íåêîòîðîãî îáúåêòà, ñîïîñòàâëÿåìîãî êîìïîíåíòå INE2. Îáîçíà÷èì ýòîò îáúåêò â áèáëèîòåêå êàê LA3. Åãî îïèñàíèå:
273
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Entity LA3 is Port (X, Y: in bit; Z: out bit); End LA3; Architecture DF_LA3 of LA3 is Begin Z<= not (X and Y) after 10ns; End; Ó îáúåêòà LA3 ìîæåò áûòü íåñêîëüêî àðõèòåêòóð.  ïðèìåðàõ äàí âàðèàíò ïîòîêîâîãî îïèñàíèÿ àðõèòåêòóðû DF_LA3 îáúåêòà LA3, êîòîðûé ñîäåðæèò îïåðàòîð íàçíà÷åíèÿ ñèãíàëó Z èíâåðñíîãî çíà÷åíèÿ êîíúþíêöèè ñèãíàëîâ X è Y ñ çàäåðæêîé 10 íñ.
4.6. Îïèñàíèå êîíôèãóðàöèè Kîíôèãóðàöèþ ìîæíî ðàññìàòðèâàòü êàê àíàëîã ñïèñêà êîìïîíåíòîâ äëÿ ïðîåêòà. Îïåðàòîð êîíôèãóðàöèè (èäåíòèôèöèðóåìûé êëþ÷åâûì ñëîâîì «Configuration»), îïðåäåëÿåò, êàêèå ðåàëèçàöèè äîëæíû áûòü èñïîëüçîâàíû, è ïîçâîëÿåò èçìåíÿòü ñâÿçè êîìïîíåíòîâ â âàøåì ïðîåêòå âî âðåìÿ ìîäåëèðîâàíèÿ è ñèíòåçà. Kîíôèãóðàöèè íå ÿâëÿþòñÿ îáÿçàòåëüíûìè, íåçàâèñèìî îò òîãî, íàñêîëüêî ñëîæåí îïèñûâàåìûé ïðîåêò. Ïðè îòñóòñòâèè êîíôèãóðàöèè ñòàíäàðò VHDL îïðåäåëÿåò íàáîð ïðàâèë, êîòîðûé îáåñïå÷èâàåò êîíôèãóðàöèþ ïî óìîë÷àíèþ; íàïðèìåð â ñëó÷àå, êîãäà ïðåäóñìîòðåíî áîëåå îäíîé ðåàëèçàöèè äëÿ áëîêà, ïîñëåäíÿÿ ñêîìïèëèðîâàííàÿ ðåàëèçàöèÿ ïîëó÷èò ïðèîðèòåò è áóäåò ñâÿçàíà ñ îáúåêòîì. Îáîçíà÷åíèå òèïà êîìïîíåíòû â îïèñàíèè àðõèòåêòóðû ÑÕÅÌ_F_Ñ îáúåêòà F è îáîçíà÷åíèå ñîîòâåòñòâóþùåãî îáúåêòà ïðîåêòà â áèáëèîòåêå ìîãóò íå ñîîòâåòñòâîâàòü äðóã äðóãó. Ñâÿçûâàíèå îáîçíà÷åíèé îñóùåñòâëÿåòñÿ â ôîðìå îáúÿâëåíèÿ êîíôèãóðàöèè. Äëÿ òîãî ÷òîáû çàäàòü èíôîðìàöèþ î òîì, ÷òî èñïîëüçîâàííàÿ ïðè îïèñàíèè àðõèòåêòóðû ÑÕÅÌ_F_Ñ îáúåêòà F êîìïîíåíòà INE2 ñîîòâåòñòâóåò áèáëèîòå÷íîìó îáúåêòó LA3 è âàðèàíòó åãî àðõèòåêòóðû ïîä íàçâàíèåì DF_LA3, íåîáõîäèìî îáúÿâèòü êîíôèãóðàöèþ Configuration. Kîíôèãóðàöèÿ V1 óêàçûâàåò, ÷òî èç ðàáî÷åé áèáëèîòåêè ïðîåêòà Library WORK äëÿ àðõèòåêòóðû ÑÕÅÌ_F_C îáúåêòà F äëÿ êîìïîíåíò ñ èìåíàìè Å1 è Å2 òèïà INE2 ñëåäóåò èñïîëüçîâàòü àðõèòåêòóðó DF_LA3 îáúåêòà LA3.
274
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Library WORK —подключается рабочая библиотека проекта configuration V1 of F is —конфигурация по имени V1 объекта F use WORK. all; —используются все (all) компоненты библиотеки WORK for СХЕМ_F_C —для архитектуры СХЕМ_F_C —компоненты Е1, Е2 соответствуют объекту LA3 с архитектурой DF_LA3 из библиотеки WORK for E1,E2: INE2 use entity LA3 (DF_LA3); end for; end for; end V1;
4.7. Âåêòîðíûå ñèãíàëû è ðåãóëÿðíûå ñòðóêòóðû Îäíèì èç ñðåäñòâ ïîâûøåíèÿ êîìïàêòíîñòè îïèñàíèé öèôðîâûõ óñòðîéñòâ ÿâëÿåòñÿ èñïîëüçîâàíèå âåêòîðíûõ ïðåäñòàâëåíèé ñèãíàëîâ è îïåðàöèé íàä íèìè. Íàïðèìåð, ïóñòü íåêîòîðûé îáúåêò FV âûïîëíÿåò òó æå ôóíêöèþ, ÷òî è îáúåêò F, íî íàä 20-ðàçðÿäíûìè äâîè÷íûìè âåêòîðàìè AV1 è AV2. Åãî îïèñàíèå îïðåäåëÿåò ïîðòû êàê äâîè÷íûå âåêòîðû: Entity FV is Port (AV1, AV2: in bit_vector (1 to 20); BV1, BV2: out bit_vector (1 to 20)); End FV1; Ïîâåäåí÷åñêîå îïèñàíèå àðõèòåêòóðû FV â ïîòîêîâîé ôîðìå èñïîëüçóåò îïåðàöèè íàä áèòîâûìè âåêòîðàìè. Architecture BECHAV_FV of FV is Begin BV2<= not (AV1 and AV2); BV1<= AV1 and AV2; End BECHAV_FV;
275
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ñòðóêòóðíîå îïèñàíèå àðõèòåêòóðû FV äëÿ âàðèàíòà ðåàëèçàöèè îáúåêòà FV êàê ñîâîêóïíîñòè îáúåêòîâ F, ïðåäñòàâëåííîå íèæå, âûïîëíåíî ñ èñïîëüçîâàíèåì îïåðàòîðà ãåíåðàöèè êîíêðåòèçàöèè. Ýòî ïîçâîëÿåò ïîâûñèòü êîìïàêòíîñòü îïèñàíèé ðåãóëÿðíûõ ôðàãìåíòîâ ñõåì. Architecture STRUCT_FV of FV is Component F port (X1, X2: in bit; Y1, Y2: out bit); End component; Begin — первая компонента конкретизирована обычным способом с использованием позиционного соответствия сигналов портам K1: F port map (AV1 (1), AV2 (1), BV1 (1), BV2 (1)); —вторая компонента конкретизирована с использованием ключевого способа указания соответствия сигналов ее портам K2: F port map (AV1 ( 2)=>X1, BV1 ( 2)=>Y1, AV2 (2)=>X2, BV2 (2) =>Y2 ); — компоненты K3 K20 конкретизированы с использованием оператора генерации, позволяющего компактно описывать регулярные фрагменты схем for I in 3 to 20 generate K( I ): F port map ( AV1 ( 1 ), AV2 (1), BV1 (1), BV2 (1) ); End generate; End STRUCT_FV;
4.8. Çàäåðæêè ñèãíàëîâ è ïàðàìåòðû íàñòðîéêè Îáúåêò ñ çàäåðæêîé ìîæíî ïðåäñòàâèòü ñîñòîÿùèì êàê áû èç äâóõ ýëåìåíòîâ èäåàëüíîãî ýëåìåíòà è ýëåìåíòà çàäåðæêè.  ÿçûêå VHDL âñòðîåíû äâå ìîäåëè çàäåðæåê èíåðöèàëüíàÿ è òðàíñïîðòíàÿ. Èíåðöèàëüíàÿ ìîäåëü ïðåäïîëàãàåò, ÷òî ýëåìåíò íå ðåàãèðóåò íà ñèãíàëû, äëèòåëüíîñòü êîòîðûõ ìåíüøå ïîðîãà, ðàâíîãî âðåìåíè çàäåðæêè ýëåìåíòà. Òðàíñïîðòíàÿ ìîäåëü ëèøåíà ýòîãî îãðàíè÷åíèÿ. Èíåðöèàëüíàÿ ìîäåëü ïî óìîë÷àíèþ âñòðîåíà â îïåðàòîð íàçíà÷åíèÿ ñèãíàëà ÿçûêà VHDL. Íàïðèìåð, îïåðàòîð íàçíà÷åíèÿ Y<=X1 and X2 after
276
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 10 ns; îïèñûâàåò ðàáîòó âåíòèëÿ «2È» è ñîîòâåòñòâóåò èíåðöèàëüíîé ìîäåëè. Óêàçàíèå íà èñïîëüçîâàíèå òðàíñïîðòíîé ìîäåëè îáåñïå÷èâàåòñÿ êëþ÷åâûì ñëîâîì Transport â ïðàâîé ÷àñòè îïåðàòîðà íàçíà÷åíèÿ. Íàïðèìåð, îïåðàòîð YT<=transport X1 and X2 after 10 ns îòîáðàæàåò òðàíñïîðòíóþ ìîäåëü çàäåðæêè âåíòèëÿ. Çàäåðæêà ìîæåò áûòü çàäàíà íå êîíñòàíòîé, à âûðàæåíèåì, çíà÷åíèå êîòîðîãî ìîæåò êîíêðåòèçèðîâàòüñÿ äëÿ êàæäîãî ýêçåìïëÿðà îáúåêòà, èñïîëüçóåìîãî êàê êîìïîíåíòà. Äëÿ ýòîãî åå ñëåäóåò çàäàòü êàê ïàðàìåòð íàñòðîéêè â îïèñàíèè èíòåðôåéñà îáúåêòà. Ïðèâåäåííîå íèæå îïèñàíèå îáúåêòà 12 âêëþ÷àåò îïèñàíèå èíòåðôåéñà è òåëà 12 ñ èíåðöèàëüíîé çàäåðæêîé, çàäàííîé êàê ïàðàìåòð íàñòðîéêè. Entity 12 is —параметр настройки Т по умолчанию равен 10 нс Generic (T: time = 10 ns); Port ( X1, X2: in bit; Y: out bit ); End 12; Architecture A1_inert of 12 is Begin Y<= X1 and X2 after T; End A1_inert; Architecture A1_transport of 12 is Begin Y<= transport X1and X2 after 10 ns; End; Íèæå ïðåäñòàâëåí âàðèàíò îïèñàíèÿ àðõèòåêòóðû, èëëþñòðèðóþùåé âîçìîæíîñòü èñïîëüçîâàíèÿ ïàðàìåòðà íàñòðîéêè (çàäåðæêà Å1 ðàâíà 5 íñ, Å2 20 íñ) è âîçìîæíîñòü ñîâìåùåíèÿ ñòðóêòóðíîãî è ïîâåäåí÷åñêîãî îïèñàíèé â îäíîé àðõèòåêòóðå. Architecture MIX_8_a of F is Component 12 Generic (T: time); Port (X1, X2: in bit; Y: out bit ); End component; Begin
277
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL E1: 12 generic map (5 ns ); Port map ( A1, A2, B1); E2: B2<= not ( A1 and A2 ) after 20 ns; End; Áîëåå ñëîæíîé ïðåäñòàâëÿåòñÿ ñèòóàöèÿ, êîãäà íåîáõîäèìî îòîáðàçèòü â îïèñàíèè àðõèòåêòóðû îáúåêòà òîò ôàêò, ÷òî çàäåðæêè ôðîíòà è ñðåçà ñèãíàëîâ íå ñîâïàäàþò èëè çàâèñÿò îò ïóòåé ïðîõîæäåíèÿ ñèãíàëîâ â ñõåìå è åå ïðåäûäóùåãî ñîñòîÿíèÿ. Îäíèì èç âàðèàíòîâ îïèñàíèÿ èíåðöèàëüíîãî ïîâåäåíèÿ âåíòèëÿ «2È» ñ ðàçíûìè çàäåðæêàìè ôðîíòà è ñðåçà ìîæåò áûòü ñëåäóþùèì: Architecture INERT of 12 is Begin Process ( X1, X2 ); Variable Z: bit; Begin —выход идеального вентиля Z=X1 and X2; if Z='1' and Z'DELAYED='0' then —срез Y<='0' after 3 ns End if; End process; End; Àòðèáóò Z'DELAYED äàåò ïðåäûäóùåå çíà÷åíèå ñèãíàëà. Ïðè îïèñàíèè áîëåå ñëîæíûõ ñèòóàöèé ñëåäóåò ó÷èòûâàòü îñîáåííîñòè ðåàëèçàöèè ìåõàíèçìà ó÷åòà çàäåðæåê ñèãíàëîâ â VHDL. Ñ ñèãíàëîì àññîöèèðóåòñÿ äðàéâåð ìíîæåñòâî ñîîáùåíèé î ïëàíèðóåìûõ ñîáûòèÿõ â ôîðìå ïàð âðåìÿ-çíà÷åíèå ñèãíàëà.  ñëó÷àå òðàíñïîðòíîé çàäåðæêè, åñëè íîâîå ñîîáùåíèå èìååò âðåìÿ, áîëüøåå, ÷åì âñå ðàíåå çàïëàíèðîâàííûå, îíî âêëþ÷àåòñÿ â äðàéâåð ïîñëåäíèì.  ïðîòèâíîì ñëó÷àå ïðåäâàðèòåëüíî óíè÷òîæàþòñÿ âñå ñîîáùåíèÿ, çàïëàíèðîâàííûå íà áîëüøåå âðåìÿ.  ñëó÷àå èíåðöèàëüíîé çàäåðæêè òàêæå ïðîèñõîäèò óíè÷òîæåíèå âñåõ ñîîáùåíèé, çàïëàíèðîâàííûõ íà áîëüøåå âðåìÿ. Îäíàêî ðàçíèöà â òîì, ÷òî ïðîèñõîäèò àíàëèç ñîáûòèé, çàïëàíèðîâàííûõ íà ìåíüøåå âðåìÿ, è åñëè çíà÷åíèå ñèãíàëà îòëè÷àåòñÿ îò íîâîãî, òî îíè óíè÷òîæàþòñÿ.
278
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.9. Àòðèáóòû ñèãíàëîâ è êîíòðîëü çàïðåùåííûõ ñèòóàöèé Îïèñàíèÿ ñèñòåì ìîãóò ñîäåðæàòü èíôîðìàöèþ î çàïðåùåííûõ ñèòóàöèÿõ, íàïðèìåð, íåäîïóñòèìûõ êîìáèíàöèÿõ ñèãíàëîâ íà âõîäàõ îáúåêòîâ, ðåêîìåíäóåìûõ äëèòåëüíîñòÿõ èëè ÷àñòîòàõ èìïóëüñîâ è ò. ï. Íàïðèìåð â âåíòèëå «2È» âîçíèêàåò ðèñê ñáîÿ â ñèòóàöèÿõ, êîãäà ôðîíò îäíîãî ñèãíàëà ïåðåêðûâàåò ñðåç äðóãîãî. Âõîäíûå ñèãíàëû Õ1 è Õ2 èçìåíÿþòñÿ â ïðîòèâîïîëîæíîì íàïðàâëåíèè, è âðåìÿ èõ ïåðåêðûòèÿ ìåíüøå íåîáõîäèìîãî, äîïóñòèì, ðàâíîãî 10 íñ. Ñðåäñòâîì îòîáðàæåíèÿ èíôîðìàöèè î çàïðåùåííûõ ñèòóàöèÿõ â ÿçûêå VHDL ÿâëÿåòñÿ îïåðàòîð óòâåðæäåíèÿ (îïåðàòîð êîíòðîëÿ, îïåðàòîð àíîìàëèè) ASSERT.  íåì, ïîìèìî êîíòðîëèðóåìîãî óñëîâèÿ, êîòîðîå íå äîëæíî áûòü íàðóøåíî, ò. å. äîëæíî áûòü èñòèííûì, çàïèñûâàåòñÿ ñîîáùåíèå REPORT î íàðóøåíèè è óðîâåíü ñåðüåçíîñòè îøèáêè SEVERITY. Äëÿ ïðèâåäåííîãî ïðèìåðà â îïèñàíèè àðõèòåêòóðû âåíòèëÿ «2È» ìîæåò áûòü âñòàâëåíî óòâåðæäåíèå î òîì, ÷òî âñå áóäåò íîðìàëüíî, åñëè âíóòðåííèé ñèãíàë Z áóäåò ðàâåí '1' íå ìåíåå ÷åì 10 íñ, èíà÷å èäåò ñîîáùåíèå îá îøèáêå. Äëÿ ýòîãî íåîáõîäèìî, ÷òîáû â ìîìåíò ñðåçà ñèãíàëà åãî çàäåðæàííîå íà 10 íñ. çíà÷åíèå áûëî ðàâíî '1'. Åñëè îíî ðàâíî '0', òî äëèòåëüíîñòü ñèãíàëà ìåíüøå 10 íñ. Âðåìÿ ïðåäûäóùåãî ñîáûòèÿ â ñèãíàëå Z ìîæíî ïîëó÷èòü àòðèáóòîì LAST_EVENT. Architecture C1 of 12 is Signal Z: bit ='0'; Begin Process ( X1, X2 ); Z<= X1 and X2; Assert not (Z='0' and not Z'STABLE and Z'DELAYED (10 ns)= '0') Report «риск сбоя в 1 в вентиле 12» Severity worning; Y<= transport Z after 10 ns; End C1; Áîëåå ïîëíîå ïðåäñòàâëåíèå î ïðåäîïðåäåëåííûõ àòðèáóòàõ ñèãíàëîâ ìîæíî ïîëó÷èòü èç Òàáë. 4.1. Ïîìèìî ïðåäîïðåäåëåííûõ, ïîëüçîâàòåëü ìîæåò ââîäèòü äîïîëíèòåëüíûå àòðèáóòû äëÿ ñèãíàëîâ è äðóãèõ òèïîâ äàííûõ.
279
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Òàáëèöà 4.1. Ïðåäîïðåäåëåííûå àòðèáóòû ñèãíàëîâ Ïðèìåð
Òèï ðåçóëüòàòà
Ïîÿñíåíèÿ TRUE, åñëè ñèãíàë s ïàññèâåí íà èíòåðâàëå Ò Èíâåðòèðóåòñÿ s êàæäûé ðàç, êîãäà s àêòèâåí (èçìåíÿåòñÿ)
squiet(ò)
BOOLEAN
stransaction
BIT
sstable(t)
BOOLEAN
TRUE, åñëè íå áûëî ñîáûòèé çà èíòåðâàë Ò
sdelayed(t)
Signal
Ïðåäûäóùåå çíà÷åíèå s â ìîìåíò NOW-T
sactive
Boolean
TRUE, åñëè ñèãíàë àêòèâåí
slast_active
Time
Âðåìÿ, êîãäà ñèãíàë ïîñëåäíèé ðàç áûë àêòèâåí
sevent
BOOLEAN
TRUE, åñëè ïðîèñõîäèò cîáûòèå â s
slast_value
Signal
Çíà÷åíèå ñèãíàëà ïåðåä ïîñëåäíèì ñîáûòèåì â íåì
slast_event
Time
Âðåìÿ ïîñëåäíåãî ñîáûòèÿ â s
4.10. Àëôàâèò ìîäåëèðîâàíèÿ è ïàêåòû Îïèñàíèå ïàêåòà VHDL çàäàåòñÿ êëþ÷åâûì ñëîâîì Package è èñïîëüçóåòñÿ, ÷òîáû ñîáèðàòü ÷àñòî èñïîëüçóåìûå ýëåìåíòû êîíñòðóêöèè äëÿ ãëîáàëüíîãî èñïîëüçîâàíèÿ â äðóãèõ ïðîåêòàõ. Ïàêåò ìîæíî ðàññìàòðèâàòü êàê îáùóþ îáëàñòü õðàíåíèÿ, èñïîëüçóåìóþ äëÿ òîãî, ÷òîáû õðàíèòü òàêèå âåùè, êàê îïèñàíèÿ òèïîâ, êîíñòàíò è ãëîáàëüíûå ïîäïðîãðàììû. Îáúåêòû, îïðåäåëåííûå â ïðåäåëàõ ïàêåòà, ìîæíî èñïîëüçîâàòü â ëþáîì äðóãîì ïðîåêòå íà VHDL è ìîæíî îòêîìïèëèðîâàòü â áèáëèîòåêè äëÿ äàëüíåéøåãî ïîâòîðíîãî èñïîëüçîâàíèÿ. Ïàêåò ìîæåò ñîñòîÿòü èç äâóõ îñíîâíûõ ÷àñòåé: îïèñàíèÿ ïàêåòà è äîïîëíèòåëüíîãî òåëà ïàêåòà. Îïèñàíèå ïàêåòà ìîæåò ñîäåðæàòü ñëåäóþùèå ýëåìåíòû: • Îáúÿâëåíèÿ òèïîâ è ïîäòèïîâ. • Îáúÿâëåíèÿ êîíñòàíò. • Ãëîáàëüíûå îïèñàíèÿ ñèãíàëîâ. • Îáúÿâëåíèÿ ïðîöåäóð è ôóíêöèé. • Ñïåöèôèêàöèÿ àòðèáóòîâ.
280
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL • • • •
Îáúÿâëåíèÿ ôàéëîâ. Îáúÿâëåíèÿ êîìïîíåíòîâ. Îáúÿâëåíèÿ ïñåâäîíèìîâ. Îïåðàòîðû âêëþ÷åíèÿ. Ïóíêòû, ïîÿâëÿþùèåñÿ â ïðåäåëàõ îïèñàíèÿ ïàêåòà, ìîãóò ñòàòü âèäèìûìè â äðóãèõ ïðîåêòàõ ñ ïîìîùüþ îïåðàòîðà âêëþ÷åíèÿ. Åñëè ïàêåò ñîäåðæèò îïèñàíèÿ ïîäïðîãðàìì (ôóíêöèé èëè ïðîöåäóð) èëè îïðåäåëÿåò îäíó èëè áîëåå çàäåðæèâàåìûõ êîíñòàíò (êîíñòàíòû, ÷üÿ âåëè÷èíà íå çàäàíà), òî â äîïîëíåíèå ê îïèñàíèþ íåîáõîäèìî òåëî ïàêåòà. Òåëî ïàêåòà (êîòîðîå îïðåäåëÿåòñÿ ñ èñïîëüçîâàíèåì êîìáèíàöèè êëþ÷åâûõ ñëîâ «Package body») äîëæíî èìåòü òî æå èìÿ, êàê ñîîòâåòñòâóþùåå îïèñàíèå ïàêåòà, íî ìîæåò ðàñïîëàãàòüñÿ â ëþáîì ìåñòå ïðîåêòà (îíî íå îáÿçàíî ðàñïîëàãàòüñÿ íåìåäëåííî ïîñëå îïèñàíèÿ ïàêåòà). Îòíîøåíèå ìåæäó îïèñàíèåì è òåëîì ïàêåòà îò÷àñòè íàïîìèíàåò îòíîøåíèå ìåæäó îïèñàíèåì è ðåàëèçàöèåé ýëåìåíòà (òåì íå ìåíåå, ìîæåò áûòü òîëüêî îäíî òåëî ïàêåòà äëÿ êàæäîãî îïèñàíèÿ ïàêåòà).  òî âðåìÿ êàê îïèñàíèå ïàêåòà îáåñïå÷èâàåò èíôîðìàöèþ, íåîáõîäèìóþ äëÿ èñïîëüçîâàíèÿ ýëåìåíòîâ, îïðåäåëåííûõ â ïðåäåëàõ ýòîãî ïàêåòà (ñïèñîê ïàðàìåòðîâ äëÿ ãëîáàëüíîé ïðîöåäóðû èëè èìÿ îïðåäåëåííîãî òèïà èëè ïîäòèïà), ôàêòè÷åñêîå ïîâåäåíèå òàêèõ îáúåêòîâ, êàê ïðîöåäóðû è ôóíêöèè, äîëæíî îïðåäåëÿòüñÿ â ïðåäåëàõ òåëà ïàêåòà. Ïðèâåäåííûå âûøå îïèñàíèÿ îáúåêòà F áàçèðîâàëèñü íà ñòàíäàðòíûõ ñðåäñòâàõ ÿçûêà VHDL: ñèãíàëû ïðåäñòàâëÿëèñü â àëôàâèòå '1', '0', ëîãè÷åñêèå îïåðàöèè «È», «ÈËÈ», «ÍÅ» òàêæå îïðåäåëÿëèñü â ýòîì àëôàâèòå. Âî ìíîãèõ ñëó÷àÿõ ïðèõîäèòñÿ îïèñûâàòü ïîâåäåíèå îáúåêòîâ â äðóãèõ àëôàâèòàõ. Íàïðèìåð, â ðåàëüíûõ ñõåìàõ ñèãíàë, êðîìå çíà÷åíèé '1' è '0', ìîæåò ïðèíèìàòü çíà÷åíèå âûñîêîãî èìïåäàíñà 'Z' (íà âûõîäå áóôåðíûõ ýëåìåíòîâ) è íåîïðåäåëåííîå çíà÷åíèå 'X', íàïðèìåð, îòðàæàÿ íåèçâåñòíîå íà÷àëüíîå ñîñòîÿíèå òðèããåðîâ. Ïåðåõîä ê äðóãèì àëôàâèòàì îñóùåñòâëÿåòñÿ â VHDL ñ ïîìîùüþ ïàêåòîâ. Ó ïàêåòà, êàê è ó îáúåêòà ïðîåêòà, ðàçëè÷àþò îáúÿâëåíèå èíòåðôåéñà è îáúÿâëåíèå òåëà îáúåêòà. Íèæå ïðèâîäèòñÿ ïðèìåð ïàêåòà Ð4 äëÿ îïèñàíèÿ îáúåêòîâ â ÷åòûðåõçíà÷íîì àëôàâèòå ïðåäñòàâëåíèÿ ñèãíàëîâ ('X', '0', '1', 'Z'), Õ çíà÷åíèå íå îïðåäåëåíî, Z âûñîêèé èìïåäàíñ.  ýòîì ïàêåòå ïðèâîäèòñÿ òèï KONTAKT äëÿ ïðåäñòàâëåíèÿ ñèãíàëîâ â ÷åòûðåõçíà÷íîì àëôàâèòå, è îïðåäå-
281
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL ëÿþòñÿ ôóíêöèè NOT è AND íàä íèìè.  ÒÒË-ëîãèêå âûñîêèé èìïåäàíñ íà âõîäå âîñïðèíèìàåòñÿ êàê '1', ÷òî ó÷èòûâàåòñÿ â òàáëèöå ôóíêöèè AND. Íèæå ñëåäóåò îáúÿâëåíèå ïàêåòà Ð4: Package P4 is —перечислимый тип type KONTAKT is ('X', '0', '1', 'Z' ); function «NOT» (X: in KONTAKT) return KONTAKT; function «AND» (X1, X2: in KONTAKT) return KONTAKT; end P4; Íèæå ñëåäóåò îáúÿâëåíèå òåëà ïàêåòà Ð4: Package body P4 is Function «NOT» (A: in KONTAKT) return KONTAKT is Begin If A='X' then return 'X' Else if A='1' then return '0' Else if A='0' then return '1' Else return 'Z' End if; End «NOT»; Function «AND» ( A1, A2: in KONTAKT ) return KONTAKT is Begin If (A1='0' ) or (A2='X' ) then return to '0' Else if (A1= 'X' ) or (A2='0' ) or (A2= 'X') and (A1='0' ) then return 'X' Else return to'1' End if; End «AND»; End P4; Ïðèìåð èñïîëüçîâàíèÿ ïàêåòà Ð4 ïðè îïèñàíèè îáúåêòà F_P4. Ýòîò îáúåêò îòëè÷àåòñÿ îò F, òàê êàê ó íåãî äðóãîé èíòåðôåéñ. —подключается (use) пакет Р4, все его функции (ALL) use P4.ALL;
282
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL entity F_P4 is port (A1, A2: in KONTAKT; B1, B2: out KONTAKT) end F_P4; Описание архитектуры F_P4_a Architecture F_P4_a of F is Begin B2<= not (A1 and A2); B1<= A1 and A2; End F_P4_a; Èç ýòîãî ïðèìåðà âèäíî, ÷òî â ðÿäå ñëó÷àåâ èçìåíåíèå àëôàâèòà ìîäåëèðîâàíèÿ íå òðåáóåò âíåñåíèÿ èçìåíåíèé â îïèñàíèÿ îáúåêòîâ. Íàïðèìåð, ïåðåõîä ê ñåìèçíà÷íîìó àëôàâèòó ('0', '1', 'X', 'Z', 'F', 'S', 'R'), ãäå òèï KONTAKT èìååò äîïîëíèòåëüíûå çíà÷åíèÿ: F-ôðîíò, S-ñðåç, R-ðèñê ñáîÿ, ïîòðåáóåò òîëüêî ñîçäàíèÿ íîâîãî ïàêåòà è ïîäêëþ÷åíèÿ åãî ê îáúÿâëåíèþ îáúåêòà F_P4. Èçìåíåíèå â äðóãèõ ÷àñòÿõ îïèñàíèé îáúåêòà ïðîåêòà íå ïîòðåáóåòñÿ.
4.11. Îïèñàíèå ìîíòàæíîãî «ÈËÈ» è îáùåé øèíû Â öèôðîâîé àïïàðàòóðå èñïîëüçóþòñÿ ìîíòàæíûå «ÈËÈ» («È») è äâóíàïðàâëåííûå øèíû íà ýëåìåíòàõ ñ òðåìÿ ñîñòîÿíèÿìè âûõîäà. Ìîíòàæíîå «ÈËÈ»: Signal Y: WIRED_OR bit; K1: process Begin Y<= X1 and X2 End process K1; K2: process Y<= X3 and X4; End process K2; Îáùàÿ øèíà íà ýëåìåíòàõ ñ òðåõñòàáèëüíûìè âûõîäàìè: Type A3 is ('0', '1', 'Z'); Signal D: CHIN A3;
283
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL C1: process Begin If E1='0' then Else D<= X1 and End if; End process C1; C2: process If E2='0' then Else D<= X3 and End process C2;
D<='Z' X2
D<='Z' X4
Åñëè êàæäîé êîìïîíåíòå (K1, K2) ñõåìû çàäàòü ïðîöåññ, òî ïîëó÷èì äâà ïàðàëëåëüíûõ ïðîöåññà, êàæäûé èç êîòîðûõ âûðàáàòûâàåò ñâîé âûõîäíîé ñèãíàë.  ÿçûêå VHDL ïðåäóñìîòðåí ìåõàíèçì ðàçðåøåíèÿ êîíôëèêòîâ, âîçìîæíûõ â ïîäîáíûõ ñèòóàöèÿõ, êîãäà ñèãíàë èìååò íåñêîëüêî äðàéâåðîâ. Ôóíêöèÿ ðàçðåøåíèÿ îáû÷íî îïèñûâàåòñÿ â ïàêåòå, à åå èìÿ óêàçûâàåòñÿ ïðè îïèñàíèè ñîîòâåòñòâóþùåãî ñèãíàëà. Íàïðèìåð, òåëî ôóíêöèè ðàçðåøåíèÿ WIRED_OR (ìîíòàæíîå «ÈËÈ») èìååò ñëåäóþùèé âèä: Function WIRED_OR (INPUTS: bit_vector) return bit is Begin For I in INPUTS'RANGE loop If INPUTS( I ) = '1' then Return '1' ; End if; End loop; Return '0'; End; Äðàéâåðû ñèãíàëà INPUTS íåÿâíî ðàññìàòðèâàþòñÿ êàê ìàññèâ, ãðàíèöû êîòîðîãî îïðåäåëÿþòñÿ àòðèáóòîì 'RANGE. Ôóíêöèÿ ñêàíèðóåò äðàéâåðû ñèãíàëà è, åñëè õîòü îäèí èç íèõ ðàâåí '1', âîçâðàùàåò çíà÷åíèå '1', èíà÷å '0'. Ôóíêöèÿ ðàçðåøåíèÿ SHIN äëÿ øèíû íà ýëåìåíòàõ ñ òðåìÿ ñîñòîÿíèÿìè âûõîäîâ ìîæåò áûòü òàêîé:
284
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Type A3 is ('0', '1', 'Z'); Type VA3 is array ( integer range <> of A3 ); Function SHIN (signal X: VA3 ) return A3 is Variable VIXOD: A3:= 'Z'; Begin For I in X'RANGE loop I f X( I) /= 'Z' then VIXOD:= X ( I); Exit; End if; End loop; Return VIXOD; End SHIN; Ïðåäïîëàãàåòñÿ, ÷òî ìîæåò áûòü âêëþ÷åí (ò. å. íå ðàâåí 'Z'), òîëüêî îäèí èç äðàéâåðîâ âõîäíûõ ñèãíàëîâ.
4.12. Ñèíòåçèðóåìîå ïîäìíîæåñòâî VHDL 4.12.1. Îáùèå ñâåäåíèÿ Kàê èçâåñòíî, èçíà÷àëüíî ÿçûê îïèñàíèÿ àïïàðàòóðû VHDL ñîçäàâàëñÿ êàê ñðåäñòâî ìîäåëèðîâàíèÿ öèôðîâûõ ñèñòåì. Îäíàêî åãî ïîïóëÿðíîñòü ó ðàçðàáîò÷èêîâ è îïðåäåëåííûå óäîáñòâà ïðè èñïîëüçîâàíèè ïðèâåëè ê òîìó, ÷òî ìîäåëè íà ÿçûêå VHDL ñòàëè ñðåäñòâîì îïèñàíèÿ àëãîðèòìîâ, ñèíòåçèðóåìûõ ñïåöèàëüíûìè ïðîãðàììíûìè ñðåäñòâàìè â ôàéëû ïðîøèâêè (ìåæñîåäèíåíèé) ÏËÈÑ.  òî æå âðåìÿ äëÿ êàæäîãî ïðîãðàìíîãî ïðîäóêòà íàáîð ïîääåðæèâàåìûõ êîíñòðóêöèé ÿçûêà ðàçëè÷àåòñÿ, è ïîðîé äîâîëüíî ñóùåñòâåííî.  íàñòîÿùåå âðåìÿ ñäåëàíà ïîïûòêà â ñòàíäàðòå IEEE P1076.6 îïðåäåëèòü ñèíòåçèðóåìîå ïîäìíîæåñòâî ÿçûêà VHDL.  ýòîì ñòàíäàðòå îïðåäåëÿþòñÿ òå ýëåìåíòû ÿçûêà, êîòîðûå ìîãëè áû áûòü ñèíòåçèðîâàíû ñðåäñòâàìè ñèíòåçà (êîìïèëÿòîðàìè) íà óðîâíå ðåãèñòðîâûõ ïåðåäà÷ (register transfer level).  ýòîì ñëó÷àå ñðåäñòâà ñèíòåçà (Synthesis tools), óäîâëåòâîðÿþùèå ñòàíäàðòó IEEE P1076.6, ìîãëè áû îáåñïå÷èòü ïîäëèííóþ ïåðåíîñèìîñòü ïðîåêòà è âîçìîæíîñòü åäèíîîáðàçíîãî îïèñàíèÿ. Ðàññìîòðèì ýëåìåíòû ñèíòåçèðóåìîãî ïîäìíîæåñòâà ÿçûêà VHDL.
285
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL
4.12.2. Ïåðåîïðåäåëåííûå òèïû (Redefined types) Ñðåäñòâà ñèíòåçà, êîòîðûå ñîîòâåòñòâóþò ñòàíäàðòó IEEE P1076.6 äîëæíû ïîääåðæèâàòü ñëåäóþùèå ïåðåîïðåäåëåííûå òèïû: • BIT, BOOLEAN è BIT_VECTOR â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std 1076-1993. • INTEGER â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std 1076-1993. • STD_ULOGIC, STD_ULOGIC_VECTOR, STD_LOGIC è STD_LOGIC_ â ñîîòâåòñòâèè ñ ïàêåòîì STD_LOGIC_1164 (ñòàíäàðò IEEE Std 1164-1993). • SIGNED è UNSIGNED â ñîîòâåòñòâèè ñ ïàêåòîì NUMERIC_BIT, ÿâëÿþùèìñÿ ÷àñòüþ ñòàíäàðòà IEEE Std 1076.3-1997. • SIGNED è UNSIGNED â ñîîòâåòñòâèè ñ ïàêåòîì NUMERIC_STD, ÿâëÿþùèìñÿ ÷àñòüþ ñòàíäàðòà IEEE Std 1076.3-1997. Kðîìå òîãî, äîëæíà áûòü îáåñïå÷åíà ïîääåðæêà ñðåäñòâàìè ñèíòåçà òèïîâ, îïðåäåëåííûõ ïîëüçîâàòåëåì (User-defined types).
4.12.3. Ìåòîäèêà âåðèôèêàöèèè ñèíòåçèðóåìîãî îïèñàíèÿ (Verification methodology) Ñõåìû, ïîëó÷åííûå â ðåçóëüòàòå ïðîöåäóðû ñèíòåçà, ìîãóò áûòü êàê ïîñëåäîâàòåëüíîñòíûå (sequential), òàê è êîìáèíàöèîííûå (combinational). Kàê èçâåñòíî, ïîñëåäîâàòåëüíîñòíûå ñõåìû ñîäåðæàò íåêîòîðûå ýëåìåíòû ïàìÿòè (internal storage), òàêèå êàê çàùåëêè, ðåãèñòðû è ò.ï. (latch, register, memory), êîòîðûå ó÷èòûâàþòñÿ ïðè îïðåäåëåíèè âûõîäíîãî çíà÷åíèÿ ñèãíàëà, â òî âðåìÿ êàê âûõîä êîìáèíàöèîííîé ñõåìû çàâèñèò òîëüêî îò âõîäíûõ ïåðåìåííûõ. Ïðîöåññ âåðèôèêàöèè ñèíòåçèðîâàííîãî ïðîåêòà ñîñòîèò â ïîäà÷å òåñòîâûõ âîçäåéñòâèé êàê íà ïîâåäåí÷åñêóþ ìîäåëü, òàê è íà ñèíòåçèðîâàííóþ ñ ïîñëåäóþùèì ñðàâíåíèåì ðåçóëüòàòîâ èõ ôóíêöèîíèðîâàíèÿ. Íåòðóäíî ïîíÿòü, ÷òî òàêîé ïîäõîä ê ïðîöåññó ïðîåêòèðîâàíèÿ ïîçâîëÿåò ïî çàðàíåå îáêàòàííîé «÷èñòî ïîâåäåí÷åñêîé» ìîäåëè îòðàáîòàòü ìåòîäèêó òåñòèðîâàíèÿ ñèñòåìû. Kàê ïðàâèëî, âõîäíîé òåñòîâûé ñèãíàë äîëæåí óäîâëåòâîðÿòü ñëåäóþùèì êðèòåðèÿì: • âõîäíûå äàííûå íå ñîäåðæàò íåèçâåñòíûõ âåëè÷èí; • ïðè âåðèôèêàöèè ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ ñëåäóåò èìåòü â âèäó, ÷òî òðèããåðû èìåþò âðåìÿ óñòàíîâëåíèÿ è òåñòîâûå ñèãíàëû äîëæíû èìåòü íåîáõîäèìóþ äëÿ çàâåðøåíèÿ ïåðåõîäíûõ ïðîöåññîâ äëèòåëüíîñòü;
286
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL • òàêòîâûå ñèãíàëû è âõîäíûå äàííûå äîëæíû èçìåíÿòüñÿ ñïóñòÿ äîñòàòî÷íîå âðåìÿ ïîñëå àñèíõðîííîãî ñáðîñà èëè óñòàíîâêè; • äëÿ ñèíõðîííûõ ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ ïåðâè÷íûå âõîäíûå ñèãíàëû äîëæíû èçìåíèòüñÿ çíà÷èòåëüíî ðàíüøå, ÷åì àêòèâíûé ôðîíò ñèíõðîèìïóëüñà. Òàêæå âõîäíûå äàííûå äîëæíû îñòàâàòüñÿ íåèçìåííûìè äîñòàòî÷íî äîëãî, ÷òîáû áûòü óäåðæàííûìè îòíîñèòåëüíî àêòèâíîãî ôðîíòà ñèíõðîèìïóëüñà; • àíàëîãè÷íûå òðåáîâàíèÿ ê âðåìåíè óäåðæàíèÿ ñèãíàëà è íà âõîäàõ ïîñëåäîâàòåëüíîñòíîé ñõåìû, óïðàâëÿåìîé ïîòåíöèàëàìè. Òàêèì îáðàçîì, âõîäíûå äàííûå äîëæíû îñòàâàòüñÿ íåèçìåííûìè äîñòàòî÷íî äîëãî, ÷òîáû îáåñïå÷èòü òðåáóåìîå âðåìÿ óäåðæàíèÿ (hold times) ñèãíàëà íà âõîäå. Ñðåäñòâà ñèíòåçà ìîãóò äîîïðåäåëÿòü íåîïðåäåëåííûå çíà÷åíèÿ, ïîÿâëÿþùèåñÿ íà ìàãèñòðàëüíûõ âûõîäàõ â îäíîé ìîäåëè êàê ýêâèâàëåíò ê ëîãè÷åñêèì çíà÷åíèÿì â äðóãîé ìîäåëè. Ïî ýòîé ïðè÷èíå ñëåäóåò çàïîìèíàòü âõîäíîé çàäàþùèé ñèãíàë äî òîãî, êàê ïðîâåäåíî ñðàâíåíèå ëîãè÷åñêèõ çíà÷åíèé íà âûõîäàõ îáåèõ ìîäåëåé. 4.12.3.1. Âåðèôèêàöèÿ êîìáèíàöèîííûõ óñòðîéñòâ (Combinational verification) Ïðè âåðèôèêàöèè êîìáèíàöèîííîé ëîãè÷åñêîé ñõåìû ïîñëå ïîäà÷è âõîäíîé çàäàþùåãî òåñòîâîãî ñèãíàëà äîëæíî ïðîéòè íåêîòîðîå âðåìÿ, ïðåæäå ÷åì íà÷àòü àíàëèç ñèãíàëà íà âûõîäàõ ñõåìû. Kàê ïðàâèëî, ýòî îñóùåñòâëÿåòñÿ â öèêëå òàêèì îáðàçîì, ÷òî âûõîäû àíàëèçèðóþòñÿ íåïîñðåäñòâåííî ïåðåä ïîäà÷åé ñëåäóþùåãî íàáîðà âõîäíûõ âîçäåéñòâèé, ò. å. ïî çàâåðøåíèè ïåðåõîäíûõ ïðîöåññîâ. Kàæäàÿ èòåðàöèÿ öèêëà äîëæíà âêëþ÷àòü äîñòàòî÷íóþ çàäåðæêó, ïðåâûøàþùóþ çàäåðæêè ðàñïðîñòðàíåíèÿ (transient delays) è ïàóçû (timeout clause delays). Åñëè íå ïðèäåðæèâàòüñÿ ýòèõ ïðàâèë, òî òåñòèðóåìîå óñòðîéñòâî ìîæåò íèêîãäà íå äîñòèãíóòü óñòàíîâèâøåãîñÿ ñîñòîÿíèÿ (ò. å. äåìîíñòðèðîâàòü êîëåáàòåëüíîå ïîâåäåíèå), íàïðèìåð: A <= not A after 5 ns; 4.12.3.2. Âåðèôèêàöèÿ ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ (Sequential verification) Ïðè âåðèôèêàöèè ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ îáû÷íî ê âõîäàì ñõåìû ïðèêëàäûâàþòñÿ âíåøíèå âîçäåéñòâèÿ, ïîñëå îöåíèâàåòñÿ ñîñòîÿíèå âûõîäîâ. Çàòåì ïðîöåññ ïîâòîðÿåòñÿ. Íî ïîñêîëüêó ïîñëåäîâàòåëüíî-
287
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL ñòíîå óñòðîéñòâî óïðàâëÿåòñÿ ëèáî ôðîíòîì, ëèáî óðîâíåì òàêòîâîãî ñèãíàëà, ïðîöåññ âåðèôèêàöèè èìååò íåêîòîðûå îñîáåííîñòè. Ïðè âåðèôèêàöèè óñòðîéñòâ, òàêòèðóåìûõ ôðîíòîì (Edge-sensitive models), ïîäà÷à âõîäíûõ äàííûõ è ïðîâåðêà âûõîäà òàêòèðóþòñÿ ñèíõðîñèãíàëîì. Ïðîâåðêà âûõîäà äîëæíà âûïîëíÿòüñÿ äî ïîäà÷è ñëåäóþùåãî àêòèâíîãî ôðîíòà òàêòîâîãî ñèãíàëà. Òàêèì îáðàçîì, âðåìÿ ïåðåõîäíûõ ïðîöåññîâ â òðèããåðàõ è ïåðèîä ñèíõðîñèãíàëà äîëæíû ñîîòâåòñòâîâàòü äðóã äðóãó. Ïðè âåðèôèêàöèè óñòðîéñòâ, òàêòèðóåìûõ óðîâíåì (Level-sensitive models), ñëåäóåò ó÷èòûâàòü, ÷òî èõ ïîâåäåíèå ãîðàçäî ñëîæíåå ïðåäñêàçàòü, ÷åì ïîâåäåíèå óñòðîéñòâ, òàêòèðóåìûõ ôðîíòîì, èç-çà àñèíõðîííîé ïðèðîäû âçàèìîäåéñòâèé ñèãíàëîâ. Ïðîâåðêà ðåçóëüòàòîâ ñèíòåçà çàâèñèò îò ïðèëîæåíèÿ. Îáùåå ïðàâèëî ââîäíûå äàííûå äîëæíû óñòàíîâèòüñÿ, ïîêà àêòèâåí ñèãíàë ðàçðåøåíèÿ, ïðîâåðêà âûõîäîâ îñóùåñòâëÿåòñÿ ïðè íåàêòèâíîì ñèãíàëå ðàçðåøåíèÿ.
4.12.4. Ìîäåëèðîâàíèå ýëåìåíòîâ àïïàðàòóðû (Modeling hardware elements) Ðàññìîòðèì îñîáåííîñòè îïèñàíèÿ òàêèõ óñòðîéñòâ, êàê òàêòèðóåìûå ôðîíòîì ïîñëåäîâàòåëüíîñòíûå ñõåìû (Edge-sensitive storage elements), ïîñëåäîâàòåëüíîñòíûå ñõåìû, òàêòèðóåìûå óðîâíåì (Level-sensitive storage elements) è ñõåìû ñ òðåìÿ ñîñòîÿíèÿìè (Three-state drivers). 4.12.4.1. Ñèíõðîííûå ïîñëåäîâàòåëüíîñòíûå ñõåìû (Edge-sensi tive sequential logic) Òèïû òàêòîâîãî ñèãíàëà (Clock signal type). Äëÿ çàäàíèÿ òàêòîâîãî ñèãíàëà ìîãóò áûòü èñïîëüçîâàíû òèïû BIT, STD_ULOGIC è èõ ïîäòèïû (íàïðèìåð STD_LOGIC) ñ ìèíèìàëüíûì íàáîðîì çíà÷åíèé '0' è '1'. Ðàññìîòðèì ïðèìåð îïèñàíèÿ òàêòîâîãî ñèãíàëà. signal BUS8: std_logic_vector(7 downto 0); ... process (BUS8(0)) begin if BUS8(0) = '1' and BUS8(0)'EVENT then ... ... — BUS8(0) используется как тактовый сигнал.
288
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Îïðåäåëåíèå ôðîíòà òàêòîâîãî ñèãíàëà. Ôóíêöèÿ RISING_EDGE ïðåäñòàâëÿåò ïåðåäíèé ôðîíò èìïóëüñà, à ôóíêöèÿ FALLING_EDGE èñïîëüçóåòñÿ äëÿ îïèñàíèÿ çàäíåãî ôðîíòà òàêòîâîãî èìïóëüñà. Ôóíêöèè RISING_EDGE è FALLING_EDGE îáúÿâëÿþòñÿ â ïàêåòå STD_LOGIC_1164 (ñòàíäàðò IEEE Std 1164-1993) èëè NUMERIC_BIT, îïðåäåëåííîì â ñòàíäàðòå IEEE Std 1076.3-1997. Ñèíòàêñèñ îïðåäåëåíèÿ òàêòîâîãî ñèãíàëà èìååò âèä: clock_edge ::= RISING_EDGE(clk_signal_name) | FALLING_EDGE(clk_signal_name) clock_level and event_expr event_expr and clock_level clock_level ::= clk_signal_name = '0' | clk_signal_name = '1' event_expr ::= clk_signal_name'EVENT | not clk_signal_name'STABLE Ïåðåäíèé ôðîíò. Íèæå ïîêàçàíî çàäàíèå ïåðåäíåãî ôðîíòà òàêòîâîãî ñèãíàëà äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå óñëîâèÿ â óñëîâíîì îïåðàòîðå (IF statement). (positive
): RISING_EDGE(clk_signal_name) clk_signal_name'EVENT and clk_signal_name = '1' clk_signal_name = '1' and clk_signal_name'EVENT not clk_signal_name'STABLE and clk_signal_name = '1' clk_signal_name = '1' and not clk_signal_name'STABLE Äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå óñëîâèÿ â îïåðàòîðå WAIT UNTIL ïðèìåíÿþòñÿ ñëåäóþùèå êîíñòðóêöèè äëÿ çàäàíèÿ ïåðåäíåãî ôðîíòà: RISING_EDGE(clk_signal_name) clk_signal_name = '1' clk_signal_name'EVENT and clk_signal_name = '1' clk_signal_name = '1' and clk_signal_name'EVENT
289
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL not clk_signal_name'STABLE and clk_signal_name = '1' clk_signal_name = '1' and not clk_signal_name'STABLE Çàäíèé ôðîíò. Íèæå ïîêàçàíî çàäàíèå çàäíåãî ôðîíòà òàêòîâîãî ñèãíàëà äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå óñëîâèÿ â îïåðàòîðå (IF statement). FALLING_EDGE(clk_signal_name) clk_signal_name'EVENT and clk_signal_name = '0' clk_signal_name = '0' and clk_signal_name'EVENT not clk_signal_name'STABLE and clk_signal_name = '0' clk_signal_name = '0' and not clk_signal_name'STABLE Äëÿ èñïîëüçîâàíèÿ â êà÷åñòâå óñëîâèÿ â îïåðàòîðå WAIT UNTIL ïðèìåíÿþòñÿ ñëåäóþùèå êîíñòðóêöèè äëÿ çàäàíèÿ çàäíåãî ôðîíòà: FALLING_EDGE(clk_signal_name) clk_signal_name = '0' clk_signal_name'EVENT and clk_signal_name = '0' clk_signal_name = '0' and clk_signal_name'EVENT not clk_signal_name'STABLE and clk_signal_name = '0' clk_signal_name = '0' and not clk_signal_name'STABLE 4.12.4.2. Îïèñàíèå ñèíõðîííûõ ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ Ïðè ñèíõðîííîì íàçíà÷åíèè (Synchronous assignment) ïåðåìåííûõ èëè ñèãíàëîâ èõ èçìåíåíèå ïðîèñõîäèò ïî ôðîíòó òàêòîâîãî èìïóëüñà (Clock edge). Ñèãíàë, ìîäèôèöèðîâàííûé â ñèíõðîííîì íàçíà÷åíèè, îïèñûâàåò îäèí èëè íåñêîëüêî ñèíõðîííûõ òðèããåðîâ (Edge-sensitive storage elements). Ïåðåìåííàÿ, ìîäèôèöèðîâàííàÿ â ñèíõðîííîì íàçíà÷åíèè, ìîæåò áûòü èñïîëüçîâàíà äëÿ îïèñàíèÿ ñèíõðîííîãî òðèããåðà.  îäíîì ïðîöåññå ìîæåò áûòü èñïîëüçîâàí òîëüêî îäèí ôðîíò òàêòîâîãî ñèãíàëà. Èñïîëüçîâàíèå îïåðàòîðà IF. Äëÿ îïèñàíèÿ ñèíõðîííûõ ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ óäîáíî èñïîëüçîâàòü óñëîâíûé îïåðàòîð IF, çàäàâàÿ ôðîíò ñèãíàëà â êà÷åñòâå óñëîâèÿ (ñì. âûøå). Ïðèâåäåì òèïîâîé øàáëîí (template) äëÿ îïèñàíèÿ ñèíõðîííîãî ïîñëåäîâàòåëüíîñòíîãî óñòðîéñòâà:
290
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL process () <declarations> begin if then <sequential_statements> end if; end process; Òàêòîâûé ñèãíàë â ñåêöèè äîëæåí çàäàâàòüñÿ â ñïèñêå ñèãíàëîâ âîçáóæäåíèÿ ïðîöåññà (Process sensitivity list). Ïîñëåäîâàòåëüíîñòíûå îïåðàòîðû, ïðåäøåñòâóþùèå èëè ñëåäóþùèå çà óñëîâíûì îïåðàòîðîì, íå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. Íàïðèìåð: DFF: process(CLOCK) <declarations> begin if CLOCK’EVENT and CLOCK = '1' then Q <= D; — тактирование передним фронтом end if; end process; Èñïîëüçîâàíèå êîíñòðóêöèè WAIT. Ñèíõðîííûå ïîñëåäîâàòåëüíîñòíûå óñòðîéñòâà (Edge-sensitive storage element) ìîãóò áûòü îïèñàíû ñ èñïîëüçîâàíèåì òàêòîâîãî ñèãíàëà (Clock edge) êàê óñëîâèÿ â îïåðàòîðå WAIT UNTIL. Îïåðàòîð îæèäàíèÿ (WAIT UNTIL statement) âñåãäà ÿâëÿåòñÿ ïåðâûì îïåðàòîðîì ïðîöåññà. Â êàæäîì ïðîöåññå ìîæåò áûòü òîëüêî îäèí îïåðàòîð WAIT UNTIL. Íèæå ïðèâîäèòñÿ òèïîâîé øàáëîí äëÿ ñîçäàíèÿ îïèñàíèÿ ñèíõðîííûõ ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ ñ ïîìîùüþ îïåðàòîðà WAIT. process <declarations> begin wait until ; — должен быть первым оператором в процес се <sequential_statements> end process;
291
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîñêîëüêó îïåðàòîð WAIT UNTIL ÿâëÿåòñÿ ïåðâûì îïåðàòîðîì ïðîöåññà, àñèíõðîííûå ñáðîñ èëè óñòàíîâêà íå ìîãóò áûòü îïèñàíû ñ åãî ïîìîùüþ. Ñèãíàëû, íàçíà÷åííûå ñ ïîìîùüþ óñëîâíîãî îïåðàòîðà èëè îïåðàòîðà âûáîðà, íå ìîãóò áûòü èñïîëüçîâàíû äëÿ îïèñàíèÿ ñèíõðîííûõ ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ. Ïðèâåäåì ïðèìåð D-òðèããåðà: DFF: process begin wait until CLOCK = '0'; Q <= D; — синхронизация задним фронтом end process; Åùå îäèí ïðèìåð (ñ÷åò÷èê): process variable VAR: UNSIGNED(3 downto 0); begin wait until CLOCK = '1'; VAR := VAR + 1; COUNT <= VAR; end process; Ïåðåìåííàÿ VAR ìîæåò îïèñûâàòü ÷åòûðå òðèããåðà, ñèíõðîíèçèðîâàííûõ ïî ïåðåäíåìó ôðîíòó. 4.12.4.3. Àñèíõðîííûå ñáðîñ è óñòàíîâêà (Asynchronous set/reset)  ñõåìàõ, òàêòèðóåìûõ ôðîíòîì, âîçìîæíû àñèíõðîííûå ñáðîñ è óñòàíîâêà (Asynchronous set/reset). Íèæå ïðèâîäèòñÿ øàáëîí àñèíõðîííîãî ñáðîñà è óñòàíîâêè. process (, ) <declarations> begin if then <sequential_statements> elsif then <sequential_statements>
292
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL elsif then ... elsif then <sequential_statements> end if; end process;  âåòâÿõ îïåðàòîðà IF ïðîâåðÿåòñÿ óñëîâèå ñáðîñà èëè óñòàíîâêè. Ôðîíò òàêòîâîãî ñèãíàëà ìîæåò ïîÿâèòüñÿ òîëüêî ïðè âûïîëíåíèè óñëîâèÿ â îïåðàòîðå ELSIF. Ïîñëåäîâàòåëüíîñòíûå îïåðàòîðû (sequential statements) íå äîëæíû èñïîëüçîâàòü òàêòîâûé èìïóëüñ â óñëîâèÿõ îïåðàòîðîâ IF. Ñïèñîê ñèãíàëîâ âîçáóæäåíèÿ ïðîöåññà (sensitivity list) äîëæåí ñîäåðæàòü ñëåäóþùèå ñèãíàëû: òàêòîâûé ñèãíàë, çàäàâàåìûé ñ ïîìîùüþ ñîîòâåòñòâóþùåãî âûðàæåíèÿ; âñå ñèãíàëû, ïðîâåðÿåìûå â óñëîâèÿõ îïåðàòîðà IF, êîòîðûé ñîäåðæèò âûðàæåíèå äëÿ ôðîíòà ñèíõðîèìïóëüñà; âñå ñèãíàëû, èñïîëüçóþùèåñÿ â ïîñëåäîâàòåëüíîñòíûõ îïåðàòîðàõ, óïðàâëÿåìûõ îïåðàòîðîì IF. Ïîñëåäîâàòåëüíîñòíûå îïåðàòîðû, ïðåäøåñòâóþùèå èëè ñëåäóþùèå çà óñëîâíûì îïåðàòîðîì, íå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. Ñëåäóåò ïîìíèòü, ÷òî óñëîâèÿ àñèíõðîííîãî ñáðîñà è óñòàíîâêè íå äîëæíû ñîäåðæàòü âûðàæåíèé äëÿ ôðîíòà ñèíõðîñèãíàëà. Àñèíõðîííûå ñáðîñ èëè óñòàíîâêà èìåþò áîëåå âûñîêèé ïðèîðèòåò, ÷åì ñèíõðîñèãíàë. Î÷åâèäíî, ÷òî íå îáÿçàòåëüíî îïèñûâàòü êàê ñáðîñ, òàê è óñòàíîâêó.  70% ñëó÷àåâ äîñòàòî÷íî àñèíõðîííîãî ñáðîñà. Ïðèâåäåì ïðèìåð îïèñàíèÿ D-òðèããåðà ñ àñèíõðîííîé óñòàíîâêîé: AS_DFF: process (CLOCK, RESET, SET, SET_OR_RESET, A) begin if RESET = '1' then Q <= '0'; elsif SET = '1' then Q <= '1'; elsif SET_OR_RESET = '1' then Q <= A; elsif CLOCK'EVENT and CLOCK = '1' then
293
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Q <= D; end if; end process;  ýòîì ïðèìåðå ñèãíàë Q ñáðàñûâàåòñÿ ïî ñèãíàëó RESET è óñòàíàâëèâàåòñÿ ïî ñèãíàëó SET, ñèãíàë SET_OR_RESET ìîæåò ëèáî ñáðàñûâàòü, ëèáî óñòàíàâëèâàòü òðèããåð â çàâèñèìîñòè îò âåëè÷èíû A. 4.12.4.4. Ïîñëåäîâàòåëüíîñòíûå óçëû ñ ïîòåíöèàëüíûì óïðàâëåíèåì (Level-sensitive sequential logic) Ïîñëåäîâàòåëüíîñòíûå óçëû (Storage element), óïðàâëÿåìûå óðîâíÿìè, ìîäåëèðóþòñÿ ñ ïîìîùüþ ñèãíàëîâ èëè ïåðåìåííûõ, ïðè ýòîì âíóòðè ïðîöåññà íå äîëæíû ïðèñóòñòâîâàòü êîíñòðóêöèè, ðàáîòàþùèå ïî ôðîíòàì èìïóëüñîâ, à òàêæå â ïðîöåññå íå äîëæíî áûòü ÿâíûõ íàçíà÷åíèé ñèãíàëîâ ñ èñïîëüçîâàíèåì îïåðàòîðà íàçíà÷åíèÿ (Assignment statement). Âñå ñèãíàëû è ïåðåìåííûå, ó÷àñòâóþùèå â ïðîöåññå, äîëæíû èìåòü ÷åòêî îïðåäåëåííûå çíà÷åíèÿ. Ñèãíàëû èëè ïåðåìåííûå, íàçíà÷àåìûå â ïðîöåññå, íå äîëæíû èñïîëüçîâàòü ôðîíòû ñèíõðîèìïóëüñà.  ñïèñêå ñèãíàëîâ âîçáóæäåíèÿ ïðîöåññà (process sensitivity list) äîëæíû áûòü îòðàæåíû âñå ñèãíàëû, ó÷àñòâóþùèå â ïðîöåññå. Ïåðåìåííûå â ïîäïðîãðàììàõ íèêîãäà íå èñïîëüçóþòñÿ ïðè îïèñàíèè ïîñëåäîâàòåëüíîñòíûõ óçëîâ ñ ïîòåíöèàëüíûì óïðàâëåíèåì, ïîòîìó ÷òî ïåðåìåííûå â ïîäïðîãðàììàõ âñåãäà èíèöèàëèçèðóþòñÿ íà êàæäîì çàïðîñå. Íàçíà÷åíèÿ ñèãíàëà ñ èñïîëüçîâàíèåì îïåðàòîðîâ IF èëè CASE íå ñëåäóåò èñïîëüçîâàòü ïðè îïèñàíèè ïîñëåäîâàòåëüíîñòíûõ óçëîâ ñ ïîòåíöèàëüíûì óïðàâëåíèåì. Ðåêîìåíäóåòñÿ èçáåãàòü ñòèëÿ ìîäåëèðîâàíèÿ, â êîòîðîì çíà÷åíèå ñèãíàëà èëè ïåðåìåííîé ÷èòàåòñÿ ïåðåä åãî íàçíà÷åíèåì. Ïðèìåð ïîñëåäîâàòåëüíîñòíîãî óçëà ñ ïîòåíöèàëüíûì óïðàâëåíèåì: LEV_SENS:process (ENABLE, D) begin if ENABLE = '1' then Q <= D; end if; end process;
294
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.4.5. Ëîãèêà ñ òðåòüèì ñîñòîÿíèåì è ìîäåëèðîâàíèå øèí (Three-state and bus modeling) Òðåõñòàáèëüíàÿ øèíà ìîäåëèðóåòñÿ, êîãäà ñèãíàëó íàçíà÷àåòñÿ çíà÷åíèå 'Z', â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std 1164-1993. Íàçíà÷åíèå òðåòüåãî ñîñòîÿíèÿ ìîæåò áûòü óñëîâíûì (conditional) èëè áåçóñëîâíûì (unconditional). Äëÿ ñèãíàëîâ, èìåþùèõ íåñêîëüêî èñòî÷íèêîâ-äðàéâåðîâ (drivers), åñëè õîòÿ áû îäèí äðàéâåð èìååò òðåòüå ñîñòîÿíèå, òî îñòàëüíûå ñèãíàëû-äðàéâåðû äîëæíû èìåòü ïî êðàéíåé ìåðå îäíî íàçíà÷åíèå â 'Z'-ñîñòîÿíèå. Ñëåäóåò çàìåòèòü, ÷òî, åñëè îáúåêò íàçíà÷åí â 'Z'-ñîñòîÿíèå â ïðîöåññå, èíèöèàëèçèðóåìîì ôðîíòîì èëè óðîâíåì, ñðåäñòâà ñèíòåçà ìîãóò ââåñòè òðèããåðû íà âñåõ âõîäàõ óñòðîéñòâà â òðåòüå ñîñòîÿíèå. 4.12.4.6. Îïèñàíèå êîìáèíàöèîííûõ ëîãè÷åñêèõ ñõåì (Modeling combinational logic) Ëþáîé ïðîöåññ, íå ñîäåðæàùèé òàêòîâûõ èìïóëüñîâ èëè îïåðàòîðà îæèäàíèÿ, îïèñûâàåòñÿ èëè ñ èñïîëüçîâàíèåì êîíñòðóêöèé êîìáèíàöèîííîé ëîãèêè, èëè ïîñëåäîâàòåëüíîñòíûõ ñõåì, óïðàâëÿåìûõ óðîâíÿìè. Åñëè íàçíà÷åíèå ïåðåìåííîé èëè ñèãíàëà ïðîèñõîäèò âî âñåõ âîçìîæíûõ âàðèàíòàõ âûïîëíåíèÿ ïðîöåññà è âñå ïåðåìåííûå è ñèãíàëû èìåþò îïðåäåëåííûå çíà÷åíèÿ, òî ïåðåìåííàÿ èëè ñèãíàë îïèñûâàþò êîìáèíàöèîííóþ ëîãèêó. Åñëè ñèãíàë èëè ïåðåìåííàÿ ñ÷èòûâàþòñÿ äî èõ èçìåíåíèÿ, òî îíè ìîãóò áûòü èñïîëüçîâàíû äëÿ îïèñàíèÿ êîìáèíàöèîííîé ëîãèêè. Îïåðàòîð ïàðàëëåëüíîãî íàçíà÷åíèÿ ñèãíàëîâ (Concurrent signal assignment statements) âñåãäà îïèñûâàåò êîìáèíàöèîííóþ ñõåìó. Ñïèñîê ÷óâñòâèòåëüíîñòè (ñèãíàëîâ âîçáóæäåíèÿ) ïðîöåññà (process sensitivity list) äîëæåí ñîäåðæàòü âñå ñèãíàëû, âëèÿþùèå íà ïðîöåññ.
4.12.5. Äèðåêòèâû êîìïèëÿòîðà (ïñåâäîêîììåíòàðèè, Pragmas) Ïñåâäîêîììåíòàðèè âëèÿþò íà ñïîñîá ñèíòåçà ìîäåëè. Â VHDL ïðèíÿòû ñëåäóþùèå ïñåâäîêîììåíòàðèè (Pragmas) àòðèáóòû (Attributes) è ìåòàêîììåíòàðèè (Metacomments).
295
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.5.1. Àòðèáóòû êîìïèëÿòîðà (Attributes) Àòðèáóòû êîìïèëÿòîðà íå ñëåäóåò ïóòàòü ñ àòðèáóòàìè ñèãíàëîâ ýòî «äâå áîëüøèå ðàçíèöû». Ïåðâûå èñïîëüçóþòñÿ äëÿ êîäèðîâàíèÿ ïðåäñòàâëåíèé ïåðå÷èñëèìûõ òèïîâ, à àòðèáóòû ñèãíàëîâ îïðåäåëÿþò ñâîéñòâà ñèãíàëà åãî èçìåíåíèå è ò.ï. Àòðèáóò êîìïèëÿòîðà ENUM_ENCODING. Àòðèáóò ENUM_ENCODING îïðåäåëÿåò ñïîñîá êîäèðîâàíèÿ çíà÷åíèé ïåðå÷èñëèìûõ òèïîâ.  îïðåäåëåíèè ýòîãî àòðèáóòà çàäàåòñÿ ïðåäñòàâëåíèå ëèòåðàëîâ ïåðå÷èñëèìûõ òèïîâ â ôîðìå ñòðîêè. Ñòðîêà ñîñòîèò èç ñèìâîëîâ, ðàçäåëåííûõ îäíèì èëè íåñêîëüêèìè ïðîáåëàìè. ×èñëî ñèìâîëîâ äîëæíî ñîîòâåòñòâîâàòü ÷èñëó ëèòåðàëîâ â ïåðå÷èñëèìîì òèïå. Kàæäûé ñèìâîë ñîñòîèò èç ïîñëåäîâàòåëüíîñòè '0' è '1'. Ñèìâîë '0', î÷åâèäíî, îçíà÷àåò ÍÈÇKÈÉ ëîãè÷åñêèé óðîâåíü, ñèìâîë '1' ÂÛÑÎKÈÉ. Ðàññìîòðèì ïðèìåð îáúÿâëåíèÿ àòðèáóòà: type <enumeration_type> is (<enum_lit1>, <enum_lit2>, ... <enum_litN>); attribute ENUM_ENCODING: STRING; Ñïåöèôèêàöèÿ àòðèáóòà îïðåäåëÿåò êîäèðîâàíèå äëÿ ïåðå÷èñëåíèÿ ëèòåðàëîâ. attribute ENUM_ENCODING of <enumeration_type>: type is «<space><space>... »; Ñèìâîë çàäàåò ïðåäñòàâëåíèå <enum_lit1>, è ò.ä. Ñëåäóåò ïîìíèòü, ÷òî èñïîëüçîâàíèå ýòîãî àòðèáóòà ïðèâîäèò ê íåñîîòâåòñòâèÿì ìîäåëèðîâàíèÿ, íàïðèìåð, ïðè èñïîëüçîâàíèè îïåðàòîðîâ îòíîøåíèÿ. Íàïðèìåð: attribute ENUM_ENCODING: string; type COLOR is (RED, GREEN, BLUE, YELLOW, ORANGE); attribute ENUM_ENCODING of COLOR: type is «10000 01000 00100 00010 00001»; ïåðå÷èñëèìûé ëèòåðàë RED ïðåäñòàâëÿåòñÿ êàê 10000, GREEN êàê 01000, è ò.ä.
296
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.5.2. Ìåòàêîììåíòàðèè (Metacomments) Ìåòàêîììåíòàðèè èñïîëüçóþòñÿ äëÿ óïðàâëåíèÿ êîìïèëÿöèåé. Ñóùåñòâóþò äâà òèïà ìåòàêîììåíòàðèåâ: RTL_SYNTHESIS OFF RTL_SYNTHESIS ON Ñðåäñòâà ñèíòåçà èãíîðèðóþò ëþáîå îïèñàíèå íà VHDL ïîñëå äèðåêòèâû «RTL_SYNTHESIS OFF» è âîçîáíîâëÿþò ïðîöåññ ñèíòåçà ïî äèðåêòèâå «RTL_SYNTHESIS ON».
4.12.6. Ñèíòàêñèñ ñèíòåçèðóåìîãî ïîäìíîæåñòâà VHDL 4.12.6.1. Îïèñàíèå èíòåðôåéñà (Entity declarations) entity_declaration ::= entity identifier is entity_header entity_declarative_part [ begin entity_statement_part ] end [ entity ] [ entity_simple_name ] ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • entity_declaration Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • entity_statement_part Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • entity_declarative_part • Çàðåçåðâèðîâàííîå ñëîâî entity ïîñëå end. Íàïðèìåð: library IEEE; use IEEE.std_Logic_1164.all; entity E is generic(DEPTH : Integer := 8); port (CLOCK : in std_logic; RESET : in std_logic; A :in std_logic_vector(7 downto 0);
297
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL B :inout std_logic_vector(7 downto 0); C :out std_logic_vector(7 downto 0)); end E; 4.12.6.2. Çàãîëîâîê èíòåðôåéñà (Entity header) entity_header ::= [ formal_generic_clause ] [ formal_port_clause ] generic_clause ::= generic(generic_list); port_clause ::= port(port_list); Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • entity_header • generic_clause • port_clause 4.12.6.3.Íàñòðàèâàåìûå òèïû (Generics) generic_list ::= generic_interface_list Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè generic_list 4.12.6.4. Ïîðòû (Ports) port_list ::= port_interface_list Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • port_list Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • íà÷àëüíûå çíà÷åíèÿ â ñïèñêå ïîðòîâ (port_list) 4.12.6.5. Îïèñàíèå èíòåðôåéñíîé ÷àñòè (Entity declarative part) entity_declarative_part ::= { entity_declarative_item } entity_declarative_item :: subprogram_declaration | subprogram_body | type_declaration
298
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | | | | | | | | | | | |
subtype_declaration constant_declaration signal_declaration shared_variable_declaration file_declaration alias_declaration attribute_declaration attribute_specification disconnection_specification use_clause group_template_declaration group_declaration
Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè entity_declarative_part entity_declarative_item 4.12.6.6. Îïèñàíèå îïåðàòîðîâ èíòåðôåéñà (Entity statement part) entity_statement_part ::= { entity_statement } entity_statement ::= concurrent_assertion_statement | passive_concurrent_procedure_call | passive_process_statement Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • entity_statement_part • entity_statement Îïèñàíèå îïåðàòîðîâ èíòåðôåéñà (Entity statement part) èñïîëüçóåòñÿ äëÿ êîíòðîëÿ ìîäåëèðîâàíèÿ. Îíî íå ìîæåò çàäàâàòü ñèãíàëû â àðõèòåêòóðíîì òåëå è ñîîòâåòñòâåííî íå îêàçûâàåò âëèÿíèå íà ïîâåäåíèå àðõèòåêòóðíîãî òåëà. 4.12.6.7. Àðõèòåêòóðíûå òåëà (Architecture bodies) architecture_body ::= architecture identifier of entity_name is architecture_declarative_part begin
299
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL [ architecture_statement_part ] end [ architecture ] [ architecture_simple_name ] ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • architecture_body • ìíîæåñòâåííûå àðõèòåêòóðû (Multiple Architectures) Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • ãëîáàëüíûå âçàèìîäåéñòâèÿ ñèãíàëîâ ìåæäó ñèíòåçèðóåìûìè àðõèòåêòóðíûìè òåëàìè • çàðåçåðâèðîâàííîå ñëîâî architecture ïîñëå çàðåçåðâèðîâàííîãî ñëîâà end 4.12.6.8. Îáúÿâëåíèå àðõèòåêòóðû (Architecture declarative part) architecture_declarative_part ::= { block_declarative_item } block_declarative_item ::= subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | signal_declaration | shared_variable_declaration | file_declaration | alias_declaration | component_declaration | attribute_declaration | attribute_specification | configuration_specification | disconnection_specification | use_clause | group_template_declaration | group_declaration Ïîääåðæèâàåìûå êîíñòðóêöèè: • architecture_declarative_part • block_declarative_item
300
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • alias_declaration • configuration_specification • disconnection_specification • îïðåäåëåííûå ïîëüçîâàòåëåì àòðèáóòû Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • shared_variable_declaration • file_declaration • group_template_declaration • group_declaration 4.12.6.9. Îïåðàòîðû àðõèòåêòóðû (Architecture statement part) architecture_statement_part ::= { concurrent_statement } Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • architecture_statement_part 4.12.6.10. Îáúÿâëåíèå êîíôèãóðàöèè (Configuration declaration) configuration_declaration ::= configuration identifier of entity_name is configuration_declarative_part block_configuration end [configuration] [ configuration_simple_name]; configuration_declarative_part ::= { configuration_declarative_item } configuration_declarative_item ::= use_clause | attribute_specification | group_declaration Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • configuration_declaration Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • configuration_declarative_part • configuration_declarative_item • çàðåçåðâèðîâàííîå ñëîâî configuration ïîñëå çàðåçåðâèðîâàííîãî ñëîâà end
301
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Îáúÿâëåíèå êîíôèãóðàöèè ïîääåðæèâàåòñÿ äëÿ ðàñøèðåíèÿ âîçìîæíîñòåé îïèñàíèÿ àðõèòåêòóðû â ìíîãîóðîâíåâûõ èåðàðõè÷åñêèõ ïðîåêòàõ. 4.12.6.11. Kîíôèãóðàöèÿ áëîêà (Block configuration) block_configuration ::= for block_specification { use_clause } { configuration_item } end for ; block_specification ::= architecture_name | block_statement_label | generate_statement_label [ (index_specification) ] index_specification ::= discrete_range | static_expresion configuration_item ::= block_configuration | component_configuration Ïîääåðæèâàåìûå êîíñòðóêöèè: • block_configuration • block_specification Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • use_clause • index_specification • configuration_item • block_statement_label • generate_statement_label 4.12.6.12. Kîíôèãóðàöèÿ êîìïîíåíòà (Component configuration) component_configuration ::= for component_specification [ binding_indication ; ] [ block_configuration ] end for ;
302
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • component_configuration 4.12.6.13. Îáúÿâëåíèå ïîäïðîãðàìì (Subprogram declarations) subprogram_declaration ::= subprogram_specification ; subprogram_specification ::= procedure designator [ (formal_parameter_list) ] | [ pure | impure ] function designator [ (for mal_parameter_list) ] return type_mark designator ::= identifier | operator_symbol operator_symbol ::= string_literal Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • subprogram_declaration • subprogram_specification • designator • operator_symbol Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • çàðåçåðâèðîâàííûå ñëîâà pure è impure 4.12.6.14. Ôîðìàëüíûå ïàðàìåòðû (Formal parameters) formal_parameter_list ::= parameter_interface_list Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • formal_parameter_list Çíà÷åíèÿ ïî óìîë÷àíèþ äëÿ ôîðìàëüíûõ ïàðàìåòðîâ èãíîðèðóþòñÿ ñðåäñòâàìè ñèíòåçà. Ïåðåìåííûå, êîíñòàíòû è ñèãíàëû êàê ïàðàìåòðû ïîäïðîãðàìì ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà, â òî âðåìÿ êàê ôàéëû íå ìîãóò áûòü ïàðàìåòðàìè ñèíòåçèðóåìûõ ïîäïðîãðàìì. 4.12.6.15. Òåëî ïîäïðîãðàììû (Subprogram bodies) subprogram_body ::= subprogram_specification is subprogram_declarative_part begin
303
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL [ subprogram_statement_part ] end [ subprogram_kind ] [ designator ] ; subprogram_declarative_part ::= { subprogram_declarative_item } subprogram_declarative_item ::= subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | variable_declaration | file_declaration | alias_declaration | attribute_declaration | attribute_specification | use_clause | group_template_declaration | group_declaration subprogram_statement_part ::= { sequential_statement } subprogram_kind ::= procedure | function Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • subprogram_body • subprogram_declarative_part • subprogram_declarative_item • subprogram_statement_part Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • file_declaration • alias_declaration Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • subprogram_kind • group_template_declaration • group_declaration Äðóãèå îáúÿâëåíèÿ àòðèáóòîâ èãíîðèðóþòñÿ ïðè ñèíòåçå. Ðåêóðñèâíûé âûçîâ ïîäïðîãðàìì ïîääåðæèâàåòñÿ â òîì ñëó÷àå, åñëè îí ñòàòè÷åí.
304
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.16. Ïåðåãðóçêà ïîäïðîãðàìì (Subprogram overloading) Îïåðàòîð ïåðåãðóçêè ïîäïðîãðàìì (Operator overloading) ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. Ñèãíàòóðû (signatures) íå ñèíòåçèðóþòñÿ. 4.12.6.17. Ðàçðåøàþùèå ôóíêöèè (Resolution functions) Ôóíêöèè ðàçðåøåíèÿ èãíîðèðóþòñÿ êîìïèëÿòîðîì ïðè ñèíòåçå. Ôóíêöèÿ ðàçðåøåíèÿ RESOLVED ïîääåðæèâàåòñÿ â ïîäòèïå STD_LOGIC. 4.12.6.18. Îáúÿâëåíèå ïàêåòà (Package declarations) package_declaration ::= package identifier is package_declarative_part end [ package ] [ package_simple_name ] ; package_declarative_part ::= { package_declarative_item } package_declarative_item ::= subprogram_declaration | type_declaration | subtype_declaration | constant_declaration | signal_declaration | shared_variable_declaration | file_declaration | alias_declaration | component_declaration | attribute_declaration | attribute_specification | disconnection_specification | use_clause | group_template_declaration | group_declaration Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • package_declaration • package_declarative_part • package_declarative_item
305
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • file_declaration • alias_declaration • disconnection_specification • îïðåäåëåííûå ïîëüçîâàòåëåì îáúÿâëåíèÿ àòðèáóòîâ è èõ îïèñàíèÿ Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • çàðåçåðâèðîâàííîå ñëîâî package ïîñëå end • shared_variable_declaration • group_template_declaration • group_declaration Îáúÿâëåíèÿ cèãíàëîâ äîëæíû ñîäåðæàòü åãî íà÷àëüíîå çíà÷åíèå. Kðîìå òîãî, ñèãíàë, îáúÿâëåííûé â ïàêåòå, íå äîëæåí èìåòü íèêàêèõ èñòî÷íèêîâ. Îïèñàíèå êîíñòàíòû äîëæíî âêëþ÷àòü íà÷àëüíîå çíà÷åíèå. 4.12.6.19. Òåëî ïàêåòà (Package bodies) package_body ::= package body package_simple_name is package_body_declarative_part end [ package body ] [ package_simple_name ] ; package_body_declarative_part ::= { package_body_declarative_item } package_body_declarative_item ::= subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | shared_variable_declaration | file_declaration | alias_declaration | use_clause | group_template_declaration | group_declaration Ïîääåðæèâàåìûå êîíñòðóêöèè: • package_body • package_body_declarative_part
306
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL • package_body_declarative_item Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • alias_declaration • file_declaration Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • shared_variable_declaration • group_template_declaration • group_declaration • çàðåçåðâèðîâàííîå ñëîâî package body ïîñëå çàðåçåðâèðîâàííîãî ñëîâà end 4.12.6.20. Ñêàëÿðíûå òèïû (Scalar types) scalar_type_definition ::= enumeration_type_definition | integer_type_definition | physical_type_definition | floating_type_definition range_constraint ::= range range range ::= range_attribute_name | simple_expression direction simple_expression direction ::= to | downto Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • scalar_type_definition • range_constraint • range • direction Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • physical_type_definition • floating_type_definition Ïóñòîé äèàïàçîí (null ranges) íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.21. Ïåðå÷èñëèìûå òèïû (Enumeration types) enumeration_type_definition ::= (enumeration_literal {, enumeration_literal }) enumeration_literal ::= identifier | character_literal
307
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • enumeration_type_definition • enumeration_literal Ýëåìåíòû òèïîâ BIT, BOOLEAN è STD_ULOGIC äîëæíû áûòü îïðåäåëåíû êàê îäíîáèòíûå â ñîîòâåòñòâèè ñî ñòàíäàðòîì IEEE Std 1076.31997. Ñðåäñòâà ñèíòåçà ìîãóò èìåòü ïðåäîïðåäåëåííûå çíà÷åíèÿ è äëÿ äðóãèõ ïåðå÷èñëèìûõ òèïîâ. Ïîëüçîâàòåëü òàêæå ìîæåò ïåðåîïðåäåëèòü èõ ñ èñïîëüçîâàíèåì àòðèáóòà ENUM_ENCODING. 4.12.6.22. Ïðåäîïðåäåëåííûå ïåðå÷èñëèìûå òèïû (Predefined enumeration types) Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • character Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • severity_level Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • file_open_kind • file_open_status 4.12.6.23. Öåëî÷èñëåííûå òèïû (Integer types) integer_type_definition ::= range_constraint Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • integer_type_definition Ðåêîìåíäóåòñÿ ïðåîáðàçîâûâàòü ñîîòâåòñòâóþùèé öåëûé ñèãíàë èëè ïåðåìåííóþ â áèò-âåêòîð (vector of bits) ñîîòâåòñòâóþùåé äëèíû. Åñëè íå èñïîëüçóþòñÿ îòðèöàòåëüíûå ÷èñëà, òî ñèãíàë èëè ïåðåìåííàÿ äîëæíû èìåòü áåççíàêîâîå äâîè÷íîå ïðåäñòàâëåíèå (unsigned binary representation), â ïðîòèâíîì ñëó÷àå èñïîëüçóåòñÿ äîïîëíèòåëüíûé êîä (twos-complement implementation). Åñòåñòâåííî, ñëåäóåò ñòðåìèòüñÿ ê òîìó, ÷òîáû ðàçìåðíîñòü âåêòîðà áûëà ìèíèìàëüíî íåîáõîäèìîé. Ñðåäñòâà ñèíòåçà äîëæíû ïîääåðæèâàòü ïîëîæèòåëüíûå, îòðèöàòåëüíûå öåëûå ÷èñëà â äèàïàçîíå îò 2 147 483 648 äî +2 147 483 647, ÷òî ñîîòâåòñòâóåò 32-áèòíîé öåëî÷èñëåííîé àðèôìåòèêå â äîïîëíèòåëüíîì êîäå. Ïîäòèïû NATURAL è POSITIVE ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà.
308
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.24. Ôèçè÷åñêèå òèïû (Physical types) physical_type_definition ::= range_constraint units primary_unit_declaration { secondary_unit_declaration } end units [ physical_type_simple_name ] primary_unit_declaration ::= identifier secondary_unit_declaration ::= identifier = physi cal_literal ; physical_literal ::= [ abstract_literal ] unit_name Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • physical_type_definition • physical_literal Ïîääåðæèâàåòñÿ òîëüêî òèï TIME, ïðè ýòîì êîíñòðóêöèè òèïà after èãíîðèðóþòñÿ. 4.12.6.25. Òèïû ñ ïëàâàþùåé òî÷êîé (Floating point types) floating_type_definition ::= range_constraint Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • floating_type_definition Kîíñòðóêöèè, èñïîëüçóþùèå âåùåñòâåííûå òèïû äàííûõ, èãíîðèðóþòñÿ êîìïèëÿòîðîì. 4.12.6.26. Ñìåøàííûå òèïû (Composite types) composite_type_definition ::= array_type_definition | record_type_definition Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • composite_type_definition 4.12.6.27. Âåêòîðíûå òèïû (Array types) array_type_definition ::= unconstrained_array_definition | constrained_array_definition
309
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL unconstrained_array_definition ::= array (index_subtype_definition {, index_subtype_definition }) of element_subtype_indication constrained_array_definition ::= array index_constraint of element_subtype_indica tion index_subtype_definition ::= type_mark range <> index_constraint ::= (discrete_range {, discrete_range }) discrete_range ::= discrete_subtype_indication | range range ::= range_attribute_name | simple_expression direction simple_expression Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • array_type_definition • unconstrained_array_definition • constrained_array_definition • index_subtype_definition • index_constraint • discrete_range Ñèíòåçèðóþòñÿ òîëüêî îäíîìåðíûå ìàññèâû. Äèàïàçîí âåêòîðíîãî òèïà çàäàåòñÿ öåëûì ÷èñëîì. Ïóñòîé äèàïàçîí (null range) íå ñèíòåçèðóåòñÿ. Ñðåäñòâà ñèíòåçà ïîääåðæèâàþò òîëüêî îäíî èíäåêñíîå îïðåäåëåíèå ïîäòèïà. Âûðàæåíèå äëÿ äèàïàçîíà äîëæíî âîçâðàòèòü öåëî÷èñëåííûå çíà÷åíèÿ. 4.12.6.28. Îãðàíè÷åíèÿ èíäåêñà è äèñêðåòíûå äèàïàçîíû (Index constraints and discrete ranges) Ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.29. Ïðåäîïðåäåëåííûé âåêòîð (Predefined array types) Ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.30. Çàïèñè (Record types) record_type_definition ::= record
310
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL element_declaration { element_declaration } end record [ record_type_simple_name ] element_declaration ::= identifier_list : ele ment_subtype_definition ; identifier_list ::= identifier {, identifier } element_subtype_definition ::= subtype_indication Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • record_type_definition • element_declaration • identifier_list • element_subtype_definition 4.12.6.31. Òèïû äîñòóïà (Access types) access_type_definition ::= access subtype_indica tion Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • access_type_definition Ñðåäñòâà ñèíòåçà íå ïîääåðæèâàþò òèïû äîñòóïà. 4.12.6.32. Íåïîëíîå îáúÿâëåíèå òèïîâ (Incomplete type declarations) incomplete_type_declaration ::= type identifier ; Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • incomplete_type_declaration Íåïîëíîå îáúÿâëåíèå òèïîâ íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.33. Ðàñïðåäåëåíèå îáúåêòîâ (Allocation and deallocation of objects) Ðàñïðåäåëåíèå îáúåêòîâ íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.34. Ôàéëîâûå òèïû (File types) file_type_definition ::= file of type_mark Ôàéëîâûå òèïû íå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà.
311
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.35. Îïåðàöèè íàä ôàéëàìè (File operations) Íå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè. 4.12.6.36. Îáúÿâëåíèÿ (declarations) declaration ::= type_declaration | subtype_declaration | object_declaration | interface_declaration | alias_declaration | attribute_declaration | component_declaration | group_template_declaration | group_declaration | entity_declaration | configuration_declaration | subprogram_declaration | package_declaration Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • declaration Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • alias_declaration Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • group_template_declaration • group_declaration 4.12.6.37. Îáúÿâëåíèå òèïîâ (type declarations) type_declaration ::= full_type_declaration | incomplete_type_declaration full_type_declaration ::= type identifier is type_definition ; type_definition ::= scalar_type_definition | composite_type_definition
312
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | access_type_definition | file_type_definition Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • type_declaration • full_type_declaration • type_definition Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • incomplete_type_declaration • access_type_definition • file_type_definition 4.12.6.38. Îáúÿâëåíèå ïîäòèïîâ (subtype declarations) subtype_declaration ::= subtype identifier is subtype_indication ; subtype_indication ::= [ resolution_function_name ] type_mark [ constraint ] type_mark ::= type_name | subtype_name constraint ::= range_constraint | index_constraint Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • subtype_declaration • subtype_indication • type_mark • constraint Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • îïðåäåëåííûå ïîëüçîâàòåëåì ôóíêöèè ðàçðåøåíèÿ (user-defined resolution functions) 4.12.6.39. Îáúÿâëåíèå îáúåêòîâ (Object declarations) object_declaration ::= constant_declaration | signal_declaration
313
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | variable_declaration | file_declaration Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • object_declaration Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • file_declaration 4.12.6.40. Îáúÿâëåíèå êîíñòàíò (Constant declarations) constant_declaration ::= constant identifier_list : subtype_indication := expression ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • constant_declaration Kîñâåííîå îáúÿâëåíèå êîíñòàíò íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà, ïîýòîìó âûðàæåíèÿ äîëæíû áûòü âêëþ÷åíû â îáúÿâëåíèå êîíñòàíòû. 4.12.6.41. Îáúÿâëåíèå ñèãíàëîâ (Signal declarations) signal_declaration ::= signal identifier_list : subtype_indication [sig nal_kind][:= expression]; signal_kind ::= register | bus Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • signal_declaration Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • expression Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • signal_kind Íà÷àëüíîå çíà÷åíèå âûðàæåíèÿ èãíîðèðóåòñÿ, çà èñêëþ÷åíèåì îáúÿâëåíèÿ ïàêåòà (package). Íàçíà÷åíèå ñèãíàëà, îáúÿâëåííîãî â ïàêåòå (package), íå ïîääåðæèâàåòñÿ ïðè ñèíòåçå. 4.12.6.42. Îáúÿâëåíèå ïåðåìåííûõ (Variable declarations) variable_declaration ::=
314
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL [shared] variable identifier_list : subtype_indication [:= expression] ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • variable_declaration Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • expression Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • çàðåçåðâèðîâàííîå ñëîâî shared Çàðåçåðâèðîâàííîå ñëîâî shared íå ïîääåðæèâàåòñÿ. Íà÷àëüíûå çíà÷åíèÿ èãíîðèðóþòñÿ. Èñïîëüçîâàíèå îáúåêòîâ äîñòóïà òàêæå íå ïîääåðæèâàåòñÿ ñèíòåçàòîðàìè. 4.12.6.43. Îáúÿâëåíèå ôàéëà (File declarations) file_declaration ::= file identifier_list : subtype_indication [ file_open_information ] ; file_open_information ::= [ open file_open_kind_expression ] is file_logical_name file_logical_name ::= string_expression Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • file_declaration Èñïîëüçîâàíèå ôàéëîâ íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.44. Îáúÿâëåíèå èíòåðôåéñà(Interface declarations) interface_declaration ::= interface_constant_declaration | interface_signal_declaration | interface_variable_declaration | interface_file_declaration interface_constant_declaration ::= [constant] identifier_list : [in] subtype_indication [:= static_expression] interface_signal_declaration ::= [signal] identifier_list : [mode] subtype_indication [bus]
315
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL [:= static_expression] interface_variable_declaration ::= [variable] identifier_list : [mode] subtype_indication [:= static_expression] interface_file_declaration ::= file identifier_list : subtype_indication mode ::= in | out | inout | buffer | linkage Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • interface_declaration • interface_constant_declaration • interface_signal_declaration • interface_variable_declaration Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • static_expression Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • interface_file_declaration • ðåæèì linkage • çàðåçåðâèðîâàííîå ñëîâî bus 4.12.6.45. Ñïèñîê èíòåðôåéñà (Interface lists) interface_list ::= interface_element {; interface_element} interface_element ::= interface_declaration Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • interface_list • interface_element 4.12.6.46. Ñïèñîê àññîöèàöèé (Association lists) association_list ::= association_element {, association_element} association_element ::= [formal_part =>] actual_part formal_part ::= formal_designator
316
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | function_name(formal_designator) | type_mark(formal_designator) formal_designator ::= generic_name | port_name | parameter_name actual_part ::= actual_designator | function_name(actual_designator) | type_mark(actual_designator) actual_designator ::= expression | signal_name | variable_name | file_name | open Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • association_list • association_element • formal_part • formal_designator • actual_part • actual_designator Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • function_name • type_mark • file_name 4.12.6.47. Îáúÿâëåíèå ïñåâäîíèìîâ (Alias declarations) alias_declaration ::= alias alias_designator [: subtype_indication] is name [signature]; alias_designator ::= identifier | character_lite ral | operator_symbol
317
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • alias_declaration • alias_designator Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • signature Èñïîëüçîâàíèå ïñåâäîíèìîâ íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.48. Îáúÿâëåíèå àòðèáóòîâ (Attribute declarations) attribute_declaration ::= attribute identifier : type_mark ; Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • attribute_declaration Ïîääåðæèâàþòñÿ íå âñå àòðèáóòû, îïðåäåëåííûå â ÿçûêå. 4.12.6.49. Îáúÿâëåíèå êîìïîíåíòîâ (Component declarations) component_declaration ::= component identifier [is] [local_generic_clause] [local_port_clause] end component [component_simple_name]; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • component_declaration Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • çàðåçåðâèðîâàííîå ñëîâî is • component_simple_name 4.12.6.50. Îáúÿâëåíèå øàáëîíà ãðóïïû (Group template declarations) group_template_declaration ::= group identifier is (entity_class_entry_list) ; entity_class_entry_list ::= entity_class_entry {, entity_class_entry } entity_class_entry ::= enitity_class [<>]
318
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • group_template_declaration • entity_class_entry_list • entity_class_entry 4.12.6.51. Îáúÿâëåíèå ãðóïïû (Group declarations) group_declarataion ::= group identifier : group_template_name(group_con situent_list); group_constituent_list ::= group_constituent {, group_constituent } group_constituent ::= name | character_literal Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • group_declaration • group_constituent_list • group_constituent 4.12.6.52. Îïðåäåëåíèå àòðèáóòîâ (Attribute specification) attribute_specification ::= attribute attribute_designator of entity_specifica tion is expression; entity_specification ::= entity_name_list : entity_class entity_class ::= entity| architecture| configuration | procedure| function| package | type| subtype| constant | signal| variable| component | label| literal| units | group| file entity_name_list ::= entity_designator {, entity_designator} | others | all entity_designator ::= entity_tag [signature] entity_tag ::= simple_name | character_literal | operator_symbol
319
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • attribute_specification • entity_specification • entity_class • entity_name_list • entity_designator • entity_tag Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • îáúÿâëåíèå àòðèáóòîâ ïîëüçîâàòåëÿ Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • signature • èíòåðôåéñû group è file • èñïîëüçîâàíèå àòðèáóòîâ ïîëüçîâàòåëÿ • çàðåçåðâèðîâàííûå ñëîâà other è all â ñïèñêå èòåðôåéñà 4.12.6.53. Îïðåäåëåíèå êîíôèãóðàöèè (Configuration specification) configuration_specification ::= for component_specification binding_indication; component_specification ::= instantiation_list : component_name instantiation_list ::= instantiation_label {, instantiation_label} | others | all Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • configuration_specification • component_specification • instantiation_list 4.12.6.54. Èíäèêàöèÿ ñâÿçåé (Binding indication) binding_indication ::= [ use entity_aspect ] [ port_map_aspect ] Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • binding_indication
320
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • generic_map_aspect • port_map_aspect 4.12.6.55. Èíäèêàöèÿ ñâÿçåé ïî óìîë÷àíèþ (Default binding indication) Ïîääåðæèâàåòñÿ êîìïèëÿòîðîì. 4.12.6.56. Îïðåäåëåíèå ðàçðûâà ñâÿçè (Disconnection specification) Íå ïîääåðæèâàåòñÿ ïðè ñèíòåçå. 4.12.6.57. Èìåíà (names) name ::= simple_name | operator_symbol | selected_name | indexed_name | slice_name | attribute_name prefix ::= name | function_call Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • name • prefix 4.12.6.58. Ïðîñòûå èìåíà (Simple names) simple_name ::= identifier: Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • simple_name 4.12.6.59. Âûáðàííûå èìåíà (Selected names) selected_name ::= prefix.suffix suffix ::=
321
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL simple_name | character_literal | operator_symbol | all Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • selected_name • suffix 4.12.6.60. Èíäåêñèðîâàííûå èìåíà (Indexed names) indexed_name ::= prefix (expression {, expression }) Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • indexed_name Èñïîëüçîâàíèå èíäåêñèðóåìûõ èìåí â ïðîöåäóðàõ íå ñèíòåçèðóåòñÿ. 4.12.6.61. Èìåíà ÷àñòè ìàññèâà (Slice names) slice_name ::= prefix (discrete_range) Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • slice_name Èñïîëüçîâàíèå èìåí ÷àñòè ìàññèâà (slice name) ïðè íåîãðàíè÷åííûõ ïàðàìåòðàõ íå ïîääåðæèâàåòñÿ. Íóëåâîé äèàïàçîí èíäåêñîâ ÷àñòè ìàññèâà (Null slices) òàêæå íå ìîæåò áûòü ñèíòåçèðîâàí. 4.12.6.62. Èìåíà àòðèáóòîâ (Attribute names) attribute_name ::= prefix [signature]’attribute_designator [ (expres sion) ] attribute_designator ::= attribute_simple_name Ïîääåðæèâàþòñÿ ñëåäóþùèå èäåíòèôèêàòîðû àòðèáóòîâ: • 'base • 'left • 'right • 'high • 'low • 'range
322
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL • 'reverse_range • 'length • 'event • 'stable Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • attribute_name • attribute_designator Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • signature • expression 4.12.6.63. Âûðàæåíèÿ (Expressions) expression ::= relation { and relation } | relation { or relation } | relation { xor relation } | relation [ nand relation ] | relation [ nor relation ] | relation { xnor relation } relation ::= shift_expression [ relational_operator shift_expression ] shift_expression ::= simple_expression [ shift_operator simple_expres sion ] simple_expression ::= [ sign ] term { adding_operator term } term ::= factor { multiplying_operator factor } factor ::= primary [ ** primary ] | abs primary | not primary primary ::= name | literal | aggregate
323
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | function_call | qualified_expression | type_conversion | allocator | (expression): Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • expression • relation • shift_expression • simple_expression • term • factor • primary Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • îïåðàòîð xnor • âñå îïåðàòîðû ñäâèãà 4.12.6.64. Îïåðàòîðû (operators) logical_operator ::= and | or | nand | nor | xor | xnor relational_operator ::= = | /= | < | <= | > | >= shift_operator ::= sll | srl | sla | sra | rol | ror adding_operator ::= + | | & sign ::= + | multiplying_ operator ::= * | / | mod | rem miscellaneous_operator ::= ** | abs | not Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • logical_operator • relational_operator • adding_operator • sign • multiplying_operator • miscellaneous_operator Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • îïåðàòîð xnor • îïåðàòîðû ñäâèãà (SHIFT operator)
324
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.65. Ëîãè÷åñêèå îïåðàòîðû (LOGICAL operators) Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • îïåðàòîð xnor 4.12.6.66. Îïåðàòîðû îòíîøåíèÿ (RELATIONAL operators) Ïîääåðæèâàþòñÿ áåç îãðàíè÷åíèÿ âñåìè ñðåäñòâàìè ñèíòåçà. Èñïîëüçîâàíèå ëîãè÷åñêèõ îïåðàòîðîâ äëÿ ïåðå÷èñëèìûõ òèïîâ âîçìîæíî â ñëó÷àå ïðèìåíåíèÿ àòðèáóòà êîìïèëÿòîðà ENUM_ENCODING. 4.12.6.67. Îïåðàòîðû ñäâèãà (SHIFT operators) Îïåðàòîðû ñäâèãà íå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.68. Îïåðàòîðû ñëîæåíèÿ (ADDING operators) Ïîääåðæèâàþòñÿ áåç îãðàíè÷åíèÿ âñåìè ñðåäñòâàìè ñèíòåçà. 4.12.6.69. Îïåðàòîðû ñìåíû çíàêà (SIGN operators) Ïîääåðæèâàþòñÿ áåç îãðàíè÷åíèÿ âñåìè ñðåäñòâàìè ñèíòåçà. 4.12.6.70. Îïåðàòîðû óìíîæåíèÿ (MULTIPLYING operators) Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • * (multiply) • / (division), mod, and rem operators • âñå îïåðàòîðû óìíîæåíèÿ, îïðåäåëåííûå â ñòàíäàðòå IEEE Std 1076.3-1997. Äåëåíèå (division), îñòàòîê (mod) è îïåðàòîð (rem) íå ïîääåðæèâàþòñÿ â òîì ñëó÷àå, åñëè îáà îïåðàíäà ñòàòè÷åñêèå. Âîîáùå ãîâîðÿ, ðåçóëüòàò ñèíòåçà ìîæåò áûòü óæàñåí èñïîëüçóéòå áûñòðûå óìíîæèòåëè. 4.12.6.71. Îñòàëüíûå îïåðàòîðû (Miscellaneous operators) Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • ** âîçâåäåíèå â ñòåïåíü • abs ìîäóëü. Âîçâåäåíèå â ñòåïåíü ** íå ïîääåðæèâàåòñÿ â òîì ñëó÷àå, åñëè îáà îïåðàíäà ñòàòè÷åñêèå. 4.12.6.72. Ëèòåðàëû (Literals) literal ::=
325
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL numeric_literal | enumeration_literal | string_literal | bit_string_literal | null numeric_literal ::= abstract_literal | physical_literal Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • literal • numeric_literal Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • null Ôèçè÷åñêèå ëèòåðàëû â òèïå Time è ëèòåðàëû ñ ïëàâàþùåé òî÷êîé (Floating point literals) ìîãóò áûòü èñïîëüçîâàíû òîëüêî â êîíñòðóêöèè after, êîòîðàÿ èãíîðèðóåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.73. Àãðåãàòû (Aggregates) aggregate ::= (element_association {, element_association}) element_association ::= [ choices => ] expression choices ::= choice { | choice } choice ::= simple_expression | discrete_range | element_simple_name | others Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • aggregate • element_association • choices • choice
326
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïðèìåð: subtype Src_Typ is Integer range 7 downto 4; subtype Dest_Typ is Integer range 3 downto 0; — Constant definition with aggregates constant Data_c : Std_Logic_Vector(7 downto 0) := (Src_Typ => '1', Dest_Typ => '0'); Îáúåäèíåíèÿ çàïèñåé (Record aggregates) íå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. Îáúåäèíåíèÿ ìàññèâîâ (âåêòîðîâ, Array aggregates) ïîääåðæèâàþòñÿ áåç îãðàíè÷åíèÿ âñåìè ñðåäñòâàìè ñèíòåçà. 4.12.6.74. Îáðàùåíèå ê ôóíêöèè (Function calls) function_call ::= function_name [ (actual_parameter_part) ] actual_parameter_part ::= parameter_associa tion_list Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • function_call • actual_parameter_part 4.12.6.75. Ñîñòàâíûå âûðàæåíèÿ (Qualified expressions) qualified_expression ::= type_mark'(expression) | type_mark'aggregate Ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.76. Ïðåîáðàçîâàíèå òèïîâ (type conversions) type_conversion ::= type_mark(expression) Ïðåîáðàçîâàíèå òèïîâ ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.77. Ðàñïðåäåëåíèå ðåñóðñîâ (Allocators) allocator ::= new subtype_indication | new qualified_expression
327
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ðàñïðåäåëåíèå ðåñóðñîâ íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.78. Ñòàòè÷åñêèå âûðàæåíèÿ (Static expressions) Ëîêàëüíûå è ãëîáàëüíûå ñòàòè÷åñêèå âûðàæåíèÿ ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. Âûðàæåíèÿ ñ ïëàâàþùåé òî÷êîé (Floating-point expressions) íå ïîääåðæèâàþòñÿ ñèíòåçàòîðîì. Áåñêîíå÷íàÿ òî÷íîñòü (Infinite-precision expressions) íåäîïóñòèìà. Ìàêñèìàëüíàÿ òî÷íîñòü ïðåäñòàâëåíèÿ 32 áèòà. 4.12.6.79. Ïîñëåäîâàòåëüíîñòíûå îïåðàòîðû (Sequential statements) sequence_of_statements ::= { sequential_statement } sequential_statement ::= wait_statement | assertion_statement | report_statement | signal_assignment_statement | variable_assignment | procedure_call_statement | if_statement | case_statement | loop_statement | next_statement | exit_statement | return_statement | null_statement Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • sequence_of_statements • sequential_statement 4.12.6.80. Îïåðàòîð îæèäàíèÿ (WAIT statement) wait_statement ::= [label:] wait [sensitivity_clause] [condition_clause] [timeout_clause]; sensitivity_clause ::= on sensitivity_list sensitivity_list ::= signal_name {, signal_name}
328
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL condition_clause ::= until condition condition ::= boolean_expression timeout_clause ::= for time_expression Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • wait_statement • condition_clause • condition Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • timeout_clause • sensitivity_list Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label • sensitivity_clause  êàæäîì ïðîöåññå ìîæåò áûòü íå áîëåå îäíîãî îïåðàòîðà WAIT UNTIL, êîòîðûé âñåãäà ÿâëÿåòñÿ ïåðâûì îïåðàòîðîì ïðîöåññà. 4.12.6.81. Îïåðàòîð êîíòðîëÿ (ASSERTION statement) assertion_statement ::= [ label: ] assertion ; assertion ::= assert condition [ report expression ] [ severity expression ] Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • assertion_statement • assertion Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label 4.12.6.82. Îïåðàòîð îò÷åòà (REPORT statement) report_statement ::= [label:] report expression [severity expression] ; Îïåðàòîð îò÷åòà îòíîñèòñÿ ê êîíñòðóêöèÿì, íå ïîääåðæèâàåìûì ñðåäñòâàìè ñèíòåçà.
329
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.83. Îïåðàòîð íàçíà÷åíèÿ ñèãíàëà (Signal assignment statement) signal_assignment_statement ::= [ label: ] target <= [ delay_mechanism ] waveform ; delay_mechanism ::= transport | [ reject time_expression ] inertial target ::= name | aggregate waveform ::= waveform_element {, waveform_element} | unaffected Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè signal_assignment_statement target waveform Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè delay_mechanism Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè ìåòêè çàðåçåðâèðîâàííûå ñëîâà reject, inertial è unaffected time_expression ìíîæåñòâåííûå ýëåìåíòû waveform_elements Íå ñëåäóåò çàáûâàòü, ÷òî íàçíà÷åíèå ñèãíàëà â ïàêåòå íå ñèíòåçèðóåòñÿ. 4.12.6.84. Ìîäèôèêàöèÿ âûõîäíîãî ñèãíàëà (Updating a projected output waveform) waveform_element ::= value_expression [after time_expression] | null [after time_expression] Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • waveform_element Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • time_expression ïîñëå çàðåçåðâèðîâàííîãî ñëîâà after Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • null_waveform_elements
330
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.85. Îïåðàòîð íàçíà÷åíèÿ ïåðåìåííîé (Variable assignment statement) variable_assignment_statement ::= [ label: ] target := expression ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • variable_assignment_statement Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label 4.12.6.86. Íàçíà÷åíèå âåêòîðíûõ ïåðåìåííûõ (Array variable assignments) Íàçíà÷åíèå âåêòîðíûõ ïåðåìåííûõ ïîääåðæèâàåòñÿ ïðè ñèíòåçå. 4.12.6.87. Îïåðàòîð âûçîâà ïðîöåäóðû (Procedure call statement) procedure_call_statement ::= [ label: ] proce dure_call ; procedure_call ::= procedure_name [ (actual_parame ter_part) ] Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • procedure_call_statement • procedure_call Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label 4.12.6.88. Îïåðàòîð IF (IF statement) if_statement ::= [ if_label: ] if condition then sequence_of_statements { elsif condition then sequence_of_statements } [ else sequence_of_statements ] end if [ if_label ] ;
331
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • if_statement Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • if_label 4.12.6.89. Îïåðàòîð âûáîðà CASE (CASE statement) case_statement ::= [ case_label: ] case expression is case_statement_alternative { case_statement_alternative } end case [ case_label ] ; case_statement_alternative ::= when choices => sequence_of_statements Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • case_statement • case_statement_alternative Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label Íåîïðåäåëåííûå âåëè÷èíû êîìïèëÿòîð ìîæåò ñèíòåçèðîâàòü íàèáîëåå ïðîñòûì ñïîñîáîì. 4.12.6.90. Îïåðàòîðû öèêëà (LOOP statement) loop_statement ::= [ loop_label: ] [ iteration_scheme ] loop sequence_of_statements end loop [ loop_label ] ; iteration_scheme ::= while condition | for loop_parameter_specification parameter_specification ::= identifier in discrete_range discrete_range ::= discrete_subtype_indication | range
332
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • loop_statement • iteration_scheme • parameter_specification • discrete_range Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • while  îïðåäåëåíèè ïàðàìåòðà öèêëà ãðàíèöû äèñêðåòíîãî äèàïàçîíà äîëæíû áûòü îïðåäåëåíû ïðÿìî èëè êîñâåííî êàê ñòàòè÷åñêèå çíà÷åíèÿ, ïðèíàäëåæàùèå ê öåëî÷èñëåííîìó òèïó. 4.12.6.91. Îïåðàòîð NEXT (NEXT statement) next_statement ::= [ label: ] next [ loop_label ] [ when condition ] ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • next_statement Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label 4.12.6.92. Îïåðàòîð EXIT (EXIT statement) exit_statement ::= [ label: ] exit [ loop_label ] [ when condition ] ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • exit_statement Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label 4.12.6.93. Îïåðàòîð âîçâðàòà (RETURN statement) return_statement ::= [ label: ] return [ expression ] ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • return_statement Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label
333
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.94. Ïóñòîé îïåðàòîð (NULL statement) null_statement ::= [ label: ] null ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • null_statement Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • label 4.12.6.95. Ïàðàëëåëüíûå îïåðàòîðû (Concurrent statements) concurrent_statement ::= block_statement | process_statement | concurrent_procedure_call_statement | concurrent_assertion_statement | concurrent_signal_assignment_statement | component_instantiation_statement | generate_statement Ïàðàëëåëüíûå îïåðàòîðû ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.96. Îïåðàòîð áëîêà (BLOCK statement) block_statement ::= block_label: block [ (guard_expression) ] [ is ] block_header block_declarative_part begin block_statement_part end block [ block_label ] ; block_header ::= [ generic_clause [ generic_map_clause ;] ] [ port_clause [ port_map_clause ;] ] block_declarative_part ::= { block_declarative_item }
334
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL block_statement_part ::= { concurrent_statement } Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • block_statement • block_declarative_part • block_statement_part Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • block_header • guard_expression • çàðåçåðâèðîâàííîå ñëîâî is 4.12.6.97. Îïåðàòîðû ïðîöåññà (PROCESS statement) process_statement ::= [ process_label: ] [ postponed ] process [ (sensitivity_list) ] [ is ] process_declarative_part begin process_statement_part end process [ process_label] ; process_declarative_part ::= { process_declarative_item } process_declarative_item ::= subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | variable_declaration | file_declaration | alias_declaration | attribute_declaration | attribute_specification | use_clause | group_template_declaration | group_declaration process_statement_part ::= { sequential_statement }
335
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • process_statement • sensitivity_list • process_declarative_part • process_declarative_item • process_statement_part Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • file_declaration • alias_declaration • ïðåäîïðåäåëåííîå ïîëüçîâàòåëåì îáúÿâëåíèå Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • çàðåçåðâèðîâàííûå ñëîâà postponed è is • group_template_declaration • group_declaration Ñïèñîê ÷óâñòâèòåëüíîñòè (sensitivity list) äîëæåí âêëþ÷èòü òå ñèãíàëû èëè ýëåìåíòû ñèãíàëîâ, êîòîðûå ÷èòàþòñÿ ïðîöåññîì, çà èñêëþ÷åíèåì ñèãíàëîâ, äîñòóïíûõ òîëüêî äëÿ ÷òåíèÿ ïî ôðîíòó ñèíõðîèìïóëüñà. Èñïîëüçîâàíèå ôàéëîâ, îáúåêòîâ äîñòóïà (ïåðåìåííûõ äîñòóïà) è óñëîâíûõ íàçâàíèé (ïñåâäîíèìîâ) â ïðîöåññå íå ïîääåðæèâàåòñÿ êîìïèëÿòîðàìè. 4.12.6.98. Ïàðàëëåëüíûé âûçîâ ïðîöåäóð (Concurrent procedure call statement) concurrent_procedure_call_statement ::= [ label: ] [ postponed ] procedure_call ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • concurrent_procedure_call_statement Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • çàðåçåðâèðîâàííîå ñëîâî postponed 4.12.6.99. Ïàðàëëåëüíûé êîíòðîëü (Concurrent assertion statement) concurrent_assertion_statement ::= [ label: ] [ postponed ] assertion ; Íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà.
336
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.100. Ïàðàëëåëüíîå íàçíà÷åíèå ñèãíàëîâ (Concurrent signal assignment statement) concurrent_signal_assignment_statement ::= [ label: ] [ postponed ] conditional_signal_assignment | [ label: ] [ postponed ] selected_signal_assignment options ::= [ guarded ] [delay_mechanism] Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • concurrent_signal_assignment_statement Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • options Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • çàðåçåðâèðîâàííîå ñëîâî postponed and guarded Kîíñòðóêöèÿ after èãíîðèðóåòñÿ. Ìíîãîêðàòíûå ýëåìåíòû ñèãíàëîâ íå ïîääåðæèâàþòñÿ. Çíà÷åíèå unaffected íå ïîääåðæèâàåòñÿ. Îïðåäåëåíèå ôðîíòà òàêòîâîãî èìïóëüñà ( or ) íåäîïóñòèìî ïðè ïàðàëëåëüíîì íàçíà÷åíèè ñèãíàëîâ. Íàïðèìåð: architecture A of E is begin B(7) <= A(6); B(3 downto 0) <= A(7 downto 4); C <= not A; end A; 4.12.6.101. Óñëîâíîå íàçíà÷åíèå ñèãíàëîâ (Conditional signal assignment) conditional_signal_assignment ::= target <= options conditional_waveforms ; conditional_waveforms ::= { waveform when condition else } waveform [ when condition ] Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • conditional_signal_assignment • conditional_waveforms
337
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • options Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • last when condition Óñëîâíîå íàçíà÷åíèå ñèãíàëîâ ñîäåðæèò ññûëêó íà îäèí èëè íåñêîëüêî ýëåìåíòîâ öåëåâîãî ñèãíàëà (target signal). Ïðèìåð óñëîâíîãî íàçíà÷åíèÿ ñèãíàëà: architecture A of E is begin C <= B when A(0) = '1' else not B when A(1) = '1' else «00000000» when A(2) = '1' and RESET = '1' else (others => ('1')); end A; 4.12.6.102. Âûáîðî÷íîå íàçíà÷åíèå ñèãíàëîâ (Selected signal assignments) selected_signal_assignment ::= with expression select target <= options selected_waveforms ; select_waveforms ::= { waveform when choices, } waveform when choices Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • selected_signal_assignment • select_waveforms Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • options Ïðè âûáîðî÷íîì íàçíà÷åíèè ñèãíàëà âûáðàííûé ñèãíàë ñîäåðæèò ññûëêó íà îäèí èëè íåñêîëüêî öåëåâûõ ñèãíàëîâ. Íàïðèìåð: architecture A of E is begin with A select
338
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL C <= B when "00000000", not B when "10101010", (others => ('1')) when "11110001", not A when others; end A; 4.12.6.103. Îïåðàòîð ðåàëèçàöèè êîìïîíåíòà (Component instantiation statement) component_instantiation_statement ::= instantiation_label: instantiated_unit [ generic_map_aspect ] [ port_map_aspect ] ; instantiated_unit ::= [component] component_name | entity entity_name [(architecture_name)] | configuration configuration_name Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • component_instantiation_statement • instantiated_unit Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • ôîðìû entity è configuration • çàðåçåðâèðîâàííîå ñëîâî component 4.12.6.104. Çàäàíèå ýêçåìïëÿðà êîìïîíåíòû (Instantiation of a component) Ïîëíîñòüþ ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.105. Ýêçåìïëÿð èíòåðôåéñà ïðîåêòà (Instantiation of a design entity) Íå ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.106. Îïåðàòîð GENERATE (GENERATE statement) generate_statement ::= generate_label: generation_scheme generate
339
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL [ { block_declarative_item } begin ] { concurrent_statement } end generate [ generate_label] ; generation_scheme ::= for generate_parameter_specification | if condition label ::= identifier Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • generate_statement • generate_scheme • label Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • block_declarative_item (the declarative region) • çàðåçåðâèðîâàííîå ñëîâî begin 4.12.6.107. Îáëàñòü îáúÿâëåíèÿ (Declarative region) Ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.108. Kîíòåêñò îáúÿâëåíèé (Scope of declarations) Ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.109. Âèäèìîñòü (Visibility) Ïðàâèëà âèäèìîñòè ïåðåìåííûõ ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà. 4.12.6.110. Èñïîëüçîâàíèå ïðåäëîæåíèé (Use clause) use_clause ::= use selected_name {, selected_name} ; Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • use_clause 4.12.6.111. Kîíòåêñò ïåðåçàãðóæåííîãî ðàçðåøåíèÿ (The context of overloaded resolution) Ïîääåðæèâàåòñÿ ñðåäñòâàìè ñèíòåçà.
340
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL 4.12.6.112. ×àñòè ïðîåêòà è èõ àíàëèç (Design units and their analysis) design_file ::= design_unit { design_unit } design_unit ::= context_clause library_unit library_unit ::= primary_unit | secondary_unit primary_unit ::= entity_declaration | configuration_declaration | package_declaration secondary_unit ::= architecture_body | package_body Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • design_file • design_unit • library_unit • primary_unit • secondary_unit 4.12.6.113. Áèáëèîòåêè ïðîåêòà (Design libraries) library_clause ::= library logical_name_list ; logical_name_list ::= logical_name {, logical_name} logical_name ::= identifier Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • library_clause • logical_name_list • logical_name 4.12.6.114. Kîíòåêñòíûå ïðåäëîæåíèÿ (Context clauses) context_clause ::= { context_item } context_item ::= library_clause | use_clause
341
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • context_clause • context_item 4.12.6.115. Ïðåäîïðåäåëåííûå àòðèáóòû (Predefined attributes) Àòðèáóòû ñ ïðåôèêñîì t (Attributes whose prefix is a type t) t'base t'left t'right t'high t'low t'ascending t'image t'value(x) t'pos(x) t'val(x) t'succ(x) t'pred(x) t'leftof(x) t'rightof(x) Àòðèáóòû ìàññèâîâ (Attributes whose prefix is an array object a) a'left[(n)] a'right[(n)] a'high[(n)] a'low[(n)] a'range[(n)] a'reverse_range[(n)] a'length[(n)] a'ascending[(n)] Àòðèáóòû ñ ïðåôèêñîì ñèãíàëà s (Attributes whose prefix is a signal s) s'delayed[(t)] s'stable[(t)] s'quiet s'transaction s'event s'ective s'last_event
342
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL s'last_active s'last_value s'driving s'driving_value Àòðèáóòû èìåíîâàííîãî îáúåêòà ñ ïðåôèêñîì å (Attributes whose prefix is a named object e) e'simple_name e'instance_name e'path_name 4.12.6.116. Ïàêåò STANDARD Ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • ôóíêöèè îäíîãî èëè íåñêîëüêèõ àðãóìåíòîâ òèïà CHARACTER • ôóíêöèè îäíîãî èëè íåñêîëüêèõ àðãóìåíòîâ òèïà STRING • âñå ôóíêöèè àðãóìåíòîâ òèïà BOOLEAN • âñå ôóíêöèè àðãóìåíòîâ òèïà BIT • âñå ôóíêöèè àðãóìåíòîâ òèïà BIT_VECTOR Èãíîðèðóåìûå ïðè ñèíòåçå êîíñòðóêöèè • Àòðèáóò 'FOREIGN Íå ïîääåðæèâàåìûå ñðåäñòâàìè ñèíòåçà êîíñòðóêöèè • ôóíêöèè îäíîãî èëè íåñêîëüêèõ àðãóìåíòîâ òèïà SEVERITY_LEVEL • ôóíêöèè îäíîãî èëè íåñêîëüêèõ àðãóìåíòîâ òèïà Time • ôóíêöèÿ NOW • ôóíêöèè îäíîãî èëè íåñêîëüêèõ àðãóìåíòîâ òèïà FILE_OPEN_KIND • ôóíêöèè îäíîãî èëè íåñêîëüêèõ àðãóìåíòîâ òèïà FILE_OPEN_STATUS 4.12.6.117. Ïàêåò TEXTIO Ïîäïðîãðàììû, îïðåäåëåííûå â ïàêåòå TEXTIO, íå ïîääåðæèâàþòñÿ ñðåäñòâàìè ñèíòåçà.
4.13. Kðàòêîå îïèñàíèå ñèíòàêèñà ñèíòåçèðóåìîãî ïîäìíîæåñòâà VHDL abstract_literal ::= decimal_literal | based_literal access_type_definition ::= access subtype_indication actual_designator ::= expression
343
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | signal_name | variable_name | file_name | open actual_parameter_part ::= parameter_association_list actual_part ::= actual_designator | function_name(actual_designator) | type_mark(actual_designator) adding_operator ::= + | | & aggregate ::= (element_association {, element_association}) alias_declaration ::= alias alias_designator [: subtype_indication] is name [signature]; alias_designator ::= identifier | character_liter al | operator_symbol allocator ::= new subtype_indication | new qualified_expression architecture_body ::= architecture identifier of entity_name is architecture_declarative_part begin architecture_statement_part ] end [ architecture ] [ architecture_simple_name ] ; architecture_declarative_part ::= { block_declarative_item } architecture_statement_part ::= { concurrent_statement } array_type_definition ::= unconstrained_array_definition | constrained_array_definition assertion ::= assert condition [ report expression ] [ severity expression ] assertion_statement ::= [ label: ] assertion ;
344
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL association_element ::= [formal_part =>] actual_part association_list ::= association_element {, association_element} attribute_declaration ::= attribute identifier : type_mark ; attribute_designator ::= attribute_simple_name attribute_name ::= prefix [signature]'attribute_designator [ (expres sion) ] attribute_specification ::= attribute attribute_designator of entity_specifica tion is expression; base ::= integer base_specifier ::= B | O | X base_unit_declaration ::= identifier ; based_integer ::= extended_digit { [ underline ] extended_digit } based_literal ::= base # based_integer [. based_integer ] # [ expo nent ] basic_character ::= basic_graphic_character | format_effector basic_graphic_character ::= upper_case_letter | digit | special_character| space_character basic_identifier ::= letter { [ underline ] letter_or_digit } binding_indication ::= [ use entity_aspect ] [ generic_map_aspect ] [ port_map_aspect ] bit_string_literal :: base_specifier « [ bit_value ] « bit_value ::= extended_digit { [ underline ] extended_digit } block_configuration ::= for block_specification { use_clause }
345
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL { configuration_item } end for ; block_declarative_item ::= subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | signal_declaration | shared_variable_declaration | file_declaration | alias_declaration | component_declaration | attribute_declaration | attribute_specification | configuration_specification | disconnection_specification | use_clause | group_template_declaration | group_declaration block_declarative_part ::= { block_declarative_item } block_header ::= [ generic_clause [ generic_map_clause ;] ] [ port_clause [ port_map_clause ;] ] block_specification ::= architecture_name | block_statement_label | generate_statement_label [ (index_specification) ] block_statement ::= block_label: block [ (guard_expression) ] [ is ] block_header block_declarative_part begin block_statement_part
346
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL end block [ block_label ] ; block_statement_part ::= { concurrent_statement } case_statement ::= [ case_label: ] case expression is case_statement_alternative { case_statement_alternative } end case [ case_label ] ; case_statement_alternative ::= when choices => sequence_of_statements character_literal ::= ' graphic_character ' choice ::= simple_expression | discrete_range | element_simple_name | others choices ::= choice { | choice } component_configuration ::= for component_specification [ binding_indication ; ] [ block_configuration ] end for ; component_declaration ::= component identifier [is] [ local_generic_clause] [ local_port_clause] end component [ component_simple_name]; component_instantiation_statement ::= instantiation_label: instantiated_unit [ generic_map_aspect ] [ port_map_aspect ] ; component_specification ::= instantiation_list : component_name composite_type_definition ::= array_type_definition
347
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | record_type_definition concurrent_assertion_statement ::= [ label: ] [ postponed ] assertion ; concurrent_procedure_call_statement ::= [ label: ] [ postponed ] procedure_call ; concurrent_signal_assignment_statement ::= [ label: ] [ postponed ] conditional_signal_assignment | [ label: ] [ postponed ] selected_signal_assignment concurrent_statement ::= block_statement | process_statement | concurrent_procedure_call_statement | concurrent_assertion_statement | concurrent_signal_assignment_statement | component_instantiation_statement | generate_statement condition ::= boolean_expression condition_clause ::= until condition conditional_signal_assignment ::= target <= options conditional_waveforms ; conditional_waveforms ::= { waveform when condition else } waveform [ when condition ] configuration_declaration ::= configuration identifier of entity_name is configuration_declarative_part block_configuration end [configuration] [ configuration_simple_name]; configuration_declarative_item ::= use_clause | attribute_specification | group_declaration configuration_declarative_part ::= { configuration_declarative_item } configuration_item ::= block_configuration | component_configuration configuration_specification ::=
348
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL for component_specification binding_indication; constant_declaration ::= constant identifier_list : subtype_indication [:= expression] ; constrained_array_definition ::= array index_constraint of element_subtype_indication constraint ::= range_constraint | index_constraint context_clause ::= { context_item } context_item ::= library_clause | use_clause decimal_literal ::= integer [. integer ] [ exponent ] declaration ::= type_declaration | subtype_declaration | object_declaration | interface_declaration | alias_declaration | attribute_declaration | component_declaration | group_template_declaration | group_declaration | entity_declaration | configuration_declaration | subprogram_declaration | package_declaration delay_mechanism ::= transport | [ reject time_expression ] inertial design_file ::= design_unit { design_unit } design_unit ::= context_clause library_unit designator ::= identifier | operator_symbol direction ::= to | downto disconnection_specification ::= disconnect guarded_signal_specification after time_expression ;
349
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL discrete_range ::= discrete_subtype_indication | range element_association ::= [ choices => ] expression element_declaration ::= identifier_list : element_subtype_definition ; element_subtype_definition ::= subtype_indication entity_aspect ::= entity entity_name [(architecture_identifier)] | configuration configuration_name | open entity_class ::= entity| architecture| configuration | procedure| function| package | type| subtype| constant | signal| variable| component | label| literal| units | group| file entity_class_entry ::= enitity_class [<>] entity_class_entry_list ::= entity_class_entry {, entity_class_entry } entity_declaration ::= entity identifier is entity_header entity_declarative_part [ begin entity_statement_part ] end [ entity ] [ entity_simple_name ] ; entity_declarative_item :: subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | signal_declaration | shared_variable_declaration | file_declaration | alias_declaration | attribute_declaration
350
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | attribute_specification | disconnection_specification | use_clause | group_template_declaration | group_declaration entity_declarative_part ::= { entity_declarative_item } entity_designator ::= entity_tag [signature] entity_header ::= [ formal_generic_clause ] [ formal_port_clause ] entity_name_list ::= entity_designator {, entity_designator} | others | all entity_specification ::= entity_name_list : entity_class entity_statement ::= concurrent_assertion_statement | passive_concurrent_procedure_call | passive_process_statement entity_statement_part ::= { entity_statement } entity_tag ::= simple_name | character_literal | operator_symbol enumeration_literal ::= identifier | character_literal enumeration_type_definition ::= (enumeration_literal {, enumeraton_literal }) exit_statement ::= [ label: ] exit [ loop_label ] [ when condition ] ; exponent ::= E [ + ] integer | E integer expression ::= relation { and relation } | relation { or relation } | relation { xor relation } | relation [ nand relation ] | relation [ nor relation ] | relation { xnor relation }
351
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL extended_digit ::= digit | letter extended_identifier ::= | graphic_character { graphic_character } \ factor ::= primary [ ** primary ] | abs primary | not primary file_declaration ::= file identifier_list : subtype_indication [ file_open_information ] ; file_logical_name ::= string_expression file_open_information ::= [ open file_open_kind_expression ] is file_logical_name file_type_definition ::= file of type_mark floating_type_definition ::= range_constraint formal_designator ::= generic_name | port_name | parameter_name formal_parameter_list ::= parameter_interface_list formal_part ::= formal_designator | function_name(formal_designator) | type_mark(formal_designator) full_type_declaration ::= type identifier is type_definition ; function_call ::= function_name [ (actual_parameter_part) ] generate_statement ::= generate_label: generation_scheme generate [ { block_declarative_item } begin ] { concurrent_statement } end generate [ generate_label] ; generation_scheme ::= for generate_parameter_specification | if condition
352
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL generic_clause ::= generic(generic_list); generic_list ::= generic_interface_list generic_map_aspect ::= generic map (generic_association_list) graphic_character ::= basic_graphic_character | lower_case_letter | other_special_character group_constituent ::= name | character_literal group_constituent_list ::= group_constituent {, group_constituent } group_declarataion ::= group identifier : group_template_name (group_consituent_list); group_template_declaration ::= group identifier is (entity_class_entry_list) ; guarded_signal_specification ::= guarded_signal_list : type_mark identifier ::= basic_identifier | extended_identifier identifier_list ::= identifier {, identifier } if_statement ::= [ if_label: ] if condition then sequence_of_statements { elsif condition then sequence_of_statements } [ else sequence_of_statements ] end if [ if_label ] ; incomplete_type_declaration ::= type identifier ; index_constraint ::= (discrete_range {, discrete_range }) index_specification ::= discrete_range | static_expression index_subtype_definition ::= type_mark range <> indexed_name ::= prefix (expression {, expression })
353
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL instantiated_unit ::= [component] component_name | entity entity_name [(architecture_name)] | configuration configuration_name instantiation_list ::= instantiation_label {, instantiation_label} | others | all integer ::= digit { [ underline ] digit } integer_type_definition ::= range_constraint interface_constant_declaration ::= [constant] identifier_list : [in] subtype_indication [:= static_expression] interface_declaration ::= interface_constant_declaration | interface_signal_declaration | interface_variable_declaration | interface_file_declaration interface_element ::= interface_declaration interface_file_declaration ::= file identifier_list : subtype_indication interface_list ::= interface_element {; interface_element} interface_signal_declaration ::= [signal] identifier_list : [mode] subtype_indication [bus] [:= static_expression] interface_variable_declaration ::= [variable] identifier_list : [mode] subtype_indication [:= static_expression] iteration_scheme ::= while condition | for loop_parameter_specification label ::= identifier letter ::= upper_case_letter | lower_case_letter letter_or_digit ::= letter | digit library_clause ::= library logical_name_list ; library_unit ::=
354
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL primary_unit | secondary_unit literal ::= numeric_literal | enumeration_literal | string_literal | bit_string_literal | null logical_name ::= identifier logical_name_list ::= logical_name {, logical_name } logical_operator ::= and | or | nand | nor | xor | xnor loop_statement ::= [ loop_label: ] [ iteration_scheme ] loop sequence_of_statements end loop [ loop_label ] ; miscellaneous_operator ::= ** | abs | not mode ::= in | out | inout | buffer | linkage multiplying_operator ::= * | / | mod | rem name ::= simple_name | operator_symbol | selected_name | indexed_name | slice_name | attribute_name next_statement ::= [ label: ] next [ loop_label ] [ when condition ] ; null_statement ::= [ label: ] null ; numeric_literal ::= abstract_literal | physical_literal object_declaration ::= constant_declaration | signal_declaration | variable_declaration | file_declaration
355
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL operator_symbol ::= string_literal options ::= [ guarded ] [delay_mechanism] package_body ::= package body package_simple_name is package_body_declarative_part end [ package body ] [ package_simple_name ] ; package_body_declarative_item ::= subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | shared_variable_declaration | file_declaration | alias_declaration | use_clause | group_template_declaration | group_declaration package_body_declarative_part ::= { package_body_declarative_item } package_declaration ::= package identifier is package_declarative_part end [ package ] [ package_simple_name ] ; package_declarative_item ::= subprogram_declaration | type_declaration | subtype_declaration | constant_declaration | signal_declaration | shared_variable_declaration | file_declaration | alias_declaration | component_declaration | attribute_declaration | attribute_specification | disconnection_specification | use_clause
356
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | group_template_declaration | group_declaration package_declarative_part ::= { package_declarative_item } parameter_specification ::= identifier in discrete_range physical_literal ::= [ abstract_literal ] unit_name physical_type_definition ::= range_constraint units primary_unit_declaration { secondary_unit_declaration } end units [ physical_type_simple_name ] port_clause ::= port(port_list); port_list ::= port_interface_list port_map_aspect ::= port map (port_association_list) prefix ::= name | function_call primary ::= name | literal | aggregate | function_call | qualified_expression | type_conversion | allocator | (expression) primary_unit ::= entity_declaration | configuration_declaration | package_declaration primary_unit_declaration ::= identifier procedure_call ::= procedure_name [ (actual_parameter_part) ] procedure_call_statement ::= [ label: ]
357
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL procedure_call ; process_declarative_item ::= subprogram_declaration | subprogram_body | type_declaration | subtype_declaration | constant_declaration | variable_declaration | file_declaration | alias_declaration | attribute_declaration | attribute_specification | use_clause | group_template_declaration | group_declaration process_declarative_part ::= { process_declarative_item } process_statement ::= [ process_label: ] [ postponed ] process [ (sensitivity_list) ] [ is ] process_declarative_part begin process_statement_part end process [ process_label] ; process_statement_part ::= { sequential_statement } qualified_expression ::= type_mark’(expression) | type_mark’aggregate range ::= range_attribute_name | simple_expression direction simple_expression range_constraint ::= range range record_type_definition ::= record element_declaration { element_declaration } end record [ record_type_simple_name ]
358
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL relation ::= shift_expression [ relational_operator shift_expression ] relational_operator ::= = | /= | < | <= | > | >= report_statement ::= [label:] report expression [severity expression] ; return_statement ::= [ label: ] return [ expression ] ; scalar_type_definition ::= enumeration_type_definition | integer_type_definition | physical_type_definition | floating_type_definition secondary_unit ::= architecture_body | package_body secondary_unit_declaration ::= identifier = physical_literal ; selected_name ::= prefix.suffix selected_signal_assignment ::= with expression select target <= options selected_waveforms ; selected_waveforms ::= { waveform when choices, } waveform when choices sensitivity_clause ::= on sensitivity_list sensitivity_list ::= signal_name {, signal_name} sequence_of_statements ::= { sequential_statement } sequential_statement ::= wait_statement | assertion_statement | report_statement | signal_assignment_statement | variable_assignment | procedure_call_statement | if_statement
359
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | case_statement | loop_statement | next_statement | exit_statement | return_statement | null_statement shift_expression ::= simple_expression [ shift_operator simple_expres sion ] shift_operator ::= sll | srl | sla | sra | rol | ror sign ::= + | signal_ assignment_statement ::= [ label: ] target <= [ delay_mechanism ] waveform ; signal_declaration ::= signal identifier_list : subtype_indication [signal_kind] [:= expression] ; signal_kind ::= register | bus signal_list ::= signal_name {, signal_name } | others | all signature ::= [ [ type_mark {, type_mark } ] [ return type_mark ] simple_expression ::= [ sign ] term { adding_operator term } simple_name ::= identifier slice_name ::= prefix (discrete_range) string_literal ::= « { graphic_character } « subprogram_body ::= subprogram_specification is subprogram_declarative_part begin subprogram_statement_part ] end [ subprogram_kind ] [ designator ] ; subprogram_declaration ::= subprogram_specification ; subprogram_declarative_item ::= subprogram_declaration
360
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL | subprogram_body | type_declaration | subtype_declaration | constant_declaration | variable_declaration | file_declaration | alias_declaration | attribute_declaration | attribute_specification | use_clause | group_template_declaration | group_declaration subprogram_declarative_part ::= { subprogram_declarative_item } subprogram_kind ::= procedure | function subprogram_specification ::= procedure designator [ (formal_parameter_list) ] | [ pure | impure ] function designator [ (formal_paramter_list) ] return type_mark subprogram_statement_part ::= { sequential_statement } subtype_declaration ::= subtype identifier is subtype_indication ; subtype_indication ::= [ resolution_function_name ] type_mark [ constraint ] suffix ::= simple_name | character_literal | operator_symbol | all target ::= name | aggregate term ::= factor { multiplying_operator factor } timeout_clause ::= for time_expression type_conversion ::= type_mark(expression)
361
ßçûê îïèñàíèÿ àïïàðàòóðû VHDL type_declaration ::= full_type_declaration | incomplete_type_declaration type_definition ::= scalar_type_definition | composite_type_definition | access_type_definition | file_type_definition type_mark ::= type_name | subtype_name unconstrained_array_definition ::= array (index_subtype_definition {, index_subtype_ definition }) of element_subtype_indication use_clause ::= use selected_name {, selected_name} ; variable_assignment_statement ::= [ label: ] target := expression ; variable_declaration ::= [shared] variable identifier_list : subtype_indication [:= expression] ; wait_statement ::= [label:] wait [sensitivity_clause] [condition_clause] [timeout_clause] ; waveform ::= waveform_element {, waveform_element} | unaffected waveform_element ::= value_expression [after time_expression] | null [after time_expression]
362
Ãëàâà 5.
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.1.Îáùèå ñâåäåíèÿ Kàê èçâåñòíî [45], ÿçûê îïèñàíèÿ àïïàðàòóðû Verilog áûë ðàçðàáîòàí ôèðìîé «Gateway Design Automation» â 1984 ã. Ïîñëå ïîãëîùåíèÿ ïîñëåäíåé òàêèì ìîíñòðîì, êàê ôèðìà «Caddence», ÿçûê ñòàë ïîëó÷àòü âñå áîëåå øèðîêîå ðàñïðîñòðàíåíèå ñðåäè ðàçðàáîò÷èêîâ è ñòàë íå ìåíåå ïîïóëÿðåí, ÷åì VHDL.  îòëè÷èå îò VHDL, ñòðóêòóðà è ñèíòàêñèñ êîòîðîãî íàïîìèíàþò òàêèå «ñëîæíûå» ÿçûêè, êàê ÀÄÀ èëè ÀËÃÎË, ñèíòàêñèñ Verilog íàïîìèíàåò î÷åíü ïîïóëÿðíûé â ñðåäå êàê ïðîãðàììèñòîâ, òàê è ðàçðàáîò÷èêîâ âñòðîåííûõ ñèñòåì è ñèñòåì ÖÎÑ ñòàðûé äîáðûé Ñ++. Verilog ïîçâîëÿåò äîñòàòî÷íî ýôôåêòèâíî âûïîëíèòü îïèñàíèå è ïðîâåñòè ìîäåëèðîâàíèå (simulate) è ñèíòåç öèôðîâûõ ñõåì áëàãîäàðÿ ïðèìåíåíèþ âñòðîåííûõ ïðèìèòèâîâ (built-in primitives), ïðèìèòèâîâ ïîëüçîâàòåëÿ (userdefined primitives), ñðåäñòâ âðåìåííîãî êîíòðîëÿ (timing checks), ìîäåëèðîâàíèÿ çàäåðæêè ðàñïðîñòðàíåíèÿ îò âõîäà äî âûõîäà (pin-to-pin delay simulation), âîçìîæíîñòüþ çàäàíèÿ âíåøíèõ òåñòîâûõ ñèãíàëîâ (external stimulus). Kàê è VHDL, Verilog èçíà÷àëüíî ïðåäíàçíà÷àëñÿ äëÿ ìîäåëèðîâàíèÿ öèôðîâûõ ñèñòåì è êàê ñðåäñòâî îïèñàíèÿ ñèíòåçèðóåìûõ ïðîåêòîâ ñòàë èñïîëüçîâàòüñÿ ñ 1987 ãîäà.  íàñòîÿùåå âðåìÿ âåäóùèå ïàêåòû ñèíòåçà ñèñòåì íà ÏËÈÑ, òàêèå, êàê ïðîäóêòû ôèðì «Synopsis», «Caddence», «Mentor Graphics», ìíîãèõ ïðîèçâîäèòåëåé ÏËÈÑ ïîääåðæèâàþò ñèíòåç ñ îïèñàíèÿ íà ÿçûêå Verilog.  ÿçûêå Verilog ïîääåðæèâàåòñÿ íàáîð òèïîâ ëîãè÷åñêèõ âåíòèëåé (Gate types).
363
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Äëÿ ëîãè÷åñêèõ âåíòèëåé îïðåäåëåíû êëþ÷åâûå ñëîâà (keywords): AND («È»), NAND («È-ÍÅ»), OR («ÈËÈ»), NOR («ÈËÈ-ÍÅ»), XOR («èñêëþ÷àþùåå ÈËÈ»), XNOR («èñêëþ÷àþùåå ÈËÈ-ÍÅ»), BUF (áóôåðíûé ýëåìåíò), NOT (îòðèöàíèå «ÍÅ»).  Verilog ïðè èñïîëüçîâàíèè âåíòèëåé íåîáõîäèìî çàäàòü âõîäû è âûõîäû ýëåìåíòà, à òàêæå (íå îáÿçàòåëüíî) èìÿ âåíòèëÿ. Íàïðèìåð, âåíòèëè AND è OR äîëæíû èìåòü îäèí âûõîä è äâà è áîëåå âõîäîâ. Òàê, äëÿ âåíòèëÿ «È» (AND) èìååì. and <list of arguments> and myand(out, in1, in2, in3); and (out, in1, in2 Âåíòèëè BUF è NOT ìîãóò èìåòü îäèí âõîä è îäèí è áîëåå âûõîäîâ. Èìÿ âåíòèëÿ ÿâëÿåòñÿ íåîáÿçàòåëüíûì. Ïðèìåðû èñïîëüçîâàíèÿ ïðèâåäåíû íèæå. buf mybuf(out1, out2, out3, in); not (out, in); Ãîâîðÿ î ñèíòàêñèñå ÿçûêà Verilog, ñëåäóåò ïîìíèòü, ÷òî îí ÿâëÿåòñÿ êîíòåêñòíî-çàâèñèìûì ÿçûêîì, òî åñòü ñòðî÷íûå è ïðîïèñíûå áóêâû ðàçëè÷àþòñÿ. Âñå êëþ÷åâûå ñëîâà (keywords) çàäàþòñÿ â íèæíåì ðåãèñòðå (ñòðî÷íûå áóêâû). Äëÿ îáîçíà÷åíèÿ ïóñòîãî ïðîñòðàíñòâà (white space) èñïîëüçóþòñÿ ñèìâîëû ïðîáåëà, òàáóëÿöèè è íîâîé ñòðîêè.  Verilog ïîääåðæèâàþòñÿ äâà òèïà êîììåíòàðèåâ. Îíè àíàëîãè÷íû ïðèíÿòûì â Ñ++, åñëè íàäî çàêîììåíòèðîâàòü îäíó ñòðîêó, òî èñïîëüçóþòñÿ äâå êîñûå ÷åðòû â åå íà÷àëå: // ýòî êîììåíòàðèé ×òîáû çàêîììåíòèðîâàòü íåñêîëüêî ñòðîê, èñïîëüçóåòñÿ ñëåäóþùàÿ êîíñòðóêöèÿ: /* Ýòî êîììåíòàðèè... */ Î÷åâèäíî, ÷òî êîììåíòàðèè íå ìîãóò áûòü âëîæåííûìè.
364
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.2. Îïåðàòîðû  Verilog ñóùåñòâóåò òðè òèïà îïåðàòîðîâ ñ îäíèì, äâóìÿ è òðåìÿ îïåðàíäàìè. Óíàðíûå îïåðàòîðû ðàñïîëàãàþòñÿ ñëåâà îò îïåðàíäà, áèíàðíûå ìåæäó îïåðàíäàìè è òåðíàðíûé îïåðàòîð ðàçäåëÿåò òðè îïåðàíäà äâóìÿ îïåðàòîðàìè. Ïðèìåðû îïåðàòîðîâ: clock = ~clock; // óíàðíûé îïåðàòîð îòðèöàíèÿ // clock îïðåàíä c = a || b; // || áèíàðíûé îïåðàòîð ÈËÈ, a è b îïåðàíäû r = s ? t : u; // ?: òåðíàðíûé îïåðàòîð, ÷èòàåòñÿ êàê // r = [if s is true then t else u] Kàê ïðàâèëî, ïðè íàïèñàíèè îïèñàíèé íà Verilog êîììåíòàðèè îäíîé ñòðîêîé (//) èñïîëüçóþò äëÿ ââîäà òåêñòîâûõ êîììåíòàðèåâ ê êîäó, à êîíñòðóêöèþ /* */ èñïîëüçóþò ïðè îòëàäêå äëÿ «çàêîììåíòèðîâàíèÿ» ôðàãìåíòîâ êîäà.
5.3. ×èñëà â Verilog 5.3.1. Öåëûå ÷èñëà (Integers) Öåëûå ÷èñëà ìîãóò áûòü äâîè÷íûìè (binary), îáîçíà÷àþòñÿ b èëè B , äåñÿòè÷íûìè (decimal, d èëè D), øåñòíàäöàòåðè÷íûìè (hexidecimal, h èëè H) èëè âîñüìåðè÷íûìè (octal, o èëè O). Äëÿ îïðåäåëåíèÿ ÷èñåë èñïîëüçóþòñÿ ñëåäóþùèå ôîðìàòû: 1. <ðàçðÿäíîñòü>'<îñíîâàíèå><÷èñëî> ïîëíîå îïèñàíèå ÷èñëà. 2. <îñíîâàíèå><÷èñëî> èñïîëüçóåòñÿ ðàçðÿäíîñòü ïðåäñòàâëåíèÿ, çàäàííàÿ â ñèñòåìå ïî îïðåäåëåíèþ, íî íå ìåíåå 32 áèò. 3. <÷èñëî> èñïîëüçóåòñÿ, êîãäà ïî óìîë÷àíèþ äåñÿòè÷íîå îñíîâàíèå. Ðàçðÿäíîñòü îïðåäåëÿåò ÷èñëî áèò ïîä ïðåäñòàâëåíèå ÷èñëà. Íàïðèìåð: 8'b10100010 // 8-ðàçðÿäíîå ÷èñëî â äâîè÷íîé ñèñòåìå 8'hA2 // 8-ðàçðÿäíîå ÷èñëî â øåñòíàäöàòåðè÷íîé ñèñòåìå
365
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.3.2. Íåîïðåäåëåííîå è âûñîêîèìïåäàíñíîå ñîñòîÿíèÿ (x and z values) Ñèìâîë õ èñïîëüçóåòñÿ äëÿ çàäàíèÿ íåîïðåäåëåííîãî ñîñòîÿíèÿ, ñèìâîë z ïîêàçûâàåò òðåòüå (âûñîêîèìïåäàíñíîå). Ïðè èñïîëüçîâàíèè â êà÷åñòâå öèôðû â ÷èñëàõ âìåñòî ñèìâîëà z ìîæíî èñïîëüçîâàòü "?". Ýòî ðåêîìåíäóåòñÿ äåëàòü â îïåðàòîðàõ âûáîðà (CASE expressions) äëÿ óëó÷øåíèÿ ÷èòàåìîñòè êîäà. Íèæå ïðèâåäåíû ïðèìåðû èñïîëüçîâàíèÿ ñèìâîëîâ x è z â ÷èñëàõ. 4'b10x0 4'b101z 12'dz 12'd? 8'h4x
5.3.3. Îòðèöàòåëüíûå ÷èñëà (Negative numbers) Îòðèöàòåëüíîå ÷èñëî çàäàåòñÿ ñ ïîìîùüþ çíàêà ìèíóñ ïåðåä ðàçðÿäíîñòüþ ÷èñëà. Ïðèìåðû îòðèöàòåëüíûõ ÷èñåë: 8'd5 8'b5 // íåïðàâèëüíî, çíàê ìèíóñ ïåðåä ÷èñëîì, à íå ðàçðÿäíîñòüþ!
5.3.4. Ïîä÷åðêèâàíèå (Underscore) Çíàê ïîä÷åðêèâàíèÿ (_, Underscores) ìîæåò áûòü çàïèñàí â ëþáîì ìåñòå ÷èñëà, ÷òî ïîçâîëÿåò èñïîëüçîâàòü åãî êàê ðàçäåëèòåëü ðàçðÿäîâ, óëó÷øàþùèé ÷èòàáåëüíîñòü. 16'b0001_1010_1000_1111 // èñïîëüçîâàíèå ïîä÷åðêèâàíèÿ 8'b_0001_1010 // íåêîððåêòíîå èñïîëüçîâàíèå ïîä÷åðêèâàíèÿ
5.3.5. Äåéñòâèòåëüíûå ÷èñëà (Real) Äåéñòâèòåëüíûå ÷èñëà (Real numbers) ìîãóò áûòü ïðåäñòàâëåíû ëèáî â äåñÿòè÷íîì âèäå, ëèáî â ñòàíäàðòíîé ôîðìå ñ ïëàâàþùåé òî÷êîé (scientific format). Ïðèìåðû äåéñòâèòåëüíûõ ÷èñåë: 1.8
366
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL 3_2387.3398_3047 3.8e10 // e èëè E äëÿ îáîçíà÷åíèÿ ïîðÿäêà 2.1e-9 3. // íåïðàâèëüíî!
5.3.6. Ñòðîêè (Strings) Ñòðîêà çàêëþ÷àåòñÿ â êàâû÷êè «...» è íå ìîæåò çàíèìàòü áîëåå îäíîé ëèíèè. Ïðèìåðû èñïîëüçîâàíèÿ ñòðîê: «hello world»; // ïðàâèëüíîå èñïîëüçîâàíèå ñòðîê «good b y e wo rld»; // íåïðàâèëüíîå èñïîëüçîâàíèå ñòðîê
5.4. Öåïè â Verilog (Nets) Äëÿ îáîçíà÷åíèÿ öåïåé èñïîëüçóþòñÿ ñëåäóþùèå êëþ÷åâûå ñëîâà: wire, supply0, supply1. Âåëè÷èíà ïî óìîë÷àíèþ (default value): z. Ðàçðÿäíîñòü ïî óìîë÷àíèþ (default size): 1 áèò. Ïî ñâîåìó íàçíà÷åíèþ öåïü (Net) â Verilog ñõîäíà ñ ñèãíàëîì â VHDL. Öåïè îáåñïå÷èâàþò íåïðåðûâíîå ìîäèôèöèðîâàíèå ñèãíàëîâ íà âûõîäàõ öèôðîâîé ñõåìû îòíîñèòåëüíî èçìåíåíèÿ ñèãíàëîâ íà åå âõîäàõ. Åñëè äðàéâåð (èñòî÷íèê) ñèãíàëà öåïè èìååò íåêîòîðîå çíà÷åíèå, òî è öåïü ïðèíèìàåò òî æå çíà÷åíèå. Åñëè äðàéâåðû öåïè ïðèíèìàþò ðàçëè÷íûå çíà÷åíèÿ, öåïü ïðèíèìàåò çíà÷åíèå íàèáîëåå «ñèëüíîãî» ñèãíàëà (strongest), åñëè æå «ñèëà» êàæäîãî ñèãíàëà ðàâíîçíà÷íà, òî öåïü ïðèíèìàåò íåîïðåäåëåííîå ñîñòîÿíèå (x). Äëÿ îáîçíà÷åíèÿ öåïè íàèáîëåå ÷àñòî ïðèìåíÿåòñÿ êëþ÷åâîå ñëîâî wire, êëþ÷åâûå ñëîâà supply0 è supply1 èñïîëüçóþòñÿ äëÿ ìîäåëèðîâàíèÿ èñòî÷íèêîâ ïèòàíèÿ (power supplies) â ñõåìå.
5.5. Ðåãèñòðû (Registers) Äëÿ îáîçíà÷åíèÿ ðåãèñòðîâ èñïîëüçóåòñÿ ñëåäóþùåå êëþ÷åâîå ñëîâî: reg. Âåëè÷èíà ïî óìîë÷àíèþ: õ. Ðàçðÿäíîñòü ïî óìîë÷àíèþ: 1 áèò.
367
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Îñíîâíîå ðàçëè÷èå ìåæäó öåïÿìè (Nets) è ðåãèñòðàìè (Registers) ñîñòîèò â òîì, ÷òî çíà÷åíèå ðåãèñòðà äîëæíî áûòü íàçíà÷åíî ÿâíî. Ýòà âåëè÷èíà ñîõðàíÿåòñÿ äî òåõ ïîð, ïîêà íå ñäåëàíî íîâîå íàçíà÷åíèå. Ðàññìîòðèì èñïîëüçîâàíèå ýòîãî ñâîéñòâà íà ïðèìåðå òðèããåðà ñ ðàçðåøåíèåì (çàùåëêè, E-type Flipflop): module E_ff(q, data, enable, reset, clock); output q; input data, enable, reset, clock; reg q; always @(posedge clock) if (reset == 0) q = 1’b0; else if (enable==1) q = data; endmodule Ðåãèñòð q õðàíèò çàïèñàííóþ â íåãî âåëè÷èíó äî òåõ ïîð, ïîêà íå ïðîèçîéäåò íîâîãî íàçíà÷åíèÿ ñèãíàëà. Äëÿ òîãî ÷òîáû ïðîâåñòè ìîäåëèðîâàíèå ýòîãî ïðèìåðà, íàïèøåì ìîäóëü âåðõíåãî óðîâíÿ (higher level module), êîòîðûé ôîðìèðóåò òåñòîâûé ñèãíàë è ïîçâîëÿåò ïðîâåñòè íàáëþäåíèå çà âûõîäàìè òðèããåðà.  ýòîì ñëó÷àå ñèãíàë q ÿâëÿåòñÿ öåïüþ, äðàéâåðîì (èñòî÷íèêîì) êîòîðîé ñëóæèò ìîäóëü E_ff . module stimulus; reg data, enable, clock, reset; wire q; initial begin clock = 1’b0; forever #5 clock = ~clock; end E_ff eff0(q, data, enable, reset, clock); initial begin
368
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL reset = 1'b0; #10 reset = 1'b1; data = 1'b1; #20 enable = 1; #10 data = 1'b0; #10 data = 1'b1; #10 enable = 0; #10 data = 1'b0; #10 data = 1'b1; #10 enable = 1; #10 reset = 1'b0; #30 $finish; end initial $monitor($time, "q = %d", q); endmodule
5.6. Âåêòîðû (Vectors) Kàê öåïè, òàê è ðåãèñòðû ìîãóò èìåòü ïðîèçâîëüíóþ ðàçðÿäíîñòü, åñëè èõ îáúÿâëÿòü êàê âåêòîðû. Íèæå ïðèâåäåíû ïðèìåðû îáúÿâëåíèé âåêòîðîâ. reg [3:0] output; // âûõîä 4-ðàçðÿäíîãî ðåãèñòðà wire [31:0] data; // 32-ðàçðÿäíàÿ öåïü reg [7:0] a; data[3:0] = output; // ÷àñòè÷íîå íàçíà÷åíèå output = 4b0101; // íàçíà÷åíèå íà öåëûé ðåãèñòð Âàæíûì ÿâëÿåòñÿ ïîðÿäîê íàçíà÷åíèÿ ýëåìåíòîâ â âåêòîðå. Ïåðâûé ýëåìåíò ðåãèñòðà ÿâëÿåòñÿ íàèáîëåå çíà÷èìûì (most significant): reg [3:0] a; // à3 ñòàðøèé ðàçðÿä reg [0:3] b; // b0 ñòàðøèé ðàçðÿä
369
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.7. Ìàññèâû (Arrays) Ðåãèñòðû (Registers), öåëûå ÷èñëà (Integers) è âðåìåííûå (Time) òèïû äàííûõ ìîæíî îáúÿâëÿòü êàê ìàññèâû, êàê ýòî ïîêàçàíî â íèæåñëåäóþùåì ïðèìåðå: Îáúÿâëåíèå: {size} {array_size} Èñïîëüçîâàíèå: {array_reference} {bit_reference} reg data [7:0]; // 8 1-ðàçðÿäíûõ ýëåìåíòîâ integer [3:0] out [31:0]; // 32 4-ðàçðÿäíûõ ýëåìåíòà data[5]; // 5 8-ðàçðÿäíûõ ýëåìåíòîâ
5.8. Ðåãèñòðîâûå ôàéëû (Memories) Ðåãèñòðîâûé ôàéë (Memories) ïðåäñòàâëÿåò ñîáîé ìàññèâ ðåãèñòðîâ (Array of registers). Íèæå ïðåäñòàâëåí ñèíòàêñèñ îáúÿâëåíèÿ ðåãèñòðîâîãî ôàéëà. reg [15:0] mem16_1024 [1023:0]; // ðåãèñòðîâûé ôàéë 1K ⫻ 16 mem16_1024[489]; // 489 ýëåìåíò ôàéëà mem16_1024 Æåëàòåëüíî äëÿ îáîçíà÷åíèÿ ðåãèñòðîâûõ ôàéëîâ èñïîëüçîâàòü èíôîðìàòèâíûå èìåíà, íàïðèìåð mem16_1024, ÷òîáû èçáåæàòü ïóòàíèöû.
5.9. Ýëåìåíòû ñ òðåòüèì ñîñòîÿíèåì (Tri-state) Kàê óæå óïîìèíàëîñü, â ÿçûêå Verilog ñèòóàöèÿ, êîãäà äðàéâåðàìè îäíîé öåïè ÿâëÿþòñÿ áîëåå îäíîãî èñòî÷íèêà ñ ðàçíûìè çíà÷åíèÿìè, ðàçðåøàåòñÿ â ïîëüçó èñòî÷íèêà, èìåþùåãî áîëüøóþ «ñèëó». Íàèìåíüøóþ «ñèëó» èìååò ñèãíàë z, îáîçíà÷àþùèé òðåòüå èëè âûñîêîèìïåäàíñíîå (high-impedance) ñîñòîÿíèå. Ïðàâäà, ýòè ðàññóæäåíèÿ àêòóàëüíû èìåííî íà ýòàïå ìîäåëèðîâàíèÿ, íî íèêàê íå ñèíòåçà ÏËÈÑ, î íèõ ñëåäóåò ïîìíèòü ïðè ðàçðàáîòêå òåñòîâ. Òàêèì îáðàçîì, äðàéâåð â òðåòüåì ñîñòîÿíèè
370
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL íå âëèÿåò íà èòîãîâîå çíà÷åíèå ñèãíàëà öåïè. Ïðèìåð äðàéâåðà ñ òðåòüèì ñîñòîÿíèåì ïðèâåäåí íèæå. module triDriver(bus, drive, value); inout [3:0] bus; input drive; input [3:0] value; assign #2 bus = (drive == 1) ? value : 4’bz; endmodule // triDriver  äàííîì ïðèìåðå, êîãäà óïðàâëÿþùèé ñèãíàë ïðèíèìàåò ÂÛÑÎKÈÉ óðîâåíü, øèíà ïðèíèìàåò çíà÷åíèå âõîäíîé âåëè÷èíû, â ïðîòèâíîì ñëó÷àå øèíà ïåðåõîäèò â òðåòüå ñîñòîÿíèå.  ñëåäóþùåì ïðèìåðå èñïîëüçóåòñÿ íåñêîëüêî óïðàâëÿþùèõ êîìáèíàöèé äëÿ òðåõ áóôåðîâ ñ òðåìÿ ñîñòîÿíèÿìè. module myTest; wire [3:0] bus; reg drive0, drive1, drive2; integer
i;
triDriver mod1 (bus, drive0, i[3:0]); triDriver mod2 (bus, drive1, 4'hf); triDriver mod3 (bus, drive2, 4'h0); initial begin for (i = 0; i < 12; i = i + 1) begin #5 {drive2, drive1, drive0} = i; #5 $display ($time,"%b %b %d", i[2:0], bus, bus); end $finish; end endmodule
371
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Ðåçóëüòàòû ïðîãîíà ìîäåëè èìåþò âèä: 10 000 zzzz z 20 001 0001 1 30 010 1111 15 40 011 xx11 X 50 100 0000 0 60 101 0x0x X 70 110 xxxx x 80 111 xxxx x 90 000 zzzz z 100 001 1001 9 110 010 1111 15 120 011 1x11 X
5.10. Àðèôìåòè÷åñêèå îïåðàòîðû (Arithmetic operators) Ñèìâîëû (keysymbols): *, /, +, -, % . Áèíàðíûå îïåðàòîðû óìíîæåíèÿ, äåëåíèÿ, ñëîæåíèÿ, âû÷èòàíèÿ, îïðåäåëåíèÿ îñòàòêà îò äåëåíèÿ ïðåäñòàâëåíû â íèæåñëåäóþùåì ïðèìåðå. module arithTest; reg [3:0] a, b; initial begin a = 4'b1100; // 12 b = 4'b0011; // 3 $displayb(a * b); // умножение 4'b1000 // 4 МСБ $display(a / b); // деление 4 $display(a + b); // сложение 15 $display(a b); // вычитание 9 $display((a + 1'b1) % b); // остаток 1 end endmodule // arithTest
372
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Óíàðíûå ïëþñ è ìèíóñ èìåþò áîëåå âûñîêèé ïðèîðèòåò (precedance), ÷åì áèíàðíûå îïåðàòîðû. Ñëåäóåò çàìåòèòü, ÷òî åñëè õîòÿ áû îäèí áèò â îäíîì èç îïåðàíäîâ íåîïðåäåëåí (ðàâåí x), òî è ðåçóëüòàò îïåðàöèè òàêæå áóäåò íåîïðåäåëåí.
5.11. Ëîãè÷åñêèå îïåðàòîðû (Logical operators) Këþ÷åâûå ñèìâîëû: &&, ||, !. K ëîãè÷åñêèì îïåðàöèÿì îòíîñÿòñÿ «È» (AND), «ÈËÈ» (OR) è «ÍÅ» (NOT). Ðåçóëüòàò ëîãè÷åñêîé îïåðàöèè ìîæåò ïðèíèìàòü çíà÷åíèÿ èñòèííî (TRUE, "1") èëè ëîæíî (FALSE, "0"), à òàêæå èìåòü íåîïðåäåëåííîå ñîñòîÿíèå (unknown, x). Ïðè âûïîëíåíèè ëîãè÷åñêîãî îïåðàòîðà âñå íåîïðåäåëåííûå âåëè÷èíû, êàê è îïåðàíäû â òðåòüåì ñîñòîÿíèè, ïðèíèìàþòñÿ êàê èìåþùèå ÍÈÇKÈÉ ëîãè÷åñêèé óðîâåíü (FALSE).  êà÷åñòâå îïåðàíäà ìîãóò âûñòóïàòü êàê ïåðåìåííàÿ (Variable), òàê è ëîãè÷åñêîå âûðàæåíèå (Expression). Ïðèìåð ðàáîòû ëîãè÷åñêèõ îïåðàòîðîâ ïðèâåäåí íèæå. module logicalTest; reg [3:0] a, b, c; initial begin a = 2; b = 0; c = 4'hx; $display(a && b); // И 0 $display(a || b); // ИЛИ 1 $display(!a); // НЕ 0 $display(a || c); // 1, unknown || 1 (=1) $display(!c); // unknown end endmodule // logicalTest
373
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.12. Îïåðàòîðû îòíîøåíèÿ (Relational Operators) Këþ÷åâûå ñèìâîëû: >, <, >=, <=. K îïåðàòîðàì îòíîøåíèÿ îòíîñÿòñÿ îïåðàòîðû «áîëüøå», «ìåíüøå», «áîëüøå èëè ðàâíî», «ìåíüøå èëè ðàâíî». Ðåçóëüòàò îïåðàöèè èñòèíà èëè ëîæü. Åñëè õîòÿ áû îäèí îïåðàíä íåîïðåäåëåí, òî è ðåçóëüòàò îïåðàöèè áóäåò íåîïðåäåëåí. module relatTest; reg [3:0] a, b ,c, d; initial begin a=2; b=5; c=2; d=4’hx; $display(a < b); // true, 1 $display(a > b); false, 0 $display(a >= c); // true, 1 $display(d <= a); unknown end endmodule // relatTest
5.13. Îïåðàòîðû ýêâèâàëåíòíîñòè (Equality) Këþ÷åâûå ñèìâîëû: ==, !=, ===, !==. K îïåðàòîðàì ýêâèâàëåíòíîñòè (Equality operators) îòíîñÿòñÿ îïåðàòîð ëîãè÷åñêîãî ðàâåíñòâà (logical equality), íåðàâåíñòâà (logical inequality), âûáîðî÷íîãî ðàâåíñòâà (CASE equality) è íåðàâåíñòâà (inequality). Ýòè îïåðàòîðû ñðàâíèâàþò îïåðàíäû ïîáèòíî. Ëîãè÷åñêèå îïåðàòîðû âîçâðàùàþò íåîïðåäåëåííûé ðåçóëüòàò, åñëè îïåðàíä ñîäåðæèò íåîïðåäåëåííûå áèòû, â îòëè÷èå îò âûáîðî÷íûõ îïåðàòîðîâ.  ñëó÷àå íåðàâíîé äëèíû îïåðàíäîâ áîëåå êîðîòêèé äîïîëíÿåòñÿ íóëÿìè. Íèæå ïðèâåäåí ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðîâ ýêâèâàëåíòíîñòè.
374
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL module equTest; reg [3:0] a, b ,c, d, e, f; initial begin a = 4; b = 7; // these default to decimal bases c = 4'b010; d = 4'bx10; e = 4'bx101; f = 4'bxx01; $displayb(c); $displayb(d);
// outputs 0010 // outputs xx10
$display(a == b); // logical equality, evaluates to 0 $display(c != d); // logical inequality, evaluates to x $display(c != f); // logical inequality, evaluates to 1 $display(d === e); // case equality, evaluates to 0 $display(c !== d); // case inequality, evaluates to 1 end endmodule // equTest Íó è, íàâåðíîå, ñîâåðøåííî ïîíÿòíî, ÷òî îïåðàòîðû ýêâèâàëåíòíîñòè è ïðèñâàèâàíèÿ ñîâåðøåííî ðàçëè÷íûå îïåðàòîðû.
5.14. Ïîðàçðÿäíûå îïåðàòîðû (Bitwise operators) Këþ÷åâûå ñèìâîëû: ~, &, |, ^, (~^, ^~). K ïîðàçðÿäíûì îïåðàòîðàì îòíîñÿòñÿ ïîðàçðÿäíîå îòðèöàíèå, ïîðàçðÿäíûå ëîãè÷åñêèå «È», «ÈËÈ», èñêëþ÷àþùåå «ÈËÈ», èñêëþ÷àþùåå «ÈËÈ-ÍÅ». Ïîðàçðÿäíûå îïåðàòîðû âûïîëíÿþòñÿ òîëüêî íàä îïåðàíäàìè, èìåþùèìè îäèíàêîâóþ ðàçðÿäíîñòü.  òîì ñëó÷àå, åñëè ðàçðÿäíîñòü îäíîãî îïåðàíäà ìåíüøå äðóãîãî, íåäîñòàþùèå ðàçðÿäû äîïîëíÿþòñÿ íóëÿìè. Íèæå ïðèâåäåí ïðèìåð èñïîëüçîâàíèÿ ïîðàçðÿäíûõ îïåðàòîðîâ. module bitTest; reg [3:0] a, b ,c;
375
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL initial begin a = 4'b1100; b = 4'b0011; c = 4'b0101; $displayb(~a); // bitwise negation, evaluates to $displayb(a & c); // bitwise and, evaluates to $displayb(a | b); // bitwise or, evaluates to $displayb(b ^ c); // bitwise xor, evaluates to $displayb(a ~^ c); // bitwise xnor, evaluates to end endmodule // bitTest
4'b0011 4'b0100 4'b1111 4'b0110 4'b0110
5.15. Îïåðàòîðû ïðèâåäåíèÿ (Reduction operator) Këþ÷åâûå ñèìâîëû: &, ~&, |, ~|, ^, ~^, ^~. Îïåðàòîðû ïðèâåäåíèÿ «È», «ÈËÈ», «È-ÍÅ», «ÈËÈ-ÍÅ», «èñêëþ÷àþùåå ÈËÈ», «èñêëþ÷àþùåå ÈËÈ-ÍÅ» (äâà âàðèàíòà). Îíè âûïîëíÿþòñÿ íàä ìíîãîðàçðÿäíûì îïåðàíäîì ïîøàãîâî, áèò çà áèòîì, íà÷èíàÿ ñ äâóõ êðàéíèõ ëåâûõ ðàçðÿäîâ, âûäàâàÿ íà âûõîäå îäíîðàçðÿäíûé ðåçóëüòàò. Î÷åâèäíî, ÷òî òàêîé ïîäõîä ïîçâîëÿåò ðåàëèçîâàòü ïðîâåðêó íà ÷åòíîñòü (íå÷åòíîñòü). Íèæå ïðèâåäåíû ïðèìåðû èñïîëüçîâàíèÿ îïåðàòîðîâ ïðèâåäåíèÿ. module reductTest; reg [3:0] a, b ,c; initial begin a = 4'b1111; b = 4'b0101; c = 4'b0011; $displayb(& a);//, (то же 1&1&1&1), равен 1 1 $displayb(| b); // (same as 0|1|0|1), evaluates to 1 $displayb(^ b); // искл.ИЛИ (same as 0^1^0^1), eval uates to 0 end endmodule // reductTest Áåçóñëîâíî, ñëåäóåò çàìå÷àòü ðàçëè÷èÿ ìåæäó ëîãè÷åñêèìè îïåðàòîðàìè, ïîðàçðÿäíûìè îïåðàòîðàìè è îïåðàòîðàìè ïðèâåäåíèÿ. Íåñìîòðÿ íà ñõîæåñòü ñèìâîëîâ ýòèõ îïåðàòîðîâ, ÷èñëî îïåðàíäîâ â êàæäîì ñëó÷àå ðàçëè÷íî.
376
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.16. Îïåðàòîðû ñäâèãà (SHIFT operator) Këþ÷åâûå ñèìâîëû: >>, <<. Îïåðàòîðû ñäâèãà ïîçâîëÿþò îñóùåñòâèòü ñäâèã îïåðàíäà êàê âïðàâî, òàê è âëåâî. Ïðèìåð èõ èñïîëüçîâàíèÿ ïðèâåäåí íèæå. module shiftTest; reg [3:0] a; initial begin a = 4'b1010; $displayb(a << 1); 4'b0100 $displayb(a >> 2); 4'b0010 end
// shift left by 1, evaluates to // shift right by 2, evaluates to
endmodule // shiftTest Ýòîò îïåðàòîð ÷àñòî ïðèìåíÿþò äëÿ ðåàëèçàöèè ðåãèñòðîâ ñäâèãà, äëèííûõ àëãîðèòìîâ ïåðåìíîæåíèÿ è ò.ï.
5.17. Kîíêàòåíàöèÿ (îáúåäèíåíèå, Concatenation) Këþ÷åâîé ñèìâîë: {,} Îáúåäèíåíèå ïîçâîëÿåò óâåëè÷èòü ðàçðÿäíîñòü öåïåé, ðåãèñòðîâ è ò.ä. module concatTest; reg a; reg [1:0] b; reg [5:0] c; initial begin a = 1'b1; b = 2'b00; c = 6'b101001;
377
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL $displayb({a, b}); // produces a 3bit number 3'b100 $displayb({c[5:3], a}); // produces 4bit number 4'b1011 end endmodule // concatTest
5.18. Ïîâòîðåíèå (Replication) Ïîâòîðåíèå (Replication) ìîæåò áûòü èñïîëüçîâàíî äëÿ ìíîãîêðàòíîãî ïîâòîðåíèÿ îáúåäèíåíèÿ, êàê ïîêàçàíî â íèæåñëåäóþùåì ïðèìåðå. module reg reg reg
replicTest; a; [1:0] b; [5:0] c;
initial begin a = 1'b1; b = 2'b00; $displayb({4{a}}); // результат 1111 c = {4{a}}; $displayb(c); // результат 001111 end endmodule // replicTest
5.19. Ñèñòåìíûå äèðåêòèâû (System tasks) Íàâåðíîå, ýòîò ðàçäåë íå áóäåò èíòåðåñåí òåì, êòî ïèøåò òîëüêî ñèíòåçèðóåìûå îïèñàíèÿ íà Verilog. Íî ïîñêîëüêó ÿçûê ÿâëÿåòñÿ íå òîëüêî ñðåäñòâîì îïèñàíèÿ ïðîåêòà, íî è äîâîëüíî ìîùíûì èíñòðóìåíòîì äëÿ ïîâåäåí÷åñêîãî ìîäåëèðîâàíèÿ ñèñòåì, òî ñëåäóåò ñêàçàòü íåñêîëüêî ñëîâ î âñòðîåííûõ äèðåêòèâàõ êîìïèëÿòîðà, ïîçâîëÿþùèõ âûïîëíèòü ìîäåëèðîâàíèå è ïðîèçâåñòè àíàëèç åãî ðåçóëüòàòîâ.
378
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.19.1. Äèðåêòèâû âûâîäà ðåçóëüòàòîâ ìîäåëèðîâàíèÿ (Writing to standard output) Këþ÷åâûå ñëîâà: $display, $displayb, $displayh, $displayo, $write, $writeb, $writeh, $writeo. Íàèáîëåå ÷àñòî ïðèìåíÿåòñÿ äèðåêòèâà $display. Îíà ìîæåò áûòü èñïîëüçîâàíà äëÿ âûâîäà íà ýêðàí ñòðîê, âûðàæåíèé èëè ïåðåìåííûõ. Íèæå ïðèâåäåí ïðèìåð èñïîëüçîâàíèÿ äèðåêòèâû $display. $display("Hello Dr Blair"); — output: Hello Dr Blair $display($time) // current simulation time. — output: 460 counter = 4'b10; $display("The count is %b", counter); — output: The count is 0010 Ñèíòàêñ îïðåäåëåíèÿ ôîðìàòà âûâîäà àíàëîãè÷åí ñèíòàêñèñó printf â ÿçûêå ïðîãðàììèðîâàíèÿ C. Íèæå (â Òàáë. 5.1) ïðèâåäåíî åãî îïèñàíèå äëÿ äèðåêòèâû $display. Òàáëèöà 5.1. Îïèñàíèå ñèíòàêñèñà äëÿ äèðåêòèâû $display Ôîðìàò
Îïèñàíèå
%d èëè %D
decimal
%b èëè %B
binary
%h èëè %H
hexadecimal
%o èëè %O
octal
%m èëè %M
hierarchical name
%t èëè %T
Time format
%e èëè %E
Real in scientific format
%f èëè %F
Real in decimal formal
%g èëè %G
Real in shorter of above two
379
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Äëÿ ñïåöèàëüíûõ ñèìâîëîâ èñïîëüçóþòñÿ ñëåäóþùèå ýñêåéï-ïîñëåäîâàòåëüíîñòè (escape sequence): \n \t \\ \» %%
Íîâàÿ ñòðîêà òàáóëÿöèÿ \ « %
Äèðåêòèâà $write èäåíòè÷íà äèðåêòèâå $display, çà èñêëþ÷åíèåì òîãî, ÷òî îíà íå îñóùåñòâëÿåò àâòîìàòè÷åñêèé ïåðåõîä íà íîâóþ ñòðîêó â êîíöå âûâîäà èíôîðìàöèè. Åñëè ñïåöèôèêàöèÿ âûâîäà íå îïðåäåëåíà, òî ïî óìîë÷àíèþ èñïîëüçóþòñÿ ñëåäóþùèå ôîðìàòû: Äèðåêòèâà $display $displayb $displayh $displayo $write $writeb $writeh $writeo
Ôîðìàò ïî óìîë÷àíèþ decimal binary hexadecimal octal decimal binary hexadecimal octal
Òàê, íàïðèìåð, ñëåäóþùèé ôðàãìåíò êîäà: $write(5'b01101); $writeb(« «, 5'b01101); $writeh(« «, 5'b01101); $writeo(« «, 5'b01101,»\n»); È ðåçóëüòàò åãî ðàáîòû: 13 14
01101 0d 15
5.19.2. Kîíòðîëü ïðîöåññà ìîäåëèðîâàíèÿ (Monitoring a simulation) Këþ÷åâûå ñëîâà: $monitor, $monitoron, $monitoroff. Ôîðìàò äèðåêòèâû $monitor ïðàêòè÷åñêè àíàëîãè÷åí ôîðìàòó $display.
380
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Ðàçíèöà çàêëþ÷àåòñÿ â òîì, ÷òî âûõîä ôîðìèðóåòñÿ ïðè ëþáîì èçìåíåíèè ïåðåìåííûõ, êîòîðîå ïðîèçîéäåò â îïðåäåëåííîå âðåìÿ. Íàáëþäåíèå ìîæåò áûòü âêëþ÷åíî èëè îòêëþ÷åíî ñ ïîìîùüþ äèðåêòèâ $monitoron èëè $monitoroff ñîîòâåòñòâåííî. Ïî óìîë÷àíèþ â íà÷àëå ìîäåëèðîâàíèÿ íàáëþäåíèå çà åãî õîäîì âêëþ÷åíî. Íèæå ïðèâåäåí ïðèìåð íàáëþäåíèÿ çà ìîäåëèðîâàíèåì. module myTest; integer a,b; initial begin a = 2; b = 4; forever begin #5 a = a + b; #5 b = a 1; end // forever begin end // initial begin initial #40 $finish; initial begin $monitor($time, «a = %d, b = %d», a, b); end // initial begin endmodule // myTest Ðåçóëüòàò ïðîãîíà: 0 5 10 15 20 25 30 35
a a a a a a a a
= = = = = = = =
2, 6, 6, 11, 11, 21, 21, 41,
b b b b b b b b
= = = = = = = =
4 4 5 5 10 10 20 20
381
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.19.3. Îêîí÷àíèå ìîäåëèðîâàíèÿ (Ending a simulation) Këþ÷åâûå ñëîâà: $stop, $finish. Äèðåêòèâà $finish çàâåðøàåò ñèìóëÿöèþ è ïåðåäàåò óïðàâëåíèå îïåðàöèîííîé ñèñòåìå. Äèðåêòèâà $stop ïðèîñòàíàâëèâàåò ìîäåëèðîâàíèå è ïåðåâîäèò ñèñòåìó ñ Verilog â èíòåðàêòèâíûé ðåæèì (ñì. ïðèìåð íèæå). initial begin clock = 1’b0; #200 $stop #500 $finish End
5.20. Ïðîåêòèðîâàíèå êîìáèíàöèîííûõ ñõåì, ïðèìåð ïðîåêòèðîâàíèÿ ìóëüòèïëåêñîðà 4 â 1 Ðàññìîòðèì ïðîåêòèðîâàíèå êîìáèíàöèîííûõ ëîãè÷åñêèõ óñòðîéñòâ íà ïðèìåðå ìóëüòèïëåêñîðà 4 â 1. Ïðè ïðîåêòèðîâàíèè ìóëüòèïëåêñîðà ðàññìîòðèì ðàçëè÷íûå ìåòîäû åãî ïîñòðîåíèÿ.
5.20.1. Ðåàëèçàöèÿ íà óðîâíå ëîãè÷åñêèõ âåíòèëåé (Gate level implementation) Ðàññìîòðèì ïðèìåð ðåàëèçàöèè íàøåãî ìóëüòèïëåêñîðà 4 â 1 íà óðîâíå ëîãè÷åñêèõ âåíòèëåé. module multiplexor4_1(out, cntrl1, cntrl2);
in1,
in2,
in3,
in4,
output out; input in1, in2, in3, in4, cntrl1, cntrl2; wire notcntlr1, notcntrl2, w, x, y, z; not (notcntrl1, cntrl1); not (notcntrl2, cntrl2); and (w, in1, notcntrl1, notcntrl2); and (x, in2, notcntrl1, cntrl2);
382
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL and (y, in3, cntrl1, notcntrl2); and (z, in4, cntrl1, cntrl2); or (out, w, x, y, z); endmodule Íà÷íåì ïîäðîáíîå ïîñòðî÷íîå ðàññìîòðåíèå ýòîãî ïðèìåðà. Èòàê, «â ïåðâûõ ñòðîêàõ» ó íàñ: module multiplexor4_1(out, cntrl1, cntrl2);
in1,
in2,
in3,
in4,
Ïåðâàÿ ñòðîêà îïèñàíèå ìîäóëÿ, êëþ÷åâîå ñëîâî module èñïîëüçóåòñÿ âìåñòå ñ èìåíåì ìîäóëÿ, ïî êîòîðîìó îñóùåñòâëÿåòñÿ ññûëêà íà ìîäóëü.  ñêîáêàõ ïðèâåäåí ñïèñîê ïîðòîâ ìîäóëÿ, ïðè÷åì âíà÷àëå ïåðå÷èñëÿþòñÿ âûõîäû, çàòåì âõîäû. Kàæäàÿ ñòðîêà çàâåðøàåòñÿ òî÷êîé ñ çàïÿòîé ýòî, êàê èçâåñòíî, ïðàâèëî äëÿ ìíîãèõ ÿçûêîâ âûñîêîãî óðîâíÿ. output out; input in1, in2, in3, in4, cntrl1, cntrl2; Âñå ïîðòû â ñïèñêå äîëæíû áûòü îáúÿâëåíû êàê âõîäû, âûõîäû èëè äâóíàïðàâëåííûå âûâîäû (inout), â ýòîì ñëó÷àå îíè ïî óìîë÷àíèþ íàçíà÷àþòñÿ òèïîì wire, åñëè íåò äðóãèõ óêàçàíèé. Kîãäà íàçíà÷åíî èìÿ öåïè, ñèñòåìà ìîäåëèðîâàíèÿ íà áàçå Verilog îæèäàåò íåÿâíîå íàçíà÷åíèå âûõîäíîãî ñèãíàëà, îöåíèâàÿ åãî, ÷òîáû îñóùåñòâëÿòü ïåðåäà÷ó ýòîãî ñèãíàëà ê âíåøíèì ìîäóëÿì. wire notcntrl1, notcntrl2, w, x, y, z;  äàííîé ñòðîêå îïðåäåëÿþòñÿ âíóòðåííèå öåïè, îñóùåñòâëÿþùèå îáúåäèíåíèå óçëîâ ìóëüòèïëåêñîðà. Kàê âèäèì, ïîíÿòèÿ öåïè â Verilog è ñèãíàëà â VHDL î÷åíü ñõîæè. not (notcntrl1, cntrl1); not (notcntrl2, cntrl2);
383
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL  ýòèõ ñòðî÷êàõ îïèñûâàþòñÿ âåíòèëè «ÍÅ» ñ âõîäàìè cntrl1 è cntrl2 è âûõîäàìè notcntrl1 è notcntrl2 ñîîòâåòñòâåííî. Ñëåäóåò ïîìíèòü, ÷òî â îïèñàíèè ïîðòîâ âåíòèëÿ âñåãäà âíà÷àëå èäóò âûõîäû, çàòåì âõîäû. and and and and
(w, (x, (y, (z,
in1, in2, in3, in4,
notcntrl1, notcntrl2); notcntrl1, cntrl2); cntrl1, notcntrl2); cntrl1, cntrl2);
or (out, w, x, y, z); Àíàëîãè÷íî îïèñûâàþòñÿ è âåíòèëè «È» è «ÈËÈ». endmodule Kîíåö ìîäóëÿ çàâåðøàåòñÿ êëþ÷åâûì ñëîâîì endmodule.
5.20.2. Ðåàëèçàöèÿ ìóëüòèïëåêñîðà ñ ïîìîùüþ ëîãè÷åñêèõ îïåðàòîðîâ (Logic statement implementation) Ðåàëèçàöèÿ ìóëüòèïëåêñîðà ñ èñïîëüçîâàíèåì ëîãè÷åñêèõ îïåðàòîðîâ èìååò âèä: module multiplexor4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2); output out; input in1, in2, in3, in4, cntrl1, cntrl2; assign out = (in1 & ~cntrl1 & ~cntrl2) | (in2 & ~cntrl1 & cntrl2) | (in3 & cntrl1 & ~cntrl2) | (in4 & cntrl1 & cntrl2); endmodule Íó, â íà÷àëå ôàéëà âñå ïîíÿòíî èìÿ ïðîåêòà, ïîðòû
module multiplexor4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2);
384
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL output out; input in1, in2, in3, in4, cntrl1, cntrl2; Îáðàòèì âíèìàíèå, ÷òî íè ïîðòû, íè èõ êîëè÷åñòâî íå èçìåíèëîñü ñòûêîâêà ñ âíåøíèìè ìîäóëÿìè òàêæå îñòàíåòñÿ íåèçìåííîé.  êàêîé-òî ìåðå ýòî íàïîìèíàåò ïðîåêò ñ èñïîëüçîâàíèåì VHDL, êîãäà äëÿ îäíîãî èíòåðôåéñà ìîæíî îïèñàòü íåñêîëüêî àðõèòåêòóðíûõ òåë. assign out = (in1 (in2 (in3 (in4 endmodule
& ~cntrl1 & ~cntrl2) | & ~cntrl1 & cntrl2) | & cntrl1 & ~cntrl2) | & cntrl1 & cntrl2);
Ñ ïîìîùüþ êîíñòðóêöèè assign îñóùåñòâëÿåòñÿ íåïðåðûâíîå íàçíà÷åíèå (continuous assignment) öåïè out.  ýòîì ñëó÷àå åå çíà÷åíèå çàíîâî âû÷èñëÿåòñÿ êàæäûé ðàç, êîãäà ìåíÿåòñÿ õîòü îäèí èç îïåðàíäîâ.
5.20.3. Ðåàëèçàöèÿ ñ ïîìîùüþ îïåðàòîðà âûáîðà (CASE statement implementation) Ðàññìîòðèì èñïîëüçîâàíèå îïåðàòîðà âûáîðà (CASE statement) äëÿ ðåàëèçàöèè ìóëüòèïëåêñîðà. Ñëåäóåò çàìåòèòü, ÷òî ýòîò ñïîñîá, íàâåðíîå, íàèáîëåå ïðîñò è íàèìåíåå òðóäîåìîê. module multiplexor4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2); output out; input in1, in2, in3, in4, cntrl1, cntrl2; reg out; always @(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) case ({cntrl1, cntrl2}) 2'b00 : out = in1; 2'b01 : out = in2; 2'b10 : out = in3; 2'b11 : out = in4;
385
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL default : $display(«Please check control bits»); endcase endmodule Íó, ïåðâûå òðè ñòðîêè çíàêîìû äîáàâèòü ê ñêàçàííîìó ðàíåå ïðàêòè÷åñêè íå÷åãî. module multiplexor4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2); output out; input in1, in2, in3, in4, cntrl1, cntrl2; reg out; Åäèíñòâåííîå îòëè÷èå âûõîä out îïðåäåëåí êàê ðåãèñòð, ýòî ñäåëàíî äëÿ òîãî, ÷òîáû íàçíà÷àòü åãî çíà÷åíèÿ ÿâíî è íå óïðàâëÿòü èìè, òàêîå íàçíà÷åíèå ñèãíàëà íàçûâàåòñÿ ïðîöåäóðíûì íàçíà÷åíèåì (procedural assignment). Äàííûå òèïà wire íå ìîãóò áûòü íàçíà÷åíû ÿâíî, îíè íóæäàþòñÿ â ñèãíàëå äðàéâåðà, òàêîå íàçíà÷åíèå íàçûâàåòñÿ íåïðåðûâíûì íàçíà÷åíèåì (continuous assignment). always @(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) Ýòà êîíñòðóêöèÿ ÷èòàåòñÿ òàê æå, êàê è ïèøåòñÿ, ò.å. çíà÷åíèå âû÷èñëÿåòñÿ âñåãäà ïðè èçìåíåíèè õîòÿ áû îäíîãî îïåðàíäà ñèñòåìà ïîñòîÿííî èõ îòñëåæèâàåò. Íåñêîëüêî çàáåãàÿ âïåðåä, ñëåäóåò îòìåòèòü, ÷òî äàííàÿ êîíñòðóêöèÿ ÿâëÿåòñÿ ñèíòåçèðóåìîé âî ìíîãèõ ñèñòåìàõ ïðîåêòèðîâàíèÿ, â ÷àñòíîñòè è â MAX+PLUS II ôèðìû «Altera». Ñïèñîê ïåðåìåííûõ íàçûâàåòñÿ ñïèñêîì ÷óâñòâèòåëüíîñòè (sensitivity list), ïîñêîëüêó äàííàÿ êîíñòðóêöèÿ ÷óâñòâèòåëüíà ê èõ èçìåíåíèÿì. Äàííûé òåðìèí íàì óæå èçâåñòåí èç îïèñàíèÿ ÿçûêà VHDL. Këþ÷åâîå ñëîâî always @ (expr or expr ...). case ({cntrl2, 2'b00 : out = 2'b01 : out = 2'b10 : out = 2'b11 : out =
cntrl1}) in1; in2; in3; in4;
386
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL default : $display(«Please check control bits»); endcase endmodule Ñèíòàêñèñ îïåðàòîðà âûáîðà case â Verilog ñõîäåí ñ ñèíòàêñèñîì îïåðàòîðà âûáîðà â ÿçûêå C++. Óñëîâèåì ÿâëÿåòñÿ êîíòàòåíàöèÿ èëè îáúåäèíåíèå ïåðåìåííûõ cntr2 è cntr1 â äâóõðàçðÿäíîå ÷èñëî. Çàâåðøàåò îïåðàòîð âûáîðà êëþ÷åâîå ñëîâî endcase. Çäåñü íåëèøíå íàïîìíèòü, ÷òî ñëåäóåò ðàçëè÷àòü ïðîöåäóðíîå è íåïðåðûâíîå íàçíà÷åíèå ñèãíàëîâ, ÷òî è èëëþñòðèðóþò âûøåïðèâåäåííûå ïðèìåðû.
5.20.4. Ðåàëèçàöèÿ ñ èñïîëüçîâàíèåì óñëîâíîãî îïåðàòîðà (Conditional operator implementation)  ïðèíöèïå íè÷åãî íîâîãî ìû óæå íå âèäèì ÿñíî âèäíî, ÷òî â íàøåì ñëó÷àå óñëîâíûé îïåðàòîð ïðîèãðûâàåò îïåðàòîðó CASE â íàãëÿäíîñòè ïðåäñòàâëåíèÿ (õîòÿ äëÿ áîëüøèíñòâà ñèñòåì ïðîåêòèðîâàíèÿ ñèíòåçèðóåìûå ðåàëèçàöèè îêàæóòñÿ èäåíòè÷íûìè). module multiplexor4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2); output out; input in1, in2, in3, in4, cntrl1, cntrl2; assign out = cntrl1 ? (cntrl2 ? in4 : in3) : (cntrl2 ? in2 : in1); endmodule
5.20.5. Òåñòîâûé ìîäóëü (The stimulus module) Âîîáùå ãîâîðÿ, ïåðâîíà÷àëüíî ÿçûê Verilog çàäóìûâàëñÿ êàê ÿçûê âåðèôèêàöèè öèôðîâûõ óñòðîéñòâ (Verify Logic), ïîýòîìó îäíîé èç ìîùíûõ âîçìîæíîñòåé ÿçûêà ÿâëÿåòñÿ íàëè÷èå ñðåäñòâ äëÿ çàäàíèÿ òåñòîâûõ ñèãíàëîâ. Íèæå ïðèâîäèòñÿ ïðèìåð òàêîãî ìîäóëÿ äëÿ íàøåãî ìóëüòèïëåêñîðà 4 â 1. module muxstimulus;
387
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL reg IN1, IN2, IN3, IN4, CNTRL1, CNTRL2; wire OUT; multiplexor4_1 mux1_4(OUT, IN1, IN2, IN3, IN4, CNTRL1, CNTRL2); initial begin IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; $display(«Initial arbitrary values»); #0 $display(«input1 = %b, input2 = %b, input3 = %b, input4 = %b\n», IN1, IN2, IN3, IN4); {CNTRL1, CNTRL2} = 2'b00; #1 $display(«cntrl1=%b, cntrl2=%b, output is %b», CNTRL1, CNTRL2, OUT); {CNTRL1, CNTRL2} = 2'b01; #1 $display(«cntrl1=%b, cntrl2=%b output is %b», CNTRL1, CNTRL2, OUT); {CNTRL1, CNTRL2} = 2'b10; #1 $display(«cntrl1=%b, cntrl2=%b output is %b», CNTRL1, CNTRL2, OUT); {CNTRL1, CNTRL2} = 2'b11; #1 $display(«cntrl1=%b, cntrl2=%b output is %b», CNTRL1, CNTRL2, OUT); end endmodule Ðàññìîòðèì äàííûé ïðèìåð ïîäðîáíåå. module muxstimulus; Ïîñêîëüêó íàø ãåíåðàòîð òåñòîâ ÿâëÿåòñÿ ìîäóëåì âåðõíåãî óðîâíÿ èåðàðõèè (top level module), òî â åãî îïèñàíèè îòñóòñòâóåò ñïèñîê ïîðòîâ. Äëÿ çàäíèÿ ìîäóëÿ èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî module.
388
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL reg IN1, IN2, IN3, IN4, CNTRL1, CNTRL2; wire OUT;  äàííîì ñëó÷àå ìû îáåñïå÷èâàåì ïîäà÷ó òåñòîâûõ ñèãíàëîâ íà âõîäû íàøåãî ìóëüòèïëåêñîðà è ñíÿòèå ñèãíàëà ñ åãî âûõîäà, ñëåäîâàòåëüíî, ìû äîëæíû íàçíà÷èòü ñèãíàëû äëÿ âõîäîâ ìóëüòèïëåêñîðà è ñèãíàë, êîòîðûé óïðàâëÿåòñÿ (driven) åãî âûõîäîì. Ïîýòîìó è èñïîëüçîâàíû äàííûå òèïà reg äëÿ âõîäîâ è wire äëÿ âûõîäà. multiplexor4_1 mux1_4(OUT, IN1, IN2, IN3, IN4, CNTRL1, CNTRL2);  ýòîé ñòðîêå ïðîèñõîäèò îáðàùåíèå ê òåñòèðóåìîìó ìîäóëþ multiplexor4_1, â òàêèõ ñëó÷àÿõ ïðèíÿò ñëåäóþùèé ñèíòàêñèñ: <module_name> (port list); Èìÿ ýêçåìïëÿðà (instance name) î÷åíü ïîõîæå íà ïîíÿòèå ÿçûêà VHDL è ÿâëÿåòñÿ íåîáõîäèìûì ïðè îáðàùåíèè ê îïðåäåëÿåìûì ïîëüçîâàòåëåì ìîäóëÿì (user defined modules), äàáû íå íàðóøàòü èåðàðõèþ ïðîåêòà. Ñïèñîê ïîðòîâ (port list) óñòàíàâëèâàåò ñîîòâåòñòâèå ìåæäó ñèãíàëàìè òåñòîâîãî è òåñòèðóåìîãî ìîäóëåé, ïðè ýòîì ïîðÿäîê ïåðåìåííûõ â ñïèñêå ïîðòîâ äîëæåí ñîîòâåòñòâîâàòü ïîðÿäêó èõ îáúÿâëåíèÿ â òåñòîâîì ìîäóëå. initial begin IN1 = 1; IN2 = 0; IN3 = 1; IN4 = 0; $display("Initial arbitrary values"); #0 $display("input1 = %b, input2 = %b, input3 = %b, input4 = %b\n", IN1, IN2, IN3, IN4); Ñîáñòâåííî ìîäåëèðîâàíèå îñóùåñòâëÿåòñÿ êîíñòðóêöèåé, îïðåäåëÿåìîé êëþ÷åâûìè ñëîâàìè initial begin ... end. Îíà ïðåäíàçíà÷åíà äëÿ îáúåäèíåíèÿ èíñòðóêöèé, êîòîðûå ìîãóò âûïîëíÿòüñÿ îäíîâðåìåííî. Ïåðåä èíèöèàëèçàöèåé ïðîöåññà ìîäåëèðîâàíèÿ ñîîáùåíèå îá ýòîì âûâîäèòñÿ ñ ïîìîùüþ $display. Kîíñòðóêöèÿ #0 ïåðåä äèðåêòèâîé âûâîäà îçíà÷àåò, ÷òî âûâîä íà ýêðàí îñóùåñòâëÿåòñÿ ïîñëå íàçíà÷åíèÿ ñèãíàëîâ íà âõîäû. Ñèíòàêñ äèðåêòèâû $display ïîäîáåí ñèíòàêñèñó ôóíêöèè printf â ÿçûêå C++. $display( expr1, expr2, ...., exprN);
389
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Expr N ìîæåò áûòü ïåðåìåííîé, âûðàæåíèåì èëè ñòðîêîé. {CNTRL1, CNTRL2} = 2'b00; #1 $display("cntrl1=%b, cntrl2=%b, output is %b", CNTRL1, CNTRL2, OUT); Çäåñü îñóùåñòâëÿåòñÿ íàçíà÷åíèå ñèãíàëîâ óïðàâëåíèÿ. CNTRL1 = 0; CNTRL2 = 0; Îïåðàòîð êîíêàòåíàöèè (concatenation operator) { } ìîæåò áûòü èñïîëüçîâàí äëÿ ãðóïïîâîãî íàçíà÷åíèÿ. Ñëåäóåò ïîìíèòü, ÷òî ÷èñëî ðàçðÿäîâ â ÷èñëå è ïåðåìåííîé äîëæíî ñîâïàäàòü. {CNTRL1, CNTRL2} = 2'b01; #1 $display("cntrl1=%b, cntrl2=%b output is %b", CNTRL1, CNTRL2, OUT); {CNTRL1, CNTRL2} = 2'b10; #1 $display("cntrl1=%b, cntrl2=%b output is %b", CNTRL1, CNTRL2, OUT); {CNTRL1, CNTRL2} = 2'b11; #1 $display("cntrl1=%b, cntrl2=%b output is %b", CNTRL1, CNTRL2, OUT); end endmodule  ýòîì ôðàãìåíòå ñèãíàëû óïðàâëåíèÿ èçìåíÿþòñÿ, è èçìåíåíèå âûõîäà îòñëåæèâàåòñÿ äèðåêòèâîé display.  ýòîì ïðèìåðå äèðåêòèâà $display âûïîëíÿåòñÿ ñ íåêîòîðîé çàäåðæêîé îòíîñèòåëüíî ñèãíàëîâ óïðàâëåíèÿ, ÷òî ïîçâîëÿåò îòîáðàçèòü êîððåêòíûå çíà÷åíèÿ.
5.21. Ìîäóëè ïðîåêòà (Design blocks modules) Ðàññìîòðèì ïðàâèëà ïîñòðîåíèÿ èåðàðõè÷åñêîãî ïðîåêòà.  êà÷åñòâå ïðèìåðà ìû áóäåì ðàññìàòðèâàòü òðèããåð ñ ðàçðåøåíèåì.  Verilog âîçìîæíû äâà ïîäõîäà äëÿ åãî ðåàëèçàöèè:
390
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL ñâåðõó âíèç (top down) íà÷àòü ñ îïèñàíèÿ Å-òðèããåðà è äàëåå äîáàâëÿòü äåòàëè ïðîåêòà; ñíèçó ââåðõ (bottom up) íà÷àòü ñ áàçîâûõ áëîêîâ, à çàòåì îáúåäèíèòü èõ â åäèíûé ïðîåêò. Ìû âîñïîëüçóåìñÿ òåõíîëîãèåé ñíèçó ââåðõ, õîòÿ, íàâåðíîå, íàèáîëåå óäîáíî èñïîëüçîâàíèå îáîèõ ïîäõîäîâ. Íà÷íåì ñ îïèñàíèÿ D-òðèããåðà êàê ìîäóëÿ. Këþ÷åâûå ñëîâà äëÿ çàäàíèÿ ìîäóëÿ: module <module_name> ... endmodule, as below. Íèæå ïðèâåäåíî åãî îïèñàíèå. module dff(q, data, clock); output q; input data, clock; reg q; always @(posedge clock) q = data; endmodule // dff Àíàëîãè÷íîå ïîâåäåí÷åñêîå îïèñàíèå ìóëüòèïëåêñîðà ñ èíâåðñèåé (inverting multiplexor) èìååò âèä: module mux2_1(out, in1, in2, cntrl); output out; input in1, in2, cntrl; assign out = cntrl ? ~in1 : ~in2; endmodule // mux2_1 Òîãäà îïèñàíèå ìîäóëÿ âåðõíåãî óðîâíÿ äëÿ Å-òðèããåðà, ñîñòîÿùåãî èç D-òðèããåðà è ìóëüòèïëåêñîðà, ïðèíèìàåò âèä: module e_ff(q, data, enable, reset, clock); output q; input data, enable, reset, clock; wire norout, muxout; mux2_1 mod1 (muxout, data, q, enable);
391
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL nor (norout, reset, muxout); dff dff0 (q, norout, clock); endmodule Îáðàòèì åùå ðàç âíèìàíèå íà îáðàùåíèå ê ìîäóëþ, îïðåäåëÿåìîìó ïîëüçîâàòåëåì, ÷åðåç èìÿ ýêçåìïëÿðà ìîäóëÿ: name_of_module instance_name (port_list);
5.21.1. Òåñòèðîâàíèå Íèæå ïðèâåäåí òåêñò ìîäóëÿ äëÿ òåñòèðîâàíèÿ íàøåãî òðèããåðà. Kàê è â ïðèìåðå ñ ìóëüòèïëåêñîðîì, îí íå èìååò ñïèñêà ïîðòîâ, ïîñêîëüêó ÿâëÿåòñÿ ñàìûì âåðõíèì â èåðàðõèè. module e_ffStimulus; reg data, enable, reset, clock; wire q; e_ff mod1 (q, data, enable, reset, clock); initial begin clock = 1'b0; forever clock = #5 ~clock; end initial begin enable = 1'b0; // переменная разрешения reset = 1'b1; // активный уровень сброса 1 #20 reset = 1'b0; // сброс data = 1'b1; установка в HIGH #10 enable = 1'b1; // and then enable data latching #10 data = 1'b1; // изменение данных #20 data = 1'b0; // изменение данных #30 data = 1'b1; // изменение данных #10 data = 1'b0; // изменение данных #10 data = 1'b1; // изменение данных #20 enable = 1'b0; // запрет защелкивания
392
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL #10 data = 1'b0; // изменение данных #10 reset = 1'b1; // сброс снова #20 $finish; // все end // такт остановлен initial begin $display($time, "reset, enable, data, q"); $display($time, "%d %d %d %d", reset, enable, data, q); forever #10 $display($time, "%d %d %d %d", reset, enable, data, q); end endmodule // e_ffStimulus
5.22. Ïîðòû (Ports) Ïîðòû îáåñïå÷èâàþò ñâÿçü ìîäóëÿ ñ äðóãèìè ìîäóëÿìè ïðîåêòà. Íèæå ïðèâåäåíû ïîðòû äëÿ íàøåãî ïðèìåðà. module d_ff(q, d, reset, clock); module e_ff(q, d, enable, reset, clock); module Stimulus; Kàæäûé ïîðò ìîæåò áûòü îáúÿâëåí êàê âõîä, âûõîä èëè äâóíàïðàâëåííûé. Âñå îáúÿâëåííûå ïîðòû ïî óìîë÷àíèþ íàçíà÷àþòñÿ â öåïè, äëÿ èçìåíåíèÿ òèïà ñèãíàëà íåîáõîäèìî âûïîëíèòü íàçíà÷åíèå îòäåëüíî. Íàïðèìåð: module d_ff(q, d, reset, clock); output q; // îáÿçàòåëüíîå îáúÿâëåíèå ïîðòîâ input d, reset, clock; // êàê âõîäû è âûõîäû reg q; // ñíîâà îáúÿâëÿåì êàê ðåãèñòð Íå çàáûâàåì, ÷òî âûõîäû ìîäóëÿ èäóò ïåðâûìè â ñïèñêå ïîðòîâ.
393
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.23. Ïðàâèëà ñîåäèíåíèÿ (Connection rules) Âûøå ìû ðàññìàòðèâàëè äâà òèïà ìîäóëåé: âíåøíèå è âíóòðåííèå (outer and inner), â íàøåì ïðèìåðå âíåøíèì ìîäóëåì áûë Å-òðèããåð, âíóòðåííèì òðèããåð òèïà D. Íèæå ðàññìîòðèì îñíîâíûå ïðàâèëà ñîåäèíåíèÿ ìîäóëåé.
5.23.1. Âõîäû (inputs) Âõîäû âíóòðåííåãî ìîäóëÿ âñåãäà äîëæíû èìåò òèï wire, ïîñêîëüêó îíè óïðàâëÿþòñÿ âíåøíèìè ñèãíàëàìè. Âõîäû âíåøíåãî ìîäóëÿ ìîãóò èìåòü òèï êàê wire, òàê è ðåãèñòð.
5.23.2. Âûõîäû (outputs) Âî âíóòðåííåì ìîäóëå âûõîäû ìîãóò èìåòü òèï êàê öåïü, òàê è ðåãèñòð, â òî âðåìÿ êàê âûõîäû âíåøíåãî ìîäóëÿ äîëæíû áûòü òèïà öåïü, ïîñêîëüêó óïðàâëÿþòñÿ âíóòðåííèìè ìîäóëÿìè.
5.23.3. Äâóíàïðàâëåííûå âûâîäû (inouts) Äâóíàïðàâëåííûé ïîðò âñåãäà èìååò òèï öåïü.
5.23.4. Ñîîòâåòñòâèå ïîðòîâ (Port matching) Î÷åâèäíî, îáðàùàÿñü ê ìîäóëþ, íåîáõîäèìî, ÷òîáû ñîâïàäàëà ðàçðÿäíîñòü ïîðòîâ.
5.23.5. Ïðèñîåäèíåíèå ïîðòîâ (Connecting ports) Ïðèñîåäèíåíèå ïîðòîâ îñóùåñòâëÿåòñÿ ëèáî ïî ïîðÿäêó (ordered list), ëèáî ïî èìåíè ïîðòà (or by name). Íàïðèìåð: module d_ff( q, d, reset, clock); ... endmodule module e_ff(q, d , enable, reset, clock); output q; input d, enable, reset, clock; wire inD; ...
394
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL d_ff dff0(q, inD, reset, clock); ... endmodule
5.24. Áàçîâûå áëîêè (Basic blocks)  Verilog ïðèíÿòî äâà òèïà íàçíà÷åíèé: íåïðåðûâíîå è ïðîöåäóðíîå. Íåïðåðûâíîå íàçíà÷åíèå ìîæåò áûòü âûïîëíåíî äëÿ öåïåé èëè äëÿ èõ îáúåäèíåíèé (concatenation of nets). Îïåðàíäû ìîãóò èìåòü ïðîèçâîëüíûé òèï äàííûõ. Ïðîöåäóðíîå íàçíà÷åíèå ìîæåò áûòü âûïîëíåíî äëÿ äàííûõ òèïîâ reg, INTEGER, REAL èëè Time.
5.24.1. Èíèöèàëèçàöèÿ (Initial block) Këþ÷åâîå ñëîâî: initial. Áëîê èíèöèàëèçàöèè ñîñòîèò èç ãðóïïû îïåðàòîðîâ, çàêëþ÷åííûõ â îïåðàòîðíûå ñêîáêè begin... end, êîòîðûå áóäóò âûïîëíÿòüñÿ ñ ìîìåíòà ñòàðòà ìîäåëèðîâàíèÿ. Íèæå ïðèâåäåí ïðèìåð èíèöèàëèçàöèè ìîäåëèðîâàíèÿ. initial clock = 1'b0; initial begin alpha = 0; #10 alpha = #20 alpha = #5 alpha = #7 alpha = #10 alpha = #20 alpha = end;
1; 0; 1; 0; 1; 0;
// генерация сигнала
5.24.2. Kîíñòðóêöèÿ Always (Always block) Këþ÷åâîå ñëîâî: always. Áëîê Always îçíà÷àåò, ÷òî äåéñòâèå âûïîëíÿåòñÿ íåïðåðûâíî, ïîêà
395
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL ïðîöåññ ìîäåëèðîâàíèÿ íå áóäåò îñòàíîâëåí äèðåêòèâîé $finish èëè $stop. Ïðèìå÷àíèå: Äèðåêòèâà $finish îñòàíàâëèâàåò ðàáîòó ìîäóëÿòîðà, òîãäà êàê äèðåêòèâà $stop âíîñèò ïàóçó. Íèæå ïðèâåäåí ïðèìåð ôîðìèðîâàíèÿ òàêòîâîãî èìïóëüñà ñ èñïîëüçîâàíèåì êîíñòðóêöèè always. Çàìåòèì, ÷òî, âîîáùå ãîâîðÿ, äëÿ ýòèõ öåëåé óäîáíåå èñïîëüçîâàòü öèêëû. module pulse; reg clock; initial clock = 1'b0; // запуск такта always #10 clock = ~clock; // такт initial #5000 $finish // конец моделирования endmodule
5.25. Ïðèìåð ïðîåêòèðîâàíèÿ ïîñëåäîâàòåëüíîñòíîãî óñòðîéñòâà: äâîè÷íûé ñ÷åò÷èê Ðàññìîòðèì ïðèìåð ïðîåêòèðîâàíèÿ äâîè÷íîãî ñ÷åò÷èêà, ñ÷èòàþùåãî îò 0 äî 12 è ïî äîñòèæåíèè 12 ñáðàñûâàþùåãîñÿ â 0 è íà÷èíàþùåãî ñ÷åò çàíîâî. Ðàññìîòðèì îïèñàíèå íà âåíòèëüíîì óðîâíå. // 4bit binary counter module counter4_bit(q, d, increment, load_data, global_reset, clock); output [3:0] q; input [3:0] d; input load_data, global_reset, clock, increment; wire t1, t2, t3; // internal wires wire see12, reset; // internal wires et_ff etff0(q[0], d[0], increment, load_data, reset, clock); et_ff etff1(q[1], d[1], t1, load_data, reset, clock);
396
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL et_ff etff2(q[2], d[2], t2, load_data, reset, clock); et_ff etff3(q[3], d[3], t3, load_data, reset, clock); and a1(t1, increment, q[0]); and a2(t2, t1, q[1]); and a3(t3, t2, q[2]); recog12 r1(see12, q); // счет or or1(reset, see12, global_reset); // сброс endmodule // counter4_bit module et_ff(q, data, toggle, load_data, reset, clock); output q; input data, toggle, load_data, reset, clock; wire m1, m2; mux mux0(m1, ~q, q, toggle); mux mux1(m2, data, m1, load_data); dff dff0(q, m2, reset, clock); endmodule // et_ff module mux(out, in1, in2, cntrl); output out; input in1, in2, cntrl; assign out = cntrl ? in1 : in2; endmodule // mux module dff(q, data, reset, clock); output q; input data, reset, clock; reg q; always @(posedge clock) // at every clock edge, if reset is 1, q is if (reset == 1)
397
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL q = 0; else q = data; endmodule module recog12(flag, in); input [3:0] in; output flag; assign flag = (in == 4'b1100) ? 1 : 0; endmodule // recog12 module stumulus; wire [3:0] q; reg [3:0] d; reg load_data, global_reset, clk, increment; counter4_bit mod1 (q, d, increment, load_data, glob al_reset, clk); initial begin global_reset = 0; clk = 0; increment = 0; load_data = 0; d = 4'b0100; #10 global_reset = 1; #20 global_reset = 0; #20 load_data = 1; #20 load_data = 0; #20 increment = 1; #200 global_reset = 1; #20 global_reset = 0; #50 load_data = 1; #20 load_data = 0; #10 increment = 0;
398
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL #20 $finish; end // initial begin always #5 clk = ~clk; always #10 $display ($time,"%b %b %b %d > %b %d", increment, load_data, global_reset, d, q, q); endmodule // stumulus Íà÷íåì ïîäðîáíîå ðàññìîòðåíèå ýòîãî ïðèìåðà. module counter4_bit(q, d, increment, load_data, glob al_reset, clock); output [3:0] q; input [3:0] d; input load_data, global_reset, clock, increment; wire t1, t2, t3; // internal wires wire see12, reset; // internal wires Kàê íàì óæå èçâåñòíî, ïåðâûå ñòðîêè ìîäóëÿ ñîäåðæàò åãî èìÿ è îáúÿâëåíèå ïîðòîâ. Âûõîä ñ÷åò÷èêà q, âñå îñòàëüíûå âõîäíûå ñèãíàëû, t1, t2, t3, see12 è RESET îáúÿâëåíû êàê âíóòðåííèå öåïè, ïîäêëþ÷åííûå ê âõîäàì, ñîîòâåòñòâóþùèì ñóáìîäóëÿì ïðîåêòà. et_ff etff0(q[0], clock); et_ff etff1(q[1], et_ff etff2(q[2], et_ff etff3(q[3],
d[0], increment, load_data, reset, d[1], t1, load_data, reset, clock); d[2], t2, load_data, reset, clock); d[3], t3, load_data, reset, clock);
 ýòîì ôðàãìåíòå êîäà ìû îïðåäåëÿåì 4 ñ÷åòíûõ òðèããåðà ñ ðàçðåøåíèåì. and a1(t1, increment, q[0]); and a2(t2, t1, q[1]); and a3(t3, t2, q[2]);
399
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Ñèãíàë óâåëè÷åíèÿ ñ÷åò÷èêà (increment signal) îáúåäèíÿåòñÿ ïî «È» ñ âûõîäîì ïîñëåäíåãî òðèããåðà äëÿ ïåðåíîñà ñèãíàëà ñ÷åòà íà ñëåäóþùèé òðèããåð. recog12 r1(see12, q); or or1(reset, see12, global_reset); Kàæäûé ðàç, êîãäà âûõîä q èçìåíÿåòñÿ, ïåðåìåííàÿ see12 ìîäèôèöèðóåòñÿ. Kîãäà îíà äîñòèãíåò 12, âíóòðåííèé ñèãíàë ñáðîñà îáåñïå÷èò ñáðîñ ñ÷åò÷èêà íà î÷åðåäíîì òàêòå. Äàëåå ðàññìîòðèì ïîâåäåí÷åñêóþ ìîäåëü íàøåãî ñ÷åò÷èêà.
5.25.1. Ïîâåäåí÷åñêàÿ ìîäåëü ñ÷åò÷èêà (Behavioural model) Ïðåäøåñòâóþùåå îïèñàíèå ñ÷åò÷èêà áûëî îñóùåñòâëåíî íà óðîâíå âåíòèëåé è òðèããåðîâ, ò.å. íà ñòðóêòóðíîì óðîâíå. Ñ äðóãîé ñòîðîíû, ïðè íàëè÷èè äîñòàòî÷íî ìîùíûõ ñðåäñòâ ñèíòåçà ïîâåäåí÷åñêîå îïèñàíèå ïîçâîëÿåò ïîëó÷èòü áîëåå íàãëÿäíîå îïèñàíèå ïðîåêòà. Íèæå ïðèâîäèòñÿ ïðèìåð ïîâåäåí÷åñêîãî îïèñàíèÿ (Behavioural description) ñ÷åò÷èêà. // 4bit binary upcounter of period 13 module counter4_bit(q, d, increment, load_data, glob al_reset, clock); output [3:0] q; input [3:0] d; input load_data, global_reset, clock, increment; reg [3:0] q; always @(posedge clock) if (global_reset) q = 4'b0000; else if (load_data) q = d; else if (increment) begin if (q == 12) q = 0; else
400
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL q = q + 1; end endmodule // counter4_bit  îòëè÷èå îò îïèñàíèÿ íà ðåãèñòðîâîì óðîâíå ðàçëè÷èå â ïåðâûõ ñòðîêàõ òîëüêî îäíî âûõîä q îáúÿâëåí êàê ðåãèñòð. Äàííàÿ ìîäåëü ïîçâîëÿåò ïóòåì ïðîâåäåíèÿ íåáîëüøèõ ìîäèôèêàöèé ïîëó÷èòü îïèñàíèå äðóãîãî òèïà ñ÷åò÷èêà ñ÷åò÷èêà â îáðàòíîì íàïðàâëåíèè (down counter). Íèæå ïðèâåäåí ïðèìåð òàêîãî îïèñàíèÿ. // 4bit binary downcounter of period 13 module counter4_bit(q, d, decrement, load_data, global_reset, clock); always @(posedge clock) if (global_reset) q = 12; else if (load_data) q = d; else if (decrement) begin if (q == 0) q = 12; else q = q 1; end endmodule Äàëåå ðàññìîòðèì ðåâåðñèâíûé ñ÷åò÷èê (ñ÷åò÷èê ñ ïåðåìåííûì íàïðàâëåíèåì ñ÷åòà, up-down counter) ñ ïåðèîäîì 16. // 4bit binary updowncounter of period 16 module counter4_bit(q, d, updown, count, load_data, global_reset, clock); always @(posedge clock) if (reset)
401
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL q = 0; else if (load_data) q = d; else if (count) begin if (updown) q = q + 1; else q = q 1; end endmodule
5.26. Âðåìåííîé êîíòðîëü (Timing control) Â ÿçûêå Verilog ñóùåñòâóåò òðè âàðèàíòà îñóùåñòâëåíèÿ âðåìåííîãî êîíòðîëÿ (timing control): èñïîëüçîâàíèå çàäåðæåê (delay), ñîáûòèé (event) è óðîâíè ÷óâñòâèòåëüíîñòè (level sensitive). Ðàññìîòðèì èõ ïîäðîáíåå.
5.26.1. Çàäåðæêè (delay) Ñèíòàêñ: timing_control_statement::== delay_based statement* delay_based::== # delay_value  äàííîì ìåòîäå ââîäèòñÿ çàäåðæêà ìåæäó ïîñòóïëåíèåì ïåðåìåííîé íà âõîä áëîêà è ðåçóëüòàòîì. initial begin a = 0; #10 b = 2; #15 c = a; #b c = 4; b = 5; end
// выполняется в момент t = 0 // выполняется в момент t = 10 // выполняется в момент t = 25 // выполняется в момент t = 27 // выполняется в момент t = 27
Âåëè÷èíà çàäåðæêè ìîæåò áûòü îïðåäåëåíà êàê ïîñòîÿííàÿ èëè ïåðåìåííàÿ. Ñëåäóåò ïîìíèòü, ÷òî ñèñòåìíîå âðåìÿ èçìåðÿåòñÿ â òåõ åäèíèöàõ, êîòîðûå óñòàíîâëåíû â ñèñòåìå. Íèæå ïðèâîäèòñÿ ïðèìåð ôîðìèðîâàíèÿ òàêòîâîãî ñèãíàëà (creation of a clock signal).
402
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL initial begin clock = 1'b0; forever #5 clock = ~clock; end  äàííîì ïðèìåðå êàæäûå 5 åäèíèö âðåìåíè ñèãíàë ïåðåõîäèò èç ÂÛÑÎKÎÃÎ óðîâíÿ â ÍÈÇKÈÉ è íàîáîðîò.
5.26.2. Ñîáûòèéíûé êîíòðîëü (event-based control) Ïðè ñîáûòèéíîì êîíòðîëå ñïðàâåäëèâ ñëåäóþùèé ñèíòàêñèñ îïåðàòîðà ñîáûòèÿ (â ôîðìå ÁýêóñàÍàóýðà): event_control_statement::== @ event_identifier | @ (event_expression) event_expression::== | exp | event_id | posedge exp | negedge exp | event_exp or event_exp. Ïðè ñîáûòèéíîì êîíòðîëå ïðîèñõîäèò âû÷èñëåíèå ðåçóëüòàòà ïðè êàæäîì èçìåíåíèè âõîäíûõ ñèãíàëîâ. @ (clock) a = b; // при каждом такте выполняется a = b @ (negedge clock) a = b;
// когда clock > 0, то a = b
a = @(posedge clock) b;
5.27. Çàùåëêèâàíèå (triggers) Ôóíêöèîíèðîâàíèå çàùåëêè ðàññìîòðèì íà ïðèìåðå. event data_in; always @(negedge clock) if (data[8]==1) > data_in;
403
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL always @(data_in) mem[0:1] = buf; Â ýòîì ïðèìåðå â êàæäîì îòðèöàòåëüíîì ôðîíòå ñèíõðîèìïóëüñà ïðîâåðÿåòñÿ, ðàâíî ëè data[8] åäèíèöå, åñëè òàê, òî data_in = 1.
5.28. Ñïèñîê ñèãíàëîâ âîçáóæäåíèÿ (sensitivity list) Ñèíòàêñ: event_list_statement::==@ (event_exp or event_exp) event_exp::== (event_exp or event_exp). Åñëè ìû æåëàåì, ÷òîáû áëîê âûïîëíÿëñÿ òîãäà, êîãäà èçìåíèëàñü ëþáàÿ èç âõîäíûõ ïåðåìåííûõ, òî ñïèñîê ñèãíàëîâ âîçáóæäåíèÿ ðàçäåëÿåòñÿ îïåðàòîðàìè OR. always @ (i_change or he_changes or she_changes) somebody_changed = 1; Çäåñü èçìåíåíèå õîòÿ áû îäíîé ïåðåìåííîé ïðèâîäèò ê èçìåíåíèþ îñòàëüíûõ.
5.29. Çàäåðæêà ðàñïðîñòðàíåíèÿ â âåíòèëå (Gate delays) Ñèíòàêñ: delay_statement::== gate_name delay_exp gate_details delay_exp::== # delay_time Äàííûé òèï çàäåðæêè ïðèìåíèì òîëüêî ê ïðîñòåéøèì âåíòèëÿì, îïðåäåëÿåìûì â Verilog. and #(5) a1(out, in1, in2);
5.30. Îïåðàòîðû âåòâëåíèÿ (Branch statements) 5.30.1. Îïåðàòîð IF (IF statement) Ñèíòàêñ: if (conditional_expression) statement{else statement}. Kàê èçâåñòíî, îïåðàòîð IF ÿâëÿåòñÿ îïåðàòîðîì óñëîâíîãî ïåðåõîäà è âûïîëíÿåòñÿ ñòàíäàðòíûì äëÿ ÿçûêîâ âûñîêîãî óðîâíÿ ñïîñîáîì. Óñëîâèå âû÷èñëÿåòñÿ, è â çàâèñèìîñòè îò ðåçóëüòàòà âûïîëíÿåòñÿ ëèáî ïåðâûé îïå-
404
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL ðàòîð, ëèáî âòîðîé. Ãðóïïû îïåðàòîðîâ â âåòâè âûäåëÿþòñÿ îïåðàòîðíûìè ñêîáêàìè (êàê â ÿçûêå Ïàñêàëü) begin... end. Ðàññìîòðèì ðåàëèçàöèþ íàøåãî ìóëüòèïëåêñîðà ñ ïîìîùüþ îïåðàòîðà IF. module multiplexor4_1 (out, in1, in2, in3 ,in4, cntrl1, cntrl2); output out; input in1, in2, in3, in4, cntrl1, cntrl2; assign out = (~cntrl2 ( cntrl2 (~cntrl2 ( cntrl2 endmodule
& ~cntrl1 & in1) | & ~cntrl1 & in2) | & cntrl1 & in3) | & cntrl1 & in4) ;
Ðàññìîòðèì ïðèìåð ðåàëèçàöèè ìóëüòèïëåêñîðà 4 â 1 ñ ïîìîùüþ ëîãè÷åñêèõ óðàâíåíèé. module multiplexor4_1 (out, in1, in2, in3,in4, cntrl1, cntrl2); output out; input in1, in2, in3, in4, cntrl1, cntrl2; reg out; always @(in1 or in2 or in3 or in4 or cntrl1 or cntrl2) if (cntrl1==1) if (cntrl2==1) out = in4; else out = in3; else if (cntrl2==1) out = in2; else out = in1; endmodule
405
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.30.2. Îïåðàòîð âûáîðà (CASE statement) Ðàññìîòðåííûé âûøå ìåòîä ðåàëèçàöèè ìóëüòèïëåêñîðà óäîáåí ïðè ìàëîì ÷èñëå âõîäîâ, ïðè èõ óâåëè÷åíèè ãîðàçäî ðàçóìíåå èñïîëüçîâàòü îïåðàòîð âûáîðà, ïðè÷åì åãî ñèíòàêñèñ àíàëîãè÷åí îïåðàòîðó âûáîðà â C++. Ñèíòàêñ: conditional::== case (condition) case_item+ endcase case_item::== expression+ (seperated by commas) : statement* | default : statement* Ðàññìîòðèì ðåàëèçàöèþ ìóëüòèïëåêñîðà 4 â 1 ñ ïîìîùüþ îïåðàòîðà âûáîðà. module multiplexor4_1 (out, in1, in2, in3, in4, cntrl1, cntrl2); output out; input in1, in2, in3, in4, cntrl1, cntrl2; reg out; // note must be a register always @(in1 | in2 | in3 | in4 | cntrl1 | cntrl2) case ({cntrl2, cntrl1}) // concatenation 2’b00 : out = in1; 2’b01 : out = in2; 2’b10 : out = in3; 2’b11 : out = in4; default : $display("Please check control bits"); endcase endmodule Âàðèàíòàìè îïåðàòîðà âûáîðà ÿâëÿþòñÿ îïåðàòîðû casez è casex.
5.30.3. Îïåðàòîð âåòâëåíèÿ (Conditional operator) Îïåðàòîð ïî ñèíòàêñèñó àíëîãè÷åí òàêîìó æå îïåðàòîðó â Ñ++, òàê æå, êàê è â Ñ++ ýòîò îïåðàòîð ìîæåò áûòü çàìåíåí êîíñòðóêöèåé IF-ELSE. Ñèíòàêñ: conditional_expression ? true_expression : false_expression Ïðèìåð ðåàëèçàöèè ìóëüòèïëåêñîðà 2 â 1:
406
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL assign out = control ? in2 : in1;
5.31. Öèêëû (Looping constructs)  Verilog ñóùåñòâóåò ÷åòûðå òèïà öèêëîâ êîíñòðóêöèè WHILE, FOR, REPEAT è FOREVER. Öèêëû âîçìîæíî èñïîëüçîâàòü òîëüêî âíóòðè áëîêîâ Initial è Always. Îñíîâíîå íàçíà÷åíèå öèêëîâ: WHILE âûïîëíåíèå îïåðàòîðîâ, ïîêà óñëîâèå èñòèííîe; FOR â ýòîì öèêëå âîçìîæíî èíèöèàëèçèðîâàòü, ïðîâåðÿòü è óâåëè÷èâàòü èíäåêñíóþ ïåðåìåííóþ ÿâíûì ñïîñîáîì; REPEAT öèêë ñ çàäàííûì ÷èñëîì ïîâòîðåíèé; FOREVER âå÷íûé öèêë: ïîâòîðåíèå äî êîíöà ïðîöåññà ìîäåëèðîâàíèÿ.
5.31.1. Öèêë WHILE (WHILE LOOP) Ñèíòàêñ: looping_statement::== while (conditional) statement Öèêë WHILE âûïîëíÿåòñÿ äî òåõ ïîð, ïîêà óñëîâèå èñòèííî, â êà÷åñòâå óñëîâèÿ ìîæåò áûòü èñïîëüçîâàíî ëþáîå ëîãè÷åñêîå âûðàæåíèå. Îïåðàòîðû â öèêëå ãðóïïèðóþòñÿ ñ èñïîëüçîâàíèåì îïåðàòîðíûõ ñêîáîê begin ... end. Íèæå ïðèâåäåí ïðèìåð WHILE. /* How many cups of volume 33 ml does it take to fill a jug of volume 1 litre */ 'define JUGVOL 1000 'define CUPVOL 33 module cup_and_jugs; integer cup, jug; initial begin cup = 0; jug = 0; while (jug < `JUGVOL) begin jug = jug + `CUPVOL; cup = cup + 1; end // while (jug < JUG_VOL) $display("It takes %d cups", cup);
407
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL end // initial begin endmodule // cup_and_jugs Notice the use of the "define" statement.
5.31.2. Öèêë FOR (FOR LOOP) Ñèíòàêñ: FOR (reg_initialisation ; conditional ; reg_update) statement Öèêë FOR â Verilog àíàëîãè÷åí öèêëó FOR â ÿçûêå C++. Íèæå ïðèâåäåí ïðèìåð åãî èñïîëüçîâàíèÿ. integer list [31:0]; integer index; initial begin for(index = 0; index < 32; index = index + 1) list[index] = index + index; end
5.31.3. Öèêë REPEAT (REPEAT LOOP) Ñèíòàêñ: looping_statement::== repeat (conditional) statement Öèêë REPEAT âûïîëíÿåòñÿ êîíå÷íîå ÷èñëî ðàç, óñëîâèå (Conditional) ìîæåò áûòü êîíñòàíòîé, ïåðåìåííîé èëè ñèãíàëîì, íî îáÿçàòåëüíî áûòü öåëûì ÷èñëîì. Íèæå ïðèâåäåí ïðèìåð öèêëà REPEAT. module comply; int count; initial begin count = 128; repeat (count) begin $display("%d seconds to comply", count); count = count 1; end end endmodule Ïðèìå÷àíèå: Öèêë áóäåò âûïîëíÿòüñÿ 128 òàêòîâ íåçàâèñèìî îò âåëè÷èíû ñ÷åòà, êîòîðàÿ ìîæåò èçìåíÿòüñÿ ïîñëå çàïóñêà ñàìîãî öèêëà.
408
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.31.4. Âå÷íûé öèêë (FOREVER LOOP) Ñèíòàêñèñ: forever statement Öèêë FOREVER âûïîëíÿåòñÿ íåïðåðûâíî, ïîêà ìîäåëèðîâàíèå íå áóäåò îñòàíîâëåíî êîìàíäîé $finish. Íèæå ïðèâåäåí ïðèìåð âå÷íîãî öèêëà. reg clock; initial begin clock = 1'b0; forever #5 clock = ~clock; end initial #2000 $finish;
5.32. Ôàéëû â Verilog 5.32.1. Îòêðûòèå ôàéëà (Opening a file) Këþ÷åâûå ñëîâà: $open Ñèíòàêñ: = $fopen(«
409
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
5.32.2. Çàïèñü â ôàéë (Writing to a file) Këþ÷åâûå ñëîâà: $fdisplay, $fmonitor, $fwrite Ñèíòàêñ: $fdisplay(, --same as display--); $fmonitor(, --same as monitor--); $fwrite(, --same as write--); Äëÿ çàïèñè ìîæåò áûòü îòêðûòî íåñêîëüêî ôàéëîâ, íèæå ïðèâåäåí ïðèìåð çàïèñè ÷èñëà 0000_0000_0000_0000_0000_0000_0000_0011 â ôàéëû. integer channelsA; initial begin channelsA = handleA | 1; $fdisplay(channelsA, "Hello"); end
5.32.3. Çàêðûòèå ôàéëà (Closing a file) Këþ÷åâîå ñëîâî: $fclose Ñèíòàêñ: $fclose(handle); Kîãäà èñïîëüçóåòñÿ íåñêîëüêî ôàéëîâ, òî îáû÷íî ôàéëû, êîòîðûå óæå íå òðåáóþòñÿ, çàêðûâàþò äëÿ îáëåã÷åíèÿ ðàáîòû îïåðàöèîííîé ñèñòåìû. Äëÿ ýòîãî è ñëóæèò äèðåêòèâà $fclose, ïîñëå çàêðûòèÿ ðàáîòà ñ äàííûì ôàéëîì, åñòåñòâåííî, íåâîçìîæíà.
5.32.4. Èíèöèàëèçàöèÿ ðåãèñòðîâûõ ôàéëîâ (ïàìÿòè) (Initialising memories) Këþ÷åâûå ñëîâà: $readmemb, $readmemh Ñèíòàêñ: $readmemb(«», <memory_name>»); $readmemb(«», <memory_name>, memory_start»); $readmemb(«», <memory_name>, memory_start, memory_finish»); Äëÿ èíèöèàëèçàöèè ðåãèñòðîâûõ ôàéëîâ èñïîëüçóåòñÿ ñëåäóþùàÿ êîíñòðóêöèÿ. Ñîäåðæèìîå ðåãèñòðîâîãî ôàéëà õðàíèòñÿ â ôàéëå ñ ôîðìàòîì, ïðèâåäåííîì íèæå, âñå àäðåñà øåñòíàäöàòåðè÷íûå. @003 00000011 00000100
410
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL 00000101 00000110 00000111 00001000 00001001 Äëÿ óëó÷øåíèÿ ÷èòàåìîñòè âîçìîæíà è òàêàÿ çàïèñü: @003 00000011 00000100 00000101 @006 00000110 00000111 @008 00001000 00001001 Ïðèìåð èíèöèàëèçàöèè ïàìÿòè ïðèâåäåí íèæå. module testmemory; reg [7:0] memory [9:0]; integer index; initial begin $readmemb("mem.dat", memory); for(index = 0; index < 10; index = index + 1) $display("memory[%d] = %b", index[4:0], memory[index]); end endmodule // testmemory Ñîäåðæèìîå ôàéëà ôàéëà mem.data èìååò âèä: 1000_0001 1000_0010 0000_0000 0000_0001 0000_0010 0000_0011
411
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL 0000_0100 0000_0101 0000_0110 0000_0000
5.33. Çàäàíèå âåêòîðîâ âõîäíûõ ñèãíàëîâ äëÿ ìîäåëèðîâàíèÿ (Verilog input vectors) Äëÿ çàäàíèÿ âõîäíûõ âåêòîðîâ äëÿ ìîäåëèðîâàíèÿ ñèñòåìû òðåáóåòñÿ âåñüìà îãðàíè÷åííîå ïîäìíîæåñòâî ÿçûêà Verilog. Ðàññìîòðèì ïðîñòîé ïðèìåð. initial begin clk = 1’b0; globalReset = 1’b1; in = 1’b1; end Âûðàæåíèå 1'b0 ïðåäñòàâëÿåò ñîáîé äâîè÷íîå ïðåäñòàâëåíèå 0. Ñóùåñòâóþò äâå îñíîâíûå ÷àñòè: initial begin ... end always begin ... end Áëîê Initial íà÷èíàåò âûïîëíÿòüñÿ ñ íà÷àëîì ìîäåëèðîâàíèÿ, ïîýòîìó â íåì èíèöèàëèçèðóþòñÿ ñèãíàëû è îïðåäåëÿåòñÿ ïîñëåäîâàòåëüíîñòü èõ èçìåíåíèé. Òàêòîâûé ñèãíàë ñóùåñòâóåò â òå÷åíèå âñåãî âðåìåíè ìîäåëèðîâàíèÿ. Çàäåðæêà ìåæäó ìîìåíòàìè ñìåíû ñèãíàëîâ (ñîáûòèÿìè) îïðåäåëÿåòñÿ ñ ïîìîùüþ çíàêà #.
412
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Íàïðèìåð: #160 #160 #160 #320
globalReset = 0; in = 0; in = 1; in = 0;
 ïðèâåäåííîì ïðèìåðå ïîñëå 160 åäèíèö âðåìåíè îæèäàíèÿ ñèãíàë globalReset óñòàíàâëèâàåòñÿ â 0, çàòåì 160 åäèíèö îæèäàíèÿ è óñòàíîâêà ñèãíàëà in â 0 è ò.ä. Íàèáîëåå ÷àñòî êîíñòðóêöèÿ always èñïîëüçóåòñÿ äëÿ çàäàíèÿ òàêòîâîãî ñèãíàëà. Íàïðèìåð: always begin #10 clk = ~clk; end Çäåñü ñèãíàë clk äîëæåí áûòü ïðîèíâåðòèðîâàí êàæäûå 10 åäèíèö èçìåðåíèÿ âðåìåíè, ÷òî, ïî ñóòè, îçíà÷àåò, ÷òî ïåðèîä òàêòîâîãî ñèãíàëà 20 åäèíèö èçìåðåíèÿ âðåìåíè (time units). Kðîìå òîãî, â ïðîöåññå ìîäåëèðîâàíèÿ íåïëîõî èñïîëüçîâàòü öèêë REPEAT äëÿ çàäàíèÿ çàäàííîãî ÷èñëà ïîâòîðåíèé. repeat(10) begin #40 in = 0; #20 in = 1; end Äëÿ ãåíåðàöèè ñëó÷àéíûõ ÷èñåë â äèàïàçîíå [0, n-1] èñïîëüçóåòñÿ ñëåäóþùàÿ êîìàíäà {$random} % n Kîìáèíèðóÿ ýòè êîìàíäû, ñîçäàäèì ãåíåðàòîð ïà÷åê èç 14 ñëó÷àéíûõ ÷èñåë êàæäûå 20 åäèíèö âðåìåíè:
413
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL
repeat(14) begin #20 in = {$random} / 16 end
% 2;
5.34. Ñïèñîê îïåðàòîðîâ Verilog Äàáû îáîáùèòü ðàññìîòðåííûå ðàíåå êëþ÷åâûå ìîìåíòû ðàáîòû ñ Òàáëèöà 5.2. Ñïèñîê îïåðàòîðîâ ÿçûêà Verilog Òèï îïåðàòîðà
Ñèìâîë
Àðèôìåòè÷åñêèå (Arithmetic)
* / + %
Ëîãè÷åñêèå (Logical)
! && ||
Îòíîøåíèÿ (Relational)
Îïåðàöèÿ
×èñëî îïåðàíäîâ
Óìíîæåíèå äåëåíèå ñóììà ðàçíîñòü îñòàòîê
2 2 2 2 2
«ÍÅ» «È» «ÈËÈ»
1 2 2
> < >= <=
áîëüøå ÷åì ìåíüøå ÷åì áîëüøå ëèáî ðàâíî ìåíüøå ëèáî ðàâíî
2 2 2 2
Ýêâèâàëåíòíîñòè (Equality)
== != = !
ðàâåíñòâî íåðàâåíñòâî âûáîðî÷íîå ðàâåíñòâî âûáîðî÷íîå íåðàâåíñòâî
2 2 2 2
Ïîðàçðÿäíûå (Bitwise)
~ & | ^ ^~or~^
ïîðàçðÿäíîå îòðèöàíèå ïîðàçðÿäíîå «È» ïîðàçðÿäíîå «ÈËÈ» ïîðàçðÿäíîå «èñêëþ÷àþùåå ÈËÈ» ïîðàçðÿäíîå «èñêëþ÷àþùåå ÈËÈ-ÍÅ»
1 2 2 2 2
Ïðèâåäåíèå (Reduction)
& ~& | ~| ^ ^~or^~
ïðèâåäåííîå «È» ïðèâåäåííîå «È-ÍÅ» ïðèâåäåííîå «ÈËÈ» ïðèâåäåííîå «ÈËÈ-ÍÅ» ïðèâåäåííîå «èñêëþ÷àþùåå ÈËÈ» ïðèâåäåííîå «èñêëþ÷àþùåå ÈËÈ-ÍÅ»
1 1 1 1 1 1
Ñäâèã (SHIFT)
>> <<
ïðàâûé ñäâèã ëåâûé ñäâèã
2 2
414
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL Òàáëèöà 5.2 (îêîí÷àíèå) Òèï îïåðàòîðà
Ñèìâîë
Kîíêàòåíàöèÿ (Concatenation) Ðåïëèêàöèÿ (Replication) Óñëîâíûé (Conditional)
?:
×èñëî îïåðàíäîâ
Îïåðàöèÿ îáúåäèíåíèå
ëþáîå
ïîâòîðåíèå
ëþáîå
óñëîâíûé
3
ÿçûêîì, ïðèâåäåì ñïèñîê åãî îïåðàòîðîâ (Òàáë. 5.2).
5.35. Ïðèîðèòåò îïåðàòîðîâ Îïåðàòîð
Ïðèîðèòåò âûñøèé
+ ! ~ (unary) */% + (binary) << >> < <= > >= == != === !== & ~& ^ ^~ | ~| && || ?: (conditional)
íèçøèé
Íèæå ðàññìàòðèâàåòñÿ ïðèîðèòåò îïåðàòîðîâ Verilog.
5.36. Këþ÷åâûå ñëîâà (keywords) Íèæå ïðèâåäåíû êëþ÷åâûå ñëîâà ÿçûêà Verilog â àëôàâèòíîì ïîðÿäêå. Åñòåñòâåííî, èõ íåëüçÿ èñïîëüçîâàòü äëÿ èìåí âåíòèëåé, ìîäóëåé, ïîðòîâ è ò.ï. always and bufif1 case
assign attribute begin buf casex casez cmos deassign
415
bufif0 default
ßçûê îïèñàíèÿ àïïàðàòóðû Verilog HDL defpram disable edge else end endattribute endcase endfunction endmodule endprimitive endspecify endtable endtask event for force forever fork function highz0 highz1 if initial inout input integer join large macromodule meduim module nand negedge nmos nor not notif0 notif1 or output arameter pmos posedge primitive pull0 pull1 pulldown pullup rcmos real realtime reg release repeat rtranif1 scalared signed small specify specpram strength strong0 strong1 supply0 supply1 table task time tran tranif0 tranif1 tri tri0 tri1 triand trior trireg unsigned vectored wait wand weak0 weak1 while wire wor xnor xor
5.37. Äèðåêòèâû êîìïèëÿòîðà $bitstoreal $countdrivers $display $fclose $fdisplay $fmonitor $fopen $fstrobe $fwrite $finish $getpattern $history $incsave $input $itor $key $list $log $monitor $monitoroff monitoron $nokey
5.38. Òèïû öåïåé (Net types) supply0 supply1 wand wire wor
tri
triand
416
trior
trireg
tri0
tri1
Ãëàâà 6.
Ïðèìåðû ïðîåêòèðîâàíèÿ öèôðîâûõ óñòðîéñòâ ñ èñïîëüçîâàíèåì ÿçûêîâ îïèñàíèÿ àïïàðàòóðû VHDL è Verilog
6.1. Îáùèå ñâåäåíèÿ ßçûêè îïèñàíèÿ àïïàðàòóðû VHDL è Verilog HDL ïðåäñòàâëÿþò ñîáîé ÿçûêè âûñîêîãî óðîâíÿ (â îòëè÷èå îò AHDL è ABEL HDL) è ïðåäíàçíà÷åíû äëÿ îïèñàíèÿ öèôðîâûõ ñõåì è èõ ýëåìåíòîâ â ïåðâóþ î÷åðåäü íà ïîâåäåí÷åñêîì óðîâíå. Ýòè ÿçûêè ïîääåðæèâàþò ðàçëè÷íûå óðîâíè àáñòðàêöèè ïðîåêòà, âêëþ÷àÿ ïîääåðæêó îñîáåííîñòåé àðõèòåêòóðû ÏËÈÑ, ïîä êîòîðóþ âûïîëíÿåòñÿ ïðîåêò (Architecture-Specific Design). Èñïîëüçîâàíèå ÿçûêîâ îïèñàíèÿ àïïàðàòóðû âûñîêîãî óðîâíÿ ïîçâîëÿåò ïðîåêòèðîâàòü öèôðîâûå ñèñòåìû, îáëàäàþùèå âûñîêîé ìîáèëüíîñòüþ, òî åñòü âîçìîæíîñòüþ ïåðåíîñèìîñòè íà äðóãóþ ýëåìåíòíóþ áàçó. Äëÿ ñîçäàíèÿ çàêîí÷åííîãî ïðîåêòà íåîáõîäèìî òîëüêî ëèøü ïðîèçâåñòè êîìïèëÿöèþ â ñîîòâåòñòâóþùåé ñèñòåìå â ýëåìåíòíóþ áàçó âûáðàííîãî ïðîèçâîäèòåëÿ. Íî â ýòîì è îñíîâíîé íåäîñòàòîê ÿçûêîâ âûñîêîãî óðîâíÿ íåäîñòàòî÷íûé ó÷åò ñïåöèôè÷åñêèõ àðõèòåêòóðíûõ îñîáåííîñòåé èñïîëüçóåìîé ýëåìåíòíîé áàçû (specific target technology).  ýòîì ðàçäåëå ìû ïîïûòàåìñÿ ðàññìîòðåòü íåêîòîðûå ïðèìåðû èñïîëüçîâàíèÿ ÿçûêîâ îïèñàíèÿ àïïàðàòóðû äëÿ ñîçäàíèÿ ïðîåêòîâ ðàçëè÷íîãî óðîâíÿ ñëîæíîñòè. Ïðè ïðîâåäåíèè ñèíòåçà ëîãè÷åñêîé ñòðóêòóðû ÏËÈÑ ñ èñïîëüçîâàíèåì ÿçûêîâ îïèñàíèÿ àïïàðàòóðû (HDL Synthesis-Based Design Flow) ðàçëè÷àþò ÷åòûðå îñíîâíûå ñòàäèè ïðîåêòèðîâàíèÿ: ñîçäàíèå è ôóíêöèîíàëüíàÿ âåðèôèêàöèÿ ïðîåêòà; ðåàëèçàöèÿ ïðîåêòà â ÑÀÏÐ ÏËÈÑ; ïðîãðàììèðîâàíèå ÏËÈÑ; âåðèôèêàöèÿ âñåé ñèñòåìû.
417
Ýëåìåíòíàÿ áàçà Ïðè ôóíêöèîíàëüíîé âåðèôèêàöèè ïðîåêòà ââîä îïèñàíèÿ ïðîåêòà îñóùåñòâëÿåòñÿ íà ðåãèñòðîâîì óðîâíå (RTL-level) â ïîâåäåí÷åñêîé îáëàñòè (behavioral). Ïîñëå ââîäà îïèñàíèÿ ïðîåêòà ïîâåäåí÷åñêîå (ôóíêöèîíàëüíîå) ìîäåëèðîâàíèå (âåðèôèêàöèÿ) ïîçâîëÿåò îöåíèòü ñòåïåíü ïðàâèëüíîñòè ôóíêöèîíèðîâàíèÿ àëãîðèòìà. Ïîñëå ïðîâåäåíèÿ ôóíêöèîíàëüíîãî ìîäåëèðîâàíèÿ îïèñàíèå ñèíòåçèðóåòñÿ â ñïèñîê öåïåé íà âåíòèëüíîì óðîâíå (GATE-level) â ñòðóêòóðíîé îáëàñòè (structural). Ïîñëå îñóùåñòâëåíèÿ ñèíòåçà ìîæíî âûïîëíèòü ñòðóêòóðíîå (âðåìåííîå è ôóíêöèîíàëüíîå) ìîäåëèðîâàíèå óñòðîéñòâà.  ðåçóëüòàòå ìû ïîëó÷àåì ñïèñîê öåïåé (êàê ïðàâèëî, â ôîðìàòå EDIF) äëÿ âðåìåííîé âåðèôèêàöèè ïðîåêòà. Ðàññìîòðèì ïðèìåíåíèå ÿçûêîâ îïèñàíèÿ àïïàðàòóðû âûñîêîãî óðîâíÿ (VHDL è Verilog HDL) äëÿ îïèñàíèÿ ðàçëè÷íûõ öèôðîâûõ óñòðîéñòâ. Äàííûå îïèñàíèÿ, åñëè íå îñîáî óêàçûâàåòñÿ, íå îðèåíòèðîâàíû íà êàêóþ-ëèáî êîíêðåòíóþ ñèñòåìó ïðîåêòèðîâàíèÿ èëè ñåìåéñòâî ÏËÈÑ è ìîãóò áûòü âîïëîùåíû â ðàçëè÷íûõ áàçèñàõ. Òàêîé òèï îïèñàíèé ïîëó÷èë íàçâàíèå íåçàâèñèìîãî îò òåõíîëîãèè ñòèëÿ îïèñàíèÿ óñòðîéñòâ (Technology Independent Coding Styles). Íà÷íåì ðàññìîòðåíèå ñïîñîáîâ îïèñàíèÿ íåçàâèñèìûõ îò òåõíîëîãèè óñòðîéñòâ ñ ïîñëåäîâàòåëüíîñòíûõ óñòðîéñòâ (Sequential Devices).  àíãëîÿçû÷íîé ëèòåðàòóðå ïðèíÿòû òåðìèíû çàùåëêà äëÿ óñòðîéñòâ, òàêòèðóåìûõ óðîâíåì, è òðèããåð äëÿ óñòðîéñòâ, òàêòèðóåìûõ ôðîíòîì òàêòîâîãî èìïóëüñà.
6.2. Òðèããåðû è ðåãèñòðû Äëÿ îïèñàíèÿ òðèããåðíûõ ñõåì â VHDL èñïîëüçóþòñÿ îïåðàòîðû WAIT è IF âìåñòå ñ ïðîöåññîì, èñïîëüçóþùèì àòðèáóòû ïåðåäíåãî èëè çàäíåãî ôðîíòîâ ñèíõðîèìïóëüñà (ñì. ãëàâó 4). Íèæå ïðèâåäåíû ïðèìåðû ñîçäàíèÿ îïèñàíèé ñðàáàòûâàíèÿ ïî ôðîíòó: (clk'event and clk='1') àòðèáóò ñðàáàòûâàíèÿ ïî ïåðåäíåìó ôðîíòó (clk'event and clk='0') àòðèáóò ñðàáàòûâàíèÿ ïî çàäíåìó ôðîíòó rising_edge(clock) âûçîâ ôóíêöèè ïî ïåðåäíåìó ôðîíòó falling_edge(clock) âûçîâ ôóíêöèè ïî çàäíåìó ôðîíòó  ýòèõ ïðèìåðàõ èëëþñòðèðóåòñÿ ïðèìåíåíèå àòðèáóòà ïåðåäíåãî ôðîíòà (rising edge 'event attribute). Èñïîëüçîâàíèå àòðèáóòîâ ñëåäóåò ðåêîìåíäîâàòü â òåõ ñëó÷àÿõ, êîãäà ñèñòåìà ïðîåêòèðîâàíèÿ íå ïîääåðæèâàåò
418
Ýëåìåíòíàÿ áàçà âûçîâ ôóíêöèè ïî ñîáûòèþ. Îäíàêî èñïîëüçîâàíèå ôóíêöèé ïîçâîëÿåò èçáåæàòü êîëëèçèé, ñâÿçàííûõ ñ ïåðåõîäîì èç íåîïðåäåëåííîãî ñîñòîÿíèÿ, ïîñêîëüêó ôóíêöèÿ îïðåäåëÿåò òîëüêî ïåðåõîäû óðîâíåé (èç «0» â «1» èëè èç «1» â «0»), à íå ïåðåõîä èç íåîïðåäåëåííîãî ñîñòîÿíèÿ â «1» èëè «0». Ýòî ñòàíîâèòñÿ äîñòàòî÷íî âàæíûì â ñëó÷àå èñïîëüçîâàíèÿ ìíîãîçíà÷íûõ òèïîâ äàííûõ, íàïðèìåð std_logic, êîòîðûé èìååò 9 âîçìîæíûõ çíà÷åíèé ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-'). Äàëåå ðàññìîòðèì îñíîâíûå òèïû òðèããåðîâ.
6.2.1. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì (Rising Edge Flipflop) Íèæå ïðèâîäèòñÿ ïðèìåð îïèñàíèÿ D-òðèããåðà áåç öåïåé àñèíõðîííîãî ñáðîñà (RESET) èëè ïðåäóñòàíîâêè (PRESET). Íà Ðèñ. 6.1 ïðèâåäåíî ñõåìíîå îáîçíà÷åíèå ðàññìàòðèâàåìîãî òðèããåðà.
clk
q AL6127+
data
Ðèñ. 6.1. Ñõåìíîå îáîçíà÷åíèå D-òðèããåðà
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity dff is port (data, clk : in std_logic; q : out std_logic); end dff; architecture behav of dff is begin process (clk) begin if (clk'event and clk = '1') then q <= data; end if; end process; end behav;
419
Ýëåìåíòíàÿ áàçà Ïðèìåð îïèñàíèÿ íà Verilog: module dff (data, clk, q); input data, clk; output q; reg q; always @(posedge clk) q = data; endmodule
6.2.2. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííûì ñáðîñîì (Rising Edge Flipflop with Asynchronous Reset) Îáîçíà÷åíèå óñòðîéñòâà ïðèâåäåíî íà Ðèñ. 6.2. data
q
AL6128+
clk reset
Ðèñ. 6.2. Ñõåìíîå îáîçíà÷åíèå òðèããåðà ñ àñèíõðîííûì ñáðîñîì
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity dff_async_rst is port (data, clk, reset : in std_logic; q : out std_logic); end dff_async_rst; architecture behav of dff_async_rst is begin process (clk, reset) begin if (reset = '0') then q <= '0'; elsif (clk'event and clk = '1') then q <= data; end if;
420
Ýëåìåíòíàÿ áàçà end process; end behav; Ïðèìåð îïèñàíèÿ íà Verilog: module dff_async_rst (data, clk, reset, q); input data, clk, reset; output q; reg q; always @(posedge clk or negedge reset) if (~reset) q = 1'b0; else q = data; endmodule
6.2.3. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííîé ïðåäóñòàíîâêîé (Rising Edge Filpflop with Asynchronous Preset) Îáîçíà÷åíèå óñòðîéñòâà íà ñõåìå ïðèâåäåíî íà Ðèñ. 6.3.
data
q
clk
AL6129+
preset
Ðèñ. 6.3. Ñõåìíîå îáîçíà÷åíèå òðèããåðà ñ àñèíõðîííîé ïðåäóñòàíîâêîé
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity dff_async_pre is port (data, clk, preset : in std_logic; q : out std_logic); end dff_async_pre;
421
Ýëåìåíòíàÿ áàçà architecture behav of dff_async_pre is begin process (clk, preset) begin if (preset = '0') then q <= '1'; elsif (clk'event and clk = '1') then q <= data; end if; end process; end behav; Ïðèìåð îïèñàíèÿ íà Verilog: module dff_async_pre (data, clk, preset, q); input data, clk, preset; output q; reg q; always @(posedge clk or negedge preset) if (~preset) q = 1'b1; else q = data; endmodule
6.2.4. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííûì ñáðîñîì è ïðåäóñòàíîâêîé (Rising Edge Filpflop with Asynchronous Reset and Preset) Îáîçíà÷åíèå íà ñõåìå ïðèâåäåíî íà Ðèñ. 6.4. preset data
q
AL6130+
clk reset
Ðèñ. 6.4. Ñõåìíîå îáîçíà÷åíèå òðèããåðà ñ àñèíõðîííûì ñáðîñîì è ïðåäóñòàíîâêîé
422
Ýëåìåíòíàÿ áàçà Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity dff_async is port (data, clk, reset, preset : in std_logic; q : out std_logic); end dff_async; architecture behav of dff_async is begin process (clk, reset, preset) begin if (reset = '0') then q <= '0'; elsif (preset = '1') then q <= '1'; elsif (clk'event and clk = '1') then q <= data; end if; end process; end behav; Ïðèìåð îïèñàíèÿ íà Verilog: module dff_async (reset, preset, data, q, clk); input clk; input reset, preset, data; output q; reg q; always @(posedge clk or negedge reset or posedge preset) if (~reset) q = 1'b0; else if (preset) q = 1'b1; else q = data; endmodule
423
Ýëåìåíòíàÿ áàçà
6.2.5. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ ñèíõðîííûì ñáðîñîì (Rising Edge Filpflop with Synchronous Reset) Îáîçíà÷åíèå íà ñõåìå ïðèâåäåíî íà Ðèñ. 6.5. reset gnd data clk
AL6131+
q
Ðèñ. 6.5. Ñõåìà îáîçíà÷åíèÿ òðèããåðà ñ ñèíõðîííûì ñáðîñîì
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity dff_sync_rst is port (data, clk, reset : in std_logic; q : out std_logic); end dff_sync_rst; architecture behav of dff_sync_rst is begin process (clk) begin if (clk'event and clk = '1') then if (reset = '0') then q <= '0'; else q <= data; end if; end if; end process; end behav; Ïðèìåð îïèñàíèÿ íà Verilog: module dff_sync_rst (data, clk, reset, q); input data, clk, reset; output q; reg q; always @(posedge clk)
424
Ýëåìåíòíàÿ áàçà if (~reset) q = 1'b0; else q = data; endmodule
6.2.6. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ ñèíõðîííîé ïðåäóñòàíîâêîé (Rising Edge Filpflop with Synchronous Preset) Îáîçíà÷åíèå íà ñõåìå ïðèâåäåíî íà Ðèñ. 6.6. preset vcc data
AL6132+
q clk
Ðèñ. 6.6. Ñõåìíîå îïèñàíèå òðèããåðà ñ ñèíõðîííîé ïðåäóñòàíîâêîé
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity dff_sync_pre is port (data, clk, preset : in std_logic; q : out std_logic); end dff_sync_pre; architecture behav of dff_sync_pre is begin process (clk) begin if (clk'event and clk = '1') then if (preset = '0') then q <= '1'; else q <= data; end if; end if; end process; end behav;
425
Ýëåìåíòíàÿ áàçà Ïðèìåð îïèñàíèÿ íà Verilog: module dff_sync_pre (data, clk, preset, q); input data, clk, preset; output q; reg q; always @(posedge clk) if (~preset) q = 1'b1; else q = data; endmodule
6.2.7. Òðèããåðû, òàêòèðóåìûå ïåðåäíèì ôðîíòîì, ñ àñèíõðîííûì ñáðîñîì è ðàçðåøåíèåì òàêòîâîãî ñèãíàëà (Rising Edge Filpflop with Asynchronous Reset and Clock Enable) Ïðèìåð ñõåìíîãî îáîçíà÷åíèÿ ïðèâåäåí íà Ðèñ. 6.7. preset data
q
AL6130+
clk reset
Ðèñ. 6.7. Ñõåìíîå îïèñàíèå òðèããåðà ñ àñèíõðîííûì ñáðîñîì è ðàçðåøåíèåì òàêòîâîãî ñèãíàëà
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity dff_ck_en is port (data, clk, reset, en : in std_logic; q : out std_logic); end dff_ck_en; architecture behav of dff_ck_en is begin process (clk, reset) begin if (reset = '0') then q <= '0';
426
Ýëåìåíòíàÿ áàçà elsif (clk'event and clk = '1') then if (en = '1') then q <= data; end if; end if; end process; end behav; Ïðèìåð îïèñàíèÿ íà Verilog: module dff_ck_en (data, clk, reset, en, q); input data, clk, reset, en; output q; reg q; always @(posedge clk or negedge reset) if (~reset) q = 1'b0; else if (en) q = data; endmodule Äàëåå ðàññìîòðèì çàùåëêè íà îñíîâå D-òðèããåðîâ (D-Latches).
6.2.8. Çàùåëêà ñ ðàçðåøåíèåì âûõîäà (D-Latch with Data and Enable) Îáîçíà÷åíèå íà ñõåìå ïðèâåäåíî íà Ðèñ. 6.8. preset data
q
AL6130+
clk reset
Ðèñ. 6.8. Ñõåìíîå îáîçíà÷åíèå çàùåëêè ñ ðàçðåøåíèåì âûõîäà
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all;
427
Ýëåìåíòíàÿ áàçà entity d_latch is port(enable, data: in std_logic; y : out std_logic); end d_latch; architecture behave of d_latch is begin process (enable, data) begin if (enable = '1') then y <= data; end if; end process; end behave; Ïðèìåð îïèñàíèÿ íà Verilog: module d_latch (enable, data, y); input enable, data; output y; reg y; always @(enable or data) if (enable) y = data; endmodule
6.2.9. Çàùåëêà ñ âõîäîì äàííûõ ñ ðàçðåøåíèåì (D-Latch with Gated Asynchronous Data) Ïðèìåð îáîçíà÷åíèÿ ïðèâåäåí íà Ðèñ. 6.9.
enable
q AL6135+
data gate
Ðèñ. 6.9. Ñõåìíîå îïèñàíèå çàùåëêè ñ âûõîäîì äàííûõ ñ ðàçðåøåíèåì
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all;
428
Ýëåìåíòíàÿ áàçà entity d_latch_e is port (enable, gate, data : in std_logic; q : out std_logic); end d_latch_e; architecture behave of d_latch_e is begin process (enable, gate, data) begin if (enable = '1') then q <= data and gate; end if; end process; end behave; Ïðèìåð îïèñàíèÿ íà Verilog: module d_latch_e(enable, gate, data, q); input enable, gate, data; output q; reg q; always @ (enable or data or gate) if (enable) q = (data & gate); endmodule
6.2.10. Çàùåëêà ñ âõîäîì ðàçðåøåíèÿ (D-Latch with Gated Enable) Ïðèìåð îáîçíà÷åíèÿ ïðèâåäåí íà Ðèñ. 6.10. d
q AL6136+
data gate
Ðèñ. 6.10. Ñõåìíîå îïèñàíèå çàùåëêè ñ âõîäîì ðàçðåøåíèÿ
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity d_latch_en is
429
Ýëåìåíòíàÿ áàçà port (enable, gate, d: in std_logic; q : out std_logic); end d_latch_en; architecture behave of d_latch_en is begin process (enable, gate, d) begin if ((enable and gate) = '1') then q <=d; end if; end process; end behave; Ïðèìåð îïèñàíèÿ íà Verilog: module d_latch_en(enable, gate, d, q); input enable, gate, d; output q; reg q; always @ (enable or d or gate) if (enable & gate) q =d; endmodule
6.2.11. Çàùåëêà ñ àñèíõðîííûì ñáðîñîì (D-Latch with Asynchronous Reset) Ïðèìåð îáîçíà÷åíèÿ ïðèâåäåí íà Ðèñ. 6.11.
data
q
reset
AL6137+
enable
Ðèñ. 6.11. Ñõåìíîå îïèñàíèå çàùåëêè ñ àñèíõðîííûì ñáðîñîì
Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all;
430
Ýëåìåíòíàÿ áàçà entity d_latch_rst is port (enable, data, reset: in std_logic; q : out std_logic); end d_latch_rst; architecture behav of d_latch_rst is begin process (enable, data, reset) begin if (reset = '0') then q <= '0'; elsif (enable = '1') then q <= data; end if; end process; end behav; Ïðèìåð îïèñàíèÿ íà Verilog: module d_latch_rst (reset, enable, data, q); input reset, enable, data; output q; reg q; always @ (reset or enable or data) if (~reset) q = 1'b0; else if (enable) q = data; endmodule
6.3. Ïîñòðîåíèå óñòðîéñòâ ïîòîêîâîé îáðàáîòêè äàííûõ (Datapath logic) Kàê ïðàâèëî, óñòðîéñòâà ïîòîêîâîé îáðàáîòêè äàííûõ ïðåäñòàâëÿþò ñîáîé ñòðóêòóðèðîâàííûå ïîâòîðÿþùèåñÿ ôóíêöèè. Ðàññìîòðåíèå òàêèõ óñòðîéñòâ íà÷íåì ñ ïðèîðèòåòíîãî øèôðàòîðà. Ïðèîðèòåòíûé øèôðàòîð (Ðèñ. 6.12) ñòðîèòñÿ ñ èñïîëüçîâàíèåì îïåðàòîðà IF-THEN-ELSE.
431
Ýëåìåíòíàÿ áàçà
d g = 10
pout
c g = 01
g = 00
AL6138+
r e
Ðèñ. 6.12. Ñõåìíîå îïèñàíèå ïðèîðèòåòíîãî øèôðàòîðà
Ïðèìåð îïèñàíèÿ øèôðàòîðà íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity my_if is port (c, d, e, f: in std_logic; s : in std_logic_vector(1 downto 0); pout : out std_logic); end my_if; architecture my_arc of my_if is begin myif_pro: process (s, c, d, e, f) begin if s = "00" then pout <= c; elsif s = "01" then pout <= d; elsif s = "10" then pout <= e; else pout <= f; end if; end process myif_pro; end my_arc; Ïðèìåð îïèñàíèÿ íà Verilog: module IF_MUX (c, d, e, f, s, pout); input c, d, e, f; input [1:0]s; output pout; reg pout; always @(c or d or e or f or s) begin
432
Ýëåìåíòíàÿ áàçà if (s == 2'b00) pout = c; else if (s ==2'b01) pout = d; else if (s ==2'b10) pout = e; else pout = f; end endmodule Äðóãèì ÷àñòî èñïîëüçóåìûì óñòðîéñòâîì ÿâëÿåòñÿ ìóëüòèïëåêñîð (Multiplexor). Kàê ïðàâèëî, äëÿ ïîñòðîåíèÿ ìóëüòèïëåêñîðà (Ðèñ. 6.13) óäîáíî èñïîëüçîâàòü îïåðàòîð CASE. Îïåðàòîð CASE îáåñïå÷èâàåò ïàðàëëåëüíóþ îáðàáîòêó. Îïåðàòîð âûáîðà CASE èñïîëüçóåòñÿ äëÿ âûáîðà îäíîãî âàðèàíòà èç íåñêîëüêèõ â çàâèñèìîñòè îò óñëîâèé. MUX
MUX_OUT
S (1:0)
AL6139+
C D E F
Ðèñ. 6.13. Ìóëüòèïëåêñîð 4 â 1
Ñðåäñòâà ñèíòåçà ñ VHDL ïîçâîëÿþò àâòîìàòè÷åñêè âûïîëíèòü ïàðàëëåëüíóþ îáðàáîòêó áåç ïðèîðèòåòà, â òî âðåìÿ êàê ñðåäñòâà ñèíòåçà ñ Verilog ïîääåðæèâàþò ïðèîðèòåò â âûïîëíåíèè îïåðàòîðà CASE.  ðÿäå ñëó÷àåâ íåîáõîäèìî ââåñòè ñïåöèôè÷åñêèå èíñòðóêöèè â êîä äëÿ òîãî, ÷òîáû îïåðàòîð âûáîðà íå èìåë ïðèîðèòåòà. Íèæå ïðèâîäÿòñÿ ïðèìåðû îïèñàíèÿ ìóëüòèïëåêñîðà 4 â 1. Ïðèìåð îïèñàíèÿ íà VHDL: —4:1 Multiplexor library IEEE; use IEEE.std_logic_1164.all; entity mux is port (c, d, e, f : in std_logic; s : in std_logic_vector(1 downto 0);
433
Ýëåìåíòíàÿ áàçà muxout : out std_logic); end mux; architecture my_mux of mux is begin mux1: process (s, c, d, e, f) begin case s is when “00” => muxout <= c; when “01” => muxout <= d; when “10” => muxout <= e; when others => muxout <= f; end case; end process mux1; end my_mux; Ïðèìåð îïèñàíèÿ íà Verilog: //4:1 Multiplexor module MUX (C, D, E, F, S, MUX_OUT); input C, D, E, F; input [1:0] S; output MUX_OUT; reg MUX_OUT; always @(C or D or E or F or S) begin case (S) 2’b00 : MUX_OUT = C; 2’b01 : MUX_OUT = D; 2’b10 : MUX_OUT = E; default : MUX_OUT = F; endcase end endmodule Äëÿ áîëåå ñëîæíîãî ñëó÷àÿ ðàññìîòðèì ïðèìåð ìóëüòèïëåêñîðà 12 â 1. Ïðèìåð îïèñàíèÿ íà VHDL: — 12:1 mux library ieee;
434
Ýëåìåíòíàÿ áàçà use ieee.std_logic_1164.all; — Entity declaration: entity mux12_1 is port ( mux_sel: in std_logic_vector (3 downto 0);— mux select A: in std_logic; B: in std_logic; C: in std_logic; D: in std_logic; E: in std_logic; F: in std_logic; G: in std_logic; H: in std_logic; I: in std_logic; J: in std_logic; K: in std_logic; M: in std_logic; mux_out: out std_logic — mux output ); end mux12_1; — Architectural body: architecture synth of mux12_1 is begin proc1: process (mux_sel, A, B, C, D, E, F, G, H, I, J, K, M) begin case mux_sel is when "0000" => mux_out<= A; when "0001" => mux_out <= B; when "0010" => mux_out <= C; when "0011" => mux_out <= D; when "0100" => mux_out <= E; when "0101" => mux_out <= F; when "0110" => mux_out <= G; when "0111" => mux_out <= H;
435
Ýëåìåíòíàÿ áàçà when "1000" when "1001" when "1010" when "1011" when others end case; end process end synth;
=> => => => =>
mux_out <= I; mux_out <= J; mux_out <= K; mux_out <= M; mux_out<= '0';
proc1;
Ïðèìåð îïèñàíèÿ ìóëüòèïëåêñîðà 12 â 1íà Verilog: // 12:1 mux module mux12_1(mux_out, mux_sel,M,L,K,J,H,G,F,E,D,C,B,A); output mux_out; input [3:0] mux_sel; input M; input L; input K; input J; input H; input G; input F; input E; input D; input C; input B; input A; reg mux_out; // create a 12:1 mux using a case statement always @ ({mux_sel[3:0]} or M or L or K or J or H or G or F or E or D or C or B or A) begin: mux_blk case ({mux_sel[3:0]}) // synthesis full_case parallel_case 4'b0000 : mux_out = A; 4'b0001 : mux_out = B;
436
Ýëåìåíòíàÿ áàçà 4'b0010 : 4'b0011 : 4'b0100 : 4'b0101 : 4'b0110 : 4'b0111 : 4'b1000 : 4'b1001 : 4'b1010 : 4'b1011 : 4'b1100 : 4'b1101 : 4'b1110 : 4'b1111 : endcase end endmodule
mux_out mux_out mux_out mux_out mux_out mux_out mux_out mux_out mux_out mux_out mux_out mux_out mux_out mux_out
= = = = = = = = = = = = = =
C; D; E; F; G; H; J; K; L; M; 1'b0; 1'b0; 1'b0; 1'b0;
Kðîìå îáû÷íîãî îïåðàòîðà âûáîðà â ÿçûêå îïèñàíèÿ àïïàðàòóðû Verilog èñïîëüçóåòñÿ îïåðàòîð âûáîðà CASEX. Íèæå ïðèâîäèòñÿ îïèñàíèå íà Verilog ìóëüòèïëåêñîðà 4 â 1. //8 bit 4:1 multiplexor with don’t care X, 3:1 equivalent mux module mux4 (a, b, c, sel, q); input [7:0] a, b, c; input [1:0] sel; output [7:0] q; reg [7:0] q; always @ (sel or a or b or c) casex (sel) 2'b00:q =a; 2'b01:q =b; 2'b1x:q =c; default:q =c; endcase endmodule
437
Ýëåìåíòíàÿ áàçà Äåøèôðàòîð, ïîæàëóé, ÿâëÿåòñÿ ñàìûì ðàñïðîñòðàíåííûì êîìáèíàöèîííûì óñòðîéñòâîì. Íèæå ïðèâîäèòñÿ ïðèìåð äåøèôðàòîðà 3 â 8. Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity decode is port ( Ain : in std_logic_vector (2 downto 0); En : in std_logic; Yout : out std_logic_vector (7 downto 0)); end decode; architecture decode_arch of decode is begin process (Ain) begin if (En='0') then Yout <= (others => '0'); else case Ain is when "000" => Yout <= "00000001"; when "001" => Yout <= "00000010"; when "010" => Yout <= "00000100"; when "011" => Yout <= "00001000"; when "100" => Yout <= "00010000"; when "101" => Yout <= "00100000"; when "110" => Yout <= "01000000"; when "111" => Yout <= "10000000"; when others => Yout <= "00000000"; end case; end if; end process; end decode_arch; Ïðèìåð îïèñàíèÿ äåøèôðàòîðà íà Verilog èìååò âèä: module decode (Ain, En, Yout); input En; input [2:0] Ain;
438
Ýëåìåíòíàÿ áàçà output [7:0] Yout; reg [7:0] Yout; always @ (En or Ain) begin if (!En) Yout = 8'b0; else case (Ain) 3'b000 : Yout = 8'b00000001; 3'b001 : Yout = 8'b00000010; 3'b010 : Yout = 8'b00000100; 3'b011 : Yout = 8'b00001000; 3'b100 : Yout = 8'b00010000; 3'b101 : Yout = 8'b00100000; 3'b110 : Yout = 8'b01000000; 3'b111 : Yout = 8'b10000000; default : Yout = 8'b00000000; endcase end endmodule
6.4. Ñ÷åò÷èêè Ñ÷åò÷èêè ÿâëÿþòñÿ äîñòàòî÷íî øèðîêî ðàñïðîñòðàíåííûìè óñòðîéñòâàìè, èõ êëàññèôèêàöèÿ è ïðèíöèïû ïîñòðîåíèÿ èçëîæåíû â ëèòåðàòóðå [3438]. Ñëåäóåò ïîìíèòü, ÷òî áîëüøèíñòâî ïðîãðàìì ñèíòåçà íå ïîçâîëÿåò ïîëó÷èòü ïðèåìëåìûõ ðåçóëüòàòîâ ïî áûñòðîäåéñòâèþ ïðè ðàçðÿäíîñòè ñ÷åò÷èêà áîëåå 8 ðàçðÿäîâ, â ýòîì ñëó÷àå ÷àñòî ïðèìåíÿþòñÿ ñïåöèôè÷åñêèå ïðèåìû ñèíòåçà, çàâèñÿùèå îò òåõíîëîãèè, ïî êîòîðîé âûïîëíåíà ÏËÈÑ. Ðàññìîòðèì ïðèìåð ïîñòðîåíèÿ 8-ðàçðÿäíîãî ñ÷åò÷èêà, ñ÷èòàþùåãî â ïðÿìîì íàïðàâëåíèè è èìåþùåãî öåïè ðàçðåøåíèÿ ñ÷åòà è àñèíõðîííîãî ñáðîñà. Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all;
439
Ýëåìåíòíàÿ áàçà use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity counter8 is port (clk, en, rst : in std_logic; count : out std_logic_vector (7 downto 0)); end counter8; architecture behav of counter8 is signal cnt: std_logic_vector (7 downto 0); begin process (clk, en, cnt, rst) begin if (rst = '0') then cnt <= (others => '0'); elsif (clk'event and clk = '1') then if (en = '1') then cnt <= cnt + '1'; end if; end process; count <= cnt; end behav; Ïðèìåð îïèñàíèÿ íà Verilog: module count_en (en, clock, reset, out); parameter Width = 8; input clock, reset, en; output [Width1:0] out; reg [Width1:0] out; always @(posedge clock or negedge reset) if(!reset) out = 8'b0; else if(en) out = out +1; endmodule Äðóãîé ïðèìåð èëëþñòðèðóåò ïîñòðîåíèå 8-ðàçðÿäíîãî ñ÷åò÷èêà ñ çàãðóçêîé è àñèíõðîííûì ñáðîñîì (8-bit Up Counter with Load and Asynchronous Reset):
440
Ýëåìåíòíàÿ áàçà Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity counter is port (clk, reset, load: in std_logic; data: in std_logic_vector (7 downto 0); count: out std_logic_vector (7 downto 0)); end counter; architecture behave of counter is signal count_i : std_logic_vector (7 downto 0); begin process (clk, reset) begin if (reset = '0') then count_i <= (others => '0'); elsif (clk'event and clk = '1') then if load = '1' then count_i <= data; else count_i <= count_i + '1'; end if; end if; end process; count <= count_i; end behave; Ïðèìåð îïèñàíèÿ íà Verilog: module count_load (out, data, load, clk, reset); parameter Width = 8; input load, clk, reset; input [Width1:0] data; output [Width1:0] out; reg [Width1:0] out;
441
Ýëåìåíòíàÿ áàçà always @(posedge clk or negedge reset) if(!reset) out = 8'b0; else if(load) out = data; else out = out +1; endmodule Ïðèìåð ïîñòðîåíèÿ ñ÷åò÷èêà ñ ïðåäâàðèòåëüíîé çàãðóçêîé, âõîäàìè ðàçðåøåíèÿ è îñòàíîâêè ñ÷åòà (8-bit Up Counter with Load, Count Enable, Terminal Count and Asynchronous Reset) ïðèâåäåí íèæå. Ïðèìåð îïèñàíèÿ íà Verilog: module count_load (out, cout, data, load, clk, en, reset); parameter Width = 8; input load, clk, en, reset; input [Width1:0] data; output cout; // carry out output [Width1:0] out; reg [Width1:0] out; always @(posedge clk or negedge reset) if(!reset) out = 8'b0; else if(load) out = data; else if(en) out = out +1; // cout=1 when all out bits equal 1 assign cout = &out; endmodule Ñëåäóþùèé ïðèìåð ñ÷åò÷èê ñ ïðîèçâîëüíûì ìîäóëåì ñ÷åòà è âñåìè îñòàëüíûìè ôóíêöèÿìè: ñáðîñ, çàãðóçêà è ò.ï. (N-bit Up Counter with Load, Count Enable, and Asynchronous Reset) Ïðèìåð îïèñàíèÿ íà VHDL:
442
Ýëåìåíòíàÿ áàçà library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity counter is generic (width : integer := n); port (data : in std_logic_vector (width1 downto 0); load, en, clk, rst : in std_logic; q :out std_logic_vector (width1 downto 0)); end counter; architecture behave of counter is signal count : std_logic_vector (width1 downto 0); begin process(clk, rst) begin if rst = '1' then count <= (others => '0'); elsif (clk'event and clk = '1') then if load = '1' then count <= data; elsif en = '1' then count <= count + 1; end if; end if; end process; q <= count; end behave;
6.5. Àðèôìåòè÷åñêèå óñòðîéñòâà Ïðîåêòèðîâàíèå óñòðîéñòâ îáðàáîòêè èíôîðìàöèè íåìûñëèìî áåç ðåàëèçàöèè àðèôìåòè÷åñêèõ îïåðàöèé ñëîæåíèÿ, óìíîæåíèÿ, âû÷èòàíèÿ è äåëåíèÿ. Íèæå ïðèâîäÿòñÿ ïðèìåðû èñïîëüçîâàíèÿ àðèôìåòè÷åñêèõ îïåðàòîðîâ ïðè ïðîåêòèðîâàíèè íà ÿçûêàõ îïèñàíèÿ àïïàðàòóðû âûñîêîãî óðîâíÿ. Ïðèìåð âûïîëíåíèÿ àðèôìåòè÷åñêèõ îïåðàöèé ïðèâåäåí íèæå. Ïðèìåð îïèñàíèÿ íà VHDL:
443
Ýëåìåíòíàÿ áàçà library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity arithmetic is port (A, B: in std_logic_vector(3 downto 0); Q1: out std_logic_vector(4 downto 0); Q2, Q3: out std_logic_vector(3 downto 0); Q4: out std_logic_vector(7 downto 0)); end arithmetic; architecture behav of arithmetic is begin process (A, B) begin Q1 <= ('0' & A) + ('0' & B); —addition Q2<=A B;—subtraction Q3<=A /B;—division Q4<=A *B;—multiplication end process; end behav; Kîíå÷íî, òàêîå îïèñàíèå íå âñåãäà ïðèâîäèò ê õîðîøèì ðåçóëüòàòàì. Íèæå ìû åùå âåðíåìñÿ ê òåìå ïîñòðîåíèÿ áûñòðîäåéñòâóþùèõ àðèôìåòè÷åñêèõ óñòðîéñòâ. Çäåñü æå çàìåòèì, ÷òî åñëè òðåáóåòñÿ âûïîëíèòü óìíîæåíèå èëè äåëåíèå íà ÷èñëî, ÿâëÿþùååñÿ ñòåïåíüþ äâîéêè, òî àðèôìåòè÷åñêàÿ îïåðàöèÿ ëåãêî âûïîëíÿåòñÿ ïóòåì ñäâèãà íà íåîáõîäèìîå ÷èñëî ðàçðÿäîâ âïðàâî èëè âëåâî. Íàïðèìåð, âûðàæåíèå: Q <= C/16 + C*4; ìîæåò áûòü ïðåäñòàâëåíî êàê Q <= shr (C, "100") + shl (C, "10"); èëè íà VHDL: Q <= "0000"&C (8downto 4)+C (6downto 0) & "00"; Ôóíêöèè "shr" è "shl" íàõîäÿòñÿ â ïàêåòå IEEE.std_logic_arith.all. Ïðèìåð àðèôìåòè÷åñêèõ îïåðàöèé â Verilog: module arithmetic (A, B, Q1, Q2, Q3, Q4); input [3:0] A, B;
444
Ýëåìåíòíàÿ áàçà output [4:0] Q1; output [3:0] Q2, Q3; output [7:0] Q4; reg [4:0] Q1; reg [3:0] Q2, Q3; reg [7:0] Q4; always @(A or B) begin Q1 =A +B;//addition Q2 =A B;//subtraction Q3 =A /2;//division Q4 =A *B;//multiplication end endmodule Ðåàëèçàöèÿ ðåãèñòðîâ ñäâèãà èìååò âèä: Q = {4b’0000 C[8:4]} + {C[6:0] 2b’00}; Îïåðàòîðû îòíîøåíèÿ ñðàâíèâàþò äâà îïåðàíäà è âûäàþò çíà÷åíèå TRUE èëè FALSE. Ïðèâåäåííûå íèæå ïðèìåðû ïîêàçûâàþò ïðèìåíåíèå îïåðàòîðîâ îòíîøåíèÿ. Ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðîâ îòíîøåíèÿ â VHDL: library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity relational is port (A,B :in std_logic_vector(3 downto 0); Q1, Q2, Q3, Q4 : out std_logic); end relational; architecture behav of relational is begin process (A, B) begin —Q1<=A >B;—greater than —Q2<=A = B; — greater than equal to if (A <= B) then – less than equal to
445
Ýëåìåíòíàÿ áàçà Q4 <= '1'; else Q4 <= '0'; end if; end process; end behav; Ïðèìåð èñïîëüçîâàíèÿ îïåðàòîðîâ îòíîøåíèÿ â Verilog: module relational (A, B, Q1, Q2, Q3, Q4); input [3:0] A, B; output Q1, Q2, Q3, Q4; reg Q1, Q2, Q3, Q4; always @(A or B) begin //Q1 =A >B;//greater than //Q2 =A =B;//greater than equal to if (A <= B) //less than equal to Q4 =1; else Q4 =0; end endmodule Îïåðàòîð ýêâèâàëåíòíîñòè (Equality operator) èñïîëüçóåòñÿ äëÿ ñðàâíåíèÿ îïåðàíäîâ. Ïðèìåð ðåàëèçàöèè îïåðàòîðà ýêâèâàëåíòíîñòè íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity equality is port ( A: in STD_LOGIC_VECTOR (3 downto 0); B: in STD_LOGIC_VECTOR (3 downto 0); Q1: out STD_LOGIC; Q2: out STD_LOGIC );
446
Ýëåìåíòíàÿ áàçà end equality; architecture equality_arch of equality is begin process (A, B) begin Q1<=A =B; — equality if (A /= B) then — inequality Q2 <= '1'; else Q2 <= '0'; end if; end process; end equality_arch; Äðóãîé âàðèàíò îïèñàíèÿ íà VHDL èìååò âèä: library IEEE; use IEEE.std_logic_1164.all; entity equality is port ( A: in STD_LOGIC_VECTOR (3 downto 0); B: in STD_LOGIC_VECTOR (3 downto 0); Q1: out STD_LOGIC; Q2: out STD_LOGIC ); end equality; architecture equality_arch of equality is begin Q1 <= '1' when A =Belse '0'; — equality Q2 <= '1' when A /=Belse '0'; — inequality end equality_arch; Ïðèìåð îïèñàíèÿ íà Verilog: module equality (A, B, Q1, Q2); input [3:0] A; input [3:0] B; output Q1;
447
Ýëåìåíòíàÿ áàçà output Q2; reg Q1, Q2; always @(A or B) begin Q1 =A ==B;//equality if (A != B) //inequality Q2 =1; else Q2 =0; end endmodule Ðåàëèçàöèÿ îïåðàòîðà ñäâèãà ìîæåò áûòü ïîëåçíà â ðàçëè÷íûõ ñõåìàõ óìíîæåíèÿ-äåëåíèÿ, à òàêæå íîðìàëèçàöèè äàííûõ. Ïðèìåð îïåðàòîðà ñäâèãà íà VHDL: library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity shift is port (data : in std_logic_vector(3 downto 0); q1, q2 : out std_logic_vector(3 downto 0)); end shift; architecture rtl of shift is begin process (data) begin q1 <= shl (data, "10"); — logical shift left q2 <= shr (data, "10"); — logical shift right end process; end rtl; Äðóãîé âàðèàíò îïåðàòîðà ñäâèãà: library IEEE; use IEEE.std_logic_1164.all; entity shift is
448
Ýëåìåíòíàÿ áàçà port (data : in std_logic_vector(3 downto 0); q1, q2 : out std_logic_vector(3 downto 0)); end shift; architecture rtl of shift is begin process (data) begin q1 <= data(1 downto 0) & "10"; — logical shift left q2 <= "10" & data(3 downto 2); — logical shift right end process; end rtl; Ïðèìåð îïèñàíèÿ íà Verilog: module shift (data, q1, q2); input [3:0] data; output [3:0] q1, q2; parameter B = 2; reg [3:0] q1, q2; always @ (data) begin q1 = data << B; // logical shift left q2 = data >> B; // logical shift right end endmodule
6.6. Kîíå÷íûå àâòîìàòû (Finite state machine) Kîíå÷íûå àâòîìàòû (Finite state machine) è ñðåäñòâà èõ ïðîåêòèðîâàíèÿ áûëè ðàññìîòðåíû âûøå (ñì. ãëàâó 2).  ðÿäå ñëó÷àåâ àâòîìàòíàÿ ìîäåëü (îïèñàíèå) óñòðîéñòâà ïîçâîëÿåò ïîëó÷èòü áûñòðóþ è ýôôåêòèâíóþ ðåàëèçàöèþ ïîñëåäîâàòåëüíîñòíîãî óñòðîéñòâà. Kàê èçâåñòíî, îáû÷íî ðàññìàòðèâàþò äâà òèïà àâòîìàòîâ àâòîìàò Ìèëè (Mealy) è Ìóðà (Moore). Âûõîä àâòîìàòà Ìóðà ÿâëÿåòñÿ ôóíêöèåé òîëüêî òåêóùåãî ñîñòîÿíèÿ, â òî âðåìÿ êàê âûõîä àâòîìàòà Ìèëè ôóíêöèÿ êàê òåêóùåãî ñîñòîÿíèÿ, òàê è íà÷àëüíîãî âíåøíåãî âîçäåéñòâèÿ. Îáû÷íî êîíå÷íûé àâòîìàò ñîñòîèò èç òðåõ îñíîâíûõ ÷àñòåé: 1. Ðåãèñòð òåêóùåãî ñîñòîÿíèÿ (Sequential Current State Register). Ýòîò ðåãèñòð ïðåäñòàâëÿåò ñîáîé íàáîð òàêòèðóåìûõ D-òðèããåðîâ, ñèíõðîíèçè-
449
Ýëåìåíòíàÿ áàçà ðóåìûõ îäíèì ñèíõðîñèãíàëîì, è èñïîëüçóåòñÿ äëÿ õðàíåíèÿ êîäà òåêóùåãî ñîñòîÿíèÿ àâòîìàòà. Î÷åâèäíî, ÷òî äëÿ àâòîìàòà ñ n-ñîñòîÿíèÿìè òðåáóåòñÿ log2 (n) òðèããåðîâ. 2. Ëîãèêà ïåðåõîäîâ (Combinational Next State Logic). Kàê èçâåñòíî, êîíå÷íûé àâòîìàò ìîæåò íàõîäèòüñÿ â êàæäûé êîíêðåòíûé ìîìåíò âðåìåíè òîëüêî â îäíîì ñîñòîÿíèè. Kàæäûé òàêòîâûé èìïóëüñ âûçûâàåò ïåðåõîä àâòîìàòà èç îäíîãî ñîñòîÿíèÿ â äðóãîå. Ïðàâèëà ïåðåõîäà îïðåäåëÿþòñÿ êîìáèíàöèîííîé ñõåìîé, íàçûâàåìîé ëîãèêîé ïåðåõîäîâ. Ñëåäóþùåå ñîñòîÿíèå îïðåäåëÿåòñÿ êàê ôóíêöèÿ òåêóùåãî ñîñòîÿíèÿ è âõîäíîãî âîçäåéñòâèÿ. 3. Ëîãèêà ôîðìèðîâàíèÿ âûõîäà (Combinational Output Logic). Âûõîä öèôðîâîãî àâòîìàòà îáû÷íî îïðåäåëÿåòñÿ êàê ôóíêöèÿ òåêóùåãî ñîñòîÿíèÿ è èñõîäíîé óñòàíîâêè (â ñëó÷àå àâòîìàòà Ìèëè). Ôîðìèðîâàíèå âûõîäíîãî ñèãíàëà àâòîìàòà îïðåäåëÿåòñÿ ñ ïîìîùüþ ëîãèêè ôîðìèðîâàíèÿ âûõîäà. Íà Ðèñ. 6.14 è 6.15 ïðèâåäåíû ñòðóêòóðû àâòîìàòîâ Ìóðà è Ìèëè ñîîòâåòñòâåííî. Логика следующего состояния (комбинаторная)
Следующее состояние
Текущее Выходная Регистр текущего состояние Выходы логика состояния (комбинаторная) (последовательный) AL6140+
Входы
Ðèñ. 6.14. Àâòîìàò Ìóðà
Логика следующего состояния (комбинаторная)
Следующее состояние
Выходная Регистр текущего Выходы Текущее логика состояния состояние (комбинаторная) (последовательный) AL6141+
Входы
Ðèñ. 6.15. Àâòîìàò Ìèëè
Äëÿ îáåñïå÷åíèÿ ñòàáèëüíîé è áåçîòêàçíîé ðàáîòû èñïîëüçóåòñÿ ñáðîñ àâòîìàòà â íà÷àëüíîå ñîñòîÿíèå. Òàêèì îáðàçîì âñåãäà îáåñïå÷èâàåòñÿ èíèöèàëèçàöèÿ àâòîìàòà â çàðàíåå ïðåäîïðåäåëåííîì ñîñòîÿíèè ïðè ïåðâîì òàêòîâîì èìïóëüñå.  ñëó÷àå, åñëè ñáðîñ íå ïðåäóñìîòðåí, íåâîçìîæíî ïðåäñêàçàòü, ñ êàêîãî íà÷àëüíîãî ñîñòîÿíèÿ íà÷íåòñÿ ôóíêöèîíèðîâàíèå, ÷òî ìîæåò ïðèâåñòè ê ñáîÿì â ðàáîòå âñåé ñèñòåìû. Îñîáåííî ýòà ñèòóàöèÿ àêòóàëüíà ïðè âêëþ÷åíèè ïèòàíèÿ ñèñòåìû. Ïîýòîìó ìû íàñòîÿòåëüíî ðåêîìåíäóåì èñïîëüçîâàòü ñõåìû ñáðîñà è íà÷àëüíîé óñòàíîâêè ïðè ïðîåêòè-
450
Ýëåìåíòíàÿ áàçà ðîâàíèè óñòðîéñòâ íà ÏËÈÑ. Îáû÷íî ïðèìåíÿþò àñèíõðîííûå ñõåìû ñáðîñà èç-çà òîãî, ÷òî íå òðåáóåòñÿ èñïîëüçîâàòü äåøèôðàòîð íåèñïîëüçóåìûõ (èçáûòî÷íûõ) ñîñòîÿíèé, ÷òî óïðîùàåò ëîãèêó ïåðåõîäîâ. Ñ äðóãîé ñòîðîíû, èç-çà òîãî, ÷òî ÏËÈÑ, âûïîëíåííûå ïî àðõèòåêòóðå FPGA, èìåþò äîñòàòî÷íîå ÷èñëî ðåãèñòðîâ (òðèããåðîâ), èñïîëüçîâàíèå àâòîìàòíûõ ìîäåëåé ïîçâîëÿåò ïîëó÷èòü äîñòàòî÷íî áûñòðîäåéñòâóþùóþ è â òî æå âðåìÿ íàãëÿäíóþ ðåàëèçàöèþ ïðè ïðèåìëåìûõ çàòðàòàõ ðåñóðñîâ. Íèæå ðàññìîòðèì ïðèìåð ïðîåêòèðîâàíèÿ àâòîìàòà Ìèëè. Äèàãðàììà ïåðåõîäîâ àâòîìàòà ïðèâåäåíà íà Ðèñ. 6.16. 10/1 00/0
x1/0 ST0
00/0
ST1
10/1 0x/0 01/1
0x/0 11/1
10/0
ST2
ST4 11/1
1x/1
ST3 x0/1
AL6142+
x1/1
Ðèñ. 6.16. Äèàãðàììà ïåðåõîäîâ àâòîìàòà Ìèëè
Ïðèìåð àâòîìàòà Ìèëè íà VHDL: — Автомат Мили с 5 состояниями library ieee; use ieee.std_logic_1164.all; entity mealy is port (clock, reset: in std_logic; data_out: out std_logic; data_in: in std_logic_vector (1 downto 0)); end mealy; architecture behave of mealy is type state_values is (st0, st1, st2, st3, st4); signal pres_state, next_state: state_values; begin
451
Ýëåìåíòíàÿ áàçà — FSM register statereg: process (clock, reset) begin if (reset = '0') then pres_state <= st0; elsif (clock'event and clock ='1') then pres_state <= next_state; end if; end process statereg; — FSM combinational block fsm: process (pres_state, data_in) begin case pres_state is when st0 => case data_in is when "00" => next_state <= st0; when "01" => next_state <= st4; when "10" => next_state <= st1; when "11" => next_state <= st2; when others => next_state <= (others <= 'x'); end case; when st1 => case data_in is when "00" => next_state <= st0; when "10" => next_state <= st2; when others => next_state <= st1; end case; when st2 => case data_in is when "00" => next_state <= st1; when "01" => next_state <= st1; when "10" => next_state <= st3; when "11" => next_state <= st3; when others => next_state <= (others <= 'x'); end case; when st3 => case data_in is when "01" => next_state <= st4; when "11" => next_state <= st4;
452
Ýëåìåíòíàÿ áàçà when others => next_state <= st3; end case; when st4 => case data_in is when "11" => next_state <= st4; when others => next_state <= st0; end case; when others => next_state <= st0; end case; end process fsm; — Mealy output definition using pres_state w/ data_in outputs: process (pres_state, data_in) begin case pres_state is when st0 => case data_in is when "00" => data_out <= '0'; when others => data_out <= '1'; end case; when st1 => data_out <= '0'; when st2 => case data_in is when "00" => data_out <= '0'; when "01" => data_out <= '0'; when others => data_out <= '1'; end case; when st3 => data_out <= '1'; when st4 => case data_in is when "10" => data_out <= '1'; when "11" => data_out <= '1'; when others => data_out <= '0'; end case; when others => data_out <= '0'; end case; end process outputs; end behave;
453
Ýëåìåíòíàÿ áàçà Îïèñàíèå àâòîìàòà Ìèëè íà Verilog èìååò âèä: // Example of a 5state Mealy FSM module mealy (data_in, data_out, reset, clock); output data_out; input [1:0] data_in; input reset, clock; reg data_out; reg [2:0] pres_state, next_state; parameter st0=3'd0, st1=3'd1, st2=3'd2, st3=3'd3, st4=3'd4; // FSM register always @(posedge clock or negedge reset) begin: statereg if(!reset)// asynchronous reset pres_state = st0; else pres_state = next_state; end // statereg // FSM combinational block always @(pres_state or data_in) begin: fsm case (pres_state) st0: case(data_in) 2'b00: next_state=st0; 2'b01: next_state=st4; 2'b10: next_state=st1; 2'b11: next_state=st2; endcase st1: case(data_in) 2'b00: next_state=st0; 2'b10: next_state=st2; default: next_state=st1; endcase st2: case(data_in) 2'b0x: next_state=st1; 2'b1x: next_state=st3; endcase
454
Ýëåìåíòíàÿ áàçà st3: case(data_in) 2'bx1: next_state=st4; default: next_state=st3; endcase st4: case(data_in) 2'b11: next_state=st4; default: next_state=st0; endcase default: next_state=st0; endcase end // fsm // Mealy output definition using pres_state w/ data_in always @(data_in or pres_state) begin: outputs case(pres_state) st0: case(data_in) 2'b00: data_out=1'b0; default: data_out=1'b1; endcase st1: data_out=1'b0; st2: case(data_in) 2'b0x: data_out=1'b0; default: data_out=1'b1; endcase st3: data_out=1'b1; st4: case(data_in) 2'b1x: data_out=1'b1; default: data_out=1'b0; endcase default: data_out=1'b0; endcase end // outputs endmodule Íèæå ðàññìîòðåí ïðèìåð àâòîìàòà Ìóðà (Moore machine) ñ òåì æå ãðàôîì ïåðåõîäîâ. Îïèñàíèå íà VHDL:
455
Ýëåìåíòíàÿ áàçà — Example of a 5state Moore FSM library ieee; use ieee.std_logic_1164.all; entity moore is port (clock, reset: in std_logic; data_out: out std_logic; data_in: in std_logic_vector (1 downto 0)); end moore; architecture behave of moore is type state_values is (st0, st1, st2, st3, st4); signal pres_state, next_state: state_values; begin — FSM register statereg: process (clock, reset) begin if (reset = ‘0’) then pres_state <= st0; elsif (clock ='1' and clock'event) then pres_state <= next_state; end if; end process statereg; — FSM combinational block fsm: process (pres_state, data_in) begin case pres_state is when st0 => case data_in is when "00" => next_state <= st0; when "01" => next_state <= st4; when "10" => next_state <= st1; when "11" => next_state <= st2; when others => next_state <= (others <= 'x'); end case; when st1 => case data_in is when "00" => next_state <= st0; when "10" => next_state <= st2;
456
Ýëåìåíòíàÿ áàçà when others => next_state <= st1; end case; when st2 => case data_in is when "00" => next_state <= st1; when "01" => next_state <= st1; when "10" => next_state <= st3; when "11" => next_state <= st3; when others => next_state <= (others <= 'x'); end case; when st3 => case data_in is when "01" => next_state <= st4; when "11" => next_state <= st4; when others => next_state <= st3; end case; when st4 => case data_in is when "11" => next_state <= st4; when others => next_state <= st0; end case; when others => next_state <= st0; end case; end process fsm; — Moore output definition using pres_state only outputs: process (pres_state) begin case pres_state is when st0 => data_out <= '1'; when st1 => data_out <= '0'; when st2 => data_out <= '1'; when st3 => data_out <= '0'; when st4 => data_out <= '1'; when others => data_out <= '0'; end case; end process outputs; end behave;
457
Ýëåìåíòíàÿ áàçà Îïèñàíèå àâòîìàòà Ìóðà íà Verilog: // Example of a 5state Moore FSM module moore (data_in, data_out, reset, clock); output data_out; input [1:0] data_in; input reset, clock; reg data_out; reg [2:0] pres_state, next_state; parameter st0=3'd0, st1=3'd1, st2=3'd2, st3=3'd3, st4=3'd4; //FSM register always @(posedge clock or negedge reset) begin: statereg if(!reset) pres_state = st0; else pres_state = next_state; end // statereg // FSM combinational block always @(pres_state or data_in) begin: fsm case (pres_state) st0: case(data_in) 2'b00: next_state=st0; 2'b01: next_state=st4; 2'b10: next_state=st1; 2'b11: next_state=st2; endcase st1: case(data_in) 2'b00: next_state=st0; 2'b10: next_state=st2; default: next_state=st1; endcase st2: case(data_in) 2'b0x: next_state=st1; 2'b1x: next_state=st3;
458
Ýëåìåíòíàÿ áàçà endcase st3: case(data_in) 2'bx1: next_state=st4; default: next_state=st3; endcase st4: case(data_in) 2'b11: next_state=st4; default: next_state=st0; endcase default: next_state=st0; endcase end // fsm // Moore output definition using pres_state only always @(pres_state) begin: outputs case(pres_state) st0: data_out=1'b1; st1: data_out=1'b0; st2: data_out=1'b1; st3: data_out=1'b0; st4: data_out=1'b1; default: data_out=1'b0; endcase end // outputs endmodule // Moore
6.7. Ýëåìåíòû ââîäà/âûâîäà Áåç ýëåìåíòîâ ââîäà/âûâîäà íåâîçìîæíà îðãàíèçàöèÿ ïîëíîöåííîãî îáìåíà äàííûõ, îðãàíèçàöèÿ øèí è ò.ï. Ðàññìîòðèì îñîáåííîñòè îïèñàíèÿ íà ÿçûêàõ îïèñàíèÿ àïïàðàòóðû ýëåìåíòîâ ââîäà/âûâîäà. Ýëåìåíò ñ òðåìÿ ñîñòîÿíèÿìè (Tri-state buffer) ïîçâîëÿåò îðãàíèçîâàòü ïîäêëþ÷åíèå íåñêîëüêèõ óñòðîéñòâ ê îáùåé øèíå. Îáîçíà÷åíèå òàêîãî ýëåìåíòà íà ñõåìå ïðèâåäåíî íà Ðèñ. 6.17. a
y
AL6143+
e
Ðèñ. 6.17. Ýëåìåíò ñ òðåìÿ ñîñòîÿíèÿìè
459
Ýëåìåíòíàÿ áàçà Ïðèìåð îïèñàíèÿ íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity tristate is port (e,a :in std_logic; y : out std_logic); end tristate; architecture tri of tristate is begin process (e, a) begin if e = '1' then y <=a; else y <= 'Z'; end if; end process; end tri; Äðóãîé âàðèàíò îïèñàíèÿ ýëåìåíòà ñ òðåìÿ ñîñòîÿíèÿìè íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity tristate is port (e,a :in std_logic; y :out std_logic); end tristate; architecture tri of tristate is begin Y <=awhen (e = '1') else 'Z'; end tri; Íà Verilog ýëåìåíò ñ òðåìÿ ñîñòîÿíèÿìè îïèñûâàåòñÿ ñëåäóþùèì îáðàçîì: module TRISTATE (e, a, y); input a, e; output y;
460
Ýëåìåíòíàÿ áàçà reg y; always @(eor a) begin if (e) y = a; else y = 1'bz; end endmodule èëè module TRISTATE (e, a, y); input a, e; output y; assign y = e ?a :1'bZ; endmodule Ïðèâåäåííûå âûøå ïðèìåðû ïîêàçûâàþò ëîãèêó ôóíêöèîíèðîâàíèÿ ýëåìåíòà ñ òðåìÿ ñîñòîÿíèÿìè. Ïðèìåðû ñîçäàíèÿ ýêçåìïëÿðà êîìïîíåíòû ïðèâåäåíû íèæå. Ýêçåìïëÿð êîìïîíåíòà íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity tristate is port (e,a :in std_logic; y :out std_logic); end tristate; architecture tri of tristate is component TRIBUFF port (D, E: in std_logic; PAD: out std_logic); end component; begin U1: TRIBUFF port map (D => a, E =>e, PAD => y); end tri;
461
Ýëåìåíòíàÿ áàçà Ýêçåìïëÿð êîìïîíåíòà íà Verilog: module TRISTATE (e, a, y); input a, e; output y; TRIBUFF U1 (.D(a),.E(e),.PAD(y)); endmodule Äâóíàïðàâëåííûå ýëåìåíòû ââîäà/âûâîäà (Bi-directional buffer). Äâóíàïðàâëåííûé ýëåìåíò ââîäà/âûâîäà èñïîëüçóåòñÿ ëèáî êàê ýëåìåíò ââîäà, ëèáî êàê âûõîäíîé áóôåð ñ âîçìîæíîñòüþ ïåðåõîäà â òðåòüå ñîñòîÿíèå. Íèæå ïðèâîäÿòñÿ ïðèìåðû ñîçäàíèÿ îïèñàíèÿ äâóíàïðàâëåííîãî áóôåðà (Ðèñ. 6.18). e y AL6144+
a b
Ðèñ. 6.18. Ñõåìíîå îïèñàíèå äâóíàïðàâëåííîãî áóôåðà
Ïðèìåð ëîãèêè äâóíàïðàâëåííîãî áóôåðà íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity bidir is port (y : inout std_logic; e, a: in std_logic; b :out std_logic); end bidir; architecture bi of bidir is begin process (e, a) begin case e is when '1'=>y <=a; when '0' => y <= 'Z'; when others => y <= 'X'; end case;
462
Ýëåìåíòíàÿ áàçà end process; b <=y; end bi;
Ïðèìåð îïèñàíèÿ äâóíàïðàâëåííîãî áóôåðà íà Verilog: module bidir (e, y, a, b); input a, e; inout y; output b; reg y_int; wire y, b; always @(a or e) begin if (e == 1'b1) y_int <= a; else y_int <= 1'bz; end assign y = y_int; assign b = y; endmodule Ïðèìåðû ñîçäàíèÿ ýêçåìïëÿðîâ êîìïîíåíòû íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity bidir is port (y : inout std_logic; e, a: in std_logic; b :out std_logic); end bidir; architecture bi of bidir is component BIBUF port (D, E: in std_logic; Y :out std_logic;
463
Ýëåìåíòíàÿ áàçà PAD: inout std_logic); end component; begin U1: BIBUF port map (D => a, E => e, Y => b, PAD => y); end bi; Ïðèìåð îïèñàíèÿ ýêçåìïëÿðà áóôåðà íà Verilog: module bidir (e, y, a, b); input a, e; inout y; output b; BIBUF U1 (.PAD(y),.D(a),.E(e),.Y(b) ); Endmodule
6.8. Ïàðàìåòðèçàöèÿ Kàê óæå îòìå÷àëîñü âûøå, â ïîñëåäíèå ãîäû íàìåòèëàñü òåíäåíöèÿ ê ðàçðàáîòêå è èñïîëüçîâàíèþ ïàðàìåòðèçîâàííûõ ìîäóëåé (ÿäåð, ìàêðîñîâ, ìåãàôóíêöèé) ïðè ïðîåêòèðîâàíèè óñòðîéñòâ íà ÏËÈÑ ñ èñïîëüçîâàíèåì ÿçûêîâ îïèñàíèÿ àïïàðàòóðû.  ÿçûêàõ îïèñàíèÿ àïïàðàòóðû ñóùåñòâóþò ñïåöèàëüíûå êîíñòðóêöèè, ïîçâîëÿþùèå îáåñïå÷èòü ïîëíóþ ïàðàìåòðèçàöèþ ïðîåêòà. Ýòî òàê íàçûâàåìûå ðîäîâûå (ïàðàìåòðèçîâàííûå, íàñòðàèâàåìûå) òèïû äàííûõ (Generics) è ïàðàìåòðû (Parameters). Ìû áóäåì èñïîëüçîâàòü òåðìèí íàñòðàèâàåìûé òèï. Íàñòðàèâàåìûå òèïû äàííûõ è ïàðàìåòðû èñïîëüçóþòñÿ îáû÷íî äëÿ îïðåäåëåíèÿ ðàçìåðíîñòè êîìïîíåíòà (íàïðèìåð, ðàçðÿäíîñòü øèí, êîýôôèöèåíòîâ è ò.ï.). Kîíêðåòíîå çíà÷åíèå ïàðàìåòðîâ îïðåäåëÿåòñÿ ïðè ñîçäàíèè êîíêðåòíîãî ýêçåìïëÿðà êîìïîíåíòà. Ðàññìîòðèì ïðèìåð èñïîëüçîâàíèÿ ïàðàìåòðèçàöèè íà ïðèìåðå ñóììàòîðà. Ïðèìåð îïèñàíèÿ ïàðàìåòðèçèðóåìîãî ñóììàòîðà íà VHDL: library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all;
464
Ýëåìåíòíàÿ áàçà use IEEE.std_logic_unsigned.all; entity adder is generic (WIDTH : integer := 8); port (A, B: in UNSIGNED(WIDTH1 downto 0); CIN: in std_logic; COUT: out std_logic; Y: out UNSIGNED(WIDTH1 downto 0)); end adder; architecture rtl of adder is begin process (A,B,CIN) variable TEMP_A,TEMP_B,TEMP_Y:UNSIGNED(A'length downto 0); begin TEMP_A := '0' & A; TEMP_B := '0' & B; TEMP_Y := TEMP_A + TEMP_B + CIN; Y <= TEMP_Y (A'length1 downto 0); COUT <= TEMP_Y (A'length); end process; end rtl; Ïàðàìåòð Width îïðåäåëÿåò ðàçðÿäíîñòü äàííûõ. Ïðèìåð êîíêðåòíîãî ýêçåìïëÿðà êîìïîíåíòà ñ 16-ðàçðÿäíûìè äàííûìè ïðèâåäåí íèæå: U1: adder generic map(16) port map (A_A, B_A, CIN_A, COUT_A, Y_A); Ïðèìåð îïèñàíèÿ ñóììàòîðà íà Verilog: module adder (cout, sum, a, b, cin); parameter Size = 8; output cout; output [Size1:0] sum; input cin; input [Size1:0] a, b; assign {cout, sum}= a + b + cin; endmodule
465
Ýëåìåíòíàÿ áàçà Ïàðàìåòð Size îïðåäåëÿåò øèðèíó ñóììàòîðà. Ðåàëèçàöèÿ êîìïîíåíòà 16-ðàçðÿäíîãî ñóììàòîðà ïðèâåäåíà íèæå: adder #(16) adder16(cout_A, sun_A, a_A, b_A, cin_A)
6.9. Ñïåöèôèêà ïðîåêòèðîâàíèÿ óñòðîéñòâ ñ ó÷åòîì àðõèòåêòóðíûõ îñîáåííîñòåé ÏËÈÑ
CpuG Critical Otil Sar CpuR
Des
AL6145+
 îòëè÷èå îò ñïåöèàëèçèðîâàííûõ ÁÈÑ (ASIC) ÏËÈÑ, âûïîëíåííûå ïî FPGA-àðõèòåêòóðå, èìåþò ìîäóëüíóþ ìàòðè÷íóþ ñòðóêòóðó. Kàæäàÿ êîìáèíàöèîííàÿ ñòóïåíü ðåàëèçàöèè ñëîæíîé ôóíêöèè âíîñèò ñâîé âêëàä â ñóììàðíóþ çàäåðæêó ðàñïðîñòðàíåíèÿ ñèãíàëà.  ðåçóëüòàòå ïðèõîäèòñÿ ó÷èòûâàòü îãðàíè÷åíèÿ, ñâÿçàííûå ñî ñëèøêîì äëèííûìè öåïÿìè ðàñïðîñòðàíåíèÿ ñèãíàëîâ. Èñïîëüçîâàíèå ñîîòâåòñòâóþùèõ ïðèåìîâ îïèñàíèÿ óñòðîéñòâ (coding style) ïîçâîëÿåò óëó÷øèòü âðåìåííûå õàðàêòåðèñòèêè ñïðîåêòèðîâàííîãî óñòðîéñòâà. Ðàññìîòðèì ñïîñîáû ñíèæåíèÿ ÷èñëà ñòóïåíåé âû÷èñëåíèÿ ñëîæíîé ôóíêöèè (Reducing logic levels) äëÿ óìåíüøåíèÿ äëèíû êðèòè÷åñêèõ ïóòåé ðàñïðîñòðàíåíèÿ ñèãíàëà (critical paths). Íèæå ïðèâîäÿòñÿ ïðèìåðû îïòèìàëüíîãî ïðîåêòèðîâàíèÿ òàêèõ óñòðîéñòâ. Ïðèìåð 1.  äàííîì ïðèìåðå ñèãíàë critical (Ðèñ. 6.19) ïðîõîäèò ÷åðåç òðè ñòóïåíè.
Ðèñ. 6.19. Ïðîõîæäåíèå ñèãíàëà critical ÷åðåç òðè ñòóïåíè
Ïðèìåð íàïèñàí íà ÿçûêå VHDL: if ((( Crtical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='0') then Des <= Adr; elsif (((Crtical='0' and Obi='1' and Sar='1') or CpuG='0') and CpuR='1') then Des <= Bdr; elsif (Sar='0' and..........
466
Ýëåìåíòíàÿ áàçà  ðåçóëüòàòå ñèãíàë critical ÿâëÿåòñÿ çàïàçäûâàþùèì. ×òîáû óìåíüøèòü ÷èñëî ñòóïåíåé, èñïîëüçóåì êîíñòðóêöèþ IF-THEN-ELSE statement.  ðåçóëüòàòå ñèãíàë critical ïðîõîäèò òîëüêî ÷åðåç îäíó ñòóïåíü, êàê ïîêàçàíî íà Ðèñ. 6.20. Otil Sar CpuR Critical
Des
AL6146+
CpuG
Ðèñ. 6.20. Ïðîõîæäåíèå ñèãíàëà critical ÷åðåç îäíó ñòóïåíü
if (Critical='0') then if (((Obi='1' and Sar='1') or CpuG='0') and CpuR='0') then Des <= Adr; elsif (((Obi='1' and Sar='1') or CpuG='0' and CpuR='1') then Des <= Bdr; end if; end if; Ïðèìåð 2.  äàííîì ñëó÷àå ñèãíàë, îáîçíà÷åííûé critical (Ðèñ. 6.21), ïðîõîäèò ÷åðåç äâå ñòóïåíè. in1 in2 non_critical critical clk
AL6147+
out1
Ðèñ. 6.21. Ïðîõîæäåíèå ñèãíàëà critical ÷åðåç äâå ñòóïåíè
if (clk'event and clk ='1') then if (non_critical and critical) then out1 <= in1 else out1 <= in2 end if; end if;
467
Ýëåìåíòíàÿ áàçà Äëÿ óìåíüøåíèÿ ÷èñëà ñòóïåíåé äëÿ ñèãíàëà critical èñïîëüçóåì ìóëüòèïëåêñèðîâàíèå âõîäíûõ ñèãíàëîâ in1 è in2, èñïîëüçóÿ äëÿ óïðàâëåíèÿ ìóëüòèïëåêñîðîì ñèãíàë non_critical. Âûõîä ìóëüòèïëåêñîðà çàòåì ìóëüòèïëåêñèðóåòñÿ ñ âõîäîì in2 ïðè óïðàâëåíèè ñèãíàëîì critical.  èòîãå ñèãíàë critical ïðîõîäèò òîëüêî ÷åðåç îäíó ñòóïåíü çàäåðæêè (Ðèñ. 6.22). in1 in2
out1
critical clk
AL6148+
non_critical
Ðèñ. 6.22. Ïðîõîæäåíèå ñèãíàëà critical ÷åðåç îäíó ñòóïåíü çàäåðæêè
Ðåàëèçàöèÿ íà VHDL ïðèâåäåíà íèæå. signal out_temp : std_logic if (non_critical) out_temp <= in1; else out_temp <= in2; if (clk'event and clk ='1') then if (critical) then out1 <= out_temp; else out1 <= in2; end if; end if; end if;
6.10. Ñîâìåñòíîå èñïîëüçîâàíèå ðåñóðñîâ Äðóãèì ïóòåì ïîâûøåíèÿ ýôôåêòèâíîñòè îïèñàíèé öèôðîâûõ óñòðîéñòâ ÿâëÿåòñÿ ñîâìåñòíîå èñïîëüçîâàíèå ðåñóðñîâ (Resource sharing). Ñîâìåñòíîå èñïîëüçîâàíèå ðåñóðñîâ ïîçâîëÿåò ñíèçèòü ÷èñëî ëîãè÷åñêèõ ýëåìåíòîâ äëÿ ðåàëèçàöèè îïåðàòîðîâ íà ÿçûêàõ îïèñàíèÿ àïïàðàòóðû. Íèæå ïðèâîäÿòñÿ äâà ïðèìåðà ñîâìåñòíîãî èñïîëüçîâàíèÿ ðåñóðñîâ. Ïðèìåðû íàïèñàíû íà ÿçûêå Verilog. Ïðèìåð 1. Ðåàëèçàöèÿ ÷åòûðåõ ñóììàòîðîâ (ñ÷åò÷èêîâ).
468
Ýëåìåíòíàÿ áàçà if (...(siz == 1)...) count = count + 1; else if (...((siz ==2)...) count = count + 2; else if (...(siz == 3)...) count = count + 3; else if (...(siz == 0)...) count = count + 4; Ïîêàæåì, êàê ìîæíî èçáàâèòüñÿ îò äâóõ «ëèøíèõ» ñ÷åò÷èêîâ: if (...(siz == 0)...) count = count + 4; else if (...) count = count + siz Ïðèìåð 2.  äàííîì ïðèìåðå èñïîëüçóåòñÿ íåïîëíîå ñîâìåñòíîå èñïîëüçîâàíèå ðåñóðñîâ äëÿ ðåàëèçàöèè ñóììàòîðîâ (Ðèñ. 6.23). A B
sel
sum AL6149+
MUX C D
Ðèñ. 6.23. Íåïîëíîå ñîâìåñòíîå èñïîëüçîâàíèå ðåñóðñîâ äëÿ ðåàëèçàöèè ñóììàòîðîâ
if (select) sum<=A +B; else sum<=C +D; Ñóììàòîðû çàíèìàþò çíà÷èòåëüíûå ðåñóðñû, äëÿ èõ óìåíüøåíèÿ ïåðåïèñûâàåì êîä ñ öåëüþ ââåñòè äâà ìóëüòèïëåêñîðà è îäèí ñóììàòîð, êàê ïîêàçàíî íèæå (Ðèñ. 6.24). temp 1 sum temp 2
AL6150+
a c sel b d
Ðèñ. 6.24. Ñõåìíîå îïèñàíèå óìåíüøåíèÿ ðåñóðñîâ, çàíèìàåìûõ ñóììàòîðàìè
469
Ýëåìåíòíàÿ áàçà if (sel) temp1 <= A; temp2 <= B; else temp1 <= C; temp2 <= D; sum <= temp1 + temp2; Ñëåäóåò ïîìíèòü, ÷òî â äàííîì ïðèìåðå ñèãíàë âûáîðà sel íå ÿâëÿåòñÿ çàïàçäûâàþùèì ñèãíàëîì. Åùå îäíèì ñïîñîáîì îðãàíèçàöèè ñîâìåñòíîãî èñïîëüçîâàíèÿ ðåñóðñîâ ÿâëÿåòñÿ èñïîëüçîâàíèå îïåðàòîðîâ öèêëà. Àðèôìåòè÷åñêèå îïåðàòîðû è ìóëüòèïëåêñîðû çàíèìàþò çíà÷èòåëüíûå ðåñóðñû. Åñëè èìååòñÿ îïåðàòîð âíóòðè öèêëà, ïðîãðàììà ñèíòåçà äîëæíà îöåíèòü âñå ñîñòîÿíèÿ.  ñëåäóþùåì ïðèìåðå íà ÿçûêå VHDL îïèñûâàþòñÿ ÷åòûðå ñóììàòîðà è îäèí ìóëüòèïëåêñîð. Òàêàÿ ðåàëèçàöèÿ ìîæåò áûòü ðåêîìåíäîâàíà òîëüêî åñëè ñèãíàë âûáîðà req çàïàçäûâàþùèé ñèãíàë (Ðèñ. 6.25). vsum offsel[3] vsum offsel[2] sum vsum offsel[1] req[3:0] AL6151+
vsum offsel[0]
Ðèñ. 6.25. Ñõåìíîå îïèñàíèå ÷åòûðåõ ñóììàòîðîâ è îäíîãî ìóëüòèïëåêñîðà, â êîòîðîì ñèãíàë req çàïàçäûâàþùèé ñèãíàë
vsum := sum; for i in 0 to 3 loop if (req(i)='1') then vsum <= vsum + offset(i); end if; end loop;
470
Ýëåìåíòíàÿ áàçà Åñëè ñèãíàë âûáîðà req íå ÿâëÿåòñÿ êðèòè÷åñêèì, îïåðàòîð ìîæåò áûòü âûíåñåí çà ïðåäåëû öèêëà, ÷òî ïðèâåäåò ê òîìó, ÷òî âìåñòî ÷åòûðåõ ñóììàòîðîâ áóäåò èñïîëüçîâàí îäèí (Ðèñ. 6.26).
offsel_1
vsum req[3:0]
AL6152+
offsel[3] offsel[2] offsel[1] offsel[0]
Ðèñ. 6.26. Ñõåìíîå îïèñàíèå èñïîëüçîâàíèÿ òîëüêî îäíîãî ñóììàòîðà ïðè âûíåñåíèè çà ïðåäåëû öèêëà îïåðàòîðà âûáîðà
Ïðèìåð îïèñàíèÿ ïðèâåäåí íèæå. vsum := sum; for i in 0 to 3 loop if (req(i)='1') then offset_1 <= offset(i); end if; end loop; vsum <= vsum + offset_1; Èñïîëüçîâàíèå êîäèðîâàíèÿ äëÿ ñî÷åòàåìîñòè (Coding for Combinability) òàêæå ïîçâîëÿåò âûêðîèòü ðåñóðñû ÏËÈÑ. Äëÿ ÏËÈÑ íåêîòîðûõ àðõèòåêòóð âîçìîæíî âûïîëíåíèå âñåé ëîãèêè ðàáîòû êàê êîìáèíàöèîííîé, òàê è ïîñëåäîâàòåëüíîñòíîé â ïðåäåëàõ îäíîãî ëîãè÷åñêîãî ýëåìåíòà (ÿ÷åéêè), ÷òî çíà÷èòåëüíî ñíèæàåò çàäåðæêè ïî êðèòè÷åñêèì ïóòÿì è ýêîíîìèò ðåñóðñû. Îäíàêî ñëåäóåò ïîìíèòü, ÷òî òàêîå îáúåäèíåíèå âîçìîæíî òîëüêî â òîì ñëó÷àå, åñëè êîìáèíàöèîííàÿ ñõåìà óïðàâëÿåò òîëüêî îäíèì òðèããåðîì.  ïðèâåäåííîì ïðèìåðå îïèñàíèÿ íà VHDL ýëåìåíò AND ôîðìèðóåò óïðàâëÿþùèé ñèãíàë äëÿ äâóõ òðèããåðîâ (Ðèñ. 6.27), ÷òî ïðåïÿòñòâóåò ââåäåíèþ ýëåìåíòà AND â ïîñëåäîâàòåëüíîñòíûé ìîäóëü.
471
Ýëåìåíòíàÿ áàçà a b c
q1
q2 AL6153+
en clk
Ðèñ. 6.27. Ñõåìíîå îïèñàíèå ýëåìåíòà AND, ôîðìèðóþùåãî óïðàâëÿþùèé ñèãíàë äëÿ äâóõ òðèããåðîâ
one :process (clk, a, b, c, en) begin if (clk'event and clk ='1') then if (en = '1') then q2 <= a and b and c; end if; q1 <= a and b and c; end if; end process one; Äëÿ òîãî ÷òîáû îáúåäèíèòü ñõåìó âíóòðè îäíîãî ýëåìåíòà è óáðàòü âíåøíèå öåïè, óäîáíî èñïîëüçîâàòü äóáëèðîâàíèå ëîãè÷åñêîãî ýëåìåíòà AND, óìåíüøàÿ òåì ñàìûì êðèòè÷åñêèå ïóòè ðàñïðîñòðàíåíèÿ ñèãíàëà (Ðèñ. 6.28). a b c
q1 clk
q2 en clk
AL6154+
a b c
Ðèñ. 6.28. Ñõåìíîå îïèñàíèå èñïîëüçîâàíèÿ äâóõ ëîãè÷åñêèõ ýëåìåíòîâ AND
part_one: process (clk, a, b, c, en) begin if (clk'event and clk ='1') then if (en = '1') then q2 <= a and b and c; end if; end if;
472
Ýëåìåíòíàÿ áàçà end process part_one; part_two: process (clk, a, b, c) begin if (clk'event and clk ='1') then q1 <= a and b and c; end if; end process part_two;
6.11. Äóáëèðîâàíèå ðåãèñòðà Çàäåðæêà â öåïè ðàñïðîñòðàíåíèÿ ñèãíàëà âîçðàñòàåò ñ óâåëè÷åíèåì ÷èñëà âõîäîâ, íàãðóæåííûõ íà ýòó öåïü. Òàêàÿ ñèòóàöèÿ åùå ìîæåò áûòü ïðèåìëåìà äëÿ öåïåé ñáðîñà, íî äëÿ öåïåé ðàçðåøåíèÿ ýòî íåäîïóñòèìî. Ïðèìåð òàêîé ñèòóàöèè ïðèâåäåí íèæå (Ðèñ. 6.29). Tri_en
Tri_end 24 нагрузки
Clk
Out(23:0)
AL6155+
Data_in(23:0)
Ðèñ. 6.29. Ñõåìíîå îïèñàíèå öåïè, â êîòîðîé êîýôôèöèåíò ðàçâåòâëåíèÿ ñèãíàëà ðàçðåøåíèÿ ðàâåí 24
 äàííîì VHDL ïðèìåðå êîýôôèöèåíò ðàçâåòâëåíèÿ ñèãíàëà ðàçðåøåíèÿ Tri_en ðàâåí 24. architecture load of four_load is signal Tri_en std_logic; begin loadpro: process (Clk)
473
Ýëåìåíòíàÿ áàçà begin if (clk'event and clk ='1') then Tri_end <= Tri_en; end if; end process loadpro; endpro : process (Tri_end, Data_in) begin if (Tri_end = '1') then out <= Data_in; else out <= (others => 'Z'); end if; end process endpro; end load; ×èñëî ðàçâåòâëåíèé (fanout) ìîæíî óìåíüøèòü âäâîå, èñïîëüçóÿ äâà ðåãèñòðà (Ðèñ. 6.30).
12 нагрузок Tri_en
Tri_end
Clk
Data_in(23:0)
12 нагрузок Tri_en
Tri_en2
Out(23:0)
AL6156+
Clk
Ðèñ. 6.30. Ñõåìíîå îïèñàíèå öåïè, â êîòîðîé èñïîëüçóþòñÿ äâà ðåãèñòðà äëÿ óìåíüøåíèÿ âäâîå ÷èñëà ðàçâåòâëåíèé
474
Ýëåìåíòíàÿ áàçà Íèæå ïðèâåäåí ïðèìåð ðåàëèçàöèè äóáëèðîâàíèÿ ðåãèñòðîâ íà VHDL: architecture loada of two_load is signal Tri_en1, Tri_en2 : std_logic; begin loadpro: process (Clk) begin if (clk'event and clk ='1') then Tri_en1 <= Tri_en; Tri_en2 <= Tri_en; end if; end process loadpro; process (Tri_en1, Data_in) begin if (Tri_en1 = '1') then out(23:12) <= Data_in(23:12); else out(23:12) <= (others => 'Z'); end if; end process; process (Tri_en2, Data_in) begin if (Tri_en2 = '1') then out(11:0) <= Data_in(11:0); else out(11:0) <= (others => 'Z'); end if; end process; Ðàçäåëåíèå ïðîåêòà íà ÷àñòè îïòèìàëüíûõ ðàçìåðîâ ïîçâîëÿåò îáåñïå÷èòü îïòèìàëüíîå èñïîëüçîâàíèå ðåñóðñîâ çà ñ÷åò èõ îïòèìèçàöèè ïðè ñèíòåçå. Èçâåñòíî, ÷òî ïîäàâëÿþùåå áîëüøèíñòâî ïðîãðàìì ñèíòåçà äîñòèãàåò íàèáîëåå ïðèåìëåìîãî ðåçóëüòàòà ïðè ðàçìåðå áëîêà ïîðÿäêà 2
5 òûñÿ÷ ýêâèâàëåíòíûõ âåíòèëåé. Ïðèâåäåííûé íèæå ïðèìåð ïîêàçûâàåò, êàê ìîæíî ñýêîíîìèòü ðåñóðñû ïóòåì çàìåíû âñòðîåííîãî â ìîäóëü ðåãèñòðà (Ðèñ. 6.31) íà âûäåëåííûé ðåãèñòð (Ðèñ. 6.32).
475
Ýëåìåíòíàÿ áàçà
a a1
clk
c b2
AL6157+
b clk
Ðèñ. 6.31. Ñõåìíîå îïèñàíèå öåïè ñî âñòðîåííûì â ìîäóëü ðåãèñòðîì a b clk
AL6158+
c
Ðèñ. 6.32. Ñõåìíîå îïèñàíèå öåïè ñ âûäåëåííûì ðåãèñòðîì
process (clk, a, b) begin if (clk'event and clk = '1') then a1 <= a; b1 <= b; end if; end process; process (a1, b1) begin c <=a1 + b1; end process; process (clk, a, b) begin if (clk'event and clk = '1') then c <=a + b; end if; end process;
6.12. Ñîçäàíèå îïèñàíèé ñ ó÷åòîì îñîáåííîñòåé àðõèòåêòóðû ÏËÈÑ (Technology Specific Coding Techniques) Ïîìèìî ñïîñîáîâ ñîçäàíèÿ îïèñàíèé, íåçàâèñèìûõ îò èñïîëüçóåìîé ýëåìåíòíîé áàçû è åå àðõèòåêòóðíûõ îñîáåííîñòåé, â ïðàêòèêå ïðîåêòèðîâàíèÿ óñòðîéñòâ íà ÏËÈÑ ïðèìåíÿåòñÿ òàê íàçûâàåìîå ñîçäàíèå îïèñà-
476
Ýëåìåíòíàÿ áàçà íèé ñ ó÷åòîì îñîáåííîñòåé àðõèòåêòóðû ÏËÈÑ (Technology Specific Coding Techniques). Ðàññìîòðèì íåêîòîðûå ïðèìåðû ïðîåêòèðîâàíèÿ öèôðîâûõ óñòðîéñòâ äëÿ èñïîëüçîâàíèÿ ñ ó÷åòîì îñîáåííîñòåé àðõèòåêòóðû FPGA ÏËÈÑ. Äëÿ ðåàëèçàöèè ìóëüòèïëåêñîðîâ, êàê ïðàâèëî, ïðèìåíÿåòñÿ êîíñòðóêöèÿ CASE, ÷òî çíà÷èòåëüíî âûãîäíåå ñ òî÷êè çðåíèÿ áûñòðîäåéñòâèÿ è çàòðàò ðåñóðñîâ, ÷åì êîíñòðóêöèÿ IF-THEN-ELSE. Áîëüøèíñòâî ïðîèçâîäèòåëåé ÏËÈÑ ðåêîìåíäóþò èñïîëüçîâàòü îïåðàòîð CASE. Kàê ïðàâèëî, ïðè ðåàëèçàöèè íà ÏËÈÑ âíóòðåííÿÿ øèíà ñ òðåìÿ ñîñòîÿíèÿìè ýìóëèðóåòñÿ êàê ìóëüòèïëåêñîð. Ïðèìåð ýìóëÿöèè øèíû â âèäå ìóëüòèïëåêñîðà ïðèâåäåí íà Ðèñ. 6.33. E0
3QSTATE
A[7:0] 3QSTATE
B[7:0] E2
O[7:0] 3QSTATE
A[7:0] B[7:0] C[7:0] D[7:0]
MUX
C[7:0] E3...E0 3QSTATE
AL6159+
E3 D[7:0]
Ðèñ. 6.33. Ýìóëÿöèÿ øèíû â âèäå ìóëüòèïëåêñîðà
Ïðèìåð ýìóëÿöèè øèíû íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity tribus is port (A, B, C, D : in std_logic_vector (7 downto 0); E0, E1, E2, E3 : in std_logic; Q :out std_logic_vector(7 downto 0)); end tribus; architecture rtl of tribus is begin Q <=A when(E0 = '1') else "ZZZZZZZZ"; Q <=B when(E1 = '1') else "ZZZZZZZZ";
477
O[7:0]
AL6160+
E1
Ýëåìåíòíàÿ áàçà Q <=C when(E2 = '1') else "ZZZZZZZZ"; Q <=D when(E3 = '1') else "ZZZZZZZZ"; end rtl; Ïðèìåð ìóëüòèïëåêñîðà íà VHDL: library IEEE; use IEEE.std_logic_1164.all; entity muxbus is port (A, B, C, D : in std_logic_vector (7 downto 0); E0, E1, E2, E3 : in std_logic; Q :out std_logic_vector(7 downto 0)); end muxbus; architecture rtl of muxbus is signal E_int : std_logic_vector(1 downto 0); begin process (E0, E1, E2, E3) variable E : std_logic_vector(3 downto 0); begin E :=E0 &E1 &E2 &E3; case E is when "0001" => E_int <= "00"; when "0010" => E_int <= "01"; when "0100" => E_int <= "10"; when "1000" => E_int <= "11"; when others => E_int <= "—"; end case; end process; process (E_int, A, B, C, D) begin case E_int is when "00" => Q <= D; when "01" => Q <= C; when "10" => Q <= B; when "11" => Q <= A; when others =>Q <=(others => ''); end case;
478
Ýëåìåíòíàÿ áàçà end process; end rtl; Ýìóëÿöèÿ øèíû íà Verilog: module tribus (A, B, C, D, E0, E1, E2, E3, Q); input [7:0]A, B, C, D; output [7:0]Q; input E0, E1, E2, E3; assign Q[7:0] = E0 ? A[7:0] : 8'bzzzzzzzz; assign Q[7:0] = E1 ? B[7:0] : 8'bzzzzzzzz; assign Q[7:0] = E2 ? C[7:0] : 8'bzzzzzzzz; assign Q[7:0] = E3 ? D[7:0] : 8'bzzzzzzzz; endmodule Ðåàëèçàöèÿ ìóëüòèïëåêñîðà íà Verilog: module muxbus (A, B, C, D, E0, E1, E2, E3, Q); input [7:0]A, B, C, D; output [7:0]Q; input E0, E1, E2, E3; wire [3:0] select4; reg [1:0] select2; reg [7:0]Q; assign select4 = {E0, E1, E2, E3}; always @ (select4) begin case(select4) 4'b0001 : select2 = 2'b00; 4'b0010 : select2 = 2'b01; 4'b0100 : select2 = 2'b10; 4'b1000 : select2 = 2'b11; default : select2 = 2'bxx; endcase end always @ (select2 or A or B or C or D) begin case(select2)
479
Ýëåìåíòíàÿ áàçà 2'b00 :Q =D; 2'b01 :Q =C; 2'b10 :Q =B; 2'b11 :Q =A; endcase end endmodule Õîòåëîñü áû ïðèâåñòè íåñêîëüêî ïðèìåðîâ ïî ðåàëèçàöèè óñòðîéñòâ ïàìÿòè. Ïðèâåäåííûé íèæå ïðèìåð èëëþñòðèðóåò îïèñàíèå ñòàòè÷åñêîé ïàìÿòè (SRAM) íà VHDL äëÿ ðåàëèçàöèè íà ÏËÈÑ, íå èìåþùèõ âñòðîåííûõ áëîêîâ ïàìÿòè.  ðÿäå ñëó÷àåâ ýòîò ïðèåì ïîçâîëÿåò, íå âûõîäÿ çà ðàìêè îäíîãî óñòðîéñòâà, ðåàëèçîâàòü íåáîëüøîé áóôåð. Ïðèìåð ðåàëèçîâàí íà VHDL: //################################################### //#— Behavioral description of a singleport SRAM with:# //#— Active High write enable (WE) # //#— Rising clock edge (Clock) # //################################################### library ieee; use ieee.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity reg_sram is generic (width : integer:=8; depth : integer:=8; addr : integer:=3); port (Data : in std_logic_vector (width1 downto 0); Q : out std_logic_vector (width1 downto 0); Clock : in std_logic; WE : in std_logic; Address : in std_logic_vector (addr1 downto 0)); end reg_sram; architecture behav of reg_sram is type MEM is array (0 to depth1) of std_logic_ vector(width1
480
Ýëåìåíòíàÿ áàçà downto 0); signal ramTmp : MEM; begin process (Clock) begin if (clock'event and clock='1') then if (WE = '1') then ramTmp (conv_integer (Address)) <= Data; end if; end if; end process; Q <= ramTmp(conv_integer(Address)); end behav; Ìîäåëü íà Verilog èìååò âèä: `timescale 1 ns/100 ps //################################################### //# Behavioral singleport SRAM description : # //# Active High write enable (WE) # //# Rising clock edge (Clock) # //################################################### module reg_sram (Data, Q, Clock, WE, Address); parameter width = 8; parameter depth = 8; parameter addr = 3; input Clock, WE; input [addr1:0] Address; input [width1:0] Data; output [width1:0] Q; wire [width1:0] Q; reg [width1:0] mem_data [depth1:0]; always @(posedge Clock) if(WE) mem_data[Address] = #1 Data; assign Q = mem_data[Address]; endmodule
481
Ýëåìåíòíàÿ áàçà Ñëåäóþùèé ïðèìåð èëëþñòðèðóåò ñîçäàíèå ìîäåëè äâóõïîðòîâîé ñòàòè÷åñêîé ïàìÿòè (Dual-Port SRAM). Îïèñûâàåòñÿ ìîäóëü 8⫻8 ÿ÷ååê. Îïèñàíèå íà VHDL èìååò âèä: //################################################### //# Behavioral description of dualport SRAM with :# //# Active High write enable (WE) # //# Active High read enable (RE) # //# Rising clock edge (Clock) # //################################################### library ieee; use ieee.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; entity reg_dpram is generic (width : integer:=8; depth : integer:=8; addr : integer:=3); port (Data : in std_logic_vector (width1 downto 0); Q : out std_logic_vector (width1 downto 0); Clock : in std_logic; WE : in std_logic; RE : in std_logic; WAddress: in std_logic_vector (addr1 downto 0); RAddress: in std_logic_vector (addr1 downto 0)); end reg_dpram; architecture behav of reg_dpram is type MEM is array (0 to depth1) of std_logic_ vector(width1 downto 0); signal ramTmp : MEM; begin — Write Functional Section process (Clock) begin if (clock'event and clock='1') then if (WE = '1') then
482
Ýëåìåíòíàÿ áàçà ramTmp (conv_integer (WAddress)) <= Data; end if; end if; end process; — Read Functional Section process (Clock) begin if (clock'event and clock='1') then if (RE = '1') then Q <= ramTmp(conv_integer (RAddress)); end if; end if; end process; end behav; Ìîäåëü äâóõïîðòîâîé ïàìÿòè íà Verilog: `timescale 1 ns/100 ps //################################################### //# Behavioral dualport SRAM description : # //# Active High write enable (WE) # //# Active High read enable (RE) # //# Rising clock edge (Clock) # //################################################### module reg_dpram (Data, Q, Clock, WE, RE, WAddress, RAddress); parameter width = 8; parameter depth = 8; parameter addr = 3; input Clock, WE, RE; input [addr1:0] WAddress, RAddress; input [width1:0] Data; output [width1:0] Q; reg [width1:0] Q; reg [width1:0] mem_data [depth1:0]; //################################################### //# Write Functional Section #
483
Ýëåìåíòíàÿ áàçà //################################################### always @(posedge Clock) begin if(WE) mem_data[WAddress] = #1 Data; end //################################################### //# Read Functional Section # //################################################### always @(posedge Clock) begin if(RE) Q = #1 mem_data[RAddress]; end endmodule
484
Ãëàâà 7. Ïðèìåðû
ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
7.1. Ðåàëèçàöèÿ öèôðîâûõ ôèëüòðîâ íà ÏËÈÑ ñåìåéñòâà FLEX ôèðìû «Altera» Ìíîãèå öèôðîâûå ôèëüòðû (ÖÔ) äîñòàòî÷íî ïðîñòî ðåàëèçîâàòü â âèäå KÈÕ-ôèëüòðà. Ñ ïîÿâëåíèåì ÁÈÑ ñåìåéñòâà FLEX8000 è FLEX10K ôèðìû «Altera» ïîÿâèëàñü âîçìîæíîñòü ñîçäàíèÿ âûñîêîïðîèçâîäèòåëüíûõ è ãèáêèõ KÈÕ-ôèëüòðîâ âûñîêîãî ïîðÿäêà. Ïðè ýòîì ÏËÈÑ áëàãîäàðÿ îñîáåííîñòÿì ñâîåé àðõèòåêòóðû ïîçâîëÿþò äîñòèãíóòü íàèëó÷øèõ ïîêàçàòåëåé ïðîèçâîäèòåëüíîñòè ïî ñðàâíåíèþ ñ äðóãèìè ñïîñîáàìè ðåàëèçàöèè ÖÔ. Òàê, ïðè ðåàëèçàöèè ÖÔ íà áàçå ÖÎÑ ñðåäíåãî êëàññà ìîæíî äîñòè÷ü ïðîèçâîäèòåëüíîñòè îáðàáîòêè äàííûõ ïîðÿäêà 5 ìèëëèîíîâ îòñ÷åòîâ â ñåêóíäó (MSPS, million samples per second). Èñïîëüçîâàíèå ãîòîâûõ ñïåöèàëèçèðîâàííûõ ÁÈÑ ïîçâîëÿåò îáåñïå÷èòü ïðîèçâîäèòåëüíîñòü 30
35 MSPS. Ïðè èñïîëüçîâàíèè ÏËÈÑ ñåìåéñòâ FLEX8000 è FLEX10K äîñòèãàþòñÿ âåëè÷èíû áîëåå 100 MSPS. Ðàññìîòðèì îñîáåííîñòè ðåàëèçàöèè KÈÕ-ôèëüòðîâ íà áàçå ÏËÈÑ ñåìåéñòâ FLEX8000 è FLEX10K ñ ó÷åòîì ñïåöèôèêè èõ àðõèòåêòóðû íà ïðèìåðå KÈÕ-ôèëüòðà ñ 8 îòâîäàìè (Ðèñ. 7.1). Íà Ðèñ. 7.1 ââåäåíû ñëåäóþùèå îáîçíà÷åíèÿ: xn ñèãíàë íà âûõîäå n-ãî ðåãèñòðà, hn êîýôôèöèåíò ÑÔ, yn âûõîäíîé ñèãíàë. Ñèãíàë íà âûõîäå ôèëüòðà áóäåò èìåòü âèä: yn =
8
∑xn hn
(1)
n=1
Äëÿ îáåñïå÷åíèÿ ëèíåéíîñòè ôàçîâîé õàðàêòåðèñòèêè KÈÕ-ôèëüòðà êîýôôèöèåíòû hn ÑÔ-ôèëüòðà âûáèðàþòñÿ ñèììåòðè÷íûìè îòíîñèòåëüíî
485
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
Рг.7
Рг.6
Рг.5
X8
X7
X6
X5
Рг.1 X1
Рг.2 X2
Рг.3 X3
Рг.4 X4
+
+
+
+
h1
S1
h2
S2
h3
+ Уn
S3
h4
S4
Параллельный векторный перемножитель
AL7161+
Xn
Рг.8
Ðèñ. 7.1. KÈÕ-ôèëüòð ñ 8 îòâîäàìè
öåíòðàëüíîé âåëè÷èíû. Òàêîå ïîñòðîåíèå ïîçâîëÿåò ñîêðàòèòü ÷èñëî ïåðåìíîæèòåëåé. Ïîñêîëüêó êîìïîíåíòû âåêòîðà h ïîñòîÿííû äëÿ ëþáîãî ôèëüòðà ñ ôèêñèðîâàííûìè õàðàêòåðèñòèêàìè, òî â êà÷åñòâå ïàðàëëåëüíîãî âåêòîðíîãî ïåðåìíîæèòåëÿ (ÏÂÏ) óäîáíî èñïîëüçîâàòü òàáëèöó ïåðåêîäèðîâîê, âõîäÿùóþ â ñîñòàâ ëîãè÷åñêîãî ýëåìåíòà [10-13] ÏËÈÑ. Ðàáîòà ïàðàëëåëüíîãî âåêòîðíîãî ïåðåìíîæèòåëÿ îïèñûâàåòñÿ ñëåäóþùèì óðàâíåíèåì: y = s1 h 1 + s2 h 2 + s3 h 3 + s4 h 4
(2)
Ïðè èñïîëüçîâàíèè ÒÏ îïåðàöèÿ ïåðåìíîæåíèÿ âûïîëíÿåòñÿ ïàðàëëåëüíî.  êà÷åñòâå ïðèìåðà ðàññìîòðèì ðåàëèçàöèþ 2-ðàçðÿäíîãî âåêòîðíîãî ïåðåìíîæèòåëÿ. Ïóñòü âåêòîð êîýôôèöèåíòîâ h èìååò âèä: h1
h2
h3
h4
01
11
10
11
Âåêòîð ñèãíàëîâ s èìååò âèä: s1
s2
s3
s4
11
00
10
01
486
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Ïðîèçâåäåíèå íà âûõîäå ÏÂÏ ïðèíèìàåò âèä: hn
01
11
10
11
sn
11
00
10
01
×àñòè÷íîå ïðîèçâåäåíèå P1
01
00
00
11
= 100
×àñòè÷íîå ïðîèçâåäåíèå P2
01
00
10
00
= 011
Âûõîäíîé ñèãíàë y
011
000
100
011
= 1010
Àíàëîãè÷íî ôîðìèðóåòñÿ ðåçóëüòàò P1 â ñëó÷àå 4-ðàçðÿäíûõ ñèãíàëîâ sn. ×àñòè÷íîå ïðîèçâåäåíèå P2 âû÷èñëÿåòñÿ àíàëîãè÷íî, òîëüêî ðåçóëüòàò íåîáõîäèìî ñäâèíóòü íà 1 ðàçðÿä âëåâî. Ñòðóêòóðà 4-ðàçðÿäíîãî ÏÂÏ ïðåäñòàâëåíà íà Ðèñ. 7.2. 2 2 2 2 S1 S 2 S 3 S 4
ЛЭ
ЛЭ
ЛЭ
ЛЭ
ЛЭ
Таблица перекодировки 16 ⫻ 4
ЛЭ
ЛЭ
ЛЭ
Таблица перекодировки 16 ⫻ 4
4
4 x2
P1
P2
Уn
AL7162+
6
Ðèñ. 7.2. Ïàðàëëåëüíûé âåêòîðíûé ïåðåìíîæèòåëü
Î÷åâèäíî, ÷òî ñ ðîñòîì ðàçðÿäíîñòè ïðåäñòàâëåíèÿ äàííûõ âîçðàñòàåò ðàçìåðíîñòü ÒÏ, à ñëåäîâàòåëüíî, òðåáóåòñÿ áîëüøåå ÷èñëî ËÝ äëÿ ðåàëèçàöèè àëãîðèòìà ôèëüòðàöèè. Òàê, äëÿ ðåàëèçàöèè 8-ðàçðÿäíîãî ÏÂÏ òðåáóåòñÿ 8 ÒÏ ðàçìåðíîñòüþ 16⫻8. Îïåðàöèÿ óìíîæåíèÿ íà 2 ëåãêî îáåñïå÷èâàåòñÿ ñäâèãîâûìè ðåãèñòðàìè. Âêëþ÷åíèå ñäâèãîâûõ ðåãèñòðîâ íà âûõîäàõ ïðîìåæóòî÷íûõ ñóììàòîðîâ ïîçâîëÿåò îáåñïå÷èòü êîíâåéåðèçàöèþ îáðàáîòêè äàííûõ è, ñëåäîâàòåëüíî, ïîâûñèòü ïðîèçâîäèòåëüíîñòü. Ïðè ýòîì ðåãèñòðû âõîäÿò â ñîñòàâ
487
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ ñîîòâåòñòâóþùèõ ËÝ, ïîýòîìó ñîõðàíÿåòñÿ êîìïàêòíîñòü ñòðóêòóðû, íå òðåáóåòñÿ çàäåéñòâîâàòü äîïîëíèòåëüíûå ËÝ. Îñíîâíûì äîñòîèíñòâîì ïàðàëëåëüíîé àðõèòåêòóðû ïîñòðîåíèÿ ôèëüòðîâ ÿâëÿåòñÿ âûñîêàÿ ïðîèçâîäèòåëüíîñòü. Îäíàêî, åñëè ÷èñëî çàäåéñòâîâàííûõ ËÝ ÿâëÿåòñÿ êðèòè÷íûì, ïðåäïî÷òèòåëüíåå ñòðîèòü ôèëüòð ïî ïîñëåäîâàòåëüíîé èëè êîìáèíèðîâàííîé àðõèòåêòóðå.  Òàáë. 7.1 ïðèâåäåíû ñðàâíèòåëüíûå õàðàêòåðèñòèêè KÈÕ-ôèëüòðîâ îäèíàêîâîé ðàçðÿäíîñòè è ïîðÿäêà, íî âûïîëíåííûõ ïî ðàçëè÷íîé àðõèòåêòóðå. Òàáëèöà 7.1. Ñðàâíèòåëüíûå õàðàêòåðèñòèêè KÈÕ-ôèëüòðîâ ×èñëî Òàêòîâàÿ Áûñòðîòàêòîâ äî ÷àñòîòà äåéñòâèå, ïîëó÷åíèÿ [ÌÃö] [MSPS] ðåçóëüòàòà
Ðàçðÿäíîñòü äàííûõ
Ïîðÿäîê
Ðàçìåð, ÷èñëî ËÝ
Ïàðàëëåëüíàÿ
8
16
468
101
1
101
Ïîñëåäîâàòåëüíàÿ
8
16
272
63
9
7
Àðõèòåêòóðà
Ñ öåëüþ óìåíüøèòü ÷èñëî èñïîëüçóåìûõ ËÝ ïðèìåíÿåòñÿ ïîñëåäîâàòåëüíàÿ àðõèòåêòóðà ïîñòðîåíèÿ ôèëüòðà. Òàê æå, êàê è ïðè ïàðàëëåëüíîì ïîñòðîåíèè ôèëüòðà, äëÿ âû÷èñëåíèÿ ÷àñòè÷íûõ P1, P2,
, PN, N = W+1 ïðîèçâåäåíèé ïðèìåíÿåòñÿ ÒÏ, W ðàçðÿäíîñòü äàííûõ. Òàêîé ÖÔ îáðàáàòûâàåò òîëüêî îäèí ðàçðÿä âõîäíîãî ñèãíàëà â òå÷åíèå òàêòà. Ïîñëåäîâàòåëüíî âû÷èñëÿåìûå ÷àñòè÷íûå ïðîèçâåäåíèÿ íàêàïëèâàþòñÿ â ìàñøòàáèðóþùåì àêêóìóëÿòîðå (ÌÀ). ÌÀ îáåñïå÷èâàåò ñäâèã ñîäåðæèìîãî âïðàâî íà îäèí ðàçðÿä êàæäûé òàêò. Ïîñëå W+1 òàêòîâ íà âûõîäå ïîÿâëÿåòñÿ ðåçóëüòàò. Áëîê óïðàâëåíèÿ îáåñïå÷èâàåò ôîðìèðîâàíèå óïðàâëÿþùèõ ñèãíàëîâ, îáåñïå÷èâàþùèõ êîððåêòíîå âûïîëíåíèå îïåðàöèé. Kîìáèíèðîâàííàÿ àðõèòåêòóðà ÿâëÿåòñÿ êîìïðîìèññîì ìåæäó ýêîíîìè÷íîñòüþ è ïðîèçâîäèòåëüíîñòüþ.  ýòîì ñëó÷àå ïðèìåíÿþòñÿ êàê ïîñëåäîâàòåëüíûå, òàê è ïàðàëëåëüíûå ðåãèñòðû.  ðåçóëüòàòå ðàñïàðàëëåëèâàíèÿ âû÷èñëåíèé îáåñïå÷èâàåòñÿ íåñêîëüêî áîëüøàÿ ïðîèçâîäèòåëüíîñòü, ÷åì ó ïîñëåäîâàòåëüíîãî ôèëüòðà. Îäíèì èç ýôôåêòèâíûõ ñïîñîáîâ ïîâûøåíèÿ ïðîèçâîäèòåëüíîñòè ôèëüòðà ÿâëÿåòñÿ êîíâåéåðèçàöèÿ.  ñëó÷àå, åñëè äëèíà âåêòîðà s íå ÿâëÿåòñÿ ñòåïåíüþ äâîéêè, èñïîëüçóþòñÿ äîïîëíèòåëüíûå ðåãèñòðû äëÿ îáåñïå÷åíèÿ ñèíõðîíèçàöèè. Ñ öåëüþ ïîñòðîåíèÿ ôèëüòðîâ áîëåå âûñîêîãî ïîðÿäêà èñïîëüçóþò ïîñëåäîâàòåëüíîå ñîåäèíåíèå ôèëüòðîâ (êàñêàäèðîâàíèå) ìåíüøåãî ïîðÿäêà.
488
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Óâåëè÷åíèå ðàçðÿäíîñòè äàííûõ òðåáóåò îáåñïå÷åíèÿ áîëüøåé òî÷íîñòè âû÷èñëåíèé è ðàçðÿäíîñòè êîýôôèöèåíòîâ. Óâåëè÷åíèå ðàçðÿäíîñòè äàííûõ íà îäèí ðàçðÿä òðåáóåò èñïîëüçîâàíèÿ äîïîëíèòåëüíîé ÒÏ ïðè ïàðàëëåëüíîé àðõèòåêòóðå è óâåëè÷åíèÿ íà îäèí òàêò âðåìåíè ôèëüòðàöèè ïðè ïîñëåäîâàòåëüíîé àðõèòåêòóðå. Ïðè ýòîì äëÿ îáåñïå÷åíèÿ äîñòàòî÷íîé òî÷íîñòè ïðåäñòàâëåíèÿ äàííûõ äëÿ ôèëüòðà 32-ãî ïîðÿäêà òðåáóåòñÿ 19 ðàçðÿäîâ äëèíû âûõîäíîãî ñëîâà ïðè 8-ðàçðÿäíûõ âõîäíûõ äàííûõ. Ïîñòðîåíèå ôèëüòðà íå÷åòíîãî ïîðÿäêà äîñòèãàåòñÿ óäàëåíèåì îäíîãî èç ðåãèñòðîâ ñäâèãà. Åñëè ïðèìåíÿòü íå ñóììàòîðû, à âû÷èòàòåëè, òî ëåãêî ðåàëèçîâàòü ôèëüòð ñ àíòèñèììåòðè÷íîé õàðàêòåðèñòèêîé. Äîâîëüíî ëåãêî ðåàëèçóþòñÿ ôèëüòðû ñ ïðîðåæèâàíèåì èëè, íàîáîðîò, ñ èíòåðïîëÿöèåé îòñ÷åòîâ. Ïðè ïðîåêòèðîâàíèè ïðîðåæèâàþùåãî ôèëüòðà îáåñïå÷èâàåòñÿ ïîêàñêàäíîå óìåíüøåíèå òàêòîâîé ÷àñòîòû, ÷òî ïîçâîëÿåò ñóùåñòâåííî ñíèçèòü ýíåðãîïîòðåáëåíèå. Èíòåðïîëèðóþùèé ôèëüòð âûïîëíÿåò ïðîòèâîïîëîæíóþ îïåðàöèþ óâåëè÷åíèå ÷àñòîòû âûáîðêè â îïðåäåëåííîå ÷èñëî ðàç. Îäíèì èç ñïîñîáîâ ðåàëèçàöèè òàêîãî àëãîðèòìà ÿâëÿåòñÿ äîïîëíåíèå îòñ÷åòîâ íóëÿìè. Âîçìîæíîñòè àðõèòåêòóðû ÏËÈÑ ñåìåéñòâ FLEX ïîçâîëÿþò ðåàëèçîâàòü äâóõìåðíûå ôèëüòðû äëÿ îáðàáîòêè èçîáðàæåíèé, à òàêæå ðåøåò÷àòûå ñòðóêòóðû. Äëÿ ïðîåêòèðîâàíèÿ ôèëüòðîâ íåîáõîäèì íàáîð ñïåöèàëèçèðîâàííûõ ïðîãðàììíûõ ñðåäñòâ, ïîçâîëÿþùèõ ñèíòåçèðîâàòü òðåáóåìóþ ñèñòåìíóþ ôóíêöèþ ôèëüòðà, ïðîâåñòè ìîäåëèðîâàíèå åãî ðàáîòû, à òàêæå áèáëèîòåêè ïàðàìåòðèçèðóåìûõ ìåãàôóíêöèé, ñîäåðæàùèõ ðåàëèçàöèè òèïîâûõ ñòðóêòóð ÖÔ. Ôèðìà «Altera» ïðåäñòàâëÿåò â ñîñòàâå Altera DSP Design KIT ïðîãðàììíûé ïðîäóêò FIRGEN.  ôóíêöèè ïðîãðàììû FIRGEN âõîäèò ìîäåëèðîâàíèå KÈÕ-ôèëüòðà ñ çàäàííûìè êîýôôèöèåíòàìè, à òàêæå ãåíåðàöèÿ ôàéëîâ, ïðåäíàçíà÷åííûõ äëÿ ðåàëèçàöèè ôèëüòðà øòàòíûìè ñðåäñòâàìè ïàêåòà MAX+PLUS II. Äëÿ ïîñòðîåíèÿ îòêëèêà ôèëüòðà, ïîëó÷åííîãî â ðåçóëüòàòå ìîäåëèðîâàíèÿ ñðåäñòâàìè FIRGEN, ìîæíî èñïîëüçîâàòü ëèáî ïàêåò Microsoft Exel, ëèáî âõîäÿùèé â ñîñòàâ Altera DSP Design KIT ïðîäóêò GNUplot. Ñõåìàòè÷åñêè ïðîöåññ ðàçðàáîòêè ôèëüòðà ïðåäñòàâëåí íà Ðèñ. 7.3.  Òàáë. 7.2 ñâåäåíû äàííûå î ìåãàôóíêöèÿõ ôèëüòðîâ, âõîäÿùèõ â ñîñòàâ Altera DSP Design KIT.
489
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Синтез коэффициентов ЦФ (Специализированное ПО)
Подготовка данных для использования в мегафункции (FIRGEN)
Компиляция проекта (MAX+PLUS II) Моделирование во временной области (MAX+PLUS II)
Моделирование ЦФ в частной области (FIRGEN)
AL7163+
ПО для визуализации результатов моделирования (MS Exel, GNUPlot, и др.)
Ðèñ. 7.3. Ïðîöåññ ðàçðàáîòêè ôèëüòðà â ïàêåòå MAX+PLUS II
×èñëî îòâîäîâ
Fir_08tp
8
8
8
17
17
296
101
28
Fir_16tp
8
16
8
10
10
468
101
20
Fir_24tp
8
24
8
10
10
653
100
18
Fir_32tp
8
32
8
10
10
862
101
18
Fir_16ts
8
16
8
18
18
272
7
3.4
Fir_64ts
8
64
8
24
24
920
6.5
2.4
Fir_3x3
8
9
8
18
18
327
102
24
Ìîäåëü
Ðàçðÿäíîñòü ïðåäñòàâëåíèÿ ÂûõîäKîýôôè- Âíóòíûõ äàíöèåíòîâ ðåííÿÿ íûõ
490
Ðàçìåð, ÷èñëî ËÝ
Ðàçðÿäíîñòü âõîäíûõ äàííûõ
Òàáëèöà 7.2. Äàííûå î ìåãàôóíêöèÿõ ôèëüòðîâ Ïðîèçâîäèòåëüíîñòü [MSPS] Ñ êîí- Áåç êîíâåéåðîì âåéåðà
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
7.2. Ðåàëèçàöèÿ öèôðîâûõ ïîëèíîìèàëüíûõ ôèëüòðîâ  îáùåì ñëó÷àå öèôðîâîé ïîëèíîìèàëüíûé ôèëüòð ðàçìåðíîñòè r è ïîðÿäêà M îïðåäåëÿåòñÿ êîíå÷íûì äèñêðåòíûì ðÿäîì Âîëüòåððà (ôóíêöèîíàëüíûì ïîëèíîìîì) âèäà: y ( n) = h0 +
M
∑ m =1
y m ( n) = h0 +
M
∑∑ ∑ K
m =1 n1
nm
hm ( n1 ,..., nm )
m
∏x(n − ni ) , i =1
(3)
ãäå hm(n1, ..., nm) ìíîãîìåðíûå èìïóëüñíûå õàðàêòåðèñòèêè (ÿäðà) ôèëüòðà, çàâèñÿùèå îò âåêòîðíûõ àðãóìåíòîâ ni = [ni1 ... nir]. Ôèëüòðû äàííîãî âèäà ÷àñòî íàçûâàþòñÿ òàêæå ôèëüòðàìè Âîëüòåððà. Íåïîñðåäñòâåííàÿ ðåàëèçàöèÿ öèôðîâûõ ïîëèíîìèàëüíûõ ôèëüòðîâ ñâÿçàíà ñ âû÷èñëåíèåì ïðîèçâåäåíèÿ âåêòîðîâ. Âû÷èñëèòåëüíûå çàòðàòû ìîãóò áûòü ñîêðàùåíû çà ñ÷åò èñïîëüçîâàíèÿ ñâîéñòâà ñèììåòðèè èçîòðîïíûõ ôèëüòðîâ. Òàêèì îáðàçîì, ïóòåì ïîñëåäîâàòåëüíîãî ïðèìåíåíèÿ ïðîöåäóðû äåêîìïîçèöèè ïîëèíîìèàëüíûé ôèëüòð ïðîèçâîëüíîãî ïîðÿäêà ìîæåò áûòü ïðåäñòàâëåí â âèäå ïàðàëëåëüíîé ñòðóêòóðû, ñîñòîÿùåé èç ëèíåéíûõ ôèëüòðîâ. Îïåðàöèÿ ëèíåéíîé ôèëüòðàöèè ñâÿçàíà ñ âû÷èñëåíèåì äâóõìåðíîé ñâåðòêè è äîïóñêàåò âûñîêîýôôåêòèâíóþ ðåàëèçàöèþ â âèäå ñòðóêòóð ñèñòîëè÷åñêîãî òèïà, ìàòðè÷íûõ è âîëíîâûõ ïðîöåññîðîâ. Ïðîöåññ äâóõìåðíîé ñâåðòêè èçîáðàæåíèÿ ñ ìàñêîé N⫻N, â ñâîþ î÷åðåäü, ìîæíî ñâåñòè ê âû÷èñëåíèþ N îäíîìåðíûõ ñâåðòîê, ÷òî â êîíå÷íîì èòîãå ïîçâîëÿåò âûïîëíÿòü ïîëèíîìèàëüíóþ ôèëüòðàöèþ èçîáðàæåíèé ïóòåì ïàðàëëåëüíîãî âû÷èñëåíèÿ îáû÷íûõ îäíîìåðíûõ ñâåðòîê. Íà Ðèñ. 7.4 ïðåäñòàâëåí îäèí èç íàèáîëåå ïðîñòûõ âàðèàíòîâ ðåàëèçàöèè äâóõìåðíîé ñâåðòêè èçîáðàæåíèÿ ñ ìàñêîé 3⫻3 â âèäå ñèñòîëè÷åñêîé ñòðóêòóðû, ñîñòîÿùåé èç 9 èäåíòè÷íûõ ïðîöåññîðíûõ ýëåìåíòîâ. Çàäà÷à äâóõìåðíîé ñâåðòêè ôîðìóëèðóåòñÿ ñëåäóþùèì îáðàçîì: äàíû âåñà wi,j äëÿ i, j = 1, 2
, k, òàê ÷òî k⫻k ðàçìåð ÿäðà è âõîäíîå èçîáðàæåíèå xi,j äëÿ i, j = 1, 2
, n. Òðåáóåòñÿ âû÷èñëèòü ýëåìåíòû èçîáðàæåíèÿ yi,j äëÿ i, j = 1, 2
, n, îïðåäåëÿåìûå â âèäå: yi , j =
k
k
∑∑whl xi+h−1, j+l −1.
(4)
l =1 h=1
Ïðè k = 3 äâóõìåðíàÿ ñâåðòêà âûïîëíÿåòñÿ â âèäå òðåõ ïîñëåäî-
491
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ x2, x1, x0 0
h0
h1
h2
h3
h4
h5
h6
h7
h8
x5, x4, x3 0
y1(n)
hi
0
AL7164+
x8, x7, x6
Ðèñ. 7.4. Ñèñòîëè÷åñêàÿ ðåàëèçàöèÿ äâóõìåðíîé ëèíåéíîé ñâåðòêè
âàòåëüíûõ îäíîìåðíûõ ñâåðòîê (èñïîëüçóþùèõ â êà÷åñòâå âåñîâ îäíó è òó æå ïîñëåäîâàòåëüíîñòü w 11 , w 21 ,
, w 33 ): 1. Âû÷èñëåíèå (y11, y12, y13, y14,
) ïðè èñïîëüçîâàíèè (x11, x21, x31, x12, x22, x32, x13, x23, x33,
) â êà÷åñòâå âõîäíîé ïîñëåäîâàòåëüíîñòè. 2. Âû÷èñëåíèå (y21, y22, y23, y24,
) ïðè èñïîëüçîâàíèè (x21, x31, x41, x22, x32, x42, x23, x33, x43,
) â êà÷åñòâå âõîäíîé ïîñëåäîâàòåëüíîñòè. 3. Âû÷èñëåíèå (y31, y32, y33, y34,
) ïðè èñïîëüçîâàíèè (x31, x41, x51, x32, x42, x52, x33, x43, x53,
) â êà÷åñòâå âõîäíîé ïîñëåäîâàòåëüíîñòè. Kàæäóþ èç ýòèõ ñâåðòîê ìîæíî âûïîëíèòü íà îäíîìåðíîì ñèñòîëè÷åñêîì ìàññèâå èç äåâÿòè ÿ÷ååê. Îòìåòèì, ÷òî â ëþáîì èç ýòèõ îäíîìåðíûõ ìàññèâîâ ÿ÷åéêà çàíÿòà âû÷èñëåíèÿìè yij òîëüêî 1/3 âðåìåíè. Äëÿ âîññòàíîâëåíèÿ ÿ÷åéêà ñ äâóìÿ ïîòîêàìè äîëæíà áûòü 8-ðàçðÿäíîé äëÿ âõîäíûõ äàííûõ è èìåòü 12 áèò äëÿ ïðåäñòàâëåíèÿ âåñîâ. Äëÿ ñåòêè 32⫻32 ïèêñåëåé â êàæäîì áëîêå ïàìÿòè òðåáóåòñÿ õðàíèòü 1024 ðàçëè÷íûõ âåñîâûõ êîýôôèöèåíòà è èìåòü 10-ðàçðÿäíóþ àäðåñíóþ øèíó äëÿ óêàçàíèÿ ïîëîæåíèÿ êàæäîé òî÷êè. 12-ðàçðÿäíûé óìíîæèòåëü è 24-ðàçðÿäíûé ñóììàòîð äëÿ ïîëó÷åíèÿ ïðîìåæóòî÷íûõ ðåçóëüòàòîâ âïîëíå îáåñïå÷èâàþò ñîõðàíåíèå òðåáóåìîé òî÷íîñòè â ïðîöåññå âû÷èñëåíèé. Äëÿ âûïîëíåíèÿ ìíîãîìåðíîé ñâåðòêè òðåáóåòñÿ åäèíñòâåííàÿ ìîäèôèêàöèÿ áàçîâîé ÿ÷åéêè ñ äâóìÿ ïîòîêàìè äîáàâëåíèå òðåáóåìîãî ÷èñëà ñèñòîëè÷åñêèõ âõîäíûõ ïîòîêîâ è ñîîòâåòñòâóþùåå óâåëè÷åíèå ðàçìåðà ìóëüòèïëåêñîðà äëÿ âûáîðà äàííûõ. Ïðè ðåøåíèè çàäà÷ ôèëüòðàöèè èçîáðàæåíèÿ ñ öåëüþ óäàëåíèÿ øóìîâ, âîññòàíîâëåíèÿ èçîáðàæåíèÿ èëè óëó÷øåíèÿ åãî êà÷åñòâà ïðèõîäèòñÿ èìåòü äåëî ñ äàííûìè, èìåþùèìè øèðîêèé äèíàìè÷åñêèé äèàïàçîí. Ïîýòîìó â êà÷åñòâå ôîðìàòà äàííûõ íåîáõîäèìî èñïîëüçîâàòü ÷èñëà ñ ïëàâàþùåé çàïÿòîé. Äëÿ ðåàëèçàöèè ñèñòîëè÷åñêèõ ñòðóêòóð ïîëèíîìèíàëüíûõ ôèëüòðîâ íàèáîëåå ïðèãîäíû ÏËÈÑ ñåìåéñòâà FLEX10K, ñîäåðæàùèå âñòðîåííûå
492
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
AL7165
áëîêè ïàìÿòè, ïðåäíàçíà÷åííûå äëÿ ýôôåêòèâíîé ðåàëèçàöèè ôóíêöèé ïàìÿòè è ñëîæíûõ àðèôìåòè÷åñêèõ è ëîãè÷åñêèõ óñòðîéñòâ (óìíîæèòåëåé, êîíå÷íûõ àâòîìàòîâ, öèôðîâûõ ôèëüòðîâ è ò.ä.). Îäèí òàêîé áëîê èìååò åìêîñòü 2 Káèò è ïîçâîëÿåò ñôîðìèðîâàòü ïàìÿòü ñ îðãàíèçàöèåé 2048⫻1, 1024⫻2, 512⫻4 èëè 256⫻8, ðàáîòàþùóþ ñ öèêëîì 12
14 íñ. Èñïîëüçîâàíèå ÂÁÏ çíà÷èòåëüíî ïîâûøàåò ýôôåêòèâíîñòü è áûñòðîäåéñòâèå ñîçäàíèÿ ñëîæíûõ ëîãè÷åñêèõ óñòðîéñòâ, íàïðèìåð óìíîæèòåëåé. Òàê, êàæäûé ÂÁÏ ìîæåò âûïîëíÿòü ôóíêöèè óìíîæèòåëÿ 4⫻4, 5⫻3 èëè 6⫻2. Íà Ðèñ. 7.5 ïðèâåäåíà ðåàëèçàöèÿ ñòðóêòóðû íà ÏËÈÑ, à íà Ðèñ. 7.6 ðåçóëüòàòû ìîäåëèðîâàíèÿ ñèñòîëè÷åñêîé ñòðóêòóðû â ñðåäå MAX PLUS II.
Ðèñ. 7.5. Ðåàëèçàöèÿ ñèñòîëè÷åñêîé ñòðóêòóðû íà ÏËÈÑ
Âêëþ÷åíèå ñäâèãîâûõ ðåãèñòðîâ íà âûõîäàõ ïðîìåæóòî÷íûõ ñóììàòîðîâ ïîçâîëÿåò îáåñïå÷èòü êîíâåéåðèçàöèþ îáðàáîòêè äàííûõ è, ñëåäîâàòåëüíî, ïîâûñèòü ïðîèçâîäèòåëüíîñòü. Ïðè ýòîì ðåãèñòðû âõîäÿò â ñîñòàâ ñîîòâåòñòâóþùèõ ËÝ, ïîýòîìó ñîõðàíÿåòñÿ êîìïàêòíîñòü ñòðóêòóðû è íå òðåáóåòñÿ çàäåéñòâîâàòü äîïîëíèòåëüíûå ËÝ. Ïðè ðåàëèçàöèè îïåðàöèè óìíîæåíèÿ íà êîíñòàíòó è âîçâåäåíèÿ â ñòåïåíü öåëåñîîáðàçíî èñïîëüçîâàòü êîíñòðóêöèþ TABLE ÿçûêà AHDL, êàê
493
AL7166
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
Ðèñ. 7.6. Ðåçóëüòàòû ìîäåëèðîâàíèÿ ñèñòîëè÷åñêîé ñòðóêòóðû íà ÏËÈÑ
ïîêàçûâàåò ñðàâíåíèå, òàêîå ïîñòðîåíèå ïîçâîëÿåò îáåñïå÷èòü áîëåå êîìïàêòíóþ è áûñòðîäåéñòâóþùóþ ðåàëèçàöèþ. Íèæå ïðèâîäèòñÿ ïðèìåð òàêîé êîíñòðóêöèè: TABLE net[11..1] => out[15..1]; B"0000000XXXX" => B"000000000000000"; B"00000010000" => B"000000101011101"; B"00000100000" => B"000001010111010"; B"11111110000" => B"010011100001101"; B"00000010001" => B"010011100001110"; End TABLE; Ïðè ðåàëèçàöèè ïåðåìíîæèòåëåé, êàê ïðàâèëî, èñïîëüçóþòñÿ ìàòðè÷íûå ñòðóêòóðû, ïîñòðîåííûå êàñêàäèðîâàíèåì áèòîâûõ ñóììàòîðîâ.
494
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
7.3. Àëãîðèòìû ôóíêöèîíèðîâàíèÿ è ñòðóêòóðíûå ñõåìû äåìîäóëÿòîðîâ Îáîáùåííàÿ ñòðóêòóðíàÿ ñõåìà, ïî êîòîðîé ðåàëèçîâàí äåìîäóëÿòîð ñèãíàëîâ ñ ÷àñòîòíîé ìàíèïóëÿöèåé (×Ìí), ïðèâåäåíà íà Ðèñ. 7.7. Kàê âèäèì, èñïîëüçóåòñÿ àíàëîãîâàÿ êâàäðàòóðíàÿ îáðàáîòêà (ïåðåìíîæèòåëè, ôàçîâðàùàòåëü, ôèëüòðû íèæíèõ ÷àñòîò) è öèôðîâîå âîññòàíîâëåíèå ñèìâîëîâ è ñèìâîëüíîé ÷àñòîòû, ðåàëèçîâàííîå íà ÏËÈÑ.  êà÷åñòâå ôîðìèðîâàòåëÿ êâàäðàòóð èñïîëüçîâàíà ÈÑ RF2711 ôèðìû «RF Microdevices». Äàííàÿ ìèêðîñõåìà ñîäåðæèò â ñâîåì ñîñòàâå äâà ïåðåìíîæèòåëÿ è ôàçîâðàùàòåëü è ïîçâîëÿåò ðàáîòàòü â äèàïàçîíå ÷àñòîò îò 0.1 äî 200 ÌÃö ïðè øèðèíå ñïåêòðà äî 25 ÌÃö. Îïîðíàÿ ÷àñòîòà f0 ôîðìèðóåòñÿ ñ ïîìîùüþ ñèíòåçàòîðà ïðÿìîãî ñèíòåçà ÷àñòîò AD9830 [1] ôèðìû «Analog Devices». Ñèãíàë ñ âûõîäà ñèíòåçàòîðà ôèëüòðóåòñÿ ñ ïîìîùüþ àêòèâíîãî ÔÍ×, ðåàëèçîâàííîãî íà îïåðàöèîííîì óñèëèòåëå (ÎÓ) AD8052 ïî ñõåìå Ðàóõà.  íàñòîÿùåå âðåìÿ íàáëþäàåòñÿ òåíäåíöèÿ ê «îöèôðîâûâàíèþ» îáðàáàòûâàåìîãî ñèãíàëà íà ïðîìåæóòî÷íûõ ÷àñòîòàõ (Ï×) ïîðÿäêà äåñÿòêîâ ÌÃö, ôîðìèðóÿ êâàäðàòóðû «â öèôðå». Äëÿ ýòèõ öåëåé âîçìîæíî èñïîëüçîâàòü ÈÑ AD6620. Îäíàêî ýòî íå âñåãäà îïðàâäàíî, â îñíîâíîì èç-çà ñëîæíîñòåé ñ óïðàâëåíèåì òàêîé ìèêðîñõåìîé â ñèñòåìàõ, ãäå îòñóòñòâóåò ñîáñòâåííûé êîíòðîëëåð.  êà÷åñòâå ÀÖÏ óäîáíî èñïîëüçîâàòü ñïåöèàëèçèðîâàííûé êâàäðàòóðíûé àíàëîãî-öèôðîâîé ïðåîáðàçîâàòåëü (ÀÖÏ) AD9201. Ïîæàëóé, åäèíñòâåííûì åãî íåäîñòàòêîì ÿâëÿåòñÿ íåîáõîäèìîñòü äåìóëüòèïëåêñèðîâàíèÿ îòñ÷åòîâ ñèíôàçíîé è êâàäðàòóðíîé ñîñòàâëÿþùèõ. Íèæå ïðèâîäèòñÿ îïèñàíèå êîíñòðóêöèé êàæäîãî èç áëîêîâ â ñîñòàâå ÏËÈÑ: äåòåêòîðà ×Ìí-ñèãíàëà è ñèíõðîíèçàòîðà. Îïðåäåëåíû ïðåèìóùåñòâà êàæäîé èç ïðåäëàãàåìûõ ñõåì. Äåòåêòîð ×Ìí-ñèãíàëà ïðåäíàçíà÷åí äëÿ ïðåîáðàçîâàíèÿ èñõîäíîãî ìîäóëèðîâàííîãî ðàäèîñèãíàëà â ïîñëåäîâàòåëüíîñòü ïðÿìîóãîëüíûõ èìФНЧ
Вход
АЦП
symb ПЛИС
90° ФНЧ
АЦП
sync AL7167+
f0 clock
Ðèñ. 7.7. Ñòðóêòóðíàÿ ñõåìà äåìîäóëÿòîðà ñèãíàëîâ ñ ÷àñòîòíîé ìàíèïóëÿöèåé
495
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ ïóëüñîâ, ïîÿâëÿþùèõñÿ ñ ÷àñòîòîé ñëåäîâàíèÿ ñèìâîëîâ è îáëàäàþùèõ òîé æå ïîëÿðíîñòüþ. ×àñòîòà èñõîäíîãî ðàäèîñèãíàëà ðàâíà f = f0 ∆f /2, åñëè ïåðåäàåòñÿ ñèìâîë «0», è f = f0 + ∆f /2, åñëè ïåðåäàåòñÿ ñèìâîë «1»; ïðè ýòîì ïî òåõíè÷åñêîìó çàäàíèþ ∆f Tc = 1, ãäå Tc äëèòåëüíîñòü ñèìâîëà (èíäåêñ ìîäóëÿöèè åäèíèöà, ñèãíàë áåç ðàçðûâà ôàçû). Òàêèì îáðàçîì, èçìåðåíèå ðàçíîñòè (f f0) ýòî è åñòü òà îïåðàöèÿ, êîòîðóþ äîëæåí îñóùåñòâëÿòü äåòåêòîð.  Ïðèëîæåíèè 1 ïîêàçàíî, ÷òî ïðè íàëè÷èè îòñ÷åòîâ êâàäðàòóð èñõîäíîãî ðàäèîñèãíàëà: Sk è Ck, k = 0, 1, 2 è ò.ä., âåëè÷èíà (f f0)k ìîæåò áûòü âû÷èñëåíà ñëåäóþùèì îáðàçîì: S C − C k S k −1 ( f − f 0) k = 21π k k −21 . S k + C k2
(5)
Îòñþäà âûòåêàåò ñòðóêòóðíàÿ ñõåìà äåòåêòîðà, êîòîðàÿ ïðèâåäåíà íà Ðèñ. 7.8. Ñëåäóåò îòìåòèòü ïðåèìóùåñòâà ïðåäëàãàåìîãî àëãîðèòìà äåìîäóëÿöèè ×Ìí-ñèãíàëà: • äåòåêòîð íå òðåáóåò òî÷íîé íàñòðîéêè êâàäðàòóðíîãî ãåíåðàòîðà (Ðèñ. 7.8) íà ÷àñòîòó f0, ÷òî ïîçâîëÿåò åìó óñòîé÷èâî ôóíêöèîíèðîâàòü ïðè çíà÷èòåëüíûõ (äî 30%) óõîäàõ ÷àñòîòû âõîäíîãî ñèãíàëà âñëåäñòâèå ýôôåêòà Äîïëåðà; • îïåðàöèÿ äåëåíèÿ íà äâó÷ëåí íå ÿâëÿåòñÿ îáÿçàòåëüíîé, åñëè äèíàìèêà âõîäíîãî ñèãíàëà íåâåëèêà ëèáî ñòàáèëèçàöèÿ àìïëèòóäû îñóùåñòâëÿåòñÿ ïðè ïîìîùè Àâòîìàòè÷åñêîé ðåãóëèðîâêè óñèëåíèÿ (ÀÐÓ) â Â×-òðàêòå; • èíâàðèàíòíîñòü àëãîðèòìà ê ôàçå îïîðíîãî è âõîäíîãî ñèãíàëîâ, à òàêæå ê àìïëèòóäå âõîäíîãî ñèãíàëà (ïðè íàëè÷èè íîðìèðóþùåãî ìíîæèòåëÿ) óâåëè÷èâàåò ïîìåõîóñòîé÷èâîñòü. Ñèíõðîíèçàòîð. Ïðè äîñòàòî÷íî áîëüøèõ îòíîøåíèÿõ ñèãíàë/øóì (ÎÑØ) íà âõîäå äåìîäóëÿòîðà (20
30 äÁ) âîññòàíîâëåííóþ ïîñëåäîâàòåëüíîñòü f
Ck
f
—
(Sk2+Ck2)–1
Ðèñ. 7.8. Ñòðóêòóðíàÿ ñõåìà äåòåêòîðà
496
(ω — ω0)k
AL7168+
Sk
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ ñèìâîëîâ ìîæíî ñíèìàòü íåïîñðåäñòâåííî ñ âûõîäà äåòåêòîðà. Îäíàêî ïðè ñíèæåíèè ÎÑØ (äî 10
15 äÁ) ôîðìà ñèãíàëà íà âûõîäå äåòåêòîðà íà÷èíàåò èñêàæàòüñÿ (ïîÿâëÿþòñÿ ëîæíûå ïåðåïàäû, ñìåùåíèå ôðîíòîâ ïî âðåìåíè è ò.ï.). Ïîýòîìó íà âûõîä äåòåêòîðà (âíóòðè ÏËÈÑ) ïîäêëþ÷àåòñÿ åùå îäèí áëîê-ñèíõðîíèçàòîð, ïðåäíàçíà÷åíèå êîòîðîãî âîññòàíîâèòü èñòèííóþ ôîðìó äåìîäóëèðîâàííîãî ðàäèîñèãíàëà çà ñ÷åò åãî íàêîïëåíèÿ è àíàëèçà â òå÷åíèå N ïîäðÿä èäóùèõ ñèìâîëîâ (â îïèñàííîé äàëåå âåðñèè äåìîäóëÿòîðîâ N = 10). Ñèíõðîíèçàòîð ðåàëèçóåò îïòèìàëüíûé (ïî êðèòåðèþ ìàêñèìóìà ïðàâäîïîäîáèÿ) àëãîðèòì îöåíêè ñèãíàëà ïðÿìîóãîëüíîé ôîðìû íà ôîíå áåëîãî ãàóññîâñêîãî øóìà. Âîññòàíîâëåíèþ ïîäëåæàò èñòèííûå ìîìåíòû ñìåíû ñèìâîëîâ â èñõîäíîì ðàäèîñèãíàëå (òàêòîâàÿ ñèíõðîíèçàöèÿ), à òàêæå èñòèííàÿ ïîëÿðíîñòü ñèìâîëîâ. Ãëàâíûìè ýëåìåíòàìè ñèíõðîíèçàòîðà (Ðèñ.7.9) ÿâëÿþòñÿ ëèíèÿ çàäåðæêè íà N⫻M îòñ÷åòîâ (M ÷èñëî îòñ÷åòîâ íà ñèìâîë) è (N + 1) ñóììàòîðîâ, ðåàëèçóþùèõ îïåðàöèþ íàêîïëåíèÿ. Ñèíõðîíèçàòîð ôóíêöèîíèðóåò ñëåäóþùèì îáðàçîì: êàæäûé îòñ÷åò âõîäíîãî ñèãíàëà ïîðîæäàåò ñäâèã â ëèíèè çàäåðæêè, ïîñëå ÷åãî âû÷èñëÿþòñÿ ñóììû êàæäûõ M ïîäðÿä èäóùèõ îòñ÷åòîâ, îïðåäåëÿþòñÿ èõ ìîäóëè è ïðîèçâîäèòñÿ óñðåäíåíèå ðåçóëüòàòîâ ïî N ñóììàì (ñèìâîëàì). Åñëè â êàêîé-òî ìîìåíò âðåìåíè êàæäîå ñóììèðîâàíèå (ïî M îòñ÷åòàì) áóäåò ïðîèçâîäèòüñÿ âíóòðè îäíîãî ñèìâîëà, çíà÷åíèå óñðåäíåííîãî ñèãíàëà áóäåò ìàêñèìàëüíûì, íà âûõîäå ïîðîãîâîãî óñòðîéñòâà
input
sign ()
&
symb 0
&
symb – 1
&
symb – N
mod () sign () mod ()
sign () mod ()
AL7169+
sync
Ðèñ. 7.9. Ñòðóêòóðíàÿ ñõåìà ñèíõðîíèçàòîðà
497
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ ïîÿâèòñÿ ñèíõðîèìïóëüñ, è â ýòîò æå ìîìåíò áóäóò ñ÷èòàíû çíàêè íàêîïëåííûõ ñóìì, ñ âûñîêîé âåðîÿòíîñòüþ ñîâïàäàþùèå ñ ïîëÿðíîñòÿìè ñèìâîëîâ. K ïðåèìóùåñòâàì ïðåäëàãàåìîãî àëãîðèòìà ñëåäóåò îòíåñòè: âûñîêóþ ýôôåêòèâíîñòü (óñòîé÷èâîñòü ê ïîìåõàì, ê óõîäó ÷àñòîòû ñëåäîâàíèÿ ñèìâîëîâ îò íîìèíàëüíîé, ê ñíèæåíèþ ÷àñòîòû äèñêðåòèçàöèè è äð.); ñïîñîáíîñòü òî÷íî âîññòàíàâëèâàòü ìîìåíòû ñìåíû ñèìâîëîâ âî âõîäíîì ñèãíàëå ïðè äëèííûõ (äî N 1) âêëþ÷èòåëüíî) ñåðèÿõ «íóëåé» è «åäèíèö», ïðè÷åì â êîíöå ñåðèè îòñóòñòâóåò ïåðåõîäíûé ïðîöåññ (íàïðàâëåííûé íà óñòðàíåíèå íàêîïëåííîé îøèáêè), ÷òî õàðàêòåðíî äëÿ àíàëîãîâûõ óñòðîéñòâ; íàëè÷èå íà âûõîäå äåìîäóëÿòîðà îäíîâðåìåííî N ïîäðÿä èäóùèõ ñèìâîëîâ, ÷òî ìîæåò áûòü âàæíî ïðè êîððåëÿöèîííîé îáðàáîòêå ïîòîêà äàííûõ (íàïðèìåð, ïðè ïîèñêå ñèíõðîïîñûëîê); ïðîñòîòó îïåðàöèé (ñóììèðîâàíèå, ñäâèã) è õîðîøóþ àäàïòàöèþ ê ðåàëèçàöèè íà áàçå ÏËÈÑ, ÷òî íå õàðàêòåðíî äëÿ áîëüøèíñòâà òðàäèöèîííûõ àëãîðèòìîâ, ñîäåðæàùèõ ïåòëè îáðàòíîé ñâÿçè (ñèíõðîíèçàòîð ñ çàïàçäûâàþùèì è îïåðåæàþùèì ñòðîáèðîâàíèåì è äð.). Ðåàëèçàöèÿ öèôðîâîé ÷àñòè àëãîðèòìà äåìîäóëÿöèè è âûäåëåíèÿ ñèíõðîèìïóëüñà áûëà âûïîëíåíà íà êðèñòàëëå ôèðìû «Altera» FLEX10K50. Ðåàëèçîâàííîå óñòðîéñòâî ñîñòîèò èç âõîäíûõ öèôðîâûõ KÈÕ-ôèëüòðîâ ñ âîñåìüþ îòâîäàìè, íåïîñðåäñòâåííî áëîêà äåìîäóëÿöèè ñèãíàëà è áëîêà ñèíõðîíèçàòîðà. Äëÿ ðåàëèçàöèè âõîäíûõ KÈÕ-ôèëüòðîâ áûë èñïîëüçîâàí ïàêåò Altera DSP Design Kit. Äàííûé ïàêåò áûë âûáðàí ââèäó òîãî, ÷òî îí ïîçâîëÿåò ïî ðàññ÷èòàííûì êîýôôèöèåíòàì öèôðîâîãî ôèëüòðà áûñòðî ïîëó÷èòü AHDL-îïèñàíèå óñòðîéñòâà ñ äàííûìè õàðàêòåðèñòèêàìè è ìàêñèìàëüíî äîñòóïíîé òî÷íîñòüþ ïðè çàäàííûõ çíà÷åíèÿõ òî÷íîñòè âõîäíûõ äàííûõ è âíóòðåííåãî ïðåäñòàâëåíèÿ êîýôôèöèåíòîâ ôèëüòðàöèè. Äëÿ ýòîãî èñõîäíûå êîýôôèöèåíòû ôèëüòðà ìàñøòàáèðóþòñÿ, ÷òî ïðèâîäèò ê òîìó, ÷òî âûõîäíîé ñèãíàë ôèëüòðà òàêæå ÿâëÿåòñÿ ïðîìàñøòàáèðîâàííûì íà òó æå âåëè÷èíó, êîòîðóþ â áîëüøèíñòâå ñëó÷àåâ íåîáõîäèìî ó÷èòûâàòü ïðè äàëüíåéøèõ âû÷èñëåíèÿõ. Îäíàêî äëÿ äàííîé çàäà÷è ýòî íå ÿâëÿåòñÿ ñóùåñòâåííûì, è ìàñøòàáèðóþùèé ìíîæèòåëü íå ó÷èòûâàëñÿ â ïîñëåäóþùèõ îïåðàöèÿõ. Kðîìå òîãî, Altera DSP Design Kit ïîçâîëÿåò ñãåíåðèðîâàòü âåêòîðíûé ôàéë äëÿ ìîäåëèðîâàíèÿ ðàáîòû ôèëüòðà, à òàêæå ïîçâîëÿåò ïðåîáðàçîâàòü âûõîäíûå äàííûå îòêëèêà ôèëüòðà ê ìàñøòàáó âõîäíûõ äàííûõ è ïîñòðîèòü ãðàôèê îòêëèêà ôèëüòðà íà âõîäíîå âîçäåéñòâèå.
498
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Ðåàëèçîâàííûé âîñüìèîòâîäíûé ôèëüòð èìååò ñèììåòðè÷íóþ õàðàêòåðèñòèêó.  îòëè÷èå îò êëàññè÷åñêîé ðåàëèçàöèè KÈÕ-ôèëüòðîâ â âèäå íàáîðà óìíîæèòåëåé äëÿ âçâåøèâàíèÿ çàäåðæàííûõ îòñ÷åòîâ âõîäíîãî ñèãíàëà è âûõîäíîãî ñóììàòîðà äàííàÿ ðåàëèçàöèÿ âîîáùå íå ñîäåðæèò óìíîæèòåëåé. Âñå îïåðàöèè óìíîæåíèÿ çàìåíåíû îïåðàöèÿìè ðàñïðåäåëåííîé àðèôìåòèêè, ÷òî âîçìîæíî áëàãîäàðÿ ïîñòîÿíñòâó êîýôôèöèåíòîâ ôèëüòðàöèè è íàëè÷èþ â ëîãè÷åñêèõ ýëåìåíòàõ FLEX10K òàáëèö ïåðåêîäèðîâêè. Ñèãíàëû ñ âûõîäîâ ôèëüòðîâ (âîñåìü áèò â äîïîëíèòåëüíîì êîäå) ïîäàþòñÿ íà êâàäðàòóðíûå âõîäû áëîêà ÷àñòîòíîé äåìîäóëÿöèè. Äëÿ ðåàëèçàöèè äåìîäóëÿòîðà ×Ìí-ñèãíàëîâ ïîíàäîáèëèñü äâà ðåãèñòðà äëÿ õðàíåíèÿ çíà÷åíèé êâàäðàòóð â ïðåäûäóùèé (k-é) ìîìåíò âðåìåíè Sk è Ck, äâà óìíîæèòåëÿ è îäèí ñóììàòîð. Âñå âû÷èñëåíèÿ â ñõåìå ïðîèçâîäÿòñÿ â äîïîëíèòåëüíîì êîäå, çà èñêëþ÷åíèåì óìíîæèòåëåé, îïåðàíäû è âûõîäíûå äàííûå êîòîðûõ ïðåäñòàâëåíû â ïðÿìîì êîäå ñî çíàêîì, ÷òî òðåáóåò ïðåäâàðèòåëüíî ïðåîáðàçîâûâàòü ñèãíàëû â äîïîëíèòåëüíûé êîä äî óìíîæåíèÿ è êîíâåðòèðîâàòü â äîïîëíèòåëüíûé êîä ðåçóëüòàò óìíîæåíèÿ. Âûõîäíîé ñèãíàë äåìîäóëÿòîðà èìååò ðàçðÿäíîñòü, ðàâíóþ ïÿòíàäöàòè áèòàì, îäíàêî äëÿ âûäåëåíèÿ ñèìâîëîâ íóæíî ðàññìàòðèâàòü òîëüêî ñòàðøèé (çíàêîâûé) ðàçðÿä ðåçóëüòàòà. Âõîäíûì ñèãíàëîì ñèíõðîíèçàòîðà ÿâëÿåòñÿ âûõîä áëîêà äåìîäóëÿòîðà. Çàìåòèì, ÷òî äëÿ ðåàëèçàöèè ñóììèðîâàíèÿ âèäà: sumi = yk + yk1 + yk2 +
+ ykn+1
(6)
íåöåëåñîîáðàçíî èñïîëüçîâàòü êàñêàä èç n äâóõâõîäîâûõ ñóììàòîðîâ, òàê êàê íà êàæäîì òàêòå ðåçóëüòàò ýòîãî ñóììèðîâàíèÿ ìîæåò áûòü ïîëó÷åí èç çíà÷åíèÿ ñóììû íà ïðåäûäóùåì òàêòå ïóòåì âû÷èòàíèÿ ykn1 è ïðèáàâëåíèÿ. À èìåííî: sumi+1 = sumi + yk+1 ykn1. Òàêèì îáðàçîì, äëÿ ðåàëèçàöèè ýòîé ÷àñòè àëãîðèòìà ñèíõðîíèçàöèè ïîíàäîáèòñÿ îäèí ðåãèñòð äëÿ õðàíåíèÿ çíà÷åíèÿ ñóììû íà ïðåäûäóùåì òàêòå è òðè ñóììàòîðà, îäèí èç êîòîðûõ èñïîëüçóåòñÿ äëÿ èçìåíåíèÿ çíàêà çíà÷åíèÿ ykn1 (òàê êàê âñå ÷èñëà ïðåäñòàâëåíû â äîïîëíèòåëüíîì êîäå). Kðîìå òîãî, íåîáõîäèìû ðåãèñòðû äëÿ õðàíåíèÿ çíà÷åíèé yk, yk1, ykn+1. Åñëè æå íå ó÷èòûâàòü ýòè n ðåãèñòðîâ, òî êîëè÷åñòâî ýëåìåíòîâ äëÿ âûïîëíåíèÿ òàêîé îïåðàöèè ñóììèðîâàíèÿ íå áóäåò çàâèñåòü îò ÷èñëà îïåðàíäîâ è ïîçâîëèò ñýêîíîìèòü ÿ÷åéêè ÏËÈÑ ïðè êîëè÷åñòâå ñëàãàåìûõ â ñóììå n>4.  äàííîì æå ñëó÷àå êîëè÷åñòâî ñëàãàåìûõ â êàæäîé ñóììå ðàâíî êîëè÷åñòâó îòñ÷åòîâ ñèãíàëà, ïðèõîäÿùèõñÿ íà ñèìâîë, ò.å., n = 8, è ýôôåêò â óâåëè÷åíèè ñêîðîñòè, à ãëàâíîå, â óìåíüøåíèè çàíèìàåìîãî ìåñòà îùóòèì.
499
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Áûë ðåàëèçîâàí áëîê ñóììèðîâàíèÿ, âûõîäíûìè ñèãíàëàìè êîòîðîãî ÿâëÿëèñü êàê çíà÷åíèå ñóììû, òàê è çíà÷åíèå, äëÿ óäîáñòâà ïîñëåäîâàòåëüíîãî ñîåäèíåíèÿ òàêèõ áëîêîâ ïî âõîäàì, ÷òî íåîáõîäèìî ââèäó òîãî, ÷òî âûõîäÿùåå èç îäíîé ñóììû ñëàãàåìîå ñòàíîâèòñÿ ñëàãàåìûì ñëåäóþùåé ñóììû: Xk = lnch(sumi) + lnch(sumi+1) + lnch(sumi+m1).
(7)
AL7170
Òàê êàê ñèíõðîíèçàòîð ðàáîòàåò ïî ïðèíöèïó ìàêñèìóìà ïðàâäîïîäîáèÿ, òî ñõåìà äîëæíà âûñòàâëÿòü ñèíõðîèìïóëüñ â ìîìåíò äîñòèæåíèÿ âûõîäíûì ñèãíàëîì ìàêñèìóìà. Äëÿ îïðåäåëåíèÿ ìîìåíòà íàñòóïëåíèÿ ëîêàëüíûõ ìàêñèìóìîâ ýòîò ñèãíàë äèôôåðåíöèðóåòñÿ, è îïðåäåëÿþòñÿ ìîìåíòû ñìåíû çíàêà ïðîäèôôåðåíöèðîâàííîãî ñèãíàëà. Ðåçóëüòàòû ìîäåëèðîâàíèÿ â ñèñòåìå MAX+PLUS II ïðèâåäåíû íà Ðèñ. 7.10.
Ðèñ. 7.10. Ðåçóëüòàòû ìîäåëèðîâàíèÿ â ñèñòåìå MAX+PLUS II
 çàêëþ÷åíèå îòìåòèì, ÷òî âñå óçëû ñèñòåìû áûëè ðåàëèçîâàíû â âèäå ïàðàìåòðèçîâàííûõ ìåãàôóíêöèé ñ èñïîëüçîâàíèåì ÿçûêà îïèñàíèÿ àïïàðàòóðû AHDL, ÷òî ïîçâîëÿåò ñ ëåãêîñòüþ èñïîëüçîâàòü èõ äëÿ ïðèëîæåíèé, òðåáóþùèõ äðóãîé òî÷íîñòè âû÷èñëåíèé.
7.4. Ðåàëèçàöèÿ ãåíåðàòîðà ÏÑÏ íà ÏËÈÑ Ãåíåðàòîð ôîðìèðîâàíèÿ Ì-ïîñëåäîâàòåëüíîñòåé áûë íàïèñàí â âèäå ïàðàìåòðèçîâàííîé ìàêðîôóíêöèè, îïèñûâàþùåé óñòðîéñòâî, óïðîùåííàÿ ñòðóêòóðà êîòîðîãî ïîêàçàíà íà Ðèñ. 7.11. Ïàðàìåòðàìè ìàêðîôóíêöèè ÿâëÿþòñÿ äëèíà õàðàêòåðèñòè÷åñêîãî ìíîãî÷ëåíà è ÷èñëî, îïèñûâàþùåå íà÷àëüíûå ñîñòîÿíèÿ òðèããåðîâ. Íèæå ïðèâîäèòñÿ ëèñòèíã îïèñàíèÿ ýòîé ôóíêöèè íà AHDL.
500
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
D
Q
> CLK CE Q
D
Q
> CLK CE Q
D
Q
> CLK CE Q
D
Q
OUT
> CLK CE Q
GENA CLOCK
& M(M_WIDTHj1)
&
M(2)
&
M(0)
AL7171+
&
M(1)
Ðèñ. 7.11. Ñòðóêòóðíàÿ ñõåìà ãåíåðàòîðà ôîðìèðîâàíèÿ Ì-ïîñëåäîâàòåëüíîñòåé
Функция M_GENERATE: Функция M_GENERATE Генерирует Мпоследовательность, заданную характеристическим многочленом М Входы: M GENA CLK LOAD
вход многочлена; рзрешение генерации (default=GND); тактовый вход; вход предустановки (default=GND);
Выходы: OUT
выход Мпоследовательности
Параметры: M_WIDTH M_BEGIN
длина полинома; начальное состояние (default=”100000..00”);
Версия 1.0
501
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ INCLUDE "lpm_xor.inc"; INCLUDE "lpm_constant.inc"; PARAMETERS ( M_WIDTH, M_BEGIN = 0 ); SUBDESIGN m_generate ( M[M_WIDTH1..0] : INPUT CLK : GENA : INPUT LOAD : INPUT OUT : ) VARIABLE dffs[M_WIDTH2..0] : DFFE; — триггеры регистра сдвига shift_node[M_WIDTH2..0]: NODE; xor_node[M_WIDTH2..0] : shiftin, shiftout : — вход и выход регистра сдвига
= GND; INPUT; = GND; = GND; OUTPUT;
NODE; NODE;
IF (USED(M_BEGIN)) GENERATE ac : lpm_constant WITH (LPM_WIDTH LPM_CVALUE = M_BEGIN); END GENERATE;
=
M_WIDTH,
BEGIN ASSERT (M_WIDTH>0) REPORT "Значение параметра M_WIDTH должно быть больше нуля"
502
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ SEVERITY ERROR; % общие выводы триггеров% dffs[].ena = GENA; dffs[].clk = CLK; % асинхронные операции % IF (USED(M_BEGIN)) GENERATE dffs[].clrn = !load # ac.result[M_WIDTH2..0]; установка начального состояния dffs[].prn = !load # !ac.result[M_WIDTH2..0]; триггеров, заданное M_BEGIN ELSE GENERATE dffs[M_WIDTH3..0].clrn = !load; установка начального состояния dffs[M_WIDTH2].prn = !load; триггеров "10000..00 END GENERATE; % обратные связи % xor_node[] = dffs[] & M[M_WIDTH2..0]; shiftin = lpm_xor(xor_node[]) WITH (LPM_SIZE = M_WIDTH1, LPM_WIDTH=1);
%– операции сдвига % shift_node[] = (shiftin, dffs[M_WIDTH2..1]); shiftout = dffs[0]; %синхронные операции % dffs[].d = !load & shift_node[]; %подключим выход % OUT = shiftout; END;
503
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Îïèñàíèå ôóíêöèè:
Âõîäû: øèíà (ãðóïïà âûâîäîâ) ñ ðàçìåðîì M_WIDTH. Íà ýòîò âõîä ïîäàþòñÿ êîýôôèöèåíòû õàðàêòåðèñòè÷åñêîãî ìíîãî÷ëåíà; CLK âõîä òàêòîâîãî ñèãíàëà; GENA âõîä ðàçðåøåíèÿ ãåíåðàöèè. Ïðè GENA = «0» ãåíåðàöèÿ Ì-ïîñëåäîâàòåëüíîñòè çàïðåùåíà; LOAD âõîä ïðåäóñòàíîâêè. Ïðè LOAD = «1» òðèããåðû ðåãèñòðà ñäâèãà óñòàíàâëèâàþòñÿ â ñîñòîÿíèå, îïðåäåëÿåìîå ïàðàìåòðîì M_BEGIN. Âûõîäû: OUT âûõîä Ì-ïîñëåäîâàòåëüíîñòè. Ì
Äëÿ âêëþ÷åíèÿ äàííîé ôóíêöèè â äðóãèå ñõåìû áûëè òàêæå ñîçäàíû âêëþ÷àåìûé ôàéë, ñîäåðæàùèé îïèñàíèå, è ãðàôè÷åñêèé ñèìâîë-ýëåìåíò (ñì. Ðèñ. 7.12).
M
M
OUT
GENA
GENA
LOAD
LOAD
CLK
M_WIDTH = M_BEGIN =
CLK
OUT
AL7172+
m_generate
Ðèñ. 7.12. Ãðàôè÷åñêèé ñèìâîë-ýëåìåíò
Ôàéë «M_GENERATE.INC»: FUNCTION m_generate (m[(m_width) (1)..0], clk, gena, load) WITH (M_WIDTH, M_BEGIN) RETURNS (out); Äëÿ ìîäåëèðîâàíèÿ ðàáîòû ãåíåðàòîðà â ãðàôè÷åñêîì ðåäàêòîðå ïàêåòà MAX+PLUS II áûëà ñîçäàíà òåñòîâàÿ ñõåìà, ïîêàçàííàÿ íà Ðèñ. 7.13. Ðåçóëüòàòû ìîäåëèðîâàíèÿ ïîêàçàíû íà Ðèñ. 7.14 (íà âõîä îäíîãî ãåíåðàòîðà ïîäàí õàðàêòåðèñòè÷åñêèé ìíîãî÷ëåí Ì1 = 11001, íà âõîä äðóãîãî Ì2 = 10010000001).
504
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ M_BEGIN = M_WIDTH = 5 m_generate 3
M(4..0)
2
enable
9
load
4
clock
INPUT VCC INPUT VCC INPUT VCC INPUT VCC
M(4..0) M enable
GENA
load
LOAD
clock
OUT
OUTPUT 6
out
CLK M_BEGIN = M_WIDTH = 11
7 m_generate INPUT VCC
M2(10..0) M enable
GENA
load
LOAD
clock
OUT
OUTPUT 10
out 2
CLK 8
AL7173+
12 M2(10..0)
AL7174
Ðèñ. 7.13. Òåñòîâàÿ ñõåìà â ãðàôè÷åñêîì ðåäàêòîðå ïàêåòà MAX+PLUS II
Ðèñ. 7.14. Ðåçóëüòàòû ìîäåëèðîâàíèÿ
505
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
7.5. Ïðèìåðû îïèñàíèÿ öèôðîâûõ ñõåì íà VHDL Ðàññìîòðèì íåêîòîðûå ïðèìåðû îïèñàíèÿ öèôðîâûõ ñõåì íà VHDL. Ïðèìåðîì îïèñàíèÿ öèôðîâîãî àâòîìàòà ÿâëÿåòñÿ ïðåîáðàçîâàòåëü ïàðàëëåëüíîãî êîäà â ïîñëåäîâàòåëüíûé. Ïðåîáðàçîâàòåëü êîäà ïðåäñòàâëÿåò ñîáîé óñòðîéñòâî, íà âõîä êîòîðîãî ïîäàþòñÿ n-ðàçðÿäíîå ÷èñëî â ïàðàëëåëüíîì êîäå d, ñèãíàë çàãðóçêè load è ñèíõðîèìïóëüñû clk. Ïî ñèãíàëó çàãðóçêè ïðîèñõîäèò çàïèñü âõîäíîãî ñëîâà âî âíóòðåííèé ðåãèñòð è ïîñëåäîâàòåëüíàÿ âûäà÷à â òå÷åíèå n òàêòîâ ýòîãî âõîäíîãî ñëîâà â ïîñëåäîâàòåëüíîì êîäå íà âûõîäå î ñèíõðîèìïóëüñàìè oclk. Ïîñëå îêîí÷àíèÿ ïðåîáðàçîâàíèÿ íà âûõîäå e ïîÿâëÿåòñÿ ÂÛÑÎKÈÉ óðîâåíü ñèãíàëà â òå÷åíèå îäíîãî òàêòà. Òàêîãî ðîäà ïðåîáðàçîâàòåëè êîäà ÷àñòî èñïîëüçóþòñÿ äëÿ óïðàâëåíèÿ ñèíòåçàòîðàìè ÷àñòîò 1104ÏË1 è èì ïîäîáíûìè. Îïèñàíèå ýòîãî óñòðîéñòâà íà ÿçûêå VHDL ïðèâåäåíî íèæå. library ieee; use ieee.std_logic_1164.all; entity Serial is port ( clk : in STD_LOGIC; load : in STD_LOGIC; reset: in STD_LOGIC; d : in STD_LOGIC_vector (3 downto 0); oclk : out STD_LOGIC; o : out STD_LOGIC; e : out STD_LOGIC ); end; architecture behavioral of Serial is type t1 is range 0 to 4; signal s : STD_LOGIC_vector (2 downto 0); signal i : t1; begin process (clk)
506
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ begin if reset = '1' then i <= 0; else if (clk’event and clk='1') then if (i = 0 and load = '1') then s(2 downto 0) <= d(3 downto 1); o <= d(0); i <= 4; end if; if (i > 1) then o <= s(0); s(1 downto 0) <= s(2 downto 1); i <= i 1; end if; if (i = 1) then e <= '1'; i <= 0; else e <= '0'; end if; end if; end if; if i>0 then oclk <= not clk; else oclk <= '0'; end if; end process; end behavioral; Ïî ïåðåäíåìó ôðîíòó ñèíõðîèìïóëüñà clk ïðè ÂÛÑÎÊÎÌ óðîâíå íà âõîäå çàãðóçêè ïðîèñõîäèò çàãðóçêà òðåõ ñòàðøèõ ðàçðÿäîâ âõîäíîãî ñëîâà d[3..1] âî âðåìåííûé ðåãèñòð s[2..0]. Ìëàäøèé ðàçðÿä âõîäíîãî ñëîâà d[0] ïîäàåòñÿ íà âûõîä o. Íà âûõîäå oclk ïîÿâëÿþòñÿ ñèíõðîèìïóëüñû. Íà ñèãíàëå i ñîáðàí âíóòðåííèé ñ÷åò÷èê, âûäàþùèé ñèãíàë îêîí÷àíèÿ ïðåîáðàçîâàíèÿ e. Ïðè ïî-
507
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ ñòóïëåíèè ïîñëåäóþùèõ ñèíõðîèìïóëüñîâ ïðîèñõîäèò âûäà÷à íà âûõîä o îñòàëüíûõ áèò âõîäíîãî ñëîâà, õðàíÿùèõñÿ â ðåãèñòðå s[2..0]. Ìîäåëèðîâàíèå ýòîãî óñòðîéñòâà áûëî ïðîâåäåíî â ñèñòåìå ïðîåêòèðîâàíèÿ OrCAD 9.0. Äëÿ òåñòèðîâàíèÿ ñõåìû èñïîëüçîâàëñÿ òåñò: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity test_serial is end test_serial; architecture testbench of test_serial is component serial port ( clk : in std_logic; load : in std_logic; reset : in std_logic; d : in std_logic_vector(3 downto 0); oclk : out std_logic; o : out std_logic; e : out std_logic ); end component; signal clk : std_logic; signal load : std_logic := ‘0’; signal reset : std_logic; signal d : std_logic_vector(3 downto 0); signal oclk : std_logic; signal o : std_logic; signal e : std_logic; begin process begin for i in 0 to 50 loop clk <= '0'; wait for 5 ns; clk <= '1'; wait for 5 ns; end loop; end process; process begin reset <= '1'; wait for 10 ns; reset <= '0' ;
508
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ load <= '1'; d <= "1010"; wait for 10 ns; load <= '0'; d <= "0000"; wait for 500 ns; end process; dut : serial port map ( clk => clk, load => load, reset => reset, d => d, oclk => oclk, o => o, e => e ); end testbench;
AL7175
Ðåçóëüòàòû ìîäåëèðîâàíèÿ ïðåäñòàâëåíû íà Ðèñ. 7.15.
Ðèñ. 7.15. Ðåçóëüòàòû ìîäåëèðîâàíèÿ
509
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Â êà÷åñòâå ïðèìåðà îïèñàíèÿ óñòðîéñòâà ÖÎÑ ðàññìîòðèì öèôðîâîé KÈÕ-ôèëüòð. Ðàáîòà öèôðîâîãî KÈÕ-ôèëüòðà îïèñûâàåòñÿ ðàçíîñòíûì óðàâíåíèåì: yn = A0xn + A1xn-1 + A2xn-2 +
,
(8)
ãäå yn ðåàêöèÿ ñèñòåìû â ìîìåíò âðåìåíè n; xn âõîäíîå âîçäåéñòâèå; Ai âåñîâîé êîýôôèöèåíò i-é âõîäíîé ïåðåìåííîé. Íà VHDL îïèñàíèå ôèëüòðà èìååò âèä: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity f is port ( din: in std_logic_vector(7 downto 0); sout: out std_logic_vector(15 downto 0); r: in std_logic; c: in std_logic ); end f; architecture behavior of f is constant h00 : std_logic_vector(7 downto "00000000"; constant h01 : std_logic_vector(7 downto "00000001"; constant h02 : std_logic_vector(7 downto "00000100"; constant h03 : std_logic_vector(7 downto "00001111"; constant h04 : std_logic_vector(7 downto "00100100"; constant h05 : std_logic_vector(7 downto "01000010"; constant h06 : std_logic_vector(7 downto "01100100"; constant h07 : std_logic_vector(7 downto
510
0)
:=
0)
:=
0)
:=
0)
:=
0)
:=
0)
:=
0)
:=
0)
:=
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ "01111100"; constant "01111111"; constant "01101010"; constant "01000010"; constant "00010011"; constant "11101100"; constant "11010110"; constant "11010101"; constant "11100011"; constant "11110111"; constant "00001010"; constant "00010100"; constant "00010011"; constant "00001100"; constant "00000010"; constant "11111000"; constant "11110101";
h08
:
std_logic_vector(7
downto
0)
:=
h09
:
std_logic_vector(7
downto
0)
:=
h10
:
std_logic_vector(7
downto
0)
:=
h11
:
std_logic_vector(7
downto
0)
:=
h12
:
std_logic_vector(7
downto
0)
:=
h13
:
std_logic_vector(7
downto
0)
:=
h14
:
std_logic_vector(7
downto
0)
:=
h15
:
std_logic_vector(7
downto
0)
:=
h16
:
std_logic_vector(7
downto
0)
:=
h17
:
std_logic_vector(7
downto
0)
:=
h18
:
std_logic_vector(7
downto
0)
:=
h19
:
std_logic_vector(7
downto
0)
:=
h20
:
std_logic_vector(7
downto
0)
:=
h21
:
std_logic_vector(7
downto
0)
:=
h22
:
std_logic_vector(7
downto
0)
:=
h23
:
std_logic_vector(7
downto
0)
:=
signal x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23 : std_logic_vector(7 downto 0);
511
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ signal m00, m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12, m13, m14, m15, m16, m17, m18, m19, m20, m21, m22, m23 : std_logic_vector(15 downto 0); begin m00 <= m01 <= m02 <= m03 <= m04 <= m05 <= m06 <= m07 <= m08 <= m09 <= m10 <= m11 <= m12 <= m13 <= m14 <= m15 <= m16 <= m17 <= m18 <= m19 <= m20 <= m21 <= m22 <= m23 <=
(signed(x00)*signed(h00)); (signed(x01)*signed(h01)); (signed(x02)*signed(h02)); (signed(x03)*signed(h03)); (signed(x04)*signed(h04)); (signed(x05)*signed(h05)); (signed(x06)*signed(h06)); (signed(x07)*signed(h07)); (signed(x08)*signed(h08)); (signed(x09)*signed(h09)); (signed(x10)*signed(h10)); (signed(x11)*signed(h11)); (signed(x12)*signed(h12)); (signed(x13)*signed(h13)); (signed(x14)*signed(h14)); (signed(x15)*signed(h15)); (signed(x16)*signed(h16)); (signed(x17)*signed(h17)); (signed(x18)*signed(h18)); (signed(x19)*signed(h19)); (signed(x20)*signed(h20)); (signed(x21)*signed(h21)); (signed(x22)*signed(h22)); (signed(x23)*signed(h23));
sout <=(signed(m00)+signed(m01)+signed(m02) +signed(m03)+signed(m04)+signed(m05) +signed(m06)+signed(m07)+signed(m08) +signed(m09)+signed(m10)+signed(m11) +signed(m12)+signed(m13)+signed(m14) +signed(m15)+signed(m16)+signed(m17) +signed(m18)+signed(m19)+signed(m20)
512
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ +signed(m21)+signed(m22)+signed(m23)); process (c,r) begin if r='1' then x00 <= (others => '0'); x01 <= (others => '0'); x02 <= (others => '0'); x03 <= (others => '0'); x04 <= (others => '0'); x05 <= (others => '0'); x06 <= (others => '0'); x07 <= (others => '0'); x08 <= (others => '0'); x09 <= (others => '0'); x10 <= (others => '0'); x11 <= (others => '0'); x12 <= (others => '0'); x13 <= (others => '0'); x14 <= (others => '0'); x15 <= (others => '0'); x16 <= (others => '0'); x17 <= (others => '0'); x18 <= (others => '0'); x19 <= (others => '0'); x20 <= (others => '0'); x21 <= (others => '0'); x22 <= (others => '0'); x23 <= (others => '0'); elsif (c'event and c='1') then x00(7 downto 0) <= din(7 x01(7 downto 0) <= x00(7 x02(7 downto 0) <= x01(7 x03(7 downto 0) <= x02(7 x04(7 downto 0) <= x03(7 x05(7 downto 0) <= x04(7 x06(7 downto 0) <= x05(7 x07(7 downto 0) <= x06(7
513
downto downto downto downto downto downto downto downto
0); 0); 0); 0); 0); 0); 0); 0);
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ x08(7 downto x09(7 downto x10(7 downto x11(7 downto x12(7 downto x13(7 downto x14(7 downto x15(7 downto x16(7 downto x17(7 downto x18(7 downto x19(7 downto x20(7 downto x21(7 downto x22(7 downto x23(7 downto end if; end process; end behavior;
0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0) 0)
<= <= <= <= <= <= <= <= <= <= <= <= <= <= <= <=
x07(7 x08(7 x09(7 x10(7 x11(7 x12(7 x13(7 x14(7 x15(7 x16(7 x17(7 x18(7 x19(7 x20(7 x21(7 x22(7
downto downto downto downto downto downto downto downto downto downto downto downto downto downto downto downto
0); 0); 0); 0); 0); 0); 0); 0); 0); 0); 0); 0); 0); 0); 0); 0);
Âõîäíûå äàííûå ñ÷èòûâàþòñÿ ñ âõîäà din[7..0] â äîïîëíèòåëüíîì êîäå ïî ïåðåäíåìó ôðîíòó ñèíõðîñèãíàëà c. Íà ñèãíàëàõ x0 ÷ x23 ïîñòðîåí ñäâèãîâûé ðåãèñòð, îáåñïå÷èâàþùèé çàäåðæêó äàííûõ íà 24 òàêòà. Ñèãíàëû ñ ðåãèñòðîâ óìíîæàþòñÿ íà âåñîâûå êîýôôèöèåíòû h0 ÷ h23 è ñóììèðóþòñÿ. Äëÿ òåñòèðîâàíèÿ ñõåìû èñïîëüçîâàí òåñò: — Test bench shell library ieee; use ieee.std_logic_1164.all; entity test_f is end test_f; architecture testbench of test_f is component f port (
514
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ din : in std_logic_vector(7 downto 0); sout : out std_logic_vector(15 downto 0); r : in std_logic; c : in std_logic ); end component; signal din : std_logic_vector(7 downto 0); signal sout : std_logic_vector(15 downto 0); signal r : std_logic; signal c : std_logic; begin process begin for i in 0 to 50 loop c <= '0'; wait for 5 ns; c <= '1'; wait for 5 ns; end loop; end process; process begin r <= '1'; wait for 10 ns; r <= '0' ; din <= "00000001"; wait for 10 ns; din <= "00000000"; wait for 500 ns; end process; dut :
f port map ( din => din, sout => sout, r => r, c => c );
end testbench; Òåñò ìîäåëèðóåò ïîäà÷ó íà öèôðîâîé ôèëüòð àíàëîãà δ-ôóíêöèè. Íà âûõîäå ôèëüòðà åãî èìïóëüñíàÿ õàðàêòåðèñòèêà. Ðåçóëüòàòû ìîäåëèðîâàíèÿ ïðåäñòàâëåíû íà Ðèñ. 7.16.
515
AL7176
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
Ðèñ. 7.16. Ðåçóëüòàòû ìîäåëèðîâàíèÿ
7.6. Ðåàëèçàöèÿ íåéðîíà íà AHDL Ðàññìîòðèì ðåàëèçàöèþ íà ÿçûêå îïèñàíèÿ àïïàðàòóðû ñòðóêòóðû òðåõâõîäîâîãî (êîëè÷åñòâî âõîäîâ ëåãêî âàðüèðóåòñÿ) íåéðîíà ñ ëîãèñòè÷åñêîé ôóíêöèåé àêòèâàöèè (òàêæå ìîæåò âàðüèðîâàòüñÿ). Âåñîâûå êîýôôèöèåíòû ÿâëÿþòñÿ ïåðåìåííûìè, çàäàâàåìûìè ïîëüçîâàòåëåì. Âõîäíûå âåëè÷èíû (êàê âõîäû, òàê è âåñà) ïðåäñòàâëåíû øåñòíàäöàòèðàçðÿäíûì êîäîì: X .1 XXXXXXXXXX XXXXX { 4444244 44 3 Çíàê
Ìàíòèñcà
Ïðè îáðàáîòêå äàííûõ øåñòíàäöàòèðàçðÿäíûé êîä ïðåîáðàçóåòñÿ ê äâåíàäöàòèðàçðÿäíîìó êîäó âèäà: X .1 XXXXXXX XXXX { 4243. 1 23
Çíàê
Ìàíòèñcà
Ïîêàçàòåëüíàÿ ÷àñòü
Ýòà îïåðàöèÿ ñíèæàåò òî÷íîñòü, íî îáåñïå÷èâàåò îáðàáîòêó äàííûõ, èìåþùèõ áîëåå øèðîêèé äèíàìè÷åñêèé äèàïàçîí:
516
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ îò 1.1111111.1111 = 4161536ä äî 0.1111111.1111 = 4161536ä Äåéñòâèÿ ïðîèçâîäÿòñÿ òîëüêî ñ öåëûìè ÷èñëàìè. Çíà÷åíèÿ âåñîâ è âõîäîâ ïðåîáðàçóåì ê öåëîìó ÷èñëó è îêðóãëÿåì, íàïðèìåð ÷èñëî 7.2341 ìîæåò áûòü ïðåäñòàâëåíî ÷èñëîì 72341.  ýòîì ñëó÷àå âî âñåõ îñòàëüíûõ çíà÷åíèÿõ âõîäîâ è âåñîâ çàïÿòàÿ äîëæíà áûòü ïåðåäâèíóòà íà 4 çíàêà âïðàâî (äëÿ äåñÿòè÷íîãî ÷èñëà). Ìîäåëü íåéðîíà îïèñûâàåòñÿ â âèäå îñíîâíîãî òåëà ïðîãðàììû, ê êîòîðîìó ïîäêëþ÷àåòñÿ íàáîð ïðîöåäóð, âûïîëíÿþùèõ îñíîâíûå äåéñòâèÿ. Ñîîòâåòñòâóþùèå ðàñïå÷àòêè òåêñòîâ íàõîäÿòñÿ â ïóíêòå ïðèëîæåíèÿ. Ðàññìîòðèì íàçíà÷åíèå ïîäêëþ÷àåìûõ ïðîöåäóð: FUNCTION mult_nrn (xx[7..0], yy[7..0], a[6..0], b[6..0], clk) RETURNS (p[14..0]); FUNCTION sum8 (a[7..0], b[7..0], clk, cin) RETURNS (sum[7..0], crr); FUNCTION norm8 (a[16..1]) RETURNS (s[12..1]); FUNCTION sum4 (a[3..0], b[3..0], clk, cin) RETURNS (sum[3..0]); FUNCTION norm_sum (a[12..1], b[12..1], clk) RETURNS (as[12..1], bs[12..1]); FUNCTION dop_kod (xx[7..0], clk) RETURNS (yy[7..0]); FUNCTION perep (clk, xxa[11..6], xxb[4..1]) RETURNS (yy[11..1]); FUNCTION sigm (net[12..1]) RETURNS (out[16..1]); . mult_nrn ïðåäñòàâëÿåò ñîáîé 8-ðàçðÿäíûé óìíîæèòåëü]: 7 ðàçðÿäîâ äàííûõ, 1 ðàçðÿä çíàêîâûé. sum8 8-ðàçðÿäíûé ñóììàòîð. norm8 âûïîëíÿåò íîðìàëèçàöèþ 16-ðàçðÿäíîãî ÷èñëà ê 12-ðàçðÿäíîìó. Ïðè ýòîì â 7 çíà÷àùèõ ðàçðÿäàõ ñòàðøèé ðàçðÿä îáÿçàòåëüíî çíàêîâûé. sum4 4-ðàçðÿäíûé ñóììàòîð. norm_sum èñïîëüçóåòñÿ ïðè íåîáõîäèìîñòè ñëîæåíèÿ ÷èñåë ñ îòëè÷àþùåéñÿ ïîêàçàòåëüíîé ÷àñòüþ. Äàííàÿ ôóíêöèÿ ïðèâîäèò ìëàäøåå ïî ìîäóëþ èç ýòèõ ÷èñåë ê ïîêàçàòåëüíîé ÷àñòè ñòàðøåãî ÷èñëà. dop_kod ïðåîáðàçóåò 8-ðàçðÿäíîå ÷èñëî èç ïðÿìîãî êîäà â îáðàòíûé è èç îáðàòíîãî â ïðÿìîé. Ïðè ýòîì, åñëè âõîäíûå äàííûå íàõîäÿòñÿ â äîïîëíèòåëüíîì êîäå (÷òî ñîîòâåòñòâóåò ÷èñëó 0 â âîñüìîì ðàçðÿäå), òî ïåðåâîä îñóùåñòâëÿåòñÿ â ïðÿìîé êîä, è íàîáîðîò. perep ôóíêöèÿ, íåîáõîäèìàÿ ïðè ïåðåïîëíåíèè ðàçðÿäíîé ñåòêè ïðè âûïîëíåíèè äåéñòâèÿ ôóíêöèåé sum8. Ïðè ýòîì ïîëó÷àåì åäèíè÷íûé ðàç-
517
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ ðÿä â ïåðåìåííîé crr. Ðàññìàòðèâàåìàÿ ôóíêöèÿ îñóùåñòâëÿåò ñäâèã íà ðàçðÿä âïðàâî çíà÷àùåé ÷àñòè è ïðèáàâëåíèå åäèíèöû ê ïîêàçàòåëüíîé. sigm ëîãèñòè÷åñêàÿ ôóíêöèÿ. Ïðåäñòàâëÿåò ôóíêöèþ àêòèâàöèè íåéðîíà â âèäå ñèãìîèäû out = 2/(1+exp(0.07net)) 1. Ñèãìîèäà ñæàòà â ïðåäåëàõ net = (142;142), out = int([0,1)*10000). Íà âõîä ïîäàåòñÿ íîðìàëèçîâàííîå ÷èñëî ê âèäó: 12 ðàçðÿä çíàêîâûé (+1, 0); 115 ðàçðÿä ìàíòèññà (åñëè ýêñïîíåíöèàëüíàÿ ÷àñòü íå íóëåâàÿ, òî 11 ðàçðÿä = VCC); 41 ðàçðÿä ýêñïîíåíöèàëüíàÿ ÷àñòü. Íà âûõîäå èìååì ÷èñëî âèäà: 16 ðàçðÿä çíàêîâûé (+1, 0); 151 ðàçðÿä ìàíòèññà. Ïðèâåäåì ôóíêöèè, èñïîëüçóåìûå â ïîäïðîãðàììàõ: FUNCTION mult16b (xx, yy, a, b) RETURNS (s, c); FUNCTION dop_kod1 (xx[3..0], clk) RETURNS (yy[3..0]); . mult16b çàäåéñòâóåò ïðîöåäóðó MULT1B. ßâëÿåòñÿ áàçîâûì îäíîðàçðÿäíûì óìíîæèòåëåì, íà êîòîðîì ïðîèñõîäèò ïîñòðîåíèå óìíîæèòåëåé áîëüøåé ðàçìåðíîñòè. dop_kod1 àíàëîã ôóíêöèè dop_kod, íî äëÿ 4-ðàçðÿäíûõ ÷èñåë (èñïîëüçóåòñÿ äëÿ ïîêàçàòåëüíîé ÷àñòè). Íèæå ïðèâîäèòñÿ òåêñò îñíîâíîé ïðîãðàììû NEIRON. FUNCTION mult_nrn (xx[7..0], yy[7..0], a[6..0], b[6..0], clk) RETURNS (p[14..0]); FUNCTION sum8 (a[7..0], b[7..0], clk, cin) RETURNS (sum[7..0], crr); FUNCTION norm8 (a[16..1]) RETURNS (s[12..1]); FUNCTION sum4 (a[3..0], b[3..0], clk, cin) RETURNS (sum[3..0]); FUNCTION norm_sum (a[12..1], b[12..1], clk) RETURNS (as[12..1], bs[12..1]); FUNCTION dop_kod (xx[7..0], clk) RETURNS (yy[7..0]); FUNCTION perep (clk, xxa[11..6], xxb[4..1]) RETURNS (yy[11..1]); FUNCTION sigm (net[12..1]) RETURNS (out[16..1]); SUBDESIGN neiron_ %Последние разряды в процедурах умножения во вход ных переменных и в ответе являются знаковыми%
518
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %Реализуется трехвходовый однослойный нейрон% ( clk:INPUT; n[3..0]:INPUT;%Число входов нейрона 2…10% w[16..1]:INPUT;%Веса% ww[16..1]:INPUT; www[16..1]:INPUT; x_[16..1]:INPUT;%Входы% xx[16..1]:INPUT; xxx[16..1]:INPUT; z[12..1]:OUTPUT;%Выход% zz[16..1]:OUTPUT; %Тестовые выходы% o[12..1]:OUTPUT;%Умножение% oo[12..1]:OUTPUT; ooo[12..1]:OUTPUT; jas[12..1]:OUTPUT;%Выравнивание перед сложением% jbs[12..1]:OUTPUT; jjas[12..1]:OUTPUT; jjbs[12..1]:OUTPUT; f[12..1]:OUTPUT;%Проверка суммы% f_[11..5]:OUTPUT; %Проверка суммы (без переноса)% ka[12..5]:OUTPUT;%Переменные для проверки работы с доп. кодом и вычитания с ним% kb[11..5]:OUTPUT; kabs[12..5]:OUTPUT; ) VARIABLE rx[3..1]:norm8;%Переменные нормализации входов%
519
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ rw[3..1]:norm8;%Переменные нормализации весов% rs[3..1]:norm8;%Переменные нормализации промежу точных результатов% s:mult_nrn;%Переменные умножения% ss:mult_nrn; sss:mult_nrn; e[3..1]:sum4;%Переменные сложения показателей при умножении% ee[3..1]:sum4; q[2..1]:sum8;%Переменные сложения% qq:sum8; m[12..1]:NODE;%Вспомогательные переменные сумми рования% mm[12..1]:NODE; t[2..1]:norm_sum;%Переменные приведения к одному показателю перед сложением% d[4..1]:dop_kod;%Переменные переведения слагаемо го в дополнительный код% p[2..1]:perep;%Переменная, переносящая переполне ние разрядной сетки в показатель% sg:sigm;%Переменная сигмоиды% BEGIN %Нормализация входов% rx[1].a[16..1]=x_[16..1]; rx[2].a[16..1]=xx[16..1]; rx[3].a[16..1]=xxx[16..1]; %Нормализация весов% rw[1].a[16..1]=w[16..1]; rw[2].a[16..1]=ww[16..1];
520
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ rw[3].a[16..1]=www[16..1]; %——————————% %Умножение входов на веса% %Примечание: числа были приведены к виду 12.11.10.9.8.7.6.5.4.3.2.1% %знак числа|значение числа|показатель степени двойки сдвиг% %Числа перемножаются, показатели складываются% s.xx[7..0]=rx[1].s[12..5]; s.yy[7..0]=rw[1].s[12..5]; s.a[6..0]=GND; s.b[6..0]=GND; s.clk=clk; e[1].a[3..0]=rx[1].s[4..1]; e[1].b[3..0]=rw[1].s[4..1]; e[1].clk=clk; e[1].cin=GND; %Проводим нормализацию промежуточных результатов% rs[1].a[16]=s.p[14]; %Знак% rs[1].a[15]=GND; rs[1].a[14..1]=s.p[13..0]; %Добавление показателя после нормализации% ee[1].a[3..0]=e[1].sum[3..0]; ee[1].b[3..0]=rs[1].s[4..1]; ee[1].clk=clk; ee[1].cin=GND; %——————————% ss.xx[7..0]=rx[2].s[12..5]; ss.yy[7..0]=rw[2].s[12..5]; ss.a[6..0]=GND; ss.b[6..0]=GND; ss.clk=clk; e[2].a[3..0]=rx[2].s[4..1]; e[2].b[3..0]=rw[2].s[4..1]; e[2].clk=clk; e[2].cin=GND;
521
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %Проводим нормализацию промежуточных результатов% rs[2].a[16]=ss.p[14]; %Знак% rs[2].a[15]=GND; rs[2].a[14..1]=ss.p[13..0]; %Добавление показателя после нормализации% ee[2].a[3..0]=e[2].sum[3..0]; ee[2].b[3..0]=rs[2].s[4..1]; ee[2].clk=clk; ee[2].cin=GND; %——————————% sss.xx[7..0]=rx[3].s[12..5]; sss.yy[7..0]=rw[3].s[12..5]; sss.a[6..0]=GND; sss.b[6..0]=GND; sss.clk=clk; e[3].a[3..0]=rx[3].s[4..1]; e[3].b[3..0]=rw[3].s[4..1]; e[3].clk=clk; e[3].cin=GND; %Проводим нормализацию промежуточных результатов% rs[3].a[16]=sss.p[14]; %Знак% rs[3].a[15]=GND; rs[3].a[14..1]=sss.p[13..0]; %Добавление показателя после нормализации% ee[3].a[3..0]=e[3].sum[3..0]; ee[3].b[3..0]=rs[3].s[4..1]; ee[3].clk=clk; ee[3].cin=GND; %——————————% %тест% %демонстрируют правильность выполнения умножения входов на веса и нормализации% o[12..5]=rs[1].s[12..5]; o[4..1]=ee[1].sum[3..0]; oo[12..5]=rs[2].s[12..5]; oo[4..1]=ee[2].sum[3..0]; ooo[12..5]=rs[3].s[12..5]; ooo[4..1]=ee[3].sum[3..0]; %——————————%
522
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %Общий сумматор% %во всех 3 случаях 14 разряд — знаковый% %Для корректного сложения необходимо равенство по казательных частей. Приводим показательные части двух слагаемых к показательной части старшего из них % %Производим выравнивание по показательным частям% t[1].a[12..5]=rs[1].s[12..5]; t[1].a[4..1]=ee[1].sum[3..0]; t[1].b[12..5]=rs[2].s[12..5]; t[1].b[4..1]=ee[2].sum[3..0]; t[1].clk=clk; %——————————% %тест% %демонстрируют правильность выполнения выравнива ния значений перед сложением% jas[12..1]=t[1].as[12..1]; jbs[12..1]=t[1].bs[12..1]; %——————————% %Произведем проверку знака (0 соответствует () и доп. коду) и запрос к дополнительному коду% %Перевод необходим лишь при различных знаках% If ((t[1].as[12]==GND)&(t[1].bs[12]==VCC))==VCC then d[1].clk=clk; d[1].xx[7]=GND; d[1].xx[6..0]=t[1].as[11..5]; %——————————%
%тест% ka[12..5]=t[1].bs[12..5]; kb[11..5]=d[1].yy[6..0]; %——————————% %Суммируем%
523
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ q[1].clk=clk; q[1].cin=GND; q[1].a[7..0]=t[1].bs[12..5]; q[1].b[7]=GND; q[1].b[6..0]=d[1].yy[6..0]; %——————————% %тест% kabs[12..5]=q[1].sum[7..0]; %——————————% %Проверка на получение отрицательного ре зультата в доп. коде% %If (q[1].sum[7]==GND) then???% %То перевод из доп. кода и постановка знака (0)% If (q[1].sum[7]==VCC) then d[2].clk=clk; d[2].xx[7]=GND; d[2].xx[6..0]=q[1].sum[6..0]; m[12]=GND; m[11..5]=d[2].yy[6..0]; Else m[12]=VCC;m[11..5]=q[1].sum[6..0]; End If; m[4..1]=t[1].as[4..1];%Показательная часть при вычитании не изменяется. Может быть t[1].bs[4..1]% %Перевод необходим лишь при различных знаках% ElsIf((t[1].as[12]==VCC)&(t[1].bs[12]==GND))==VCC then d[1].clk=clk; d[1].xx[7]=GND; d[1].xx[6..0]=t[1].bs[11..5]; %——————————% %тест% ka[12..5]=t[1].as[12..5]; kb[11..5]=d[1].yy[6..0]; %——————————%
524
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %Суммируем% q[1].clk=clk; q[1].cin=GND; q[1].a[7..0]=t[1].as[12..5]; q[1].b[7]=GND; q[1].b[6..0]=d[1].yy[6..0]; %——————————% %тест% kabs[12..5]=q[1].sum[7..0]; %——————————% %Проверка на получение отрицательного ре зультата в доп. коде% %If (q[1].sum[7]==GND) then???% %То перевод из доп. кода и постановка знака (0)% If (q[1].sum[7]==VCC) then d[2].clk=clk; d[2].xx[7]=GND; d[2].xx[6..0]=q[1].sum[6..0]; m[12]=GND; m[11..5]=d[2].yy[6..0]; Else m[12]=VCC;m[11..5]=q[1].sum[6..0]; End If; m[4..1]=t[1].as[4..1];%Показательная часть при вычитании не изменяется. М.б. t[1].bs[4..1]% Else %В случае двух положительных или двух отрицательных слагаемых% %Суммируем% q[1].clk=clk; q[1].cin=GND; q[1].a[6..0]=t[1].bs[11..5];%Восьмой бит знаковый% q[1].b[6..0]=t[1].as[11..5]; %——————————%
525
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %тест% %демонстрируют правильность выполнения сложения (без переносов)% f_[11..5]=q[1].sum[6..0]; %——————————% %Проверка на переполнение разрядной сетки уместна лишь при сложении чисел одного знака% If (q[1].sum[7]==VCC) then p[1].clk=clk; p[1].xxa[11..6]=q[1].sum[6..1]; p[1].xxb[4..1]=t[1].bs[4..1];%можно и t[1].as[4..1]% m[12]=t[1].bs[12];%можно и t[1].as[12] их знак одинаков% m[11..1]=p[1].yy[11..1]; Else m[12]=t[1].bs[12];%можно и t[1].as[12] их знак одинаков% m[11..5]=q[1].sum[6..0]; m[4..1]=t[1].bs[4..1];%можно и t[1].as[4..1]% End If; End If; %——————————%
%тест% %демонстрируют правильность выполнения сложения% f[12..1]=m[12..1]; %——————————% %Производим выравнивание по показательным ча стям% t[2].a[12..5]=m[12..5]; t[2].a[4..1]=m[4..1]; t[2].b[12..5]=rs[3].s[12..5]; t[2].b[4..1]=ee[3].sum[3..0]; t[2].clk=clk;
526
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %——————————% %тест% %демонстрируют правильность выполнения выравни вания значений перед сложением% jjas[12..1]=t[2].as[12..1]; jjbs[12..1]=t[2].bs[12..1]; %——————————% %Произведем проверку знака (0 соответствует () и доп. коду) и запрос к дополнительному коду% %Перевод необходим лишь при различных знаках% If ((t[2].as[12]==GND)&(t[2].bs[12]==VCC))==VCC then d[3].clk=clk; d[3].xx[7]=GND; d[3].xx[6..0]=t[2].as[11..5]; %Суммируем% q[2].clk=clk; q[2].cin=GND; q[2].a[7..0]=t[2].bs[12..5]; q[2].b[7]=GND; q[2].b[6..0]=d[3].yy[6..0]; %Проверка на получение отрицательного ре зультата в доп. коде% %If (q[2].sum[7]==GND) then???% %То перевод из доп. кода и постановка знака (0)% If (q[2].sum[7]==VCC) then d[4].clk=clk; d[4].xx[7]=GND; d[4].xx[6..0]=q[2].sum[6..0]; mm[12]=GND; mm[11..5]=d[4].yy[6..0]; Else mm[12]=VCC; mm[11..5]=q[2].sum[6..0]; End If; mm[4..1]=t[2].as[4..1];%Показательная часть при вычитании не изменяется. Может быть t[2].bs[4..1]%
527
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %Перевод необходим лишь при различных знаках% ElsIf ((t[2].as[12]==VCC)&(t[2].bs[12]==GND))==VCC then d[3].clk=clk; d[3].xx[7]=GND; d[3].xx[6..0]=t[2].bs[11..5]; %Суммируем% q[2].clk=clk; q[2].cin=GND; q[2].a[7..0]=t[2].as[12..5]; q[2].b[7]=GND; q[2].b[6..0]=d[3].yy[6..0]; %Проверка на получение отрицательного ре зультата в доп. коде% %If (q[2].sum[7]==GND) then???% %То перевод из доп. кода и постановка знака (0)% If (q[2].sum[7]==VCC) then d[4].clk=clk; d[4].xx[7]=GND; d[4].xx[6..0]=q[2].sum[6..0]; mm[12]=GND; mm[11..5]=d[4].yy[6..0]; Else mm[12]=VCC; mm[11..5]=q[2].sum[6..0]; End If; mm[4..1]=t[2].as[4..1];%Показательная часть при вычитании не изменяется. Может быть t[2].bs[4..1]% Else %В случае двух положительных или двух отрицательных слагаемых% %Суммируем% q[2].clk=clk; q[2].cin=GND; q[2].a[6..0]=t[2].bs[11..5];%Восьмой бит знаковый% q[2].b[6..0]=t[2].as[11..5];
528
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ %Проверка на переполнение разрядной сетки уместна лишь при сложении чисел одного знака% If (q[2].sum[7]==VCC) then p[2].clk=clk; p[2].xxa[11..6]=q[2].sum[6..1]; p[2].xxb[4..1]=t[2].bs[4..1];%можно и t[1].as[4..1]% mm[12]=t[2].bs[12];%можно и t[1].as[12] — их знак одинаков% mm[11..1]=p[2].yy[11..1]; Else mm[12]=t[2].bs[12];%можно и t[1].as[12] — их знак одинаков% mm[11..5]=q[2].sum[6..0]; mm[4..1]=t[2].bs[4..1];%можно и t[1].as[4..1]% End If; End If; sg.net[12..1]=mm[12..1]; zz[16..1]=sg.out[16..1]; z[12..1]=mm[12..1]; END
7.7. Ïîñòðîåíèå áûñòðîäåéñòâóþùèõ ïåðåìíîæèòåëåé Ðåàëèçàöèÿ îïåðàöèè óìíîæåíèÿ àïïàðàòíûìè ìåòîäàìè âñåãäà ÿâëÿëàñü ñëîæíîé çàäà÷åé ïðè ðàçðàáîòêå âûñîêîïðîèçâîäèòåëüíûõ âû÷èñëèòåëåé. Àïïàðàòíàÿ ðåàëèçàöèÿ àëãîðèòìà óìíîæåíèÿ â ïåðâóþ î÷åðåäü ïðåäíàçíà÷åíà äëÿ ïîëó÷åíèÿ ìàêñèìàëüíîãî áûñòðîäåéñòâèÿ âûïîëíåíèÿ ýòîé îïåðàöèè â óñòðîéñòâå. Íà ÏËÈÑ ìîæíî ðàçðàáàòûâàòü óìíîæèòåëè ñ áûñòðîäåéñòâèåì áîëåå 100 ÌÃö è ðàñïîëàãàòü áîëåå 100 ìîäóëåé óìíîæèòåëåé â îäíîì êðèñòàëëå. Äëÿ îïåðàíäîâ íåáîëüøîé ðàçðÿäíîñòè (4 è ìåíåå) íàèáîëåå ðåçóëüòàòèâíà ñòðóêòóðà ïðîñòîãî ìàòðè÷íîãî ñóììèðîâàíèÿ (Ðèñ. 7.17). Îíà ðåà-
529
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ x0 x3y1
0 x2y1
x3y0 x1y1
x2y0 x0y1
x3y2
x2y2
x1y2
x0y2
x2y3
x1y3
x0y3
x1y0
y0
0
одноразрядный сумматор
0 x3y3
p7
p6
p5
p4
p3
p2
p1
p0
AL7177+
0
Ðèñ. 7.17. Ñòðóêòóðà ìàòðè÷íîãî óìíîæèòåëÿ ñ ïîñëåäîâàòåëüíûì ðàñïðîñòðàíåíèåì ïåðåíîñà
ëèçóåò ïàðàëëåëüíûé óìíîæèòåëü êàê ìàññèâ îäíîðàçðÿäíûõ ñóììàòîðîâ, ñîåäèíåííûõ ëîêàëüíûìè ìåæñîåäèíåíèÿìè, ïðè ýòîì îáùåå ÷èñëî ñóììàòîðîâ íàïðÿìóþ îïðåäåëÿåòñÿ ðàçðÿäíîñòüþ ìíîæèìîãî è ìíîæèòåëÿ. Òàê, ïîëíûé ïàðàëëåëüíûé óìíîæèòåëü 4⫻4 òðåáóåò äëÿ ñâîåé ðåàëèçàöèè 12 ñóììàòîðîâ. Ïðè äàëüíåéøåì íàðàùèâàíèè ðàçðÿäíîñòè ìàòðèöà îäíîðàçðÿäíûõ ñóììàòîðîâ çíà÷èòåëüíî ðàçðàñòàåòñÿ, îäíîâðåìåííî óâåëè÷èâàåòñÿ êðèòè÷åñêèé ïóòü è ðåàëèçàöèÿ óìíîæèòåëÿ ñòàíîâèòñÿ íåðàöèîíàëüíîé. Îäíèì èç ñïîñîáîâ óìåíüøåíèÿ àïïàðàòíûõ çàòðàò ñëóæèò èñïîëüçîâàíèå àëãîðèòìà Áóòà.  ñîîòâåòñòâèè ñ äàííûì àëãîðèòìîì îïðåäåëåííûì îáðàçîì àíàëèçèðóþòñÿ ïàðíûå ðàçðÿäû ìíîæèòåëÿ è â çàâèñèìîñòè îò èõ êîìáèíàöèè íàä ìíîæèìûì âûïîëíÿþòñÿ íåêîòîðûå ïðåîáðàçîâàíèÿ (ïðèìåð äëÿ óìíîæèòåëÿ 12⫻12 áèò ïðèâåäåí â Òàáë. 7.3). Òàáëèöà 7.3. Ïðåîáðàçîâàíèå ìíîæèìîãî â çàâèñèìîñòè îò ñîñòîÿíèÿ ìíîæèòåëÿ ÷1, 2÷ ÷3, 4÷ ÷5, 6÷ ÷7, 8÷ ÷9 Ïàðû ðàçðÿäîâ ìíîæèòåëÿ 0÷
Âûïîëíÿåìîå äåéñòâèå
00 01 10 11
Ïðèáàâèòü 0 Ïðèáàâèòü ìíîæèìîå Ïðèáàâèòü (2×ìíîæèìîå) Ïðèáàâèòü (3×ìíîæèìîå)
÷11 (çíàê) Ïàðà ðàçðÿäîâ ìíîæèòåëÿ 10÷
Âûïîëíÿåìîå äåéñòâèå
00 01 10 11
Ïðèáàâèòü 0 Ïðèáàâèòü ìíîæèìîå Ïðèáàâèòü (2×ìíîæèìîå) Ïðèáàâèòü ìíîæèìîå
530
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ Kàê âèäíî èç òàáëèöû, âûïîëíÿåìûå íàä ìíîæèìûì äåéñòâèÿ îòëè÷àþòñÿ äëÿ äâóõ ñòàðøèõ ðàçðÿäîâ, îäèí èç êîòîðûõ çíàêîâûé. Ïîäîáíàÿ êîððåêöèÿ ïîçâîëÿåò îñóùåñòâëÿòü îïåðàöèþ óìíîæåíèÿ íàä ÷èñëàìè â äîïîëíèòåëüíîì êîäå. Ñôîðìèðîâàííûå ÷àñòè÷íûå ïðîèçâåäåíèÿ, ïðåäñòàâëÿþùèå ñîáîé ðåçóëüòàò ïðåîáðàçîâàíèÿ ìíîæèìîãî, íåîáõîäèìî ñóììèðîâàòü ñ ñîîòâåòñòâóþùèì âåñîâûì ôàêòîðîì. Ðåçóëüòàòîì èõ ñóììèðîâàíèÿ ïî àëãîðèòìó ïðîñòîãî ìàòðè÷íîãî óìíîæèòåëÿ è áóäåò êîíå÷íûé ïðîäóêò ïðîèçâåäåíèÿ äâóõ îïåðàíäîâ. Àíàëèç ðàçëè÷íûõ ìåòîäîâ ñâåðòêè ÷àñòè÷íûõ ïðîèçâåäåíèé ïîêàçàë, ÷òî íàèáîëåå ïðèåìëåìûì äëÿ ðåàëèçàöèè íà ÏËÈÑ ÿâëÿåòñÿ àëãîðèòì íà îñíîâå èåðàðõè÷åñêîãî äåðåâà ìíîãîðàçðÿäíûõ ìàñøòàáèðóþùèõ ñóììàòîðîâ. Ïðè ýòîì äîñòèãàåòñÿ ñîêðàùåíèå àïïàðàòíûõ çàòðàò ïî ñðàâíåíèþ ñ ïàðàëëåëüíûì ìàòðè÷íûì óìíîæèòåëåì äî äâóõ ðàç. Ïðèìåð ðåàëèçàöèè äàííîãî ðåøåíèÿ äëÿ ñëó÷àÿ 12-ðàçðÿäíûõ îïåðàíäîâ ïðèâåäåí íà Ðèñ. 7.18.  äàííîé ñõåìå âûáîð ñîîòâåòñòâóþùåãî ïðåîáðàçîâàíèÿ ìíîæèìîãî Y îñóùåñòâëÿåòñÿ ìóëüòèïëåêñîðîì íà îñíîâàíèè àíàëèçà ïàðíûõ ðàçðÿäîâ ìíîæèòåëÿ X â ñîîòâåòñòâèè ñ Òàáë. 7.3. Âõîäíûå çíà÷åíèÿ ìóëüòèïëåêñîðîâ 0 è Y ïîäàþòñÿ íåïîñðåäñòâåííî, çíà÷åíèå 2Y ôîðìèðóåòñÿ ñäâèãîì ìíîæèìîãî íà îäèí ðàçðÿä, à 3Y ôîðìèðóåòñÿ ïóòåì ñëîæåíèÿ Y è 2Y. Ñóììàòîðû ADD îñóùåñòâëÿþò ñóììèðîâàíèå ÷àñòè÷íûõ ïðîèçâåäåíèé, ïðè÷åì èõ ðàçðÿäíîñòü äëÿ ðàçíûõ ñòóïåíåé èåðàðõèè íåîäèíàêîâà. Íà êàæäîì øàãå ñóììèðîâàíèÿ, êàê âèäíî, èìååòñÿ íåñêîëüêî ñêâîçíûõ ðàçðÿäîâ, íåïîñðåäñòâåííî äîïîëíÿþùèõ âûõîäíûå çíà÷åíèÿ ñóììàòîðîâ. Çà ñ÷åò íèõ è çà ñ÷åò ðàçðÿäîâ ðàñøèðåíèÿ çíàêà îñóùåñòâëÿåòñÿ íåîáõîäèìîå ìàñøòàáèðîâàíèå ðåçóëüòàòà. Ðàçìåðíîñòü ïðîèçâåäåíèÿ P â êîíå÷íîì èòîãå ðàâíà ñóììå ðàçìåðíîñòåé îïåðàíäîâ. Çà ñ÷åò ðåãóëÿðíîñòè ïðèâåäåííîé ñòðóêòóðû áûñòðîäåéñòâèå ìîæíî ðåçêî ïîâûñèòü ïóòåì ââåäåíèÿ êîíâåéåðèçàöèè êàæäîé ñòóïåíè. Ïðè ýòîì ðàçäåëÿþòñÿ êîíâåéåðíûìè ðåãèñòðàìè êàê ñóììàòîðû, òàê è ìóëüòèïëåêñîðû. Âûèãðûø â áûñòðîäåéñòâèè áëàãîäàðÿ äàííîìó ðåøåíèþ îêàçûâàåòñÿ îñîáåííî îùóòèìûì äëÿ áîëüøîé ðàçðÿäíîñòè îïåðàíäîâ. Äëÿ èëëþñòðàöèè ìåòîäà óìíîæåíèÿ íà êîíñòàíòó ðàññìîòðèì, êàê âûïîëíÿåòñÿ óìíîæåíèå äâóõ äåñÿòè÷íûõ ÷èñåë «â ñòîëáèê» íà ïðèìåðå 85⫻37:
531
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ 85 7 35 + 560 595 ⫻
→ 7⫻85
→
3⫻85⫻10
⫻
+
85 37 595 2550 3145
Kàê âèäíî èç ïðèìåðà, èñïîëüçóåòñÿ êàæäàÿ öèôðà ìíîæèòåëÿ äëÿ ïîðàçðÿäíîãî ïåðåìíîæåíèÿ ñî âñåìè öèôðàìè ìíîæèìîãî è ñîâñåì íå îáÿçàòåëüíî çíàòü âñþ òàáëèöó ïðîèçâåäåíèé îïåðàíäîâ ïîëíîé ðàçðÿäíîñòè. Äëÿ ïåðåìíîæåíèÿ äâóõ ïåðåìåííûõ äîñòàòî÷íî èìåòü òàáëèöó ïðîèçâåäåíèé ìíî-
4
14 ADD
14
16 ADD
16 24
P[23 : 0]
2 4 : 1 MUX 14 ADD
14
16 ADD
Y
4
2
12
Расширение знака 14 ADD
4
14 X — множитель Y — множимое
2
2
Дешифратор Бута AL7178+
X
12
Ðèñ. 7.18. Ñòðóêòóðíàÿ ñõåìà 12-ðàçðÿäíîãî óìíîæèòåëÿ íà îñíîâå àëãîðèòìà Áóòà
532
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ æèìîãî, â äàííîì ñëó÷àå êîíñòàíòû, íà âåñü ðàíã âîçìîæíûõ öèôð ìíîæèòåëÿ è îñóùåñòâèòü êîððåêòíîå ñóììèðîâàíèå ïîëó÷åííûõ ÷àñòè÷íûõ ïðîèçâåäåíèé. Äëÿ ñëó÷àÿ 85⫻476 ýòî èëëþñòðèðóåòñÿ ñëåäóþùèì îáðàçîì: 0⫻85 = 000 1⫻85 = 085 2⫻85 = 170 3⫻85 = 255 4⫻85 = 340 → 85 ⫻ 476 5⫻85 = 425 510 6⫻85 = 510 → 5950 7⫻85 = 595 → + 34000 8⫻85 = 680 40460 9⫻85 = 765 Òàáëèöà ïðîèçâåäåíèé ìíîæèìîãî çàïèñûâàåòñÿ âî ôðàãìåíò ïàìÿòè íà ÏËÈÑ è íàçûâàåòñÿ òàáëèöåé ïåðåêîäèðîâîê. ÒÏ àäðåñóþòñÿ ÷åòûðüìÿ ðàçðÿäàìè, ñëåäîâàòåëüíî, íåîáõîäèìî ïðåäñòàâèòü îïåðàíäû â øåñòíàäöàòåðè÷íîì êîäå è ìàññèâ ÒÏ áóäåò ñîäåðæàòü òàêèì îáðàçîì ìàññèâ ïðîèçâåäåíèé êîíñòàíòû íà ðÿä öèôð 0, 1, ... E, F: 0⫻55 = 000
8⫻55 = 2A8
1⫻55 = 055
9⫻55 = 2FD
2⫻55 = 0AA
A⫻55 = 352
3⫻55 = 0FF
B⫻55 = 3A7
4⫻55 = 154
C⫻55 = 3FC
5⫻55 = 1A9
D⫻55 = 451
6⫻55 = 1FE
E⫻55 = 4A6
7⫻55 = 253
F⫻55 = 4FB
Kàê âèäíî èç ïðèâåäåííîãî ïðèìåðà, äëÿ òîãî ÷òîáû îñóùåñòâèòü îïåðàöèþ óìíîæåíèÿ äâóõ äâåíàäöàòèðàçðÿäíûõ äâîè÷íûõ ÷èñåë, îäíî èç êîòîðûõ êîíñòàíòà, íåîáõîäèìî èìåòü ÒÏ íà 16 çíà÷åíèé ñ ðàçðÿäíîñòüþ
533
Ïðèìåðû ðåàëèçàöèè àëãîðèòìîâ ÖÎÑ íà ÏËÈÑ
LOOKjUP
16
4
Расширение знака
ADD
24
P
LOOKjUP X
12
4 16 ADD
LOOKjUP
4
AL7179+
4
4
16
Ðèñ. 7.19. 12-ðàçðÿäíûé óìíîæèòåëü íà êîíñòàíòó
âûõîäíîãî çíà÷åíèÿ 16 (äëÿ ïîëîæèòåëüíûõ ÷èñåë) è äâà 16-ðàçðÿäíûõ ñóììàòîðà (Ðèñ. 7.19). ×åòûðå ìëàäøèõ ðàçðÿäà âûõîäíîãî ïðîèçâåäåíèÿ íèæíåé (Ðèñ. 7.19) ÒÏ íåïîñðåäñòâåííî â ñîîòâåòñòâèè ñ àëãîðèòìîì ôóíêöèîíèðîâàíèÿ ôîðìèðóþò ÷åòûðå ìëàäøèõ ðàçðÿäà îêîí÷àòåëüíîãî ïðîèçâåäåíèÿ. Ïðè ïîäà÷å íà ñóììàòîð óêàçàííîãî ïðîèçâåäåíèÿ íåîáõîäèìî ïðîèçâåñòè ðàñøèðåíèå çíàêà â ñîîòâåòñòâèè ñî çíà÷åíèåì ñòàðøåãî ðàçðÿäà. Íàïðèìåð, äëÿ 12-ðàçðÿäíûõ îïåðàíäîâ: Ìëàäøåå ïðîèçâåäåíèå (⫻1) 1111 1110 0110 1101 Ñòàðøåå ïðîèçâåäåíèå (⫻16) + 0010 1101 0011 Ðåçóëüòàò
↓
Ñêâîçíîå ñóììèðîâàíèå
0010 1011 1001 1101
Ðåàëèçàöèÿ ïî äàííîìó ïðèíöèïó îïåðàöèè óìíîæåíèÿ îòðèöàòåëüíûõ ÷èñåë, ïðåäñòàâëåííûõ â äîïîëíèòåëüíîì êîäå, íå òðåáóåò êàêèõ-ëèáî èçìåíåíèé â òåõíè÷åñêîé ðåàëèçàöèè è íå çàäåéñòâóåò äîïîëíèòåëüíóþ ñïåöèàëüíóþ ëîãèêó êîððåêöèè, èçìåíèòñÿ ëèøü ïðîøèâêà ïðîñìîòðîâîé òàáëèöû, àäðåñóåìîé çíàêîâûì áèòîì âõîäíîãî îïåðàíäà.
534
Ïðèëîæåíèå 1.
Ñèñòåìà ïðîåêòèðîâàíèÿ Quartus
Óâåëè÷åíèå ëîãè÷åñêîé åìêîñòè ÏËÈÑ è ïîÿâëåíèå íîâîé èäåîëîãèè ïðîåêòèðîâàíèÿ ñèñòåì-íà-êðèñòàëëå (System on Chip) ïðèâåëè ê òîìó, ÷òî âåäóùèå ïðîèçâîäèòåëè ÏËÈÑ âìåñòå ñ âûïóñêîì íà ðûíîê ñîáñòâåííî êðèñòàëëîâ ñ ýêâèâàëåíòíîé åìêîñòüþ áîëåå 500 000 âåíòèëåé ñóùåñòâåííî îáíîâèëè ïðîãðàììíîå îáåñïå÷åíèå, ïðåäîñòàâèâ ðàçðàáîò÷èêó âîçìîæíîñòü èñïîëüçîâàòü âñå ïðåèìóùåñòâà íîâûõ ÁÈÑ.  ñåðåäèíå 1999 ãîäà íà ðûíîê âûøåë ÑÀÏÐ 4-ãî ïîêîëåíèÿ ôèðìû «Altera» — ñèñòåìà Quartus. Îòëè÷èòåëüíûå ñâîéñòâà äàííîãî ïàêåòà: — Èíòåãðàöèÿ ñ ïðîãðàììíûì îáåñïå÷åíèåì òðåòüèõ ôèðì (Advanced Tools Integration).  ðàìêàõ ïðîãðàììû NATIVE LINK îáåñïå÷åíà ñîâìåñòèìîñòü ñ ÑÀÏÐ âåäóùèõ ïðîèçâîäèòåëåé ÏÎ. Ïîääåðæèâàþòñÿ ñòàíäàðòû EDIF, SDF, Vital 95, VHDL 1987 è 1993, Verilog HDL. — Âîçìîæíîñòü êîëëåêòèâíîé ðàáîòû íàä ïðîåêòîì (Workgroup Computing). — Âîçìîæíîñòü àíàëèçà ñèãíàëîâ «âíóòðè» ÏËÈÑ ñ èñïîëüçîâàíèåì ôóíêöèè Signal Tap. — Èòåðàöèîííàÿ êîìïèëÿöèÿ ïðîåêòà, ïîçâîëÿþùàÿ íå èçìåíÿòü óæå îòëàæåííûå ó÷àñòêè ïðîåêòà (nSTEP Compiler). — Óëó÷øåííûå ñðåäñòâà ñèíòåçà â àðõèòåêòóðå APEX (CoreSyn). — Ìíîãîïëàòôîðìåííîñòü (Win NT, Sun, HP). — Ïîëíàÿ èíòåãðàöèÿ ñèñòåìû. — Ðàçíîîáðàçèå ñðåäñòâ îïèñàíèÿ ïðîåêòà. — Ïîääåðæêà ÿçûêîâ îïèñàíèÿ àïïàðàòóðû. — Internet-ïîääåðæêà. — Ïîääåðæêà ìåãàôóíêöèé MegaCore.
— 535 —
Ïðèëîæåíèÿ  äîïîëíåíèå ê óæå ïðèâû÷íûì ðåäàêòîðàì, èñïîëüçóåìûì â ïàêåòå MAX+PLUS II, ââåäåí ðåäàêòîð áëîêîâ (Block Editor), ïîçâîëÿþùèé óïðîñòèòü ãðàôè÷åñêîå îïèñàíèå ïðîåêòà, èñïîëüçóÿ ìåõàíèçì ïàðàìåòðèçèðóåìûõ áëîêîâ. Ïîóðîâíåâûé ïëàíèðîâùèê (FloorPlan Editor) èìååò âîçìîæíîñòü ðàñïðåäåëÿòü ðåñóðñû êàê âíóòðè ËÁ, òàê è ïî ìåãàáëîêàì. Íîâûì ñðåäñòâîì, îáëåã÷àþùèì ðàáîòó íàä èåðàðõè÷åñêèì ïðîåêòîì, ÿâëÿåòñÿ íàâèãàòîð ïðîåêòà (Project Navigator), ïîçâîëÿþùèé ëåãêî îðèåíòèðîâàòüñÿ âî âñåõ ôàéëàõ ïðîåêòà. Óëó÷øåíû âîçìîæíîñòè ñèíòåçà ñ çàäàííûìè âðåìåííûìè ïàðàìåòðàìè (Time Driven Compilation). Âîçðàñòàþùåå âíèìàíèå óäåëÿåòñÿ ôóíêöèîíàëüíîìó è ïîâåäåí÷åñêîìó ìîäåëèðîâàíèþ ñ èñïîëüçîâàíèåì ÿçûêîâ îïèñàíèÿ àïïàðàòóðû, â òîì ÷èñëå òåñòèðîâàíèå ïðîåêòîâ èç íåñêîëüêèõ ÏËÈÑ. Íàëè÷èå âñòðîåííîãî ëîãè÷åñêîãî àíàëèçàòîðà Signal TAP ïîçâîëÿåò ïðîâîäèòü êîíòðîëü ñèãíàëîâ âíóòðè ÏËÈÑ. Ìåõàíèçì ïîäñêàçîê ñîðèåíòèðîâàí íà èñïîëüçîâàíèå Internet-òåõíîëîãèé. Äëÿ íîðìàëüíîé ðàáîòû Quartus íà áàçå PC ñîâìåñòèìîãî êîìïüþòåðà òðåáóåòñÿ ñëåäóþùàÿ àïïàðàòíàÿ ïîääåðæêà: — ïðîöåññîð ñ òàêòîâîé ÷àñòîòîé íå ìåíåå 400 ÌÃö; — îò 256 Ìáàéò äî 1 Ãáàéò îïåðàòèâíîé ïàìÿòè; — 4 Ãáàéò ñâîáîäíîãî ïðîñòðàíñòâà íà æåñòêîì äèñêå; — Windows NT 4.0 è áîëåå ïîçäíèå âåðñèè; — ïðèâîä CD-ROM; — æåëàòåëüíî ìîíèòîð ñ äèàãîíàëüþ íå ìåíåå 17 äþéìîâ; — óñòàíîâëåííûé Microsoft Internet Explorer 4.0 è áîëåå ïîçäíèå âåðñèè. K ñîæàëåíèþ, îáúåì êíèãè íå ïîçâîëÿåò ïîëíîñòüþ è ïîäðîáíî èçëîæèòü îñîáåííîñòè ðàáîòû ñ ïàêåòîì, íî â ïëàíàõ àâòîðà íàïèñàíèå îòäåëüíîé êíèãè ïî íîâûì ÑÀÏÐ ðàçðàáîòêè ÏËÈÑ.
— 536 —
Ïðèëîæåíèÿ
Ïðèëîæåíèå 2.
Èíòåðôåéñû ïåðåäà÷è äàííûõ è ñîïðÿæåíèå óñòðîéñòâ
 ýòîì ïðèëîæåíèè ðàññìîòðèì âîïðîñû âûáîðà è èñïîëüçîâàíèÿ ñòàíäàðòíûõ ïðîòîêîëîâ è èíòåðôåéñîâ ïåðåäà÷è äàííûõ, èñïîëüçóåìûõ â ñîâðåìåííîé àïïàðàòóðå îáðàáîòêè ñèãíàëîâ. Ñ çàäà÷åé ðàçðàáîòêè óñòðîéñòâ îáìåíà äàííûìè â òîé èëè èíîé ìåðå ñòàëêèâàëñÿ ïðàêòè÷åñêè êàæäûé ðàçðàáîò÷èê.  ñëó÷àå âûáîðà ïðîòîêîëà äëÿ íîâîãî èçäåëèÿ âñåãäà âñòàåò âîïðîñ î êîìïðîìèññå ìåæäó ñëîæíîñòüþ àïïàðàòíûõ ñðåäñòâ èíòåðôåéñà («àìóíèöèè») è ïðîòîêîëîì ïåðåäà÷è äàííûõ («êîíñòèòóöèè»). Kðîìå òîãî, ïðèñìàòðèâàÿñü ê íîâîìîäíîìó èíòåðôåéñó, íå ñëåäóåò çàáûâàòü, ÷òî î÷åíü ÷àñòî â íàøèõ ñêðîìíûõ çàäà÷àõ äîñòàòî÷íî âîçìîæíîñòåé ñòàðûõ äîáðûõ RS-232 èëè RS-485, ðåàëèçàöèÿ êîòîðûõ ê òîìó æå èñêëþ÷èòåëüíî äåøåâà è ìíîãîêðàòíî îòðàáîòàíà. Ïîñëåäíèå íåñêîëüêî ëåò, ïîìèìî ïðî÷èõ ïðåëåñòåé, ïðèíåñëè ðàçðàáîò÷èêó è öåëûé ðÿä íîâûõ èíòåðôåéñîâ, ïîçâîëÿþùèõ áåç ïîìåõ ïåðåäàâàòü áîëüøèå îáúåìû èíôîðìàöèè íà çíà÷èòåëüíîå ðàññòîÿíèå. Ñîâðåìåííûå ÏËÈÑ èìåþò âñòðîåííóþ àïïàðàòíóþ ðåàëèçàöèþ òàêèõ èíòåðôåéñîâ, êàê GTL, LVDS, ïðàêòè÷åñêè âñÿ ñîâðåìåííàÿ ýëåìåíòíàÿ áàçà óñòðîéñòâ îáðàáîòêè ñèãíàëîâ ðàññ÷èòàíà íà íàïðÿæåíèå ïèòàíèÿ íå âûøå 3.3 Â, ÷òî âûçûâàåò íåîáõîäèìîñòü ðàçðàáîòêè ñïîñîáîâ ñîïðÿæåíèÿ óêàçàííûõ èíòåðôåéñîâ ñ òðàäèöèîííûìè.  òî æå âðåìÿ íà ðóññêîì ÿçûêå ïðàêòè÷åñêè îòñóòñòâóåò ëèòåðàòóðà ïî ýòîìó âîïðîñó. Ðÿä êîìïàíèé âûïóñòèë ðóêîâîäñòâà ïî ïðèìåíåíèþ ÈÑ äëÿ ðåàëèçàöèè òåõíè÷åñêèõ ñðåäñòâ èíòåðôåéñà, íî, ê ñîæàëåíèþ, îíè íå âñåãäà äîñòóïíû ðîññèéñêîìó ÷èòàòåëþ. Íà Ðèñ. Ï2.1 ïðåäñòàâëåíû îáëàñòè èñïîëüçîâàíèÿ ðàçëè÷íûõ èíòåðôåéñîâ ïåðåäà÷è äàííûõ â êîîðäèíàòàõ ðàññòîÿíèå — ñêîðîñòü ïåðåäà÷è. Kàê ìîæíî çàìåòèòü, åñëè òðåáóåòñÿ ïåðåäà÷à èíôîðìàöèè íà ðàññòîÿíèå áîëüøå íåñêîëüêèõ äåñÿòêîâ ñàíòèìåòðîâ, ñòàíäàðòíûå ëîãè÷åñêèå óðîâ-
— 537 —
Ïðèëîæåíèÿ
Скорость передачи данных 2500 [Мбит/с] 655
CML
TIA/EIA644 LVDS
400
GTLP
IEEE 1394 35
GTL/BTL
10 TIA/EIA 422 (RS 422) TIA/EIA 485 (RS 485)
1 0.1
TIA/EIA 423 (RS 423)
TIA/EIA 232 (RS 232)
0.01 1
10
100
Длина кабеля [м]
1000
ALT'P2180+
Стандартная логика
Ðèñ. Ï2.1. Îáëàñòè ïðèìåíåíèÿ èíòåðôåéñîâ ïåðåäà÷è äàííûõ
íè ïåðåñòàþò óäîâëåòâîðÿòü. Íà ïîìîùü ïðèõîäÿò ñïåöèàëèçèðîâàííûå ïðîòîêîëû. Kàêîé æå èç íèõ âûáðàòü äëÿ ðàçðàáàòûâàåìîé ñèñòåìû? Kàêàÿ ýëåìåíòíàÿ áàçà ïîçâîëèò ðåàëèçîâàòü åãî àïïàðàòíî? Kàêèå îñîáåííîñòè ïðèìåíåíèÿ äàííîãî èíòåðôåéñà? Îòâåò íà ýòè âîïðîñû ïðåäñòîèò äàòü â ýòîì ðàçäåëå êíèãè. Ïðè âûáîðå ïðîòîêîëà ïåðåäà÷è äàííûõ ñëåäóåò îáðàùàòü âíèìàíèå íà íåñêîëüêî îñíîâíûõ ïàðàìåòðîâ. Ýòî ñêîðîñòü ïåðåäà÷è äàííûõ, ðàññòîÿíèå ìåæäó èñòî÷íèêîì è ïðèåìíèêîì äàííûõ, çàðàíåå çàäàííûå óðîâíè ñèãíàëîâ, ñîâìåñòèìîñòü, âèä èíòåðôåéñà (ïàðàëëåëüíûé èëè ïîñëåäîâàòåëüíûé).  Òàáë. Ï2.1 ïðèâåäåíû êðàòêàÿ õàðàêòåðèñòèêà èíòåðôåéñîâ è äàííûå îá îñíîâíûõ ïðîèçâîäèòåëÿõ ÈÑ, ïîääåðæèâàþùèõ äàííûé èíòåðôåéñ. Ðàçóìååòñÿ, ïîñëåäíèé ñòîëáåö îòðàæàåò ëèøü ìàëóþ äîëþ ñóùåñòâóþùèõ ðåøåíèé; â òåõ ñëó÷àÿõ, êîãäà ïðîèçâîäèòåëåé ñëèøêîì ìíîãî, â òàáëèöå ñêðîìíî óêàçàíî ñåìåéñòâî ÈÑ. Ïî ñïîñîáó îðãàíèçàöèè ïåðåäà÷è äàííûõ ðàçëè÷àþò îäíîïðîâîäíûå (single-ended) è äèôôåðåíöèàëüíûå (differential) èíòåðôåéñû. Íà Ðèñ. Ï2.2 ïðèâåäåíà îáîáùåííàÿ ñõåìà îäíîïðîâîäíîãî èíòåðôåéñà.
— 538 —
Ïðèëîæåíèÿ Òàáëèöà Ï2.1. Èíòåðôåéñû ïåðåäà÷è äàííûõ Ðàññòîÿíèå Ñêîðîñòü ìåæäó ïåðåäà÷è Òèï èíòåðôåéñà èñòî÷íèêîì è äàííûõ ïî îäíîé ïðèåìíèêîì ëèíèè äàííûõ
Ïîñëåäîâàòåëüíûé
Ïàðàëëåëüíîïîñëåäîâàòåëüíûé, ïîñëåäîâàòåëüíîïàðàëëåëüíûé
Ïàðàëëåëüíûé
Ñòàíäàðò
25/50 Ìáèò/ñ
1.5 ì
IEEE1394 – 1995
100-400 Ìáèò/ñ
4.5 ì
IEEE1394 – 1995/p1394.a
12 Ìáèò/ñ
5ì
USB 2.0
35 Ìáèò/ñ
10 ì (1200 ì)
200 Ìáèò/ñ
0.5 ì
10 Ìáèò/ñ
10 ì (1200 ì)
200/100 Ìáèò/ñ
0.5 ì/10 ì
512 êáèò / ñ
20 ì
455 Ìáèò/ñ
Äî 10 ì
1,25 Ãáèò/ñ
Äî 10 ì
2,5 Ãáèò/ñ
Äî 10 ì
35 Ìáèò/ñ
10 ì (1200 ì)
40/20 Ìáèò/ñ
12/25 ì
40 Ìáèò/ñ
12 ì
200/100 Ìáèò/ñ
0.5/10 ì
33/66 Ìáèò/ñ
0.2 ì
— 539 —
TIA/EIA 485 (RS-485) (ISO8482) LVDM (â ðàçðàáîòêå) TIA/EIA 422 (RS-422) (ITU-T V.11) TIA/EIA 644 (LVDS) (â ðàçðàáîòêå)
Ïðîèçâîäèòåëè ýëåìåíòíîé áàçû, ïîääåðæèâàþùèå èíòåðôåéñ èëè ñåìåéñòâî ÈÑ Texas Instruments, Intel, è äð. Texas Instruments, Intel, è äð. Texas Instruments, Intel, è äð. Texas Instruments, Analog Devices, Ìaxim, Sipex, è äð. LVDM Texas Instruments, Analog Devices, Ìaxim, Sipex, è äð. LVDS
Texas Instruments, Analog Devices, Ìaxim, Sipex, è äð. TIA/EIA 644 Texas Instruments, è (LVDS) äð. Texas Instruments, è IEEE P802.3z äð. Texas Instruments, è IEEE P802.3z äð. Texas Instruments, TIA/EIA 485 (RSAnalog Devices, 485) (ISO8482) Ìaxim, Sipex, è äð. Ìíîãèå SCSI ïðîèçâîäèòåëè Ìíîãèå LVD- SCSI ïðîèçâîäèòåëè LVDM (â LVDM ðàçðàáîòêå) TI, PLX, ðàçðàáîò÷èêè ïðîøèâîê äëÿ Compact PCI ÏËÈÑ TIA/EIA 232 (RS232) (ITU-T V.28)
Ïðèëîæåíèÿ Òàáëèöà Ï2.1 (îêîí÷àíèå) Ðàññòîÿíèå Ñêîðîñòü ìåæäó ïåðåäà÷è Òèï èíòåðôåéñà èñòî÷íèêîì è äàííûõ ïî îäíîé ïðèåìíèêîì ëèíèè äàííûõ
Ïàðàëëåëüíûé
Ñòàíäàðò
33/66 Ìáèò/ñ
0.2 ì
PCI
Òàêòîâàÿ ÷àñòîòà äî 4 ÌÃö
10 ì
IEEE Std 1284 – 1994
Òàêòîâàÿ ÷àñòîòà äî 20 ÌÃö
0.5 ì
Òàêòîâàÿ ÷àñòîòà äî 33 ÌÃö
0.5 ì
Òàêòîâàÿ ÷àñòîòà äî 40 ÌÃö
0.5 ì
Òàêòîâàÿ ÷àñòîòà äî 60 ÌÃö Òàêòîâàÿ ÷àñòîòà äî 60 ÌÃö Òàêòîâàÿ ÷àñòîòà äî 100 ÌÃö Òàêòîâàÿ ÷àñòîòà äî 200 ÌÃö
0.5 ì
CMOS, JESD20, TTL, IEEE 1014 – 1987 LVTTL (JED8-A), IEEE 1014 – 1987 VME64 Standart ANSI/VITA1 – 1991 IEEE Std 1194.1 – 1991
Ïðîèçâîäèòåëè ýëåìåíòíîé áàçû, ïîääåðæèâàþùèå èíòåðôåéñ èëè ñåìåéñòâî ÈÑ TI, PLX, ðàçðàáîò÷èêè ïðîøèâîê äëÿ ÏËÈÑ AC1284, LVC161284 LV161284 AC, AHC, ABT, HC, HCT è äð. LVTH, ALVT ABTE BTL/FB+
0.5 ì
JESD8-3
GTL/GTL+
0.5 ì
JESD8-3
GTLP
0.1 ì
EIA/JESD8-8, EIA/JESD8-9
SSTL
Ïðè îäíîïðîâîäíîé ïåðåäà÷å äàííûõ èñïîëüçóåòñÿ îäíà ñèãíàëüíàÿ ëèíèÿ, è åå ëîãè÷åñêèé óðîâåíü îïðåäåëÿåòñÿ îòíîñèòåëüíî çåìëè. Äëÿ ïðîñòûõ ìåäëåííûõ èíòåðôåéñîâ äîïóñêàåòñÿ èñïîëüçîâàíèå îáùåé çåìëè.  áîëåå ñîâåðøåííûõ èíòåðôåéñàõ êàæäûé ñèãíàëüíûé ïðîâîä èìååò ñâîþ çåìëþ, è, êàê ïðàâèëî, îíè îáúåäèíÿþòñÿ â âèòóþ ïàðó. Ïðåèìóùåñòâîì îäíîïðîâîäíûõ ñèñòåì ÿâëÿåòñÿ ïðîñòîòà è äåøåâèçíà ðåàëèçàöèè. Ïîñêîëüêó êàæäàÿ ëèíèÿ ïåðåäà÷è äàííûõ òðåáóåò òîëüêî îäíîãî ñèãíàëüíîãî ïðîâîäà, îíè óäîáíû äëÿ ïåðåäà÷è ïàðàëëåëüíûõ äàííûõ íà íåáîëüøîå ðàññòîÿíèå. Ïðèìåðîì ìîæåò ñëóæèòü ïðèâû÷íûé ïàðàëëåëüíûé èíòåðôåéñ ïðèíòåðà. Äðóãîé ïðèìåð — ïîñëåäîâàòåëüíûé èíòåðôåéñ RS-232. Kàê âèäèì, îäíîïðîâîäíûå èíòåðôåéñû ÷àñòî ïðèìåíÿþòñÿ â òåõ ñëó÷àÿõ, êîãäà ðåøàþùèì ôàêòîðîì ÿâëÿåòñÿ ñòîèìîñòü ðåàëèçàöèè. Îñíîâíûì íå-
— 540 —
Ïðèëîæåíèÿ
Передатчик
Приемник Линия передачи
Вход
VCM
V0
Выход VIN ALT'P2181+
VGND Общая «земля»
Ðèñ. Ï2.2. Îäíîïðîâîäíûé èíòåðôåéñ
äîñòàòêîì îäíîïðîâîäíûõ ñèñòåì ÿâëÿåòñÿ èõ íèçêàÿ ïîìåõîóñòîé÷èâîñòü. Èç-çà íàâîäîê íà îáùèé ïðîâîä âîçìîæåí ñäâèã óðîâíåé ñèãíàëîâ, ïðèâîäÿùèé ê îøèáêàì. Ïðè ïåðåäà÷å íà ðàññòîÿíèå ïîðÿäêà íåñêîëüêèõ ìåòðîâ íà÷èíàþò îêàçûâàòü âëèÿíèå èíäóêòèâíîñòü è åìêîñòü ïðîâîäîâ. Ïðåîäîëåòü óêàçàííûå íåäîñòàòêè ñìîãëè äèôôåðåíöèàëüíûå ñèñòåìû. Íà Ðèñ. Ï2.3 ïðèâåäåíà ïðèíöèïèàëüíàÿ ñõåìà ðåàëèçàöèè äèôôåðåíöèàëüíîé ïåðåäà÷è äàííûõ. Äëÿ áàëàíñíîé äèôôåðåíöèàëüíîé ïåðåäà÷è äàííûõ èñïîëüçóåòñÿ ïàðà ïðîâîäîâ. Íà ïðèåìíîì êîíöå ëèíèè âû÷èñëÿåòñÿ ðàçíîñòü ìåæäó ñèãíàëàìè. Çàìåòèì, ÷òî òàêîé ñïîñîá ïåðåäà÷è äàííûõ ïðèãîäåí íå òîëüêî äëÿ öèôðîâûõ, íî è äëÿ àíàëîãîâûõ ëèíèé ïåðåäà÷è. ßñíî, ÷òî ïðè äèôôåðåíöèàëüíîé ïåðåäà÷å óäàåòñÿ â çíà÷èòåëüíîé ìåðå ïîäàâèòü ñèíôàçíóþ ïîìåõó. Îòñþäà ñëåäóåò îñíîâíîå äîñòîèíñòâî äèôôåðåíöèàëüíûõ ïðîòîêîëîâ ïåðåäà÷è — âûñîêàÿ ïîìåõîóñòîé÷èâîñòü. Íåäàðîì îäèí èç ñàìûõ ðàñïðîñòðàíåííûõ ïðîòîêîëîâ â ïðîìûøëåííûõ êîìïüþòåðàõ RS-485 ïîñòðîåí ïî äèôôåðåíöèàëüíîé ñõåìå. Íåäîñòàòêîì äèôôåðåíöèàëüíûõ ñõåì ÿâëÿåòñÿ èõ îòíîñèòåëüíî âûñîêàÿ ñòîèìîñòü, à òàêæå ñëîæíîñòè ïðè âûïîëíåíèè ïàðíûõ ñîãëàñîâàííûõ êàñêàäîâ ïåðåäàò÷èêîâ è ïðèåìíèêîâ. Ðàññìîòðèì ôèçè÷åñêèå ïàðàìåòðû èíòåðôåéñîâ.  ëèòåðàòóðå ïðèíÿòî ñëåäóþùåå îáîçíà÷åíèå óðîâíåé:
Вход
VCM Линия передачи
VDiff VCM VGND
Ðèñ. Ï2.3. Äèôôåðåíöèàëüíûé èíòåðôåéñ.
— 541 —
Дифференциальный приемник
Выход
ALT'P2182+
Дифференциальный передатчик
Ïðèëîæåíèÿ 4.5…5.5 B V CC VCC –0.2
0.7x V CC
2.5
0.3xVCC
4.5…5.5 B V CC
4.5…5.5 B V OH
V OH
3
V IH
V IH
Vt
V IL
3.0…3.6 B V CC 2.4
V OH
2.0
V IH
1.5
Vt
0.8
V IL
0.4
V OL
2.4
V OH
2.0
V IH
1.5
Vt
2.3 …2.7 B V CC V OH VCC –0.2 0.7xVCC 1.25
V OL
0.5
5
V OH
0 GND 5B CMOS
0
GND 5B TTL
V IH Vt
V IL V IL 0.8 0.2xV CC V OL 0.4 V OL 0.2 0 GND 0 GND 2.5V CMOS LVTTL ~ 3.3B CMOS
V OH
2.4 1.6 1.5 1.4 0.6 0
2.1 V IH 1.62 Vt 1.55 1.47 V IL 1.1 1 V OL
GND ETL
V IH V V ILt V OL
BTL/FB+
V OH 1.5 V OH V 1.2 1.05 IH V Vref 0.85 IH 1 V V 0.8 t, ref 0.95 V IL 0.75 V IL V OL 0.55 0.4 V OL 0 0 GND GND GTL GTL+/GTLP
Vt
0
0 GND
V IL
ALT'P2183
–3
–5
V OL
TIA/EIA232F (RS232)
Ðèñ. Ï2.4. Óðîâíè ñèãíàëîâ â îäíîïðîâîäíûõ èíòåðôåéñàõ
VIH — âõîäíîå íàïðÿæåíèå ÂÛÑÎKÎÃÎ óðîâíÿ (ëîãè÷åñêîé åäèíèöû); VIL — âõîäíîå íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ (ëîãè÷åñêîãî íóëÿ); VOH — âûõîäíîå íàïðÿæåíèå ÂÛÑÎKÎÃÎ óðîâíÿ (ëîãè÷åñêîé åäèíèöû); VOL — âûõîäíîå íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ (ëîãè÷åñêîãî íóëÿ). Íà Ðèñ. Ï2.4 ïðèâåäåíû ëîãè÷åñêèå óðîâíè äëÿ îäíîïðîâîäíûõ èíòåðôåéñîâ, à íà Ðèñ. Ï2.5 — äëÿ äèôôåðåíöèàëüíûõ. Äàëåå ìû ðàññìîòðèì íåñêîëüêî ñîâðåìåííûõ èíòåðôåéñîâ. Èíòåðôåéñ TIA/EIA-644 (LVDS — Low Voltage Differential Signaling) èñïîëüçóåòñÿ â ñêîðîñòíûõ ñèñòåìàõ ïåðåäà÷è äàííûõ. Èíòåðôåéñ LVDS èñïîëüçóåò äèôôåðåíöèàëüíóþ ïåðåäà÷ó äàííûõ ñ äîâîëüíî íèçêèìè óðîâíÿìè ñèãíàëîâ. Ðàçíîñòü ñèãíàëîâ ñîñòàâëÿåò 300 ìÂ, ëèíèè íàãðóæàþòñÿ ñîïðîòèâëåíèåì 100 Îì. Âûõîäíîé òîê ïåðåäàò÷èêà ñîñòàâëÿåò îò 2.47 äî 4.54 ìÀ. Èíòåðôåéñ TIA/EIA-644 îáëàäàåò ëó÷øèìè õàðàêòåðèñòèêàìè ïîòðåáëåíèÿ ïî ñðàâíåíèþ ñ TIA/EIA-422 è ìîæåò ñëóæèòü åãî çàìåíîé â íîâûõ ðàçðàáîòêàõ. Ìàêñèìàëüíàÿ ñêîðîñòü ïåðåäà÷è äàííûõ ñîñòàâëÿåò 655 Ìáèò/ñ. Äîñòîèíñòâî äàííîãî èíòåðôåéñà — ïðååìñòâåííîñòü ÈÑ ïðèåìîïåðåäàò÷èêîâ ïî ðàçâîäêå ñ äðàéâåðàìè õîðîøî èçâåñò-
— 542 —
Ïðèëîæåíèÿ 4.5…5.5 B или 3.0…3.6 B VCCe
V DD V DDQ .
5B
VDDQ+10% V DD V DDQ .
2.5 V
Cross over area
VDiff 1.03
1.3
GND
SSTL_3
0
VOH
2.4
0.265
USB
VOH VIH VIL
1.1 0.9 0.5 + 0.2adj
*S400
GND
SSTL_2
1.5 + 0.2 adj
VDiff
0.523 0
Common mode Voltge
VOL+0.06/–0.14
0.2
Cross over area
0.8
Class I :0.68 Class II:0.49
Cross over area
VDiff 0.35
3.3
Vref V IL
3.19
VOL
3.3 2.3…2.7 В
1.7
VOL + 0.2
VOH V IH
VDDQ+10% VOH +0.14/–0.06 2.0
IEEE1394
0
VOL
1.32 1.2 1.25 1.15 1.07
VOH VIH VIL Vt VOL
.
1.1 Class I :0.9 Class II:0.7
VOH+ 0.2 Class I :1.82 Class II:2.01
.
Class I : 2.1 Class II: 2.3 1.9 VDiff 0.4
4.13 4.1
0
GND
CML *)
GND
1.9 1.8 1.7
V IH Vt V IL
0.3
VOL
0
GND
0
GND
PECL**) ECL **)
TIA/EIA644 (RS644) RS422 /485 LVDS 0
–1.025
GND
–1.165 –1.475
VOH VIH V IL
–1.620
VOL
ALT'P2184
3.3 B
4.5…5.5 В или 3.0…3.6 В VCCe
–2
Ðèñ.Ï2.5. Óðîâíè ñèãíàëîâ â äâóõïðîâîäíûõ èíòåðôåéñàõ
íûõ è ïðèìåíÿåìûõ èíòåðôåéñîâ RS-422 è RS-485. Äàííûé ïîäõîä ïîçâîëÿåò èñïîëüçîâàòü íîâûå èíòåðôåéñû â óæå ðàçðàáîòàííûõ ïëàòàõ [5], ÷òî îáëåã÷àåò ïåðåõîä íà íîâóþ ýëåìåíòíóþ áàçó. Èíòåðôåéñ LVDS ïîääåðæèâàþò ìíîãèå ñîâðåìåííûå ÏËÈÑ, òàêèå êàê APEX ôèðìû «Altera», Virtex ôèðìû «Xilinx» è ðÿä äðóãèõ. Òèïè÷íûìè ïðåäñòàâèòåëÿìè äðàéâåðîâ ýòîãî èíòåðôåéñà ÿâëÿþòñÿ ÈÑ SN65LVDS31/32, SN65LVDS179 ôèðìû «Texas Instruments». Ïî ýëåêòðè÷åñêèì ñâîéñòâàì ê èíòåðôåéñó LVDS ïðèìûêàåò èíòåðôåéñ LVDM. Ýòîò ïðîòîêîë ïîääåðæèâàþò ÈÑ SN65LVDM176, SN65LVDM050. Ïðè ïðîåêòèðîâàíèè îäíîïðîâîäíûõ èíòåðôåéñîâ îäíîé èç öåíòðàëüíûõ ïðîáëåì ÿâëÿåòñÿ ñîïðÿæåíèå ðàçëè÷íûõ óñòðîéñòâ ñ îáúåäèíèòåëüíîé èëè êðîññ-ïëàòîé (backplane systems), îñîáåííî åñëè òðåáóåòñÿ «ãîðÿ÷àÿ çàìåíà» óçëîâ. Kàê ïðàâèëî, íà îáúåäèíèòåëüíîé ïëàòå ïðèíÿòû åäèíûå óðîâíè ñèãíàëîâ, è çàäà÷à ðàçðàáîò÷èêîâ ïåðèôåðèéíûõ ïëàò ñîñòîèò â ïðàâèëüíîì âûáîðå ñðåäñòâ ñîïðÿæåíèÿ. Ñëåäóåò çàìåòèòü, ÷òî çà äîëãóþ èñòîðèþ ÒÒË-óðîâíè ñòàëè ñòàíäàðòîì äå-ôàêòî äëÿ îáúåäèíèòåëüíûõ ïëàò è âíóòðèôèðìåííûõ (èëè âíóòðèâåäîìñòâåííûõ) èíòåðôåéñîâ. Ïîýòîìó ïðè ðàçâèòèè ñóùåñòâóþùèõ ñèñòåì è ïðèìåíåíèè íîâîé ýëåìåíòíîé áàçû âîçíèêàåò íåîáõîäèìîñòü â ñîïðÿæåíèè íîâûõ ïëàò ñ îáùåé øèíîé. Äëÿ ýòèõ öåëåé ñóùåñòâóåò öåëûé íàáîð ðåøåíèé.
— 543 —
Ïðèëîæåíèÿ
ALT'P2186+
ALT'P2185+
Kàê èçâåñòíî, êëàññè÷åñêèå ÒÒË- è KÌÎÏ-ñåìåéñòâà ÈÑ îáåñïå÷èâàþò òîê íàãðóçêè äî 24 ìÀ ïðè ìèíèìàëüíîì èìïåäàíñå ëèíèè 50 Îì. Ñ ïîÿâëåíèåì ÁèKÌÎÏ-òåõíîëîãèè ñòàëî âîçìîæíûì äîñòèãíóòü âûõîäíîãî òîêà — 32/64 ìÀ è ðàáîòû íà ëèíèþ ñ èìïåäàíñîì 25 Îì. Äëÿ ýòèõ öåëåé ïðèñïîñîáëåíî ñåìåéñòâî ÈÑ SN74ABT25xxx. Äàííûå ìèêðîñõåìû ìîãóò áûòü òàêæå èñïîëüçîâàíû â ñèñòåìàõ òàê íàçûâàåìîé «ãîðÿ÷åé çàìåíû» ìîäóëåé, ñúåìíûå ìîäóëè ìîãóò ïîäêëþ÷àòüñÿ èëè îòêëþ÷àòüñÿ ïî õîäó ðàáîòû ïðèáîðà. Ïðè ïðîåêòèðîâàíèè ïîäêëþ÷àåìûõ ìîäóëåé íåîáõîäèìî âûïîëíèòü íåñêîëüêî òðåáîâàíèé, êîòîðûå, âî-ïåðâûõ, ïðåäóïðåäÿò ïîëîìêó ìîäóëÿ ïðè ïîäêëþ÷åíèè ê ðàáîòàþùåé ñèñòåìå è, âî-âòîðûõ, íå ïðèâåäóò ê ñáîÿì â ðàáîòå ñèñòåìû. Èíòåðôåéñ ìåæäó ïîäêëþ÷àåìûì è îñíîâíûì ìîäóëÿìè ñîñòîèò èç øèí ïèòàíèÿ, çåìëè è ñèãíàëüíûõ øèí. Ìîäåëü ìèêðîñõåìû, ïîäêëþ÷àåìîé ê ñèñòåìå, ïîêàçàíà íà Ðèñ. Ï2.6. Çàùèòà âõîäîâ è âûõîäîâ ìèêðîñõåì îñóùåñòâëÿåòñÿ ñ èñïîëüçîâàíèåì äèîäíûõ êëþ÷åé. Äèîä D1 çàùèùàåò ìèêðîñõåìó îò ýëåêòðîñòàòè÷åñêèõ ðàçðÿäîâ, îãðàíè÷èâàÿ íàïðÿæåíèå íà âõîäå ìèêðîñõåìû. Ýòîãî äèîäà íåò â ìèêðîñõåìàõ ñåìåéñòâ ÒÒË, ÝÑË è ÁèKÌÎÏ. Äèîä D2 — ïàðàVCC çèòíûé äèîä, ïîÿâëåíèå êîòîðîãî D1 D3 Внутренняя Вход Выход ïðåäîïðåäåëåíî ñòðóêòóðîé âõîäà схема D2 D4 ìèêðîñõåì.  öèôðîâûõ ìèêðîñõåGND ìàõ äîïîëíèòåëüíî ê ýòîìó äèîäó ñòàâÿò åùå îäèí ñ ìåíüøèì ñîïðîÐèñ. Ï2.6. Äèîäû íà âõîäå è âûõîäå ÈÑ òèâëåíèåì äëÿ òîãî, ÷òîáû îãðàíè÷èâàòü ïèêè íàïðÿæåíèÿ, ìåíüøèå VDD óðîâíÿ ëîãè÷åñêîãî íóëÿ. Ýòîò äèîä òàêæå çàùèùàåò âõîä ìèêðîñõåìû îò D1 В выходную ýëåêòðîñòàòè÷åñêîãî ðàçðÿäà. Î÷åíü цепь D2 ÷àñòî äëÿ çàùèòû âõîäîâ öèôðîâûõ VT1 ñõåì ïðèìåíÿþò äèîäíóþ ñáîðêó BAV99. Íåäàâíî â ñåòè îáíàðóæèëñÿ ñàéò, öåëèêîì ïîñâÿùåííûé ýòîìó Ðèñ. Ï2.7. Öåïü, îòêëþ÷àþùàÿ âûõîä îáúåêòó (www.bav99.al.ru). ïðè ïîíèæåííîì íàïðÿÄëÿ çàùèòû âûõîäîâ èñïîëüçóþòæåíèè ïèòàíèÿ â ìèêðîñÿ äèîäû D3 è D4. Äèîä D3 èñïîëüçóñõåìàõ ÁèKÌÎÏ åòñÿ â ìèêðîñõåìàõ KÌÎÏ äëÿ çà-
— 544 —
Ïðèëîæåíèÿ ùèòû îò ýëåêòðîñòàòè÷åñêèõ ðàçðÿVo [B] äîâ. Äèîä D4 çàùèùàåò îò íàïðÿæå- 4 íèÿ íà âûõîäå, êîòîðîå ìåíüøå óðîâВыходной сигнал 3 ВЫСОКОГО уровня íÿ ëîãè÷åñêîãî íóëÿ. Ioh Ïðè ðàçðàáîòêå ïîäêëþ÷àåìûõ 2 ìîäóëåé ëó÷øå èñïîëüçîâàòü ìèêðîВыходной сигнал 1 НИЗКОГО уровня Is ñõåìû ÁèKÌÎÏ, ïîñêîëüêó îíè âûIol Io [мА] ãîäíî îòëè÷àþòñÿ îò ïðî÷èõ òåì, ÷òî 0 Ios èìåþò ñõåìó (Ðèñ. Ï2.7), êîòîðàÿ Ðèñ. Ï2.8. Òîê êîðîòêîãî çàìûêàíèÿ äåðæèò âûõîä ìèêðîñõåìû â ñîñòîÿïðè êîíôëèêòàõ íà øèíå íèè âûñîêîãî èìïåäàíñà â ìîìåíò âêëþ÷åíèÿ ìèêðîñõåìû. Ýòà öåïü ñëåäèò çà íàïðÿæåíèåì ïèòàíèÿ è ñîñòîèò èç äâóõ äèîäîâ D1 è D2 è òðàíçèñòîðà VT1, íà áàçó êîòîðîãî ïîäàåòñÿ íàïðÿæåíèå. Ïðè íàïðÿæåíèè ïèòàíèÿ, êîòîðîå ìåíüøå óñòàíîâëåííîãî (íàïðèìåð äëÿ ñåðèè ABT/BCT VCOFF ~ 2.5 Â, äëÿ LVT VCOFF ~ 1.8 Â), âûõîä ýòîé öåïè ïåðåõîäèò â ñîñòîÿíèå ëîãè÷åñêîé åäèíèöû. Ïðè ýòîì îí îòêëþ÷àåò ñèãíàë íà âûõîäå ìèêðîñõåìû, íåçàâèñèìî îò ñèãíàëà, êîòîðûé ïðèñóòñòâóåò íà âõîäå. Ýòî ñâîéñòâî ìèêðîñõåì ÁèKÌÎÏ ãàðàíòèðóåò, ÷òî ïîâåäåíèå ñõåìû ïðåäñêàçóåìî äàæå ïðè î÷åíü íèçêîì íàïðÿæåíèè ïèòàíèÿ. Ïðè ãîðÿ÷åì ïîäêëþ÷åíèè ìîäóëÿ ïîâåäåíèå ñèñòåìû áóäåò ïðåäñêàçóåìî, åñëè ñîáëþäàþòñÿ ïî êðàéíåé ìåðå äâà óñëîâèÿ: — íà ðàçúåìå åñòü îäèí èëè íåñêîëüêî êîíòàêòîâ çåìëè, óäëèíåííûõ îòíîñèòåëüíî äðóãèõ êîíòàêòîâ; — èíòåðôåéñ ñîñòîèò òîëüêî èç áèïîëÿðíûõ èëè ÁèKÌÎÏ-ìèêðîñõåì ñ òðèñòàáèëüíûìè âûõîäàìè èëè ñ âûõîäàìè ñ îòêðûòûì êîëëåêòîðîì. Ïðîáëåìà êîíôëèêòîâ íà øèíå ñòîèò îñîáåííî îñòðî, êîãäà âñòðå÷àþòñÿ âûõîäíûå ñèãíàëû ðàçíûõ óðîâíåé — ÍÈÇKÎÃÎ è ÂÛÑÎKÎÃÎ. Íà Ðèñ. Ï2.8 ïîêàçàí ýòîò ïðîöåññ. Òîê, êîòîðûé âîçíèêàåò â ðåçóëüòàòå êîíôëèêòà, äîñòèãàåò 120 ìÀ, è â ýòîé áîðüáå âûæèâàåò òà ìèêðîñõåìà, êîòîðàÿ èìååò íà âûõîäå ÍÈÇKÈÉ óðîâåíü. Ìèêðîñõåìà ñ ÂÛÑÎKÈÌ óðîâíåì íà âûõîäå ðàáîòàåò â ðåæèìå êîðîòêîãî çàìûêàíèÿ è ñãîðàåò. Äëÿ òîãî, ÷òîáû èçáåæàòü òàêîãî êîíôëèêòà, íóæíà äîïîëíèòåëüíàÿ ñõåìà, êîòîðàÿ âî âðåìÿ âêëþ÷åíèÿ ïèòàíèÿ äåðæàëà áû âûõîäû â ñîñòîÿíèè âûñîêîãî èìïåäàíñà. Îñíîâíûì ýëåìåíòîì ýòîé ñõåìû ìîæåò áûòü ÈÑ TLC7705. Òàêèå ìèêðîñõåìû èñïîëüçóþòñÿ äëÿ ãåíåðàöèè ñèãíàëà RESET ïðè âêëþ÷åíèè
— 545 —
Ïðèëîæåíèÿ TLC7705 +5B
SENSE ———— — RESIN
7 3
2 C7
COMP S S < Vt Vt
1
>1 CX 1 2
CONTROL 1
Микропроцессор и управляющая логика 1
2 1 1
Z3
————— RESET +5B
RFSFT
3 G1 Управляющие сигналы
10к
DIR
G2
1
G
SN74AC32
DIR
&
G
SN74F00
Шины данных
SN74ABT245
SN74ABT245 188+
SN74ABT541
Ðèñ. Ï2.9. Ìîíèòîðèíã êîíôëèêòîâ íà øèíå
ïðèáîðà.  íàøåì ñëó÷àå âûâîäû ýòîé ìèêðîñõåìû ïîäêëþ÷àþòñÿ ê âõîäàì ðàçðåøåíèÿ øèííûõ ôîðìèðîâàòåëåé. Âî âðåìÿ èíèöèàëèçàöèè èëè âêëþ÷åíèÿ ìîäóëÿ ñèãíàë RESET ïåðåâîäèò âûõîäû ìèêðîñõåì â òðåòüå ñîñòîÿíèå. Ïðè ñîçäàíèè òàêèõ ñõåì óäîáíî èñïîëüçîâàòü ìèêðîñõåìû, êîòîðûå èìåþò äâà âõîäà ENABLE (íàïðèìåð SN74ABT541). Ýòî ðåøåíèå ïîêàçàíî íà Ðèñ. Ï2.9. Ñóùåñòâóþò øèííûå ôîðìèðîâàòåëè, êîòîðûå óæå ñîäåðæàò â ñåáå âñå íåîáõîäèìûå äëÿ çàùèòû îò øèííûõ êîíôëèêòîâ êîìïîíåíòû — êîììóòàòîðû è ðåçèñòîðû. Ýòè ìèêðîñõåìû âûïóñêàþòñÿ â äâóõ ñåðèÿõ: ETL (Enhanced Transceiver Logic, ñåðèÿ SN74ABTE) è BTL (Backplane Transceiver Logic, ñåðèÿ SN74FB). Ìèêðîñõåìû ñåðèè ETL èìåþò äîïîëíèòåëüíûé âûâîä äëÿ ïîäêëþ÷åíèÿ íàïðÿæåíèÿ çàðÿäêè âûõîäíîé åìêîñòè ìèêðîñõåìû, îáû÷íî íàçûâàåìûé VCCBIAS. Îí ïèòàåò ñõåìó, çàðÿæàþùóþ êîíäåíñàòîð âî âðåìÿ âêëþ÷åíèÿ ìîäóëÿ. Íà Ðèñ. Ï2.10 ïîêàçàíà ñõåìà èíòåðôåéñà ñ èñïîëüçîâàíèåì ìèêðîñõåìû ETL.  ìîìåíò âêëþ÷åíèÿ ìîäóëÿ ïîñëå ïîäñîåäèíåíèÿ êîíòàêòîâ VCC1 è GND íà ìèêðîñõåìå U3 ïîÿâëÿåòñÿ íàïðÿæåíèå VCCBIAS. Îäíîâðåìåííî âêëþ÷àþòñÿ ìèêðîñõåìû U2 è U1 è ñèãíàëîì OE îòêëþ÷àþò âûõîäû øèííîãî ôîðìèðîâàòåëÿ îò øèíû.
— 546 —
Ïðèëîæåíèÿ
Фильтр
VCC1 VCC2
C1 0.1
U1 VCC TLC7705 SENSE n R2 10к S
———— — RESIN Ct
Ct
COMP B B
CONTROL
R3 100
1 GND
Z1 Z2 1 1
Z3
————— RESET RESET
U2 SN74AC32 VCC 1
3
U3 SN74ABTE16245
Направление
DIR ALT'P2189+
Разрешение
VCC VCC OE
Шина данных
Ðèñ. Ï2.10. Ñõåìà èíòåðôåéñà ñ èñïîëüçîâàíèåì ìèêðîñõåì ñåðèè ETL
ALT'P2190+
VCC2 Áðîñêè íàïðÿæåíèÿ â öåïÿõ ïèòàVT íèÿ ñèñòåìû ïðè ïîäêëþ÷åíèè ìîäóëÿ Cd 0.01 ïîÿâëÿþòñÿ òî÷íî òàê æå, êàê áðîñêè â Rl Cb R1 ñèãíàëüíûõ öåïÿõ. Ïðè ýòîì âåëè÷èíà D 10к 1N4148 GND çàðÿæàåìîé åìêîñòè êîëåáëåòñÿ îò äåñÿòêîâ äî ñîòåí ìêÔ è çàâèñèò îò åìêîñòè áëîêèðóþùèõ êîíäåíñàòîðîâ íà Ðèñ. Ï2.11. Ñõåìà ìåäëåííîãî âêëþïîäêëþ÷àåìîé ïëàòå. Îäèí èç ïóòåé ê ÷åíèÿ ìîäóëÿ ñ èñïîëüîãðàíè÷åíèþ ñêà÷êà íàïðÿæåíèÿ — çîâàíèåì òðàíçèñòîðà âêëþ÷åíèå â öåïü ïèòàíèÿ êîììóòàòîðà, êîòîðûé ìåäëåííî âêëþ÷àåòñÿ. Íà Ðèñ. Ï2.11 ïðåäëîæåíà ñõåìà, â êîòîðîé ðîëü êîììóòàòîðà èãðàåò p-ÌÎÏòðàíçèñòîð VT. RC-öåïî÷êà îáåñïå÷èâàåò ìåäëåííîå èçìåíåíèå ñèãíàëà íà áàçå òðàíçèñòîðà. Äèîä D áûñòðî ðàçðÿæàåò êîíäåíñàòîð ïîñëå òîãî, êàê ìîäóëü áûë âûêëþ÷åí. Ïðåäïîëàãàåòñÿ, ÷òî òðàíçèñòîð èìååò ìàëîå ñîïðîòèâëåíèå âî âêëþ÷åííîì ñîñòîÿíèè. Ïðè ðàáîòå ðàññåèâàåìàÿ ìîùíîñòü íà òðàíçèñòîðå íåâåëèêà èç-çà íåáîëüøîãî ïàäåíèÿ íàïðÿæåíèÿ. Ïðè íåîáõîäèìîñòè ìîæíî ïàðàëëåëüíî âêëþ÷àòü íåñêîëüêî òðàíçèñòîðîâ.
— 547 —
Ïðèëîæåíèÿ VT1 IRF9Z14
L1 R1 100 мкГн 1
V1 = 20...40 B
C2 1.0
C1 47.0
R5 10к
D1 1N4148
U1 TL5001 VCC
C3 0.1 C4 1.0 C5 470
R4 C6 3к 0.027
RT DTC 1 2 SCP
Comp –
C7 220
Z2
R6 2.2к
R7 43 D4 IRF 6CWQ0BF
C8 1200
+
5 B, 5 A C9 220.0
R8 7.5k 1% R9 1.87k 1%
R10 820 C10 0.01 0B
VT3 2N2907
Z1 ALT'P2191+
R2 43к R3 43к
VT2 2N2222 D2 1N4148 D3 1N4148
L2 27 мкГн
Ðèñ. Ï2.12. Äåöåíòðàëèçîâàííûé èñòî÷íèê ïèòàíèÿ
 ïîäêëþ÷àåìûõ ìîäóëÿõ óäîáíî èñïîëüçîâàòü ñîáñòâåííûå èñòî÷íèêè ïèòàíèÿ. Íà Ðèñ. Ï2.12 ïðèâåäåíà ñõåìà èñòî÷íèêà ïèòàíèÿ, êîòîðûé ïîëó÷àåò èç ñèñòåìû îò 10 äî 40  è ïðåîáðàçóåò èõ èìïóëüñíûì ñïîñîáîì â 5 Â. Ñõåìà íå äàåò áðîñêà íàïðÿæåíèÿ ïðè âêëþ÷åíèè. Kàê èçâåñòíî, çíà÷èòåëüíàÿ ìàññà ÈÑ âûïóñêàåòñÿ ïî KÌÎÏ-òåõíîëîãèè, îáåñïå÷èâàþùåé âñå áîëåå âûñîêîå áûñòðîäåéñòâèå, ìåíüøåå ýíåðãîïîòðåáëåíèå è áîëüøóþ èíòåãðàöèþ. Âðåìÿ çàäåðæêè ðàñïðîñòðàíåíèÿ ñèãíàëà íà âåíòèëü ó KÌÎÏ ÈÑ ñòàëî ñîïîñòàâèìî ñ ëó÷øèìè ÈÑ ÝÑË. Ñ óìåíüøåíèåì ïðîåêòíûõ íîðì, åñòåñòâåííî, ñíèæàåòñÿ è íàïðÿæåíèå ïèòàíèÿ ÈÑ, ðîñò áûñòðîäåéñòâèÿ ïðèâîäèò ê íåîáõîäèìîñòè ðàçðàáîòêè «ëàçååê», íåäàðîì çà ïîñëåäíèå íåñêîëüêî ëåò ïîÿâèëîñü íåñêîëüêî äåñÿòêîâ íîâûõ ïðîòîêîëîâ ïåðåäà÷è äàííûõ. Îäíèì èç íîâûõ èíòåðôåéñîâ ÿâëÿåòñÿ èíòåðôåéñ BTL (Backplane Transfer Logic). Ôàêòè÷åñêè BTL ÿâëÿåòñÿ ôèçè÷åñêîé ðåàëèçàöèåé ïðîòîêîëà Futurebus. Ðàññìàòðèâàÿ â ïðîøëîì ðàçäåëå ïðîáëåìó ñîïðÿæåíèÿ ñ îáùåé øèíîé, ìû óïîìÿíóëè î òîì, ÷òî íàèëó÷øèì ðåøåíèåì äëÿ äðàéâåðîâ ÿâëÿþòñÿ áèïîëÿðíûå èëè ÁèKÌÎÏ-ñõåìû. Îäíàêî â ñëó÷àå, êîãäà â ñèñòåìå èñïîëüçóþòñÿ íàïðÿæåíèÿ ïèòàíèÿ 5 è 3.3 Â, áûâàåò ñëîæíî îáåñïå÷èòü êîððåêòíîå ñîïðÿæåíèå ëîãè÷åñêèõ óðîâíåé èç-çà çíà÷èòåëüíîãî ðàçìàõà íàïðÿæåíèé, îñîáåííî ïðè äîñòàòî÷íî áîëüøèõ òîêàõ íàãðóçêè. Øèíà ñ ïîíèæåí-
— 548 —
íûì ðàçìàõîì íàïðÿæåíèÿ (voltage 1.2 B Приемник swing) ïîçâîëÿåò ðåøèòü òàêèå ïðîáëåìû.  ÷àñòíîñòè, èíòåðôåéñ BTL R=Z Передатчик ðåàëèçóåò øèíó ñ îòêðûòûì êîëëåêòîVREF = 0.8 B ðîì. Ïîääåðæêó ýòîãî èíòåðôåéñà âûïîëíÿåò ñåìåéñòâî ÈÑ SN74FBxxx. Èíòåðôåéñ BTL ïîçâîëÿåò ðàáîòàòü ñ ðàçìàõîì íàïðÿæåíèÿ 1.1 Â. Óðîâåíü ëîãè÷åñêîãî íóëÿ ðàâåí 1 Â, ëîãè÷åñ- Ðèñ. Ï2.13. Ïðèíöèïèàëüíàÿ ñõåìà êàÿ åäèíèöà — 2.1 Â. Âåëè÷èíà íàãðóèíòåðôåéñà GTL çî÷íîãî ðåçèñòîðà ðàâíà õàðàêòåðèñòè÷åñêîìó ñîïðîòèâëåíèþ ëèíèè, ÷òî îáåñïå÷èâàåò êîððåêòíîå ñîïðÿæåíèå. Äëÿ àâòîìàòè÷åñêîãî îïðåäåëåíèÿ ëîãè÷åñêèõ óðîâíåé èñïîëüçóåòñÿ äèôôåðåíöèàëüíûé âõîäíîé êàñêàä, îïîðíîå íàïðÿæåíèå êîòîðîãî (1.55 Â) ðàâíî ñåðåäèíå ðàçìàõà íàïðÿæåíèé ìåæäó ÂÛÑÎKÈÌ è ÍÈÇKÈÌ óðîâíÿìè. Îñíîâíîå íàçíà÷åíèå èíòåðôåéñà — òåëåêîììóíèêàöèîííîå îáîðóäîâàíèå, ãäå âàæíûì ÿâëÿåòñÿ âîçìîæíîñòü «ãîðÿ÷åé çàìåíû» ìîäóëåé. K äðóãèì îñîáåííîñòÿì èíòåðôåéñà ñëåäóåò îòíåñòè íèçêèé óðîâåíü ïîìåõ ïðè ïåðåêëþ÷åíèè, ìàêñèìàëüíàÿ äëèòåëüíîñòü ôðîíòà — 2 íñ. K èíòåðôåéñó BTL ïî èäåîëîãèè ïðèìûêàåò èíòåðôåéñ GTL (Gunning Transceiver Logic). Åãî ïîääåðæèâàþò ÈÑ ñåìåéñòâà SN74GTLxxx. Ïðèíöèïèàëüíàÿ ñõåìà èíòåðôåéñà GTL ïðèâåäåíà íà Ðèñ. Ï2.13. Âñëåäñòâèå îòñóòñòâèÿ äèîäîâ íà îòêðûòîì âûõîäå óðîâåíü ëîãè÷åñêîãî íóëÿ ðàâåí 0.4 Â, óðîâåíü ëîãè÷åñêîé åäèíèöû ðàâåí 1.2 Â, òàêèì îáðàçîì, ðàçìàõ íàïðÿæåíèÿ ñîñòàâëÿåò âñåãî ëèøü 0.8 Â. Íàãðóçî÷íàÿ ñïîñîáíîñòü âûõîäà ñîñòàâëÿåò 40 ìÀ, ïîýòîìó ñîïðîòèâëåíèå íàãðóçî÷íîãî ðåçèñòîðà ìîæåò áûòü 0.8 Â/40 ìÀ = 20 Îì. Ïîñêîëüêó ýòî ñîïðîòèâëåíèå ñêëàäûâàåòñÿ èç äâóõ ñîåäèíåííûõ â ïàðàëëåëü ðåçèñòîðîâ íà ïëàòå-èñòî÷íèêå è ïëàòåïðèåìíèêå, ìàêñèìàëüíàÿ ðàññåèâàåìàÿ ìîùíîñòü ñîñòàâëÿåò 16 ìÂò íà âûõîä, ÷òî ïîçâîëÿåò èíòåãðèðîâàòü äðàéâåð GTL â ÁÈÑ.  ÷àñòíîñòè, ÏËÈÑ ñîâðåìåííûõ ñåìåéñòâ [2, 3] ïîääåðæèâàþò èíòåðôåéñ GTL áåç âíåøíèõ äîïîëíèòåëüíûõ ÈÑ. Äàëüíåéøèì ðàçâèòèåì GTL ÿâëÿåòñÿ èíòåðôåéñ GTL+ (Gunning Transceiver Logic Plus), ïîääåðæèâàåìûé ñåìåéñòâîì SN74GTLPxxx. Èíòåðôåéñ GTL+ èìååò äâà ïðèíöèïèàëüíûõ îòëè÷èÿ: îí îïòèìèçèðîâàí ïîä ðàñïðåäåëåííóþ íàãðóçêó è ïîääåðæèâàåò «ãîðÿ÷åå» ïîäêëþ÷åíèå ìîäóëåé. Kðîìå òîãî, äëÿ äàííîãî èíòåðôåéñà õàðàêòåðåí óðîâåíü ëîãè-
— 549 —
ALT'P2 192
Ïðèëîæåíèÿ
Ïðèëîæåíèÿ ÷åñêîãî íóëÿ 0.55 Â, ëîãè÷åñêîé åäèíèöû — 1.5 Â. Çàâèñèìîñòü íàãðóZ0 = 65 Ом RT(min) 40 çî÷íîãî ðåçèñòîðà îò äëèíû ïðîâîäЛиния средней длины íèêà äëÿ èíòåðôåéñà GTL+ ïðèâåäå35 íà íà Ðèñ. Ï2.14.  íàñòîÿùåå âðåìÿ ïîïóëÿðíîñòü 30 èíòåðôåéñîâ GTL è GTL+ ðàñòåò. Èõ èçíà÷àëüíîå ïðåäíàçíà÷åíèå — èí25 Z0 = 50 Ом RT (Min) òåðôåéñ äëÿ íåáîëüøèõ ïëàò, â ÷àñò20 Длинная линия íîñòè, ìåæäó ïðîöåññîðîì è ìîäóëÿìè ïàìÿòè. Èíòåðôåéñ GTL+ èñïîëü15 2.5 3.5 4.5 5.5 6.5 çóåòñÿ â ïðîöåññîðå Intel Pentium Pro Длина линии связи [см] â êà÷åñòâå áóôåðà àäðåñíîé øèíû. Ðèñ. Ï2.14. Çàâèñèìîñòü íàãðóçî÷íîãî Áûñòðîäåéñòâèå ýòèõ èíòåðôåéñîâ ïîðÿäêà 80 ÌÃö. ðåçèñòîðà îò äëèíû ïðîÂî ìíîãèõ ñëó÷àÿõ òàêîãî áûñòðîâîäíèêà äëÿ èíòåðôåéñà äåéñòâèÿ íåäîñòàòî÷íî.  ÷àñòíîñòè, GTL+ òàêòîâàÿ ÷àñòîòà ïîäñèñòåì îáìåíà ìåæäó ïàìÿòüþ è ïðîöåññîðîì â ñîVDDQ VTT âðåìåííûõ âû÷èñëèòåëÿõ äîñòèãàåò RT 25 200 ÌÃö. Äëÿ ðàáîòû íà òàêèõ ÷àñòîRS 25 òàõ èñïîëüçóåòñÿ èíòåðôåéñ SSTL VOUT VIN VREF (Stub Series-Terminated Logic). Ñóùåñòâóþò äâà ñòàíäàðòà, îïðåäåëÿþùèå VSS ðàçíîâèäíîñòè èíòåðôåéñà SSTL. Ýòî ñòàíäàðòû SSTL_3, EIA/JESD8-8, Ðèñ. Ï2.15. Áóôåðíûé êàñêàä SSTL SSTL_2, EIA/JESD8-8. Ñòàíäàðòàìè îïðåäåëÿþòñÿ ñõåìîòåõíèêà è íîìèíàëû íàãðóçî÷íûõ ðåçèñòîðîâ (òåðìèíàòîðîâ). Âîçìîæíû âàðèàíòû ñ ñîãëàñóþùèìè ðåçèñòîðàìè 50 èëè 25 Îì. Íà Ðèñ. Ï2.15 ïðèâåäåí òèïè÷íûé ïðèìåð áóôåðíîãî êàñêàäà SSTL. Kàê ìîæíî çàìåòèòü, âûõîäíîé êàñêàä ïèòàåòñÿ îò îòäåëüíîãî èñòî÷íèêà VDDQ, íàïðÿæåíèå êîòîðîãî íå äîëæíî ïðåâûøàòü íàïðÿæåíèÿ ïèòàíèÿ VDD. Ýòî ïîçâîëÿåò ïîäíÿòü íàïðÿæåíèå VDD äî 3.6  ñ öåëüþ óâåëè÷åíèÿ áûñòðîäåéñòâèÿ. Íàãðóçî÷íàÿ ñïîñîáíîñòü — 20 ìÀ. Îäíèì èç ñóùåñòâåííûõ íîâøåñòâ, ïîÿâèâøèõñÿ â öèôðîâîé òåõíèêå, ÿâëÿþòñÿ ÈÑ, âûïîëíåííûå ïî êîìáèíèðîâàííîé òåõíîëîãèè, ñî÷åòàþùèå äîНагрузочный резистор [Ом]
ALT'P2194+
ALT'P2193+
45
— 550 —
Ïðèëîæåíèÿ ñòîèíñòâà êàê áèïîëÿðíûõ, òàê è KÌÎÏ ÈÑ. Ëîãè÷åñêèå ÈÑ, âûïîëíåííûå ïî òåõíîëîãèè ÁèKÌÎÏ, îáëàäàþò ñëåäóþùèìè âàæíûìè îñîáåííîñòÿìè: • ðàáîòà â ñèñòåìàõ ñî ñìåøàííûì íàïðÿæåíèåì ïèòàíèÿ; • óñòàíîâêà ïî âêëþ÷åíèþ ïèòàíèÿ â íóæíîå ñîñòîÿíèå (ñáðîñ èëè òðåòüå ñîñòîÿíèå, power-up 3-state, power-up reset); • îòêëþ÷åíèå âõîäà (input disable); • óäåðæàíèå øèíû (bus hold). Ðàññìîòðèì ðåàëèçàöèþ ýòèõ ôóíêöèé. Kîðîòêèå èìïóëüñíûå ïîìåõè, èëè «ãëèò÷è» (glitches), ìîãóò ïîÿâëÿòüñÿ â öèôðîâûõ ñõåìàõ èç-çà «ãîðÿ÷åé» çàìåíû ïëàòû â öèôðîâûõ ñèñòåìàõ, à òàêæå â ïðîöåññå âêëþ÷åíèÿ èëè âûêëþ÷åíèÿ ïèòàíèÿ. Ýòè ïîìåõè ìîãóò ïðèâåñòè ê ñáîÿì â ðàáîòå ñèñòåìû. Äëÿ óìåíüøåíèÿ ýòîãî ýôôåêòà èñïîëüçóþò ïåðåâîä âûõîäîâ ÈÑ â òðåòüå ñîñòîÿíèå ïî âêëþ÷åíèþ èëè âûêëþ÷åíèþ ïèòàíèÿ. Íà Ðèñ. Ï2.16 ïðåäñòàâëåíà ñõåìà, ðåàëèçóþùàÿ ýòó ôóíêöèþ. 6
VPUP [B]
IOUTPUT [A]
Входная схема 5
Выходной буфер
2
4
1
IOL
OE
3
0
VCC
2.5 B 2
IOLS
1
–1
VPUP
*
–2
VPUP 2B
0 0
1
2
3
4
5
GND
VCC [B]
а)
б)
ALT'P2195+
* Один диод в сериях LVT(16) и ALVT
Ðèñ. 2.16. Ïåðåâîä âûâîäîâ ÈÑ â òðåòüå ñîñòîÿíèå: à — òîê ïðè âêëþ÷åíèè â òðåòüå ñîñòîÿíèå äëÿ ÀÂÒ â çàâèñèìîñòè îò íàïðÿæåíèÿ ïèòàíèÿ (VCC) è íàïðÿæåíèÿ âêëþ÷åíèÿ (VPUP); á — ñõåìà ïåðåâîäà â Z-ñîñòîÿíèå ïî âêëþ÷åíèþ ïèòàíèÿ
— 551 —
Ïðèëîæåíèÿ
ALT'P2196+
Äàííàÿ ñõåìà ïåðåâîäèò âûõîäû â òðåòüå ñîñòîÿíèå ïðè äîñòèæåíèè óðîâíÿ íàïðÿæåíèÿ ïèòàíèÿ 1.2  äëÿ ñåìåéñòâ LVT, LVT16 è ALVT è 2.1  äëÿ ñåìåéñòâ ABT è MULTIBYTE . Óäåðæàíèå øèíû. Kàê èçâåñòíî, âõîäû KÌÎÏ ÈÑ íå äîëæíû îñòàâàòüñÿ «âèñÿ÷èìè». Âèñÿ÷èå, èëè ïëàâàþùèå, âõîäû (floating inputs) ìîãóò ïðèâåñòè ê âîçðàñòàíèþ òîêà, ïðîòåêàþùåãî ÷åðåç âõîäíûå êàñêàäû, ÷òî ïðèâîäèò ê âîçðàñòàíèþ ïîòðåáëÿåìîé ìîùíîñòè, ïîÿâëåíèþ âûñîêî÷àñòîòíûõ êîëåáàíèé è âûõîäó ìèêðîñõåìû èç ñòðîÿ. Kàê ïðàâèëî, íåèñïîëüçóåìûå âõîäû ñîåäèíÿþò ëèáî ñ çåìëåé, ëèáî ñ íàïðÿæåíèåì ïèòàíèÿ ÷åðåç ïîäñòðàèâàþùèé ðåçèñòîð (pull-up resistor èëè pull-down resistor). Ýòîò ñïîñîá õîðîø ïî÷òè âñåãäà, çà èñêëþ÷åíèåì ñëó÷àåâ, êîãäà èç-çà ýêîíîìèè ìåñòà íåâîçìîæíî óñòàíîâèòü ëèøíèé êîìïîíåíò. Kðîìå òîãî, îáèëèå ïîäñòðàèâàþùèõ ðåçèñòîðîâ ïðèâîäèò ê ïîâûøåíèþ îáùåãî ïîòðåáëåíèÿ ñèñòåìû. Ñåìåéñòâî ABT16 è íèçêîâîëüòВходной контакт íûå ÁèKÌÎÏ ÈÑ èñïîëüçóþò âñòðîåííóþ ñõåìó óäåðæàíèÿ øèíû (bus hold circuits) (Ðèñ. Ï2.17 è Ï2.18), êîòîðàÿ íå òðåáóåò âíåøíèõ ðåçèñòîðîâ è ïîçâîëÿåò ñýêîíîìèòü ìåñòî íà ïëàòå. Ñõåìà óäåðæàíèÿ øèíû õðàíèò Схема удержания входа ïðåäûäóùåå ñîñòîÿíèå âõîäà, åñëè â Ðèñ. Ï2.17. Âñòðîåííàÿ ñõåìà ìîìåíò âêëþ÷åíèÿ îí îêàçûâàåòñÿ â óäåðæàíèÿ øèíû ïëàâàþùåì ñîñòîÿíèè. Ñõåìà çàïðåùåíèÿ âõîäà (input disable circuit) èñïîëüçóåòñÿ â ñåìåéñòâàõ ABT è MULTIBYTE äëÿ îáåñïå÷åíèÿ ðåøåíèÿ ïðîáëåìû ïëàâàþùèõ âõîäîâ â îòëè÷èå îò ñõåìû óäåðæàíèÿ øèíû.  ýòîì ñëó÷àå âõîäíûå öåïè âåäóò ñåáÿ êàê âûõîä, íàõîäÿùèéñÿ â òðåòüåì ñîñòîÿíèè. Ïîäñòðàèâàþùèé ðåçèñòîð íå òðåáóåòñÿ. Äàííàÿ ñõåìà ðåàëèçîâàíà â áóôåðàõ è ïðèåìîïåðåäàò÷èêàõ ñ ëèíèè è îòñóòñòâóåò ó ðåãèñòðîâ è òðèããåðîâ. Ñâîéñòâî ñáðîñà ïî âêëþ÷åíèþ ïèòàíèÿ (power-up reset) èñïîëüçóåòñÿ â ðåãèñòðàõ è òðèããåðàõ. Kàê èçâåñòíî, äëÿ ïðåäâàðèòåëüíîãî ñáðîñà êëàññè÷åñêèõ öèôðîâûõ ÈÑ, êàê ïðàâèëî, ïðèìåíÿþòñÿ èíòåãðèðóþùèå èëè äèôôåðåíöèðóþùèå RÑ-öåïî÷êè, êîòîðûå, êîíå÷íî æå, çàíèìàþò ìåñòî íà ïëàòå, íî íå âñåãäà îáåñïå÷èâàþò ñòàáèëüíîñòü ôóíêöèîíèðîâàíèÿ. Ãàðàíòèðîâàíî íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ ïîñëå ñáðîñà VRST = 0.55 Â.
— 552 —
Ïðèëîæåíèÿ
Диод Шотки блокирует протекание тока к VCC
К схеме удержания шины
RS
Схема удержания шины для семейства LVT(16)/ALVT
Входной каскад LVT(16) и ALVT
ALT'P2197+
Вход
Ðèñ. Ï2.18. Âñòðîåííûå ñõåìû óäåðæàíèÿ ñõåìû
ALT'P2198+
Âûòåêàþùèé òîê IOFF ïðè ñíÿòîì íàïðÿæåíèè ïèòàíèÿ îãðàíè÷åí 100 ìA. Äàííàÿ îñîáåííîñòü ïîçâîëÿåò ðåàëèçîâàòü ñõåìû, èìåþùèå âîçìîæíîñòü ïåðåõîäà â ñïÿùèé ðåæèì. Äëÿ ñîâìåñòèìîñòè ñ òðàäèöèîííûìè ñåðèÿìè ÈÑ íîâûå ñåìåéñòâà èìåþò âõîäû è âûõîäû, ïîääåðæèâàþùèå 5-âîëüòîâûå ëîãè÷åñêèå óðîâíè. Äàëåå ìû ðàññìîòðèì ýòó îñîáåííîñòü íåñêîëüêî ïîäðîáíåå. Çàìåòèì, ÷òî ÷èñòî áèïîëÿðíûå ñõåìû íå áîÿòñÿ ïîâûøåíèÿ óðîâíåé äî 5 Â, äëÿ KÌÎÏ-ñõåì èñïîëüçóþòñÿ äèîäû äëÿ çàùèòû. Íà Ðèñ. Ï2.19 ïðåäñòàâëåíû âûõîäíûå êàñêàäû ìèêðîñõåì ñåìåéñòâ LVT è ALVT. Äèîäû Øîòòêè çàùèùàþò âåðõíèé ïî ñõåìå PMOS-òðàíVCC çèñòîð, åñëè âûõîäíîå íàïðÿæåíèå ïðåâûøàåò íàïðÿæåíèå ïèòàíèÿ áîëüøå ÷åì íà 0.5 Â. Âûõîäíîé òîê Выход IEX îãðàíè÷åí äî 125 ìA.  òðåòüåì Вход ñîñòîÿíèè îáðàòíîñìåùåííûé äèîä OE Øîòòêè ïðåäîòâðàùàåò ïðîòåêàíèå òîêà íà 3.3-âîëüòîâîå ïèòàíèå ñ âûõîäà, íà êîòîðîì íàõîäèòñÿ 5-âîëüВыходные каскады LVT(16) и ALVT òîâûé ñèãíàë. Îäíàêî, íåñìîòðÿ íà ðàçâèòèå Ðèñ. Ï2.19. Âûõîäíûå êàñêàäû ìèÁèKÌÎÏ-òåõíîëîãèè, îñíîâíàÿ ëèêðîñõåì ñåìåéñòâ LVT íèÿ ðàçâèòèÿ ïðîõîäèò ïî ïóòè ñîè ALVT
— 553 —
Ïðèëîæåíèÿ âåðøåíñòâîâàíèÿ KÌÎÏ-ñèñòåì. Ïîæàëóé, ñàìûì ïîïóëÿðíûì ñåìåéñòâîì ëîãè÷åñêèõ ñõåì ìîæíî íàçâàòü ñåìåéñòâà 74HC/HCT/HCU (îòå÷åñòâåííûå àíàëîãè — ñåðèè KÐ1564). Íàçâàíèå ñåìåéñòâà ïðîèñõîäèò îò High-speed CMOS (HCMOS) — áûñòðîäåéñòâóþùèå KÌÎÏ-ñõåìû. Îòëè÷èòåëüíûå îñîáåííîñòè ýòèõ ÈÑ — äîñòàòî÷íî øèðîêèé äèàïàçîí íàïðÿæåíèé ïèòàíèÿ, ìàëàÿ ïîòðåáëÿåìàÿ ìîùíîñòü, âûñîêàÿ ïîìåõîóñòîé÷èâîñòü ê âõîäíûì øóìàì, äîñòàòî÷íûå áûñòðîäåéñòâèå è íàãðóçî÷íàÿ ñïîñîáíîñòü, ðàáîòà â øèðîêîì äèàïàçîíå òåìïåðàòóð — ïî ýòèì ïàðàìåòðàì ìèêðîñõåìû ñåìåéñòâ 74HC/HCT/HCU ñîïîñòàâèìû ñ ñîâðåìåííûìè ÒÒË-ñõåìàìè ñåìåéñòâ Low-power Schottky TTL (LS TTL), ïðè ãîðàçäî ìåíüøåì ïîòðåáëåíèè.  îòëè÷èå îò ïîñëåäíèõ ëîãè÷åñêèå ÈÑ ñåìåéñòâ 74HC/HCT/HCU ñîäåðæàò â ñâîåì ñîñòàâå êàê îñíîâíûå ôóíêöèîíàëüíûå óçëû ÒÒË-ñåðèé (êîìáèíàöèîííûå è ïîñëåäîâàòåëüíîñòíûå ñõåìû, àðèôìåòè÷åñêèå óñòðîéñòâà, áóôåðû è ò.ï.), òàê è íàèáîëåå èíòåðåñíûå óñòðîéñòâà, õàðàêòåðíûå äëÿ ñåìåéñòâà HE4000B: àíàëîãîâûå êëþ÷è, ìóëüòèâèáðàòîðû ñ áîëüøîé ïîñòîÿííîé âðåìåíè, ñõåìû ôàçîâîé àâòîïîäñòðîéêè ÷àñòîòû.  Òàáë. Ï2.2 ïðèâåäåíî ñðàâíåíèå ñåìåéñòâà 74HC/HCT/HCU ñ äðóãèìè ñåìåéñòâàìè ëîãè÷åñêèõ ÈÑ. Âðåìÿ çàäåðæêè ðàñïðîñòðàíåíèÿ íà âåíòèëü ñîïîñòàâèìî ñ çàäåðæêîé ÒÒËØ-ñåìåéñòâ.  Òàáë. Ï2.3 ïðèâåäåíî ñðàâíåíèå õàðàêòåðèñòèê ñåìåéñòâ 74HC è 74HCT ñ ìèêðîñõåìàìè LSTTL. Kàê ìîæíî âèäåòü, â ñîâðåìåííûõ ðàçðàáîòêàõ ìèêðîñõåìû ñåìåéñòâ 74HC è 74HCT ÿâëÿþòñÿ ðåàëüíîé àëüòåðíàòèâîé äëÿ ñåìåéñòâ, âûïîëíåííûõ ïî LSTTL-òåõíîëîãèè.  îòëè÷èå îò ïåðâûõ KÌÎÏ ÈÑ ñåðèé CD4000, 4000À, 4000Å, âûïîëíåííûõ ïî 6-ìèêðîííîé òåõíîëîãèè, ìèêðîñõåìû ñåðèé 74ÍÑ èìåþò òåõíîëîãè÷åñêèå íîðìû 3 ìêì. Ìèêðîñõåìû 74ÍÑ èìåþò ïîëèêðåìíèåâûé çàòâîð, ðàñïîëîæåííûé íàä òîíêîé ïëåíêîé èçîëÿòîðà íà îñíîâå îêñèäà. Èñòîê è ñòîê âûïîëíÿþòñÿ â ïðîöåññå äèôôóçèè ñ èñïîëüçîâàíèåì èîííîé èìïëàíòàöèè, ïðè÷åì ïîëèêðåìíèåâûé çàòâîð èñïîëüçóåòñÿ êàê ìàñêà â ïðîöåññå èìïëàíòàöèè. Çíà÷èòåëüíîå óìåíüøåíèå ïàðàçèòíûõ åìêîñòåé çàòâîð—èñòîê è çàòâîð—ñòîê äîñòèãíóòî áëàãîäàðÿ óìåíüøåíèþ ðàçìåðîâ ýëåìåíòîâ òîïîëîãèè êðèñòàëëà. Áûñòðîäåéñòâèå ÈÑ ñåðèè 74ÍÑ çàâèñèò îò ìíîãèõ ôàêòîðîâ. Íå ðåêîìåíäóåòñÿ ðåæèì ðàáîòû íà åìêîñòíóþ íàãðóçêó áîëåå 50 ïÔ.  ýòîì ñëó÷àå âîçìîæíî ñíèæåíèå áûñòðîäåéñòâèÿ. Kàê èçâåñòíî, äèíàìèêà è áûñòðîäåéñòâèå KÌÎÏ ÈÑ îïðåäåëÿþòñÿ ñòîêîâîé õàðàêòåðèñòèêîé òðàíçèñòîðà. Ïîýòîìó âî âðåìÿ ðàáîòû ïðè ïî-
— 554 —
Ïðèëîæåíèÿ Òàáëèöà Ï2.2. Ñðàâíåíèå ñåìåéñòâà 74/ÍÑ/ÍÑÒ/ÍÑU/ ñ äðóãèìè ñåìåéñòâàìè ëîãè÷åñêèõ ÈÑ Òåõíîëîãèÿ
ÊÌÎÏ
ÒÒË
ÒÒËØ
Óëó÷øåííàÿ ÒÒËØ
Ñåìåéñòâî
74HC
4000 CD HE
Ïîòðåá- Ñòàòèêà ëÿåìàÿ ìîùíîñòü Äèíàìè[ìÂò] êà (100 Âåíòèëü êÃö) Ïîòðåá- Ñòàòèêà ëÿåìàÿ ìîùíîñòü Äèíàìè[ìÂò] êà (100 Ñ÷åò÷èê êÃö) Çàäåðæêà typ ðàñïðîñòðàíåíèÿ max [íñ] Ýíåðãèÿ (íà ïåðåêëþ÷àñòîòå ÷åíèÿ 100 êÃö) [ïÄæ] Ìàêñèìàëüíàÿ òàêòîâàÿ ÷àñòîòà [ÌÃö] Ìàêñèìàëüíûé âûõîäíîé òîê [ìA] Êîýôôèöèåíò ðàçâåòâëåíèÿ ïî âûõîäó (âåíòèëü LS)
0.0000025
0.001
10
2
19
1.2
8.5
5.5
0.075
0.1
10
2
19
1.2
8.5
5.5
0.000005
0.001
300
100
500
60
—
190
0.125
0.120
300
100
500
60
—
190
74
74LS
74S
74ALS 74AS
74F
8
94
40
10
9.5
3
4
1.5
3
14
190
80
20
15
5
7
2.5
4
0.52
94
94
100
19
57
4.8
13
16.5
55
4
12
25
33
100
60
160
125
0.51 0.8
16
8
20
8
20
20
40
20
50
20
50
50
4 10
1
2
íèæåííûõ íàïðÿæåíèÿõ ïèòàíèÿ íàáëþäàåòñÿ óâåëè÷åíèå âðåìåíè çàäåðæêè ðàñïðîñòðàíåíèÿ ñèãíàëà íà âåíòèëü. Íà Ðèñ. Ï2.20 ïðèâåäåíà çàâèñèìîñòü ñðåäíåé çàäåðæêè ðàñïðîñòðàíåíèÿ ñèãíàëà îò íàïðÿæåíèÿ ïèòàíèÿ. Òåìïåðàòóðíàÿ çàâèñèìîñòü çàäåðæêè ðàñïðîñòðàíåíèÿ îïðåäåëÿåòñÿ òîëüêî ïîäâèæíîñòüþ íîñèòåëåé, â îòëè÷èå îò ÒÒË-ñõåì, äëÿ êîòîðûõ îò òåìïåðàòóðû çàâèñÿò êîýôôèöèåíòû ïåðåäà÷è òîêà òðàíçèñòîðîâ, ïðÿìîå ïàäåíèå íàïðÿæåíèÿ è âíóòðåííèå ñîïðîòèâëåíèÿ.  îáùåì ñëó÷àå çàäåðæêà KÌÎÏ ÈÑ óâåëè÷èâàåòñÿ íà 0.3% íà êàæäûé °C ïðè òåìïåðàòóðå 25°C. Ïðè òåìïåðàòóðå îò 25°C äî 125°C ñïðàâåäëèâà çàâèñèìîñòü:
— 555 —
Ïðèëîæåíèÿ Òàáëèöà Ï2.3 Ñðàâíåíèå õàðàêòåðèñòèê ñåìåéñòâ 74HC è 74HCT ñ ìèêðîñõåìàìè LSTTL Ïàðàìåòð
74HCxxx, 74HCTxxx
74LSxxx
0.027 0.11 0.44 0.055
6 22 175 60
Ìàêñèìàëüíàÿ ðàññåèâàåìàÿ ìîùíîñòü â ñòàòè÷åñêîì ðåæèìå âî âñåì äèàïàçîíå ðàáî÷èõ òåìïåðàòóð ïðè ìàêñèìàëüíîì íàïðÿæåíèè ïèòàíèÿ [ìÂò] Äëÿ âåíòèëÿ Äëÿ òðèããåðà Äëÿ ÷åòûðåõðàçðÿäíîãî ñ÷åò÷èêà Äëÿ áóôåðà ëèíèè Ìàêñèìàëüíàÿ ïîòðåáëÿåìàÿ ìîùíîñòü â äèíàìè÷åñêîì ðåæèìå (CL = 50 ïÔ) [ìÂò] Íà ÷àñòîòå 1 ÌÃö Äëÿ âåíòèëÿ Äëÿ òðèããåðà Äëÿ ÷åòûðåõðàçðÿäíîãî ñ÷åò÷èêà Äëÿ áóôåðà ëèíèè
0.1 0.25 0.35 0.70 0.30
1 2.25 2.5 3 2.5 2…6 (HC) 4.5...5.5 (HCT) –40...+85 –40...+125
Íàïðÿæåíèå ïèòàíèÿ [Â] Äèàïàçîí ðàáî÷èõ òåìïåðàòóð [°C] Ïîìåõîóñòîé÷èâîñòü (VNMH/VNML; ïðè òîêå íàãðóçêè äëÿ KÌÎÏ ÈÑ IOHCMOS = 2 ìÀ; äëÿ ÒÒË ÈÑ IOLSTTL = 4 ìÀ)
10 22 24 27 24
0.1 6 22 175 60
10 22 27 200 90
4.75...5.25 0...+70
1.4/1.4 (HC) 2.9/0.7 (HCT)
0.7/0.4
±60 ìÂ
±200 ìÂ
–8 –12
–0.4 –2.6
8/8 14/14
8/11 15/22
50
33
–1 1 5
–400...–800 40 20
0.0005
0.008
Ñòàáèëüíîñòü âõîäíîãî íàïðÿæåíèÿ ïåðåêëþ÷åíèÿ Ìàêñèìàëüíûé âûõîäíîé òîê Âåíòèëü Øèííûé ôîðìèðîâàòåëü Çàäåðæêà ðàñïðîñòðàíåíèÿ CL = 15 ïÔ [íñ] Äëÿ âåíòèëÿ tPHL/tPLH Äëÿ òðèããåðà tPHL/tPLH Ìàêñèìàëüíàÿ òàêòîâàÿ ÷àñòîòà òðèããåðà (òèïîâîå çíà÷åíèå) Ìàêñèìàëüíûé âõîäíîé òîê [ìêÀ] IIL IIH Òîê óòå÷êè â òðåòüåì ñîñòîÿíèè [ìêÀ] Íàäåæíîñòü (ïðîöåíò îòêàçîâ íà 1000 ÷àñîâ íàðàáîòêè)
— 556 —
Ïðèëîæåíèÿ tP = tÐ’(1.003)Tamb – 25,
(8)
ãäå: tp’ — çàäåðæêà ðàñïðîñòðàíåíèÿ ïðè 25°C, Tamb — òåìïåðàòóðà ïåðåõîäà °C. Ïðè íèçêèõ òåìïåðàòóðàõ (îò –40 äî +25°C): tP = tБ(0.997)
25 – Tamb
,
3
tPD
2 74 HC
1
(9) 74 HCT
CC
— 557 —
ALT'P2199+
ÈÑ ñåìåéñòâà 74HC ðàáîòàþò ïðè 0 íàïðÿæåíèè ïèòàíèÿ îò 2 äî 6 Â. Òà0 2 4 6 êîé äèàïàçîí íàïðÿæåíèé ïèòàíèÿ V [B] ïîçâîëÿåò ïðèìåíÿòü ñåðèþ 74ÍÑ â ïðèëîæåíèÿõ, ñîïðÿãàþùèõ 5-âîëüòî- Ðèñ. Ï2.20. Çàâèñèìîñòü ñðåäíåé çàäåðæêè ðàñïðîñòðàíåíèÿ âûå è 3-âîëüòîâûå ñèñòåìû. Ñëåäóåò, ñèãíàëà îò íàïðÿæåíèÿ îäíàêî, ïîìíèòü, ÷òî êîãäà ÈÑ 74ÍÑ ïèòàíèÿ ïðèìåíÿþòñÿ â ëèíåéíîì ðåæèìå (íàïðèìåð ïðè ïîñòðîåíèè ãåíåðàòî-ðîâ, îäíîâèáðàòîðîâ è ò.ï.), ñëåäóåò èñïîëüçîâàòü íå ìåíåå ÷åì 3-âîëüòîâîå ïèòàíèå äëÿ ïðåäîòâðàùåíèÿ ñàìîïðîèçâîëüíîãî ïåðåõîäà â ðåæèì íàñûùåíèÿ. Ìèêðîñõåìû 74HCT ñîâìåñòèìû ïî âûâîäàì ñ LSTTL-ñõåìàìè, îäíàêî îíè, ïîìèìî ïîíèæåííîãî ïîòðåáëåíèÿ, èìåþò è áîëåå øèðîêèé äèàïàçîí íàïðÿæåíèé ïèòàíèÿ (±10%). Ñëåäóåò ïîìíèòü, ÷òî äëÿ ýòèõ ÈÑ ìàêñèìàëüíûé òîê ìåæäó âûõîäîì è çåìëåé èëè ïèòàíèåì íå áîëåå 50 ìÀ, äëÿ ìèêðîñõåì øèííûõ ôîðìèðîâàòåëåé è íåêîòîðûõ ðåãèñòðîâ äî 70 ìÀ. Ìàêñèìàëüíî äîïóñòèìîå íàïðÿæåíèå ïèòàíèÿ íå âûøå 7 Â. Áëàãîäàðÿ âîçìîæíîñòè ðàáîòû ïðè ïîíèæåííîì íàïðÿæåíèè ïèòàíèÿ äîñòàòî÷íî ïðîñòî ðåàëèçóåòñÿ ðåçåðâíîå ïèòàíèå òàêèõ ñèñòåì îò ëèòèåâûõ áàòàðåé. Íà Ðèñ. Ï2.21 ïðèâåäåíà ñõåìà âêëþ÷åíèÿ áàòàðåè â ñèñòåìó ñ ÈÑ 74ÍÑ. Ìèíèìàëüíîå íàïðÿæåíèå áàòàðåè — 2  ïëþñ îäíî íàïðÿæåíèå íà ïðÿìîñìåùåííîì äèîäå. Ìèêðîñõåìû ñäâèãà óðîâíÿ 74ÍÑ4049, 4050 ïðåäíàçíà÷åíû äëÿ ïðåäîòâðàùåíèÿ ñêâîçíûõ òîêîâ ÷åðåç âõîäíûå êàñêàäû ìèêðîñõåì â ñëó÷àå, åñëè íàïðÿæåíèÿ âõîäíûõ óðîâíåé ñèãíàëîâ ïðåâûøàþò íàïðÿæåíèå ïèòàíèÿ îò áàòàðåè. Çàùèòà âõîäíûõ è âûõîäíûõ êàñêàäîâ ðåàëèçîâàíà ñ èñïîëüçîâàíèåì íåñêîëüêèõ ñõåìíûõ ðåøåíèé.
Ïðèëîæåíèÿ Kàê èçâåñòíî, KÌÎÏ-ñõåìû èç-çà âûñîêîãî âõîäíîãî ñîïðîòèâëåíèÿ ÷óâñòâèòåëüíû ê ýëåêòðîñòàòè÷åñêîìó íàïðÿæåíèþ. Äëÿ ïðåäîòâðàùåíèÿ ñòàòè÷åñêîãî ïðîáîÿ â ñîñòàâ ýëåВходы 74HC/HCU ìåíòà âõîäÿò îãðàíè÷èòåëüíûå ðåçèñòîðû, êàê ïîêàçàíî íà Ðèñ. Ï2.22. Преобра  êà÷åñòâå ýëåìåíòîâ çàùèòû зователи уровня èñïîëüçîâàíû ïîëèñèëèêîíîâûé ðå(74HC4049/74HC4050) çèñòîð 100 Îì è äèîäíûå øóíòû, Ðèñ. Ï2.21. Ñõåìà âêëþ÷åíèÿ áàòàðåè îáåñïå÷èâàþùèå çàùèòó îò âõîäâ ñèñòåìó ñ ÈÑ 74ÍÑ íûõ òîêîâ.  íåêîòîðûõ ñõåìàõ, òàêèõ êàê àâòîãåíåðàòîðû, äèîäû ïðîVCC âîäÿò òîê â íîðìàëüíîì ðåæèìå ðà100 120 áîòû, è â ýòîì ñëó÷àå íåîáõîäèìî Вход Выход èñïîëüçîâàòü âíåøíèå òîêîîãðàíè÷èâàþùèå ðåçèñòîðû. ÌàêñèìàëüÐèñ. Ï2.22. Îãðàíè÷èòåëüíûå ðåçèñíûé ïîëîæèòåëüíûé âõîäíîé òîê òîðû, çàùèùàþùèå ÈÑ îò ñîñòàâëÿåò 20 ìÀ íà âõîä. Äëÿ óñòýëåêòðîñòàòè÷åñêîãî ðîéñòâ ñî ñòàíäàðòíîé íàãðóçî÷íîé íàïðÿæåíèÿ ñïîñîáíîñòüþ îáùèé âõîäíîé òîê íà óñòðîéñòâî íå äîëæåí ïðåâû100 К логической Вход øàòü 50 ìÀ, äëÿ øèííûõ ôîðìèðîцепи âàòåëåé — 70 ìÀ.  ñåìåéñòâå èìåþòñÿ äâà äîñòàD1 òî÷íî èíòåðåñíûõ ïðèáîðà — ñäâèãàGND òåëè ëîãè÷åñêèõ óðîâíåé (high-to-low Ðèñ. Ï2.23. Ñõåìà âõîäíûõ êàñêàäîâ level shifters) 74HC4049 è 74HC4050, ÈÑ 74ÍÑ4049 è 74ÍÑ4050 êîòîðûå èìåþò òîëüêî çàùèòó îò ýëåêòðîñòàòè÷åñêîãî ðàçðÿäà. Ñõåìà âõîäíûõ êàñêàäîâ ýòèõ ÈÑ ïðèâåäåíà íà Ðèñ. Ï2.23. Òàêîå ïîñòðîåíèå ñõåìû ïîçâîëÿåò ðàáîòàòü ñ èñòî÷íèêàìè ëîãè÷åñêèõ ñèãíàëîâ ñ óðîâíÿìè âûøå íàïðÿæåíèÿ ïèòàíèÿ. Ñõåìû âõîäíûõ êàñêàäîâ ñåðèé 74ÍÑ è 74ÍÑÒ ïðèâåäåíû íà Ðèñ. Ï2.24 è Ðèñ. Ï2.25. Ñåðèÿ 74ÍÑÒ èìååò äîïîëíèòåëüíûå ýëåìåíòû ñäâèãà óðîâíÿ äëÿ ñîâìåñòèìîñòè ñ ÒÒË-ñõåìàìè. ALT'P2202+
ALT'P2201+
VCC
— 558 —
Ïðèëîæåíèÿ Ñëåäóåò îáðàòèòü âíèìàíèå íà ïðèâÿçêó óðîâíåé âõîäîâ. Kàê èçâåñòíî, äëÿ ïðåäîòâðàùåíèÿ ïåðåõîäà ðàáîòû âõîäíûõ êàñêàäîâ â ëèíåéíûé ðåæèì íåèñïîëüçóåìûå âõîäû ÒÒËØ ÈÑ ïîäòÿãèâàþò ê èñòî÷íèêó ïèòàíèÿ ÷åðåç ðåçèñòîð ñîïðîòèâëåíèåì 1…2 êÎì. Èõ âõîäû íåëüçÿ ïîäêëþ÷àòü ê çåìëå èëè ïèòàíèþ íàïðÿìóþ.
VCC D2 100
170
P1
Вход
Выход D1 N1 GND
Ðèñ. Ï2.24. Âõîäíûå êàñêàäû 74ÍÑ
VCC
P1
170
P3
Вход
Выход D1
N1
N3
GND
ALT'P2204+
100
P2
D3
D2
Ðèñ. Ï2.25. Âõîäíûå êàñêàäû 74ÍÑÒ
ALT'P2205+
Äëÿ ìèêðîñõåì ñåðèé 74ÍÑ è 74ÍÑÒ âîçìîæíî ïðÿìîå ïîäêëþ÷åíèå ê èñòî÷íèêó ïèòàíèÿ èëè ê çåìëå, ëèáî ÷åðåç ðåçèñòîð ñîïðîòèâëåíèåì îò 1 êÎì äî 1 ÌÎì. Ñëåäóåò ïîìíèòü, ÷òî äâóíàïðàâëåííûå âûâîäû íåëüçÿ ïîäêëþ÷àòü ê çåìëå èëè ïèòàíèþ íàïðÿìóþ, òîëüêî åñëè îíè èñïîëüçóþòñÿ êàê âõîäû, èõ ìîæíî ïîäêëþ÷àòü ê çåìëå ÷åðåç VCC ðåçèñòîð ñîïðîòèâëåíèåì 10 êÎì. P1 Íà Ðèñ. Ï2.26 ïðèâåäåíà òèïîâàÿ D1 ñõåìà âûõîäíîãî êàñêàäà ÈÑ ñåðèè Вход Выход 74ÍÑ. Çàùèòíûå äèîäû îãðàíè÷èâàD2 þò âûõîäíîå íàïðÿæåíèå â ïðåäåëàõ N1 0.5  – VÎ äî VÑÑ + 0.5 Â. GND Íà Ðèñ. Ï2.27 ïðèâåäåíà ñõåìà âûõîäíîãî êàñêàäà, ðåàëèçóþùåãî Ðèñ. Ï2.26. Âûõîäíûå êàñêàäû òðåòüå ñîñòîÿíèå. Òðàíçèñòîðû P3 è ÈÑ 74ÍÑ
— 559 —
Ïðèëîæåíèÿ VCC P1
P2
P3
P5
P4
D1
Вход
Выход N4 N5 N1
N2
D2
N3 ALT'P2206+
GND EO
Ðèñ. Ï2.27. Ñõåìà âûõîäíîãî êàñêàäà, ðåãóëèðóþùåãî òðåòüå ñîñòîÿíèå
ALT'P2207+
N3 ðàáîòàþò êàê ñäâèãàòåëè óðîâíÿ, óïðàâëÿåìûå ñèãíàëîì ÅÎ, ïåðåâîäÿ âûõîäíûå òðàíçèñòîðû P5 è N5 â çàêðûòîå ñîñòîÿíèå. Òðåòèé òèï âûõîäíûõ êàñêàäîâ — âûõîä ñ îòêðûòûì ñòîêîì (opendrain). Äàííûé òèï âûõîäíîãî êàñêàäà ÿâëÿåòñÿ ýêâèâàëåíòîì îòêðûòîãî êîëëåêòîðà äëÿ ÒÒË-ñõåì. Íà Ðèñ. Ï2.28 ïðèâåäåíà ñõåìà êàñêàäà ñ îòêðûòûì ñòîêîì. Áåçóñëîâíî, ñëåäóåò ïîìíèòü î íåîáõîäèВыход Вход ìîñòè âêëþ÷åíèÿ áëîêèðóþùèõ åìD2 êîñòåé ïî ïèòàíèþ.  ðóêîâîäÿùèõ äîêóìåíòàõ ôèðì-ïðîèçâîäèòåëåé GND ðåêîìåíäóåòñÿ èñïîëüçîâàòü êåðàìè÷åñêèé êîíäåíñàòîð åìêîñòüþ 22 íÔ íà êàæäûå äâà—ïÿòü êîðïóñîâ ÈÑ Ðèñ. Ï2.28. Îòêðûòûé âûõîä 74ÍÑ ïëþñ òàíòàëîâûé ýëåêòðîëèòè÷åñêèé êîíäåíñàòîð åìêîñòüþ 1 ìêÔ íà 10 êîðïóñîâ. Ðàññìîòðèì íåêîòîðûå íîâûå ñåìåéñòâà öèôðîâûõ èíòåãðàëüíûõ ñõåì, îñíîâûâàÿñü íà ñòàíäàðòàõ JEDEC, è îáðàòèì âíèìàíèå íà íåêîòîðûå îñîáåííîñòè èõ ïðèìåíåíèÿ. Ñòàíäàðò Interface Standard for Nominal 3 Â/3.3  Supply Digital Integrated Circuits (JESD8-B) îïðåäåëÿåò îñíîâíûå òðåáîâàíèÿ ê èíòåðôåéñó ñ ÈÑ ñ íàïðÿæåíèåì ïèòàíèÿ 3.3 Â.  ñîîòâåòñòâèè ñ ýòèì ñòàíäàðòîì óñòàíîâëåíû ñëåäóþùèå ïðåäåëüíûå çíà÷åíèÿ ýëåêòðè÷åñêèõ óñëîâèé ýêñïëóàòàöèè (absolute ìaximum ratings), ïðèâåäåííûå â Òàáë. Ï2.4.
— 560 —
Ïðèëîæåíèÿ Ïîä ïðåäåëüíî äîïóñòèìûìè çíà÷åíèÿìè ïîíèìàþòñÿ òàêèå çíà÷åíèÿ ýëåêòðè÷åñêèõ âåëè÷èí (absolute ìàximum ratings), ïðåâûøåíèå êîòîðûõ ìîæåò ïðèâåñòè ê âûõîäó óñòðîéñòâà èç ñòðîÿ. Ñëåäóåò îäíîçíà÷íî ïîíèìàòü, ÷òî ïðèâåäåííûå çíà÷åíèÿ ïàðàìåòðîâ ÿâëÿþòñÿ èìåííî ïðåäåëüíî äîïóñòèìûìè â òå÷åíèå êîðîòêîãî ïðîìåæóòêà âðåìåíè, ðàáîòà óñòðîéñòâà ïðè òàêèõ çíà÷åíèÿõ ïàðàìåòðîâ íå ÿâëÿåòñÿ íîðìîé è íåäîïóñòèìà â ðåæèìå íîðìàëüíîé ýêñïëóàòàöèè. Ñëåäóåò ïîìíèòü, ÷òî çíà÷åíèÿ âõîäíûõ è âûõîäíûõ òîêîâ äàíû äëÿ åäèíñòâåííîãî âõîäà èëè âûõîäà. Èíîå äåëî ðåêîìåíäóåìûå óñëîâèÿ ýêñïëóàòàöèè (recommended operating conditions). Ýòè çíà÷åíèÿ ïàðàìåòðîâ ÿâëÿþòñÿ ïðåäïî÷òèòåëüíûìè ïðè øòàòíîé ýêñïëóàòàöèè èçäåëèÿ, è íå ñòîèò èõ íàðóøàòü áåç êðàéíåé íåîáõîäèìîñòè.  Òàáë. Ï2.5 ïðèâîäÿòñÿ ðåêîìåíäóåìûå óñëîâèÿ ýêñïëóàòàöèè äëÿ 3.3-âîëüòîâûõ ëîãè÷åñêèõ ÈÑ. K 3.3-âîëüòîâûì ñõåìàì îòíîñèòñÿ ðÿä ñåìåéñòâ ÈÑ, âûïîëíåííûõ êàê ïî ÒÒË-, òàê è ïî KÌÎÏ-òåõíîëîãèè.  ýòîé ñâÿçè âîçíèêàþò âîïðîñû, ñâÿçàííûå ñ ñîâìåñòèìîñòüþ óñòðîéñòâ ïî óðîâíÿì, ïîòðåáëÿåìîé ìîùíîñòè è ò.ï. Ïîñòàðàåìñÿ ïðèâåñòè îñíîâíûå ïîíÿòèÿ ïî ñîâìåñòèìîñòè ðàçëè÷íûõ ñåìåéñòâ ÈÑ. Òàáëèöà Ï2.4. Ïðåäåëüíûå çíà÷åíèÿ ýëåêòðè÷åñêèõ óñëîâèé ýêñïëóàòàöèè Ïàðàìåòð
Îáîçíà÷åíèå
Çíà÷åíèå
VDD
–0.5 Â...4.6 Â
Âõîäíîå ïîñòîÿííîå íàïðÿæåíèå (DC input voltage)
VI
–0.5 Â...VDD + 0.5 Â (4.6 Â màx)
Âûõîäíîå ïîñòîÿííîå íàïðÿæåíèå (DC output voltage)
VO
–0.5 Â...VDD + 0.5 Â (4.6 Â màx)
Âõîäíîé òîê (DC input current)
II ïðè VI < 0 Â èëè VI > VDD
± 20 ìÀ
Âûõîäíîé òîê (DC output current)
IO ïðè VO < 0 Â èëè VO > VDD
± 20 ìÀ
Íàïðÿæåíèå ïèòàíèÿ (supply voltage)
Òàáëèöà Ï2.5. Ðåêîìåíäóåìûå óñëîâèÿ ýêñïëóàòàöèè äëÿ 3.3-âîëüòîâûõ ëîãè÷åñêèõ ÈÑ Äèàïàçîí íàïðÿæåíèé ïèòàíèÿ
Íîðìàëüíûé äèàïàçîí
Ðàñøèðåííûé äèàïàçîí
Íîìèíàë
3.3 Â
3.0 Â
Äîïóñòèìûå ïðåäåëû èçìåíåíèÿ
3.0...3.6 Â
2.7...3.6 Â
— 561 —
Ïðèëîæåíèÿ Âõîäíûå ïàðàìåòðû ìèêðîñõåì ñåìåéñòâ LVTTL è LVCMOS ïðèâåäåíû â Òàáë. Ï2.6.  Òàáë. Ï2.7 ïðèâåäåíû îñíîâíûå âûõîäíûå ïàðàìåòðû ìèêðîñõåì LVTTL. Âûõîäíûå ïàðàìåòðû KÌÎÏ ñåìåéñòâ LVCMOS ïðèâåäåíû â Òàáë. Ï2.8. Kàê èçâåñòíî, äëÿ óâåëè÷åíèÿ áûñòðîäåéñòâèÿ è ñòåïåíè èíòåãðàöèè ïîñòîÿííî ñíèæàþòñÿ ïðîåêòíûå íîðìû, ïðèìåíÿåìûå ïðè èçãîòîâëåíèè ÁÈÑ. Åñëè åùå ïàðó ëåò íàçàä íàèáîëåå ïîïóëÿðíûìè è ìàññîâûìè áûëè 0.5- è 0.35-ìèêðîííûå òåõíîëîãèè, òî ñåé÷àñ àêòóàëüíû 0.25 è ìåíåå. ßñíî, ÷òî óìåíüøåíèå ãåîìåòðè÷åñêèõ ðàçìåðîâ ëîãè÷åñêèõ ýëåìåíòîâ ïðèâîäèò ê óìåíüøåíèþ äîïóñòèìîãî íàïðÿæåíèÿ ïèòàíèÿ. Îäíàêî áîëüøèíñòâî ñóùåñòâóþùèõ ñòàíäàðòíûõ èíòåðôåéñîâ è ïðîòîêîëîâ îáìåíà äî ñèõ ïîð îïåðèðóþò ñòàðûìè äîáðûìè ÒÒË-óðîâíÿìè.  ýòîé ñâÿçè àêÒàáëèöà Ï2.6. Âõîäíûå ïàðàìåòðû ìèêðîñõåì ñåìåéñòâ LVTTL è LVCMOS Îáîçíà÷åíèå
Çíà÷åíèå min max
Óñëîâèÿ èçìåðåíèé
Ïàðàìåòð
VIH
Âõîäíîå íàïðÿæåíèå ÂÛÑÎKÎÃÎ VOUT >= VOH èëè VOUT >= VOL óðîâíÿ (high-level input voltage)
VIL
Âõîäíîå íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ (low-level input voltage)
IIN
Âõîäíîé òîê (input current)
2Â
VDD + 0.3 Â
–0.3 Â
0.8 Â
—
±5 ìêÀ
VIN = 0 Â èëè VIN = VDD
Òàáëèöà Ï2.7. Îñíîâíûå âûõîäíûå ïàðàìåòðû ìèêðîñõåì LVTTL Îáîçíà÷åíèå
Ïàðàìåòð
Óñëîâèÿ èçìåðåíèé
VOH
Âûõîäíîå íàïðÿæåíèå ÂÛÑÎKÎÃÎ VDD = min, IOH = –2 ìÀ óðîâíÿ (high-level output voltage)
VOL
Âûõîäíîå íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ (low-level output voltage)
VDD = min, IOL = 2 ìÀ
Çíà÷åíèå min max 2.4 Â
—
—
0.4 Â
Òàáëèöà Ï2.8. Âûõîäíûå ïàðàìåòðû KÌÎÏ ñåìåéñòâ LVCMOS Îáîçíà÷åíèå
Ïàðàìåòð
Óñëîâèÿ èçìåðåíèé
Çíà÷åíèå min max
VOH
Âûõîäíîå íàïðÿæåíèå ÂÛÑÎKÎÃÎ VDD = min, V – 0.2  IOH = –100 ìêÀ DD óðîâíÿ (high-level output voltage)
VOL
Âûõîäíîå íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ (low-level output voltage)
— 562 —
VDD = min, IOL = 100 ìêÀ
—
— 0.2 Â
Ïðèëîæåíèÿ òóàëüíûì ñòàíîâèòñÿ âîïðîñ î ñîïðÿæåíèè íèçêîâîëüòíûõ è êëàññè÷åñêèõ ëîãè÷åñêèõ ÈÑ. Îïðåäåëèìñÿ, ÷òî æå îçíà÷àåò ñîâìåñòèìîñòü ÈÑ ðàçëè÷íûõ ñåìåéñòâ. Ïðèâåäåííûå â Òàáë. Ï2.8 ïàðàìåòðû îïðåäåëÿþò ñîâìåñòèìîñòü ÈÑ êàê ñîâìåñòèìûå ñ LVTTL (LVTTL-compatible). Kàê ìîæíî çàìåòèòü, âûõîäíûå íàïðÿæåíèÿ ÍÈÇKÎÃÎ è ÂÛÑÎKÎÃÎ óðîâíÿ ñîâåðøåííî îäíîçíà÷íî îïðåäåëÿþòñÿ êëàññè÷åñêèìè 5-âîëüòîâûìè ñõåìàìè è ìîãóò áûòü èñïîëüçîâàíû äëÿ ïîäà÷è íà âõîä 5-âîëüòîâûõ ÒÒË ñîâìåñòèìûõ ÈÑ. Îäíàêî ïðè îáðàòíîì ïåðåõîäå îò 5-âîëüòîâûõ ñèñòåì ê 3-âîëüòîâûì ñëåäóåò ïîìíèòü îá îïàñíîñòè ïîâðåæäåíèÿ âõîäíûõ êàñêàäîâ, íå ðàññ÷èòàííûõ íà íàïðÿæåíèå ïèòàíèÿ 5 Â.  ýòîì ñëó÷àå ïîëåçíû ñåðèè 74ÍÑ è 74ÀÍÑ.  ýòîé ñâÿçè ñëåäóåò ÷åòêî ïîìíèòü, ÷òî ïðè ñîâìåñòíîé ðàáîòå 5-âîëüòîâûõ è 3-âîëüòîâûõ êîìïîíåíòîâ âûõîäíîå íàïðÿæåíèå VOH 5-âîëüòîâûõ ÈÑ íå äîëæíî ïðåâûøàòü ìàêñèìàëüíîãî âõîäíîãî íàïðÿæåíèÿ 3-âîëüòîâûõ ÈÑ VIH. Ãîâîðÿ î ñîâìåñòèìîñòè ñ íèçêîâîëüòíûìè KÌÎÏ ÈÑ (LVCMOS compatibility), íåîáõîäèìî ïîìíèòü, ÷òî â ýòîì ñëó÷àå âûõîäíûå ïàðàìåòðû îïðåäåëåíû â Òàáë. Ï2.8. Ïðè ýòîì ïðè ïåðåêëþ÷åíèè èç îäíîãî ëîãè÷åñêîãî óðîâíÿ â äðóãîé âûõîäíîé ñèãíàë ïðàêòè÷åñêè ïðîõîäèò âåñü äèàïàçîí ïèòàíèÿ, çàíèìàÿ îäíî èç êðàéíèõ çíà÷åíèé (íîëü èëè íàïðÿæåíèå ïèòàíèÿ). Ýòî ñâîéñòâî â àíãëîÿçû÷íîé ëèòåðàòóðå ïîëó÷èëî íàèìåíîâàíèå rail-to-rail. Òàêîå ïîñòðîåíèå ïîçâîëÿåò ïðèéòè ê ïðàêòè÷åñêè íóëåâîìó ïîòðåáëåíèþ â ñòàòèêå (ïðè îòñóòñòâèè ïåðåêëþ÷åíèé). Äëÿ òîãî, ÷òîáû îáåñïå÷èòü ñîâìåñòèìîñòü ñ íèçêîâîëüòíûìè KÌÎÏ óñòðîéñòâàìè ïî âõîäó, íåîáõîäèìî ñîáëþäàòü ñëåäóþùèå óñëîâèÿ: 1. Ìèíèìàëüíîå çíà÷åíèå âõîäíîãî íàïðÿæåíèÿ ÂÛÑÎKÎÃÎ óðîâíÿ VIH äîëæíî áûòü íå ìåíåå 2 Â, íî íå âûøå íàïðÿæåíèÿ ïèòàíèÿ VDD. Äëÿ KÌÎÏ-óñòðîéñòâ âîîáùå ïðèíÿòî, ÷òî óðîâåíü ëîãè÷åñêîé åäèíèöû íå ìåíåå 0.7 íàïðÿæåíèÿ ïèòàíèÿ. 2. Ìàêñèìàëüíîå çíà÷åíèå âõîäíîãî íàïðÿæåíèÿ ÍÈÇKÎÃÎ óðîâíÿ VIL ðàâíî 0.8 Â. Òàêèì îáðàçîì, êîãäà ðàçðàáîò÷èê â òåõíè÷åñêîé äîêóìåíòàöèè ÷èòàåò «Components are «LVTTL-compatible» èëè «LVCMOS-compatible», ýòî îçíà÷àåò, ÷òî âûõîäíûå õàðàêòåðèñòèêè òàêîãî ïðèáîðà ñîîòâåòñòâóþò ïðèâåäåííûì â Òàáë. Ï2.9 è Ï2.10 ñîîòâåòñòâåííî. Íî, êàê èçâåñòíî, íåëüçÿ îáúÿòü íåîáúÿòíîå, ïîýòîìó ïðîèçâîäèòåëè ÷àñòî óêàçûâàþò íà îòêëîíåíèÿ îò ñòàíäàðòà, êàê ïðàâèëî, â ñòîðîíó ïðåâûøåíèÿ ñòàíäàðòíûõ çíà÷åíèé (exceed the requirements). K òàêèì ïðåâûøåíèÿì îòíîñÿòñÿ ïîâûøåí-
— 563 —
Ïðèëîæåíèÿ Òàáëèöà Ï2.9. Îñíîâíûå ïàðàìåòðû ÑÑÒ Îáîçíà÷åíèå
Ïàðàìåòð
Óñëîâèÿ èçìåðåíèÿ
min
Íàïðÿæåíèå VTT/VREF íàãðóçêè/îïîðíîå — 1.35 íàïðÿæåíèå Âõîäíîå íàïðÿæåíèå VIH VREF + 0.2 ÂÛÑÎKÎÃÎ óðîâíÿ (high— level input voltage) Âõîäíîå íàïðÿæåíèå VIL ÍÈÇKÎÃÎ óðîâíÿ (low— — level input voltage) Âûõîäíîå íàïðÿæåíèå 50-îìíàÿ VOH VREF+ 0.4 ÂÛÑÎKÎÃÎ óðîâíÿ (highíàãðóçêà level output voltage) Âûõîäíîå íàïðÿæåíèå 50-îìíàÿ VOL VREF – 0.6 ÍÈÇKÎÃÎ óðîâíÿ (lowíàãðóçêà level output voltage) VSS
Çíà÷åíèå typ
max
Åäèíèöà èçìåðåíèÿ
1.5
1.65
Â
—
—
Â
—
VREF – 0.2
Â
—
VREF + 0.6
Â
—
VREF – 0.4
Â
—
±10
ìêÀ
—
±10
ìêÀ
íàÿ íàãðóçî÷íàÿ ñïîñîáíîñòü, ñïîñîáíîñòü ôóíêöèîíèðîâàòü ïðè âûñîêîì íàïðÿæåíèè íà âõîäå è ò.ï. Ãîâîðÿ î íîâûõ ñåìåéñòâàõ ëîãè÷åñêèõ ÈÑ, íåëüçÿ íå îñòàíîâèòüñÿ íà âîïðîñå íîâûõ èíòåðôåéñíûõ ñåðèé è ñòàíäàðòîâ. Òàê, â 1993 ãîäó áûë îäîáðåí ñòàíäàðò JESD8-4, îïðåäåëÿþùèé ïàðàìåòðû èíòåðôåéñà CTT (Center Tap Terminated). Ýòîò ñòàíäàðò îïðåäåëÿåò ñïåöèôèêàöèþ âõîäíûõ è âûõîäíûõ õàðàêòåðèñòèê äëÿ èíòåðôåéñíûõ ÈÑ è ïðåäñòàâëÿåò ñîáîé íàäìíîæåñòâî LVTTL è LVCMOS. Òàêèì îáðàçîì, ïðèåìíèêè ÑÒÒ ñîâìåñòèìû ñî ñòàíäàðòíûìè 3-âîëüòîâûìè ÈÑ.  Òàáë. Ï2.9 ïðèâîäÿòñÿ îñíîâíûå ïàðàìåòðû ÑÑÒ. Íà Ðèñ. Ï2.29 ïðèâåäåíà òèïè÷íàÿ ñõåìà èñïîëüçîâàíèÿ ÑÒÒ-èíòåðôåéñà. Íà Ðèñ. Ï2.30 ïðèâåäåíà ñõåìà ðåàëèçàöèè ÑÒÒ-èíòåðôåéñà. Ñîâåðøåíñòâîâàíèå òåõíîëîãèè ïðèâîäèò ê óìåíüøåíèþ ïðîåêòíûõ íîðì, à ñëåäîâàòåëüíî, è ðàáî÷èõ íàïðÿæåíèé ÈÑ. Óæå ñåé÷àñ íîâûå ñåìåéñòâà ÏËÈÑ, òàêèå êàê APEX ôèðìû «Altera» è VIRTEX ôèðìû «Xilinx» [2, 3], ðàáîòàþò îò èñòî÷íèêîâ ïèòàíèÿ 2.5  è 1.8 Â.  ýòîé ñâÿçè ñòàíîâÿòñÿ àêòóàëüíûìè âîïðîñû ñîïðÿæåíèÿ ñ òàêèìè óñòðîéñòâàìè.
— 564 —
Ïðèëîæåíèÿ Òàáëèöà Ï2.10. Ïðåäåëüíî äîïóñòèìûå ïàðàìåòðû Ïàðàìåòð Íàïðÿæåíèå ïèòàíèÿ (supply voltage) Âõîäíîå ïîñòîÿííîå íàïðÿæåíèå (DC input voltage) Âûõîäíîå ïîñòîÿííîå íàïðÿæåíèå (DC output voltage) Âõîäíîé òîê (DC input current) Âûõîäíîé òîê (DC output current)
Îáîçíà÷åíèå
Çíà÷åíèå
VDD
–0.5 Â...3.6 Â
VIN
–0.5 Â…3.6 Â
VOUT
–0.5 Â...VDD + 0.5 Â
II ïðè VI < 0 Â èëè VI > VDD IO ïðè VO < 0 Â èëè VO > VDD
±20 ìÀ ±20 ìÀ
Òàáëèöà Ï2.11. Ïàðàìåòðû 2.5-âîëüòîâûõ ÈÑ ÎáîçíàÏàðàìåòð Óñëîâèÿ èçìåðåíèÿ ÷åíèå VDD Íàïðÿæåíèå ïèòàíèÿ — Âõîäíîå íàïðÿæåíèå VIH VOUT > VOH ÂÛÑÎKÎÃÎ óðîâíÿ (high-level input voltage) Âõîäíîå íàïðÿæåíèå VIL VOUT < VOL ÍÈÇKÎÃÎ óðîâíÿ (low-level input voltage) VDD = MIN, Âûõîäíîå íàïðÿæåíèå IOH = VOH VI = VIH ÂÛÑÎKÎÃÎ óðîâíÿ –100 ìêÀ èëè VIL (high-level output voltage) VDD = MIN, Âûõîäíîå íàïðÿæåíèå IOH = VOL VI = VIH ÍÈÇKÎÃÎ óðîâíÿ (low–100 ìêÀ level output voltage) èëè VIL II VDD = MIN, VI = VIH èëè VIL Âõîäíîé òîê
Çíà÷åíèå min max 2.3 2.7
Åäèíèöà èçìåðåíèÿ Â
1.7
VDD + 0.3
Â
–0.3
0.4
Â
1.7
VDD + 0.3
Â
–0.3
0.4
Â
—
±5
ìêÀ
Ïðèìå÷àíèå: MIN — ìèíèìàëüíîå çíà÷åíèå.
Ñòàíäàðò JEDEC JESD8-5 îïðåäåëÿåò ëîãè÷åñêèå óðîâíè è ïàðàìåòðû ÈÑ, ðàáîòàþùèõ â äèàïàçîíå ïèòàíèÿ 2.5 Â. Ïðåäåëüíî äîïóñòèìûå ïàðàìåòðû, îïðåäåëÿåìûå ýòèì ñòàíäàðòîì, ïðèâîäÿòñÿ â Òàáë. Ï2.10. Ïàðàìåòðû 2.5-âîëüòîâûõ ÈÑ ïðèâîäÿòñÿ â Òàáë. Ï2.11. Ïîñëåäíèå ðàçðàáîòêè ÈÑ âûïîëíÿþòñÿ ïî 0.18-ìèêðîííîé òåõíîëîãèè, ïðè èñïîëüçîâàíèè êîòîðîé íàïðÿæåíèå ïèòàíèÿ ñîñòàâëÿåò âñåãî ëèøü 1.8 Â. Ñòàíäàðò JESD8-7 îïðåäåëÿåò êàê ïðåäåëüíî äîïóñòèìûå, òàê è ðàáî÷èå ïàðàìåòðû 1.8-âîëüòîâûõ ÈÑ.  Òàáë. Ï2.12 ïðèâåäåíû ïðåäåëüíî äîïóñòèìûå ïàðàìåòðû äëÿ 1.8-âîëüòîâûõ ÈÑ. Ðàáî÷èå õàðàêòåðèñòèêè 1.8-âîëüòîâûõ ÈÑ ïðèâåäåíû â Òàáë. Ï2.13.
— 565 —
Ïðèëîæåíèÿ
Управление 3м состоянием DATA OUT
Z0
————— ——— DATA OUT Управление передатчиком
R0 VTT
VTT
СТТ передатчик
ALT'P2208+
DATA IN (порт ввода/вывода)
СТТ приемник
Ðèñ. Ï2.29. Ñõåìà èñïîëüçîâàíèÿ ÑÒÒ-èíòåðôåéñà
HZ VDD
30/30 D08
2
2
2
2
10/10
500 40 2
2
2
2
40 (1.2u)
VTT
D0 10
VDD (ENABLE)
ALT'P2 209
500
Высокоскоростной интерфейс ввода/вывода
Ðèñ. Ï2.30. Ñõåìà èñïîëüçîâàíèÿ ÑÒÒ-èíòåðôåéñà
— 566 —
Ïðèëîæåíèÿ Òàáëèöà Ï2.12. Ïðåäåëüíî äîïóñòèìûå ïàðàìåòðû äëÿ 1.8-âîëüòîâûõ ÈÑ Ïàðàìåòð
Îáîçíà÷åíèå
Çíà÷åíèå
Íàïðÿæåíèå ïèòàíèÿ (supply voltage)
VDD
–0.5 Â...2.5 Â
Âõîäíîå ïîñòîÿííîå íàïðÿæåíèå (DC input voltage)
VIN
–0.5 Â...VDD + 0.5 Â
Âûõîäíîå ïîñòîÿííîå íàïðÿæåíèå (DC output voltage)
VOUT
–0.5 Â...VDD + 0.5 Â
II ïðè VI < 0 Â èëè VI > VDD IO ïðè VO < 0 Â èëè VO > VDD
Âõîäíîé òîê (DC input current) Âûõîäíîé òîê (DC output current)
±20 ìÀ ±20 ìÀ
Òàáëèöà Ï2.13. Ðàáî÷èå õàðàêòåðèñòèêè 1.8-âîëüòîâûõ ÈÑ Îáîçíà÷åíèå
Óñëîâèÿ èçìåðåíèÿ
Ïàðàìåòð
Çíà÷åíèå min
max
Åäèíèöà èçìåðåíèÿ
1.2
1.95
Â
VDD
Íàïðÿæåíèå ïèòàíèÿ
VIH
Âõîäíîå íàïðÿæåíèå ÂÛÑÎKÎÃÎ óðîâíÿ (high-level input voltage)
VOUT > VOH
0.7 VDD
VDD + 0.3
Â
VIL
Âõîäíîå íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ (lowlevel input voltage)
VOUT < VOL
–0.3
0.3 VDD
Â
VOH
Âûõîäíîå íàïðÿæåíèå ÂÛÑÎKÎÃÎ óðîâíÿ (high-level output voltage)
IOH = –100 ìêÀ
VDD – 0.2
—
Â
VOL
Âûõîäíîå íàïðÿæåíèå ÍÈÇKÎÃÎ óðîâíÿ (lowlevel output voltage)
IOL = –100 ìêÀ
—
0.2
Â
— 567 —
Ïðèëîæåíèÿ
Ïðèëîæåíèå 3.
Ïðàêòè÷åñêèå ðåêîìåíäàöèè ïî ðàçðàáîòêå ïå÷àòíûõ ïëàò
Ñîâðåìåííûå ýëåêòðîííûå óçëû çíà÷èòåëüíî îòëè÷àþòñÿ îò óñòðîéñòâ ðàçðàáîòêè êîíöà 80-õ — íà÷àëà 90-õ ãîäîâ. Âî-ïåðâûõ, íîâûå òåõíîëîãèè ïîâåðõíîñòíîãî ìîíòàæà ïðèâåëè ê óìåíüøåíèþ ãàáàðèòîâ êîìïîíåíòîâ â 3…6 ðàç. Âî-âòîðûõ, ïîÿâèëèñü íîâûå êîðïóñà èíòåãðàëüíûõ ñõåì ñ ìàëûì øàãîì ìåæäó âûâîäàìè (0.5…0.65 ìì), êîðïóñà ñ øàðèêîâûìè âûâîäàìè (BGA), íîâûå ìàëîãàáàðèòíûå äèñêðåòíûå êîìïîíåíòû è ñîåäèíèòåëè. Â-òðåòüèõ, ïîâûñèëàñü òî÷íîñòü èçãîòîâëåíèÿ ïå÷àòíûõ ïëàò, ïîâûñèëèñü âîçìîæíîñòè äëÿ ðàçâîäêè ñëîæíûõ óñòðîéñòâ â ìàëûõ ãàáàðèòàõ. Ïîÿâëåíèå íîâîé ýëåìåíòíîé áàçû ïîçâîëÿåò ãîâîðèòü î âîçìîæíîñòè âîïëîùåíèÿ ñëîæíûõ ñèñòåì íà îäíîé ïëàòå è äàæå íà îäíîì êðèñòàëëå. Ýòî îçíà÷àåò, ÷òî íà îäíîé è òîé æå òèïè÷íîé ïëàòå óñòðîéñòâà îáðàáîòêè ñèãíàëîâ â ìàëûõ ãàáàðèòàõ ðàçìåùàþòñÿ âûñîêî÷óâñòâèòåëüíûé àíàëîãîâûé òðàêò, àíàëîãî-öèôðîâîé ïðåîáðàçîâàòåëü, âûñîêîñêîðîñòíàÿ ñõåìà öèôðîâîé îáðàáîòêè íà ïðîöåññîðå è (èëè) ïðîãðàììèðóåìûõ ëîãè÷åñêèõ èíòåãðàëüíûõ ñõåìàõ, áóôåðíûå ýëåìåíòû è äðàéâåðû ëèíèé ñâÿçè, ýëåìåíòû ñòàáèëèçàòîðîâ íàïðÿæåíèÿ ïèòàíèÿ è ïðåîáðàçîâàòåëåé óðîâíÿ è äðóãèå óçëû. Åñòåñòâåííî, ÷òî ýòî íàêëàäûâàåò ñâîé îòïå÷àòîê íà ìåòîäîëîãèþ ðàçðàáîòêè ïëàòû. Ïðè ïðîåêòèðîâàíèè ïëàò ñ èñïîëüçîâàíèåì ñðåäñòâ ÑÀÏÐ íåîáõîäèìî âñåãäà ïîìíèòü, ÷òî ñêîëü ñîâåðøåííûìè íè áûëè àëãîðèòìû àâòîìàòè÷åñêîé òðàññèðîâêè, îíè íèêîãäà íå çàìåíÿò ðàáîòó êîíñòðóêòîðà.  ëó÷øåì ñëó÷àå â àâòîìàòè÷åñêîì ðåæèìå âîçìîæíà òðàññèðîâêà ìàëî÷óâñòâèòåëüíûõ, ìåäëåííûõ (äî 3…5 ÌÃö) öèôðîâûõ öåïåé. Îñîáîå âíèìàíèå ñëåäóåò óäåëÿòü ïðîáëåìå çàçåìëåíèÿ. Çåìëÿíàÿ øèíà îïðåäåëÿåòñÿ êàê ýêâèïîòåíöèàëüíàÿ ïîâåðõíîñòü, ïîòåíöèàë êîòîðîé ñëóæèò äëÿ ñõåìû óðîâíåì îòñ÷åòà íàïðÿæåíèé.
— 568 —
Ïðèëîæåíèÿ Ïðè ïðîåêòèðîâàíèè çåìëÿíûõ öåïåé ïðåñëåäóþòñÿ äâå öåëè. Âî-ïåðâûõ, ñëåäóåò ïîìíèòü, ÷òî çàçåìëåíèå ìèíèìèçèðóåò íàïðÿæåíèå øóìîâ, âîçíèêàþùåå ïðè ïðîõîæäåíèè òîêîâ îò íåñêîëüêèõ ñõåì ÷åðåç îáùåå ñîïðîòèâëåíèå çåìëè. Âî-âòîðûõ, íåîáõîäèìî èñêëþ÷èòü îáðàçîâàíèå êîíòóðîâ çàçåìëåíèÿ, ÷óâñòâèòåëüíûõ ê ýëåêòðîìàãíèòíûì ïîëÿì è ðàçíîñòÿì ïîòåíöèàëîâ. Òàêèì îáðàçîì, çàçåìëåíèå ïðåäñòàâëÿåò ñîáîé îáëàäàþùóþ íèçêèì èìïåäàíñîì öåïü âîçâðàòà òîêà. Îòñþäà ÿñíî, ÷òî ïðîòåêàíèå ëþáîãî òîêà â ñèñòåìå çàçåìëåíèÿ ïðèâîäèò ê ïîÿâëåíèþ ðàçíîñòè ïîòåíöèàëîâ. ßñíî, ÷òî ýòà ðàçíîñòü ïîòåíöèàëîâ äîëæíà áûòü ìèíèìàëüíîé. Îòñþäà ñëåäóåò, ÷òî ïðè ïðîåêòèðîâàíèè òîïîëîãèè çåìëè ñëåäóåò îáåñïå÷èòü èìïåäàíñ çàçåìëåíèÿ íà êàê ìîæíî áîëåå íèçêîì óðîâíå è êîíòðîëèðîâàòü òîêè, ïðîòåêàþùèå ìåæäó èñòî÷íèêàìè è íàãðóçêàìè. Ïîýòîìó íåîáõîäèìî èñïîëüçîâàòü íåñêîëüêî öåïåé çàçåìëåíèÿ, ñîåäèíåííûõ â îäíîé òî÷êå. Ïðè÷åì òðàäèöèîííîãî äåëåíèÿ íà àíàëîãîâîå è öèôðîâîå çàçåìëåíèå ìîæåò îêàçàòüñÿ íåäîñòàòî÷íî. Íà Ðèñ. Ï3.1 ïðåäñòàâëåíà ñõåìà çàçåìëåíèÿ äâóõ àíàëîãîâûõ çåìåëü, ïðè÷åì îäíà ñëóæèò çåìëåé äëÿ ñëàáîãî âõîäíîãî ñèãíàëà, à äðóãàÿ — äëÿ ìîùíîãî âûõîäíîãî. Ñëåäóåò èçáåãàòü çàçåìëåíèÿ òàê íàçûâàåìîé ãèðëÿíäîé, íàäî èñïîëüçîâàòü îäíîòî÷å÷íûå ñõåìû çàçåìëåíèÿ, êîãäà ðàçëè÷íûå çåìëè ñîåäèíÿþòñÿ â òî÷êå ââîäà ó ðàçúåìà ïèòàíèÿ.  ïåðâóþ î÷åðåäü ñëåäóåò ïîìíèòü, ÷òî åñëè ðàçðàáàòûâàåòñÿ ïëàòà, ñîäåðæàùàÿ êàê àíàëîãîâûå, òàê è öèôðîâûå óçëû è ðàáîòàþùàÿ íà äîñòàòî÷íî âûñîêîé òàêòîâîé ÷àñòîòå (>1 ÌÃö), òî íå ñëåäóåò ýêîíîìèòü è ðàçðàáàòûâàòü äâóõñëîéíóþ ïëàòó.  ýòîì ñëó÷àå íåîáõîäèìî èñïîëüçîâàòü ìíîãîñëîéíóþ ïëàòó, â êîòîðîé âíóòðåííèå ñëîè ïðåäñòàâëÿþò ñîáîé ñïëîøíûå ïëîñêîñòè çåìëè è ïèòàíèÿ. Zf1
Zf Zi
Zi1
Входной сигнал
RL
Выход RL1
К источнику питания
Силовая «земля»
Ðèñ. Ï3.1. Ñõåìà çàçåìëåíèÿ äëÿ äâóõ àíàëîãîâûõ çåìåëü
— 569 —
ALT'P2210+
Сигнальная «земля»
Ïðèëîæåíèÿ
ALT'P2211+
Íåëèøíå íàïîìíèòü î âñåì èçâåñòíîì ñêèí-ýôôåêòå è çàâèñèR1 ìîñòè èìïåäàíñà îò ÷àñòîòû, ïîýòîìó îáëàñòü ìåòàëëèçàöèè îäR2 íîãî è òîãî æå ðàçìåðà áóäåò èìåòü ðàçëè÷íûé èìïåäàíñ íà íèçêèõ è âûñîêèõ ÷àñòîòàõ. Ðåêîìåíäóåòñÿ âñå ñâîáîäíîå ïðîñòR3 ðàíñòâî ïëàòû çàïîëíèòü ñïëîøíîé îáëàñòüþ ìåòàëëèçàöèè, ñîåäèíåííîé ñ îáùåé øèíîé, ÷òîáû èçáåæàòü íàâîäîê. Ðèñ. Ï3.2. Èñïîëüçîâàíèå çàùèòíîãî Âûáèðàÿ øàã ñåòêè òðàññèðîâêîëüöà êè, íàäî ó÷èòûâàòü íå òîëüêî ðàçðåøàþùóþ ñïîñîáíîñòü ôîòîïëîòòåðà è äðóãîãî òåõíîëîãè÷åñêîãî îáîðóäîâàíèÿ, íî è ïîìíèòü î âîçìîæíûõ òîêàõ óòå÷êè ÷åðåç ïëàòó. Îñîáåííî ýòî êðèòè÷íî ê âõîäíûì âûñîêîîìíûì öåïÿì óñèëèòåëåé, â ýòîì ñëó÷àå íåïëîõîé ìåðîé ÿâëÿåòñÿ çàùèòíîå êîëüöî (Ðèñ. Ï3.2). Åñëè ïåðåäàåòñÿ ñêîðîñòíîé ñèãíàë íà äîñòàòî÷íî áîëüøîå ðàññòîÿíèå, òî ñäåëàòü ýòî ìîæíî òîëüêî ïî ñîãëàñîâàííîé ëèíèè íà íèçêîîìíóþ íàãðóçêó. Íåñêîëüêî ñëîâ ñëåäóåò ñêàçàòü î ôèëüòðóþùèõ åìêîñòÿõ. Î÷åíü ÷àñòî íà÷èíàþùèé êîíñòðóêòîð áåçäóìíî óñòàíàâëèâàåò èõ ãäå ïðèäåòñÿ, ðóêîâîäñòâóÿñü òîëüêî íîðìîé óñòàíîâêè áëîêèðóþùèõ åìêîñòåé íà ÷èñëî òåõ èëè èíûõ ìèêðîñõåì. Ñëåäóåò ïîìíèòü, ÷òî äëÿ òîãî, ÷òîáû ôèëüòðóþùèå åìêîñòè ýôôåêòèâíî ðàáîòàëè, äëèíà öåïè îò âûâîäà ìèêðîñõåìû äî åìêîñòè áûëà ìèíèìàëüíîé. Èñïîëüçîâàíèå ïëàíàðíûõ êîìïîíåíòîâ ïðàêòè÷åñêè ïîëíîñòüþ ïîçâîëÿåò ðåøèòü ýòó ïðîáëåìó (Ðèñ. Ï3.3). Íå ñëåäóåò ðàçíîñèòü â ïðîñòðàíñòâå ñèãíàëüíóþ è âîçâðàòíûå öåïè îäíîãî ñèãíàëà (Ðèñ. Ï3.4). Ýòî çàìå÷àíèå êàñàåòñÿ òàêæå äèôôåðåíöèàëüíûõ âõîäíûõ öåïåé, êîòîðûå äîëæíû èìåòü îäèíàêîâóþ äëèíó. Ñëåäóåò ñòðåìèòüñÿ âûïîëíèòü ðàçâîäêó ÷óâñòâèòåëüíûõ àíàëîãîâûõ öåïåé â îäíîì ñëîå (ñî ñòîðîíû óñòàíîâêè êîìïîíåíòîâ) è èçáåãàòü ïåðåñå÷åíèé ïðîâîäíèêîâ, òàê êàê íàðóøåíèå öåëîñòíîñòè çàçåìëÿþùåãî ñëîÿ âûçûâàåò óâåëè÷åíèå åãî èíäóêòèâíîñòè è, ñëåäîâàòåëüíî, âîçðàñòàåò ñòåïåíü âçàèìíîãî âëèÿíèÿ âîçâðàòíûõ òîêîâ (Ðèñ. Ï3.5).
— 570 —
Ïðèëîæåíèÿ
Слой земли конденсатора C B
B 0 Поверхность монтажа
0
B
B
C
C
Слой земли
D B B
Наиболее удобное место установки фильтра конденсаторов
DD
Аналоговая земли ALT'P2212+
DDDBBAA CC DD
Ðèñ. Ï3.3. Óñòàíîâêà ôèëüòðóþùèõ åìêîñòåé Неудачная трассировка
Правильная трассировка
Нагрузка
Нагрузка
Нагрузка
Нагрузка
Нагрузка ALT'P2213+
Нагрузка
Ðèñ. Ï3.4. Ðàçâîäêà ñèãíàëüíîé öåïè è öåïè âîçâðàòà
Ïðè ïðîåêòèðîâàíèè ïëàòû, ñîäåðæàùåé ñêîðîñòíûå öèôðîâûå ìèêðîñõåìû (ÏËÈÑ, ñèãíàëüíûå ïðîöåññîðû è ò.ï.), ñëåäóåò ïîäóìàòü î òåïëîîòâîäå. Ïîëåçíû áûâàþò äîïîëíèòåëüíûå ñëîè äëÿ îòâîäà èçëèøíåãî òåïëà îò ìèêðîñõåì. Ïîëåçíî ïîñëå çàâåðøåíèÿ ðàçðàáîòêè òîïîëîãèè ïëàòû ìàêñèìàëüíî ðàñøèðèòü âñå ñèëîâûå öåïè, çåìëè, îòâåòñòâåííûå ñèãíàëüíûå öåïè. Ïðè ðàçðàáîòêå îòâåòñòâåííûõ óñòðîéñòâ íå ñëåäóåò çàáûâàòü î âîçìîæíîñòÿõ ñîâðåìåííûõ ñðåäñòâ ïî àíàëèçó öåëîñòíîñòè ñèãíàëîâ, òåïëîâûõ ðåæèìîâ, ïðî÷íîñòè è ò.ä.
— 571 —
Ïðèëîæåíèÿ
Разрыв в области металлизации земли Пересечение с земляным слоем
Сигнал 1
Возвратный ток сигнала 1
Сигнал 2
ALT'P2214+
Возвратный ток сигнала 2
Ðèñ. Ï3.5. Âçàèìîäåéñòâèå âîçâðàòíûõ òîêîâ íà âûðåçå â çàçåìëÿþùåé ïëîñêîñòè
Ëèòåðàòóðà 1. 2. 3. 4. 5.
Ñòåøåíêî Â.Á. Øêîëà ðàçðàáîòêè àïïàðàòóðû öèôðîâîé îáðàáîòêè ñèãíàëîâ íà ÏËÈÑ. // Chip News,1999, ¹ 8—10, 2000, ¹ 1—3. Àðìñòðîíã Äæ.Ð. Ìîäåëèðîâàíèå öèôðîâûõ ñèñòåì íà ÿçûêå VHDL. Ïåð. ñ àíãë. // Ì.: Ìèð, 1992, ñ.175. Âèöèí Í. Ñîâðåìåííûå òåíäåíöèè ðàçâèòèÿ ñèñòåì àâòîìàòèçèðîâàííîãî ïðîåêòèðîâàíèÿ â îáëàñòè ýëåêòðîíèêè. // Chip News, ¹ 1, 1997. Ãóáàíîâ Ä.À., Ñòåøåíêî Â.Á., Õðàïîâ Â.Þ., Øèïóëèí Ñ.Í. Ïåðñïåêòèâû ðåàëèçàöèè àëãîðèòìîâ öèôðîâîé ôèëüòðàöèè íà îñíîâå ÏËÈÑ ôèðìû «Altera». // Chip News, ¹ 9—10, 1997. Ãóáàíîâ Ä.À., Ñòåøåíêî Â.Á. Ìåòîäîëîãèÿ ðåàëèçàöèè àëãîðèòìîâ öèôðîâîé ôèëüòðàöèè íà îñíîâå ïðîãðàììèðóåìûõ ëîãè÷åñêèõ èíòåãðàëüíûõ ñõåì. // Ñáîðíèê äîêëàäîâ 1-é Ìåæäóíàðîäíîé êîíôåðåíöèè «Öèôðîâàÿ îáðàáîòêà ñèãíàëîâ è åå ïðèìåíåíèÿ», 30.06—3.07.1998, Ìîñêâà, ÌÖÍÒÈ, òîì 4, ñ. 9—19.
— 572 —
Ëèòåðàòóðà 6.
7. 8. 9. 10. 11. 12. 13. 14.
Ñòåøåíêî Â.Á. Îñîáåííîñòè ïðîåêòèðîâàíèÿ àïïàðàòóðû öèôðîâîé îáðàáîòêè ñèãíàëîâ íà ÏËÈÑ ñ èñïîëüçîâàíèåì ÿçûêîâ îïèñàíèÿ àïïàðàòóðû // Ñáîðíèê äîêëàäîâ 2-é Ìåæäóíàðîäíîé êîíôåðåíöèè «Öèôðîâàÿ îáðàáîòêà ñèãíàëîâ è åå ïðèìåíåíèÿ», 21.09—24.09.1999, Ìîñêâà, ÌÖÍÒÈ, òîì 2, ñ. 307—314. Ùåðáàêîâ Ì.À., Ñòåøåíêî Â.Á., Ãóáàíîâ Ä.À. Öèôðîâàÿ ïîëèíîìèíàëüíàÿ ôèëüòðàöèÿ: àëãîðèòìû è ðåàëèçàöèÿ íà ÏËÈÑ // Èíæåíåðíàÿ ìèêðîýëåêòðîíèêà, ¹ 1 (3), ìàðò 1999, ñ. 12—17. Ãóáàíîâ Ä.À., Ñòåøåíêî Â.Á., Øèïóëèí Ñ.Í. Ñîâðåìåííûå àëãîðèòìû ÖÎÑ: ïåðñïåêòèâû ðåàëèçàöèè. // Ýëåêòðîíèêà: íàóêà, òåõíîëîãèÿ, áèçíåñ, ¹ 1, 1999, ñ. 54—57. Øèïóëèí Ñ.Í., Ãóáàíîâ Ä.À., Ñòåøåíêî Â.Á., Õðàïîâ Â.Þ. Òåíäåíöèè ðàçâèòèÿ ÏËÈÑ è èõ ïðèìåíåíèå äëÿ öèôðîâîé îáðàáîòêè ñèãíàëîâ // Ýëåêòðîííûå êîìïîíåíòû, ¹ 5, 1999, ñ. 42—45. IEEE Standart 1149.1a –1993. ByteBlasterMV Parallel Port Download Cable, Data Sheet, «Altera corporation», ver.1, April 1998. AN74. High Speed Boards Design, «Altera corporation». Ñòåøåíêî Â.Á. ACCEL EDA: òåõíîëîãèÿ ïðîåêòèðîâàíèÿ ïå÷àòíûõ ïëàò. // Ì.: Íîëèäæ, 2000. Ñòåøåíêî Â.Á. ÏËÈÑ ôèðìû «Altera»: ïðîåêòèðîâàíèå óñòðîéñòâ îáðàáîòêè ñèãíàëîâ // Ì.: «Äîäýêà», 2000.
— 573 —