Jump to content

    

Artemius_tv

Участник
  • Content Count

    35
  • Joined

  • Last visited

Everything posted by Artemius_tv


  1. Зачем так много? У LPC2478 контроллер SDRAM работает на частоте ядра, т.е. не больше 72МГц.
  2. Так и не найдя более свежей документации, попробовал так. Для нулевого компаратора выставился 9-й бит в ISPR1 - т.е. сразу после ISP_EEPROM, который в документации последний. По аналогии добавил в startup вектор после EEPROM_IRQHandler и все заработало. Спасибо за подсказку. Но все же хотелось бы найти более новую нормальную документацию, неужели чип настолько непопулярен что ее нет.
  3. Всем привет! Кто нибудь пользовался компаратором в LPC4078? Разбираюсь с ним и уже обнаружил несколько проблем в документации - входы компаратора нумеруются то с 0, то с 1 (как оказалось надо с 1), перепутаны значения бита VLADREF. Про прерывания написано только в главе про компаратор, а в главе про NVIC про них и адреса их векторов ни слова. Ни в IAR, ни в MCUExpresso их векторов в таблице тоже нет. Может кто нибудь знает где их взять, или где взять User Manual версии более новой чем от марта 2014?
  4. Наверное, это ответ на Altera'вский MAX-10. Не всем нужны монстры в BGA с гигабитными трансиверами. А еще, помню, кто-то писал, что на Artix'е нельзя сделать устройство с таким малым потреблением как на Spartan'е.
  5. Если через визарда делать, то ISE 14.7 пишет "Active-HDL 8.3 or later".
  6. Если setup не сходится, то клок, если hold, то данные. У каждого пина свой элемент задержки, который только с ним можно использовать, значит экономить их смысла нет.
  7. Да Да. Что-то я тоже не нашел ничего в документации. Только совет подавать клок, от которого затактирован задерживаемый сигнал.
  8. Если не используете, то и не подключайте. Я у себя не подключаю. Кстати, в UG361 это явно написано: "implementation tools allow RDY to be unconnected/ignored".
  9. Разбираться с IDELAYCTRL особого смысла нет, у него нет настроек, он просто должен быть, если используются IODELAYE1 или подобные. На каждый регион пинов с управляемой задержкой приходится по одному IDELAYCTRL, котрый занимается калибровкой задержек. Для этого ему нужен тактовый сигнал 200МГц. Можно самому установить компоненты IDELAYCTRL для каждого региона, где используется управляемая задержка, прописав вручную LOC, а можно только один IDELAYCTRL без указания LOC, тогда ISE автоматически задействует нужные. Если его вообще не установить, то проект с использованием IODELAYE1 не соберется, ISE выдаст ошибку.
  10. Если интересно, что зачем и почему, почитайте UG361. Если нет, установите в топовом модуле один компонент: IDELAYCTRL_inst : IDELAYCTRL port map ( RDY => idelay_valid, -- выход сигнал готовности REFCLK => clk_200mhz, -- вход клок 200 МГц RST =>rst -- вход сброс );
  11. А компонент IDELAYCTRL установлен? Без него IODELAYE1 пользоваться нельзя. Ну и текст ошибки хорошо бы привести.
  12. А почему на DC-DC модуль DSN-MINI-360 (который максимум на 23В) идет ~220В?
  13. Ну, я это вариант не предлагал, а только написал свое объяснение (возможно, неточное или даже неверное :laughing: ). Кстати, в варианте: A[phase[15:8]] + (A[phase[15:8] + 1'b1] - A[phase[15:8]]) * phase[7:0] / 256 будет два обращения к памяти по адресу phase[15:8] и phase[15:8] + 1'b1, соответственно, нужно либо 2 такта, либо опять две таблицы. 4 счетчика, видимо (я опять только предполагаю), относится к самому началу темы, когда ТС спрашивал, зачем делить один счетчик на 10 маленьких.
  14. Видимо эти 2 таблицы это таблица значений и таблица коэфициентов для линейной поправки. Если берем 16 бит фазы phase[15:0], то старшие 8 бит будут использоваться для выбора значений из таблиц, а младшие 8 бит для линейной поправки. Если таблица A - значения, а B - коэфициенты, то что-то типа: A[phase[15:8]] + B[phase[15:8]]*phase[7:0]/256
  15. SerialLite посмотрите. Я с ним никогда не работал, но по описанию похоже на xilinx'овскую Aurora, на которой связь между ПЛИС'ами ораганизовывалась довольно просто без всяких процессоров.
  16. Нет, конечно же я наошибался. Надо In_reg(11 downto 10) <= Din(11 downto 10); In_reg(9 downto 0) <= Din_1; На следующий такт передаем старшие 2 бита в неизменном виде, а младшие 10 бит уже перевернутые или нет в соответствии с Din(10). Хотя Reg(4 downto 0) и Reg(10) все равно не используются. И с Sout <= "111111111111" + Reg (conv_integer(In_reg(9 downto 5))) when (In_reg(11) = '0'); else "111111111111" - Reg (conv_integer(In_reg(9 downto 5))); тоже ошибся, надо "011111111111" или "100000000000" Кстати, насколько я помню, количество используемых разрядов фазы должно быть больше разрядности ЦАП. В AD9834 ЦАП 10-битный и используют 12 бит фазы, AD9854 ЦАП 12-бит и 14 бит фазы. Т.е. для 14-разрядного ЦАП'а 12 бит фазы это мало.
  17. Самый старший (12-й) бит будет отвечать за знак, а 11-й за инвертирование фазы. Получается 11-й бит будет использоваться до регистров Reg, поэтому, наверное, лучше 32 таблицы на 32 значения. Таблицу нужно будет пересчитать (наверное, просто сдвинуть вниз и отбросить старший бит). Будет что-то вроде: ..... signal Din_1 : std_logic_vector (9 downto 0); ..... Din_1 <= Din(9 downto 0) when (Din(10) = '0') else "1111111111" - Din(9 downto 0); table0: process(clk, rst) begin if (rst='1') then Reg(0) <= (others=>'0'); elsif(clk'event and clk='1') then case Din_1(4 downto 0) is when "00000" => Reg(0) <= "000000000000"; when "00001" => Reg(0) <= "000000001010"; ..... process(clk, rst) begin if (rst='1') then In_reg <= (others=>'0'); elsif (clk'event and clk='1')then In_reg(11 downto 10) <= Din; In_reg(9 downto 0) <= Din_1; end if; end process; Sout <= "111111111111" + Reg (conv_integer(In_reg(9 downto 5))) when (In_reg(11) = '0'); else "111111111111" - Reg (conv_integer(In_reg(9 downto 5))); Надеюсь, нигде не ошибся.
  18. Думаю, для какого-нибудь осциллографо-строителя эти АЦП были-бы интересны, но только 1-2 штуки. А все вместе не пердставляю кому могут понадобиться.
  19. Раз ethernet гигабитный, то rx_clk получится использовать только как клок, слишком частота большая. Т.е. вопрос о использовании rx_clk и tx_clk как сигналы разрешения снят. Все равно нужно будет передавать данные с частоты PHY на системную через FIFO, а в каком месте удобнее делать переход - зависит от проекта. В ваших примерах делали законченный универсальный MAC-контроллер, вот и затактировали его от rx_clk и tx_clk. Если, например, нужно прицепить много PHY, то такое решение может оказаться слишком расточительным по ресурсам, как в примере Mahagam. Кстати, а почему решили использовать PHY с GMII, а не RGMII?
  20. Непонятно, зачем пропускать rx_clk через DCM/PLL. Если нужно сдвинуть клок и данные относительно друг друга, то в Spartan-6 есть IODELAY2. Если для "правильности", то у Xilinx, например, есть пример RGMII, там они берут rx_clk напрямую, без PLL. На rx_clk можно вообще практически ничего не делать, только складывать данные в FIFO, тогда можно rx_clk завести на региональный, а не глобальный клок. А всю обработку делать на внутреннем системном клоке после FIFO.
  21. Посмотрел проект с fpga4fun, там вообще нет интерфейса MII, а реализуется 10Мбит физуровень на FPGA и рассыпухе. Пример mentor'а я не видел, но возможно он старый, когда даже 25МГц были довольно большой частотой для ПЛИС, возможно рассчитан на поддержку скорости 1 Гбит, а может для экономии потребления. Если все это не ваш случай, то не вижу подвохов использовать фронты tx_clk и rx_clk как сигналы разрешения.
  22. Сумматор разбит на 10 маленьких для организации конвеера, чтобы повысить скорость работы. К алгоритму это все отношения не имеет. Поначалу можно заменить простым аккумулятором, а если не будет хватать скорости, уже думать об оптимизации. А если надо разобраться именно с этим кодом, лучше его просимулировать.
  23. Так у топикстартера Altera. У нее никогда аппаратных latch'ей не было. И у современных Xilinx вроде тоже уже нет, хотя могу ошибаться. Вообще: Latches are generally "a bad thing" - unless you really know what you are doing. Начинающему они точно не нужны. А сами вы часто их применяете?
  24. Нельзя. Хранится данные могут только в триггерах, а триггеры в ПЛИС должны быть синхронными. Можно, например, создать отдельный синхронный процесс: process(RX_CLK, LINK_UP) begin if(LINK_UP = '0') then DST_MAC <= (OTHERS => '0'); elsif(RX_CLK'event and RX_CLK = '1') then if rx_state = state2 then DST_MAC(sgnlRX_CNTR - 14) <= RX_DATA; end if; end if; end process; Лично я бы вместо DST_MAC(sgnlRX_CNTR - 14) <= RX_DATA; писал DST_MAC <= (RX_DATA&DST_MAC(0 to 4)); Вообще, я довольно коряво объясняю, лучше почитайте сами про синхронный дизайн.
  25. next_rx_state инициализировать не нужно - это должна быть комбинаторная функция от текущего состояния (rx_state) и других входных сигналов. Предупреждение "inferring latch(es) for signal or variable" игнорировать нельзя, это фактически ошибка. В ПЛИС все триггеры синхронные, и сохранять значение нужно только по клоку. А вы сохраняете значение в асинхронном процессе, хотя там вся логика должна быть комбинаторной. Зря вы за ARP-ответ принялись, да еще и на другом клоке, если и простой вариант нормально не синтезируется. Лучше попробуйте минимальный автомат сделать хорошо синтезируемым, про синхронный дизайн почитайте.