2017-01-07 2 views
0

Я хотел бы написать код, в котором мой сигнал W_EN (std_logic) установлен на один по необходимости (если выполняются некоторые условия) и в противном случае (если не указано иначе) равна нулю. Если W_EN будет std_logic_vector я мог бы сделать использовать «другие» заявление таким образом, чтобы сделать это (в примере кода «W_EN» называется «one_if_one»):VHDL: команда «другие-как» для сигналов std_logic

signal cnt : unsigned (1 downto 0); --incremented at every clk_cycle 
signal one_if_one : std_logic; 

process (cnt) 
begin 
one_if_one <= (others => '0'); 
if (cnt = "01") then 
one_if_one <= '1'; 
end if; 
end process; 

Но поскольку W_EN только один бит, «другие» нельзя использовать с ним. Итак, я хочу спросить вас, есть ли способ для реализации команды «установить на ноль, если не указано иначе в процессе».

PS: Я знаю, что могу просто написать ветку else if, но я не хочу этого делать, так как это было бы более проблематично для моего реального кода.

PPS: единственное решение, которое я нашел на данный момент заменить строку:

one_if_one <= (others => '0'); 

с

one_if_one <= 'L'; 

, но это будет иметь разное значение, так как нулевой налагаемые " другие "- сильный.

Заранее благодарю вас за помощь.

+1

'one_if_one <= '0';' ... внутри процесса, "последнее присвоение выигрывает", поэтому вы не создаете несколько драйверов по одному и тому же сигналу. –

+0

Почему бы вам просто не опубликовать свой реальный код, если у вас есть проблема с этим, вместо какого-то гипотетического кода, где проблема не очевидна? – mkrieger1

+0

Есть один драйвер в процессе, который указывает Брайан, и каждый драйвер имеет одну транзакцию для каждой проецируемой выходной волны, активную в определенное время моделирования (IEEE Std 1076-2008 10.5 Операция присваивания сигнала, 10.5.2.2 Выполнение простого оператора присваивания). До вашего оператора if назначьте '0' вместо совокупного значения. Когда условие в вашем операторе if истинно, его закрытое назначение заменяет предыдущее присваивание значением «1». Иными словами, указано в инструкции * if * not "* ... по-разному указанному в процессе *". – user1155120

ответ

0

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

process (cnt) 
begin 
    one_if_one <= '0'; 
    if (cnt = "01") then 
    one_if_one <= '1'; 
    end if; 
end process; 

эквивалентно

process (cnt) 
begin 
    if (cnt = "01") then 
    one_if_one <= '1'; 
    else 
    one_if_one <= '0'; 
    end if; 
end process; 

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

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