Верилог возможная защелка

Я кодер VHDL и не много кодировал с Verilog. Я просматриваю чужой код и наткнулся на это:

always@(posedge asix_clk_bufg or negedge pll_asix_locked)
begin
    if (~pll_asix_locked)
        asix_rst <= 0;
    else if (timer[5])  // 355us between asix_clk and asix_rst (min is 200us)
        asix_rst <= 1;
end

Я не уверен, согласен ли я с приведенным выше кодом! Разве это не возможный сценарий защелки? Я вижу, что он ждет, пока pll заблокируется, а затем выведет систему из перезагрузки, но правильно ли это закодировано?

Мне не нравится комбинировать последовательный и комбинаторный код вместе, но каково значение «asix_rst», когда timer[5] = 0?!?

Спасибо, --Руди


person Rudy01    schedule 12.03.2014    source источник
comment
Как определяется asix_rst?   -  person osgx    schedule 12.03.2014
comment
Когда timer[5] = 0, asix_rst остается в покое. Меня это смутило, когда я начал заниматься Verilog. Вам не нужно указывать значение каждого регистра в каждом случае структуры управления, вы просто должны сказать, когда вы хотите, чтобы значение было установлено. Этот код дает вам что-то (концептуально) похожее на триггер с условиями для установки и очистки. Он устанавливается, когда pll_asix_locked становится низким или при положительном фронте asix_clk_bufg, но только если asix_clk_bufg имеет низкий уровень. Asix_rst сбрасывается, когда asix_clk_bufg становится высоким И pll_asix_locked имеет высокий уровень (из-за первого if/else) И таймер [5] имеет высокий уровень.   -  person Will    schedule 12.03.2014


Ответы (2)


Это способ вывести триггер с тактовым сигналом положительного фронта (asix_clk_bufg), асинхронным активным сбросом нижнего уровня (pll_asix_locked) и включением тактового генератора (таймер[5]). Есть вход D (привязанный к 1) и выход Q (asix_rst).

Я предполагаю, что PLL не заблокирован, поэтому asix_rst равно 0 до первого фронта тактового сигнала, когда timer[5] == 1. Затем он будет оставаться высоким до тех пор, пока PLL не потеряет синхронизацию. Сброс должен быть асинхронным, так как часы остановятся, когда PLL потеряет синхронизацию.

Я предполагаю, что бит timer[5] становится высоким через 5 или 6 тактов после того, как PLL заблокирован, обеспечивая стабильные часы до того, как остальная часть системы выйдет из состояния сброса.

Это была бы защелка, если бы вместо часов у вас было timer[5] в списке чувствительности вот так:

always@(timer[5] or pll_asix_locked)
begin
    if (~pll_asix_locked)
        asix_rst <= 0;
    else if (timer[5])  // 355us between asix_clk and asix_rst (min is 200us)
        asix_rst <= 1;
end
person nguthrie    schedule 12.03.2014
comment
Это действительно хороший ответ. Это также показывает, почему всегда @(*) может привести к неприятностям. - person Will; 12.03.2014

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

Для получения дополнительной информации прочитайте насколько прозрачным защелки создаются и как не делать вывод о защелках

person Russell    schedule 16.03.2014