-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
temp <= DSpeed;
temp <= (temp >> 3);
Код вообще неправильный, советую разобраться с блокирующим/неблокирующим присваиванием.
Такой код тоже намекает на непонимание разницы между блокирующим и неблокирующим присваиванием:
temp <= DSpeed >> 3;
хотя он и не приведет к неработоспособности схемы.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
KIV
-
Автор темы
-
Не в сети
-
Давно я тут
-
-
Сообщений: 121
-
Спасибо получено: 5
-
-
|
Leka пишет: Я бы просто ввел пару регистров DSpeedMAX и DSpeedMIN, в которые записывал бы константы в зависимости от RSpd. И сравнивал бы напрямую (без умножений на 9 или 7).
Действительно, можно пожертвовать парой регистров, и отказаться от не нужных вычислений. Спасибо. Переделаю.
Leka пишет: Код вообще неправильный, советую разобраться с блокирующим/неблокирующим присваиванием.
А если просто подсказать, как нужно сделать правильно, как в первой цитате? ;)
Разумеется, я попробую разобраться и с этими присваиваниями.
Как бы еще растянуть сутки часов на 8-10...
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от KIV.
|
-
KIV
-
Автор темы
-
Не в сети
-
Давно я тут
-
-
Сообщений: 121
-
Спасибо получено: 5
-
-
|
Попробовал вариант с записью граничных условий, без вычислений. Не айс...
Количество использованных ЛЭ в модуле возросло с 17 до 39. Не позволительная роскошь.
А если учесть, что у мотора может быть не 2, а 6 рабочих скоростей... Даже думать не хочется...
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от KIV.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
... Даже думать не хочется...
А придется, если хочется получить работающую схему. В исходном варианте:
temp <= DSpeed;
temp <= (temp >> 3);
temp всегда будет равен нулю.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
KIV
-
Автор темы
-
Не в сети
-
Давно я тут
-
-
Сообщений: 121
-
Спасибо получено: 5
-
-
|
Leka пишет:
... Даже думать не хочется...
А придется, если хочется получить работающую схему.
В исходном варианте:... temp всегда будет равен нулю.
Leka, Вы меня не правильно поняли, и слишком радикально интерпретировали мое "думать не хочется".
Я подразумевал другое прочтение: "страшно подумать". :)
Надеюсь, Вы не сомневаетесь в моей в способности, и желании думать, даже несмотря на мою малограмотность в программировании?
Всегда с удовольствием пытаюсь разгадывать шарады, которые Вы предлагаете (или находите среди моих же каракулей). К сожалению, не всегда это удается сделать быстро.
Поэтому огромная просьба: предлагая очередную задачу, хотя бы намекайте, каким путем можно ее решить в разумные сроки. Именно потому, что мне не просто хочется, а крайне необходимо получить работающую схему.
Теперь вопрос: почему "в исходном варианте temp всегда будет равным нулю"? И будет ли...
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
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.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Блокирующее присваивание, это немедленное присваивание. Переменная сразу получает новое знчение.
Неблокирующее присваивание, это отложенное присваивание. Новое значение будет присвоено переменной только при выходе из always-блока. Если было несколько присваиваний, переменная получит последнее значение.
Поэтому:
a <= 100;
b <= a;
b <= b >> 3;
эквивалентно:
a <= 100;
b <= b >> 3;
и если начальное значение b равно нулю, b всегда будет иметь значение 0.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Хуже другое - количество ЛЭ только в этом модуле 87.
Пары begin/end неверно расставлены, так что на число ЛЕ можно не смотреть.
При таком количестве ошибок "по невнимательности" имеет смысл предельно упростить стартовый вариант проекта - минимум кнопок, одна скорость, и тд и тп. И только после того, как заработает в железе, постепенно усложнять до необходимого уровня.
Советую продумать методику отладки. Искать "ляпы" исключительно при помощи форума - не выход.
Если отлаживать "в железе", тогда надо начинать с простейшего. Например, задать режим параметром (а не кнопками), и как-то проверить, что все сигналы соответствуют задуманным.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
KIV
-
Автор темы
-
Не в сети
-
Давно я тут
-
-
Сообщений: 121
-
Спасибо получено: 5
-
-
|
Спасибо. Это один из самых убедительных, и аргументированных Ваших ответов. Это я говорю как человек, немного знакомый с преподавательской деятельностью.
Значит ли это, что многоэтажные конструкции, в которых используется одна и та же переменная, и написанные в одном always-блоке, теряют всякий смысл?
Допустимо ли в одном модуле использование нескольких always-блоков, и как они будут исполняться (последовательно или параллельно)?
Распространяется ли правило "последней мили" на операторы ветвления? Как будут выполняться множественные операторы ветвления внутри одного always-блока, если они включают в себя одну и туже переменную, с которой необходимо произвести несколько последовательных вариационных действий?
P.S. Пока писал, Вы написали еще один ответ. Все сказанное мной выше в первую очередь касается предыдущего ответа.
На форуме я учусь, а не пытаюсь с его помощью только устранять "ляпы". Хотя анализ собственных ошибок по замечаниям форумчан - весьма удобная, и очень продуктивная форма обучения.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от KIV.
|
-
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 секунд