Перейти к содержанию
    

Beby

Свой
  • Постов

    659
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Весь контент Beby


  1. Сам спросил - сам и отвечу: Всё дело в том, что я моделировал многоПЛИСовый проект, а сигнал GSR находится в VCOMPONENTS... и является общим для всех ПЛИС, поэтому, если в различных проектах по разному задано время GSR, то именно на эту разницу и появляется 'X' (несколько источников сигнала (ROC) работают на одну линию (GSR)). Глюк получился совместным: когда делали библиотеки для ISE явно не предполагали такого моделирования, а ModelSim не смог в DataFlow показать источники GSR.
  2. Хоть у меня и новый вопрос, но я решил всё-таки продолжить эту тему, т.к. тема идентична. Есть Xilinx ISE от 8.1 до 11.1 и ModelSim'ы SE 6.2f и SE 6.4c. Везде видел нижеизложенную проблему, хоть и чуть-чуть по разному. Проблема такая: при попытке промоделировать в ModelSim Post P&R VHDL модель (конечно вместе с SDF), внутренний сигнал GSR (Global Set/Reset) поочерёдно проходит 3 состояния: '1', 'X' и '0', естественно после состояния 'X' все триггера раскорячивает в 'X'. В ISE'ях вплоть до 9.2 с ModelSim SE 6.2f удавалось победить такое поведение путём уменьшения импульса GSR со стандартных 100ns до 5 - 20ns - конечно, это было неприятно, но коли удавалось обходить, то и тему не создавал. А вот с ISE 11.1 и ModelSim SE 6.4c не удалось обойти этот неприятный глюк. Может кто подскажет, как победить некорректное поведение Model Sim ?
  3. В S3A (по сравнению с S3E) модернизирована система распространения тактовых импульсов. Поддерживается большее количество IO стандартов, VCCAUX может быть 3.3В и, как следствие, поддерживаются LVDS 3.3V и LVPECL 3.3V (input only). Есть версия Spartan-3AN - всё тоже самое что и Spartan-3A, но в том же корпусе расположена и конфигурационная Flash ROM. Не имеет корпуса PQ208, только TQ144. S3A имеют Erata только на ES образцы (в отличии от S3E). Исправлен ряд мелких недоделочек присутствующих в S3E. Приблизительно так. Для более точной информации загляните в Spartan-3 Generation FPGA User Guide. Обратите внимание, что количество внутренних триггеров = количество Slice * 2 (правда не все эти триггера удастся использовать), а вот LUT возможно использовать все (их количество тоже = количество Slice * 2)
  4. А зачем вместо... У указанного notebook'и вроде же есть WiFi... да и в тех параметрах указано наличие RJ-45 для 10/100 Ethernet - куда дели ? Али дайте точную ссылку на тех. описание от производителя, а там поглядим, может кто-нибудь чего дельное и предложит. Да еще вроде и PCMCIA гнездо (1 Type II) имеется - всадите туда Ethernet сетевуху, если со штатной проблемы.
  5. Ну например вот - очень маленькая вырезка из одного из моих проектиков: NET "IN_CLK" TNM_NET = "CLK"; TIMESPEC "TS_CLK" = PERIOD "CLK" 15.0 ns HIGH 50 % INPUT_JITTER 250 ps; NET "CLK_UB" MAXDELAY = 2.4 ns; INST "CORE/IOB_BLK.CLK_BUFG" LOC = "GCLKBUF1"; NET "IN_BU1_nOE<0>" LOC = "P147" | IOSTANDARD = LVTTL | IOBDELAY = IFD; NET "IO_ROM_D<0>" LOC = "P163" | IOSTANDARD = LVTTL | IOBDELAY = NONE | SLEW = SLOW | DRIVE = 12; NET "OUT_CFDATA_N<0>" LOC = "P224" | IOSTANDARD = LVPECL; NET "OUT_ROM_A<0>" LOC = "P103" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 12; TNM_NET - говорит что: NET "IN_CLK" является членом группы временных ограничений TNM_NET = "CLK". TIMESPEC - для временной группы "CLK" задает параметры тактового сигнала. MAXDELAY - для NET "CLK_UB" задаёт ограничение на максимальное время распространения сигнала. LOC - задаёт расположение различных элементов. IOBDELAY - задаёт задержку во входной цепи IOB. SLEW - задаёт скорость нарастания фронта выходного сигнала. IOSTANDARD - задаёт стандарт ввода/вывода. DRIVE - задаёт максимальный выходной ток выходного сигнала. IOSTANDARD и DRIVE первым Spartan - не поддерживаются и даны для примера (всё опции которые поддерживаются тем или иным элементом Xilinx FPGA Вы можете увидеть при помощи FPGA Editor'а).
  6. У Вас в пакете есть замечательный инструмент, называющийся FPGA Editor - это программой Вы можете просмотреть детально как именно легли потроха ПЛИС. В Xilinx Foundation до версии 4.x (не Xilinx ISE - они начались с версии 5.x) при помощи графической оболочки ножки задаются только при помощи Constarint Editor'а, который правит UCF файл Вашего проекта. В принципе, в этот файл можно вносить изменения и ручками - многие делают именно так.
  7. Если есть тактирующие импульсы для ПЛИС, то САПР должен учитывать частоту, jitter и подобные параметры clock, который Вы подаёте на ПЛИС. Тогда САПР сможет Вам сказать будет ли работать Ваша схема на данной частоте или не будет - по моему это ключевой вопрос.
  8. Очень, очень давно (наверное лет 7 назад) тоже как-то мучился с подобным (translate не хотел часть исходников переваривать). Природа глюка оказалась такова: по различным причинам время файлов результатов переваривания было "новее", чем время у самих исходников (даже новых и свежеизмененных), тогда при опции Netlist Translation Type = Timestamp программа Translate действительно не будет переваривать такие исходники... Если у Вас этот случай, то лечится он путем установки Netlist Translation Type = On (всегда переваривать все исходники). Оптищитесь: помогло или нет - если нет - то буду дальше подумывать...
  9. Для этого используются design constraint. Обычно, constraint вписываются в файл UCF (User Constraint File). Описание constraint'ов Вы можете найти в файле CGD.PDF (Constraint User Guide) - он должен находиться на Вашей машине где-то внутри %Xilinx%. Для размещения ножек по корпусу Вам нужен constraint LOC. Также Вы можете воспользоваться Constraint Editor'ом - если я правильно помню, то эта программа в указанной Вами среде позволяет задать расположение ножек ввода/вывода и Slew Rate для каждого выхода, также обязательно задайте параметры входного clock.
  10. Могу конечно заблуждаться, но мне кажется, что Вам не нужно именно по LVPECL тактировать АЦП ADS5474. Вам нужно тактировать ADS5474 по CLK и nCLK, чем-то с размахом от 0.5В до 5В (!). Теретически, в случае с ADS5474 можно воспользоваться LVPECL_25 OBUF и намесить рядом пачку резисторов, как нарисованно в Virtex-X Datasheet. Но Вы можете и пересчитать номиналы резисторов так, чтобы в 100Омном резисторе (лежащем на входе ADS5474) выделялось напряжение большее, чем 0.85мВ (паспортное значение LVPECL). Грубо говоря Вы можете поставить LVCMOS_25 OBUF (или LVCMOS_33 OBUF - так common mode voltage будет поближе к внутреннему 2.4В) и поставить последовательные резисторы (назовём их R1) на эти выходы. На вход АЦП поставьте резистор (обзовём его R2). Теперь необходимо развести пату так, чтобы линии CLK и nCLK обладали волновым сопротивлением не менее 50Ом к земле и в двое большим отновительно друг-друга. Волновое сопротивление отновительно друг-друга обзовём Z0. Тогда R2 = Z0, А R1 = R2/2 - Rx, где Rx - сопротивление OBUF, которые Вы будете использовать. Вот, вроде так получается... и LVPECL тут совсем ни при чем. В Datasheet АЦП ADS5474 чётко написанно, что: Differential output voltage = 350 мВ (-+30%) Common-mode output voltage = 1.25мВ (-+10%) А такое должно нормально воспринималься LVDS_25 IBUF. (куда, как и с чем вместе их можно запихивать я уже писал выше). Наверное, у этого "внешнего устройства" используется стандартный LVDS, и тогда подойдут LVDS_25 OBUF. Да, элемент глумления определённо присутствует, ибо требования к clock для этого АЦП очень жесткие, но возможно если не использовать DCM в ПЛИС, то можно прокачать насквозь чистенький входной clock... но зачем тогда тактировать с ПЛИС ?.. С другой стороны сказано, что clock может иметь duty cycle от 40% до 60%, и в тоже время так ненавязчиво намекают, что АЦП работает по обоим фронтам и при не 50% получим дополнительную погрешность...
  11. Э-хе-хе, да что ж из Вас приходиться выпытывать, что и как Вам надо сделать (не мне, а именно Вам)... а Вы упорно молчите как партизан (как будто мне надо содрать Ваше тех. решение)... Ну, т.к. Вам предстоит связывать ПЛИС с внешними устройствами, то внимательно поглядите какие уровни напряжений требуются именно этим устройствам (т.к. Вы их упорно не называете, то и о всяческих гадостях я рассказать не могу). Так случилось, что обычно LVPECL имеет уровни 3.3В, а Xilinx FPGA никогда не имели настоящих LVPECL выходов: во первых имеется смещение средней точки, во вторых LVPECL эмулируется на резюках, что приводит к низкому КПД такой схемы... Да и очень похоже на то, что нет никаких LVPECL выходных буферов с Xilinx FPGA, а есть LVCMOP выходы с подбором определенных выходных параметров. В Datasheet на Virtex-4 и Vitex-5, в конце есть интересный раздельчик Revision History: DS202 - c 11/05/07: Removed unsupported I/O standard (LVPECL_33) from Table 58 and added LVPECL_25. DS302 - с 12/11/07: Removed unsupported I/O standard (LVPECL_33) from Table 58 and added LVPECL_25. Для Virtex-4: LVPECL_25 IBUF и LVDS_25 IBUF могут находиться в любых IO BANK для которых выполняется: Table 6-38: I/O Compatibility - Note 2: Differential inputs are powered from VCCAUX. However, pin voltage must not exceed VCCO, due to the presence of clamp diodes to VCCO. Согласно той же таблице LVPECL_25 OBUF и LVDS_25 OBUF требуют VCCO = 2.5В. Посему LVDS_25 IBUF можно затолкать и к LVCMOS_33 OBUF (VCCO = 3.3V) и к LVPECL_25 OBUF (VCCO = 2.5V). Для Virtex-5: справедливо всё вышесказанное, но только теперь надо глядеть в Table 6-39 (I/O Compatibility). А вот если Вам нужен полноценный LVPECL (на 3.3В), тогда Вам прийдётся либо (как мне) собирать эмуляцию LVCMOS_33 и быть готовым к неприятностям от заниженной средней точки, либо (как в тихоря рекомендует Xilinx) ставить нормальные преобразователи LVDS (настоящий, а поэтому 2.5В) в нормальный LVPECL (3.3В). Тогда у Вас все выходы станут LVDS_25, и, соответственно, отпадут все вопросы о том, чем и как их питать.
  12. А теперь ключевой вопрос, от которого зависят рекомендации и список литературы на изучение: как и для чего Вы планируется использовать LVDS и LVPECL ?
  13. Alexandr ответьте вот на какие вопросы: 1. Вам для Virtex-4 или для Virtex-5 ? 2. Укажите направление работы LVDS и LVPECL, о котором Вы хотите узнать (input или всё-таки output ?) Вопрос вообще-то не элементарный и содержит определённое количество заморочек, на которые лучше не нарываться.
  14. Да, их хватит, но в случае, если действительно есть что оптимизировать по делу, то тогда остальной проект может стать субоптимальным. Посему я советую всё-таки использовать Equivalent Register Removal локально.
  15. Думаю проблема именно в KEEP - обычно этот constraint вынуждает MAP/PAR так вывернуть схему, чтобы сигнал, на который навешен KEEP, был либо выходом LUT, либо выходом Slice FF (что мы и имеем в Вашем случае). Замените KEEP на equivalent_register_removal = false. LOC Вам не нужен - конечно, с LOC получается железобетонно, но от этого страдает гибкость проекта. В подобных случаях я используютолько пару constraint'ов: equivalent_register_removal = false и iob = true.
  16. Я смотрел на проблемы отсутствия SLOAD и как бы их обойти... Да без SLOAD иногда понадобиться использовать 2 LUT4 сцепленных каскадно, или более хитро, ISE 9.2 уже научился уже это делать хорошо,.. даже слишком хорошо. А SLOAD - один на весь LAB, также как и ALOAD, SCLR; а ACLR и CLKEN - только два на все LAB триггера. Да, эти управляющие линии очень приятны, но уже очень их ограниченный набор на весь LAB... А жаль, задумка полезная, побольше бы было таких независимых линий и было бы очень хорошо. У Xilinx FPGA на каждый Slice приходит по своему CE, CLK, CLR/RST, PRE/SET - правда, есть архитектурный недостаток - эти сигналы всегда подаются на оба триггера в Slice. Но в Slice только 2 триггера,.. а в LAB до 16. У Xilinx есть GSR (Global Set/Reset), только он сбрасывает все триггеры кристалла, поэтому эти цепи выброшены из схемы Slice. А по поводу активного использования асинхронных сбросов и предустановок только недавно (в пределах полугода назад) обсуждался вред такой техники работы - уж очень надо аккуратно работать с ними - не все могут справиться, поэтому с синхронными сигналами Set/Reset понадежней получается. А зачем... между соседними CLB сигналы передаются по коротким трассам - это я и имел ввиду под разницей разводочного ресурса, в Spartan и Virtex между соседними CLB груда трас... и все они быстрые (поэтому их и не выпячивают с помпой), а что по ним передавить - неважно: выход логики X (Y) или выход триггера XQ (YQ), причем всё равно какого Slice из имеющихся в CLB. А в пределах CLB данные передаются еще быстрее. Он действительно не всегда нужен, но когда нужен, то очень полезен. Для чтения Distributed RAM - асинхронная память. При любом использовании LUT4 можно использовать и FF, правда, если LUT4 используется не как ROM, то с некоторыми небольшими ограничениями (clock у них общий...) А вот, например, в Pico Blase на 32 LUT собирается 16 16-разрядных регистров S0-S15 с 2 выходами, со встроенными дешифраторами адреса, выходными коммутаторами и почей обвязкой характерной для SRAM - получается очень компактно и блочная память не расходуется. Редкость... поэтому место отвода динамически задается адресом (входными данными LUT'а - 4 бита) - и можно выбирать какую ячейку мы хотим увидеть от 1 до 16. Есть еще и специальный выход для каскадирования - там всегда данные с 16-ой ячейки. Ну пользуйте триггеры в Spartan - кто Вам не даёт ? При этом тоже можно использовать оба LUT4 сколько влезет. Про то, что у Xilinx все короткие трассы соединения достаточно "быстрые" - я написал выше, да и ниже тоже. По моему не может, для этого понадобится собрать внешний генератор адреса... А если нужет не очен длинный сдиговый регистр (например на 64 бита) можно воспользоваться теми самыми SHR16, соединенными каскадно, а блочную память использовать для чего-либо более полезного. CycloneII Architecture, 2 абзац: The logic array consists of LABs, with 16 logic elements (LEs) in each LAB. Cyclone III Device Handbook, Volume 1: The logic array block (LAB) consists of 16 LEs and a LAB-wide control block. Ну да мне всё-равно. У X есть груды local line - это линии с малым временем распространения сигнала на "близкие" расстояния. У Spartan-3A от каждого CLB расходятся local lines предназначенные для достаточно быстрой (для предельных частот работы ПЛИС) к восьми соседним CLB. Для передачи данных на большые расстояния есть local lines пробрасывающие сигнал на 3 и 6 CLB одновременно, если надо еще дальше, то используется каскадное включение local lines, или уже long line. Если не лень гляньте FPGA Editor'ом в любую Xilinx FPGA и Вы увидите все детали этого кристалла (и заметьте: разводочный ресурс потребляет очень много места в Xilinx FPGA). Мои соседи сидят на Cyclone 1, 2 и 3, он им подходит больше, в т.ч. и из-за большего количества "маленьких" (4K) блоков памяти на триггер - такие задачи. А мне больше подходит Xilinx FPGA... - такие задачи. Да весьма похож, но не он (нет Distributed RAM)... интересно кто появился раньше Virtex 1 или Arria ? P.S. Недеюсь нигде не опечатался. Вот, наверное, и описаны основные + и - для Spartan-3x и Cyclon 1, 2, 3... в сравнении так сказать.
  17. Всё может быть. С Alter'ой не работаю, поэтому давал информацию с чужих слов (недавно прикидывали: какую ПЛИС дешевле поставить - сейчас переуточняем, спасибо за полезное замечание). Это просто замечательно, что FPGA со встроенной Flash дешевле ! Правда, остается еще вопрос цены обвязки... тех же преобразователей питания.
  18. Читаем в XAPP440 - Power On Behavior of Xilinx CPLDs третий абзац: CPLDs must reset to a known state and load an internal configuration pattern (EPROM) into volatile logic cells (SRAM), extremely quickly, to appear ”instantaneously on.” In the case of CoolRunnerTM CPLDs, to save power, internal EPROM cells are powered down after configuration. Configuration is also performed in XC9500TM, XC9500XLTM, and XC9500XVTM CPLD families as the power supply voltage rises, though due to architecture differences the mechanics are significantly different. Loading the EPROM into volatile memory saves power, but comes with the price of extended configuration time. To speed up configuration, a fast state machine starts early – when the VCC is about two-thirds of the way to VCCMIN. This presents a gap in output pin tracking, as the pins remain unconfigured until the configuration point. They become configured when their SRAM cells are loaded. Чтобы не быть голословным положу общую схему Slice (CLB - этообъединение 4 Slice, у каждого CLB свой магистральный коммутатор). 1. Ну, как делать LOAD сквозь цепь переносов, я уже показывал с соседней теме. Если очень надо загружать напрямую, то есть 2 варианта блокировки переносов: а) Через MULTAND. б) Собственно говоря - прямое поддавление входного переноса. После этого SLOAD особого преемущества не имеет. 2. SCLEAR - ну в Slice к паре триггеров одновременно подходит и RST/CLR, и SET/PRE. Т.к. использование асинхронного сброса (предустановки) черевато, то обычно он не используется. Для каждого Slice независимо конфигурируется синхронность/асинхронность сбросов/предустановок. Поэтому, думаю у Xilinx это место более богатое, чем у Alter'овских Cyclon'ов. 3. LUT4 - он и в африке LUT 4, но у Xilinx он может работать и как Disributed RAM 16x1 Два LUT4 одного Slice могу образовывать DualPort Disributed RAM 16x1. Еще можно сконфигурировать LUT4, как SHR16 - 16 битный Shift Register. И для Disributed RAM, и для Shift Register есть специальные трассы? позволяющие каскадировать элементы (наращивать глубину адреса). В Alter'овских FPGA ничего подобного нет ! Или я ошибаюсь ??! (DualPort Disributed RAM прекрасно подходит для перехода из одного clock domain в другой. А Shift Register можно использовать, как линию задержки динамически управляемой длинны.) 4. LAB имеет только разных 2 CE и 2 CLK на все 16 триггеров - или не так ??? А каждый Slice имеет независимый (от других Slice'ов) управляющие входы CE, CLK и т.п. 5. "Касаемо разводки - структуры очень похожи" только на первый мутный взгляд (с очень из далека и на общую структуру). Разуете глаза и Вы увидите разницу: LAB и CLB достаточно сильно отличаются, поэтому и разводочный ресурс реализован несколько по разному. 6. У Coclon 3 в IOB нет Pulldown - мелочь, а как неприятно... Да и у Spartan-3A очень богатая поддержка всяческих I/O стандартов (в т.ч. и LVPECL (!), TMDS, RSDS и много чего другого). При необходимости, в Spartan-3A парные DDR триггера могут тактироваться 2 разными по природе clock'ами. Но это уже вопросы Unholly War.
  19. Вы несовсем правильно используете терминологию: SRAM-based PLD - это PLD со SRAM-Based Logic Generator (т.е. LUT, на котором строятся FPGA), а признаком CPLD является PAL Logic Generator (или более совершенный PLA Logic Generator, как у CoolRunner 1 и 2). А то, что сейчас CPLD копируют содержимое EEPROM в SRAM для экономии энергии... ну такая вот технология применяется... на мой взгляд это не плохо и не хорошо, просто это так есть. Кстати, даже класcический Xilinx CPLD - XC9500 копирует содержимое EEPROM в SRAM, которым и управляются конфигурационные ключи. Однако, SRAM-based PLD у Alter'ы и Xilinx несколько отличаются построением. На мой взгляд Alter'овские Cyclon’ы (с 1 по 3) всё-таки поближе будут своими LAB к CPLD'шным Functional Block, нежели Xilinx'овскме CLB (и Slice). Да в CollRunner 2 наворотили всякого мелкого приятного, но генератор логической функции PLA, а значит CollRunner 1 и 2 - CPLD. (кто не верит - путь проверит, например у производителя). В ближайшее время CPLD с рынка не уйдут, есть решения где они очень хорошо живут, пока CPLD (с размером до 256 включительно) стоят дешевле, чем самые мелкие MAX II и Spatran-3AN.
  20. Нууу,.. Вы можете воспользоваться на сайте Xilinx пипкой Online Store... и получить цены от AVNet - они являются вторым официальным представителем Xilinx в СНГ. А заодно можно оценить снижение цена от количества покупаемых ПЛИС. А это цены от Inline Group (первого официальным представителя), но т.к. тут маркетинг и п.т. мозгопаренья то приходиться с жестокими боями вырывать хоть какие-то цены... это кстати цены на начало 2009 года для "обычный покупатель" - т.е. практически предельно высокие цены. Соответственно, пока Вы с ними не свяжетесь Вы не узнаете сколько ПЛИС будут стоить именно для Вас.
  21. По моим сведеньям получается где-то так: Наиболее дешевые Xilinx FPGA - это: XC3S50A-4VQ100C - 6.7$ XC3S50A-4TQ144C - 9$ XC3S50AN-4TQ144C - 10.8$ Мне более симпатична XC3S50AN-4TQ144C т.к. у нее встроенная Flash ROM. А если есть с чего грузить (с MC например), то тогда предпочтительней XC3S50A-4VQ100C. Естественно цены приблизительные и даны для оценки % соотношения цен между вариантами.
  22. Вообще-то так (с мультиплексором до инкремента) даже проще получается,.. надо только привыкнуть (коэффициент для загрузки вычислять проще: Load_Data = 2^N - X, где N - разрядность счетчика, X - коэффициант деления этого счетчика). У Xilinx несколько другое построение Logic Cell (там Slice'ы)... в которых нет SLOAD (LAB Wide), и поэтому приходиться делать именно так, как я описал. Но, собственно говоря, вопрос был про Jitter и работу на достаточно невысокой частоте. Мы же несколько отклонились от темы - как-то нехорошо получается.
  23. Вот пример подобного делителя (на 2,4,6,8,10,12,14,16). library IEEE; use IEEE.std_logic_1164.all; library unisim; use unisim.vcomponents.all; library work; use work.HardSynP.all; entity DIV is port ( DIV_RG_D: in std_logic_vector(2 downto 0); DIV_RG_CE: in std_logic; CLK: in std_logic; OUT_CLK: out std_logic ); end entity; architecture Tushka of DIV is signal DIV_RG: std_logic_vector(2 downto 0); signal DIV_CB_CY: std_logic; signal DIV_CB_CY_L: std_logic; signal OUT_CLK_INT_FF: std_logic := '0'; signal OUT_CLK_IOB_FF: std_logic := '0'; attribute IOB of OUT_CLK_IOB_FF: signal is "true"; begin DIV_RG_I: entity HS_FD(FDRE) generic map ( nInit => 0, nX => 1, nY => 0, sUSet => "DIV_CB" ) port map ( D => DIV_RG_D, CE => DIV_RG_CE, C => CLK, INIT => '0', Q => DIV_RG ); DIV_CB_CY_FF: entity HS_CB_CI_FD(CB_CI_FD) generic map ( nInit => 0, nX => 0, nY => 3, sUSet => "DIV_CB" ) port map ( CE => '1', C => CLK, INIT => '0', Q => DIV_CB_CY_L, CI => DIV_CB_CY); DIV_CB: entity HS_CBRELIO(CBRELIO) generic map ( nInit => 0, nX => 0, nY => 0, sUSet => "DIV_CB" ) port map ( D => DIV_RG, L => DIV_CB_CY_L, CE => '1', C => CLK, INIT => '0', CI => '1', CO => DIV_CB_CY ); OUT_CLK_INT_FF <= not(OUT_CLK_INT_FF) when rising_edge(CLK) and DIV_CB_CY = '1'; OUT_CLK_IOB_FF <= not(OUT_CLK_INT_FF) when rising_edge(CLK) and DIV_CB_CY = '1'; OUT_CLK_OBUF: component OBUF port map ( I => OUT_CLK_IOB_FF, O => OUT_CLK); end architecture; Если необходимо еще выше поднять рабочую частоту, то тогда вместо DIV_CB_CY необходимо использовать DIV_CB_CY_L: OUT_CLK_INT_FF <= not(OUT_CLK_INT_FF) when rising_edge(CLK) and DIV_CB_CY_L = '1'; OUT_CLK_IOB_FF <= not(OUT_CLK_INT_FF) when rising_edge(CLK) and DIV_CB_CY_L = '1'; Думаю необходимо дать следующие пояснения: 1. Это переработанное ядро управляемого делителя частоты (в оригинале был 24 разрядный делитель, да и использовался сам сигнал DIV_CB_CY_L) 2. Описанная выше схема использует мою собственную библиотеку HardSyn. Эта библиотека имеет набор различных элементов оптимизированных под конкретные кристаллы (в приведенном примере для Xilinx Spartan-3x). 3. Почти все примитивы в элементах библиотеки имеют constraint RLOC, что позволяет задать взаимное расположение элементов (sUSet - задает название группы, а nX и nY - относительное положение "вершины" элемента). 4. HS_FD(FDRE) - просто D триггера. 5. HS_CBRELIO(CBRELIO) - загружаемый счетчик (необычностью данного счетчика является то, что инкремент производиться всегда, а вход L задает что сейчас необходимо инкрементировать: текущее значение счетчика (L := '0'), или входные данные - D (L := '1'). Т.к. цепи переноса никогда не блокируются, а вся логика в каждом разряде использует только 1 LUT - то достигается предельно возможное быстродействие). 6. HS_CB_CI_FD(CB_CI_FD) - триггер, предназначенный для поимки выходного переноса счетчика (использует dedicated линии переноса - имеющие "нулевую" задержку). Да, понимаю, при таком подходе лучше, конечно, использовать схемное отображение соединения блоков - нагляднее и красивее... но, видать не судьба. Со схемными редакторами есть проблемы при обновлении ПО, а эта библиотека пережила Xilinx ISE от 5.1 до 11.1, да и у AHDL со схемным редактором при смене версий тоже не всё гладко. А код на языке - он для всех версий одинаков (и можно после работы в более новой среде безболезненно возвращаться к предшествующим).
  24. Да есть такой метод (и очень хорошо помогает), но в данном случае это обязательное требование (наличие Output FF), поэтому, на мой взгляд, теневое register duplication не подходит - это надо делать в явном виде, а потом еще и проконтролировать, что после оптимизаций всё получилось как задумано.
  25. Мдааа. Конечно, я с Cyclon 3 не работал, но визуально схема - отвратительная (на уровне начинающего): 1. Выходной триггер имеет обратную связь, в нормальных ПЛИС в IOB это не ложиться (или у Cyclon 3 нет выходных триггеров ?) - соответственно будет прирост jitter'а за счет передачи логического сигнала к выходному буферу (обычно clock распространяеста по ПЛИС с меньшим jitter'ом, чем все остальные сигналы). 2. Э-хе-хе... Кто ж так делитель делает ??! Нормальные люди используют выходной перенос (назовём его CY) загружаемого счетчика: сам CY подается на счетный триггер, сигнал с которого подается на дополнительный выходной триггер (обязательно выходной триггер, иначе дополнительный прирост jitter’а). Дополнительно CY подаётся на вход Load это загружаемого счётчика, а вот значением, которое загружается - выбирается количество тактов, которое счетчик будет досчитывать до переноса (т.е. коэффициент деления). Такая схема значительно компактнее и быстродейственней... если конечно суметь правильно сделать тот самый загружаемый счетчик.
×
×
  • Создать...