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

ТЕМА: Система управления синхронным многофазным электрод

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

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Вот я взял модуль DelControl, и чтобы проверить алгоритм измерения задержки "del" - выкинул из него все, кроме измереня del (сделав этот регистр выходом, и переименовав модуль в Del):
// Вычисление задержки спадающего фронта импульса SHallA от нарастающего фронта импульса DFsA
// Период SHallA всегда равен периоду DFsA, но должен отставать от него на величину del.
  
module Del(FTakt, DFsA, SHallA, del);
input FTakt;	
input DFsA;	
input SHallA;	
output reg [5:0] del; 

reg tmp;	

always@(posedge FTakt)
begin
	//if(DFsA==1) tmp <= 1;	
	//else tmp <= 1'b0;			
	//это эквивалентно:
	tmp <= DFsA; 
			
	//if((tmp==1)&&(SHallA)==1)	
	if(tmp&SHallA)							
		del <= del + 6'b1;		
	else tmp <= 0;			
end
endmodule
- очевидно, что алгоритм неработоспособен, хотя-бы потому, что del только инкрементируется.

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

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

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

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

Alvich пишет: В Тоp модуле DDM у Вас не полностью соединенны шины между модулями, например DSpeed (RTL Viewer это показывает(пишет NC))
Добавьте в модуль DDM назначения всех межблочных шин с их разрядностью (без этого соединяется по одному проводу в шине) и всех межблочных сигналов

Исправил.

Конструкция ключевого соответствия пишется так:

PowControl PowControl(.FTakt(FTakt), .ButPusk(ButPusk), .ButStop(ButStop), .SWork(SWork), .SStop(SStop), .PowHi(PowHi), .PowLo(PowLo), .SAcsel(SAcsel));
          ...

Хотелось бы уточнить - это нужно сделать в каждом модуле?

В модуле SpeedControl выходы регистров r33 и r45 никуда не идут
После снятия сигнала кнопок (отпускания кнопки) они не защелкиваются, так задумано?

Нет, не задумано. Моя невнимательность. Состояние r33 и r45 должно анализироваться, и исключать возможность смены скорости при уже сделанном выборе, и после начала рабочего цикла (разгон мотора, и т.д.). Исправил.
По поводу защелок так же согласен, они должны удерживать выбранное значение скорости. Подумаю, как это сделать.

Ссылку по кнопкам посмотрел, спасибо.

Leka пишет: Достаточно, что сам Квартус не сможет оценить это без дополнительных указаний, и это уже повод отказаться от такого подхода. Софт, железо, методология - все заточено под синхронный дизайн.

Наверное, Вы правы, но мне нужно самому прийти к этому. Пока не понимаю, насколько это актуально в данной конкретной задаче.

Я не собирюсь сам спорить на тему, всегда ли (при возможности) нужно следовать идеологии синхронного дизайна - синтез делает Квартус, вот с ним и спорьте.

Leka, я не спорю. Просто хочу сам понять целесообразность такого подхода.

Leka пишет: Вот я взял модуль DelControl... очевидно, что алгоритм неработоспособен, хотя-бы потому, что del только инкрементируется.

Здесь мне нечего сказать... Мой ляп.
Переделаю весь модуль с учетом этого, и всех предыдущих замечаний.
Alvich, Leka, спасибо!

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

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

Хотелось бы уточнить - это нужно сделать в каждом модуле?

Не в каждом модуле, а для каждого подключаемого модуля нижнего уровня (все Ваши файлы модулей) к модулю верхнего уровня (в Вашем случае Тоp модулю DDM)
Конструкция ключевого соответствия имеет формат:
Название_модуля_нижнего _уровня Название_подключения(.имя_источника сигнала_в_модуле_нижнего_уровня(имя_приемника_сигнала_в модуле_вехнего_уровня), .имя_следующего_источника сигнала(имя_следующего_приемника_сигнала)....);
т.е. ВСЕ это делается в Вашем случае в Тop модуле DDM.
Например:
Вы обьявляете в Тоp модуле шину

wire [9:0] DSpeed;

и подключаете к ней модули, где она используется

SpeedControl SpeedControl(.DSpeed(DSpeed));
FreqControl FreqControl(.DSpeed(DSpeed));

Вы можете в Тop модуле сигнал или шину обозвать другим именем, например

wire [9:0] DаtаSpeed;

