Страница 1 из 1

AHDL сброс регистра

Добавлено: Вт май 17, 2011 17:24:56
eXXXXXXXXXXX

Код: Выделить всё

SUBDESIGN check
(
 bit,CLK,IN[2..0]:INPUT;
 OUT[8..0]:OUTPUT;
)
VARIABLE
f[8..0]:DFF;
begin
f[].clk=clk;
IF IN[]==3 THEN
f[].CLRN=GND;
ELSE
f[].d=(f[7..0].q,bit);
OUT[]=f[].q;
END IF;
end;
Мне необходимо обнулить регистр при IN==3, что я не так делаю, компилятор пишет, что f[] всегда состоит из нулей.

Re: AHDL сброс регистра

Добавлено: Вт май 17, 2011 20:22:53
ChipKiller
eXXXXXXXXXXX писал(а):что я не так делаю.....
f[].CLRN=GND;

Re: AHDL сброс регистра

Добавлено: Ср май 18, 2011 08:07:17
avreal
Так умолчательное состояние линий 0, есл я правильно помню. Т.е. в одной ветки if присвоили 0 -- вот вам 0. В другой не присвоили -- вот вам 0-по-умолчанию.
Чтобы не прописывать все ветки, лучше завести промежуточную переменную, которой присваиваь 1 во всех местах, где нужно сбросить регистр (они все объединятся по ИЛИ):

Код: Выделить всё

SUBDESIGN check
(
    bit,CLK,IN[2..0]:INPUT;
    OUT[8..0]:OUTPUT;
)
VARIABLE
    f[8..0]:DFF;
    f_reset : node;
begin
    f[].clk = clk;
    f[].CLRN = !f_reset;

    IF IN[]==3 THEN
        f_reset = VCC; -- в остальное время она 0
    ELSE
        f[].d=(f[7..0].q,bit);
        OUT[]=f[].q;
    END IF;
end;
Я бы вообще так написал:

Код: Выделить всё

SUBDESIGN check
(
    bit,CLK,IN[2..0]:INPUT;
    OUT[8..0]:OUTPUT;
)
VARIABLE
    f[8..0]:DFF;
begin
    f[].clk=clk;
    f[].CLRN = !(IN[]==3);
    f[].d=(f[7..0].q,bit); -- асинхронный сброс имеет приоритет над этим
    OUT[]=f[].q;
end;
Работать будет так же, а логики сожрёт меньше, со входов f[] и OUT[] ненужная пропадёт.