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

ТЕМА:

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5223

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

temp <= DSpeed;
temp <= (temp >> 3);

Код вообще неправильный, советую разобраться с блокирующим/неблокирующим присваиванием.

Такой код тоже намекает на непонимание разницы между блокирующим и неблокирующим присваиванием:

temp <= DSpeed >> 3;

хотя он и не приведет к неработоспособности схемы.

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

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5224

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5

Leka пишет: Я бы просто ввел пару регистров DSpeedMAX и DSpeedMIN, в которые записывал бы константы в зависимости от RSpd. И сравнивал бы напрямую (без умножений на 9 или 7).

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

Leka пишет: Код вообще неправильный, советую разобраться с блокирующим/неблокирующим присваиванием.

А если просто подсказать, как нужно сделать правильно, как в первой цитате? ;)
Разумеется, я попробую разобраться и с этими присваиваниями.
Как бы еще растянуть сутки часов на 8-10...

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

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5225

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
Попробовал вариант с записью граничных условий, без вычислений. Не айс...
Количество использованных ЛЭ в модуле возросло с 17 до 39. Не позволительная роскошь.
А если учесть, что у мотора может быть не 2, а 6 рабочих скоростей... Даже думать не хочется...

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

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5226

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

... Даже думать не хочется...

А придется, если хочется получить работающую схему. В исходном варианте:

temp <= DSpeed;
temp <= (temp >> 3);

temp всегда будет равен нулю.

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5227

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5

Leka пишет:

... Даже думать не хочется...

А придется, если хочется получить работающую схему.
В исходном варианте:... temp всегда будет равен нулю.

Leka, Вы меня не правильно поняли, и слишком радикально интерпретировали мое "думать не хочется".
Я подразумевал другое прочтение: "страшно подумать". :)
Надеюсь, Вы не сомневаетесь в моей в способности, и желании думать, даже несмотря на мою малограмотность в программировании?

Всегда с удовольствием пытаюсь разгадывать шарады, которые Вы предлагаете (или находите среди моих же каракулей). К сожалению, не всегда это удается сделать быстро.
Поэтому огромная просьба: предлагая очередную задачу, хотя бы намекайте, каким путем можно ее решить в разумные сроки. Именно потому, что мне не просто хочется, а крайне необходимо получить работающую схему.

Теперь вопрос: почему "в исходном варианте temp всегда будет равным нулю"? И будет ли...

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5228

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
Этот вариант ближе к работоспособности?

module VarSpeed(FSlow, ButUp, ButDn, SWork, RSpd, SStop, SLoad, DSpeed);
// Пины всех входов кнопок "притянуты" к земле. При нажатиии кнопки на соответствующий пин подается Vcc.
	input FSlow;						// Клок с частотой Fslow
	input ButUp;						// Сигнал увеличения скорости
	input ButDn;						// Сигнал уменьшения скорости
	input SWork;						// Сигнал "Рабочий режим"
	input SStop;						// Сигнал "Стоп"
	input SLoad;						// Сигнал "Загрузка"
	input RSpd;						// Сигнал выбора скорости
	output reg [9:0]DSpeed;    			        // Шина данных на установку прескалера
		reg[9:0]tmp_h;					// Регистр верхнего предела скорости
		reg[9:0]tmp_l;					// Регистр нижгено предела скорости

// Установки выбранной скорости
always @(posedge FSlow)
	begin
	    if((SLoad==1)||(SStop==1))					// По сигналу "Загрузка", или "Стоп",
	    begin
	        if (RSpd==1)							// в зависимости от выбраной скорости,
	           DSpeed <= 10'd837;				// пишем одну, 
	        else
	          DSpeed <= 10'd620;				// или другую константу,
	    begin
	          tmp_h = DSpeed - 6'd60;		// вычисляем значение для регистра верхнего предела скорости,
	          tmp_l = DSpeed + 6'd60;		// и для регистра нижнего предела скорости.
	     end
	end

