Перейти к содержанию

Vhdl. Тактовый Генератор, 3 Датчика, Led


Germann

Рекомендуемые сообщения

Здравствуйте. У меня есть задание, оно звучит так: есть 3 датчика, если приходит сигнал от одного, то загорается диод на 5 сек, после тухнет.

Так же дана частота 250 КГц на вход.

Я написал тактовый генератор. Протестил его со всех сторон - всё работает хорошо. Вот код:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.NUMERIC_STD.ALL;


Entity ClockGenerator is
Generic(NCount: Natural := 625000);
Port(reset: in STD_LOGIC;
	 clk: in STD_LOGIC;
y: out STD_LOGIC);
End ClockGenerator;

Architecture Behavioral of ClockGenerator is
Signal s: STD_LOGIC := '0';
Signal f: STD_LOGIC := '1';
shared variable r: STD_LOGIC := '0';	-- если равен 1, то надо сбросить счетчик
begin
-- Обнулить счетчик времмени
process(reset)
begin
	if(reset'event and reset = '1') then
		r := '1';
	else
		r := '0';
	end if;	
end process;

process(clk, reset)
	variable c: STD_LOGIC_VECTOR(23 downto 0) := (others => '0');
begin
	if(clk'event) then
		if(r = '1') then
			c := (others => '0');
			r := '0';
		else
			if (clk = '1') then
				c := std_logic_vector(unsigned(c) + 1);
				if(c = NCount) then
					s <= '1';
					c := (others => '0');
				else
					s <= '0';
				end if;
			end if;
		end if;
	end if;
end process;

process(s)
begin
	if(s'event and s = '1') then
		f <= not f;
	end if;
end process;	

y <= f;
end Behavioral;

Т.е. раз входная частота равно 250 КГц, то clk'event будет срабатывать раз в 0,000004 секунды. Мой счетчик будет подсчитывать количество тактов и когда пройдет 5 секунд (т.е. было 625000 тактов) будет выдавать сигнал.

Далее я написал сам модуль (по заданию который)

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY MAIN IS
Port(d1, d2, d3: in STD_LOGIC; 	-- Датчики
	 s: out STD_LOGIC;				-- Выходной сигнал
	 clk: in STD_LOGIC
	 );
END MAIN;

ARCHITECTURE behavior OF MAIN IS
-- Components
Component ClockGenerator
	Port(reset: IN std_logic;
		 clk: IN std_logic;
		 y: OUT std_logic
		 );
End component;
-- Signals
signal r: std_logic := '0';
signal st: std_logic := '0';
signal y: std_logic;
-- Logic
Begin
Clock: ClockGenerator port map(reset => r, clk => clk, y => y);

process(d1, d2, d3)
begin
	if((d1'event and d1 = '1') or	(d2'event and d2 = '1') or	(d3'event and d3 = '1')) and st = '0'
	then
		r <= '1';
		st <= not st;
	end if;
end process;

process(y)
begin
	if(y'event and y = '1' and st = '1')
	then
		r <= not r;
		st <= not st;
	end if;
end process;

s <= st;
End behavior;

Тут, всё (вроде как) просто. Т.е. если d1, d2 или d3 становятся равными 1, то обнуляется таймер и ждем, пока ClockGenerator дает на выходе 1, что означает, что прошло 5 секунд. Всё это время (пока ждем сигнала от ClockGenerator) возвращаем 1 из моделя.

К этой схеме написал Test Bench, он и делает нужную частоту. Для пример в нем я отправляю в d2 1 через короткое время, но мой модель не возвращает при этом 1 (диод включен). Вот test bench:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;

ENTITY TEST IS
END TEST;

ARCHITECTURE behavior OF TEST IS

-- Component Declaration for the Unit Under Test (UUT)

COMPONENT MAIN
PORT(
d1: IN std_logic;
d2: IN std_logic;
d3: IN std_logic;
s: OUT std_logic;
clk: IN std_logic
);
END COMPONENT;


--Inputs
signal d1 : std_logic := '0';
signal d2 : std_logic := '0';
signal d3 : std_logic := '0';

--BiDirs
signal clk: std_logic := '0';

--Outputs
signal s : std_logic;

-- Clock period definitions
constant clk_period : time := 0.004 ms;

BEGIN

-- Instantiate the Unit Under Test (UUT)
uut: MAIN PORT MAP (
d1 => d1,
d2 => d2,
d3 => d3,
s => s,
clk => clk
);

-- Clock process definitions
clk_process :process
begin
	clk <= '0';
	wait for clk_period/2;
	clk <= '1';
	wait for clk_period/2;
end process;


-- Stimulus process
stim_proc: process
begin	
wait for clk_period*10;
		d2 <= '1';
wait;
end process;

END;

Прошу помощи у вас.

Спасибо

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Такс. Возможно это из-за того что я в двух разных процессах меняю сигнал st

process(d1, d2, d3)
begin
	if((d1'event and d1 = '1') or	(d2'event and d2 = '1') or	(d3'event and d3 = '1'))-- and st = '0'
	then
		st := not st;
		r  <= '1';
	end if;
end process;

process(y)
begin
	if(y'event and y = '1') -- and st = '1') 
	then
		st := not st;
		r  <= '0';
	end if;
end process;

Потаму что, если закоментить st := not st;, то выходной сигнал s не будет равен X. Есть идеи как это исправить?

Спасибо.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...