ZEK. если не возражаешь, приступим к разбору говнокода
1.
- Code: Select all
reg [5:0] counter = 0;
Это не говнокод, но такая запись играет роль только при СИМУЛЯЦИИ (например, в моделсиме), означает, что регистр устанавливается в 0 ещё до нулевого момента времени и выполнения всех initial'ов. При синтезе квартусом игнорится.
2.
- Code: Select all
wire[5:0] inc = rawr_sr[1:0] == 2'b10 ? shift : 1;
...
vg_rawr <= !(rawr_sr[3] && !rawr_sr[0] ); // rawr 100ns
Вот это уже говнокод. Дело в том, что сигнал rdat_n полностью асинхронный относительно клока, и потому перед использованием должен пересинхронизироваться. Пересинхронизация делается путём пропускания сигнала через ДВА (или больше) триггера. У тебя он используется после пропускания только через один триггер.
Ещё непонятно, что означает "rawr_sr[3] && !rawr_sr[0]". Почему нельзя написать просто rawr_sr[3] && !rawr_sr[2] (выделение нужного фронта)? Но может тут я просто не догоняю глубинного смысла...
И ещё. Чем не устраивает предварительный фильтр на сигнал rdat (в моём коде со слов digital filter и до assign rdat = )? Он позволяет не реагировать схеме на импульсы-помехи длительностью менее 4 тактов 28мгц. Или такое не нужно?