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

Вопросы по моделированию VHDL ModelSim

В общем собрал все в кучу, Все IP Core загрузились, все синтезируется без ошибок.

Сделал тестбенч. Но все равно не понятно как в тестбенче эмулировать входные данные на порт INOUT.

Вот что получилось:

Это схема из даташита. TXE согласно даташиту можно игнорировать. что я и делаю.

image.thumb.png.885c378e8e15d3daa2bd5d82654bb50b.png

Вот что я получаю в симмуляторе:

image.thumb.png.d1bc3c444c4e5bc55d8c55c908dcd209.png

Вот увеличенный сегмент где происходит.

 

Логика моей прграммы такая: 

1. В течении n циклов задержка перед отправкой. Сейчас 10 циклов но потом планирую каждую секунду.

2. Затем идет заполнение массива на отправку.

3. Установка параметров отправки и запуск модуля.

4. Ждем пока все закончится и будет выставлен флаг готовности.

5. Переходим на пункт 1.

 

Взял код из примера по взаимодействию.

FT_STATUS ftStatus = dxDevice.OpenByIndex(0);
            if (ftStatus != FT_STATUS.FT_OK)
            {
                MessageBox.Show("Device not found");
            }

            uint bytesWritten = 0;
            uint bytesRead = 0;
             

            dxDevice.SetPipeTimeout(0x82, 3000);
            dxDevice.SetPipeTimeout(0x02, 3000);

            ftStatus = dxDevice.SetStreamPipe(0x02, loopBytes);

            writeBytes[0] = 0xae;
            writeBytes[1] = 0x1;

            ftStatus = dxDevice.WritePipe(0x02, writeBytes, (uint)writeBytes.Length, ref bytesWritten);
            if (ftStatus == FTDI.FT_STATUS.FT_TIMEOUT)
            {
                //dxDevice.AbortPipe(0x02);
                //Debug.Log("\tReadPipe timedout bytesTransferred={0}!", bytesTransferred);
            }

            ftStatus = dxDevice.ReadPipe(0x82, readBytes, (uint)readBytes.Length, ref bytesRead);
            if (ftStatus == FTDI.FT_STATUS.FT_TIMEOUT)
            {
                dxDevice.AbortPipe(0x82);
                //Debug.Log("\tReadPipe timedout bytesTransferred={0}!", bytesTransferred);
            }

            ftStatus = dxDevice.ClearStreamPipe(0x02);

 

Но почему то ничего не происходит. Пробовал также изменить чтобы было чтение из шины. И отправлял команду чтобы светодиод включать, но также ничего не проходит.

Вот прикладываю сам проект SimpleTest.7z

В проекте есть тестбенч  simulate.vhd и проект для ModelSim. 

Опять прошу помощи если у кого есть желание. 

Спасибо.

 

 

 

 

image.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/6/2023 at 4:08 PM, Worldmaster said:

В общем собрал все в кучу, Все IP Core загрузились, все синтезируется без ошибок.

Сделал тестбенч. Но все равно не понятно как в тестбенче эмулировать входные данные на порт INOUT.

Я для себя делал так. В тестбенче чтение состояния шины и сопутствующих сигналов из файла. В определенном формате. С выдачей одной строки файла  в один такт клока.

В случае чего и запись в файл в том же определенном формате.

Позволяет не тормозить и не бороться с синтаксисом VHDL-Verilog а решать свою задачу.

 

 

Массивы? каждую секунду? Такое возможно либо если у вас скорость обновления данных в них  низкая, либо если вы не понимаете что делаете.

В современном мире принято работать по ивентам - по событийному характеру а не по вот этим "раз в секунду"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 09.07.2023 в 09:59, krux сказал:

по событийному характеру а не по вот этим "раз в секунду"

Хорошо. У меня есть счетчик который с каждым ивентом по нисходящему фронту сигнала тактирования увеличивает свое значение на 1.

Ивент нисходящего фронта происходит с частотой в 50 мегагерц. При достижении счетчиком числа в 50 000 000 происходит ивент и включается заполнение буфера данных и автомат переходит в состояние передачи данных. 

Это понятное объяснение события "раз в секунду" ??

 

В 09.07.2023 в 09:59, krux сказал:

В тестбенче чтение состояния шины и сопутствующих сигналов из файла.

Спасибо. Попробую так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем вроде бы заработало, но какие то непонятки.

Подскажите пожалуйста еще один момент. На диаграмме передачи мастер должен устанавливать данные на восходящем фронте или на нисходящем??

Потому что сейчас при отправке я записываю на нисходящем фронте данные:

DATA_1 <= x"e0" ; 
                    DATA_2 <=  x"e1" ; 
                    DATA_3 <=  x"e2" ;
                    DATA_4 <=  x"e3" ;
                    BE <= "1111"; -- count of valid bytes for 4 blocks
 

 

Но при чтении с компа я получаю данные:

		[0]	0xff	byte
		[1]	0xfe	byte
		[2]	0xff	byte
		[3]	0xff	byte

 

Но это вроде как данные с командной фазы где определяет что прилете запрос на чтение.

И лишь изредка попадают данные которые должны быть но с индекса 4:

		[4]	0xe0	byte
		[5]	0xe1	byte
		[6]	0xe2	byte
		[7]	0xe3	byte

 

Это с фронтами напутано или в чем??

 

но если я меняю обработку на восходящий фронт то вообще все перестает работать.

 

Изменено пользователем Worldmaster

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот сделал наконец тестбенч нормально.

На рисунке сверху мой результат в ModelSim снизу из даташита.

Попытался стянуть рисунки чтобы было понятно. Ну все равно очевидно что все совпадает идеально. Я просто отправляю 8 байт. 

 

image.thumb.png.cf7bc44dd2787e5d3a3ea03146832545.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...