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

Timmy

Участник
  • Постов

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

  • Посещение

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


  1. Тип Integer имеет длину 32 бита, поэтому и conv_integer с большей длиной не работает. Если нужно больше 32 бит, используйте signed.
  2. Примерчик функции вращения для массива из целых чисел(синтезируемый, но, возможно, неэффективно). type integer_vector is array (integer range <>) of integer; function rotation(data:integer_vector, rot:integer)return integer_vector is constant length:integer := data'length; variable result:integer_vector(0 to length-1); variable i:integer; alias da:integer_vector(0 to length-1) is data; begin for i in result'range loop result((i+rot) mod length) := da(i); end loop; return result; end function;
  3. При обнаружении нового устройства BIOS записывает в таблицы ESCD/DMI, находящиеся на флэшке, информацию об этом устройстве, это стандартная операция, совсем не случайная. А потом BIOS начинает зависать, прочитав из ESCD/DMI информацию, которую не может правильно применить.
  4. Думаю, что поломался не код BIOS, а ESCD/DMI data, они вполне законно обновляются именно при конфигурации устройств. Жаль, что материнки обычно не умеют очищать DMI data без входа в BIOS setup, а умеют только глючить :smile3046: .
  5. Вот предполагаемая константа g7_U_3|pll_input_inst|altera_pll_i|general[1].gpll~PLL_OUTPUT_COUNTER|divclk на самом деле не константа, а содержит макроподстановку [1], так что TCL попытается выполнить команду без параметров с именем "1", которую, очевидно, не обнаружит и выдаст исключение, которое должно превратиться в предупреждение от TQ.
  6. Непонятно, у вас данные edge aligned или edge centered? Предполагаю, что всё же edge centered. Тогда output_delay более логично ставить -0.5 min и 0.5 маx без всяких offset. В случае edge centered data надо дополнительно вывести с PLL клок, повёрнутый на четверть периода, и подключить к tx_outclock именно его. Может быть, мегафункция LVDS сама это делает, но лучше руками, как des00 советует. В false_path ошибки - строковые константы, содежащие [], надо заключать в {}.
  7. По-моему, совершенно естественно, чтобы при циклическом сдвиге индексы новой позиции каждого элемента вектора определялись по формуле new_index = (current_index+rotation) mod n_elements_in_vector Право/лево зависит от того, в каком направлении возрастают индексы. Из этой же формулы следует, что отрицательное вращение можно интерпретировать, как вращение в другую сторону относительно положительного. В нашем случае индексы возрастают слева направо, отрицательный сдвиг будет влево, так что правильно.
  8. Уточнение, строки лучше закручивать в другую сторону, тогда при выборке колонок не надо переворачивать данные. 17 24 1 8 15 16 23 5 7 14 20 22 4 6 13 19 21 3 10 12 18 25 2 9 11 Для выбора строк использовать следующие параметры: address = row_index; rotation = -row_index; для выбора столбцов: address = (-column_index + memory_module_index) mod matrix_width (*пять в данном примере*) rotation = -column_index; При выборе строк адрес на все модули подаётся одинаковый, а при выборе столбцов он у каждого модуля свой, в зависимости от величины memory_module_index, которая является константой для каждого модуля памяти(от 0 до matrix_width-1).
  9. строки таблицы взаимно вращаете по единице на строку: модули памяти здесь сгруппированы по столбцам 17 24 1 8 15 5 7 14 16 23 13 20 22 4 6 21 3 10 12 19 9 11 18 25 2 Исходно все элементы столбца лежали в одном модуле памяти, а теперь они распределились по разным и их можно выбрать параллельно( данные столбца теперь выбираются по диагонали, а строки остались по строкам только с вращением). Правда, придётся ещё вращатель поставить, он больше всего места займёт, но всё равно сильно меньше чем двухпортовку на регистрах городить.
  10. Можно хранить данные по диагоналям. Тогда для каждого модуля памяти 32x4 потребуется генерировать свой адрес, правда, это на четыре бита сразу, так что места немного займёт. В зависимости от смещения адреса между соседними модулями(+1 или -1) будет выбираться строка или столбец.
  11. Надо в дизайне выравнивать клоковые линии. У вас, видимо, clk4x пошёл прямо на BUFIO, а clk - через BUFG, отсюда разница набегает. И констрейны надо правильно писать, я не просто так советовал изучать appnote.
  12. Отрицательный тайминг - это DCM компенсирует задержку в петле обратной связи, очевидно, петля через CLK получилась более длинная, чем путь CLK4X.
  13. В качестве делителя выхода VCO можно использовать OSERDES, они работают до максимальной частоты VCO, и позволяют поделить на любое чётное число, используя низкочастотную логику.
  14. Для начала советую полностью разобраться с xapp866.
  15. Поправлю, IDELAYCTR есть только в Виртексах и семёрках, а тут речь про Спартан, там всё не так. Хотя в Спартане действительно можно использовать IODELAY для выравнивания в DDR2 контроллере, поскольку задержки короткие и есть возможность его откалибровать. И при условии новой ревизии чипа, без сбоев времени задержки.
  16. Кривость IODELAY в том, что шаги могут различаться до 150ps, плавают в три раза по PVT, длина задержки не более полпериода, в старых ревизиях чипа были глюки, создаёт дополнительную задержку около 2 нс. PLL с внешней обратной связью позволяет выдавать наружу сигналы, строго привязанные к фазе входного клока независимо от PVT, с точно настраиваемым сдвигом фазы относительно входного клока, для этого использовать два выхода PLL - один только для обратной связи, другой для тактирования выходных триггеров и прочего.
  17. Эта задача решается с помощью PLL/DLL с внешней обратной связью(zero delay buffer). А IODELAY, в особенности такой кривой, как в S6, тут не помошник.
  18. По последним даташитам от 2013-14года S3E/S3A имеют статус Production и их мелким вариантам никакой альтернативы у Ксайлинкса нет.
  19. Например, плохо развязано питание MMCM, когда добавляется логика, от переменной нагрузки все напряжения начинают прыгать, а MMCM этого не любит.
  20. Ваши констрейны не работают. Макроподстановка изнутри {} не выполняется. В данном случае можно писать без фигурных скобок, так как списки из одного элемента. Если нужно больше элементов, то использовать команду list: неправильно: [get_clocks {$clk1 $clk2}] правильно: [get_clocks ] А вообще, чтобы отчёты выглядели красиво, по возможности следует руками описать все клоки, взяв команды из листинга derive_pll_clocks. Ещё, чуть не забыл: если вдруг значение clk1 внутри содержит пробелы, то без оно будет ошибочно принято за список и неверно интерпретировано, так что на всякий случай стоит использовать даже для списка из одного элемента. правильно прикроет пробелы внутри clk1 эскейп последовательностями, и пробелы не будут интерпретироваться, как разделители списка.
  21. Лаконично можно одним выражением описать: CODE_DC_OUT <= std_logic_vector(shift_left(to_unsigned(1, CODE_DC_OUT'length), to_integer(unsigned(CODE_DC_INP)))); Хотя кодогенерация для варианта с циклом может оказаться лучше.
  22. Как можно не останавливаться, если операнд команды ещё не определён? Хотя можно попробовать выполнить следующую команду, но внеочередное исполнение команд - это уже не слишком простенькая вариация. К тому же бесполезная, так как лучше расставлять команды в правильном порядке при компиляции:).
  23. Плох только тем, что места займёт больше, чем восьмибитный. А так все фирменные софтпроцессоры большой тройки - NIOS2,Microblaze,Mico32 представляют собой испорченный разными способами MIPS.
  24. Может версия active HDL слишком старая? Вообще по моим наблюдениям даже 9.1 не может нормально полноценно работать ни с Альтерой ни с Ксайлинксом. Библиотеки компилируются, но некоторые вещи глючат.
  25. Не все параметры описаны в даташите. Вы должны описать такую иголку в констрейне на клок. Если иголка будет слишком короткой, анализатор времянок должен выругаться. А если не выругается, это косячок:).
×
×
  • Создать...