оператор не является синтезируемым, поскольку он не сохраняет свое значение при условии НЕ (тактовый край)

оператор не является синтезируемым, поскольку он не сохраняет свое значение при условии НЕ (тактовый край)

Попробуйте сбросить => 0 сигнал u_txreq на фронте u_txack и установить его => 1 на фронте CLK.

process (CLK, u_reset_n, u_txack)
begin
  if (u_reset_n='0')then
    u_txreq<='0';
  elsif rising_edge(CLK) then 
    u_txreq<='1';
  elsif rising_edge(u_txack) then
    u_txreq<='0';   
  end if;
end process;

введите здесь описание изображения


person user2599152    schedule 07.01.2019    source источник


Ответы (2)


Чтобы код HDL был синтезируемым, в целевой библиотеке должно существовать некоторое оборудование, реализующее запрошенную функцию.

На данный момент не существует оборудования, которое одновременно поддерживает:
1/ Асинхронный сброс при активном низком уровне сигнала. (if (u_reset_n='0'))
2/ Запуск по переднему фронту (elsif rising_edge(CLK))
3/ Запуск по второму независимому переднему фронту. (elsif rising_edge(u_txack)).

Вы должны переписать свой код, чтобы использовать только ОДИН нарастающий или спадающий фронт тактового сигнала.

person Oldfart    schedule 07.01.2019
comment
Уважаемый, не могли бы вы посмотреть на прикрепленную картинку и посоветовать, как сделать код. В общем случае необходимо вернуть сигнал D на «1» в течение n-тактов после сброса Q. - person user2599152; 07.01.2019
comment
1/Если у вас есть асинхронный вход, вы должны СНАЧАЛА синхронизироваться, затем вы можете использовать сигнал. Я предлагаю вам прочитать о синхронизации. 2/ совет, как сделать код, будет означать, что мне придется написать код для вас, чего я не делаю, отвечая на вопросы. Также ваши спецификации недостаточно точны для этого. - person Oldfart; 07.01.2019

Посмотрите на асинхронную синхронизацию сигналов u_txack с синхронизацией CLK:

if rising_edge(CLK) then 
            count<=count+B"00000001";                               
            n1_txack <= u_txack;
            if( n1_txack='0' AND u_txack='1')
                then
                u_txreq<='0';               
                count<=B"00000000";
            end if;             
            if (count=B"00000010") then
                u_txreq<='1'; 
            end if;                 
    end if;
person user2599152    schedule 08.01.2019