Тоже пережил подобное когда МК перешел на ПЛИС.
Попробую разъяснить немного еще для описания сути процесса.
module bidirec (oe, clk, inp, outp, bidir) - берем макетную плату, у нас проводками будут подключены: (oe, clk, inp, outp, bidir) и назовем это дело bidirec
input oe; // это проводок (как вариант описывается input wire oe;) который будет подключен к макетке.
inout [7:0] bidir // а это шина из 8 проводков
assign outp = b; - подключем проводок outp напрямую к регистру
assign bidir = oe ? a : 8'bZ ; - а этот проводок будет буффером с разрешающим сигналом oe (это Тернарная условная операция, в данном случае oe - это условие, перед двоеточием - условие выполнено, после двоеточия - условие не выполнено. В двуичном виде 0 это false (условие не выполняется), 1 это true (условие выполняется)
reg [7:0] a; - возьмем микруху а именно 8-разрядный регистр и поместим на плату.
always @ (posedge clk) берем D-триггер, и подключаем к входу синхронизации проводок "clk"
b <= bidir -- тут читаем о блокирующих и не блокирующих присвоениях, здесь на сайте есть (
marsohod.org/verilog
)
Еще к слову о "почитать". Выражения "inout [7:0]" и "[7:0]inout " -разные вещи, хотя и передают одну и ту же суть.
вот собственно и все. Дальше компилятор по тексту не выполняет программу а пытается всунуть эту макетку в ПЛИС.
Как то так.
PS: Чтобы разрулить ситуацию с вводом выводом (за исключением монтажного или и обработки коллизий I2C), нужно определиться с главным устройством, которое по проводам будет всем говорить, всем тихо, передаю данные, и все устройства должны выход перевести в высокоимпедансное состояние. А потом устройство по адресу скажи мне что у тебя с регистром, и сам перевести выходы на высокий импеданс. В общем дополнительно понадобится шина управления и определенная иерархия.