Задача
Принять адресный байт по шине I²C и выставить признак совпадения с собственным адресом.
Тип схемы и среда
Последовательная схема: синхронизаторы SCL/SDA, детект фронта SCL, сдвиговый приём 8 бит.
Алгоритм работы
По нарастающему фронту SCL бит SDA вдвигается в регистр. После восьми бит старшие 7 сравниваются с собственным адресом, поднимается sel.
Код на AHDL
% Проект 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.