МАРСОХОД

Open Source Hardware Project

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1
  • 2

ТЕМА: Си как HDL, или Verilog без always

Си как HDL, или Verilog без alwaysи 3 года 10 мес. назад #4779

Leka пишет: В софт-процессоре ошибка оказалась - байтовые команды неправильно отрабатывались, поправил.
Сжатие "на лету" нулевых последовательностей заметно повышает скорость передачи битстрима, для почти пустого проекта - на порядок. Кодирование - при помощи esc-последовательностей, только в качестве префикса взял не <27>, а <121>.
<121><0...2> - аппаратное управление софт-процессором (загрузка программы, пуск-останов),
<121><3...251> - программное сжатие нулевых строк (>2 нулей подряд),
<121><252...254> - программное управление потоком (ПК <--> софт-процессор),
<121><255> - сам префикс <121>.


Конечно 121 лучше 27 - не конфликтует с уже существующими Esc-последовательностями.

Основная сложность - со стороны ПК(спасибо Wintel), не знаю, как проверять - поступили ли новые данные через виртуальный СОМ-порт, или нет. Это усложняет протокол взаймодействия с устройством.



А вот тут великолепная статья по работе с COM портом - https://ru.wikibooks.org/wiki/COM-порт_в_Windows_(программирование)

Порт надо открывать вот так
CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL,  OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

а проверять готовность данных с помощью WaitCommEvent и WaitForSingleObject
const int READ_TIME = 100;
OVERLAPPED sync = {0};
int reuslt = 0;
unsigned long wait = 0, read = 0, state = 0;
	
/* Создаем объект синхронизации */
sync.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

/* Устанавливаем маску на события порта */
if(SetCommMask(port->handle,EV_RXCHAR)) {
	/* Связываем порт и объект синхронизации*/
	WaitCommEvent(port, &state, &sync);
	/* Начинаем ожидание данных*/	
	wait = WaitForSingleObject(sync.hEvent, READ_TIME);
	/* Данные получены */		
	if(wait == WAIT_OBJECT_0) {
		/* Начинаем чтение данных */
		ReadFile(port, dst, size, &read, &sync);
		/* Ждем завершения операции чтения */
		wait = WaitForSingleObject(sync.hEvent, READ_TIME);
		/* Если все успешно завершено, узнаем какой объем данных прочитан */
		if(wait == WAIT_OBJECT_0) 
			if(GetOverlappedResult(port, &sync, &read, FALSE)) 
				reuslt = read;
	}
}
CloseHandle(sync.hEvent);
Спасибо сказали: Leka

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Си как HDL, или Verilog без always 3 года 10 мес. назад #4781

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
У меня проблемы возникли только с виртуальным COM-портом Bluetooth. С другими (GSM-модем/FTDI/...) проблем не было. Мне достаточно, чтобы ReadFile() немедленно возвращала управление с нулевым счетчиком, если нет новых данных. Для этого запускал один раз(после загрузки ОС) отдельную прогу на Си с SetCommTimeouts(), которая устанавливала нужный режим. Дальше можно было другие проги хоть на Паскале писать/запускать. С Bluetooth так не получилось...

Сейчас попробовал заново, и увидел, что перед CloseHandle() нужно делать большую задержку (~1сек, или ждать нажатия клавиши). Тогда все работает. Выход без задержки приводит к тому, что все последующие вызовы CreateFile() дают ошибку - пока не будет перезагружено slave-bluetooth устройство выключением-включением питания. Почему так, и как сбросить ошибку без сброса питания slave-устройства, не знаю.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Си как HDL, или Verilog без always 2 года 9 мес. назад #6776

  • Leka
  • Leka аватар Автор темы
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Хотел сделать рефакторинг, а в результате полностью все переделал.
Раньше был упор на "Си как HDL", сейчас - на "Verilog без always".
Синтаксис совпадает с Верилогом, но отсутствует деление кода на блоки always@(*) и always@(posedge clk) - "провода" и "триггеры" различаются по объявлениям переменных.
Попробовал перевести в свой HDL свою самую простую программу рисования, написанную на Си с использованием библиотеки glut: на экране прямоугольник, мышкой можно перетаскивать по экрану и менять размеры.
Исходная программа на Си: исходник ~100 строк, exe ~60КБ (про Windows и тп не забываем).
Код на HDL: исходник ~100 строк топ-модуль (код аналогичен коду на Си), в отдельных модулях: ~30 строк VGA и ~120 строк USB-мышка. Все синтезируется в ~1100 ЛЕ.
Потренируюсь на простых примерах, потом буду переводить в HDL "2D физику".

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.
  • Страница:
  • 1
  • 2
Время создания страницы: 0.173 секунд

ВКонтакте  facebook  GitHub  YouTube  Twitter
Вы здесь: Начало Forum Наш форум Проекты пользователей Си как HDL, или Verilog без always