Jump to content

    

Recommended Posts

Доброго все времени суток.
Есть потребность в небольшом логическом модуле управления, в который будет приходить 4 входа от концевых датчиков и 5 выходов, два будут управлять направлением шаговых драйверов, еще два это разрешающие на входы Enable драйверов  и еще один это генерирующий импульсы на входы STEP.
то есть модуль будет состоять из генератора частоты 1000 hz и логики переключения двумя каналами по двум осям (одновременно может двигаться только одна ось). Последовательность перемещения будет цикличной и в процессе работы меняться не будет. Если грубо то выглядеть это будет так - вначале идет перемещение по оси X до активации концевика, переключение на ось Z, через 3 секунды переключение на ось X только в обратную сторону, опять концевик, опять 3 секунды и обратно по оси X, внешне будет похоже на змейку.
Вопрос в следующем, можете посоветовать к каким операторам лучше обратиться для создания данной схемы?

Share this post


Link to post
Share on other sites

Вы не правильно сформулировали вопрос, главный вопрос какую цифровую схему вы видите для реализации описания в FPGA вашей потребности

Что насчет цифоровой схемы? С моделированием цифровых схем "дружите"?

В современных платах FPGA  тактовая частота подается от 50МГц и выше. Дальше Ваше описание цифровой схемы которое делит тактовую частоту до 100Гц (если Вы видите в этом необходимость), формирует импульсы для шаговых двигателей и обрабатывает концевики...

Share this post


Link to post
Share on other sites

да, с цифровыми схемами есть небольшой опыт, но зачем? Ведь проще описать последовательность операторами. Есть опыт в GRAFCET у FESTO и в TIA PORTAL, но в данной конструкции интегрировать Модули от сименс или от Фесто нет финансовой возможности.
Чем плох язык VHDL для написания данной логики?

Edited by Станислав Н

Share this post


Link to post
Share on other sites

Vhdl также как и verilog это как карандаш в руках хужника. Если художник не умеет рисовать, то карандаш не поможет. 

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

PS GRAFCET у FESTO и в TIA PORTAL это высокоуровневые языки от производителей. Сравнивать их с Vhdl/verilog  не коректно мягко говоря. Наверное модули которые программируются с помощью этих языков сложные цифровые устройстава.

Share this post


Link to post
Share on other sites

Прошу прощения, но разработать цифровую схемы, а позже ее еще раз переписать в VHDL.. вам не кажется, что это как штаны через голову надевать? Или я вас не совсем понимаю.
Есть структурная схема, как правило от нее всегда отталкиваются, но, чтобы от цифровой / логической, первый раз слышу. Часто одной строчкой я могу заменить десяток логических модулей, так зачем такие сложности??

да и как это поможет тому художнику, если он не умеет рисовать в VHDL?

Share this post


Link to post
Share on other sites

Ок, начнем с простого, как Вы плаируете например с 50МГц сделать 100Гц? Может лучше работать на на тактовой частоте, есть же сигналы enable?

Share this post


Link to post
Share on other sites

правильно, дальше на базе примитивной логики тригеров(регистров) и комбинационной логики (and or xor и другие логические операторы) надо описать на VHDL этот делитель частоты. Еще как помощь может быть для Вас это Template там Вы можете найти примеры описаний счетчиков, блоков памяти, FSM  и другие...

Далее написать тестбенч и проверить работу...

Share this post


Link to post
Share on other sites

