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

Таймер задержки на VHDL

library ieee;

use ieee.numeric_std.all;

use ieee.std_logic_1164.all;

 

 

entity del_clk_tb is

end del_clk_tb;

 

architecture TB_ARCHITECTURE of del_clk_tb is

component Verilog2VHDL

port(

clk : in std_logic;

res : in STD_LOGIC;

del_clk : in STD_LOGIC_VECTOR (15 downto 0);

prog : in STD_LOGIC_VECTOR (15 downto 0);

shim : out STD_LOGIC);

end component;

 

signal res : std_logic ;

signal clk : std_logic ;

signal prog : std_logic_vector(15 downto 0) ;

signal del_clk : std_logic_vector(15 downto 0) ;

signal shim : std_logic;

 

 

begin

 

UUT : Verilog2VHDL

port map (

res => res,

shim => shim,

clk => clk,

prog => prog,

del_clk => del_clk

);

 

pClock: process

begin

clk <= '0';

wait for 10 ns;

clk <= '1';

wait for 10 ns;

end process;

 

pReset: process

begin

res <= '1';

prog <= "0000000000000010";

del_clk <= "0000000000000011";

wait until rising_edge(clk);

wait until rising_edge(clk);

wait until rising_edge(clk);

res <= '0';

wait; -- Forever

end process;

 

end TB_ARCHITECTURE;

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


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

Если моделировать в модельсиме, то можно обойтись без тестбенчей(так быстрее и удобнее за всем наблюдать, по крайней мере для меня). Я задаю необходимые сигналы через закладку Objects.

Сначала res=1 prog=0000000000000010 del_clk=0000000000000011

clk=clock(period 100,duty 50)====>делаем run 300 смотрим

меняем res=0=======>делаем run 1000 и смотрим что получилось

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


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

Если следовать Вашей блок схеме, можно ввести сигналы set и out. И по другому быть не может.

А дальше выбор. Или сдвигающий регистр на 60 тыся отсчетов. И все равно период set должен быть больше периода out. Или как у меня сигналы длительностью в один период клока.

И не торопитесь увольнять схемотехника. Ведь он в графике рисует. А это процесс трудоемкий. Поэтому сначало думать приходиться. На этом и заканчиваю.

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity Verilog2VHDL is

Port ( clk : in STD_LOGIC;

res : in STD_LOGIC;

del_clk : in STD_LOGIC_VECTOR (15 downto 0);

prog : in STD_LOGIC_VECTOR (15 downto 0);

set : out STD_LOGIC;

outt : out STD_LOGIC);

end Verilog2VHDL;

 

architecture Behavioral of Verilog2VHDL is

signal ct_a : STD_LOGIC_VECTOR (15 downto 0);

signal ct_b : STD_LOGIC_VECTOR (15 downto 0);

signal enable : STD_LOGIC;

 

begin

process(clk)

begin