и подключить к ней модули нижнего уровня, где она используется с именем DSpeed:
SpeedControl SpeedControl(.DSpeed(DataSpeed));
FreqControl FreqControl(.DSpeed(DataSpeed));

Получается как бы мостик между сигналами в разных файлах.
Спасибо сказали: KIV

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

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

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

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

Просто хочу сам понять целесообразность такого подхода.

Я уже привел пример задачки, которая очень легко решается для синхронного дизайна, и очень сложно - для асинхронного дизайна. И таких примеров можно миллион привести. Это _ложное_ впечатление, что асинхронный дизайн может быть проще синхронного. Если асинхронность не вытекает явным образом из задачи (например, интерфейсы с разными клоками), то асинхронный дизайн м/б оправдан только при особых требованиях скорости, недостижимых в синхронном дизайне.

Вот типичнейшая ситуация в асинхронных дизайнах:
marsohod.org/forum/yazyki-programmirovan...-case-statement#4793

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

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

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

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

Alvich пишет: Не в каждом модуле, а для каждого подключаемого модуля нижнего уровня (все Ваши файлы модулей) к модулю верхнего уровня (в Вашем случае Тоp модулю DDM).
Конструкция ключевого соответствия имеет формат:
...
Вы можете в Тop модуле сигнал или шину обозвать другим именем, например
...
Получается как бы мостик между сигналами в разных файлах.

При этом в модулях нижнего уровня ничего изменять/добавлять не нужно?

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

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

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

Leka пишет: Я уже привел пример задачки, которая очень легко решается для синхронного дизайна, и очень сложно - для асинхронного дизайна.
...
Вот типичнейшая ситуация в асинхронных дизайнах:
...

Leka, как решить конкретно мою задачу по обработке шины данных датчиков Холла (модуль SensContrkl)? Восемь сигналов, асинхронных относительно системного клока, и относительно каждого смежного сигнала в этой шине. А нужно отслеживать изменение любого из этих восьми сигналов, как по фронту, так и по спаду. При этом реакция системы должна быть только на 16 определенных (табличных) комбинаций входных сигналов.

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

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

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

При этом в модулях нижнего уровня ничего изменять/добавлять не нужно?

Нет не нужно.

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

Возможно в качестве идеи реализации будет полезна ссылка:
www.fpga4fun.com/QuadratureDecoder.html
там дизайн синхронный,
только у Вас не 2 датчика а 8,
или поищите по ключевым словам "Rotary Encoder" ведь Вам по сути нужно реализовать его обработку, если я правильно понял логику работы устройства.

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

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

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

Alvich пишет: ...поищите по ключевым словам "Rotary Encoder" ведь Вам по сути нужно реализовать его обработку, если я правильно понял логику работы устройства.

Не совсем так. Энкодер, наряду со счетом импульсов, определяет еще и направление счета.
У меня же ни считать, ни определять направление счета, не нужно. Нужно при определенных состояниях всех разрядов входной шины (сигналы от восьми ДХ), выдавать в выходную шину табличные данные такой же разрядности. Это скорее восьмиразрядный мультиплексор с усеченным количеством входных (и выходных) комбинаций.
В принципе, если закрыть глаза на время переходных процессов в самих ДХ (в даташит этих данных к сожалению нет, но скорее всего там на выходе триггер Шмидта и транзистор с открытым коллектором, который обеспечивает крутые фронты переходов из одного состояния в другое, а довольно значительный магнитный гистерезис исключает дребезги при переключениях), то можно говорить, что неопределенностей по входной шине не должно быть. Тем более, что конструкция и магнитная схема устройства гарантирует, что в каждый момент времени может переключаться только один из восьми ДХ. Однако, моменты переключений всех ДХ апериодичны, что обусловлено погрешностями механики - переключения ХД должны происходить через каждые 12 угловых минут поворота ротора. Очевидно, что без юстировки и ДХ, и магнитов в роторе, добиться большой точности весьма не просто.

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

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

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

  • KIV
  • KIV аватар Автор темы
  • Не в сети
  • Давно я тут
  • Давно я тут
  • Сообщений: 121
  • Спасибо получено: 5
