2013-11-11 2 views
1

Я проектирую проект на Modelim VHDL, где я использую два компонента. В зависимости от входного сигнала управления я выбрать, какой компонент использовать:Структурный оператор vhdl внутри последовательной архитектуры

  • Если контроль = 0 то входы будут перенесены на первый компонент.
  • Если control = 1, то входы будут перенесены на второй компонент.

Однако ошибка компиляции появилась, когда я писал «U1: порт карты ...» в если заявление (не может положить структурное утверждение внутри последовательной архитектуры).

Любые идеи, как решить мою проблему?

ответ

3

Есть две возможных интерпретаций на ваш вопрос:

  • Ситуация # 1: Ваша конструкция использует только один из двух возможных компонентов за раз. Решение о том, какой компонент использовать, выполняется во время компиляции, т. Е. Записывается в ваш код и невозможно изменить после синтеза схемы.
  • Ситуация № 2: В вашей конструкции используются два компонента одновременно, и вы используете сигнал для динамического выбора одного из возможных выходов.

Каждая ситуация имеет другое решение.

Решение для ситуации № 1: Используйте generic в вашей организации, и if-generate заявление в вашей архитектуре тела.Вот пример:

entity component_selection_at_compile_time is 
     generic (
     -- change this value to choose which component gets instantiated: 
     COMPONENT_SELECT: in integer range 1 to 2 := 1 
    ); 
    port (
     input: in integer; 
     output: out integer 
    ); 
end; 

architecture rtl of component_selection_at_compile_time is 
    component comp1 is port(input: in integer; output: out integer); end component; 
    component comp2 is port(input: in integer; output: out integer); end component; 

    signal comp1_output, comp2_output: integer; 
begin 
    c1: if COMPONENT_SELECT = 1 generate 
     u1: comp1 port map (input, output); 
    end generate; 

    c2: if COMPONENT_SELECT = 2 generate 
     u2: comp2 port map (input, output); 
    end generate; 
end; 

Решение для ситуации # 2: Создайте третий компонент. Этот компонент будет оболочкой и будет создавать экземпляры обоих исходных компонентов. В некоторых случаях вы даже можете назначать одни и те же входы для обоих компонентов. Затем используйте сигнал выбора, чтобы выбрать, какой выход будет перенаправлен за пределы обертки.

entity wrapper is 
    port (
     wrapper_input: in integer; 
     wrapper_output: out integer; 
     component_select: in integer range 1 to 2 
    ); 
end; 

architecture rtl of wrapper is 
    component comp1 is port(input: in integer; output: out integer); end component; 
    component comp2 is port(input: in integer; output: out integer); end component; 

    signal comp1_output, comp2_output: integer; 
begin 
    u1: comp1 port map (wrapper_input, comp1_output); 
    u2: comp2 port map (wrapper_input, comp2_output); 

    wrapper_output <= comp1_output when component_select = 1 else comp2_output; 
end; 
2

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

Основываясь на том, как вы сформулировали свой вопрос, я собираюсь предположить, что это не так. Я предполагаю, что ваш дизайн должен поддерживать как в разное время, так и скомпилированный дизайн. В этом случае вы должны создавать экземпляры обоих компонентов и передавать данные обоим компонентам и как-то указывать на эти компоненты, когда данные действительны и должны быть обработаны. Например:

en1 <= not control; 
en2 <= control; 

U1 : entity work.design1 
port map (
    data => data, 
    en => en1 
); 

U2 : entity work.design2 
port map ( 
    data => data, 
    en => en2 
); 

В этом примере мы создали 2 новые сигналы, en1 и en2 которые «1» для того, чтобы каждый из компонентов в соответствующее время. В каждом из созданных экземпляров вам нужно посмотреть вход en, чтобы определить, когда входные данные действительны.

Примечание. Возможно, у вашей конструкции уже есть сигнал, похожий на en1 или en2. Например, у вас может быть общая «шина», которая имеет действительный сигнал, указывающий, когда данные на шине действительны. В этом случае, вы можете добавить что-то вроде этого, стробировании разрешающего сигнала с bus_valid:

en1 <= not control and bus_valid; 
en2 <= control and bus_valid; 
Смежные вопросы