Вот пример описание ШИМа (Широтно-импульсная модуляция (ШИМ, или Pulse-Width Modulation, PWM)

 

Первый процесс описывает счетчик который считает 1 период ШИМ сигнала,  второй процесс компаратор, третий процесс позволяет менять период сигнала шима и длительность нуля

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use IEEE.NUMERIC_STD.ALL;

entity shim is
  generic ( N : natural := 3 );
Port (
clk : in STD_LOGIC;
rst : in STD_LOGIC;
en : in STD_LOGIC;
--load : in STD_LOGIC;
Period : in STD_LOGIC_VECTOR (N-1 downto 0);
Duty_cycle : in STD_LOGIC_VECTOR (N-1 downto 0);
ready_period : out STD_LOGIC;
out_shim : out STD_LOGIC );
end shim;

architecture Behavioral of shim is

signal count_shim : STD_LOGIC_VECTOR (N-1 downto 0);
signal reg_Period :  STD_LOGIC_VECTOR (N-1 downto 0);
signal reg_Duty_cycle :  STD_LOGIC_VECTOR (N-1 downto 0);

begin

process (all)
begin
if rst = '1' then
	count_shim <= (others=>'0');
elsif(rising_edge(clk)) then
	if en = '1' then
		if count_shim = reg_Period  then
			ready_period <= '1';
			count_shim <= (others=>'0');
		else
			count_shim <= count_shim + std_logic_vector( to_unsigned(1, count_shim'length ));
			ready_period <= '0';		
		end if;
	end if;	
end if;
end process;

process (all)
begin
if rst = '1' then
	out_shim <= '0'; 
elsif(rising_edge(clk)) then
	if count_shim < reg_Duty_cycle then
		out_shim <= '1' ; 
	else 
		out_shim <= '0';
	end if; 
end if;
end process;

process (all)
begin
if rst = '1' then
	reg_Period <= (others=>'0');
	reg_Duty_cycle <= (others=>'0');
elsif(rising_edge(clk)) then
	if ready_period = '1' then
		reg_Period <= Period;
		reg_Duty_cycle <= Duty_cycle;
	end if;
end if;
end process;	


end Behavioral;

ниже пример схемы детектирования концевика (коментариев не даю)  - как пример

--detect_sensor


  library ieee;
 use ieee.std_logic_1164.all;
 --use ieee.std_logic_unsigned.all;
 use IEEE.NUMERIC_STD.ALL;
 
 entity  detect_sensor is
   generic ( N : natural := 32 );
 Port (
	clk : in STD_LOGIC;
	rst : in STD_LOGIC;
	sensor : in STD_LOGIC; 
	en_detect : in STD_LOGIC; 
	sensor_rising : out STD_LOGIC; 
	sensor_falling : out STD_LOGIC
	);
 end detect_sensor;
 
 architecture Behavioral of detect_sensor is
 
 signal opto_sensor_shift_r :  unsigned (N-1 downto 0);
 signal reg_sensor_falling, reg_sensor_rising :  STD_LOGIC;
 
 
 begin
 
 sensor_rising <= reg_sensor_rising;
 sensor_falling <= reg_sensor_falling;
 
 process(all)
 begin
 if(rst = '1') then
	opto_sensor_shift_r            <= (others=>'0');
 elsif(rising_edge(clk)) then
	opto_sensor_shift_r            <= opto_sensor_shift_r(N-2 downto 0) & sensor;
 end if;
 end process;

 process(all)
 begin
 if(rst = '1') then
	reg_sensor_rising <= '0';
	reg_sensor_falling <= '0';
 elsif(rising_edge(clk)) then
 if en_detect = '1' then
	if opto_sensor_shift_r((N-1) downto (N/2)) = to_unsigned(((2**(N/2))-1), N/2) and opto_sensor_shift_r((N/2-1) downto 0) =  to_unsigned(0, N/2) then
		reg_sensor_rising <= '1';
	else
		reg_sensor_rising <= '0';
	end if;

	if opto_sensor_shift_r((N-1) downto (N/2)) = to_unsigned(0, N/2) and opto_sensor_shift_r((N/2-1) downto 0) = to_unsigned(((2**(N/2))-1), N/2) then
		reg_sensor_falling <= '1';
	else
		reg_sensor_falling <= '0';
	end if; 
 end if;	
 end if;
 end process; 
 
  end Behavioral;

 

Из-за этого я и пишу что нужно описывать цифровую схему ...

Share this post


Link to post
Share on other sites
3 часа назад, Maverick_ сказал:

PS GRAFCET у FESTO и в TIA PORTAL это высокоуровневые языки от производителей. Сравнивать их с Vhdl/verilog  не коректно мягко говоря. Наверное модули которые программируются с помощью этих языков сложные цифровые устройстава.

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

 

2 часа назад, Maverick_ сказал:

Вот пример описание ШИМа (Широтно-импульсная модуляция (ШИМ, или Pulse-Width Modulation, PWM)

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

 

2 часа назад, Maverick_ сказал:

Из-за этого я и пишу что нужно описывать цифровую схему

Прошу еще раз прощения, но цифровая схема это уже конечный продукт. Мне очень сильно кажется, что такой путь не совсем правильный, ИМХО.
Меня же учили упрощать логические схемы используя таблицы и графики.

Share this post


Link to post
Share on other sites

Станислав Н, под словами "описывать цифровую схему", наверное, имеется ввиду, что надо взять бумажку и карандаш и нарисовать структурную схему прошивки. Можно не заморачиваться непосредственно кодом модулей на этом этапе - нужно продумать архитектуру и взаимодействие модулей друг с другом. Когда уже будет понятно какие модули должны быть, какие у них порты, протоколы по входам и выходам, короче практически есть ТЗ на них - пишите код, соединяете модули на топе и моделируете.

Share this post


Link to post
Share on other sites

так я же спрашивал, что возможно подразумевается структурная схема. Если это так, то все ок, но из готовой цифровой вытягивать.. мне даже представить сложно.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.