2016-10-28 5 views
1

Я довольно новичок в VHDL, и у меня есть глупый вопрос.Упрощение упрощения сигнала VHDL

В моем коде есть большой аргумент case и сигнал, который является значением (например, «1») всего в 1 случае и «0» во всех остальных случаях. Я хотел бы избежать писать й my_signal < = «0» во всех случаях, кроме того, где она влияет на 1 (для читабельности кода/плотность/дублирование)

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

То, что я хотел бы сделать что-то вроде

my_signal <='0'; 
case 
case0 
.... 
case1 
.... 
case2 
my_signal <='1'; 
.... 
case3 
.... 
case4 
.... 

, чтобы избежать

case 
case0 
my_signal <='0'; 
.... 
case1 
my_signal <='0'; 
.... 
case2 
my_signal <='1'; 
.... 
case3 
my_signal <='0'; 
.... 
case4 
my_signal <='0'; 
.... 

Но это выглядит как multidriven сигнал для меня. Каким образом можно достичь этого?

Большое спасибо!

+0

Пока оба оператора присваивания находятся в одном процессе, есть только один драйвер. Ваш первый пример в порядке. –

+0

Спасибо Брайан! Тогда, я думаю, я могу использовать этот «по умолчанию», чтобы сделать мой код светлее. – user1654361

ответ

1

У вас есть два варианта:

я) назначение по умолчанию:

.... 
my_signal <='0'; 
case ... 
    when case2 => 
    my_signal <='1'; 
    .... 
end case; 

II) других ветвь:

case ... 
    when case2 => 
    my_signal <='1'; 
    .... 
    when others => 
    my_signal <='0'; 
end case; 
.... 

Choice (II), вероятно, более полезной , потому что заявление case в VHDL требует, чтобы все возможности были включены, поэтому с возможностью выбора (I), вы, вероятно, потребуется when others => филиал в любом случае просто удовлетворить это условие, то есть (я) не должен быть:

.... 
my_signal <='0'; 
case ... 
    when case2 => 
    my_signal <='1'; 
    .... 
    when others => 
    null;   -- do nothing 
end case; 

Ни оригинал предложение, ни мои предложения есть сигналы «multidriven». Вы можете управлять (присваивать) сигнал столько раз, сколько вам нравится от одного процесса, и он никогда не является «многорежимным» сигналом. Любое присваивание сигналу в процессе приводит к появлению драйвера на этом сигнале. Вы получаете только «многожильный» сигнал, если вы назначаете сигнал из более чем одного процесса, которого вы не делаете. Когда выполняется строка кода с назначением сигнала (<=), то на самом деле происходит событие . помещается в очередь событий (симуляторы «To Do List»). Это событие будет происходить в следующем дельта-цикле (или цикл моделирования), который является следующей итерацией моделирования. Если несколько строк с назначением на сигнал выполняются в том же цикле моделирования, то любое событие в очереди событий удаляется и заменяется событием, генерируемым последним назначением сигнала (небольшое упрощение, но оно будет сделайте это сейчас).

+0

В примерах кода 'case2' должен быть' when case2 => ' –

+0

@scary_jeff Я принимал аргот, использованный в исходном вопросе. –

+0

'argot'; нужно было посмотреть это, доброе слово! Я догадался, но мысль, использующая реальный синтаксис, была бы более полезна будущим читателям. Просто предложение. –

Смежные вопросы