olimpic56

Как К Коду Шим На Vhdl Добавить Настроечный Вход Пилы

10 сообщений в этой теме

olimpic56    0

Доброго дня всем!...

Прошу помочь разобраться с VHDL. Собственно нужно было сделать ШиМ с настройкой периода и частоты. На сегодня потребовалось добавить к уже имеющемуся коду настроечных вход типа "Пилы"(для 1-пила, для 0-обратная пила). Я битый час ищу информацию касательно этого, но даже представить себе не могу как такое можно реализовать. Ниже выложу уже имеющейся код на VHDL, если не сложно помогите подалуйста дописать данные строки настройки. Спасибо.

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY pwm IS
GENERIC(
 sys_clk		 : INTEGER := 50_000_000;
 pwm_freq	 : INTEGER := 100_000;
 bits_resolution : INTEGER := 8;	
 phases		 : INTEGER := 1);	
PORT(
 clk	 : IN STD_LOGIC;								
 reset_n : IN STD_LOGIC;								
 ena	 : IN STD_LOGIC;								
 duty	 : IN STD_LOGIC_VECTOR(bits_resolution-1 DOWNTO 0);
 pwm_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0);		
 pwm_n_out : OUT STD_LOGIC_VECTOR(phases-1 DOWNTO 0));	
END pwm;
ARCHITECTURE logic OF pwm IS
CONSTANT period : INTEGER := sys_clk/pwm_freq;					
TYPE counters IS ARRAY (0 TO phases-1) OF INTEGER RANGE 0 TO period - 1;
SIGNAL count	 : counters := (OTHERS => 0);						
SIGNAL half_duty : INTEGER RANGE 0 TO period/2 := 0;				
BEGIN
PROCESS(clk, reset_n)
BEGIN
IF(reset_n = '0') THEN										
 count <= (OTHERS => 0);										
 pwm_out <= (OTHERS => '0');									
 pwm_n_out <= (OTHERS => '0');									
ELSIF(clk'EVENT AND clk = '1') THEN							
 IF(ena = '1') THEN											
 half_duty <= conv_integer(duty)*period/(2**bits_resolution)/2;
 END IF;
 FOR i IN 0 to phases-1 LOOP									
 IF(count(0) = period - 1 - i*period/phases) THEN				
	 count(i) <= 0;												
 ELSE															
	 count(i) <= count(i) + 1;										
 END IF;
 END LOOP;
 FOR i IN 0 to phases-1 LOOP								
 IF(count(i) = half_duty) THEN									
	 pwm_out(i) <= '0';											
	 pwm_n_out(i) <= '1';										
 ELSIF(count(i) = period - half_duty) THEN						
	 pwm_out(i) <= '1';											
	 pwm_n_out(i) <= '0';										
 END IF;
 END LOOP;
END IF;
END PROCESS;
END logic;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    647

Опиши подробнее, на пальцах и/или диаграммах, что за вход пилы требуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    647

Так, погоди. На выходе ШИМ у нас только 0 или 1, верно?

Как тогда должна быть реализована эта пила?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

olimpic56    0

Все верно, так вот в том и вопрос. Препад говорит разбирайся сам((( :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    647

Поучиться бы твоему преподу составлять ТЗ :)

Могу предположить следующее (включаю телепатию):

прописываем в ШИМ число, например 10, и ШИМ автоматически в первом периоде своей работы выдаёт 10 единиц, в следующем - 9 единиц, затем 8 и т.д. до 0. После этого всё повторяется. При обратной пиле соответсвенно счёт идёт от 0 до 10.

Верно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
olimpic56    0

Вроде как да, мысль уловил. :yes: Не поверите ему это ТЗ таскаю с конца сентября, прикопался к этой пиле и все тут

Изменено пользователем olimpic56

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Vascom    647

Ну раз мысль уловил, думаю сможешь релизовать. Ничего сложного тут нет, просто дополнительный цикл и счётчик добавятся.

Я с VHDL не особо дружу, Verilog мне роднее, так что конкретнее уже не смогу подсказать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас