Чтобы не заморачиваться описанием логики всех ветвей, поступил проще: написал модельку для старого доброго чипа 74hc138. Всё очень просто - три адресных входа, 8 расходящихся сигналов, три сигнала выбора (два инверсных, один прямой), что весьма удобно как раз для древовидных структур.
Но мне не везде нужно задействовать все 8 выходов: иногда некоторые из них не нужны и, соотв, не подключаются. В реальной железной схеме всё просто: не нужен выход? Ну так и не подключай его никуда! Исключения бывают, но очень и очень редко.
А здесь же.. вот пробовал так:
Decode_Compares: hc138 PORT MAP ( A(2) => INSTR(6), A(1) => INSTR(5), A(0) => INSTR(2), nE1 => N_GR_ALU, nE2 => inv_instr3, E3 => INSTR(4), Q(0) => N_CEQ, -- 000 Q(1) => N_CNE, -- 001 Q(2) => N_CLT, -- 010 Q(3) => N_CGE, -- 011 Q(4) => N_CLU, --100 Q(5) => N_CGU --101 -- 110 not used -- 111 not used );
Оказалось - низя-низя!!!!!!1111 АБИЗАТЕЛЬНО надо описать выводы Q(6) и Q(7). Ладно, попробовал так:
Decode_Compares: hc138 PORT MAP ( A(2) => INSTR(6), A(1) => INSTR(5), A(0) => INSTR(2), nE1 => N_GR_ALU, nE2 => inv_instr3, E3 => INSTR(4), Q(0) => N_CEQ, -- 000 Q(1) => N_CNE, -- 001 Q(2) => N_CLT, -- 010 Q(3) => N_CGE, -- 011 Q(4) => N_CLU, --100 Q(5) => N_CGU, --101 Q(6) => open, -- 110 Q(7) => open -- 111 );
НИЗЯ-НИЗЯ!!! НИ-НИ-НИ!! Ладно, попробовал так (предварительно добавив два сигнала-пустышки - dummy0 и dummy1):
Decode_Compares: hc138 PORT MAP ( A(2) => INSTR(6), A(1) => INSTR(5), A(0) => INSTR(2), nE1 => N_GR_ALU, nE2 => inv_instr3, E3 => INSTR(4), Q(0) => N_CEQ, -- 000 Q(1) => N_CNE, -- 001 Q(2) => N_CLT, -- 010 Q(3) => N_CGE, -- 011 Q(4) => N_CLU, --100 Q(5) => N_CGU, --101 Q(6) => dummy0, -- 110 Q(7) => dummy1 -- 111 );
Так прожевало и не ругается ни на что.
В задаче спрашивается: это я чего-то не понимаю или прекрасный строгий VHDL какой-то уж очень строгий в этом случае?
Ещё бесит, что отдельно пришлось сделать отдельный сигнал inv_instr3 вместо того, чтобы просто
nE2 => NOT INSTR(3),
НИЗЯ-НИЗЯ!!!!!1111