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

Timmy

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

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

  • Посещение

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


  1. Если посмотреть в BSDL для V6, то INIT_B и M0-M2 в регистре сканирования присутствуют, то есть подёргать их через JTAG в тестовом режиме теоретически можно. Но при загрузке конфигурации тестовый режим JTAG придётся отключить, M0-M2 вернутся в состояние, заданное внешними пинами, и не известно, как загрузчик на это отреагирует. Может быть, и будет продолжать работать со значением, защёлкнутым ранее через JTAG. Или глюканёт:).
  2. Действительно, дженерики не могут ссылаться друг на друга. В данном случае я делаю примерно так: BW_PROD : integer := 0; -- разрядность внутреннего произведения ... constant BW_PROD_REDEF:natural := iif(BW_PROD /= 0, BW_PROD, BW_IN * 2 - RND_PROD_BITS); iif(inline if) - функция, которую я сам определил в своём стандартном package для подобных случаев, так как оператора "? :" в VHDL нет, чтобы затруднить вражеским шпионам чтение кода, зато есть перегрузка функций.
  3. Чтобы не давать транзистору(bc847) насыщаться, я включал диод шоттки между коллектором и базой. Когда напряжение коллектора опускается ниже базы, диод открывается и отсасывает в коллектор весь "лишний" ток из базы, создавая вместо насыщения глубокую отрицательную ОС. На большой мощности может потребоваться ещё диод последовательно с базой, так как напряжение насыщения коллектора повыше.
  4. А считали, какой модуль импеданса у нагрузки на частоте 500кГц? У меня получается 942 Ома для 300мкГн, в таких условиях получить 50% КПД не реально даже на низкой частоте. Только если использовать пассивную компенсацию (то есть конденсатором:)), и конденсатор нужно достаточно точно подбирать под индуктивность и частоту. Кстати, напряжение на индуктивности будет около 190 Вольт.
  5. Амплитуда сигнала после усиления даже на короткое время не должна превышать vref/2(это вовсе не напряжение питания), иначе дельта сигму может выносить. Видимо, TI и AD оставляют больший запас устойчивости. Помеха по какой-то причине может появлятся только в полевых условиях. Тогда потребуется НЧ фильтр на вход.
  6. Декларации компонентов можно описывать в пакетах. А entity - нельзя. В package body пишутся только тела функций и процедур пакета.
  7. Нет, там не даётся чёткой системы и не рассмотрены некоторые тонкие моменты. Например, все смогут сходу без подсказки сказать, что выдаст следующая строчка? puts ; puts ; puts ; puts ; puts ] ; puts ]
  8. Поскольку $i внутри фигурных скобок, подстановка $i не выполняется, отсюда и ошибка. Тут вместо фигурных скобок можно использовать бэкслэш для прикрытия квадратных скобок и кавычек: add wave -divider \"for_ext_inst\[$i\]\" add wave sim:/for_ext_test/for_ext_inst/gen_block\[$i\]/for_int_inst/* А вообще, кажется, нужно срочно написать небольшой гайд по синтаксису списков и подстановок tcl, там всё очень просто, если въехать, но вменяемой литературы по теме мне как-то не попадалось.
  9. Во-первых, лучше не прятать rising_edge() в функции и внутрь других if, за исключением условия асинхронного сброса/загрузки. Во-вторых, список чувствительности процесса не задан.
  10. {*} - это с TCL8.5, а по олдскульному надо было писать eval exec gcc $L_OPT $srcline Вот для этого как раз и нужен был eval - чтобы передать команде exec элементы списков L_OPT и srcline, как отдельные параметры.
  11. К конфигурационной SPI Flash подключаются через JTAG. В IMPACT над значком чипа FPGA будет значок SPI/BPI, нажав на который, можно задать прошивку этой флэшки.
  12. В данном случае(где вы догадались) вообще не надо передавать $source_list, этот параметр просто лишний. По возможности лучше возвращать значение через return, как вы и сделали. Однако можно возвращать значение и по "ссылке", передав строку с именем переменной, куда надо присвоить значение. Переменную верхнего уровня, имя которой было передано, следует связать с какой-либо локальной переменной при помощи upvar. proc hell {ref} { puts "\"ref\" is \"$ref\"" upvar $ref local_link_to_ref set local_link_to_ref "Hello world from hell!" return "OK" } hell my_var puts $my_var
  13. Умножать придётся аналоговым перемножителем:). На самом деле, поскольку сигнал с колебательного контура вполне синусоидальный, его можно умножать и на меандр, так что можно использовать какой-нибудь простой смеситель. Поскольку в данном случае НЧ фильтр имеет характеристику, симметричную относительно нулевой частоты, он реализуется, как два одинаковых независимых фильтра для каналов I и Q.
  14. Сигнал с выхода колебательного контура(IN) умножается на комплексную синусоиду(S0), синхронную с генератором, в результате частота сдвигается в нуль. Затем пропускается через комплексный НЧ фильтр. Комплексный угол сигнала с выхода фильтра(F) будет равен сумме фаз исходного сигнала IN и комплексной синусоиды S0 . Можно выбрать такое соотношение фаз между генератором и комплексной синусоидой S0, чтобы в точке резонанса угол сигнала F обращался в нуль. Тогда для нахождения резонанса потребуется вычисление только мнимой части F, однако нельзя будет почти линейно определять величину отклонения от резонанса по углу сигнала F. Подобный алгоритм можно реализовать и в цифре и в аналоге.
  15. Метод передачи данных по SGMII зависит от отрезка сеть-физика, поэтому PHY сообщает MAC о состоянии внешнего линка(UP/DOWN, DUPLEX MODE, SPEED) через регистр конфигурации, который пересылается по гигабитному линку, независимо от SMI. Это является частью протокола SGMII.
  16. Можно сместить рабочую точку немного вверх, включив резистор между +ОУ и шунтом и второй резистор между +ОУ и положительным опорным напряжением. Номиналы, к примеру, 510 и 20000.
  17. Не понимаю, где именно надо мухлевать? Умножая два числа по 18 бит, получаем 36 битный результат. Если числа интерпретировались как fixed point с 2 бита целой частью и 1 бит знаком, то результат содержит знак и 5 бит целую часть. Причём если никогда не умножать -2**18*-2**18(в целом представлении), то старший бит результата можно выкинуть.
  18. Неправильный, так как он не предотвращает зацикливание while, который, в отличие от always, не будет ждать следующего дельта-цикла перед повтором. Правильней так: module tst1( output reg q=0, input d1, d2, d3, clk ); always begin if(!d1) @(d1); while(d1)begin if(!d2) @(d2 or negedge d1); while(d2)begin if(!d3) @(d3 or negedge d2); while(d3) @(posedge clk) q <= ~q; end end end endmodule Нужны if-ы или нет, не совсем очевидно, лучше не рисковать:).
  19. Это я путаюсь между VHDL и Verilog. В VHDL в подобной конструкции будет завершение ожидания по уровню, а в Verilog - только по обоим фронтам. Тогда этот код неправильный, а правильно как-то так: module tst1( output reg q=0, input d1, d2, d3, clk ); always begin if(!d1) @(d1); while(d1)begin if(!d2) @(d2 or d1); while(d2)begin if(!d3) @(d3 or d2); while(d3) @(posedge clk) q <= ~q; end end end endmodule
  20. Я вот тоже так подумал, кто будет решать дурацкие задачки? Правильно, только дураки:). Поведение вериложного while в этом смысле нисколько не отличается от поведения сишного, всё очень просто. Ещё один способ обеспечить симулируемость без полного перелопачивания алгоритма - это добавить ожидания по сигналам: module tst1( output reg q=0, input d1, d2, d3, clk ); always @(d1) while(d1) @(d2 or ~d1) while(d2) @(d3 or ~d2) while(d3) @(posedge clk) q <= ~q; endmodule
  21. Да, если d1,d2,d3 регистровые выходы, синхронные с clk, то весь дизайн переходит к синхронному, и условия установки/сброса можно упростить, однако в условиях задачи этого не было:).
  22. Тут, помимо q, извращённым способом определены ещё 3 триггера, назову их d1t,d2t,d3t(у каждого выход .q), условия установки/сброса следующие: d3t.reset = ~d3 && posedge clk d3t.set = d2t.q && d3 d2t.reset = ~d2 && ~d3.q d2t.set = d1.q && d2 d1t.reset = ~d1 && ~ d2.q d1t.set = d1 Сплошная асинхронщина, в некоторых ПЛИС нет RS триггеров, придётся на LE слепить:). Хотя, это можно как то и упростить, наверное, но думать лень, задача дурацкая.
  23. Неужели реально конкурировать, скажем, вот с таким китайским, за 3.4$ ?
  24. Этот код можно рассмотреть, как три вложенных конечных автомата, образуемых состояниями (counter,sclk_temp,state), смена состояния внутреннего автомата происходит при завершении цикла на более внешнем. И лучше использовать сигнал для хранения state. if counter /= time_2 then counter <= counter + 1; else counter <= 1; sclk_temp <= not sclk_temp; if sclk_temp = '1' then d_in_temp <= command_data(state_to_command_data_index(state)); if state=state_end then state <= state_start; else state <= state+1; end if; end if; end if; Если state имеет также и нециклические состояния, то вышеприведённую циклическую часть можно внести в ветку others=> для нециклического case state и if state=state_end убрать.
×
×
  • Создать...