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

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

entity cnt is
port (tact_in :in std_logic;
cfg_in :in std_logic_vector (3 DOWNTO 0);
cnt_out :out std_logic_vector(3 downto 0)
); 
end cnt;

architecture Behavioral of cnt is

signal count_a, count_b : std_logic_vector(3 downto 0) := (others => '0');
begin

COUNTER: process (tact_in) 
begin
if (tact_in'event and tact_in = '1') then
if (count_a = "0000") then
count_a <= cfg_in;
count_b <= count_b + 1;
else
count_a <= count_a - 1;
count_b <= count_b;

end if;
end if;
end process COUNTER;

cnt_out <= count_b;

end Behavioral;

 

Вопросов нет!

Сччччас проверю!

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


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

Задача очень похожа, только пока не получается :unsure:

Надо написать счетчик, который бы загрузил значение по сигналу LOAD, досчитал по CLK до 0 и далее не считал до прихода нового LOAD.

Может поможете (новичек)?

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


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

Может поможете (новичек)?

для начала ваш выложите ваш вариант :)

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


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

для начала ваш выложите ваш вариант :)

 

Да все уже закоментарил,

что-то вроде:

 

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity CONTROL is

port (LOAD :in std_logic;

clk :in std_logic

);

end CONTROL;

 

architecture struct of CONTROL is

 

signal count_a, count_b : std_logic_vector(3 downto 0) := (others => '0');

signal reset_a: std_logic;

 

COUNTER: process (LOAD,clk,reset_a)

begin

if (reset_a = '1') then

count_a <= "0000";

elsif (LOAD = '1') then

count_a <= "0100";

elsif rising_edge(clk) then

count_a <= count_a - 1;

end if;

 

end process COUNTER;

 

COUNTER2: process (LOAD,clk)

begin

if (LOAD = '1') then

count_b <= "0100";

 

elsif rising_edge(clk) then

count_b <= count_b - 1;

end if;

end process COUNTER2;

 

reset_a <= '1' when (count_b = "0000") else '0';

 

end struct;

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

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


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

Надо написать счетчик, который бы загрузил значение по сигналу LOAD, досчитал по CLK до 0 и далее не считал до прихода нового LOAD.

как ваша задача согласуется с тем кодом который вы привели ?

COUNTER: process (LOAD,clk,reset_a)

begin

....

end process COUNTER;

 

COUNTER2: process (LOAD,clk)

begin

...

end process COUNTER2;

 

И как я понимаю результаты работы вашего модуля вас не интересуют ?

entity CONTROL is

port (LOAD :in std_logic;

clk :in std_logic

);

end CONTROL;

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


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

Разверну ка я тему к началу. Проблема в исходном коде заключена в одной строчке - выделена жирным и красным

 

Всем добрый!

Балуюсь (т.е. изучаю) VHDL. Написал счетчик, который должен считать только до нужного значения = cfg_in. Хотел проверить, будет ли работать.

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

 

entity cnt is

port (tact_in :in std_logic;

cfg_in :in std_logic_VECTOR (3 DOWNTO 0);

cnt_out :out std_logic_vector(3 downto 0)

);

end cnt;

 

architecture Behavioral of cnt is

 

 

signal stop: std_logic;

signal count: std_logic_vector(3 downto 0);

signal cfg: std_logic_vector(3 downto 0);

 

begin

 

cfg <= cfg_in;

stop <= '1' when (count = cfg);

 

COUNTER: process (tact_in,stop) begin

if (stop = '1') then count <= "0000";

elsif (rising_edge(tact_in)) then

count <= count + 1;

end if;

end process;

 

cnt_out <= count;

 

end Behavioral;

 

Выдает:

WARNING:Xst:647 - Input <tact_in> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

WARNING:Xst:646 - Signal <cfg> is assigned but never used. This unconnected signal will be trimmed during the optimization process.

 

Что за ерунда? Вроде использую. Ну и конечно не работает.

 

а всего-то надо было сказать а что присваивать сигналу stop когда count /= cfg т.е.

 

stop <= '1' when (count = cfg) else '0';

 

У Вас получилось, что stop всегда = '1'. Значит, count <= "0000" всегда. Значит, как говорится, "кузнец не нужен" :)

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


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

Разверну ка я тему к началу. Проблема в исходном коде заключена в одной строчке - выделена жирным и красным

 

 

 

а всего-то надо было сказать а что присваивать сигналу stop когда count /= cfg т.е.

 

stop <= '1' when (count = cfg) else '0';

 

У Вас получилось, что stop всегда = '1'. Значит, count <= "0000" всегда. Значит, как говорится, "кузнец не нужен" :)

 

И правда!

Написал :

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity CONTROL is

port (TEST :out std_logic;

stop_out :out std_logic;

LOAD :in std_logic;

clk :in std_logic;

);

end CONTROL;

 

architecture struct of CONTROL is

 