// Обработка нажатия кнопки "Увеличение скорости"
   if(SWork==1)									// При включенном сигнале "Рабочий режиме"
	begin											// разрешены операции подстройки скорости:
	if(ButUp==1) 							// При нажатии, и удержании кнопки ButUp:
		if(DSpeed < tmp_h) 				// Если не вышли за верхний предел диапазона изменения скорости,
			DSpeed <= DSpeed + 1'b1;	 // начинаем увеличивать скорость,
		else									// иначе
			DSpeed <= DSpeed;				// переписываем предельное (верхнее) значение DSpeed
		end

// Обработка нажатия кнопки "Уменьшение скорости"
	if(ButDn == 1) 						// При нажатии, и удержании кнопки ButDn:
		if(DSpeed > tmp_l) 				// Если не вышли за нижний предел диапазона изменения скорости
			DSpeed <= DSpeed - 1'b1;	// начинаем уменьшать скорость,
		else									// иначе
			DSpeed <= DSpeed;				// переписываем предельное (нижнее) значение DSpeed
	end
endmodule

Пришлось ограничить диапазон регулировки скорости. Не очень хорошо, конечно, но пока терпимо.
Хуже другое - количество ЛЭ только в этом модуле 87. Если так пойдет и дальше, действительно придется переходить, как минимум, на EPM570.
А в 240-ю индикация уже точно не поместится, для ее реализации нужно порядка 120 ЛЭ.

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

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5229

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Блокирующее присваивание, это немедленное присваивание. Переменная сразу получает новое знчение.
Неблокирующее присваивание, это отложенное присваивание. Новое значение будет присвоено переменной только при выходе из always-блока. Если было несколько присваиваний, переменная получит последнее значение.

Поэтому:
a <= 100;
b <= a;
b <= b >> 3;
эквивалентно:
a <= 100;
b <= b >> 3;
и если начальное значение b равно нулю, b всегда будет иметь значение 0.

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5230

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54

Хуже другое - количество ЛЭ только в этом модуле 87.

Пары begin/end неверно расставлены, так что на число ЛЕ можно не смотреть.

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

Советую продумать методику отладки. Искать "ляпы" исключительно при помощи форума - не выход.

Если отлаживать "в железе", тогда надо начинать с простейшего. Например, задать режим параметром (а не кнопками), и как-то проверить, что все сигналы соответствуют задуманным.

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

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5231

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
Спасибо. Это один из самых убедительных, и аргументированных Ваших ответов. Это я говорю как человек, немного знакомый с преподавательской деятельностью.
Значит ли это, что многоэтажные конструкции, в которых используется одна и та же переменная, и написанные в одном always-блоке, теряют всякий смысл?
Допустимо ли в одном модуле использование нескольких always-блоков, и как они будут исполняться (последовательно или параллельно)?
Распространяется ли правило "последней мили" на операторы ветвления? Как будут выполняться множественные операторы ветвления внутри одного always-блока, если они включают в себя одну и туже переменную, с которой необходимо произвести несколько последовательных вариационных действий?

P.S. Пока писал, Вы написали еще один ответ. Все сказанное мной выше в первую очередь касается предыдущего ответа.

На форуме я учусь, а не пытаюсь с его помощью только устранять "ляпы". Хотя анализ собственных ошибок по замечаниям форумчан - весьма удобная, и очень продуктивная форма обучения.

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

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

Система управления синхронным многофазным электрод 10 года 8 мес. назад #5232

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Многоэтажные конструкции с неблокирующими присваиваниями имеют смысл для условных операторов, если они могут перекрыть, а могут и не перекрыть предыдущие присваивания. Например, имеет смысл:
a <= 1;
if(s2) a <= 2;
if(s3) a <= 3;
Не имеет смысла:
a <= 1;
if(s2) a <= 2;
else a <= 3;

Несколько always-блоков с одним клоком не имеет смысла использовать.

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

Время создания страницы: 0.146 секунд
Работает на Kunena форум