Интересы по электронике, программированию на VHDL FPGA, С#.

Наибольший вклад в теги

Все теги (12)

Лучшие ответы пользователя

Все ответы (18)
  • Инициализация регистра. Побочные эффекты?

    @Emil2014
    Оба варианта синтезируемы. Вариант 1:
    Прошили (вкл. питание) - регистр установился "100", изменили как-то, захотели вернуться к исходному состоянию - а нет сигнала установки! Будет до отключения питания хранить последнее измененное значение.
    Вариант 2:
    Прошили (вкл. питание) - регистр установился "100", изменили как-то, захотели вернуться к исходному состоянию - дернули rst!
    В синтезе даст разные конструкции - вариант 1, возможно будет быстрее и меньше по ресурсам, чем вариант 2.
    Кстати, в ISE Xilinx симуляторе вариант 2 даст неопределенное состояние по запуску до явной подачи rst = 1. В VHDL я совмещаю оба варианта в начале определяю регистр с исходным значением, а в процессе использую сигнал сброса(установки).
    Ответ написан
    3 комментария
  • Существуют ли микроконтроллеры с частотой 600 Мгц -- 1 Ггц?

    @Emil2014
    Наверно, STM32F4 еще можно называть микро. Но далеко еще до 600МГц!
    At 180 MHz, the STM32F469 and STM32F479 deliver 225 DMIPS/608 CoreMark performance executing from Flash memory, with 0-wait states thanks to ST’s ART Accelerator™. The DSP instructions and the floating-point unit enlarge the range of addressable applications.
    Ответ написан
    Комментировать
  • Где можно заказать разработку fpga платы для перебора хэшей определенного алгоритма в России и не только?

    @Emil2014
    Привет.
    Если чип уже известен(т.е. заказчик знает что он хочет), то разработка платы не будет дороже 30-60 т.р.(тысяч рублей).
    Если заказчик хочет еще алгоритм "положить" в чип, то зависит от времени. Зарплата разработчика/схемотехника FPGA в РФ не превышает 42 т.р.(тысяч рублей) в месяц - соответственно время * зарплату.
    Ответ написан
    Комментировать
  • C# com-порт получение информации, обработка старт-бита, стоп-бита?

    @Emil2014
    Я писал на С#,делал на BackgroungWorker. Грубо вырезанный кусок кода....
    private void TransferWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                // переменная для снятия из очереди
                Packet pkt;
                // массив для передачи
                byte[] wr_buf = new byte[6];
                // массив для приема
                byte[] rd_buf = new byte[6];
                // цикл до отмены работы или опустошения очереди запросов
                /// TODO теперь не выходит по завершению очереди - уменьшить на переключение контекста задач
                while ((_TransferWorker.CancellationPending == false))// && (_toTransfer.Count != 0))
                {
    
    
    case Mode_transfer.Read_ADC:// Чтение данных
                                Массив data = pkt.obj as Массив;
                                // читаем АЦП
                                wr_buf[0] = Convert.ToByte('A');
                                wr_buf[1] = (byte)0;
                                // Пишем отправляеммый пакет
                                _Serial.Write(wr_buf, 0, 2);
                                // ждем пока весь пакет уйдет или запросят отбой
                                while ((_TransferWorker.CancellationPending == false) && (_Serial.BytesToWrite != 0)) ;
                                // попытка поймать заголовок
                                try
                                {
                                    int dummy = 0, lenghtReadingPacket;
                                    bool end = false;
                                    int counter =0;
                                    while (end != true){
                                        dummy = _Serial.BytesToRead;
                                        if (dummy <= 3)
                                        {
                                            System.Threading.Thread.Sleep(1);
                                            if (counter++ > _Serial.ReadTimeout)
                                            {
                                                _dataLostArgs.ErrorPreambulaLen++;
                                                throw new TimeoutException("Preambula not full!");
                                            }
                                        }
                                        else end = true;
                                    }
                                    dummy = _Serial.Read(rd_buf, 0, 3);
                                    var dummy2 = dummy;
                                    if ((dummy != 3))
                                    {
                                        _dataLostArgs.ErrorPreambulaLen++;
                                        throw new TimeoutException("Preambula not full!");
                                    }
                                    if (rd_buf[(int)ADC_Packet.Name] != 'D'){
                                        _dataLostArgs.PreambulaLost ++;   
                                        throw new TimeoutException("Data preambula lost!");
                                    }
                                    // длина пакета в словах
                                    lenghtReadingPacket = rd_buf[(int)ADC_Packet.LenghtOfPacket];
                                    byte[] rd_buf_ADC = new byte[lenghtReadingPacket * 2 + 1];
                                    end = false;
                                    counter = 0;
                                    while (end != true){
                                        dummy = _Serial.BytesToRead;
                                        if (dummy < (lenghtReadingPacket * 2 + 1))
                                        {
                                            System.Threading.Thread.Sleep(1);
                                            if (counter++ > _Serial.ReadTimeout + 100)
                                            {
                                                var dummy3 = _Serial.Read(rd_buf_ADC, 0, lenghtReadingPacket * 2 + 1);
                                                _dataLostArgs.PoorPacket++;
                                                throw new TimeoutException();
                                            }
                                        }
                                        else end = true;
                                    }
    
                                    dummy = _Serial.Read(rd_buf_ADC, 0, lenghtReadingPacket * 2 + 1);
                                    if (dummy == (lenghtReadingPacket * 2 + 1))
                                        for (Int32 i = 0; i < lenghtReadingPacket * 2 ; i += 2)
                                        {
                                            int a = rd_buf_ADC[i];
                                            int b = rd_buf_ADC[i + 1];
                                            if (a != 0 || b != 0) data.Add(rd_buf_ADC[i] * 256 + rd_buf_ADC[i + 1]);
                                        }
                                    else {
                                        _dataLostArgs.PoorPacket++;
                                        throw new TimeoutException("Not all bytes received!");
                                    }
                                }
                                catch (TimeoutException)
                                {
                                    /// TODO ПОдумать при зависании считывания АЦП 
                                    OnADCDataLost(this, _dataLostArgs);
                                }
                                finally
                                {
                                    // Чистим за собой
                                    _Serial.DiscardInBuffer();
                                    _Serial.DiscardOutBuffer();
                                }
                                break;

    Работало на пределе из-за скорости 510416 Бод на RS485. Код довольно грязный... Но смысл был в том что, первое чтение возвращало не весь пакет. Надо ВСЕГДА проверять возвращаемые значения функций чтения. И что-то делать если пакет приходит не весь и кусками. И с задержкой, ставить timeout Exception что бы не провалится в Read навсегда.
    Ответ написан
    1 комментарий
  • С чего начать или где найти информацию по схемотехние?

    @Emil2014
    Может изучить инфу с Altium. Книга Cабунина А.Е. "Altium Designer" по-моему свободно гуглится. Если знаешь английский, то прямо на ютубе лежат различные видео по разводке плат, вплоть до разводки DDR3. И кстати, не только по Алтиуму.
    Впрочем, надо сначала пройтись по этапам: разработка принципиальной схемы, а затем разводка.
    Ответ написан
    Комментировать