if(clk='1' and clk'event) then

if (res='1') then

ct_a(0 downto 0) <= (others => '1');

elsif (ct_a = 1) then

if del_clk = 0 then

ct_a(0 downto 0) <= (others => '1');

else ct_a <= del_clk;

end if;

else

ct_a <= ct_a - 1;

end if;

if (ct_a = 1) then

if prog = 0 then

ct_a(0 downto 0) <= (others => '1');

else ct_b <= prog;

end if;

elsif (enable='1') then

ct_b <= ct_b - 1;

end if;

if (ct_a = 1) then

enable <= '1';

elsif (ct_b = 1)then

enable <= '0';

end if;

if (ct_a = 1) then

set <= '1';

else

set <= '0';

end if;

if (ct_b = 1) then

outt <= '1';

else

outt <= '0';

end if;

end if;

end process;

 

end Behavioral;

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


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

to sazh

Проверяли?

При res=1 уже на втором тактовом импульсе выскакивает set=1 u enable=1 , а на outt всегда ноль.

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


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

Я всегда проверяю. Если запретить считать счетчику, то и сигналы изменяться не будут.

А ошибка есть. Когда копированием эксперементировал с этой предовой строчкой

ct_b(0 downto 0) <= (others => '1');

По ресету выходные сигналы можно в ноль установить. Только результат тот же будет.

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity Verilog2VHDL is

Port ( clk : in STD_LOGIC;

res : in STD_LOGIC;

del_clk : in STD_LOGIC_VECTOR (15 downto 0);

prog : in STD_LOGIC_VECTOR (15 downto 0);

set : out STD_LOGIC;

outt : out STD_LOGIC);

end Verilog2VHDL;

 

architecture Behavioral of Verilog2VHDL is

signal ct_a : STD_LOGIC_VECTOR (15 downto 0);

signal ct_b : STD_LOGIC_VECTOR (15 downto 0);

signal enable : STD_LOGIC;

 

begin

process(clk)

begin

if(clk='1' and clk'event) then

if (res='1') then

ct_a(1 downto 1) <= (others => '1');

elsif (ct_a = 1) then

if del_clk = 0 then

ct_a(0 downto 0) <= (others => '1');

else ct_a <= del_clk;

end if;

else

ct_a <= ct_a - 1;

end if;

if (ct_a = 1) then

if prog = 0 then

ct_b(0 downto 0) <= (others => '1');

else ct_b <= prog;

end if;

elsif (enable='1') then

ct_b <= ct_b - 1;

end if;

if (ct_a = 1) then

enable <= '1';

elsif (ct_b = 1)then

enable <= '0';

end if;

if (ct_a = 1) then

set <= '1';

else

set <= '0';

end if;

if (ct_b = 1) then

outt <= '1';

else

outt <= '0';

end if;

end if;

end process;

 

end Behavioral;

 

 

Все строчки типа ct_a(1 downto 1) <= (others => '1');

надо откатить назад. Бредятина получается.

И на этом с VHDL действительно все.

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


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

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

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity timer_test is

Port ( clk : in STD_LOGIC;

set_clk : in STD_LOGIC;

reset : in STD_LOGIC;

prog_divCLK : in STD_LOGIC_VECTOR (15 downto 0);

prog_delay : in STD_LOGIC_VECTOR (15 downto 0);

out_timer : out STD_LOGIC;

out_divCLK : out STD_LOGIC);

end timer_test;

 

architecture Behavioral of timer_test is

signal st_divCLK : STD_LOGIC_VECTOR (15 downto 0);

signal st_timer : STD_LOGIC_VECTOR (15 downto 0);

signal start_timer : STD_LOGIC;

signal comp_sig : STD_LOGIC;

signal divCLK : STD_LOGIC;

signal enable : STD_LOGIC;

signal timer : STD_LOGIC;

begin

process(clk)

begin

if (clk='1' and clk'event) then

if reset = '1' then

st_divCLK <= "0000000000000001";

start_timer<='0';

elsif set_clk = '1' then

if st_divCLK = "0000000000000001" then

st_divCLK <= prog_divCLK;

else st_divCLK <= st_divCLK - 1;

end if;

if st_divCLK="0000000000000001" then

start_timer<='1';

else

start_timer<='0';

end if;

end if;

end if;

end process;

divCLK<= (clk and start_timer);

out_divCLK<=divCLK;

process(clk)

begin

if (clk='1' and clk'event) then

if (start_timer='1') then

enable<='1';

elsif (start_timer='0' and comp_sig='1') then

enable<='0';

end if;

end if;

end process;

process(clk)

begin

if (clk='1' and clk'event) then

if reset = '1' then

st_timer <= "0000000000000001";

comp_sig <='0';

elsif enable='1' then

if st_timer = "0000000000000001" then

st_timer <= prog_delay;

else st_timer <= st_timer - 1;

end if;

if st_timer = "0000000000000001" then

comp_sig <='1';

else

comp_sig <='0';

end if;

end if;

end if;

end process;

timer<= (clk and comp_sig);

out_timer<=timer;

end Behavioral;

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


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

divCLK<= (clk and start_timer);

 

Вы уверены что это Вам нужно? Помоделируйте все ето после синтеза и P&R(c SDF). Много интересного увидете. :cranky:

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

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


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

Да,вот наткнулся на свою старую темку,а тогда вот что получилось

process(clk) -- делитель + таймер

begin

if (clk='1' and clk'event) then

if reset_clk = '1' then

st_divCLK <= "0000000000000001";

start_timer<='0';

elsif set_clk = '1' then

if st_divCLK = "0000000000000001" then

st_divCLK <= prog_divCLK;

else st_divCLK <= st_divCLK - 1;

end if;

if st_divCLK="0000000000000001" then

start_timer<='1';

else

start_timer<='0';

end if;

end if;

end if;

end process;

process(start_timer, timer)

begin

if timer='1' then

enable_timer<='0';

elsif start_timer='1' then

enable_timer<='1';

end if;

end process;

process(clk)

begin

if (clk='1' and clk'event) then

if reset_clk = '1' then

st_timer<="0000000000000000";

timer<='0';

elsif set_clk = '1' then

if enable_timer='1' then

if st_timer<prog_delay_sig then

st_timer<=st_timer+1;

else

st_timer<="0000000000000000";

end if;

end if;

if st_timer<prog_delay_sig then

timer<='0';

else

timer<='1';

end if;

end if;

 

end if;

end process;

divCLK<= start_timer;

out_timer<=timer;

правда там были внесены некоторые другие условия по сравнению с исходными,но основная идея та же

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

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...