С учетом рекомендаций Alvich и Leka переделал модуль SpeedControl.
Разделил его на два отдельных модуля - Set Speed (выбор скорости) и VarSpeed (подстройка скорости).
module SetSpeed(FSlow, But33, But45, SAcsel, RSpd);
// Пины всех входов кнопок "притянуты" к земле. При нажатиии кнопки на соответствующий пин подается Vcc.
	input FSlow;				// Клок с частотой Fslow
	input But33;				// Сигнал включения скоросnи 33 об/мин
	input But45;				// Сигнал включения скорости 45 об/мин
	input SAcsel;				// Сигнал "Режим разгона"
	output reg RSpd;			// Регистр скорости
			 wire s33;			// Служебная линия
			 wire s45;			// Служебная линия
			 reg r33;			// Регистр кнопки скорости 33 
			 reg r45;			// Регистр кнопки скорости 45

	assign s33 = ~r33 & But33;
	assign s45 = ~r45 & But45;
	initial RSpd <= 1;	

always @(posedge FSlow)
	begin
	r33 <= But33;
	r45 <= But45;
	end
// Обработка нажатия кнопок выбора скорости
always @(posedge FSlow)
	if(SAcsel==0)				// Если не включен режим разгона, 
		begin				// то разрешен выбор рабочей скорости 33
			if(s33 == 1)		// При нажатии кнопки s_33
				RSpd <= 1;	 // устанавливаем сигнал скорости 33 об/мин,
			if(s45 == 1)		// При нажатии кнопки s_45			
				RSpd <= 0;	 // устанавливаем сигнал скорости 33 об/мин.
			if(s33&s45==1)		// При одновременном нажатии двух кнопок				
				RSpd <= RSpd;	// возвращаем ранее выбранное значение
		end
endmodule

Здесь, вроде бы, все нормально, а вот во втором модуле:

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

// Установки выбранной скорости
always @(posedge FSlow)
	begin
		if ((SAcsel==1)||(SStop==1))				// По сигналу "Разгон", или "Стоп"
			begin
				if (RSpd==1)				// в зависимости от ранее выбранной скорости,
					DSpeed <= 10'd837;		// пишем одну, 
				else
					DSpeed <= 10'd620;		// или другую константу,
			end
			begin
				temp <= DSpeed;			// Дублируем ее в temp,
				temp <= (temp >> 3);		// и делим ее на 8 (3 сдвига вправо)
			end
			
// Обработка нажатия кнопки "Увеличение скорости"
		if(SWork==1)					// При включенном сигнале "Рабочий режиме"
			begin					// разрешены операции подстройки скорости:
				if(ButUp==1) 					// При нажатии, и удержании кнопки ButUp:
					if(DSpeed < (temp*9)) 			// Если не вышли за верхний предел диапазона изменения скорости,
						DSpeed <= (DSpeed+1'b1);	// начинаем увеличивать скорость,
					else					// иначе
						DSpeed <= DSpeed;		// переписываем предельное (верхнее) значение DSpeed
				end
				
// Обработка нажатия кнопки "Уменьшение скорости"
				if(ButDn == 1) 					// При нажатии, и удержании кнопки ButDn:
					if(DSpeed > (temp*7)) 			// Если не вышли за нижний предел диапазона изменения скорости
						DSpeed <= (DSpeed-1'b1);	// начинаем уменьшать скорость,
					else					// иначе
						DSpeed <= DSpeed;		// переписываем предельное (нижнее) значение DSpeed
	end
endmodule

RTL viewer показывает, что к некоторым элементам схемы (например - ADD3) подходят шины с очень большой разрадностью - до 29, и даже до 32(!) бит.
Это нормально, или я опять что-то наколбасил непонятное?
Так как плавное изменение скорости выполняется при нажатии, и удержании кнопок, выделять их фронты не стал.

Можно ли эти две строки кода:
temp <= DSpeed;
temp <= (temp >> 3);
заменить на одну:
temp <= (DSpeed >> 3); ?
Не приведет ли это к изменению переменной DSpeed, которая используется в других местах кода? Понимаю, что вопрос совсем ламерский, но все же... :oops:

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

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

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

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
begin/end неправильно используются, лишнее закомментировал:
  		if ((SAcsel==1)||(SStop==1))				// По сигналу "Разгон", или "Стоп"
			begin
				if (RSpd==1)				// в зависимости от ранее выбранной скорости,
					DSpeed <= 10'd837;		// пишем одну, 
				else
					DSpeed <= 10'd620;		// или другую константу,
			//end
			//begin
				//temp <= DSpeed;			// Дублируем ее в temp,
				//temp <= (temp >> 3);		// и делим ее на 8 (3 сдвига вправо)
				temp <= DSpeed >> 3;
			end

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

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

Последнее редактирование: от Leka.
Время создания страницы: 0.239 секунд
Работает на Kunena форум