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

совет по сравнению данных счетчика

Предположим у меня счетчик 32х битный, значение которого каждый клок растет. Ну и автомат управления скажем через каждые восемь значений счетчика должен чтото делать. Причем счетчик используется и некоторыми другими блоками. Не хочется из-за этого второй счетчик который считает до восьми ставить.

 

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

if (unsigned(counter_data) mod to_unsigned(7,32)) = to_unsigned(0,32) then

    --something
end if;

 

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

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


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

а по старинке &cnt[2:0] уже не вкатывает ? %)

 

Ну да, под эту задачу тоже подошло бы. Тогда и так тоже сойдет может:

if counter_data(2 downto 0) = "111" then
--something
end if;

 

Но вот вопрос такой тогда, это также надежно сработает на любых платформах или как?

 

Ну скажем, как например различные синтезаторы на это посмотрят. Просто я везде видел советуют лучше использовать нумерик_стд и явно указывать типы данных при сравнении и других арифметических операциях. Что скажите?

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


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

Но вот вопрос такой тогда, это также надежно сработает на любых платформах или как?

по идее проблем быть не должно

Ну скажем, как например различные синтезаторы на это посмотрят. Просто я везде видел советуют лучше использовать нумерик_стд и явно указывать типы данных при сравнении и других арифметических операциях. Что скажите?

я давно ушел с VHDL, поэтому не в курсе современных тенденций :biggrin: но было бы странно, если бы синтез давал разные результаты синтеза выражения a = const на разных синтезаторах.

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


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

а что мешает сделать процесс по falling_edge(counter_data(2)) и в нем каждый такт отрабатывать автомат управления?

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


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

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

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


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

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

 

К сожалению пока в ПЛИС используются КМОП-транзисторы и не отменены законы сохранения энергии ваше утверждение из разряда фантастики.

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

 

 

Для проверки сделал маленький тест.

 

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

entity test is
    Port (              
        clk : in STD_LOGIC;
        din: in std_logic_vector(3 downto 0);
        dout: out  std_logic_vector(3 downto 0)
        );
end test;

architecture Behavioral of test is

    signal cnt: std_logic_vector(5 downto 0):=(others=>'0');
begin

    process (clk)
    begin
        if rising_edge(clk) then
            cnt<=cnt+1;
--            if (cnt(2 downto 0)="100") then
--               case (cnt(5 downto 4)) is 
--                    when "00" =>
--                        dout<=din;
--                    when "01" =>
--                        dout<=not(din);
--                    when "10" =>
--                        dout<=din(1)&din(2)&din(0)&din(3);
--                    when "11" =>
--                        dout<=not(din(1)&din(2)&din(0)&din(3));
--                    when others =>    
--                    dout<=din(1)&din(2)&din(1)&din(0);
--                end case;    
--            end if;     
        end if;   
    end process;
    
-- process (cnt(2))
--    begin
--        if (falling_edge(cnt(2))) then
--                case (cnt(5 downto 4)) is 
--                    when "00" =>
--                        dout<=din;
--                    when "01" =>
--                        dout<=not(din);
--                    when "10" =>
--                        dout<=din(1)&din(2)&din(0)&din(3);
--                    when "11" =>
--                        dout<=not(din(1)&din(2)&din(0)&din(3));
--                    when others =>    
--                    dout<=din(1)&din(2)&din(1)&din(0);
--                end case;    
--        end if;
--    end process;
    
end Behavioral;

 

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

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


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

а что мешает сделать процесс по falling_edge(counter_data(2)) и в нем каждый такт отрабатывать автомат управления?

давай совет для частного случая, давайте тогда и полный контекст этого случая.

ну думаю тоже имеет смысл тогда, спасибо за совет!

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

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


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

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

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

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

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

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

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

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

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

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