Задача
Реализовать ведущий узел SPI: выдавать SCK, вдвигать данные в MOSI и одновременно принимать MISO.
Тип схемы и среда
Последовательная схема: сдвиговый регистр обмена, генерация SCK, счётчик полутактов.
Алгоритм работы
По start грузятся данные и счётчик 16 полутактов. Каждый строб tick инвертирует SCK; на одном фронте бит выдвигается в MOSI, на другом — вдвигается MISO.
Код на AHDL
% Проект 18: SPI-мастер, режим 0, 8 бит % SUBDESIGN ahdl_18_spi_master ( clk, clrn : INPUT; start : INPUT; tick : INPUT; % темп SCK % din[7..0] : INPUT; miso : INPUT; sck : OUTPUT; mosi : OUTPUT; dout[7..0]: OUTPUT; busy : OUTPUT; ) VARIABLE shifter[7..0] : DFF; cnt[4..0] : DFF; active : DFF; sckr : DFF; BEGIN shifter[].clk = clk; shifter[].clrn = clrn; cnt[].clk = clk; cnt[].clrn = clrn; active.clk = clk; active.clrn = clrn; sckr.clk = clk; sckr.clrn = clrn; IF !active.q THEN sckr.d = GND; IF start THEN active.d = VCC; shifter[].d = din[]; cnt[].d = 16; ELSE active.d = GND; shifter[].d = shifter[].q; cnt[].d = cnt[].q; END IF; ELSIF tick THEN sckr.d = !sckr.q; cnt[].d = cnt[].q - 1; IF !sckr.q THEN shifter[].d = (shifter[6..0].q, miso); ELSE shifter[].d = shifter[].q; END IF; IF cnt[].q == 1 THEN active.d = GND; ELSE active.d = VCC; END IF; ELSE sckr.d = sckr.q; shifter[].d = shifter[].q; cnt[].d = cnt[].q; active.d = active.q; END IF; sck = sckr.q; mosi = shifter[7].q; dout[] = shifter[].q; busy = active.q; END;
Пояснения
Режим 0 (CPOL=0, CPHA=0): выборка по нарастающему, смена по спадающему фронту SCK. Дуплексный обмен идёт в одном сдвиговом регистре.
Инструменты и справочники по теме
📦 help-user.ru — скупка и ремонт компьютерной техники. Продать ноутбук, ПК, комплектующие — help-user.ru.
Что дальше
Скачайте ahdl_18_spi_master.tdf, создайте проект в MAX+PLUS II или Quartus,
назначьте выводы под свою плату и скомпилируйте. Остальные 49 разработок — в
разделе проектов на AHDL.