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

Назначение выходных сигналов

Здравствуйте!

Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/

 

entity div125 is
 Port ( CLK : in std_logic;                   
          Q : out std_logic);                   
end div125;

architecture Behavioral of div125 is          
 signal st : std_logic_vector(6 downto 0); 
begin
process(CLK)                                    
begin
 if CLK ‘event and CLK = '1' then       
    if conv_integer(st) = 124 then
       st <= conv_std_logic_vector(0,7);
    else st <= st + 1;                          
    end if;                                          
 end if;                                             
end process;

Q <= ’1' when conv_integer(st) = 124 else ’0';

end Behavioral;

 

Почему выходному сигналу Q значение присваивается вне процесса?

И такая практика повсеместно, на сколько я понимаю. Кто может внятно объяснить почему этого лучше не делать в процессе?

Спасибо.

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


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

Здравствуйте!

Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/

 

entity div125 is
 Port ( CLK : in std_logic;                   
          Q : out std_logic);                   
end div125;

architecture Behavioral of div125 is          
 signal st : std_logic_vector(6 downto 0); 
begin
process(CLK)                                    
begin
 if CLK ‘event and CLK = '1' then       
    if conv_integer(st) = 124 then
       st <= conv_std_logic_vector(0,7);
    else st <= st + 1;                          
    end if;                                          
 end if;                                             
end process;

Q <= ’1' when conv_integer(st) = 124 else ’0';

end Behavioral;

 

Почему выходному сигналу Q значение присваивается вне процесса?

И такая практика повсеместно, на сколько я понимаю. Кто может внятно объяснить почему этого лучше не делать в процессе?

Спасибо.

 

процесом описан счётчик, а выражение с Q описывает компаратор... это разные вещи....

 

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


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

Спасибо за ответ :)

процесом описан счётчик, а выражение с Q описывает компаратор... это разные вещи....

 

Да, разные. Но почему не принято (или нельзя) писать строку

Q <= ’1' when conv_integer(st) = 124 else ’0';

в области видимости процесса? Процесс выполняется каждый раз по изменению сигнала CLK. А когда выполняется строка компаратора? Чаще?

И как будет работать программа, если строку компаратора поместить внутрь процесса?

 

PS: прошу прощения я новичок в этом. Осваиваюсь.

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


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

Да, разные. Но почему не принято (или нельзя) писать строку
Q <= '1' when conv_integer(st) = 124 else '0';

в области видимости процесса?

Что значит не принято или нельзя? Такой процесс порождает триггер. Если вам нужен триггер на выходе компаратора, делаете в процессе. Не нужен -- делаете вне процесса.

Процесс выполняется каждый раз по изменению сигнала CLK. А когда выполняется строка компаратора?
Очевидно, что асинхронная схема, которой является компаратор, срабатывает при любом изменении входных сигналов.

И как будет работать программа, если строку компаратора поместить внутрь процесса?
Программа работать не будет, потому что никакой прграммы нет. Это схема. VHDL -- не язык программирования, а язык описания цифровых схем.

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


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

Тут вопрос не в том, что можно или нельзя.

А вопрос стиля кодирования.

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

стиль кодирования. Если все придерживаются общих принципов, то легче разобраться в

чужом коде или работать совместно над одним проектом. А если каждый пишет как хочет,

то это бардак будет.

В энторнете полно док по данной тематике. В google вбейте hdl coding style.

 

 

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


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

Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/

 

Учиться надо по учебникам.

Этот пример никуда не годиться. Начиная с функционала и кончая описанием.

Выходной сигнал делителя всегда берется с тригерного выхода. Это у Вас старший разряд регистра, на котором счетчик базируется.

Реализуйте проект и посмотрите, что в железе получается в RTL просмотрщике Вашего пакета. (регистр, сумматор, компаратор, мультиплексор)

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


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

Этот пример никуда не годиться.

А можете объяснить почему?

Нашел документ производителя ПЛИС, посмотрел примеры реализации счетчиков. Вполне аналогично. Или я может ещё делитант и не улавливаю нюансов?

 

Вот например счетчик с асинхронным сбросом.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counters_1 is
   port(C, CLR : in std_logic;
          Q : out std_logic_vector(3 downto 0));
   end counters_1;
architecture archi of counters_1 is
   signal tmp: std_logic_vector(3 downto 0);
begin
   process (C, CLR)
   begin
      if (CLR='1') then
         tmp <= "0000";
         elsif (C'event and C='1') then
            tmp <= tmp + 1;
      end if;
   end process;
   Q <= tmp;
end archi;

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

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


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

нюансов?

 

Со счетчиком все в порядке. Вы дали ссылку на железную структуру делителя. Я усомнился в правильности реализации.

Вот и все. Вот мое видение:

post-804-1337931261_thumb.jpg

counter.v

counter_tb.v

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


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

Здравствуйте!

Для примера такой код делителя частоты, взятый тут http://logways.ru/2011/07/23/delitel-chastotyi/

 

entity div125 is
 Port ( CLK : in std_logic;                   
          Q : out std_logic);                   
end div125;

architecture Behavioral of div125 is          
 signal st : std_logic_vector(6 downto 0); 
begin
process(CLK)                                    
begin
 if CLK ‘event and CLK = '1' then       
    if conv_integer(st) = 124 then
       st <= conv_std_logic_vector(0,7);
    else st <= st + 1;                          
    end if;                                          
 end if;                                             
end process;

Q <= ’1' when conv_integer(st) = 124 else ’0';

end Behavioral;

 

Почему выходному сигналу Q значение присваивается вне процесса?

И такая практика повсеместно, на сколько я понимаю. Кто может внятно объяснить почему этого лучше не делать в процессе?

Спасибо.

Лучше делать в процессе. И в приведенном примере это было бы правильно. Выносить формирование сигнала Q вне процесса просто плохой стиль или неаккуратность разработчика. Если отойти от конкретно этого примера то я могу только предположить что сигнал Q формируется вне процесса в целях получить результат сравнения на такт раньше чем этот результат получился бы при формировании в процессе. Такой подход применяется в тех случаях когда значение счетчика используется для каких-либо целей -например для генерации адреса. А сигнал Q ,наример, маркирует что адрес 124 - последний адрес. При таком подходе и 124 и Q сформируются одновременно.

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

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


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

Вот например счетчик с асинхронным сбросом.
Потому что Q -- это выход, а читать значение порта типа out в VHDL разрешили не так давно. Поэтому и введён промежуточный сигнал.

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


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

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

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

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

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

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

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

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

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

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