AFON//Радиотехник
AHDL · проект 31/50

I²C-ведомый: детект адреса

Приём адресного байта по фронтам SCL

Задача

Принять адресный байт по шине I²C и выставить признак совпадения с собственным адресом.

Тип схемы и среда

Последовательная схема: синхронизаторы SCL/SDA, детект фронта SCL, сдвиговый приём 8 бит.

Алгоритм работы

По нарастающему фронту SCL бит SDA вдвигается в регистр. После восьми бит старшие 7 сравниваются с собственным адресом, поднимается sel.

Код на AHDL

ahdl_31_i2c_vedomyy.tdf↓ скачать .tdf
% Проект 31: I2C-ведомый (детект START/STOP, приём адреса) %
SUBDESIGN ahdl_31_i2c_vedomyy
(
    clk, clrn : INPUT;
    scl, sda  : INPUT;
    addr7[6..0]: INPUT;
    sel       : OUTPUT;   % совпадение адреса %
)
VARIABLE
    scl_s[1..0] : DFF;
    sda_s[1..0] : DFF;
    sh[7..0]    : DFF;
    bitc[3..0]  : DFF;
    matched     : DFF;
    scl_rise    : NODE;
BEGIN
    scl_s[].clk = clk; scl_s[].clrn = clrn;
    sda_s[].clk = clk; sda_s[].clrn = clrn;
    sh[].clk    = clk; sh[].clrn    = clrn;
    bitc[].clk  = clk; bitc[].clrn  = clrn;
    matched.clk = clk; matched.clrn = clrn;

    scl_s[].d = (scl_s[0].q, scl);
    sda_s[].d = (sda_s[0].q, sda);
    scl_rise  = scl_s[0].q & !scl_s[1].q;

    IF scl_rise THEN
        sh[].d   = (sh[6..0].q, sda_s[1].q);
        bitc[].d = bitc[].q + 1;
    ELSE
        sh[].d   = sh[].q;
        bitc[].d = bitc[].q;
    END IF;

    IF bitc[].q == 8 THEN
        matched.d = (sh[7..1].q == addr7[]);
    ELSE
        matched.d = matched.q;
    END IF;

    sel = matched.q;
END;

Пояснения

Полный ведомый I²C добавляет детект START/STOP, генерацию ACK через BIDIR-линию SDA и обработку бита R/W. Здесь показано ядро приёма адреса.

Инструменты и справочники по теме

📦 help-user.ru — скупка и ремонт компьютерной техники. Продать ноутбук, ПК, комплектующие — help-user.ru.

Что дальше

Скачайте ahdl_31_i2c_vedomyy.tdf, создайте проект в MAX+PLUS II или Quartus, назначьте выводы под свою плату и скомпилируйте. Остальные 49 разработок — в разделе проектов на AHDL.