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

flammmable

Свой
  • Постов

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

  • Посещение

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


  1. Одноразовых в пределах периода дискретизации. Если иглы толще двух периодов, то МЖФ из трех триггеров начнет распознавать их не как иглы, а как сигнал. Если иглы сильно тоньше одного периода, то они и так не повлияют на передачу.
  2. Она и так делается в середине интервала. При переходе автомата в состояние START_WAIT задержка устанавливается в delay_cnt<= CLK_DIVIDER/2; Далее при переходе в состояние BIT_WAIT задержка устанавливается в delay_cnt<= CLK_DIVIDER; А вот это - вопрос дискуссионный. Можно сделать мажоритарный фильтр, можно включить в UART бит паритета, можно добавить handshake, можно прикрутить CRC16 и т.д. Но все эти вещи не решают проблемы, а маскируют их. Возможна ситуация, что необходима безошибочная работа устройства в течение 1 часа, а некая ошибка происходит раз в 6 часов. Вроде неплохо. Но и не хорошо. Прикручиваем CRC, к примеру, и ошибка возникает раз в 1 неделю (когда неизбежно случается коллизия контрольной суммы). Отлично! А теперь предположим, что необходима безошибочная работа устройства в течение 1 часа, а некая ошибка происходит раз в 10 минут. Прикручиваем CRC и ошибка начинает повторяться раз в 6 часов. Затем устройство передается из производства в эксплуатацию, а там оказываются какие-либо специфические условия, не покрытые тестами. И - оп! Ошибка начинает появляться именно раз в 1 час. Но теперь её сложнее локализовать. Представляется что у всех этих фильтров и контрольных сумм важной функцией является возможность разом их отключить для проведения диагностики.
  3. Творчески переосмыслив советы, добавил reg rx_inner; и в том же always прямо перед case добавил rx_inner <= rx_in; . А все дальнейшие операции с rx_in заменил на операции с rx_inner. Ошибка больше не появляется. Всем спасибо!
  4. Осциллограмма снималась с дополнительных пинов ПЛИСа, которым были назначены (при помощи assign): 1) (синий) rx от UARTа 2) (желтый) stop_rx от модуля 3) (зеленый) test от модуля За ПЛИС - DE0-Nano (EP4CE22F17C6N). За UART - FT232 от Waveshare (FT232RL), txd/rxd которого соединены проводами с пинами демоплаты. Учитывая, что осциллограмма снималась с дополнительных пинов ПЛИСа, одному из которых был назначен (при помощи assign) rx от UARTа (для FT232RL это, разумеется txd) и то, что биты, получаемые с rx видны на осциллограмме можно заключить, что сигнал вполне заходит внутрь ПЛИСа. Т.е. в верхнем модуле есть input rx и output output_test_2. И rx подключен И к модулю uart_rx И выходному пину output_test_2. С которого снята синяя осциллограмма.
  5. Я написал в Quartus код для приема байтов по UART: module uart_rx #( parameter CLK_FREQUENCY, parameter UART_BAUDRATE, parameter BITS_NUMBER )( input clock, output reg stop_rx, output test,//--------------------------------- output reg [BITS_NUMBER-1:0]data_rx, input rx_in ); parameter CLK_PERIOD = 1000/CLK_FREQUENCY; parameter UART_PERIOD = 1000_000_000/UART_BAUDRATE; parameter CLK_DIVIDER = UART_PERIOD/CLK_PERIOD; enum {IDLE, START_WAIT, START_GET, BIT_WAIT, BIT_GET, STOP_WAIT, STOP_GET, END} fsm; reg [17:0]delay_cnt; reg [7:0]data_store; reg [3:0]bit_cnt; assign test = ~rx_in && stop_rx;//------------------- always @(posedge clock) begin case(fsm) IDLE:begin if(~rx_in) begin stop_rx <= LOW; delay_cnt<= CLK_DIVIDER/2; fsm <= START_WAIT; end end START_WAIT:begin delay_cnt <= delay_cnt - 1; if(delay_cnt == 0) begin bit_cnt <= 0; fsm <= START_GET; end end START_GET:begin delay_cnt<= CLK_DIVIDER; bit_cnt <= 0; fsm <= BIT_WAIT; end BIT_WAIT:begin delay_cnt <= delay_cnt - 1; if(delay_cnt == 0) begin fsm <= BIT_GET; end end BIT_GET:begin data_store[bit_cnt] <= rx_in; bit_cnt <= bit_cnt + 1; delay_cnt<= CLK_DIVIDER; if(bit_cnt == BITS_NUMBER-1) begin fsm <= STOP_WAIT; end else begin fsm <= BIT_WAIT; end end STOP_WAIT:begin delay_cnt <= delay_cnt - 1; if(delay_cnt == 0) begin fsm <= STOP_GET; end end STOP_GET:begin data_rx <= data_store; fsm <= END; end END:begin stop_rx <= HIGH; fsm <= IDLE; end endcase end endmodule На симуляторе всё (разумеется) отлично. В железе (DE0-Nano и ПЛИСом EP4CE22F17C6N) всё отлично. Почти. Код срабатывает где-то 9 из 10 раз. CLK_FREQUENCY устанавливал в 50 и в 25. UART_BAUDRATE - в 57600 и 9600. Данные одни и те же - два ASCII-кода символов "A" и "B" подряд. Пробовал менять их местами, частота ошибки вроде не поменялась. Судя по осциллографу иногда конечный автомат не выходит из состояния IDLE, несмотря на нисходящий фронт старт-бита: always @(posedge clock) begin case(fsm) IDLE:begin if(~rx_in) begin stop_rx <= LOW; delay_cnt<= CLK_DIVIDER/2; fsm <= START_WAIT; end end ... Хотя, как видно по линии "test", сам стартовый бит вполне осознается ПЛИСом. Осциллограмма снималась с дополнительных пинов ПЛИСа, которым были назначены (при помощи assign): 1) rx от UARTа 2) stop_rx от модуля 3) test от модуля Сама ошибка возникает как в первом, так и во втором байте всей передачи, причем независимо от того передается ли "AB", или "BA". Вопрос: в чем может быть причина и как отлавливать подобные ошибки?
  6. В этом и вопрос. Почему конфигурационные памяти всегда и у всех стоят очень дорого? Что в них такого? У Атмела-Микрочипа для AT17LV010 или AT17F040 - тоже плата за имя бренда? Хм будет ли в ответе стоящая мысль, если он начинается с тыканья незнакомым людям... ...и продолжается орфографическими ошибками?
  7. Самая дешевая микросхема в разделе конфигурационных памятей на Маузере стоит $9.13. В тоже время, 10M02SCE144C8G (одна из самых дешевых ПЛИС у Интела) со встроенной конфигурационной памятью стоит $11.97. Я бы понял, если бы фирменные интеловские памяти были искусственно завышены в цене. Но у Атмела-Микрочипа плюс-минус такие же цены. В чем причина столь высокой цены на конфигурационные памяти?
  8. Это да. На Али "100% новый и оригинальный STM32F103RCT6" продается за 100,44руб.
  9. Вы не заглядывали в раздел "Продам"? Может кто продает, кому они не нужны? :)
  10. Вам тоже нужны STM32F103RFT6 ? :)
  11. Решил продать 5шт. STM32F103 (RCT6) т.к. увлекся ПЛИСами, а контроллеры пылятся на полке без дела. Город - Москва. В Чип-и-Дипе данный МК стоит 420руб/шт., в Электронщике - 532руб/шт. Думаю, что было бы справедливо запросить за мои - 400руб/шт. [email protected]
  12. А STM32F103RCT6 или STM32F103RET6 вам не подойдут?
  13. И эти самые риски ДКО "Электронщик" непринужденно перекладывает на клиента. Что-то у них случилось в 2018-2019 году и всё покатилось по наклонной. А ведь в 2017 это был пожалуй лучший магазин.
  14. Спасибо за столь быстрый ответ! Я как раз об этом подумал, когда перечитывал свой вопрос. Но что, если нужно передавать на устройство и текст и поток данных?
  15. Есть проектируемое устройство, которое предполагается соединить с ПК при помощи RS-232. С одной стороны было бы неплохо, чтобы устройство отвечало на *IDN? ,набитого в терминале. С другой стороны при необходимости передачи изохронного (равномерного по времени) потока данных (значения напряжений для ЦАПов данного устройства) было бы нелепо передавать его в текстовом виде - канал потеряет скорость в разы просто так. Как есть идеологические варианты организовать переключение между этими режимами?
  16. Типа памяти? Вот раздел с примерами реализации различных памятей. Или вы хотите двунаправленную шину внутри ПЛИСа? Если так - это невозможно.
  17. Подобную конструкцию делителей if(counter[5] && counter[4] && counter[0]) begin я увидел в примере Марсохода, посвященном UFM вот здесь. Задал вопрос на electronics.StackExchange, там присоветовали заменить на выражение if(counter & DIVIDER == DIVIDER) begin По количеству LE в синтезаторе Квартуса результат получился одинаковый. Однако, в комментариях также упомянули крохоборство и преждевременную оптимизацию, сказав, что проблема скученности возникнет быстрее, чем недостаток LE. Большое спасибо за все комментарии!
  18. Стандарты написания кода предостерегают от использования т.н. магических чисел. В частности в "SEI CERT C" есть правило DCL06-C. Для Verilog данное правило также актуально. Но тут есть вопрос. Глядя на отдельное выражение типа some_reg <= 1; не ясно, идет ли речь об установке логического значения TRUE, о переводе некой линии в состояние HIGH или присвоении регистру целочисленного значения, равного единице. Чтобы исключить эту неопределенность, возможно следует определить параметры TRUE, FALSE, HIGH и LOW, а затем использовать уже их в коде. Делаете ли вы так? Если да, то где именно вы прописываете определения TRUE-FALSE-HIGH-LOW ?
  19. Лучшим делителем частоты является PLL, встроенный в ПЛИС. Однако, PLL-ов ограниченное количество и иногда оптимальным решением является сделать делитель на основе счетчика: reg [7:0]counter = 0; reg divided_clk = 0; always @(posedge clk) begin if(counter == DIVIDER - 1) begin divided_clk <= ~divided_clk; counter <= 0; end else begin counter <= counter + 1; end end Однако, сравнение if(counter == DIVIDER - 1) begin не оптимально использует логические элементы. Есть вариант проверять установку какого-либо бита: if(counter[DIVIDER_POW]) begin т.е. делить частоту на степень двойки. Однако, пропадает гибкость и точность установки делителя. Также возможно подобрать определенный делитель, вычесть из него единицу, перевести результат в двоичное число, а затем сделать лог.И всем разрядам с единицами. И вставить эту штуку в условие. Для делителя "50" будет что-то типа того: if(counter[5] && counter[4] && counter[0]) begin Логики тратится меньше, чем в первом случае. Но как параметризовать подобную конструкцию?
  20. Иными словами, общее количество слоев (с учетом земляных слоев и слоев питания) во всех ваших проектах, где есть DDR2-DDR3, от 6 штук и более, верно?
  21. Разводите на 6 слоях и более? Нормы: 0,1 дорожка/0,2 отверстие и менее? Или бывали случаи, где было 4 слоя и/или 0,125 дорожка?
  22. Строго говоря, вопрос "какими технологическими нормами и в сколько слоев вы разводите DDR?" подразумевает ответ в одну строчку :) Причем для него не требуется знать, какие компоненты выбрал я :) Это не секрет, но хотелось бы вместо советов "А-а. Ну это тебе надо так-то и так-то. Вот там в даташите всё есть." послушать реальные кейсы. Понятно, что есть гайды от Микрона, где рекомендуют 6-8 слоев, описывают варианты стека и т.д. Понятно, что всё важно: и выравнивание дорожек и конденсаторы и возвратные токи по земле и "ОБЯЗАТЕЛЬНО!! посчитайте импеданс! ЭТА ВАЖНА!!". Тем не менее, меня интересуют случаи из практики, когда какой-либо рекомендацией пренебрегли и схема прекрасно-заработала/ни-в-какую-не-заработала. Если у вас реальных случаев на 10 томов, буду рад почитать хотя-бы первую главу :)
×
×
  • Создать...