2015-04-29 1 views
2

Я часто задавался почему VHDL variable может быть объявлена ​​как на process, а также уровень architecture (как shared), в то время как signal может быть объявлена ​​только на architecture уровне - даже если это просто используется в рамках одного process.сигнала локальной обработки Объем

Декларирование вещи (например signals или variable S) в рамках как можно более узким и как можно ближе к месту, они используются, действительно увеличивает читаемость совсем немного, на мой взгляд.

Следовательно, мой вопрос: есть ли какая-либо причина, присущая дизайну языка VHDL, почему следующее невозможно сделать?

architecture does_not_compile of test is 
    signal a, d : std_logic_vector(15 downto 0); 

    -- This would work, but does not need to be here: 
    -- signal c : std_logic_vector(15 downto 0); 
begin 
    process (clk) 
     variable b : std_logic_vector(15 downto 0); 

     -- This would be nice, but is not permitted: 
     signal c : std_logic_vector(15 downto 0); 
    begin 
      if (rising_edge(clk)) then 
       b := foo_operation(a); -- could just be used to store an intermediary value 
       c <= bar_operation(b); -- could e.g. be a pipeline register 
       d <= baz_operation(c); -- the "output register" of this process 
      end if; 
    end process; 

    -- somewhere else: 
    a <= input_xyz; 
    output_xyz <= d 
end architecture; 

И на всякий случай: я сделать понять разницу между signal и variable ...

+2

Вы можете обернуть свой процесс или несколько процессов в блок или сгенерировать оператор, чтобы объявлять сигналы с меньшей областью. – Paebbels

+2

Возможно, вам стоит посетить http://www.eda.org/twiki/bin/view.cgi/P1076/WebHome, присоединиться к рабочей группе и отстаивать это дополнение. Я не вижу причин не делать этого, и хотя метод @Paebbels был бы подробным способом обработки процесса, он вообще не работал бы в процедуре. –

ответ

2

Есть ли какой-либо причине, присущие конструкции языка VHDL, почему следующее не может быть сделано?

process (clk) 
    variable b : std_logic_vector(15 downto 0); 

    -- This would be nice, but is not permitted: 
    signal c : std_logic_vector(15 downto 0); 
begin 

(Объявите сигнал в процессе.)

Как бы вы разрешить видимость?

Заявление о процессе является декларативной областью.

Все параллельные операторы имеют эквивалентные процессы или эквиваленты блоков и эквивалентные процессы, разработанные для моделирования.

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

Вызов функций - это выражения, вызовы процедур - это утверждения, вызовы параллельной процедуры имеют эквивалентные процессы для моделирования.

Сигнал может связываться только между последовательными операторами в одном и том же процессе, встречая оператор ожидания. Сигнал сегодня будет объявлен в охватывающей декларативной области (декларативный элемент блока или объявление порта) или сделать видимым с помощью предложения use, объявленного как декларативный элемент пакета.

Обратите внимание, что вы можете использовать команды ожидания и переменные с тем же эффектом внутри процесса.

Где это интересно, используются сигналы по их назначению - связь между процессами.

Случай 1

Два или несколько процессов в одной и той же зоне описания, который также имеет сигнал с тем же именем, объявленного в одном процессе. В каком объявлении сигнала используются другие процессы?

Случай 2

Три или более процессов в одной и той же области декларативного с двумя из них объявить же имя сигнала.В какой декларации используются третьи или другие процессы?

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

Рассмотрите, как расширить область действия объявления сигнала в охватывающую декларативную область, используя декларацию «общего» сигнала. Это могло бы разрешить второй случай, если бы было объявлено только одно объявление сигнала, но не оба, и объявление не было видно в объявляющей декларативной области. Он не относится к первому случаю вообще, и выбранным именам не разрешено использовать процесс в качестве префикса (и для этого требовалось бы имя экземпляра, если они были, кстати, требовалось, чтобы оператор процесса был помечен).

Как это будет полезно? Это неоднозначно.

VHDL ограничивает, где сигналы могут быть объявлены, чтобы правила видимости обеспечивали максимально возможное объявление. Объем декларации не распространяется на охватывающие или смежные декларативные регионы.

И как лекарство, а не использование выражения блока paebbel, вы также можете объявлять сигналы как декларативные элементы пакета, сделанные в частном порядке, используя предложения в конкретных процессах.

+0

Вопрос о двусмысленности в отношении затенения/разрешения имен действительно является аргументом против него на языке как «строгий», как VHDL. Хотя предложенное @Paebbels решение на основе «block» показывает, что такое разрешение области уже сделано. - И спасибо за исправление вопроса (я на самом деле хотел написать 'variable' там, теперь отредактирован). – mbschenkel

1

Да, вы должны это сделать, и вы не можете этого сделать, и я не верю, что VHDL2008 исправляет его (но в VHDL2008 фиксируется и добавляется множество удивительных вещей). Вы можете всегда использовать операторы true generate (как уже упоминалось в комментарии). Хотя, если вы используете всегда истинные операторы генерации, ваш модуль, вероятно, большой, и вы должны его разбить.

Я просто хотел указать, что вы все равно можете использовать/реализовать свой регистр конвейера в переменной. если вы поменяете назначения d и c вокруг. Я знаю, что это не так хорошо, но я иногда использую его, и он отлично синтезируется. Переменные сохраняют свои значения между последовательными циклами процесса.

architecture does_not_compile of test is 
    signal a, d : std_logic_vector(15 downto 0); 
begin 
    process (clk) 
     variable b : std_logic_vector(15 downto 0); 
     variable c : std_logic_vector(15 downto 0); 
    begin 
      if (rising_edge(clk)) then 
       b := foo_operation(a); -- could just be used to store an intermediary value 
       d <= baz_operation(c); -- the "output register" of this process 
       c := bar_operation(b); -- could e.g. be a pipeline 
      end if; 
    end process; 

    -- somewhere else: 
    a <= input_xyz; 
    output_xyz <= d 
end architecture; 
+0

Спасибо за то, что вы указали подход к конвейерной обработке с переменными для полноты. Однако вставка или удаление конвейерной стадии требует перепрограммирования с ошибкой и приводит к тому, что поток данных «перевернут» будет трудно читать. Следовательно, на самом деле это была одна из причин, которые приводят к этому вопросу в первую очередь. – mbschenkel