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

Всем добрый!

Балуюсь (т.е. изучаю) 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.

 

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

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


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

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: 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 = cfg_in) then

count <= "0000";

else

count <= count + 1;

end if;

end if;

end process COUNTER;

 

cnt_out <= count;

 

end Behavioral;

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


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

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: 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 = cfg_in) then

count <= "0000";

else

count <= count + 1;

end if;

end if;

end process COUNTER;

 

cnt_out <= count;

 

end Behavioral;

 

Спасибо!

Сейчас попробую!

 

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: 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 = cfg_in) then

count <= "0000";

else

count <= count + 1;

end if;

end if;

end process COUNTER;

 

cnt_out <= count;

 

end Behavioral;

 

Выдал :

ERROR:HDLParsers:808 - "C:/XILINX_PROJECTS/Par_counter/Par_counter/cnt.vhd" Line 40. = can not have such operands in this context.

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


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

ERROR:HDLParsers:808 - "C:/XILINX_PROJECTS/Par_counter/Par_counter/cnt.vhd" Line 40. = can not have such operands in this context.

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

if (count = cfg_in-1) then

А в вашем случае stop некорректно описали. (else '0')

И все по фронту должно быть, иначе по пичкам в ноль уходить будет

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


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

Ну так поправь строчку if (tact_in'event and tact_in = '1') then

Виноват! Сразу и не заметил!

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


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

-1 ни к чему, если надо досчитать до заданного числа

 

обычно число - это количество отсчетов. Состояние 0 счетчика в вашем случае полноценное.

А в неудачном примере у товарища - состояние, по которому счетчик в ноль уйдет - неполноценное (не говоря уже о корректности решения)

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


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

обычно число - это количество отсчетов. Состояние 0 счетчика в вашем случае полноценное.

А в неудачном примере у товарища - состояние, по которому счетчик в ноль уйдет - неполноценное (не говоря уже о корректности решения)

С точки зрения здравого смысла конечно вы правы, но что именно нужно нашему другу не видно из первоначального поста. :rolleyes:

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


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

С точки зрения здравого смысла конечно вы правы, но что именно нужно нашему другу не видно из первоначального поста. :rolleyes:

 

Да я хотел сформировать сигнал, по которому будет запускаться другой счетчик.

Т.е. постоять сколько-то тактов первого счетчика, равных cfg_in и продвинуть следующий счетчик.

Поэтому сформировал сигнал test :

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;

test :out 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: 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 = cfg_in) then

count <= "0000";

else

count <= count + 1;

end if;

end if;

end process COUNTER;

 

test <= '1' when(count = cfg_in) else '0';

cnt_out <= count;

 

Правда вне процесса. Это корректно?

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


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

Да я хотел сформировать сигнал, по которому будет запускаться другой счетчик.

Т.е. постоять сколько-то тактов первого счетчика, равных cfg_in и продвинуть следующий счетчик.

Поэтому сформировал сигнал test :

 

Правда вне процесса. Это корректно?

 

Если cfg_in - коэффициент пересчета 1 счетчика, по завершении счета которого считает 2 и приходит извне, для корректности не хватает регистра для фиксации cfg_in по завершении счета 1 счетчика.

Можно обойтись без него, если 1 счетчик считает в минус, тогда грузить в него cfg_in по состоянию 0. по этому же состоянию разрешать счет 2 счетчика.

Это более наглядно. И ресурсов меньше.

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


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

Если cfg_in - коэффициент пересчета 1 счетчика, по завершении счета которого считает 2 и приходит извне, для корректности не хватает регистра для фиксации cfg_in по завершении счета 1 счетчика.

Можно обойтись без него, если 1 счетчик считает в минус, тогда грузить в него cfg_in по состоянию 0. по этому же состоянию разрешать счет 2 счетчика.

Это более наглядно. И ресурсов меньше.

 

В реальности cfg_in это регистр в который пишут извне. А зачем его фиксировать по завершении счета 1 счетчика?

Согласен, что счетчик должен считать в минус, более понятно. А вот "по этому же состоянию разрешать счет 2 счетчика" не совсем понятно.

Преполагал, что этот сигнал будет клоком для 2 счетчика а не разрешением счета.

Извините, пишу на VHDL только пару месяцев, вникаю в тонкости :unsure:

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


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

В реальности cfg_in это регистр в который пишут извне. А зачем его фиксировать по завершении счета 1 счетчика?

Преполагал, что этот сигнал будет клоком для 2 счетчика а не разрешением счета.

 

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

Разрешение счета, для работы обоих счетчиков от одной частоты. Одноклоковая синхронизация.

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


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

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

Разрешение счета, для работы обоих счетчиков от одной частоты. Одноклоковая синхронизация.

 

Спасибо!

 

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

Разрешение счета, для работы обоих счетчиков от одной частоты. Одноклоковая синхронизация.

 

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

А насчет счетчика 2 поясню - 1 счетчик отсчитывает кол-во тактов, которые надо пропустить и затем продвинуть счетчик 2 . Поэтому сигнал test будет клоком для 2 счетчика.

 

И еще интересно - как загрузить счетчик (считаем в минус) при состоянии "0000"

 

 

if count ="0000" then load = '1';

if load = '1' hten count = 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 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;

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


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

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

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

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

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

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

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

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

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

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