Ох....
Ну если вы схемотехник то вам должно быть знакомо понятие сдвиговые регистры...
Код
if(SS_CPLD==1)
nBit <= 5'b00000;
else if (SS_CPLD==0)
else if не надо, это только синтезатор путает. Стандартная конструкция с асинхронным сбросом или установкой
Код
always @(posedge clk or posedge reset)
if(reset == ....)
....
else
....
у вас CS выступает как асинхронный сброс и установка, потому просто else , если бы в блоке был и сброс и установка, else if был бы уместен для приоритетов, а так уберите...
раздел
Цитата
//выбор регистра, запись/чтение
очень сложно написан, у вас вообще одно и тоже по 10 раз в проекте делается
вы представляете что когда вы пишите вот так
Код
case (nBit)
8: REG02[7] = MOSIIN;
9: REG02[6] = MOSIIN;
10: REG02[5] = MOSIIN;
11: REG02[4] = MOSIIN;
12: REG02[3] = MOSIIN;
13: REG02[2] = MOSIIN;
14: REG02[1] = MOSIIN;
15: REG02[0] = MOSIIN;
вы получаете мультиплексор, который выбирает 1 бит, потом 2, потом 3. При этом у вас еще один мультиплексор прямо сразу по выбору case (keyreg). Иногда синтезатор понимает ваш хитрый план и сам ставить сдвиговые регистры, но иногда это остается мультиплексорами, съедает кучу ресурсов и очень медленно работает... А у вас их еще и 3 независимых может выйти... даже вернее 6, если не 9....
Если хотите можем совместно принести это в порядок по пунктам вам надо написать модуль SPI
который читает и передает 1 байт.
и дальше сделать просто принять байт, по принятому байту выбрать адрес чтения и записи, и еще раз принять или записать байт.
как кстати вы определяете что в данном такте делается, читается или передается?
Как я понимаю другого клока кроме SPI в проекте нет?