К сожалению, никто так и не ответил на большинство моих вопросов в
теме по EverDrive N8. Но увы, мне больше некуда обратиться, кроме как на этом форуме. Пробовал уже задавать эти вопросы на другом форуме - там никто так и не ответил.
Есть тут люди, знакомые с Verilog?
Хочу реализовать маппер
Sachen SA8259. У него есть регистры, расположенные по адресам $4100 и $4101. Мне нужно понять, как в Verilog сделать дешифрацию для этих адресов.
Можно конечно пойти "в лоб" и сделать полную дешифрацию:
if(cpu_addr[14:0] == 15'h4100 & !cpu_rw)
Тогда регистр будет строго по адресу $4100. Но если перевести $4100 в двоичный вид, то получится 100000100000000. И такое число наталкивает на мысль, что дешифрация неполная, а только по битам A14, A8, A0, полная дешифрация усложнила бы микросхему, вряд ли так бы стали делать. И если взглянуть на
распиновку, то точно, оказывается из адресных выводов у него только A14, A8, A0 и есть. То есть, у него точно дешифрация неполная.
Но вот я не знаю точно, как сделать дешифрацию только по отдельным битам в Verilog, причем, если эти биты не идут друг за другом.
Пока только такое придумалось:
if(cpu_addr[14] & cpu_addr[8] & !cpu_addr[0] & !cpu_rw)
Но вот совсем не уверен, хорошее ли решение if с кучей условий. Есть опасение, что подобное сгенерирует слишком громоздкий код для FPGA. Конечно многие скажут, можно просто сделать полную и не заморачиваться, но мне кажется, полная дешифрация тоже будет слишком "громоздкой". Да и хочу просто в этом плане сделать ближе к оригиналу.
И еще. А как правильно бороться с конфликтами по шине?
Я пока придумал так:
assign rom_ce = !cpu_ce & cpu_rw;
Ну то есть, /CE на PRG ROM (точнее, у EverDrive N8 это SRAM) подается только тогда, когда /ROMSEL (здесь называется cpu_ce) имеет низкий уровень, а CPU R/W - высокий. Ну это я так думаю, может на самом деле это так не работает.