Я не специалист, но по-моему "always @(negedge clk or negedge SHRTC)" это неправильно. Попробуй разделить на две части, одна из которых будет привязана к negedge clk, а вторая - к negedge SHRTC.
Вид для печати
Я не специалист, но по-моему "always @(negedge clk or negedge SHRTC)" это неправильно. Попробуй разделить на две части, одна из которых будет привязана к negedge clk, а вторая - к negedge SHRTC.
Да вроде работает и так в других процессах. Вот, например, вертикальная развертка:
Но, за совет спасибо! Попробую прямо сейчас!Код:assign VRTC_out = (vr_cnt == 0) | ~(SVRTC);
always @(negedge SVRTC or negedge clk) // Vertical sync control
begin
if (SVRTC == 'b0) vr_cnt <= 'b111111111;
else if (vr_cnt > 'b0)
begin
if ((vr_cnt != 'b1) || (SHRTC == 'b0)) vr_cnt <= vr_cnt - 1;
else;
end
else;
end
Заработало!!! :v2_yahoo: Спасибо! Вот что значит свежий взгляд!
Формально в этом нету особой неправильности. Но на практике все такие конструкции имеют такой вид:
Если посмотреть на RTL схему от этой конструкции, то можно увидеть, что yyy подается на вход асинхронного сброса (или асинхронной установки) счетчика, а xxx -- на тактирующий вход. Какой фронт используется у обоих сигналов, значения не имеет.Код:reg [3:0] rrr;
always @(posedge xxx or posedge yyy)
if (yyy)
rrr <= 0;
else
rrr <= rrr + 1;
В коде вертикальной развертки все просто -- одна из половинок делает асинхронную установку. А в горизонтальной написано так, что на оба фронта загружается не константа, выходит, что это не регистр с асинхронным сбросом, а что-то типа двухпортовой ячейки, или я даже не знаю что это. Наверное, Квартус тоже не понял.
Интересно, что я там в первый раз пытался квартусу всучить, что он так ругался "Internal Error"? :v2_blush: Кстати, до того как заработало, конструкция занимала около 60 элементов. Сейчас 30 :v2_rolley
Я думал, что неважно, что напишу, квартус разрулит это как-нибудь. Спасибо за разъяснения! Может мне книжку какую посоветуешь почитать для восполнения пробелов? А то вот так и тыкаюсь как слепой котенок иногда на таких вещах.
К сожалению не знаю подходящих книжек. Так получилось, что все из интернетов. И да здравствует опенсорс.
Клифф Каммингс написал много интересных статей про Верилог. Полторы из них я даже наполовину осилил когда-то. Мне нравится, что он часто подходит к проблеме со стороны инженера-самоучки, который в принципе многое уже умеет, но не знает почему так получается.
http://www.sunburst-design.com/papers/
Набросал свою версию Радио-86РК. Качать, как всегда, на моём сайте в разделе ПЛИС. Работает почти всё, загружать программы можно через магнитофон, хотя лично я просто соеденил выход звуковой карты со входом DE1 и "жужжал" из своего эмулятора :)
Есть отличие от стандартного РК - я реализовал инверсию, чтобы проверить работу курсора-блока.
Супер! Попробую сегодня. А "почти все работает" что означает? Что не работает? Как реализовал ВГ75?
Почти всё работает - означает, что реализованы все БИС, в том числе ВТ57 и ВГ75.
Мелочи всякие, которые в основном не используются: сдвиг приоритетов каналов ПДП, атрибуты LA0,LA1, ну и т.п.
По аналогии с тем, что у меня в эмуляторе :) Ну и конечно, сверялся по Шахнову. Нельзя сказать, что реализовано в точности как в железе, но основные функции оно выполняет. В частности, кадровые и строчные СИ я использовал внешние, от генератора развёртки 800х600@50Гц. Шину данных разделил на три части (ввод,вывод и вход символа от ПДП), управляющие сигналы тоже (чтобы не городить мультиплексоров). Шину адреса ВТ57 сделал без заморочек со старшим байтом в регистре - просто 16 бит. Вобщем, разница не принципиальная, в основном адаптация для ПЛИС.