signal count,cfg: std_logic_vector(3 downto 0) := (others => '0');

signal stop: std_logic;

 

begin

 

cfg <= "0111" when (LOAD = '1') else "0000";

stop <= '1' when (count = cfg) else '0';

 

COUNTER: process (clk,stop) begin

 

if (stop = '1') then count <= "0000";

elsif (rising_edge(clk)) then

count <= count + 1;

end if;

end process;

 

TEST <= '1' when ((count >= "0001") and (count <= "0110")) else '0';

stop_out <= stop;

 

end struct;

 

И вижу:

сигнал TEST имеет правильную длительность, т.е 5 тактов clk в '1' после сигнала LOAD, далее в '0' до прихода следующего LOAD

а вот stop_out - 14 тактов clk в '0' после сигнала LOAD. Почему не 7???

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


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

Всю тему с самого начала не читал(много). Может быть поможет вот это (копирайт - не мое):

entity counter is

generic (width : integer );

port (data : in std_logic_vector (width-1 downto 0);

load, en, clk, rst : in std_logic;

q :out std_logic_vector (width-1 downto 0));

end counter;

 

architecture behave of counter is

signal count : std_logic_vector (width-1 downto 0);

begin

process(clk, rst)

begin

if rst = '1' then

count <= (others => '0');

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

if load = '1' then

count <= data;

elsif en = '1' then

count <= count + 1;

end if;

end if;

end process;

q <= count;

end behave;

 

 

если нужен счет до конкретного числа - то вот его модификация:

 

entity counter is

generic (width : integer ;

K: integer);

port (data : in std_logic_vector (width-1 downto 0);

load, en, clk, rst : in std_logic;

q :out std_logic_vector (width-1 downto 0));

end counter;

 

architecture behave of counter is

signal count : std_logic_vector (width-1 downto 0);

begin

process(clk, rst)

begin

if rst = '1' then

count <= (others => '0');

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

if load = '1' then

count <= data;

elsif (en = '1' and conv_integer(unsigned(count))<K-1) then

count <= count + 1;

elsif (en = '1' and conv_integer(unsigned(count))=K-1) then

count <= (others => '0');

end if;

end if;

end process;

q <= count;

end behave;

 

 

если нужно остановиться, досчитав до К-1, удаляем в примере такие строчики

elsif (en = '1' and conv_integer(unsigned(count))=K-1) then

count <= (others => '0');

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


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

Всю тему с самого начала не читал(много). Может быть поможет вот это (копирайт - не мое):

 

 

 

если нужен счет до конкретного числа - то вот его модификация:

 

 

 

 

если нужно остановиться, досчитав до К-1, удаляем в примере такие строчики

 

 

Все получилось!

Всем спасибо за подсказки!

 

КОД:

 

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

 

entity CONTROL is

port (TEST :out std_logic;

LOAD :in std_logic;

clk :in std_logic;

);

end CONTROL;

 

 

 

architecture struct of CONTROL is

 

signal count,cfg: std_logic_vector(3 downto 0) := "1111";

signal stop: std_logic;

 

 

begin

 

cfg <= "0111";

 

process(clk,load,stop)

begin

 

if load = '1' then

count <= cfg;

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

count <= count - 1;

if stop = '1' then

count <= (others => '0');

end if;

end if;

end process;

 

stop <= '1' when (count = "0000") else '0';

TEST <= '0' when ((count >= "0001") and (count <= "0110")) else '1';

 

end struct;

 

получил сигнал TEST длительностью 6 тактов в нуле.

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

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


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

Всм добрый день!

 

Хотел бы узнать,возможно ли написать счетчик на VHDL , с переменным шагом счета?

 

Можно ,конечно, залепить кучу счетчиков с разным шагом, а затем их подключать (CASE).

 

А попроще?

VARIABLE ? ....

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


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

Всм добрый день!

 

Хотел бы узнать,возможно ли написать счетчик на VHDL , с переменным шагом счета?

 

Можно ,конечно, залепить кучу счетчиков с разным шагом, а затем их подключать (CASE).

 

А попроще?

VARIABLE ? ....

А попроще использовать не счетчик, а аккумулятор и прибавлять (вычитать) к предудущему значению не 1, а требуемый шаг

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


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

А попроще использовать не счетчик, а аккумулятор и прибавлять (вычитать) к предудущему значению не 1, а требуемый шаг

 

Да, интересная мысль!

Хотя пока еще пережевываю , написался уже сегодня - в своих же мозгах запутался ...

Кое чего дописать еще надобно ...

Да и конец рабочего дня скоро ....

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


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

COUNTER: process (tact_in)

begin

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

if (count_a = "0000") then

count_a <= cfg_in;

count_b <= count_b + 1;

else

count_a <= count_a - 1;

count_b <= count_b;

 

end if;

end if;

end process COUNTER;

Это (выделено) обязательно? Синтезатор не разберется?
Изменено пользователем x736C

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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